@weasel-js/audio 1.11.0 → 1.12.0
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 +21 -0
- package/dist/index.d.ts +160 -2
- package/dist/index.js +890 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/analyser.ts","../src/audioTime.ts","../src/param.ts","../src/inserts.ts","../src/buses.ts","../src/resumeWatch.ts","../src/scheduler.ts","../src/soundCache.ts","../src/streamStarter.ts","../src/envelope.ts","../src/liveVoice.ts","../src/pitch.ts","../src/synthVoice.ts","../src/synthStarters.ts","../src/worklet/loadVoiceProcessor.ts","../src/worklet/protocol.ts","../src/worklet/workletVoices.ts","../src/tickTimer.ts","../src/voiceChains.ts","../src/voiceDrops.ts","../src/voicePool.ts","../src/spatialize.ts","../src/voices.ts","../src/createAudioEngine.ts","../src/effects.ts","../src/patternPlayer.ts","../src/patternLoad.ts","../src/scoreMood.ts","../src/scoreBar.ts","../src/score.ts","../src/biquad.ts","../src/oscillator.ts","../src/voiceKernel.ts"],"names":["i","prev","next","slot","degree","root","envelope"],"mappings":"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","file":"index.js","sourcesContent":["/** Options for `createAnalyserTap` and `AudioEngine.analyser`. */\nexport interface AnalyserTapOptions {\n /** Power of two, 32..32768. Default 2048. */\n fftSize?: number;\n}\n\n/** An `AnalyserNode` attached to a point in the graph, with readers for its\n * spectrum, waveform and level. Each call reads the current window. */\nexport interface AnalyserTap {\n /** The underlying node, exposed for disposal assertions and advanced wiring. */\n node: AnalyserNode;\n /** Frequency data, sized `node.frequencyBinCount` when no array is given. */\n frequencies(out?: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;\n /** Time-domain data, sized `node.fftSize` when no array is given — twice the\n * frequency bin count, which is the whole window rather than half of it. */\n waveform(out?: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;\n /** RMS amplitude over the whole time-domain window, 0..1. */\n level(): number;\n /** `n` averaged frequency bands normalized to 0..1 — the ergonomic form for\n * driving a shader uniform, a vertex color, or a pose. `out`, when given,\n * must be exactly `n` long. */\n bands(n: number, out?: Float32Array<ArrayBuffer>): Float32Array<ArrayBuffer>;\n /** Detach from the tapped node. Idempotent. */\n dispose(): void;\n}\n\n/** Attach a new `AnalyserNode` to `source`. The tap only listens, adding no\n * path to the destination; `dispose()` detaches it. */\nexport function createAnalyserTap(\n ctx: AudioContext,\n source: AudioNode,\n opts: AnalyserTapOptions = {},\n): AnalyserTap {\n const node = ctx.createAnalyser();\n node.fftSize = opts.fftSize ?? 2048;\n source.connect(node);\n let attached = true;\n\n // `node` is public surface, so `fftSize` can change under the tap. Time-domain\n // data is sized by `fftSize`; frequency data by half of it.\n let freqScratch = new Uint8Array(0);\n let timeScratch = new Uint8Array(0);\n const freqBuf = (): Uint8Array<ArrayBuffer> => {\n if (freqScratch.length !== node.frequencyBinCount) {\n freqScratch = new Uint8Array(node.frequencyBinCount);\n }\n return freqScratch;\n };\n const timeBuf = (): Uint8Array<ArrayBuffer> => {\n if (timeScratch.length !== node.fftSize) timeScratch = new Uint8Array(node.fftSize);\n return timeScratch;\n };\n\n return {\n node,\n frequencies(out) {\n const target = out ?? new Uint8Array(node.frequencyBinCount);\n node.getByteFrequencyData(target);\n return target;\n },\n waveform(out) {\n const target = out ?? new Uint8Array(node.fftSize);\n node.getByteTimeDomainData(target);\n return target;\n },\n level() {\n const buf = timeBuf();\n node.getByteTimeDomainData(buf);\n let sum = 0;\n for (let i = 0; i < buf.length; i += 1) {\n // Time-domain bytes center on 128; subtract to get a signed sample.\n const v = (buf[i] - 128) / 128;\n sum += v * v;\n }\n return Math.sqrt(sum / buf.length);\n },\n bands(n, out) {\n if (!Number.isInteger(n) || n < 1) {\n throw new Error('@weasel-js/audio: bands(n) requires a positive integer');\n }\n // Unlike the byte readers, a short `out` here would return fewer bands\n // than asked for with nothing to distinguish it from a correct result.\n if (out && out.length !== n) {\n throw new Error(\n `@weasel-js/audio: bands(${n}, out) requires an out array of length ${n}, got ${out.length}`,\n );\n }\n const buf = freqBuf();\n node.getByteFrequencyData(buf);\n const target = out ?? new Float32Array(n);\n const per = buf.length / n;\n for (let b = 0; b < n; b += 1) {\n const lo = Math.floor(b * per);\n const hi = Math.max(lo + 1, Math.floor((b + 1) * per));\n let sum = 0;\n for (let i = lo; i < hi; i += 1) sum += buf[i];\n target[b] = sum / (hi - lo) / 255;\n }\n return target;\n },\n // `node.disconnect()` would cut the analyser's outgoing edges, and it has\n // none: the edge that keeps it alive is the source's.\n dispose() {\n if (!attached) return;\n attached = false;\n source.disconnect(node);\n },\n };\n}\n","/** A one-shot timer pair, as `AudioEngineOptions.setTimer` takes it. */\nexport interface Timers {\n setTimer(cb: () => void, ms: number): unknown;\n clearTimer(handle: unknown): void;\n}\n\nexport const defaultTimers: Timers = {\n setTimer: (cb, ms) => setTimeout(cb, ms),\n clearTimer: (h) => clearTimeout(h as ReturnType<typeof setTimeout>),\n};\n\n/**\n * Run `cb` once the audio clock reaches `at` (seconds), or at once when the\n * context is not running — a stopped clock never arrives, and nothing is heard\n * meanwhile. The timer alone is not enough: it runs on wall time, and a ramp\n * cut short by an early timer is the click it was scheduled to avoid.\n * Returns a cancel function.\n */\nexport function atAudioTime(\n ctx: BaseAudioContext,\n timers: Timers,\n at: number,\n cb: () => void,\n): () => void {\n let handle: unknown = null;\n let live = true;\n const check = (): void => {\n handle = null;\n if (!live) return;\n const left = at - ctx.currentTime;\n if (ctx.state === 'running' && left > 1e-6) {\n handle = timers.setTimer(check, Math.max(1, left * 1000));\n return;\n }\n live = false;\n cb();\n };\n check();\n return () => {\n live = false;\n if (handle !== null) timers.clearTimer(handle);\n handle = null;\n };\n}\n","/**\n * Every gain write in the package goes through here.\n *\n * Two traps, both silent: a bare `param.value = x` sits *behind* any scheduled\n * ramp, which keeps running and wins; and a ramp with no anchor interpolates\n * from the previous scheduled endpoint rather than from the value the param\n * holds now, so a second ramp jumps before it moves.\n */\nexport function writeParam(\n ctx: BaseAudioContext,\n param: AudioParam,\n value: number,\n rampMs?: number,\n): void {\n const now = ctx.currentTime;\n param.cancelScheduledValues(now);\n if (rampMs && rampMs > 0) {\n param.setValueAtTime(param.value, now);\n param.linearRampToValueAtTime(value, now + rampMs / 1000);\n } else {\n param.setValueAtTime(value, now);\n }\n}\n","import { atAudioTime, defaultTimers, type Timers } from './audioTime';\nimport { writeParam } from './param';\n\n/**\n * Anything with an input and an output node can sit in an insert slot: one of\n * the built-ins (`createFilterEffect` and the rest), or a pair of nodes of your\n * own — `{ input: shaper, output: shaper }` for a single node. Several nodes\n * between the two are fine too. An effect goes in one slot, once.\n */\nexport interface InsertEffect {\n readonly input: AudioNode;\n readonly output: AudioNode;\n /** Called once the effect has left the graph after `remove()` or `clear()`. */\n dispose?(): void;\n}\n\n/** One effect's place in a bus's insert chain. Every edit is click-free: a\n * bypass crossfades the slot's wet and dry, and a structural edit crossfades\n * the old route into the new one. */\nexport interface InsertSlot {\n readonly effect: InsertEffect;\n /** Route around the effect (`true`) or back through it. */\n bypass(on: boolean): void;\n bypassed(): boolean;\n /** Clamped to the chain. */\n moveTo(index: number): void;\n /** Take the effect out, then call its `dispose`. Idempotent. */\n remove(): void;\n /** Position in the chain, or -1 once removed. */\n index(): number;\n}\n\n/** Where `InsertChain.add` puts an effect, and whether it starts bypassed. */\nexport interface InsertAddOptions {\n /** Default: the end of the chain. Clamped. */\n index?: number;\n /** Add it routed around, for a later `bypass(false)`. Default false. */\n bypassed?: boolean;\n}\n\n/**\n * A bus's ordered insert effects, between where voices connect and the bus's\n * fader. `slots()` is the chain as edited; the audio graph follows one\n * crossfade at a time, and `settled()` resolves once it has caught up.\n */\nexport interface InsertChain {\n add(effect: InsertEffect, opts?: InsertAddOptions): InsertSlot;\n slots(): InsertSlot[];\n clear(): void;\n settled(): Promise<void>;\n}\n\n/** Options for an insert chain: its crossfade length, and the timers it schedules with. */\nexport interface InsertChainOptions extends Partial<Timers> {\n /** Crossfade length for every edit, in ms. Default 15. */\n fadeMs?: number;\n}\n\n/** A chain and the switch that cancels its transition in flight. */\nexport interface OwnedInsertChain {\n chain: InsertChain;\n dispose(): void;\n}\n\ninterface Slot {\n handle: InsertSlot;\n effect: InsertEffect;\n bypassed: boolean;\n removed: boolean;\n /** Built on first splice-in, kept across a move, torn down on removal. */\n nodes: { in: GainNode; out: GainNode; dry: GainNode; wet: GainNode } | null;\n}\n\n/** A gain between two consecutive points of the chain — the thing that fades\n * when a route changes. */\ninterface Link { from: AudioNode; to: AudioNode; gain: GainNode }\n\ntype Step =\n | { kind: 'out'; slot: Slot }\n | { kind: 'in'; slot: Slot; at: number };\n\n/**\n * Build an insert chain from `head` to `tail`, which start wired straight\n * through.\n *\n * A structural edit never swaps a connection instantly. A splice-in builds the\n * route through the new slot beside the old one and crossfades the two into\n * `next`; a splice-out does the reverse, so the effect's tail fades rather than\n * cuts. A move is a splice-out followed by a splice-in, never one rewire:\n * crossfading two orders at once would wire `b → c` and `c → b` together, and\n * Web Audio mutes a cycle with no delay in it.\n */\nexport function createInsertChain(\n ctx: BaseAudioContext,\n head: AudioNode,\n tail: AudioNode,\n opts: InsertChainOptions = {},\n): OwnedInsertChain {\n const fadeMs = opts.fadeMs ?? 15;\n const timers: Timers = {\n setTimer: opts.setTimer ?? defaultTimers.setTimer,\n clearTimer: opts.clearTimer ?? defaultTimers.clearTimer,\n };\n const used = new WeakSet<InsertEffect>();\n const order: Slot[] = [];\n /** The slots the audio graph routes through, in graph order. */\n const live: Slot[] = [];\n const links: Link[] = [];\n let busy = false;\n /** The slot a crossfade in flight is taking out of the graph, whose finish disposes it if removed. */\n let leaving: Slot | null = null;\n let cancel: (() => void) | null = null;\n let disposed = false;\n let waiters: (() => void)[] = [];\n\n const fade = (): number => (ctx.state === 'running' ? fadeMs : 0);\n\n const link = (from: AudioNode, to: AudioNode, gain: number): Link => {\n const g = ctx.createGain();\n // `.value` first, so `writeParam` anchors a ramp at it rather than at 1.\n g.gain.value = gain;\n writeParam(ctx, g.gain, gain);\n from.connect(g);\n g.connect(to);\n const l = { from, to, gain: g };\n links.push(l);\n return l;\n };\n\n const unlink = (l: Link): void => {\n l.from.disconnect(l.gain);\n l.gain.disconnect();\n links.splice(links.indexOf(l), 1);\n };\n\n const find = (from: AudioNode, to: AudioNode): Link =>\n links.find((l) => l.from === from && l.to === to)!;\n\n const inOf = (s: Slot | null): AudioNode => (s ? s.nodes!.in : tail);\n const outOf = (s: Slot | null): AudioNode => (s ? s.nodes!.out : head);\n\n const setBypass = (s: Slot, ms: number): void => {\n if (!s.nodes) return;\n writeParam(ctx, s.nodes.wet.gain, s.bypassed ? 0 : 1, ms);\n writeParam(ctx, s.nodes.dry.gain, s.bypassed ? 1 : 0, ms);\n };\n\n const build = (s: Slot): void => {\n if (s.nodes) return;\n const n = {\n in: ctx.createGain(), out: ctx.createGain(), dry: ctx.createGain(), wet: ctx.createGain(),\n };\n n.in.connect(s.effect.input);\n s.effect.output.connect(n.wet);\n n.wet.connect(n.out);\n n.in.connect(n.dry);\n n.dry.connect(n.out);\n s.nodes = n;\n n.wet.gain.value = s.bypassed ? 0 : 1;\n n.dry.gain.value = s.bypassed ? 1 : 0;\n setBypass(s, 0);\n };\n\n const destroy = (s: Slot): void => {\n const n = s.nodes;\n if (!n) return;\n // Targeted, not bare: the effect's nodes are the consumer's, and may be\n // wired to things besides this slot.\n n.in.disconnect();\n try { s.effect.output.disconnect(n.wet); } catch { /* already cut */ }\n n.wet.disconnect();\n n.dry.disconnect();\n n.out.disconnect();\n s.nodes = null;\n };\n\n const plan = (): Step | null => {\n const stale = live.find((s) => s.removed);\n if (stale) return { kind: 'out', slot: stale };\n const wanted = order.filter((s) => live.includes(s));\n for (let i = 0; i < wanted.length; i += 1) {\n // Out now, back in at its place on a later step.\n if (live[i] !== wanted[i]) return { kind: 'out', slot: wanted[i] };\n }\n const i = order.findIndex((s) => !live.includes(s));\n if (i < 0) return null;\n let at = 0;\n for (let j = i - 1; j >= 0; j -= 1) {\n const k = live.indexOf(order[j]);\n if (k >= 0) { at = k + 1; break; }\n }\n return { kind: 'in', slot: order[i], at };\n };\n\n /** Start `step`'s crossfade and return what finishes it. */\n const begin = (step: Step, ms: number): (() => void) => {\n const s = step.slot;\n if (step.kind === 'in') {\n build(s);\n const prev = live[step.at - 1] ?? null;\n const next = live[step.at] ?? null;\n const old = find(outOf(prev), inOf(next));\n link(outOf(prev), inOf(s), 1);\n const incoming = link(outOf(s), inOf(next), 0);\n live.splice(step.at, 0, s);\n writeParam(ctx, old.gain.gain, 0, ms);\n writeParam(ctx, incoming.gain.gain, 1, ms);\n return () => unlink(old);\n }\n const i = live.indexOf(s);\n const prev = live[i - 1] ?? null;\n const next = live[i + 1] ?? null;\n const into = find(outOf(prev), inOf(s));\n const from = find(outOf(s), inOf(next));\n const direct = link(outOf(prev), inOf(next), 0);\n live.splice(i, 1);\n leaving = s;\n writeParam(ctx, from.gain.gain, 0, ms);\n writeParam(ctx, direct.gain.gain, 1, ms);\n return () => {\n leaving = null;\n unlink(into);\n unlink(from);\n if (s.removed) {\n destroy(s);\n s.effect.dispose?.();\n }\n };\n };\n\n const pump = (): void => {\n while (!busy && !disposed) {\n const step = plan();\n if (!step) {\n const done = waiters;\n waiters = [];\n for (const w of done) w();\n return;\n }\n const ms = fade();\n const finish = begin(step, ms);\n if (ms === 0) {\n finish();\n continue;\n }\n busy = true;\n cancel = atAudioTime(ctx, timers, ctx.currentTime + ms / 1000, () => {\n cancel = null;\n busy = false;\n finish();\n pump();\n });\n }\n };\n\n link(head, tail, 1);\n\n const slotOf = (effect: InsertEffect, bypassed: boolean): Slot => {\n const s: Slot = { effect, bypassed, removed: false, nodes: null, handle: null as never };\n s.handle = {\n effect,\n bypass(on) {\n if (s.bypassed === on) return;\n s.bypassed = on;\n setBypass(s, fade());\n },\n bypassed: () => s.bypassed,\n moveTo(index) {\n const from = order.indexOf(s);\n if (from < 0) return;\n order.splice(from, 1);\n order.splice(Math.max(0, Math.min(index, order.length)), 0, s);\n pump();\n },\n remove() {\n const at = order.indexOf(s);\n if (at < 0) return;\n order.splice(at, 1);\n s.removed = true;\n // `plan` only finds a removed slot in the graph; one that is out of it has no later step to dispose it.\n if (!live.includes(s) && leaving !== s) {\n destroy(s);\n s.effect.dispose?.();\n }\n pump();\n },\n index: () => order.indexOf(s),\n };\n return s;\n };\n\n const chain: InsertChain = {\n add(effect, addOpts = {}) {\n if (used.has(effect)) {\n throw new Error('@weasel-js/audio: that effect is already in an insert slot');\n }\n used.add(effect);\n const s = slotOf(effect, addOpts.bypassed ?? false);\n const index = addOpts.index ?? order.length;\n order.splice(Math.max(0, Math.min(index, order.length)), 0, s);\n pump();\n return s.handle;\n },\n slots: () => order.map((s) => s.handle),\n clear() {\n for (const s of [...order]) s.handle.remove();\n },\n settled() {\n if (!busy && plan() === null) return Promise.resolve();\n return new Promise((resolve) => { waiters.push(resolve); });\n },\n };\n return {\n chain,\n dispose() {\n disposed = true;\n cancel?.();\n cancel = null;\n const done = waiters;\n waiters = [];\n for (const w of done) w();\n },\n };\n}\n","import {\n createInsertChain, type InsertChain, type InsertChainOptions, type OwnedInsertChain,\n} from './inserts';\nimport { writeParam } from './param';\n\n/** Controls for one named bus. `rampMs` slews a gain change over that many\n * ms instead of stepping it. */\nexport interface BusHandle {\n setGain(value: number, rampMs?: number): void;\n mute(on: boolean): void;\n solo(on: boolean): void;\n /** The bus's own gain, as last set — not what a mute or solo is imposing. */\n gain(): number;\n /** The mute flag as set, independent of any solo. */\n muted(): boolean;\n /** The solo flag as set; whether it silences anything is a graph-wide answer. */\n soloed(): boolean;\n /** Whether the bus is being heard: unmuted, and soloed if any bus is soloed.\n * Not derivable from `muted()` and `soloed()` alone. */\n audible(): boolean;\n /** Effects between where the bus's voices connect and its fader. */\n readonly inserts: InsertChain;\n}\n\n/** The mix graph built by `createBusGraph`. `input(name)` is where a voice\n * connects; it runs through the bus's inserts to `node(name)`, the fader,\n * which feeds `master`, which feeds the destination. Unknown bus names throw. */\nexport interface BusGraph {\n master: GainNode;\n input(name: string): GainNode;\n node(name: string): GainNode;\n bus(name: string): BusHandle;\n names(): string[];\n /** Cancel every insert transition in flight. The nodes stay wired. */\n dispose(): void;\n}\n\n/** Options for `createBusGraph`: the insert chains' crossfade and timer. */\nexport type BusGraphOptions = InsertChainOptions;\n\ninterface BusState {\n input: GainNode;\n node: GainNode;\n inserts: OwnedInsertChain;\n gain: number;\n muted: boolean;\n soloed: boolean;\n}\n\n/**\n * The mix graph: one `GainNode` per named bus, all routed to a master that\n * routes to the destination.\n *\n * Gain, mute and solo are three inputs to one output value rather than three\n * things that write the node directly — otherwise unmuting restores the wrong\n * value whenever a solo changed it in between. All three write through\n * `writeParam`, so `rampMs` survives instead of being overwritten by the\n * recomputation that follows it.\n */\nexport function createBusGraph(\n ctx: AudioContext,\n names: string[],\n opts: BusGraphOptions = {},\n): BusGraph {\n const master = ctx.createGain();\n master.connect(ctx.destination);\n\n const states = new Map<string, BusState>();\n for (const name of names) {\n const input = ctx.createGain();\n const node = ctx.createGain();\n node.connect(master);\n const inserts = createInsertChain(ctx, input, node, opts);\n states.set(name, { input, node, inserts, gain: 1, muted: false, soloed: false });\n }\n\n const anySoloed = (): boolean => {\n for (const s of states.values()) if (s.soloed) return true;\n return false;\n };\n\n const audibleUnder = (s: BusState, soloing: boolean): boolean =>\n !s.muted && (!soloing || s.soloed);\n\n // `ramp` names the one bus whose own value changed, so a solo does not slew\n // every other bus at whatever rate that bus was last set with.\n const apply = (ramp?: { bus: BusState; ms: number }): void => {\n const soloing = anySoloed();\n for (const s of states.values()) {\n const value = audibleUnder(s, soloing) ? s.gain : 0;\n writeParam(ctx, s.node.gain, value, ramp?.bus === s ? ramp.ms : undefined);\n }\n };\n\n const get = (name: string): BusState => {\n const s = states.get(name);\n if (!s) throw new Error(`@weasel-js/audio: unknown bus \"${name}\"`);\n return s;\n };\n\n return {\n master,\n input: (name) => get(name).input,\n node: (name) => get(name).node,\n names: () => [...states.keys()],\n dispose() {\n for (const s of states.values()) s.inserts.dispose();\n },\n bus(name) {\n const s = get(name);\n return {\n setGain(value, rampMs) {\n s.gain = value;\n apply(rampMs && rampMs > 0 ? { bus: s, ms: rampMs } : undefined);\n },\n mute(on) { s.muted = on; apply(); },\n solo(on) { s.soloed = on; apply(); },\n gain: () => s.gain,\n muted: () => s.muted,\n soloed: () => s.soloed,\n audible: () => audibleUnder(s, anySoloed()),\n inserts: s.inserts.chain,\n };\n },\n };\n}\n","/** Keeps a context resumable: gesture listeners while it is not running, and\n * the time it last resumed, which is where a suspension's backlog ends. */\nexport interface ResumeWatch {\n /** Engine time before which a queued entry is stale — set on resume, so a\n * suspension does not end in one pass that fires its whole backlog. */\n staleFloor(): number;\n dispose(): void;\n}\n\nexport function createResumeWatch(\n ctx: BaseAudioContext,\n hooks: {\n /** Engine time in ms. */\n now(): number;\n unlock(): Promise<void>;\n /** The context stopped running. */\n onSuspend(): void;\n },\n): ResumeWatch {\n let disposed = false;\n let suspendedSince = false;\n let staleFloor = -Infinity;\n\n // Resume on a user gesture, and keep listening until one takes. On touch a\n // tap grants activation at pointerup, touchend and click, not at pointerdown\n // or touchstart, so the first events of a first tap resume nothing.\n const gestures = ['pointerdown', 'pointerup', 'touchend', 'click', 'keydown'] as const;\n const onGesture = (): void => { void hooks.unlock().catch(() => undefined); };\n const arm = (): void => {\n if (typeof window === 'undefined') return;\n for (const g of gestures) window.addEventListener(g, onGesture, { passive: true });\n };\n const disarm = (): void => {\n if (typeof window === 'undefined') return;\n for (const g of gestures) window.removeEventListener(g, onGesture);\n };\n if (ctx.state !== 'running') arm();\n\n // A browser suspends the context when the tab goes away, and the gesture\n // listeners are long removed by then. Without this the engine is\n // permanently silent afterwards, with no diagnostic — the drop warning is a\n // once-per-engine latch.\n const onStateChange = (): void => {\n if (disposed) return;\n if (ctx.state === 'running') {\n disarm();\n if (suspendedSince) staleFloor = hooks.now();\n suspendedSince = false;\n return;\n }\n suspendedSince = true;\n hooks.onSuspend();\n arm();\n };\n ctx.addEventListener('statechange', onStateChange);\n\n return {\n staleFloor: () => staleFloor,\n dispose() {\n disposed = true;\n disarm();\n ctx.removeEventListener('statechange', onStateChange);\n },\n };\n}\n","/** Clock and timer for `createScheduler`. */\nexport interface SchedulerOptions {\n /** Engine time in ms. Backed by `AudioContext.currentTime * 1000` in production. */\n now: () => number;\n /** One-shot: it fires once and the pass re-arms it. `setInterval` here would\n * leave every previous timer running. */\n setTimer: (cb: () => void, ms: number) => unknown;\n clearTimer: (handle: unknown) => void;\n /** How far ahead to book events, in ms. Default 100. */\n lookahead?: number;\n /** Time between passes, in ms. Default 25. */\n interval?: number;\n /** An event fired `lateMs` after its time `when`: the passes that should\n * have reached it inside the lookahead stalled, and whatever it starts will\n * sound late by that much. Never called for an event booked inside the\n * lookahead or for a time already past, which no pass was meant to catch. */\n onLate?: (lateMs: number, when: number) => void;\n}\n\ninterface Entry {\n when: number;\n fire: (when: number) => void;\n key?: string;\n /** Booked for a time past the lookahead, so a pass reaching it late is reported. */\n waited: boolean;\n}\n\n/** A queue of callbacks keyed to engine time. See `createScheduler`. */\nexport interface Scheduler {\n start(): void;\n /** Stop the timer. The queue survives; `clear()` empties it. */\n stop(): void;\n /** Book `fire` for engine time `when`, receiving `when` so it can hand the\n * true time to `source.start()` rather than \"now\". It runs on the first\n * pass whose lookahead window reaches it — or, when the window already\n * covers it and the scheduler is running, at the end of the current task,\n * in time order with everything else then due. `reportLate: false` keeps\n * it from `onLate`, for a callback whose work no longer depends on when it\n * runs. */\n schedule(when: number, fire: (when: number) => void, key?: string, opts?: { reportLate?: boolean }): void;\n /** Drop queued events with this key. A pass takes its whole batch out of the\n * queue before firing any of it, so a callback cannot cancel a sibling that\n * came due alongside it. */\n cancelKey(key: string): void;\n /** Drop every queued event. Without this, a stop/start cycle fires\n * everything that came due meanwhile in one burst on the first pass. */\n clear(): void;\n pending(): number;\n}\n\n/**\n * Lookahead scheduler. Each pass fires everything due within `lookahead` ms,\n * in time order, handing each callback its own scheduled time. An event\n * scheduled inside that window does not wait up to `interval` for the next\n * pass: the end of the current task fires what is due then.\n *\n * It runs on its own timer rather than on an animation frame, which stops\n * entirely when nothing is animating. The timer is one-shot: the pass re-arms\n * it at the end, so passes cannot overlap. A main-thread `setTimeout` is clamped\n * to a second in a hidden tab, which the lookahead cannot cover; the engine\n * passes `createTickTimer` instead.\n */\nexport function createScheduler(opts: SchedulerOptions): Scheduler {\n const lookahead = opts.lookahead ?? 100;\n const interval = opts.interval ?? 25;\n let queue: Entry[] = [];\n let running = false;\n let handle: unknown = null;\n\n let flushQueued = false;\n\n const fireDue = (): void => {\n const now = opts.now();\n const horizon = now + lookahead;\n const due: Entry[] = [];\n const rest: Entry[] = [];\n for (const entry of queue) (entry.when <= horizon ? due : rest).push(entry);\n queue = rest;\n due.sort((a, b) => a.when - b.when);\n for (const entry of due) {\n if (entry.waited && entry.when < now) opts.onLate?.(now - entry.when, entry.when);\n try {\n entry.fire(entry.when);\n } catch (err) {\n console.error('@weasel-js/audio scheduler: callback threw', err);\n }\n }\n };\n\n const pass = (): void => {\n fireDue();\n if (running) handle = opts.setTimer(pass, interval);\n };\n\n // A microtask rather than firing inside `schedule()`: everything booked in\n // one task is fired as one batch, sorted by time, exactly as a pass would.\n const flush = (): void => {\n flushQueued = false;\n if (running) fireDue();\n };\n\n return {\n start() {\n if (running) return;\n running = true;\n handle = opts.setTimer(pass, interval);\n },\n stop() {\n if (!running) return;\n running = false;\n opts.clearTimer(handle);\n handle = null;\n },\n schedule(when, fire, key, entryOpts) {\n const waited = when > opts.now() + lookahead;\n queue.push({ when, fire, key, waited: waited && entryOpts?.reportLate !== false });\n if (running && !flushQueued && !waited) {\n flushQueued = true;\n queueMicrotask(flush);\n }\n },\n cancelKey(key) {\n queue = queue.filter((e) => e.key !== key);\n },\n clear() {\n queue = [];\n },\n pending: () => queue.length,\n };\n}\n","/** Opaque reference to a decoded sound. Mirrors `TextureHandle` in core. */\nexport interface SoundHandle { readonly id: string }\n\n/** Decoded buffers behind opaque `SoundHandle`s. Nothing is ever evicted. */\nexport interface SoundCache {\n load(url: string): Promise<SoundHandle>;\n loadAll(urls: Record<string, string>): Promise<Record<string, SoundHandle>>;\n decode(bytes: ArrayBuffer): Promise<SoundHandle>;\n /** Take ownership of a buffer the caller already has — a procedural synth,\n * an OfflineAudioContext render, a recording. Synchronous; nothing to decode. */\n register(buffer: AudioBuffer): SoundHandle;\n buffer(handle: SoundHandle): AudioBuffer | null;\n}\n\n/** Create a cache that decodes through `ctx`. `load` fetches with `fetchFn`,\n * returns the existing handle for a url already loaded, and shares one fetch\n * between concurrent loads of it; a failed load is not cached. */\nexport function createSoundCache(\n ctx: AudioContext,\n fetchFn: typeof fetch = fetch,\n): SoundCache {\n let counter = 0;\n const buffers = new Map<string, AudioBuffer>();\n const byUrl = new Map<string, SoundHandle>();\n // In-flight loads, so two concurrent `load` calls for one url share a fetch.\n const inflight = new Map<string, Promise<SoundHandle>>();\n\n const store = (buffer: AudioBuffer): SoundHandle => {\n const id = `snd_${++counter}`;\n buffers.set(id, buffer);\n return { id };\n };\n\n const cache: SoundCache = {\n async load(url) {\n const existing = byUrl.get(url);\n if (existing) return existing;\n const pending = inflight.get(url);\n if (pending) return pending;\n\n const task = (async () => {\n const res = await fetchFn(url);\n if (!res.ok) throw new Error(`@weasel-js/audio: failed to load ${url} (${res.status})`);\n const bytes = await res.arrayBuffer();\n const buffer = await ctx.decodeAudioData(bytes);\n const handle = store(buffer);\n byUrl.set(url, handle);\n return handle;\n })();\n\n inflight.set(url, task);\n try {\n return await task;\n } finally {\n // Always clear: a failed load must not be cached, or a retry can never\n // succeed for the lifetime of the page.\n inflight.delete(url);\n }\n },\n async loadAll(urls) {\n const names = Object.keys(urls);\n const handles = await Promise.all(names.map((n) => cache.load(urls[n])));\n return Object.fromEntries(names.map((n, i) => [n, handles[i]]));\n },\n async decode(bytes) {\n return store(await ctx.decodeAudioData(bytes));\n },\n register: (buffer) => store(buffer),\n buffer: (handle) => buffers.get(handle.id) ?? null,\n };\n return cache;\n}\n","import { atAudioTime, type Timers } from './audioTime';\nimport type { SourceLike, Starter } from './liveVoice';\nimport type { StreamOptions, VoiceHandle } from './types';\n\n/** How `stream` makes its source, and which voice holds each element. */\nexport interface StreamStarters {\n /** The element a call names, made from a URL when it is one. */\n element(media: HTMLMediaElement | string, opts: StreamOptions): HTMLMediaElement;\n starter(el: HTMLMediaElement, opts: StreamOptions): Starter;\n /** An element has one playhead: the voice streaming it now, to stop before\n * another starts. */\n streaming: WeakMap<HTMLMediaElement, VoiceHandle>;\n}\n\n/** A media element's playback as a voice source: `stop(when)` pauses once\n * the audio clock reaches `when`, and the element ending ends the voice. */\nfunction mediaSource(\n ctx: BaseAudioContext, timers: Timers, el: HTMLMediaElement, node: AudioNode, into: AudioNode,\n): SourceLike {\n let ended = false;\n let cancelWait: (() => void) | null = null;\n const finish = (): void => {\n if (ended) return;\n ended = true;\n cancelWait?.();\n el.pause();\n el.removeEventListener('ended', finish);\n el.removeEventListener('error', finish);\n // Queued, as a source node's `onended` is: the engine may be inside the\n // teardown that called `stop()`.\n queueMicrotask(() => (shim.onended as (() => void) | null)?.());\n };\n const shim: SourceLike = {\n onended: null,\n stop(when?: number) {\n if (ended) return;\n cancelWait?.();\n cancelWait = when !== undefined && when > ctx.currentTime\n ? atAudioTime(ctx, timers, when, finish)\n : null;\n if (!cancelWait) finish();\n },\n disconnect() {\n try { node.disconnect(into); } catch { /* not wired */ }\n },\n };\n el.addEventListener('ended', finish);\n el.addEventListener('error', finish);\n el.play().catch((err: unknown) => {\n if (ended) return;\n console.warn(`@weasel-js/audio: a stream would not start — ${String(err)}`);\n finish();\n });\n return shim;\n}\n\nexport function createStreamStarters(ctx: AudioContext, timers: Timers): StreamStarters {\n // An element can be routed into a graph once, ever: the node is kept for the\n // element's lifetime and handed from voice to voice.\n const mediaSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();\n return {\n element(media, opts) {\n if (typeof media !== 'string') return media;\n const el = new Audio();\n if (opts.crossOrigin !== undefined) el.crossOrigin = opts.crossOrigin;\n el.preload = 'auto';\n el.src = media;\n return el;\n },\n starter(el, opts) {\n return {\n ready: () => true,\n start(voice) {\n let node = mediaSources.get(el);\n if (!node) {\n node = ctx.createMediaElementSource(el);\n mediaSources.set(el, node);\n }\n el.loop = opts.loop ?? false;\n if (opts.offset !== undefined) el.currentTime = opts.offset / 1000;\n voice.retune = () => { el.playbackRate = voice.rate; };\n voice.retune();\n const into = voice.out!.input!;\n node.connect(into);\n return mediaSource(ctx, timers, el, node, into);\n },\n };\n },\n streaming: new WeakMap(),\n };\n}\n","/** An ADSR envelope. Times are ms; `sustain` is a level, 0..1, of the peak. */\nexport interface Envelope {\n /** Default 5 — long enough that the onset does not click. */\n attack?: number;\n /** Default 0. */\n decay?: number;\n /** Default 1. */\n sustain?: number;\n /** Default 30. */\n release?: number;\n}\n\n/** An envelope with every default filled in and every value in range. */\nexport type ResolvedEnvelope = Required<Envelope>;\n\n/** One breakpoint of an envelope's curve: a level at a time. */\nexport interface EnvelopePoint {\n /** ms from the note's start. */\n at: number;\n value: number;\n}\n\n/** Fill an envelope's defaults, clamping times to zero or more and `sustain` to 0..1. */\nexport function resolveEnvelope(env: Envelope = {}): ResolvedEnvelope {\n return {\n attack: Math.max(0, env.attack ?? 5),\n decay: Math.max(0, env.decay ?? 0),\n sustain: Math.min(1, Math.max(0, env.sustain ?? 1)),\n release: Math.max(0, env.release ?? 30),\n };\n}\n\nconst heldLevel = (e: ResolvedEnvelope, t: number): number => {\n if (t < e.attack) return t / e.attack;\n if (t < e.attack + e.decay) return 1 - ((1 - e.sustain) * (t - e.attack)) / e.decay;\n return e.sustain;\n};\n\n/** The level `t` ms after the start. With `gate`, the release begins that many\n * ms in, from whatever level the envelope had reached. */\nexport function envelopeLevel(e: ResolvedEnvelope, t: number, gate?: number): number {\n if (gate === undefined || t <= gate) return heldLevel(e, t);\n if (e.release === 0) return 0;\n return Math.max(0, heldLevel(e, gate) * (1 - (t - gate) / e.release));\n}\n\n/**\n * Breakpoints joined by linear ramps. Without `gate` they end at the sustain,\n * held until something releases the note; with it they end at zero, `gate +\n * release` ms in.\n */\nexport function envelopePoints(e: ResolvedEnvelope, gate?: number): EnvelopePoint[] {\n const end = gate ?? Infinity;\n const points: EnvelopePoint[] = [{ at: 0, value: e.attack > 0 ? 0 : 1 }];\n for (const at of [e.attack, e.attack + e.decay]) {\n if (at <= points[points.length - 1].at) continue;\n if (at >= end) break;\n points.push({ at, value: heldLevel(e, at) });\n }\n if (gate === undefined) return points;\n if (gate > points[points.length - 1].at) points.push({ at: gate, value: heldLevel(e, gate) });\n points.push({ at: gate + e.release, value: 0 });\n return points;\n}\n","import type { Vec2 } from './spatialize';\nimport type { PlayOptions, VoiceDropReason } from './types';\nimport type { VoicePool } from './voicePool';\nimport type { VoiceOut } from './voiceChains';\n\n/** A voice pool and its token index. Tokens restart at 1 in every pool, so the\n * index has to be per pool — keyed by bus name, a shared pool would look a\n * steal victim up under the wrong name and silently never tear it down. */\nexport interface Slots {\n pool: VoicePool;\n byToken: Map<number, LiveVoice>;\n}\n\n/** What `play` and `playNote` share apart from the node they make. */\nexport type VoiceOptions = Omit<PlayOptions, 'loop'>;\n\n/** What a voice plays through: a scheduled source node, or a stand-in with\n * the same end-of-life contract — `onended` fires asynchronously, once. */\nexport type SourceLike = Pick<AudioScheduledSourceNode, 'onended' | 'stop' | 'disconnect'>;\n\n/** Several sources stopped together, as one: the first carries `onended`. */\nexport const sourceGroup = (nodes: AudioScheduledSourceNode[]): SourceLike => ({\n get onended() { return nodes[0].onended; },\n set onended(fn) { nodes[0].onended = fn; },\n stop(when?: number) {\n for (const n of nodes) {\n try { n.stop(when); } catch { /* not started, or already stopped */ }\n }\n },\n disconnect() { for (const n of nodes) n.disconnect(); },\n});\n\n/** How one kind of voice makes its node. */\nexport interface Starter {\n /** False drops the voice when it comes due. */\n ready(): boolean;\n /** Build the node, connect it into `voice.out.input`, and start it at\n * `when`, engine ms. A booked voice's source already exists: this hands it over. */\n start(voice: LiveVoice, when: number): SourceLike;\n /**\n * For a voice whose samples are made off the main thread: hand it over at\n * the call rather than when the scheduler fires, so a stall between the two\n * cannot delay it. Returns the voice's output in place of a node chain, and\n * what cancels it if it is torn down before it starts.\n */\n book?(voice: LiveVoice, at: { bus: string; when: number; level: number; pan: number }): Booking;\n}\n\n/** What `Starter.book` returns. */\nexport interface Booking {\n out: VoiceOut;\n cancel(): void;\n}\n\nexport interface LiveVoice {\n id: number;\n slots: Slots;\n /** Null until the scheduler fires it: a voice booked seconds out must not\n * hold a slot, and must not be an eviction candidate, while silent. */\n slot: number | null;\n token: number;\n key?: string;\n onDrop?: (reason: VoiceDropReason) => void;\n source: SourceLike | null;\n /** A synth voice's envelope gain, between its sources and the chain. */\n env: GainNode | null;\n /** Writes `rate` and `detune` to the node, once there is one. */\n retune: (() => void) | null;\n /** A synth voice's note-off. Null for a buffer voice, and until it starts. */\n release: (() => void) | null;\n releasing: boolean;\n /** Null once torn down, when a chain goes back to be reused: a handle\n * that outlives its voice must not write to another voice's nodes. */\n out: VoiceOut | null;\n /** A booked voice's cancel, until it starts. */\n unbook: (() => void) | null;\n /** A booked voice's start, run ahead of the scheduler once the audio clock\n * has passed its time: the processor is already playing it. */\n catchUp: (() => void) | null;\n baseGain: number;\n spatialGain: number;\n rate: number;\n detune: number;\n /** Kept so `setListener` can re-spatialize a voice that is already playing. */\n position?: Vec2;\n playing: boolean;\n canceled: boolean;\n /** `stop(fadeMs)` owns the output's level from here until the source ends. */\n fading: boolean;\n /** Context time a `setGain` ramp on the level ends at; 0 when none was asked for. */\n rampEnd: number;\n}\n","/** A pitch: hertz as a number, a scientific pitch name (`'A4'`, `'C#3'`,\n * `'Bb2'`), or a MIDI note number wrapped as `{ midi }` so it cannot be read\n * as hertz. */\nexport type Pitch = number | string | { midi: number };\n\n/** Equal temperament, A4 = MIDI 69 = 440 Hz. Fractional notes are cents. */\nexport function midiToFrequency(midi: number): number {\n return 440 * 2 ** ((midi - 69) / 12);\n}\n\nconst LETTERS: Record<string, number> = { c: 0, d: 2, e: 4, f: 5, g: 7, a: 9, b: 11 };\n\n/** MIDI number of a scientific pitch name: C4 is 60. Accepts any run of `#`\n * or `b` after the letter. */\nexport function noteToMidi(name: string): number {\n const m = /^([A-Ga-g])([#b]*)(-?\\d+)$/.exec(name.trim());\n if (!m) throw new Error(`@weasel-js/audio: cannot read \"${name}\" as a note name`);\n let semitone = LETTERS[m[1].toLowerCase()];\n for (const acc of m[2]) semitone += acc === '#' ? 1 : -1;\n return (Number(m[3]) + 1) * 12 + semitone;\n}\n\n/** A pitch in hertz. Throws on a note name it cannot read, and on a frequency that is not positive and finite. */\nexport function toFrequency(pitch: Pitch): number {\n const hz = typeof pitch === 'number' ? pitch\n : typeof pitch === 'string' ? midiToFrequency(noteToMidi(pitch))\n : midiToFrequency(pitch.midi);\n if (!(hz > 0) || !Number.isFinite(hz)) {\n throw new RangeError(`@weasel-js/audio: a pitch must be a positive frequency, got ${hz}`);\n }\n return hz;\n}\n","import { envelopeLevel, envelopePoints, resolveEnvelope, type ResolvedEnvelope } from './envelope';\nimport { toFrequency } from './pitch';\nimport type { Inharmonic, NoiseColor, NoteOptions, SynthPartial, VoiceFilter, Waveform } from './types';\n\n/** Seconds of noise in each cached loop: long enough that the repeat is not\n * heard as a pitch. */\nexport const NOISE_SECONDS = 2;\n/** Every color is scaled to this RMS, so changing color does not change level. */\nconst NOISE_RMS = 0.25;\n\nconst noiseCache = new WeakMap<BaseAudioContext, Map<NoiseColor, AudioBuffer>>();\n\n/** Samples of `color` noise, seeded so every context gets the same loop. The\n * end is pulled onto the start, so the loop point does not click. */\nexport function noiseSamples(color: NoiseColor, length: number): Float32Array {\n const out = new Float32Array(length);\n let s = 0x9e3779b9;\n const white = (): number => {\n s = (Math.imul(s, 1664525) + 1013904223) >>> 0;\n return (s / 0x100000000) * 2 - 1;\n };\n if (color === 'white') {\n for (let i = 0; i < length; i += 1) out[i] = white();\n } else if (color === 'pink') {\n // Paul Kellet's refined filter: within 0.05 dB of -3 dB/octave above 9 Hz.\n let b0 = 0, b1 = 0, b2 = 0, b3 = 0, b4 = 0, b5 = 0, b6 = 0;\n for (let i = 0; i < length; i += 1) {\n const w = white();\n b0 = 0.99886 * b0 + w * 0.0555179;\n b1 = 0.99332 * b1 + w * 0.0750759;\n b2 = 0.969 * b2 + w * 0.153852;\n b3 = 0.8665 * b3 + w * 0.3104856;\n b4 = 0.55 * b4 + w * 0.5329522;\n b5 = -0.7616 * b5 - w * 0.016898;\n out[i] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + w * 0.5362;\n b6 = w * 0.115926;\n }\n } else {\n // A leaky integrator: -6 dB/octave down to a few Hz, without wandering off.\n let y = 0;\n for (let i = 0; i < length; i += 1) {\n y = (y + 0.02 * white()) / 1.02;\n out[i] = y;\n }\n }\n const step = (out[length - 1] - out[0]) / Math.max(1, length - 1);\n let mean = 0;\n for (let i = 0; i < length; i += 1) {\n out[i] -= step * i;\n mean += out[i];\n }\n mean /= length;\n let sq = 0;\n for (let i = 0; i < length; i += 1) {\n out[i] -= mean;\n sq += out[i] * out[i];\n }\n const scale = sq > 0 ? NOISE_RMS / Math.sqrt(sq / length) : 0;\n for (let i = 0; i < length; i += 1) out[i] *= scale;\n return out;\n}\n\n/** One looping noise buffer per color per context, made on first use. */\nexport function noiseBuffer(ctx: BaseAudioContext, color: NoiseColor): AudioBuffer {\n let byColor = noiseCache.get(ctx);\n if (!byColor) {\n byColor = new Map();\n noiseCache.set(ctx, byColor);\n }\n let buffer = byColor.get(color);\n if (!buffer) {\n const length = Math.round(ctx.sampleRate * NOISE_SECONDS);\n buffer = ctx.createBuffer(1, length, ctx.sampleRate);\n buffer.getChannelData(0).set(noiseSamples(color, length));\n byColor.set(color, buffer);\n }\n return buffer;\n}\n\nexport const isInharmonic = (wave: Waveform): wave is Inharmonic =>\n typeof wave === 'object' && !Array.isArray(wave);\n\n/** Partials with their levels normalized to sum to 1, checked where the note\n * was written rather than when it comes due. */\nexport function resolvePartials(wave: Inharmonic): (SynthPartial & { gain: number })[] {\n if (wave.partials.length === 0) {\n throw new RangeError('@weasel-js/audio: an inharmonic wave needs at least one partial');\n }\n let total = 0;\n for (const p of wave.partials) {\n if (!(p.ratio > 0) || !Number.isFinite(p.ratio)) {\n throw new RangeError(`@weasel-js/audio: partial ratio must be a positive number, got ${p.ratio}`);\n }\n if (p.decay !== undefined && !(p.decay > 0)) {\n throw new RangeError(`@weasel-js/audio: partial decay must be a positive number of ms, got ${p.decay}`);\n }\n total += Math.abs(p.gain ?? 1);\n }\n return wave.partials.map((p) => ({\n ratio: p.ratio,\n gain: total > 0 ? (p.gain ?? 1) / total : 0,\n decay: p.decay,\n }));\n}\n\n/** What of a note is checked where it was written, not when it comes due. */\nexport interface ResolvedNote {\n from: number;\n glideTo: number | undefined;\n partials: (SynthPartial & { gain: number })[] | null;\n}\n\n/** A note's pitch, glide target and partials. Throws on a bad pitch or partial. */\nexport function resolveNote(note: Pick<NoteOptions, 'pitch' | 'glide' | 'wave'>): ResolvedNote {\n const wave = note.wave ?? 'sine';\n return {\n from: toFrequency(note.pitch),\n glideTo: note.glide ? toFrequency(note.glide.to) : undefined,\n partials: isInharmonic(wave) ? resolvePartials(wave) : null,\n };\n}\n\n/** An envelope written onto a param from `t0` (seconds), mapped through `map`,\n * and the note-off that releases it from wherever it has got to. */\nexport function envelopeOnParam(\n param: AudioParam,\n env: ResolvedEnvelope,\n gate: number | undefined,\n t0: number,\n map: (level: number) => number,\n): { release(at: number): void } {\n const [first, ...rest] = envelopePoints(env, gate);\n param.setValueAtTime(map(first.value), t0);\n for (const p of rest) param.linearRampToValueAtTime(map(p.value), t0 + p.at / 1000);\n return {\n release(at) {\n const elapsed = Math.max(0, (at - t0) * 1000);\n param.cancelScheduledValues(at);\n param.setValueAtTime(map(envelopeLevel(env, elapsed)), at);\n param.linearRampToValueAtTime(map(0), at + env.release / 1000);\n },\n };\n}\n\n/** A voice filter's node, scheduled from `t0`, with its envelope's release. */\nexport function voiceFilter(\n ctx: BaseAudioContext,\n spec: VoiceFilter,\n gate: number | undefined,\n t0: number,\n): { node: BiquadFilterNode; release(at: number): void } {\n const node = ctx.createBiquadFilter();\n node.type = spec.type ?? 'lowpass';\n node.Q.setValueAtTime(spec.Q ?? 1, t0);\n if (spec.gain !== undefined) node.gain.setValueAtTime(spec.gain, t0);\n const amount = spec.amount ?? 0;\n if (!spec.envelope || amount === 0) {\n node.frequency.setValueAtTime(spec.frequency, t0);\n return { node, release: () => {} };\n }\n const cutoff = envelopeOnParam(\n node.frequency, resolveEnvelope(spec.envelope), gate, t0, (v) => spec.frequency + amount * v,\n );\n return { node, release: cutoff.release };\n}\n\n/**\n * Ready-made inharmonic waves. The ratios are the textbook modes of each\n * object; the levels and decays are a starting point to spread and adjust.\n */\nexport const partialPresets = {\n /** A church bell's hum, prime, tierce, quint and nominal, and above. */\n bell: {\n partials: [\n { ratio: 0.5, gain: 0.6, decay: 1800 },\n { ratio: 1, gain: 1, decay: 1200 },\n { ratio: 1.183, gain: 0.7, decay: 900 },\n { ratio: 1.506, gain: 0.4, decay: 700 },\n { ratio: 2, gain: 0.8, decay: 600 },\n { ratio: 2.514, gain: 0.3, decay: 400 },\n { ratio: 2.662, gain: 0.25, decay: 350 },\n { ratio: 3.011, gain: 0.2, decay: 300 },\n ],\n },\n /** A tuned bar: its overtones sit near 4 and 10 times the fundamental and die fast. */\n marimba: {\n partials: [\n { ratio: 1, gain: 1, decay: 350 },\n { ratio: 3.984, gain: 0.35, decay: 90 },\n { ratio: 9.95, gain: 0.12, decay: 30 },\n ],\n },\n /** Struck sheet metal: modes nowhere near the harmonic series. */\n metal: {\n partials: [\n { ratio: 1, gain: 1, decay: 160 },\n { ratio: 1.71, gain: 0.53, decay: 120 },\n { ratio: 2.43, gain: 0.36, decay: 94 },\n { ratio: 3.19, gain: 0.27, decay: 78 },\n { ratio: 4.61, gain: 0.22, decay: 66 },\n { ratio: 5.87, gain: 0.18, decay: 58 },\n ],\n },\n} satisfies Record<string, Inharmonic>;\n","import { resolveEnvelope, type Envelope } from './envelope';\nimport { sourceGroup, type LiveVoice, type SourceLike, type Starter } from './liveVoice';\nimport {\n envelopeOnParam, noiseBuffer, resolveNote, voiceFilter, type ResolvedNote,\n} from './synthVoice';\nimport type { Inharmonic, NoiseOptions, NoteOptions, VoiceFilter, Waveform } from './types';\n\n/** How `playNote` and `playNoise` make their nodes. */\nexport interface SynthStarters {\n /** Throws on a bad pitch or partial, at the call rather than when it comes due. */\n note(note: NoteOptions): Starter;\n noise(noise: NoiseOptions): Starter;\n}\n\n/**\n * What every synth voice shares once its sources exist: sources → optional\n * filter → envelope gain → the voice's chain, the envelopes on both, the stop\n * at the end of the release, and the note-off. `make` builds and starts the\n * sources at `t0`, connected into the node it is handed.\n */\nfunction synthStart(\n ctx: BaseAudioContext,\n voice: LiveVoice,\n whenMs: number,\n patch: { envelope?: Envelope; filter?: VoiceFilter; duration?: number },\n make: (t0: number, into: AudioNode) => { nodes: AudioScheduledSourceNode[]; retune: () => void },\n): SourceLike {\n const t0 = whenMs / 1000;\n const env = resolveEnvelope(patch.envelope);\n const gate = patch.duration;\n // Its own gain, not the chain's: `setGain` and a fade cancel whatever is\n // scheduled on the chain's gain, and would take the envelope with it.\n const shaper = ctx.createGain();\n const amp = envelopeOnParam(shaper.gain, env, gate, t0, (v) => v);\n const filter = patch.filter ? voiceFilter(ctx, patch.filter, gate, t0) : null;\n filter?.node.connect(shaper);\n shaper.connect(voice.out!.input!);\n voice.env = shaper;\n\n const { nodes, retune } = make(t0, filter?.node ?? shaper);\n voice.retune = retune;\n retune();\n const stopAll = (at: number): void => { for (const n of nodes) n.stop(at); };\n voice.release = () => {\n const at = ctx.currentTime;\n // Already past its gate: the release is running and the stop is booked.\n if (gate !== undefined && at * 1000 - whenMs >= gate) return;\n amp.release(at);\n filter?.release(at);\n stopAll(at + env.release / 1000);\n };\n if (gate !== undefined) stopAll(t0 + (gate + env.release) / 1000);\n return nodes.length === 1 ? nodes[0] : sourceGroup(nodes);\n}\n\n/** A note's oscillators, started at `t0` into `into`: one with the note's\n * wave, or one sine per partial of an inharmonic wave. */\nfunction noteOscillators(\n ctx: BaseAudioContext,\n note: NoteOptions,\n { from, glideTo, partials }: ResolvedNote,\n applyWave: (osc: OscillatorNode, wave: Exclude<Waveform, Inharmonic>) => void,\n t0: number,\n into: AudioNode,\n): OscillatorNode[] {\n const wave = note.wave ?? 'sine';\n const tone = (ratio: number): OscillatorNode => {\n const osc = ctx.createOscillator();\n osc.frequency.setValueAtTime(from * ratio, t0);\n if (glideTo !== undefined) {\n const end = t0 + (note.glide!.ms ?? note.duration ?? 100) / 1000;\n if (note.glide!.curve === 'linear') osc.frequency.linearRampToValueAtTime(glideTo * ratio, end);\n else osc.frequency.exponentialRampToValueAtTime(glideTo * ratio, end);\n }\n return osc;\n };\n let oscs: OscillatorNode[];\n if (partials) {\n // Sines summed by hand: a PeriodicWave can only hold whole-number partials.\n oscs = partials.map((p) => {\n const osc = tone(p.ratio);\n const level = ctx.createGain();\n level.gain.setValueAtTime(p.gain, t0);\n if (p.decay !== undefined) level.gain.setTargetAtTime(0, t0, p.decay / 1000);\n osc.connect(level);\n level.connect(into);\n return osc;\n });\n } else {\n const osc = tone(1);\n applyWave(osc, wave as Exclude<Waveform, Inharmonic>);\n osc.connect(into);\n oscs = [osc];\n }\n for (const osc of oscs) osc.start(t0);\n return oscs;\n}\n\nexport function createSynthStarters(ctx: BaseAudioContext, random: () => number): SynthStarters {\n const waves = new Map<string, PeriodicWave>();\n const applyWave = (osc: OscillatorNode, wave: Exclude<Waveform, Inharmonic>): void => {\n if (typeof wave === 'string') {\n osc.type = wave;\n return;\n }\n const key = wave.join(',');\n let periodic = waves.get(key);\n if (!periodic) {\n // Sine terms only: partial k sits at imag[k], and index 0 is the DC term.\n const imag = new Float32Array(wave.length + 1);\n imag.set(wave, 1);\n periodic = ctx.createPeriodicWave(new Float32Array(wave.length + 1), imag);\n waves.set(key, periodic);\n }\n osc.setPeriodicWave(periodic);\n };\n\n return {\n note(note) {\n const resolved = resolveNote(note);\n return {\n ready: () => true,\n start: (voice, whenMs) => synthStart(ctx, voice, whenMs, note, (t0, into) => {\n const oscs = noteOscillators(ctx, note, resolved, applyWave, t0, into);\n return {\n nodes: oscs,\n retune: () => {\n for (const osc of oscs) osc.detune.value = voice.detune + 1200 * Math.log2(voice.rate);\n },\n };\n }),\n };\n },\n\n noise(noise) {\n return {\n ready: () => true,\n start: (voice, whenMs) => synthStart(ctx, voice, whenMs, noise, (t0, into) => {\n const source = ctx.createBufferSource();\n source.buffer = noiseBuffer(ctx, noise.noise);\n source.loop = true;\n source.connect(into);\n // A random point in the loop, so two hits in a row are not the same hit.\n source.start(t0, random() * source.buffer.duration);\n return {\n nodes: [source],\n retune: () => {\n source.playbackRate.value = voice.rate;\n source.detune.value = voice.detune;\n },\n };\n }),\n };\n },\n };\n}\n","const loads = new WeakMap<BaseAudioContext, Promise<void>>();\n\n/** Add the voice processor to a context's worklet scope, once per context.\n * Rejects where there is no `audioWorklet` (an insecure page), or where the\n * page's CSP refuses a `blob:` script. */\nexport function loadVoiceProcessor(ctx: BaseAudioContext): Promise<void> {\n let load = loads.get(ctx);\n if (!load) {\n load = (async () => {\n if (!ctx.audioWorklet) throw new Error('@weasel-js/audio: this context has no audioWorklet');\n // Imported here, so an engine that never asks for worklet voices does not carry the source.\n const { voiceProcessorSource } = await import('./voiceProcessor.gen');\n const url = URL.createObjectURL(new Blob([voiceProcessorSource], { type: 'text/javascript' }));\n try {\n await ctx.audioWorklet.addModule(url);\n } finally {\n URL.revokeObjectURL(url);\n }\n })();\n loads.set(ctx, load);\n }\n return load;\n}\n","import type { KernelNoise, KernelNote } from '../voiceKernel';\n\n/** The name the voice processor registers under in an `AudioWorkletGlobalScope`. */\nexport const VOICE_PROCESSOR = 'weasel-voices';\n\n/** What a voice starts with. Times are context seconds. */\ninterface VoiceStart {\n id: number;\n /** When the voice's first sample sounds. */\n at: number;\n level: number;\n pan: number;\n rate: number;\n detune: number;\n}\n\n/** What the engine posts to a bus's voice processor. Every time is context\n * seconds, and one already past applies at the next render quantum. */\nexport type ToProcessor =\n | (VoiceStart & { kind: 'note'; patch: KernelNote })\n | (VoiceStart & { kind: 'noise'; patch: KernelNoise; seed: number })\n /** `end` 0 sets the level at once; otherwise it ramps there linearly, from\n * wherever it is, by `end` — what `writeParam` does to a gain. */\n | { kind: 'level'; id: number; value: number; end: number }\n | { kind: 'pan'; id: number; value: number }\n | { kind: 'retune'; id: number; rate: number; detune: number }\n | { kind: 'release'; id: number }\n /** Silence the voice at `at`, or before it starts if that is earlier. */\n | { kind: 'stop'; id: number; at: number }\n | { kind: 'dispose' };\n\n/** What a voice processor posts back: a voice has stopped making sound, for\n * good — it played out, or reached its stop. */\nexport interface FromProcessor {\n kind: 'ended';\n id: number;\n}\n","import type { Booking, LiveVoice, SourceLike, Starter } from '../liveVoice';\nimport { resolveNote } from '../synthVoice';\nimport type { NoiseOptions, NoteOptions } from '../types';\nimport type { VoiceOut } from '../voiceChains';\nimport { loadVoiceProcessor } from './loadVoiceProcessor';\nimport { VOICE_PROCESSOR, type FromProcessor, type ToProcessor } from './protocol';\n\n/** Synth voices rendered by the voice processor, one processor per bus. */\nexport interface WorkletVoices {\n /** True once the processor has loaded into the context. */\n ready(): boolean;\n /** Settles once the processor has loaded, or has failed to. */\n loaded: Promise<void>;\n note(note: NoteOptions): Starter;\n noise(noise: NoiseOptions): Starter;\n dispose(): void;\n}\n\n/** What a voice's events are sent to, and the sources waiting on its `ended`. */\ninterface Bus {\n node: AudioWorkletNode;\n sources: Map<number, WorkletSource>;\n}\n\ntype WorkletSource = SourceLike & { end(): void };\n\n/** A booked voice as a source: `stop` posts the stop, and the processor's\n * `ended` is its `onended`, however early that comes. */\nfunction workletSource(post: (event: ToProcessor) => void, id: number): WorkletSource {\n let onended: SourceLike['onended'] = null;\n let ended = false;\n const fire = (): void => { (onended as (() => void) | null)?.(); };\n return {\n get onended() { return onended; },\n set onended(fn) {\n onended = fn;\n if (ended) queueMicrotask(fire);\n },\n stop(when?: number) { post({ kind: 'stop', id, at: when ?? 0 }); },\n disconnect() {},\n end() {\n if (ended) return;\n ended = true;\n fire();\n },\n };\n}\n\n/** The voice's level and pan, sent to the processor rather than set on a node. */\nfunction workletOut(ctx: BaseAudioContext, post: (event: ToProcessor) => void, id: number): VoiceOut {\n return {\n input: null,\n level(value, rampMs) {\n post({ kind: 'level', id, value, end: rampMs && rampMs > 0 ? ctx.currentTime + rampMs / 1000 : 0 });\n },\n pan(value) { post({ kind: 'pan', id, value }); },\n free() {},\n abandon() {},\n };\n}\n\nexport function createWorkletVoices(\n ctx: BaseAudioContext,\n busInput: (bus: string) => AudioNode,\n random: () => number,\n): WorkletVoices {\n let ready = false;\n const loaded = loadVoiceProcessor(ctx).then(\n () => { ready = true; },\n (err: unknown) => {\n console.warn(`@weasel-js/audio: the voice worklet did not load, so synth voices stay on nodes — ${String(err)}`);\n },\n );\n const buses = new Map<string, Bus>();\n\n const busFor = (name: string): Bus => {\n let bus = buses.get(name);\n if (!bus) {\n const node = new AudioWorkletNode(ctx, VOICE_PROCESSOR, {\n numberOfInputs: 0, numberOfOutputs: 1, outputChannelCount: [2],\n });\n const sources = new Map<number, WorkletSource>();\n node.port.onmessage = (e: MessageEvent<FromProcessor>) => {\n const source = sources.get(e.data.id);\n sources.delete(e.data.id);\n source?.end();\n };\n node.connect(busInput(name));\n bus = { node, sources };\n buses.set(name, bus);\n }\n return bus;\n };\n\n /** A starter that posts the voice when it is played and hands over its\n * source when the scheduler fires. */\n const starter = (\n event: (voice: LiveVoice, at: number, level: number, pan: number) => ToProcessor,\n ): Starter => {\n let source: WorkletSource | null = null;\n let post: (e: ToProcessor) => void = () => {};\n return {\n ready: () => true,\n book(voice, at): Booking {\n const bus = busFor(at.bus);\n post = (e) => { bus.node.port.postMessage(e); };\n post(event(voice, at.when / 1000, at.level, at.pan));\n source = workletSource(post, voice.id);\n bus.sources.set(voice.id, source);\n voice.retune = () => { post({ kind: 'retune', id: voice.id, rate: voice.rate, detune: voice.detune }); };\n return {\n out: workletOut(ctx, post, voice.id),\n cancel: () => { post({ kind: 'stop', id: voice.id, at: 0 }); },\n };\n },\n start(voice) {\n voice.release = () => { post({ kind: 'release', id: voice.id }); };\n return source!;\n },\n };\n };\n\n return {\n ready: () => ready,\n loaded,\n note(note) {\n resolveNote(note);\n const patch = {\n pitch: note.pitch, wave: note.wave, envelope: note.envelope, glide: note.glide,\n filter: note.filter, duration: note.duration,\n };\n return starter((voice, at, level, pan) => ({\n kind: 'note', id: voice.id, at, level, pan, rate: voice.rate, detune: voice.detune, patch,\n }));\n },\n noise(noise) {\n const patch = { noise: noise.noise, envelope: noise.envelope, filter: noise.filter, duration: noise.duration };\n return starter((voice, at, level, pan) => ({\n kind: 'noise', id: voice.id, at, level, pan, rate: voice.rate, detune: voice.detune, patch,\n // A random point in the loop, so two hits in a row are not the same hit.\n seed: random(),\n }));\n },\n dispose() {\n for (const bus of buses.values()) {\n bus.node.port.postMessage({ kind: 'dispose' } satisfies ToProcessor);\n bus.node.port.onmessage = null;\n bus.node.disconnect();\n }\n buses.clear();\n },\n };\n}\n","/** Runs in the worker. A message with `ms` books timer `id`; one without clears\n * it. Each timer posts its id back once, when it elapses. */\nconst WORKER_SOURCE = `const timers = new Map();\nself.onmessage = (e) => {\n const id = e.data.id;\n clearTimeout(timers.get(id));\n timers.delete(id);\n if (e.data.ms === undefined) return;\n timers.set(id, setTimeout(() => {\n timers.delete(id);\n self.postMessage(id);\n }, e.data.ms));\n};\n`;\n\n/** The timer pair `createTickTimer` returns, shaped for `SchedulerOptions`. */\nexport interface TickTimer {\n /** One-shot, as `createScheduler` expects. */\n setTimer(cb: () => void, ms: number): unknown;\n clearTimer(handle: unknown): void;\n /** Terminate the worker and drop every pending timer. */\n dispose(): void;\n}\n\ninterface Pending {\n cb: () => void;\n ms: number;\n fallback?: ReturnType<typeof setTimeout>;\n}\n\nfunction spawn(): { worker: Worker; url: string } | null {\n if (\n typeof Worker !== 'function' ||\n typeof Blob !== 'function' ||\n typeof URL === 'undefined' ||\n typeof URL.createObjectURL !== 'function'\n ) {\n return null;\n }\n let url: string | undefined;\n try {\n url = URL.createObjectURL(new Blob([WORKER_SOURCE], { type: 'text/javascript' }));\n return { worker: new Worker(url), url };\n } catch {\n if (url !== undefined) URL.revokeObjectURL(url);\n return null;\n }\n}\n\n/**\n * A timer for the scheduler's pass that is not held to the main thread's\n * hidden-tab clamp: each delay runs inside a dedicated Worker, which posts back\n * when it elapses. Falls back to `setTimeout` when no worker can be made — no\n * `Worker` global, a constructor that throws, or a worker that fails to load,\n * which is how a CSP refusal can arrive.\n */\nexport function createTickTimer(): TickTimer {\n let nextId = 1;\n const pending = new Map<number, Pending>();\n let spawned = spawn();\n\n const fire = (id: number): void => {\n const p = pending.get(id);\n if (!p) return;\n pending.delete(id);\n p.cb();\n };\n const arm = (id: number, p: Pending): void => {\n p.fallback = setTimeout(() => fire(id), p.ms);\n };\n const release = (): void => {\n if (!spawned) return;\n spawned.worker.terminate();\n URL.revokeObjectURL(spawned.url);\n spawned = null;\n };\n\n if (spawned) {\n spawned.worker.addEventListener('message', (e: MessageEvent) => fire(e.data as number));\n spawned.worker.addEventListener('error', () => {\n if (!spawned) return;\n release();\n // Anything posted to a worker that never loaded is lost with it.\n for (const [id, p] of pending) arm(id, p);\n });\n }\n\n return {\n setTimer(cb, ms) {\n const id = nextId++;\n const p: Pending = { cb, ms };\n pending.set(id, p);\n if (spawned) spawned.worker.postMessage({ id, ms });\n else arm(id, p);\n return id;\n },\n clearTimer(handle) {\n const id = handle as number;\n const p = pending.get(id);\n if (!p) return;\n pending.delete(id);\n if (p.fallback !== undefined) clearTimeout(p.fallback);\n else spawned?.worker.postMessage({ id });\n },\n dispose() {\n for (const p of pending.values()) {\n if (p.fallback !== undefined) clearTimeout(p.fallback);\n }\n pending.clear();\n release();\n },\n };\n}\n","import { writeParam } from './param';\n\n/** Where a voice's level and pan are applied, between its source and its bus. */\nexport interface VoiceOut {\n /** What a node voice's source connects into. Null for a voice whose samples\n * are made off the main thread, which has no node of its own. */\n readonly input: AudioNode | null;\n /** The level at once, or a linear ramp to it ending `rampMs` from now,\n * from wherever it is — `writeParam`'s semantics. */\n level(value: number, rampMs?: number): void;\n pan(value: number): void;\n /** Done with, and free to be reused. */\n free(): void;\n /** Off its bus and never reused: something half-built is still wired into it. */\n abandon(): void;\n}\n\n/** A gain and a stereo panner per voice, handed from voice to voice so a new\n * voice does not build two nodes. */\nexport interface ChainPool {\n take(bus: AudioNode, gain: number, pan: number): VoiceOut;\n clear(): void;\n}\n\ninterface Chain {\n gain: GainNode;\n panner: StereoPannerNode;\n}\n\nexport function createChainPool(ctx: BaseAudioContext, limit: number): ChainPool {\n // An idle chain is kept off its bus: still wired to the destination, it costs\n // the audio thread every render quantum whether or not anything sounds.\n const idle: Chain[] = [];\n const newChain = (): Chain => {\n const chain = { gain: ctx.createGain(), panner: ctx.createStereoPanner() };\n chain.panner.connect(chain.gain);\n return chain;\n };\n return {\n take(bus, gain, pan) {\n const chain = idle.pop() ?? newChain();\n const { gain: amp, panner } = chain;\n // Not a bare `.value`: a reused gain can still hold the last voice's fade.\n writeParam(ctx, amp.gain, gain);\n panner.pan.value = pan;\n amp.connect(bus);\n let held = true;\n return {\n input: panner,\n level: (value, rampMs) => writeParam(ctx, amp.gain, value, rampMs),\n pan: (value) => { panner.pan.value = value; },\n free() {\n if (!held) return;\n held = false;\n amp.disconnect();\n if (idle.length < limit) idle.push(chain);\n },\n abandon() {\n held = false;\n amp.disconnect();\n },\n };\n },\n clear() { idle.length = 0; },\n };\n}\n","import type { VoiceDropReason } from './types';\n\n/** Tell a voice's owner it never played. Queued, as a source's `onended` is:\n * a play dropped on the spot would otherwise call back before `play()` has\n * returned the handle. */\nexport const reportDrop = (\n onDrop: ((reason: VoiceDropReason) => void) | undefined,\n reason: VoiceDropReason,\n): void => {\n if (onDrop) queueMicrotask(() => onDrop(reason));\n};\n\n/** The console warnings for a dropped play, each given once per engine. */\nexport interface DropWarnings {\n locked(): void;\n disposed(): void;\n unknownSound(id: string): void;\n /** Let `locked` warn again, after the context suspended a second time. */\n rearmLocked(): void;\n}\n\nexport function createDropWarnings(): DropWarnings {\n let warnedLocked = false;\n let warnedDisposed = false;\n let warnedUnknownSound = false;\n return {\n locked() {\n if (warnedLocked) return;\n warnedLocked = true;\n console.warn(\n '@weasel-js/audio: play() before the AudioContext was unlocked — the voice was dropped. ' +\n 'Browsers require a user gesture; call engine.unlock() from one, or wait for the ' +\n 'automatic gesture listener.',\n );\n },\n disposed() {\n if (warnedDisposed) return;\n warnedDisposed = true;\n console.warn('@weasel-js/audio: play() after dispose() — the voice was dropped.');\n },\n unknownSound(id) {\n if (warnedUnknownSound) return;\n warnedUnknownSound = true;\n console.warn(\n `@weasel-js/audio: play() was handed sound \"${id}\", which this engine never loaded — ` +\n 'the voice was dropped. A handle belongs to the engine that produced it.',\n );\n },\n rearmLocked() { warnedLocked = false; },\n };\n}\n","/** Which voice a full pool evicts: the earliest started, or the lowest gain. */\nexport type StealPolicy = 'oldest' | 'quietest';\n\n/** Options for `createVoicePool`. */\nexport interface VoicePoolOptions {\n /** Maximum concurrent voices, at least 1. Beyond this, `acquire` steals. */\n limit: number;\n /** Default 'oldest'. */\n steal?: StealPolicy;\n}\n\n/** What the pool knows about a voice, for choosing one to steal. */\nexport interface VoiceRecord {\n /** Engine time the voice started, in ms. */\n startedAt: number;\n /** Current gain, consulted by the 'quietest' steal policy. */\n gain: number;\n}\n\n/** The result of `VoicePool.acquire`. */\nexport interface Acquisition {\n slot: number;\n /** Identifies this voice, not its slot: a stolen slot is reissued at once,\n * so `release` and `setGain` take the token and ignore a stale one. */\n token: number;\n /** Token of the voice evicted to make room, or null. The caller is\n * responsible for actually stopping that voice's nodes. */\n stolen: number | null;\n}\n\n/** Slot accounting for concurrent voices. See `createVoicePool`. */\nexport interface VoicePool {\n acquire(record: VoiceRecord): Acquisition;\n release(slot: number, token: number): void;\n setGain(slot: number, token: number, gain: number): void;\n active(): number;\n}\n\n/**\n * Slot bookkeeping for concurrent voices, with a steal policy for when the\n * limit is reached.\n *\n * This is pure accounting — it owns no audio nodes. The engine reuses its\n * `GainNode`/`StereoPannerNode` chains separately, and mints a fresh\n * `AudioBufferSourceNode` per play, because a source node is single-use by\n * specification and cannot be restarted once stopped.\n */\nexport function createVoicePool(opts: VoicePoolOptions): VoicePool {\n if (!(opts.limit >= 1)) {\n throw new RangeError(`@weasel-js/audio: voice pool limit must be at least 1, got ${opts.limit}`);\n }\n const steal = opts.steal ?? 'oldest';\n const live = new Map<number, VoiceRecord & { token: number }>();\n const free: number[] = [];\n let nextSlot = 0;\n let nextToken = 1;\n\n const victim = (): number => {\n let worst = -1;\n let worstScore = Infinity;\n for (const [slot, rec] of live) {\n const score = steal === 'quietest' ? rec.gain : rec.startedAt;\n if (score < worstScore) { worstScore = score; worst = slot; }\n }\n return worst;\n };\n\n return {\n acquire(record) {\n const token = nextToken++;\n if (live.size < opts.limit) {\n const slot = free.length > 0 ? free.pop()! : nextSlot++;\n live.set(slot, { ...record, token });\n return { slot, token, stolen: null };\n }\n const slot = victim();\n const stolen = live.get(slot)!.token;\n // Re-inserting moves the slot to the back of the iteration order, so\n // voices tied on score take turns being the victim.\n live.delete(slot);\n live.set(slot, { ...record, token });\n return { slot, token, stolen };\n },\n release(slot, token) {\n if (live.get(slot)?.token !== token) return;\n live.delete(slot);\n free.push(slot);\n },\n setGain(slot, token, gain) {\n const rec = live.get(slot);\n if (rec?.token === token) rec.gain = gain;\n },\n active: () => live.size,\n };\n}\n","/** A 2D world position, in the consumer's own units. */\nexport interface Vec2 { x: number; y: number }\n\n/** Distance and pan model for `spatialize`, in the same units as the\n * positions. */\nexport interface SpatialOptions {\n /** Distance within which gain stays at 1. Default 1. The inverse model needs\n * this above 0: at 0 it cliffs gain from 1 to 0 at any nonzero distance. */\n refDistance?: number;\n /** Distance at which linear rolloff reaches 0. Ignored by inverse. Default\n * 10000. At or below `refDistance` it gives the same 1-to-0 cliff, there. */\n maxDistance?: number;\n /** Default 'inverse' — the natural-sounding one. */\n rolloff?: 'inverse' | 'linear';\n /** How sharply gain falls. Default 1. */\n rolloffFactor?: number;\n /** Horizontal distance mapping to full left/right. Default 500. */\n panWidth?: number;\n}\n\n/**\n * Map a source position to a gain and a stereo pan, relative to the listener.\n *\n * Pure — no Web Audio, no state. This is the whole spatial model.\n */\nexport function spatialize(\n source: Vec2,\n listener: Vec2,\n opts: SpatialOptions = {},\n): { gain: number; pan: number } {\n const refDistance = opts.refDistance ?? 1;\n const maxDistance = opts.maxDistance ?? 10000;\n const rolloff = opts.rolloff ?? 'inverse';\n const rolloffFactor = opts.rolloffFactor ?? 1;\n const panWidth = opts.panWidth ?? 500;\n\n const dx = source.x - listener.x;\n const dy = source.y - listener.y;\n const distance = Math.hypot(dx, dy);\n\n let gain: number;\n if (distance <= refDistance) {\n gain = 1;\n } else if (rolloff === 'linear') {\n const span = maxDistance - refDistance;\n gain = span <= 0 ? 0 : 1 - rolloffFactor * ((distance - refDistance) / span);\n } else {\n gain = refDistance / (refDistance + rolloffFactor * (distance - refDistance));\n }\n gain = Math.min(1, Math.max(0, gain));\n\n const pan = panWidth <= 0 ? 0 : Math.min(1, Math.max(-1, dx / panWidth));\n\n return { gain, pan };\n}\n","import type { Scheduler } from './scheduler';\nimport { spatialize, type SpatialOptions, type Vec2 } from './spatialize';\nimport type { VoiceDropReason, VoiceHandle } from './types';\nimport type { ChainPool } from './voiceChains';\nimport { reportDrop, type DropWarnings } from './voiceDrops';\nimport type { LiveVoice, Slots, SourceLike, Starter, VoiceOptions } from './liveVoice';\n\n/** Every voice the engine has booked or is playing, whatever makes its node. */\nexport interface Voices {\n /**\n * Everything a voice does apart from making its node: the lock and dispose\n * checks, the output, the booking, the stale-backlog check, the slot and any\n * steal, and the handle.\n */\n launch(common: VoiceOptions, starter: Starter): VoiceHandle;\n stopAll(reason: VoiceDropReason): void;\n /** Stop every voice booked under `key`. */\n stopKey(key: string): void;\n /** Re-spatialize every voice with a position, after the listener moved. */\n respatialize(): void;\n}\n\nexport interface VoicesDeps {\n ctx: BaseAudioContext;\n scheduler: Pick<Scheduler, 'schedule'>;\n chains: ChainPool;\n busInput(bus: string): AudioNode;\n slotsFor(bus: string): Slots;\n defaultBus: string;\n warn: DropWarnings;\n staleFloor(): number;\n disposed(): boolean;\n listener(): { at: Vec2; opts: SpatialOptions };\n}\n\ninterface VoiceOps {\n teardown(voice: LiveVoice, reason?: VoiceDropReason): void;\n applySpatial(voice: LiveVoice): void;\n poolGain(voice: LiveVoice): void;\n}\n\nconst dropped = (id: number): VoiceHandle => ({\n id,\n stop: () => {}, release: () => {}, setGain: () => {}, setRate: () => {}, setDetune: () => {},\n setPan: () => {}, setPosition: () => {}, isPlaying: () => false,\n});\n\nfunction teardownVoice(voice: LiveVoice, reason: VoiceDropReason, live: Map<number, LiveVoice>): void {\n // First, and never at a call site: teardown is what makes a voice dead, and\n // a queued callback that outlives it must find it canceled. The steal path\n // has no other place to set this.\n voice.canceled = true;\n if (!voice.playing && voice.source === null) return;\n voice.playing = false;\n if (voice.source === null) {\n voice.unbook?.();\n reportDrop(voice.onDrop, reason);\n }\n voice.unbook = null;\n if (voice.source) {\n try { voice.source.stop(); } catch { /* already stopped */ }\n voice.source.disconnect();\n }\n voice.source = null;\n voice.retune = null;\n voice.release = null;\n voice.env?.disconnect();\n voice.env = null;\n voice.out?.free();\n voice.out = null;\n live.delete(voice.id);\n if (voice.slot !== null) {\n voice.slots.byToken.delete(voice.token);\n // Safe on the steal path too: the pool has already reissued this slot\n // under a new token, and it ignores a release carrying the old one.\n voice.slots.pool.release(voice.slot, voice.token);\n }\n}\n\n/** The scheduler's half of a voice: it came due at `scheduledWhen`. */\nfunction startVoice(\n voice: LiveVoice,\n starter: Starter,\n bookedAt: number,\n scheduledWhen: number,\n onDone: (() => void) | undefined,\n staleFloor: number,\n teardown: VoiceOps['teardown'],\n): void {\n // A source already: `catchUp` started it ahead of this pass.\n if (voice.canceled || voice.source !== null) return;\n // Came due while the context was suspended: starting it now would play\n // a backlog at once, which is what dropping a locked play avoids. A voice\n // played since the resume is no backlog, however early its `when`. Nor is a\n // booked voice: the audio thread holds it, and its clock stopped too.\n const booked = voice.unbook !== null;\n if (!booked && bookedAt < staleFloor && scheduledWhen < staleFloor) {\n teardown(voice, 'stale');\n return;\n }\n if (!starter.ready()) {\n teardown(voice, 'unready');\n return;\n }\n\n // The slot is taken here, not at booking time. A voice booked a bar out\n // would otherwise hold one while silent — and, its `startedAt` being in\n // the future, be the last thing the 'oldest' policy evicts, so booking\n // a bar of events would evict everything currently audible.\n const { slots } = voice;\n const acquired = slots.pool.acquire({\n startedAt: scheduledWhen,\n gain: voice.baseGain * voice.spatialGain,\n });\n voice.slot = acquired.slot;\n voice.token = acquired.token;\n slots.byToken.set(acquired.token, voice);\n if (acquired.stolen !== null) {\n const victim = slots.byToken.get(acquired.stolen);\n if (victim) teardown(victim);\n }\n\n let source: SourceLike;\n try {\n source = starter.start(voice, scheduledWhen);\n } catch (err) {\n // Not back to the idle chains: whatever the starter built before it threw is still wired into this one.\n voice.out?.abandon();\n voice.out = null;\n teardown(voice, 'failed');\n throw err;\n }\n voice.unbook = null;\n voice.catchUp = null;\n source.onended = () => { teardown(voice); onDone?.(); };\n voice.source = source;\n}\n\nfunction voiceHandle(ctx: BaseAudioContext, voice: LiveVoice, ops: VoiceOps): VoiceHandle {\n const { teardown, applySpatial, poolGain } = ops;\n return {\n id: voice.id,\n stop(fadeMs) {\n voice.catchUp?.();\n if (fadeMs && fadeMs > 0 && voice.source && voice.out && !voice.canceled) {\n // Canceled but not torn down: the fade is what ends this voice, and\n // stopping the source now would cut the ramp scheduled a line above\n // it — which is the click `fadeMs` exists to avoid. `onended` does\n // the bookkeeping when the fade reaches the end.\n voice.canceled = true;\n voice.fading = true;\n voice.out.level(0, fadeMs);\n try { voice.source.stop(ctx.currentTime + fadeMs / 1000); } catch { /* ended */ }\n return;\n }\n teardown(voice);\n },\n release() {\n if (voice.releasing) return;\n voice.catchUp?.();\n if (voice.release && voice.source && !voice.canceled) {\n // Like a fade: `onended` tears the voice down once the release is out.\n voice.releasing = true;\n voice.canceled = true;\n voice.release();\n return;\n }\n teardown(voice);\n },\n setGain(value, rampMs) {\n voice.baseGain = value;\n if (!voice.out || voice.fading) return;\n voice.rampEnd = rampMs && rampMs > 0 ? ctx.currentTime + rampMs / 1000 : 0;\n voice.out.level(value * voice.spatialGain, rampMs);\n poolGain(voice);\n },\n setRate(value) {\n voice.rate = value;\n voice.retune?.();\n },\n setDetune(cents) {\n voice.detune = cents;\n voice.retune?.();\n },\n setPan(value) {\n voice.position = undefined;\n voice.out?.pan(value);\n },\n setPosition(p) {\n voice.position = p;\n applySpatial(voice);\n },\n isPlaying: () => voice.playing,\n };\n}\n\nexport function createVoices(deps: VoicesDeps): Voices {\n const { ctx, chains, warn } = deps;\n const live = new Map<number, LiveVoice>();\n let nextVoiceId = 1;\n\n const spatialOf = (p: Vec2) => {\n const l = deps.listener();\n return spatialize(p, l.at, l.opts);\n };\n\n const poolGain = (voice: LiveVoice): void => {\n if (voice.slot === null) return;\n voice.slots.pool.setGain(voice.slot, voice.token, voice.baseGain * voice.spatialGain);\n };\n\n const applySpatial = (voice: LiveVoice): void => {\n if (!voice.position || !voice.out) return;\n const s = spatialOf(voice.position);\n voice.spatialGain = s.gain;\n voice.out.pan(s.pan);\n if (!voice.fading) {\n // A level write cancels what is scheduled, so a ramp still running is rescheduled to the same end.\n const left = (voice.rampEnd - ctx.currentTime) * 1000;\n voice.out.level(voice.baseGain * s.gain, left > 0 ? left : undefined);\n }\n poolGain(voice);\n };\n\n const teardown = (voice: LiveVoice, reason: VoiceDropReason = 'stopped'): void => {\n teardownVoice(voice, reason, live);\n };\n const ops: VoiceOps = { teardown, applySpatial, poolGain };\n\n return {\n launch(common, starter) {\n const id = nextVoiceId++;\n\n if (deps.disposed()) {\n warn.disposed();\n reportDrop(common.onDrop, 'disposed');\n return dropped(id);\n }\n if (ctx.state !== 'running') {\n warn.locked();\n reportDrop(common.onDrop, 'locked');\n return dropped(id);\n }\n\n const busName = common.bus ?? deps.defaultBus;\n const slots = deps.slotsFor(busName);\n const bookedAt = ctx.currentTime * 1000;\n const when = common.when ?? bookedAt;\n const baseGain = common.gain ?? 1;\n const spatial = common.position ? spatialOf(common.position) : { gain: 1, pan: common.pan ?? 0 };\n const level = baseGain * spatial.gain;\n\n const voice: LiveVoice = {\n id, slots, slot: null, token: 0, key: common.cancelKey, onDrop: common.onDrop,\n source: null, env: null, retune: null, release: null, releasing: false,\n out: null, unbook: null, catchUp: null,\n baseGain, spatialGain: spatial.gain,\n rate: common.rate ?? 1, detune: common.detune ?? 0,\n position: common.position,\n playing: true, canceled: false, fading: false, rampEnd: 0,\n };\n if (starter.book) {\n const booking = starter.book(voice, { bus: busName, when, level, pan: spatial.pan });\n voice.out = booking.out;\n voice.unbook = booking.cancel;\n } else {\n voice.out = chains.take(deps.busInput(busName), level, spatial.pan);\n }\n live.set(id, voice);\n const begin = (): void => {\n startVoice(voice, starter, bookedAt, when, common.onDone, deps.staleFloor(), teardown);\n };\n if (starter.book) {\n voice.catchUp = () => { if (ctx.currentTime * 1000 >= when) begin(); };\n }\n // A booked voice already sounds at its time, however late this runs.\n deps.scheduler.schedule(when, begin, common.cancelKey, { reportLate: !starter.book });\n return voiceHandle(ctx, voice, ops);\n },\n stopAll(reason) {\n for (const voice of [...live.values()]) teardown(voice, reason);\n },\n stopKey(key) {\n for (const voice of [...live.values()]) {\n if (voice.key !== key) continue;\n voice.catchUp?.();\n teardown(voice);\n }\n },\n respatialize() {\n for (const voice of live.values()) applySpatial(voice);\n },\n };\n}\n","import { createAnalyserTap, type AnalyserTap, type AnalyserTapOptions } from './analyser';\nimport { defaultTimers, type Timers } from './audioTime';\nimport { createBusGraph, type BusHandle } from './buses';\nimport type { Slots, Starter } from './liveVoice';\nimport { createResumeWatch } from './resumeWatch';\nimport { createScheduler } from './scheduler';\nimport { createSoundCache, type SoundCache, type SoundHandle } from './soundCache';\nimport type { SpatialOptions, Vec2 } from './spatialize';\nimport { createStreamStarters } from './streamStarter';\nimport { createSynthStarters } from './synthStarters';\nimport { createWorkletVoices } from './worklet/workletVoices';\nimport { createTickTimer } from './tickTimer';\nimport type {\n AudioEngineOptions, NoiseOptions, NoteOptions, PlayOptions, StreamOptions, VoiceHandle,\n} from './types';\nimport { createChainPool } from './voiceChains';\nimport { createDropWarnings, type DropWarnings } from './voiceDrops';\nimport { createVoicePool } from './voicePool';\nimport { createVoices } from './voices';\n\n/** A sound engine: named mix buses, a per-bus voice pool, lookahead\n * scheduling and 2D spatialization over one `AudioContext`. Times are engine\n * ms (`now()`). */\nexport interface AudioEngine {\n /** The engine's `AudioContext` — the one passed as `options.context`, or the\n * one the engine created. Use it for `createBuffer`, for analysis, or for a\n * node graph of your own alongside the engine's.\n *\n * `dispose()` closes a context the engine created, and every call on a\n * closed context throws; a context you passed in is left open, because it is\n * yours to close. The reference stays valid either way — read `state()`\n * rather than assuming. */\n readonly context: AudioContext;\n state(): AudioContextState;\n unlock(): Promise<void>;\n /** Engine time in ms. */\n now(): number;\n load(url: string): Promise<SoundHandle>;\n loadAll(urls: Record<string, string>): Promise<Record<string, SoundHandle>>;\n decode(bytes: ArrayBuffer): Promise<SoundHandle>;\n /** Play a buffer the consumer already holds — a synth, an offline render, a\n * recording. `load` and `decode` both assume encoded bytes. */\n register(buffer: AudioBuffer): SoundHandle;\n play(sound: SoundHandle, opts?: PlayOptions): VoiceHandle;\n /** Play a synthesized note: an oscillator with harmonic partials, or summed\n * sines at any ratios, under an ADSR envelope and an optional filter. It is a voice like any other — same handle, same bus pool\n * and stealing, same `cancelKey`. */\n playNote(note: NoteOptions): VoiceHandle;\n /** Play noise — white, pink or brown, from a looping buffer made once per\n * context — under an envelope and an optional filter with its own cutoff\n * envelope. A voice like `playNote`'s in every other respect. */\n playNoise(noise: NoiseOptions): VoiceHandle;\n /** Stream long audio — music, ambience — from a media element or a URL\n * through a `MediaElementAudioSourceNode`, instead of decoding it whole. It\n * is a voice on a bus like any other, with the exceptions `StreamOptions`\n * lists. An element has one playhead, so streaming one that is already\n * streaming stops the earlier voice. */\n stream(media: HTMLMediaElement | string, opts?: StreamOptions): VoiceHandle;\n /** Book a callback against the audio clock through the engine's lookahead\n * scheduler; it receives its own `when` to hand on to `play` or `playNote`.\n * `stopKey(key)` cancels it. One that came due during a suspension fires\n * late on resume, with its original `when`, so compare against `now()`. */\n schedule(when: number, fire: (when: number) => void, key?: string): void;\n stopKey(key: string): void;\n stopAll(): void;\n bus(name: string): BusHandle;\n /** The configured bus names, in order. The first is `play()`'s default. */\n busNames(): string[];\n /** Voices currently sounding, on one bus or on all of them. A voice booked\n * for a future `when` is not counted until it starts. */\n activeVoices(bus?: string): number;\n analyser(busName?: string, opts?: AnalyserTapOptions): AnalyserTap;\n setListener(p: Vec2, opts?: SpatialOptions): void;\n dispose(): void;\n}\n\n/** How `play` makes its node: a fresh buffer source per voice. */\nfunction bufferStarter(\n ctx: BaseAudioContext, sounds: SoundCache, warn: DropWarnings, sound: SoundHandle, loop: boolean,\n): Starter {\n return {\n ready() {\n if (sounds.buffer(sound)) return true;\n warn.unknownSound(sound.id);\n return false;\n },\n start(voice, when) {\n // A fresh source per play: AudioBufferSourceNode is single-use by\n // specification and cannot be restarted once stopped.\n const source = ctx.createBufferSource();\n source.buffer = sounds.buffer(sound)!;\n source.loop = loop;\n voice.retune = () => {\n source.playbackRate.value = voice.rate;\n source.detune.value = voice.detune;\n };\n voice.retune();\n // Still live when this runs, so the voice still holds its chain.\n source.connect(voice.out!.input!);\n source.start(when / 1000);\n return source;\n },\n };\n}\n\n/** One voice pool per bus, not one global pool: the limit is per bus, and a\n * shared pool lets a burst of one-shots on `sfx` steal the music bed. */\nfunction busSlots(busNames: string[], opts: AudioEngineOptions) {\n const slotsByBus = new Map<string, Slots>();\n for (const name of busNames) {\n slotsByBus.set(name, {\n pool: createVoicePool({ limit: opts.voiceLimit ?? 32, steal: opts.steal }),\n byToken: new Map(),\n });\n }\n const slotsFor = (bus: string): Slots => {\n const s = slotsByBus.get(bus);\n if (!s) throw new Error(`@weasel-js/audio: unknown bus \"${bus}\"`);\n return s;\n };\n const active = (bus?: string): number => {\n if (bus !== undefined) return slotsFor(bus).pool.active();\n let total = 0;\n for (const s of slotsByBus.values()) total += s.pool.active();\n return total;\n };\n return { slotsFor, active };\n}\n\n/** How synth voices are made: in the voice worklet once it has loaded, when\n * `synthVoices` asks for it, and on nodes otherwise. */\nfunction engineSynth(ctx: BaseAudioContext, opts: AudioEngineOptions, busInput: (bus: string) => AudioNode) {\n const random = opts.random ?? Math.random;\n const nodes = createSynthStarters(ctx, random);\n const worklet = opts.synthVoices === 'worklet' ? createWorkletVoices(ctx, busInput, random) : null;\n const pick = () => (worklet?.ready() ? worklet : nodes);\n return {\n note: (note: NoteOptions) => pick().note(note),\n noise: (noise: NoiseOptions) => pick().noise(noise),\n loaded: worklet?.loaded,\n dispose: () => worklet?.dispose(),\n };\n}\n\n/** The timer that wakes the scheduler, and the scheduler. */\nfunction engineClock(ctx: BaseAudioContext, opts: AudioEngineOptions) {\n const now = (): number => ctx.currentTime * 1000;\n const tickTimer = opts.setTimer === undefined && opts.clearTimer === undefined\n ? createTickTimer()\n : null;\n const timers: Timers = {\n setTimer: tickTimer?.setTimer ?? opts.setTimer ?? defaultTimers.setTimer,\n clearTimer: tickTimer?.clearTimer ?? opts.clearTimer ?? defaultTimers.clearTimer,\n };\n const scheduler = createScheduler({\n now,\n // One-shot, not repeating: the scheduler re-arms at the end of every pass,\n // so an interval would leave the previous one running and double the live\n // timer count per tick.\n setTimer: timers.setTimer,\n clearTimer: timers.clearTimer,\n lookahead: opts.lookahead,\n interval: opts.tickInterval, onLate: opts.onLate,\n });\n scheduler.start();\n return { now, tickTimer, timers, scheduler };\n}\n\n/**\n * Create an engine. Browsers start the context suspended: `play()` before it\n * is unlocked drops the voice with a warning. The engine resumes it on the\n * first pointer, key or touch gesture, or call `unlock()` from one. Call\n * `dispose()` when done.\n */\nexport function createAudioEngine(opts: AudioEngineOptions = {}): AudioEngine {\n const ctx = opts.context ?? new AudioContext();\n // A context the engine made is a context the engine closes; a consumer's is\n // theirs to keep.\n const ownsContext = opts.context === undefined;\n const busNames = opts.buses ?? ['sfx', 'music', 'ui'];\n if (busNames.length === 0) {\n throw new Error('@weasel-js/audio: an engine needs at least one bus');\n }\n const sounds = createSoundCache(ctx, opts.fetchFn);\n const { slotsFor, active } = busSlots(busNames, opts);\n const { now, tickTimer, timers, scheduler } = engineClock(ctx, opts);\n const graph = createBusGraph(ctx, busNames, { ...timers, fadeMs: opts.insertFadeMs });\n\n let listener: Vec2 = { x: 0, y: 0 };\n let spatialOpts: SpatialOptions = {};\n let disposed = false;\n const taps = new Set<AnalyserTap>();\n const chains = createChainPool(ctx, (opts.voiceLimit ?? 32) * busNames.length);\n const warn = createDropWarnings();\n const watch = createResumeWatch(ctx, {\n now,\n unlock: () => engine.unlock(),\n onSuspend: () => warn.rearmLocked(),\n });\n const voices = createVoices({\n ctx, scheduler, chains, slotsFor, warn,\n busInput: graph.input,\n defaultBus: busNames[0],\n staleFloor: watch.staleFloor,\n disposed: () => disposed,\n listener: () => ({ at: listener, opts: spatialOpts }),\n });\n const synth = engineSynth(ctx, opts, graph.input);\n const streams = createStreamStarters(ctx, timers);\n\n const engine: AudioEngine = {\n context: ctx,\n state: () => ctx.state,\n async unlock() {\n if (disposed) return;\n if (ctx.state !== 'running') await ctx.resume();\n await synth.loaded;\n },\n now,\n load: sounds.load,\n loadAll: sounds.loadAll,\n decode: sounds.decode,\n register: sounds.register,\n play: (sound, playOpts = {}) =>\n voices.launch(playOpts, bufferStarter(ctx, sounds, warn, sound, playOpts.loop ?? false)),\n playNote: (note) => voices.launch(note, synth.note(note)),\n playNoise: (noise) => voices.launch(noise, synth.noise(noise)),\n stream(media, streamOpts = {}) {\n const el = streams.element(media, streamOpts);\n streams.streaming.get(el)?.stop();\n const handle = voices.launch(streamOpts, streams.starter(el, streamOpts));\n streams.streaming.set(el, handle);\n return handle;\n },\n schedule(when, fire, key) {\n if (disposed) return;\n scheduler.schedule(when, fire, key);\n },\n stopKey(key) {\n scheduler.cancelKey(key);\n voices.stopKey(key);\n },\n stopAll: () => voices.stopAll('stopped'),\n bus: graph.bus,\n busNames: graph.names,\n activeVoices: active,\n analyser(busName, tapOpts) {\n // Every tap is one more live FFT on the graph. They are tracked so\n // `dispose()` detaches them; a consumer calling this per frame still\n // wants to keep one tap rather than mint one.\n const tap = createAnalyserTap(ctx, busName ? graph.node(busName) : graph.master, tapOpts);\n taps.add(tap);\n return {\n ...tap,\n dispose() {\n taps.delete(tap);\n tap.dispose();\n },\n };\n },\n setListener(p, o) {\n listener = p;\n if (o) spatialOpts = o;\n voices.respatialize();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n voices.stopAll('disposed');\n chains.clear();\n scheduler.stop();\n scheduler.clear();\n tickTimer?.dispose();\n for (const tap of [...taps]) tap.dispose();\n taps.clear();\n watch.dispose();\n synth.dispose();\n graph.dispose();\n graph.master.disconnect();\n if (ownsContext) void ctx.close().catch(() => undefined);\n },\n };\n\n return engine;\n}\n","import type { InsertEffect } from './inserts';\nimport { writeParam } from './param';\n\n// Built-in insert effects. Each exposes its Web Audio nodes for anything its\n// options do not cover; times are ms, as everywhere else in the package.\n\n/** Options for `createFilterEffect`. Unset ones keep the node's defaults. */\nexport interface FilterEffectOptions {\n /** Default 'lowpass'. */\n type?: BiquadFilterType;\n /** Hz. Default 350, the node's own. */\n frequency?: number;\n Q?: number;\n /** dB, for the shelf and peaking types. */\n gain?: number;\n}\n\n/** A filter insert, with its `BiquadFilterNode` exposed. */\nexport interface FilterEffect extends InsertEffect {\n readonly filter: BiquadFilterNode;\n}\n\n/** A `BiquadFilterNode`. Write its params through `filter` to sweep it. */\nexport function createFilterEffect(ctx: BaseAudioContext, opts: FilterEffectOptions = {}): FilterEffect {\n const filter = ctx.createBiquadFilter();\n filter.type = opts.type ?? 'lowpass';\n if (opts.frequency !== undefined) writeParam(ctx, filter.frequency, opts.frequency);\n if (opts.Q !== undefined) writeParam(ctx, filter.Q, opts.Q);\n if (opts.gain !== undefined) writeParam(ctx, filter.gain, opts.gain);\n return { input: filter, output: filter, filter };\n}\n\n/** A wet/dry mix around an effect, for the effects whose output replaces\n * rather than colors the signal. */\nexport interface WetDryMix {\n /** 0 is all dry, 1 all wet. */\n mix(): number;\n setMix(mix: number, rampMs?: number): void;\n}\n\nconst checkMix = (mix: number): number => {\n if (!(mix >= 0 && mix <= 1)) throw new RangeError(`@weasel-js/audio: mix ${mix} is outside 0..1`);\n return mix;\n};\n\n/** `input → dry → output` beside `input → wetIn … wetOut → wet → output`.\n * The dry route is wired first. */\nfunction wetDry(\n ctx: BaseAudioContext,\n wetIn: AudioNode,\n wetOut: AudioNode,\n initial: number,\n): WetDryMix & { input: GainNode; output: GainNode } {\n const input = ctx.createGain();\n const output = ctx.createGain();\n const dry = ctx.createGain();\n const wet = ctx.createGain();\n input.connect(dry);\n dry.connect(output);\n input.connect(wetIn);\n wetOut.connect(wet);\n wet.connect(output);\n let mix = checkMix(initial);\n const write = (rampMs?: number): void => {\n writeParam(ctx, dry.gain, 1 - mix, rampMs);\n writeParam(ctx, wet.gain, mix, rampMs);\n };\n write();\n return {\n input, output,\n mix: () => mix,\n setMix(value, rampMs) {\n mix = checkMix(value);\n write(rampMs);\n },\n };\n}\n\n/** Options for `createReverbEffect`. */\nexport interface ReverbEffectOptions {\n /** The room: an impulse response, loaded or synthesized like any buffer. */\n impulse: AudioBuffer;\n /** Default 0.3. */\n mix?: number;\n /** Scale the impulse to a consistent level. Default true, the node's own. */\n normalize?: boolean;\n}\n\n/** A reverb insert, with its `ConvolverNode` exposed. */\nexport interface ReverbEffect extends InsertEffect, WetDryMix {\n readonly convolver: ConvolverNode;\n}\n\n/** Convolution reverb from an impulse buffer, with a wet/dry mix. */\nexport function createReverbEffect(ctx: BaseAudioContext, opts: ReverbEffectOptions): ReverbEffect {\n const convolver = ctx.createConvolver();\n // Before the buffer: the node reads `normalize` when the buffer is set.\n convolver.normalize = opts.normalize ?? true;\n convolver.buffer = opts.impulse;\n const m = wetDry(ctx, convolver, convolver, opts.mix ?? 0.3);\n return { input: m.input, output: m.output, convolver, mix: m.mix, setMix: m.setMix };\n}\n\n/** Options for `createDelayEffect`. */\nexport interface DelayEffectOptions {\n /** ms. Default 250. */\n time?: number;\n /** How much of each repeat feeds the next, -1..1 exclusive. Default 0.35. */\n feedback?: number;\n /** Default 0.35. */\n mix?: number;\n /** The longest `time` the line can be set to later, ms. Default the larger\n * of 1000 and `time`. */\n maxTime?: number;\n}\n\n/** A feedback delay insert, with its `DelayNode` exposed. Ramps are ms. */\nexport interface DelayEffect extends InsertEffect, WetDryMix {\n readonly delay: DelayNode;\n setTime(ms: number, rampMs?: number): void;\n feedback(): number;\n setFeedback(value: number, rampMs?: number): void;\n /** Break the feedback loop. Called for you when the slot is removed. */\n dispose(): void;\n}\n\nconst checkFeedback = (value: number): number => {\n if (!(value > -1 && value < 1)) {\n throw new RangeError(`@weasel-js/audio: feedback ${value} must be inside -1..1, or the repeats grow`);\n }\n return value;\n};\n\n/** A feedback delay with a wet/dry mix. Ramping `setTime` bends the pitch of\n * the repeats while it moves, as a tape delay does. */\nexport function createDelayEffect(ctx: BaseAudioContext, opts: DelayEffectOptions = {}): DelayEffect {\n const time = opts.time ?? 250;\n const maxTime = opts.maxTime ?? Math.max(1000, time);\n let fb = checkFeedback(opts.feedback ?? 0.35);\n const delay = ctx.createDelay(maxTime / 1000);\n const loop = ctx.createGain();\n const m = wetDry(ctx, delay, delay, opts.mix ?? 0.35);\n delay.connect(loop);\n loop.connect(delay);\n writeParam(ctx, delay.delayTime, time / 1000);\n writeParam(ctx, loop.gain, fb);\n return {\n input: m.input, output: m.output, delay, mix: m.mix, setMix: m.setMix,\n setTime(ms, rampMs) {\n if (!(ms >= 0 && ms <= maxTime)) {\n throw new RangeError(`@weasel-js/audio: delay time ${ms} is outside 0..${maxTime} ms`);\n }\n writeParam(ctx, delay.delayTime, ms / 1000, rampMs);\n },\n feedback: () => fb,\n setFeedback(value, rampMs) {\n fb = checkFeedback(value);\n writeParam(ctx, loop.gain, fb, rampMs);\n },\n dispose() {\n delay.disconnect();\n loop.disconnect();\n },\n };\n}\n\n/** Options for `createCompressorEffect`. Unset ones keep the node's defaults. */\nexport interface CompressorEffectOptions {\n /** dB. */\n threshold?: number;\n /** dB. */\n knee?: number;\n ratio?: number;\n /** ms. */\n attack?: number;\n /** ms. */\n release?: number;\n /** Linear gain after the compressor, to win back the level it takes. Default 1. */\n makeup?: number;\n}\n\n/** A compressor insert, with its `DynamicsCompressorNode` and makeup `GainNode` exposed. */\nexport interface CompressorEffect extends InsertEffect {\n readonly compressor: DynamicsCompressorNode;\n readonly makeup: GainNode;\n}\n\n/** A `DynamicsCompressorNode` into a makeup gain. Unset options keep the\n * node's defaults. */\nexport function createCompressorEffect(\n ctx: BaseAudioContext,\n opts: CompressorEffectOptions = {},\n): CompressorEffect {\n const compressor = ctx.createDynamicsCompressor();\n const makeup = ctx.createGain();\n compressor.connect(makeup);\n const set = (param: AudioParam, value: number | undefined): void => {\n if (value !== undefined) writeParam(ctx, param, value);\n };\n set(compressor.threshold, opts.threshold);\n set(compressor.knee, opts.knee);\n set(compressor.ratio, opts.ratio);\n set(compressor.attack, opts.attack === undefined ? undefined : opts.attack / 1000);\n set(compressor.release, opts.release === undefined ? undefined : opts.release / 1000);\n set(makeup.gain, opts.makeup ?? 1);\n return { input: compressor, output: makeup, compressor, makeup };\n}\n","import type { AudioEngine } from './createAudioEngine';\nimport type { SoundHandle } from './soundCache';\nimport type { NoiseOptions, NoteOptions, PlayOptions, VoiceHandle } from './types';\n\n/** A synth note on a step. `length` is its gate in steps, default 1.\n *\n * Any event's `step` may be fractional: it is booked with the step it sits in\n * and sounds that fraction of a step later, so `2.5` is halfway from step 2 to\n * step 3. That is swing, a flam, or a hit that drags. */\nexport interface PatternNote extends Omit<NoteOptions, 'when' | 'duration'> {\n step: number;\n length?: number;\n}\n\n/** Noise on a step: a hi-hat, a snare's rattle. `length` is its gate in steps,\n * default 1. */\nexport interface PatternNoise extends Omit<NoiseOptions, 'when' | 'duration'> {\n step: number;\n length?: number;\n}\n\n/** A buffer played on a step: a drum hit, a sample. */\nexport interface PatternHit extends Omit<PlayOptions, 'when'> {\n step: number;\n sound: SoundHandle;\n}\n\n/** Anything a pattern plays on a step. */\nexport type PatternEvent = PatternNote | PatternNoise | PatternHit;\n\n/** Options for `createPatternPlayer`. */\nexport interface PatternPlayerOptions {\n /** Beats per minute. */\n tempo: number;\n /** Steps per beat. Default 4, so a step is a sixteenth note in 4/4. */\n stepsPerBeat?: number;\n events?: readonly PatternEvent[];\n /** Steps in one pass. Default: through the last event, rounded up to a whole\n * beat. */\n length?: number;\n /** Default true. */\n loop?: boolean;\n /** Cents added to every event's own `detune`: a number, or a function of\n * the event's `step`, for a pattern that drifts in pitch as it plays. A\n * function is asked as each event is booked. Default 0. */\n detune?: PatternDetune;\n /** Called as each step is booked — up to a lookahead ahead of it sounding —\n * with its index in the pattern and its engine time in ms. */\n onStep?: (step: number, when: number) => void;\n}\n\n/** See `PatternPlayerOptions.detune`. */\nexport type PatternDetune = number | ((step: number) => number);\n\n/** A running sequence of steps. See `createPatternPlayer`. */\nexport interface PatternPlayer {\n /** Start from step 0 at engine time `when`, default now. No-op while playing. */\n start(when?: number): void;\n /** Book nothing further, and release every voice the player started. */\n stop(): void;\n playing(): boolean;\n tempo(): number;\n /** Takes effect from the next step not yet booked. Called from `onStep`,\n * that is the step after the one reported, which keeps its own length. */\n setTempo(bpm: number): void;\n /** Takes effect from the next step not yet booked. */\n setDetune(detune: PatternDetune): void;\n /** Takes effect from the next step not yet booked. */\n setEvents(events: readonly PatternEvent[], length?: number): void;\n}\n\nlet nextPlayer = 1;\n\n/** Steps in one pass of `events` when no length is given: through the last\n * event, rounded up to a whole beat. */\nexport function patternLength(events: readonly PatternEvent[], stepsPerBeat = 4): number {\n let last = -1;\n for (const e of events) last = Math.max(last, Math.floor(e.step));\n return Math.max(1, Math.ceil((last + 1) / stepsPerBeat)) * stepsPerBeat;\n}\n\nconst checkTempo = (bpm: number): void => {\n if (!(bpm > 0) || !Number.isFinite(bpm)) {\n throw new RangeError(`@weasel-js/audio: tempo must be a positive number of bpm, got ${bpm}`);\n }\n};\n\n/**\n * A step sequencer over `engine`. Each step is one `engine.schedule` booking;\n * when it fires, it books that step's events at the step's exact time and then\n * books the step after it. So nothing is booked further ahead than the\n * scheduler's lookahead, which is what lets a tempo change or new events land\n * on the very next step.\n *\n * A step that fires more than a step late — a stalled timer, a suspended\n * context — skips to the next step still ahead of the clock, keeping phase,\n * rather than playing the missed ones at once.\n */\nexport function createPatternPlayer(engine: AudioEngine, opts: PatternPlayerOptions): PatternPlayer {\n checkTempo(opts.tempo);\n const stepsPerBeat = opts.stepsPerBeat ?? 4;\n const loop = opts.loop ?? true;\n const key = `\\u0000pattern:${nextPlayer++}`;\n\n let bpm = opts.tempo;\n let drift = opts.detune ?? 0;\n let length = 1;\n let byStep = new Map<number, PatternEvent[]>();\n const setEvents = (events: readonly PatternEvent[], len?: number): void => {\n byStep = new Map();\n for (const e of events) {\n const step = Math.floor(e.step);\n const list = byStep.get(step);\n if (list) list.push(e);\n else byStep.set(step, [e]);\n }\n length = len ?? patternLength(events, stepsPerBeat);\n };\n setEvents(opts.events ?? [], opts.length);\n\n let running = false;\n let inStep = false;\n /** Steps booked since `start`, not wrapped. */\n let count = 0;\n let lastAt: number | null = null;\n let nextAt = 0;\n const voices = new Set<VoiceHandle>();\n\n const stepMs = (): number => 60_000 / bpm / stepsPerBeat;\n\n const book = (): void => { engine.schedule(nextAt, fire, key); };\n\n const fire = (scheduled: number): void => {\n if (!running) return;\n let when = scheduled;\n const behind = engine.now() - when;\n if (behind > stepMs()) {\n const skip = Math.ceil(behind / stepMs());\n count += skip;\n when += skip * stepMs();\n }\n if (!loop && count >= length) {\n running = false;\n return;\n }\n const step = count % length;\n for (const v of voices) if (!v.isPlaying()) voices.delete(v);\n for (const e of byStep.get(step) ?? []) {\n const at = when + (e.step - step) * stepMs();\n const detune = (e.detune ?? 0) + (typeof drift === 'function' ? drift(e.step) : drift);\n if ('sound' in e) {\n const { step: _s, sound, ...play } = e;\n voices.add(engine.play(sound, { ...play, detune, when: at }));\n } else if ('noise' in e) {\n const { step: _s, length: steps = 1, ...noise } = e;\n voices.add(engine.playNoise({ ...noise, detune, when: at, duration: steps * stepMs() }));\n } else {\n const { step: _s, length: steps = 1, ...note } = e;\n voices.add(engine.playNote({ ...note, detune, when: at, duration: steps * stepMs() }));\n }\n }\n // Read before `onStep`: a tempo set there starts with the next step, and\n // this one keeps the length its events were gated by.\n const ms = stepMs();\n inStep = true;\n try {\n opts.onStep?.(step, when);\n } finally {\n inStep = false;\n }\n if (!running) return;\n count += 1;\n lastAt = when;\n nextAt = when + ms;\n book();\n };\n\n return {\n start(when) {\n if (running) return;\n running = true;\n count = 0;\n lastAt = null;\n nextAt = when ?? engine.now();\n book();\n },\n stop() {\n if (!running) return;\n running = false;\n engine.stopKey(key);\n for (const v of voices) v.release();\n voices.clear();\n },\n playing: () => running,\n tempo: () => bpm,\n setTempo(next) {\n checkTempo(next);\n bpm = next;\n // From inside `onStep` the step after this one is about to be booked.\n if (!running || lastAt === null || inStep) return;\n engine.stopKey(key);\n nextAt = Math.max(lastAt + stepMs(), engine.now());\n book();\n },\n setDetune(next) { drift = next; },\n setEvents,\n };\n}\n","import { resolveEnvelope } from './envelope';\nimport { patternLength, type PatternEvent, type PatternHit } from './patternPlayer';\n\n/** Options for `patternVoicePeaks`. The first four mean what they mean to\n * `createPatternPlayer`, and should be the values the player is given. */\nexport interface PatternLoadOptions {\n tempo: number;\n stepsPerBeat?: number;\n length?: number;\n loop?: boolean;\n /** The bus of an event that names none: the engine's first. Default 'sfx'. */\n bus?: string;\n /** The engine's `lookahead` in ms. Default 100. */\n lookahead?: number;\n /** How long a buffer hit sounds, in ms. Default: one step. */\n hitMs?: (hit: PatternHit) => number;\n}\n\n/**\n * The most voices a pattern holds at once on each bus, to set against the\n * engine's `voiceLimit` before the pattern plays: past the limit, each new\n * event steals a voice that is still ringing.\n *\n * A note or a noise holds its voice through its gate and its envelope's\n * release. With `loop`, what rings past the end of a pass is counted against\n * the start of the next.\n */\nexport function patternVoicePeaks(\n events: readonly PatternEvent[],\n opts: PatternLoadOptions,\n): Record<string, number> {\n const stepsPerBeat = opts.stepsPerBeat ?? 4;\n const stepMs = 60_000 / opts.tempo / stepsPerBeat;\n const passMs = (opts.length ?? patternLength(events, stepsPerBeat)) * stepMs;\n // The engine takes a voice's slot when its booking fires, which is up to a\n // lookahead before the voice sounds.\n const lead = opts.lookahead ?? 100;\n\n const spans = events.map((e) => {\n const sounds = 'sound' in e\n ? (opts.hitMs?.(e) ?? stepMs)\n : (e.length ?? 1) * stepMs + resolveEnvelope(e.envelope).release;\n const at = e.step * stepMs;\n return { bus: e.bus ?? opts.bus ?? 'sfx', from: at - lead, until: at + sounds };\n });\n // Enough passes that the last one meets every tail still ringing into it.\n const longest = Math.max(0, ...spans.map((s) => s.until - s.from));\n const passes = opts.loop === false ? 0 : Math.ceil(longest / passMs);\n\n const edges = new Map<string, { at: number; by: number }[]>();\n for (const span of spans) {\n const list = edges.get(span.bus) ?? [];\n edges.set(span.bus, list);\n for (let pass = 0; pass <= passes; pass++) {\n list.push({ at: span.from + pass * passMs, by: 1 }, { at: span.until + pass * passMs, by: -1 });\n }\n }\n\n const peaks: Record<string, number> = {};\n for (const [bus, list] of edges) {\n // A voice ending as another starts has freed its slot.\n list.sort((a, b) => a.at - b.at || a.by - b.by);\n let held = 0;\n let peak = 0;\n for (const edge of list) {\n held += edge.by;\n peak = Math.max(peak, held);\n }\n peaks[bus] = peak;\n }\n return peaks;\n}\n","/** Where a score sits on the three axes it is steered by. Values outside a\n * range are read as its nearest end. */\nexport interface ScoreMood {\n /** -1 dark to 1 bright. */\n valence: number;\n /** 0 consonant and settled to 1 dissonant. */\n tension: number;\n /** 0 still to 1 driving. */\n urgency: number;\n}\n\n/** The scoring devices of factual screen content that a mood can land on. */\nexport type ScoreCueName = 'dread' | 'investigation' | 'wonder' | 'urgency';\n\n/** One named device: the mood that produces it, and what it does to a listener\n * in words, for a consumer to show beside the score. */\nexport interface ScoreCue {\n name: ScoreCueName;\n mood: ScoreMood;\n device: string;\n}\n\n/** The built-in cues: each names a mood and the musical device that carries it. */\nexport const scoreCues: readonly ScoreCue[] = [\n {\n name: 'dread',\n mood: { valence: -1, tension: 1, urgency: 0 },\n device: 'Sustained low tones a minor second and a tritone apart, with no pulse.',\n },\n {\n name: 'investigation',\n mood: { valence: -0.4, tension: 0.5, urgency: 0.5 },\n device: 'A plucked minor ostinato that adds a layer every two bars.',\n },\n {\n name: 'wonder',\n mood: { valence: 1, tension: 0.1, urgency: 0.1 },\n device: 'Lydian chords in open voicings, swelling in with a soft attack.',\n },\n {\n name: 'urgency',\n mood: { valence: 0, tension: 0.7, urgency: 1 },\n device: 'Driving sixteenths on stacked fourths and fifths, a new chord every bar.',\n },\n];\n\n/** Which cue a mood is applying: the nearest, and how much of each. */\nexport interface ScoreCueReading {\n name: ScoreCueName;\n /** Each cue's share, summing to 1. A mood at a cue's own `mood` is all that cue. */\n weights: Record<ScoreCueName, number>;\n}\n\nconst clamp = (value: number, lo: number, hi: number): number => Math.min(hi, Math.max(lo, value));\n\nconst inRange = (mood: ScoreMood): ScoreMood => ({\n valence: clamp(mood.valence, -1, 1),\n tension: clamp(mood.tension, 0, 1),\n urgency: clamp(mood.urgency, 0, 1),\n});\n\n/** Name the cue a mood is applying, and weigh the others against it by\n * inverse squared distance. */\nexport function readScoreCue(mood: ScoreMood): ScoreCueReading {\n const m = inRange(mood);\n // Valence spans twice what the other axes do.\n const distance = scoreCues.map((cue) =>\n ((m.valence - cue.mood.valence) / 2) ** 2 + (m.tension - cue.mood.tension) ** 2 + (m.urgency - cue.mood.urgency) ** 2);\n const exact = distance.indexOf(0);\n const raw = distance.map((d, i) => (exact >= 0 ? Number(i === exact) : 1 / d));\n const total = raw.reduce((sum, w) => sum + w, 0);\n const weights = {} as Record<ScoreCueName, number>;\n scoreCues.forEach((cue, i) => { weights[cue.name] = raw[i] / total; });\n return { name: scoreCues[raw.indexOf(Math.max(...raw))].name, weights };\n}\n\n/** The modes a score draws on, brightest first. */\nexport type ScoreMode = 'lydian' | 'ionian' | 'dorian' | 'aeolian' | 'phrygian';\n\n/** Each mode's seven tones, in semitones above its tonic. */\nexport const scoreModes: Record<ScoreMode, readonly number[]> = {\n lydian: [0, 2, 4, 6, 7, 9, 11],\n ionian: [0, 2, 4, 5, 7, 9, 11],\n dorian: [0, 2, 3, 5, 7, 9, 10],\n aeolian: [0, 2, 3, 5, 7, 8, 10],\n phrygian: [0, 1, 3, 5, 7, 8, 10],\n};\n\n/** The musical parameters a mood resolves to. Each follows one axis only. */\nexport interface ScoreParams {\n /** From valence. */\n mode: ScoreMode;\n /** MIDI note of the tonic the chords are built up from. From valence. */\n register: number;\n /** Octaves a chord is opened across, 1 to 3. From valence. */\n spread: number;\n /** How the tones above a root are chosen: thirds from the mode, stacked\n * fourths and fifths, or a minor second and a tritone. From tension. */\n harmony: 'triadic' | 'quartal' | 'cluster';\n /** The most layers a pulsed score builds up to. From tension. */\n layers: number;\n /** Beats per minute. From urgency. */\n tempo: number;\n /** Notes to a beat; 0 is no pulse at all. From urgency. */\n density: 0 | 1 | 2 | 4;\n /** From urgency. */\n articulation: 'sustained' | 'plucked';\n /** Bars a chord lasts. From urgency. */\n harmonicRhythm: number;\n /** Envelope attack in ms. From urgency. */\n attack: number;\n}\n\n/** Resolve a mood to the parameters `scoreBar` writes music from. */\nexport function scoreParams(mood: ScoreMood): ScoreParams {\n const { valence, tension, urgency } = inRange(mood);\n const sustained = urgency < 0.35;\n return {\n mode: valence > 0.6 ? 'lydian'\n : valence > 0.2 ? 'ionian'\n : valence > -0.2 ? 'dorian'\n : valence > -0.6 ? 'aeolian'\n : 'phrygian',\n register: 36 + 12 * Math.round(valence + 1),\n spread: 1 + Math.round(2 * Math.max(0, valence)),\n harmony: tension >= 0.8 ? 'cluster' : tension >= 0.55 ? 'quartal' : 'triadic',\n layers: 1 + Math.round(4 * tension),\n tempo: Math.round(60 + 80 * urgency),\n density: urgency < 0.15 ? 0 : urgency < 0.4 ? 1 : urgency < 0.75 ? 2 : 4,\n articulation: sustained ? 'sustained' : 'plucked',\n harmonicRhythm: urgency < 0.33 ? 4 : urgency < 0.66 ? 2 : 1,\n attack: sustained ? Math.round(800 * (1 - urgency)) : 5,\n };\n}\n","import type { Envelope } from './envelope';\nimport type { PatternNote } from './patternPlayer';\nimport { scoreModes, type ScoreParams } from './scoreMood';\n\n/** Steps in a bar of score: sixteenths in 4/4. */\nexport const SCORE_BAR_STEPS = 16;\n\n/** How `scoreBar` places and routes its notes. */\nexport interface ScoreBarOptions {\n /** Semitones above C for the tonic. Default 0. */\n tonic?: number;\n /** Default: the engine's first bus. */\n bus?: string;\n /** The level the notes sounding on one step add up to at most. Default 0.5. */\n gain?: number;\n /** Chooses the order an ostinato takes a chord's tones in. Default: rising. */\n seed?: number;\n}\n\n/** Scale degrees a progression takes its roots from, a chord at a time. */\nconst PROGRESSION = [0, 5, 3, 4];\n\n/**\n * The chord a score plays, as MIDI notes, root first. `chord` counts chords\n * since the score began; a cluster stays on the tonic, and the other harmonies\n * walk a four-chord progression inside the mode.\n */\nexport function scoreChord(params: ScoreParams, chord: number, tonic = 0): number[] {\n const scale = scoreModes[params.mode];\n const tone = (degree: number): number =>\n params.register + tonic + scale[degree % 7] + 12 * Math.floor(degree / 7);\n if (params.harmony === 'cluster') {\n const root = tone(0);\n return [root, root + 1, root + 6];\n }\n const degree = PROGRESSION[chord % PROGRESSION.length];\n const root = tone(degree);\n if (params.harmony === 'quartal') return [root, root + 7, root + 12, root + 17];\n if (params.spread < 2) return [root, tone(degree + 2), tone(degree + 4)];\n const open = [root, tone(degree + 4), tone(degree + 2) + 12];\n // The fourth above the root, two octaves up: on a Lydian tonic, the raised\n // fourth the mode is heard by.\n if (params.spread >= 3) open.push(tone(degree + 3) + 24);\n return open;\n}\n\n/** The order an ostinato takes `count` chord tones in. */\nfunction figure(count: number, seed: number | undefined): number[] {\n const order = Array.from({ length: count }, (_, i) => i);\n if (seed === undefined) return order;\n let state = (seed >>> 0) || 1;\n for (let i = count - 1; i > 0; i--) {\n state = (Math.imul(state, 1664525) + 1013904223) >>> 0;\n const j = state % (i + 1);\n [order[i], order[j]] = [order[j], order[i]];\n }\n return order;\n}\n\nconst PLUCK: Envelope = { attack: 5, decay: 140, sustain: 0.2, release: 80 };\n\n/**\n * One bar of score as pattern events, for a player `SCORE_BAR_STEPS` long.\n * `bar` counts bars since the score began: it picks the chord, by the harmonic\n * rhythm, and how many layers a pulsed score has built up to, one more every\n * two bars. The same arguments always write the same bar.\n *\n * With no pulse, the bar is its chord held throughout. With one, the layers\n * are an ostinato over the chord's tones, a bass on the root, the ostinato\n * doubled an octave up on the off pulses, and the chord held as a pad.\n */\nexport function scoreBar(params: ScoreParams, bar: number, opts: ScoreBarOptions = {}): PatternNote[] {\n const gain = opts.gain ?? 0.5;\n const chord = scoreChord(params, Math.floor(bar / params.harmonicRhythm), opts.tonic);\n const swell: Envelope = { attack: params.attack, release: params.attack };\n const held = params.articulation === 'sustained';\n const note = (step: number, length: number, midi: number, level: number, envelope: Envelope): PatternNote => ({\n step, length, pitch: { midi }, gain: gain * level, envelope,\n wave: held ? 'sine' : 'triangle',\n ...(opts.bus === undefined ? {} : { bus: opts.bus }),\n });\n const pad = (level: number, envelope: Envelope): PatternNote[] =>\n chord.map((midi) => note(0, SCORE_BAR_STEPS, midi, level / chord.length, envelope));\n\n if (params.density === 0) return pad(1, swell);\n\n const layers = Math.min(params.layers, 1 + Math.floor(bar / 2));\n const every = 4 / params.density;\n const order = figure(chord.length, opts.seed);\n const envelope = held ? swell : PLUCK;\n const events: PatternNote[] = [];\n for (let pulse = 0; pulse * every < SCORE_BAR_STEPS; pulse++) {\n const midi = chord[order[pulse % order.length]];\n events.push(note(pulse * every, every, midi, 0.4, envelope));\n if (layers >= 3 && pulse % 2 === 1) events.push(note(pulse * every, every, midi + 12, 0.15, envelope));\n }\n if (layers >= 2) {\n for (const step of [0, 8]) events.push(note(step, 8, chord[0] - 12, 0.3, { attack: 5, release: 120 }));\n }\n if (layers >= 4) events.push(...pad(0.15, { attack: 120, release: 200 }));\n return events;\n}\n","import type { AudioEngine } from './createAudioEngine';\nimport { createPatternPlayer } from './patternPlayer';\nimport { SCORE_BAR_STEPS, scoreBar, type ScoreBarOptions } from './scoreBar';\nimport {\n readScoreCue, scoreParams, type ScoreCueReading, type ScoreMood, type ScoreParams,\n} from './scoreMood';\n\n/** What a score is playing in one bar, and why: the mood it was given, the cue\n * that mood applies, and the parameters the bar was written from. */\nexport interface ScoreState {\n /** Bars since `start`. */\n bar: number;\n /** Bars since the cue last changed, which is what a pulsed score's layers\n * build up from. */\n cueBar: number;\n mood: ScoreMood;\n cue: ScoreCueReading;\n params: ScoreParams;\n}\n\n/** Options for `createScore`. */\nexport interface ScoreOptions extends ScoreBarOptions {\n mood: ScoreMood;\n /** Called as each bar's first step is booked — up to a lookahead before it\n * sounds — with what the bar plays and its engine time in ms. */\n onBar?: (state: ScoreState, when: number) => void;\n}\n\n/** A running generative score. See `createScore`. */\nexport interface Score {\n /** Start from bar 0 at engine time `when`, default now. No-op while playing. */\n start(when?: number): void;\n /** Book nothing further, and release every voice the score started. */\n stop(): void;\n playing(): boolean;\n /** The mood last set, which the next bar will take. */\n mood(): ScoreMood;\n /** Takes effect at the next bar line. */\n setMood(mood: ScoreMood): void;\n /** The bar most recently booked. */\n state(): ScoreState;\n}\n\n/**\n * Music written continuously from a mood rather than chosen from clips. Each\n * bar is `scoreBar` of the mood's `scoreParams`, booked through a pattern\n * player, and a new mood lands on the next bar line with its tempo.\n *\n * These devices work on a listener without asking them, which is what they are\n * for. `state()` and `onBar` name the cue in force and every parameter behind\n * it, so a consumer can show what is being applied as well as play it.\n */\nexport function createScore(engine: AudioEngine, opts: ScoreOptions): Score {\n const { mood: initial, onBar, ...barOpts } = opts;\n let target = initial;\n\n const stateAt = (bar: number, before: ScoreState | null): ScoreState => {\n const cue = readScoreCue(target);\n return {\n bar,\n cueBar: before && before.cue.name === cue.name ? before.cueBar + 1 : 0,\n mood: target,\n cue,\n params: scoreParams(target),\n };\n };\n const eventsOf = (state: ScoreState) => scoreBar(state.params, state.cueBar, barOpts);\n\n let current = stateAt(0, null);\n let next = current;\n\n const player = createPatternPlayer(engine, {\n tempo: current.params.tempo,\n length: SCORE_BAR_STEPS,\n events: eventsOf(current),\n onStep(step, when) {\n if (step === 0) {\n current = next;\n onBar?.(current, when);\n }\n if (step !== SCORE_BAR_STEPS - 1) return;\n next = stateAt(current.bar + 1, current);\n player.setTempo(next.params.tempo);\n player.setEvents(eventsOf(next), SCORE_BAR_STEPS);\n },\n });\n\n return {\n start(when) {\n if (player.playing()) return;\n current = next = stateAt(0, null);\n player.setTempo(current.params.tempo);\n player.setEvents(eventsOf(current), SCORE_BAR_STEPS);\n player.start(when);\n },\n stop: () => player.stop(),\n playing: () => player.playing(),\n mood: () => target,\n setMood(mood) { target = mood; },\n state: () => current,\n };\n}\n","/** A biquad's coefficients, already divided by `a0`. */\nexport interface BiquadCoefficients {\n b0: number;\n b1: number;\n b2: number;\n a1: number;\n a2: number;\n}\n\n/**\n * The coefficients a `BiquadFilterNode` of `type` runs at `frequency`, by the\n * formulas in the Web Audio specification. `Q` is in dB for a lowpass or a\n * highpass and a plain quality factor for the rest, as it is on the node, and\n * `gain` is dB, read by the shelves and the peaking filter only. Pass `into`\n * to have them written to an object you keep, which allocates nothing.\n */\nexport function biquadCoefficients(\n type: BiquadFilterType,\n frequency: number,\n sampleRate: number,\n Q = 1,\n gain = 0,\n into: BiquadCoefficients = { b0: 0, b1: 0, b2: 0, a1: 0, a2: 0 },\n): BiquadCoefficients {\n // Strictly inside (0, Nyquist), where every formula below is finite.\n const f = Math.min(Math.max(frequency, 1e-3), sampleRate * 0.4999);\n const w0 = (2 * Math.PI * f) / sampleRate;\n const cos = Math.cos(w0);\n const sin = Math.sin(w0);\n const A = 10 ** (gain / 40);\n const alphaQ = sin / (2 * Math.max(Q, 1e-4));\n const alphaDb = sin / (2 * 10 ** (Q / 20));\n const shelf = sin * Math.SQRT2 * Math.sqrt(A);\n let b0 = (1 - cos) / 2;\n let b1 = 1 - cos;\n let b2 = b0;\n let a0 = 1 + alphaDb;\n let a1 = -2 * cos;\n let a2 = 1 - alphaDb;\n if (type === 'highpass') {\n b0 = b2 = (1 + cos) / 2;\n b1 = -(1 + cos);\n } else if (type === 'peaking') {\n b0 = 1 + alphaQ * A;\n b1 = -2 * cos;\n b2 = 1 - alphaQ * A;\n a0 = 1 + alphaQ / A;\n a2 = 1 - alphaQ / A;\n } else if (type === 'lowshelf') {\n b0 = A * (A + 1 - (A - 1) * cos + shelf);\n b1 = 2 * A * (A - 1 - (A + 1) * cos);\n b2 = A * (A + 1 - (A - 1) * cos - shelf);\n a0 = A + 1 + (A - 1) * cos + shelf;\n a1 = -2 * (A - 1 + (A + 1) * cos);\n a2 = A + 1 + (A - 1) * cos - shelf;\n } else if (type === 'highshelf') {\n b0 = A * (A + 1 + (A - 1) * cos + shelf);\n b1 = -2 * A * (A - 1 + (A + 1) * cos);\n b2 = A * (A + 1 + (A - 1) * cos - shelf);\n a0 = A + 1 - (A - 1) * cos + shelf;\n a1 = 2 * (A - 1 - (A + 1) * cos);\n a2 = A + 1 - (A - 1) * cos - shelf;\n } else if (type !== 'lowpass') {\n // Bandpass, notch, and allpass share a denominator and differ above it.\n a0 = 1 + alphaQ;\n a2 = 1 - alphaQ;\n b0 = type === 'bandpass' ? alphaQ : type === 'notch' ? 1 : 1 - alphaQ;\n b1 = type === 'bandpass' ? 0 : -2 * cos;\n b2 = type === 'bandpass' ? -alphaQ : type === 'notch' ? 1 : 1 + alphaQ;\n }\n into.b0 = b0 / a0;\n into.b1 = b1 / a0;\n into.b2 = b2 / a0;\n into.a1 = a1 / a0;\n into.a2 = a2 / a0;\n return into;\n}\n\n/** How much a filter with coefficients `c` passes at `hz`, in dB. */\nexport function biquadResponseDb(c: BiquadCoefficients, hz: number, sampleRate: number): number {\n const w = (2 * Math.PI * hz) / sampleRate;\n const c1 = Math.cos(w);\n const s1 = Math.sin(w);\n const c2 = Math.cos(2 * w);\n const s2 = Math.sin(2 * w);\n const num = (c.b0 + c.b1 * c1 + c.b2 * c2) ** 2 + (c.b1 * s1 + c.b2 * s2) ** 2;\n const den = (1 + c.a1 * c1 + c.a2 * c2) ** 2 + (c.a1 * s1 + c.a2 * s2) ** 2;\n return 10 * Math.log10(num / den);\n}\n","import type { Inharmonic, Waveform } from './types';\n\n/** One cycle of a wave: its value at `phase` (0..1) when a sample advances it\n * by `dt` cycles. `dt` is how a shape knows what would land past Nyquist. */\nexport type WaveShape = (phase: number, dt: number) => number;\n\nconst TAU = 2 * Math.PI;\n/** Points a harmonic wave is measured at to find its peak. */\nconst PEAK_POINTS = 4096;\n\n/** Cycles a sample above which a triangle is summed from its odd harmonics.\n * Below it the plain shape's first folded harmonic is its 65th, 72 dB down. */\nconst TRIANGLE_SUMMED_FROM = 1 / 128;\n\n/** The correction that rounds a unit step at `t = 0` over the sample either\n * side of it, which is what keeps a square or a sawtooth from aliasing. */\nfunction polyBlep(t: number, dt: number): number {\n const d = Math.min(dt, 0.5);\n if (t < d) {\n const x = t / d;\n return x + x - x * x - 1;\n }\n if (t > 1 - d) {\n const x = (t - 1) / d;\n return x * x + x + x + 1;\n }\n return 0;\n}\n\nexport const sineShape: WaveShape = (phase) => Math.sin(TAU * phase);\n\n/** The level an `OscillatorNode` plays a square or a sawtooth at. Its table is the Fourier sum\n * scaled so the overshoot beside each step peaks at 1, which leaves the flat at 1 / 1.17898. */\nconst STEPPED_LEVEL = 1 / 1.17898;\n\n/** Each starts at zero, rising, as the `OscillatorNode` types do. */\nconst BUILT_IN: Record<'sine' | 'square' | 'sawtooth' | 'triangle', WaveShape> = {\n sine: sineShape,\n square: (phase, dt) => STEPPED_LEVEL * ((phase < 0.5 ? 1 : -1) + polyBlep(phase, dt) - polyBlep((phase + 0.5) % 1, dt)),\n sawtooth: (phase, dt) => {\n const t = (phase + 0.5) % 1;\n return STEPPED_LEVEL * (2 * t - 1 - polyBlep(t, dt));\n },\n triangle: (phase, dt) => {\n if (dt < TRIANGLE_SUMMED_FROM) return phase < 0.25 ? 4 * phase : phase < 0.75 ? 2 - 4 * phase : 4 * phase - 4;\n let v = 0;\n let sign = 1;\n for (let k = 1; k * dt < 0.5; k += 2) {\n v += (sign * Math.sin(TAU * k * phase)) / (k * k);\n sign = -sign;\n }\n return (v * 8) / (Math.PI * Math.PI);\n },\n};\n\n/** Sine harmonics at `levels`, the fundamental first, scaled so the whole wave\n * peaks at 1 as a `PeriodicWave` is. A harmonic at or past Nyquist is left out. */\nfunction harmonicShape(levels: readonly number[]): WaveShape {\n const sum = (phase: number, count: number): number => {\n let v = 0;\n for (let k = 1; k <= count; k += 1) v += levels[k - 1] * Math.sin(TAU * k * phase);\n return v;\n };\n let peak = 0;\n for (let i = 0; i < PEAK_POINTS; i += 1) peak = Math.max(peak, Math.abs(sum(i / PEAK_POINTS, levels.length)));\n const scale = peak > 0 ? 1 / peak : 0;\n return (phase, dt) => scale * sum(phase, Math.min(levels.length, Math.ceil(0.5 / dt) - 1));\n}\n\n/** The shape of a wave an oscillator plays at one pitch. */\nexport function waveShape(wave: Exclude<Waveform, Inharmonic>): WaveShape {\n return typeof wave === 'string' ? BUILT_IN[wave] : harmonicShape(wave);\n}\n","/**\n * Synth voices as arithmetic: the samples `playNote` and `playNoise` make,\n * computed with no `AudioContext`. A kernel renders a block at a time, so it\n * can run wherever samples are wanted: an offline render into a buffer, or the\n * inside of an `AudioWorkletProcessor`.\n */\nimport { biquadCoefficients } from './biquad';\nimport { envelopeLevel, resolveEnvelope, type Envelope } from './envelope';\nimport { sineShape, waveShape } from './oscillator';\nimport { NOISE_SECONDS, isInharmonic, noiseSamples, resolveNote } from './synthVoice';\nimport type { NoiseColor, NoiseOptions, NoteOptions, VoiceFilter } from './types';\n\n/** What of a `playNote` call shapes its samples. Routing, position, and timing\n * belong to whatever plays them. */\nexport type KernelNote = Pick<\n NoteOptions, 'pitch' | 'wave' | 'envelope' | 'glide' | 'filter' | 'duration' | 'gain' | 'detune'\n>;\n\n/** What of a `playNoise` call shapes its samples. */\nexport type KernelNoise = Pick<\n NoiseOptions, 'noise' | 'envelope' | 'filter' | 'duration' | 'gain' | 'rate' | 'detune'\n>;\n\n/** One voice, rendered a block at a time. */\nexport interface VoiceKernel {\n /** Add the voice's next samples into `out[from..to)`, the whole of `out` by\n * default. False once the voice has ended; it adds nothing from then on. */\n render(out: Float32Array, from?: number, to?: number): boolean;\n /** Note-off at the next sample: the envelopes release from wherever they\n * have got to. Does nothing once the gate has closed. */\n release(): void;\n /** What `setRate` and `setDetune` do to a sounding voice. `detune` is cents. */\n retune(rate: number, detune: number): void;\n}\n\n/** One raw sample, `t` ms into the voice, with its pitch multiplied by `tune`. */\ntype Source = (t: number, tune: number) => number;\n\ninterface Shaping {\n envelope?: Envelope;\n filter?: VoiceFilter;\n duration?: number;\n gain?: number;\n rate?: number;\n detune?: number;\n}\n\nconst tuning = (rate: number, detune: number): number => rate * 2 ** (detune / 1200);\n\n/** A voice filter as a function of one sample, its cutoff following its envelope. */\nfunction filterStage(\n spec: VoiceFilter,\n sampleRate: number,\n): (x: number, t: number, gate: number | undefined) => number {\n const type = spec.type ?? 'lowpass';\n const amount = spec.amount ?? 0;\n const env = spec.envelope && amount !== 0 ? resolveEnvelope(spec.envelope) : null;\n const coefficients = biquadCoefficients(type, spec.frequency, sampleRate, spec.Q, spec.gain);\n let cutoff = spec.frequency;\n let z1 = 0;\n let z2 = 0;\n return (x, t, gate) => {\n if (env) {\n const hz = spec.frequency + amount * envelopeLevel(env, t, gate);\n if (hz !== cutoff) {\n cutoff = hz;\n biquadCoefficients(type, hz, sampleRate, spec.Q, spec.gain, coefficients);\n }\n }\n const y = coefficients.b0 * x + z1;\n z1 = coefficients.b1 * x - coefficients.a1 * y + z2;\n z2 = coefficients.b2 * x - coefficients.a2 * y;\n return y;\n };\n}\n\n/** What every kernel shares once it has a source: source → optional filter →\n * envelope, the gate, and the end at the close of the release. */\nfunction createKernel(patch: Shaping, sampleRate: number, source: Source): VoiceKernel {\n const env = resolveEnvelope(patch.envelope);\n const gain = patch.gain ?? 1;\n const filter = patch.filter ? filterStage(patch.filter, sampleRate) : null;\n const msPerSample = 1000 / sampleRate;\n let gate = patch.duration;\n let tune = tuning(patch.rate ?? 1, patch.detune ?? 0);\n let n = 0;\n let ended = false;\n return {\n render(out, from = 0, to = out.length) {\n if (ended) return false;\n for (let i = from; i < to; i += 1) {\n const t = n * msPerSample;\n if (gate !== undefined && t >= gate + env.release) {\n ended = true;\n return false;\n }\n const raw = source(t, tune);\n out[i] += gain * envelopeLevel(env, t, gate) * (filter ? filter(raw, t, gate) : raw);\n n += 1;\n }\n return true;\n },\n release() {\n const t = n * msPerSample;\n if (gate === undefined || t < gate) gate = t;\n },\n retune(rate, detune) {\n tune = tuning(rate, detune);\n },\n };\n}\n\n/** A `playNote` voice. Throws on a bad pitch or partial, as `playNote` does. */\nexport function createNoteKernel(note: KernelNote, sampleRate: number): VoiceKernel {\n const { from, glideTo, partials } = resolveNote(note);\n const glideMs = note.glide?.ms ?? note.duration ?? 100;\n const linear = note.glide?.curve === 'linear';\n const wave = note.wave ?? 'sine';\n const shape = isInharmonic(wave) ? sineShape : waveShape(wave);\n const tones: { ratio: number; gain: number; decay?: number; phase: number }[] = partials\n ? partials.map((p) => ({ ratio: p.ratio, gain: p.gain, decay: p.decay, phase: 0 }))\n : [{ ratio: 1, gain: 1, phase: 0 }];\n return createKernel(note, sampleRate, (t, tune) => {\n let hz = from;\n if (glideTo !== undefined) {\n const k = glideMs > 0 ? Math.min(1, t / glideMs) : 1;\n hz = linear ? from + (glideTo - from) * k : from * (glideTo / from) ** k;\n }\n const cycles = (hz * tune) / sampleRate;\n let sum = 0;\n for (const tone of tones) {\n const dt = cycles * tone.ratio;\n // An oscillator at or past Nyquist is silent, not folded back.\n if (dt >= 0.5) continue;\n const level = tone.decay === undefined ? tone.gain : tone.gain * Math.exp(-t / tone.decay);\n sum += level * shape(tone.phase, dt);\n tone.phase = (tone.phase + dt) % 1;\n }\n return sum;\n });\n}\n\nconst loops = new Map<string, Float32Array>();\n\n/** The loop `noiseBuffer` gives a context at this rate, made once per color and rate. */\nfunction noiseLoop(color: NoiseColor, sampleRate: number): Float32Array {\n const key = `${color}:${sampleRate}`;\n let loop = loops.get(key);\n if (!loop) {\n loop = noiseSamples(color, Math.round(sampleRate * NOISE_SECONDS));\n loops.set(key, loop);\n }\n return loop;\n}\n\n/** A `playNoise` voice. `random` picks where in the loop it starts. */\nexport function createNoiseKernel(\n noise: KernelNoise,\n sampleRate: number,\n random: () => number = Math.random,\n): VoiceKernel {\n const loop = noiseLoop(noise.noise, sampleRate);\n // On a whole sample: between two, white noise is their average, and quieter for it.\n let at = Math.floor(random() * loop.length);\n return createKernel(noise, sampleRate, (_t, tune) => {\n const i = Math.floor(at);\n const a = loop[i];\n const sample = a + (loop[(i + 1) % loop.length] - a) * (at - i);\n at = (at + tune) % loop.length;\n return sample;\n });\n}\n\nfunction renderWhole(kernel: VoiceKernel, patch: Shaping, sampleRate: number, what: string): Float32Array {\n if (patch.duration === undefined) {\n throw new RangeError(`@weasel-js/audio: ${what} needs a duration to know where the voice ends`);\n }\n const total = patch.duration + resolveEnvelope(patch.envelope).release;\n const out = new Float32Array(Math.round((total * sampleRate) / 1000));\n kernel.render(out);\n return out;\n}\n\n/** A whole note as samples, through its release: `duration + release` ms at\n * `sampleRate`. Put them in an `AudioBuffer` and `engine.register` it to play\n * the note as a sound. */\nexport function renderNote(note: KernelNote, sampleRate: number): Float32Array {\n return renderWhole(createNoteKernel(note, sampleRate), note, sampleRate, 'renderNote');\n}\n\n/** A whole noise voice as samples, through its release. */\nexport function renderNoise(\n noise: KernelNoise,\n sampleRate: number,\n random: () => number = Math.random,\n): Float32Array {\n return renderWhole(createNoiseKernel(noise, sampleRate, random), noise, sampleRate, 'renderNoise');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/analyser.ts","../src/audioTime.ts","../src/param.ts","../src/inserts.ts","../src/buses.ts","../src/graph/edges.ts","../src/graph/fader.ts","../src/graph/wrapper.ts","../src/graph/replace.ts","../src/graph/errors.ts","../src/graph/edits.ts","../src/graph/transport.ts","../src/graph/validate.ts","../src/graph/createAudioGraph.ts","../src/resumeWatch.ts","../src/scheduler.ts","../src/soundCache.ts","../src/streamStarter.ts","../src/envelope.ts","../src/periodicWave.ts","../src/liveVoice.ts","../src/pitch.ts","../src/synthVoice.ts","../src/synthStarters.ts","../src/worklet/loadVoiceProcessor.ts","../src/worklet/protocol.ts","../src/worklet/workletVoices.ts","../src/tickTimer.ts","../src/voiceChains.ts","../src/voiceDrops.ts","../src/voicePool.ts","../src/spatialize.ts","../src/voices.ts","../src/createAudioEngine.ts","../src/effects.ts","../src/patternPlayer.ts","../src/patternLoad.ts","../src/scoreMood.ts","../src/scoreBar.ts","../src/score.ts","../src/biquad.ts","../src/oscillator.ts","../src/voiceKernel.ts","../src/impulse.ts","../src/graph/playhead.ts","../src/graph/sources.ts","../src/graph/processors.ts"],"names":["target","i","prev","next","cache","slot","degree","root","envelope"],"mappings":";AA4BO,SAAS,iBAAA,CACd,GAAA,EACA,MAAA,EACA,IAAA,GAA2B,EAAC,EACf;AACb,EAAA,MAAM,IAAA,GAAO,IAAI,cAAA,EAAe;AAChC,EAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,IAAA;AAC/B,EAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AACnB,EAAA,IAAI,QAAA,GAAW,IAAA;AAIf,EAAA,IAAI,WAAA,GAAc,IAAI,UAAA,CAAW,CAAC,CAAA;AAClC,EAAA,IAAI,WAAA,GAAc,IAAI,UAAA,CAAW,CAAC,CAAA;AAClC,EAAA,MAAM,UAAU,MAA+B;AAC7C,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,IAAA,CAAK,iBAAA,EAAmB;AACjD,MAAA,WAAA,GAAc,IAAI,UAAA,CAAW,IAAA,CAAK,iBAAiB,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,UAAU,MAA+B;AAC7C,IAAA,IAAI,WAAA,CAAY,WAAW,IAAA,CAAK,OAAA,gBAAuB,IAAI,UAAA,CAAW,KAAK,OAAO,CAAA;AAClF,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,YAAY,GAAA,EAAK;AACf,MAAA,MAAMA,OAAAA,GAAS,GAAA,IAAO,IAAI,UAAA,CAAW,KAAK,iBAAiB,CAAA;AAC3D,MAAA,IAAA,CAAK,qBAAqBA,OAAM,CAAA;AAChC,MAAA,OAAOA,OAAAA;AAAA,IACT,CAAA;AAAA,IACA,SAAS,GAAA,EAAK;AACZ,MAAA,MAAMA,OAAAA,GAAS,GAAA,IAAO,IAAI,UAAA,CAAW,KAAK,OAAO,CAAA;AACjD,MAAA,IAAA,CAAK,sBAAsBA,OAAM,CAAA;AACjC,MAAA,OAAOA,OAAAA;AAAA,IACT,CAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,MAAM,MAAM,OAAA,EAAQ;AACpB,MAAA,IAAA,CAAK,sBAAsB,GAAG,CAAA;AAC9B,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAEtC,QAAA,MAAM,CAAA,GAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,IAAO,GAAA;AAC3B,QAAA,GAAA,IAAO,CAAA,GAAI,CAAA;AAAA,MACb;AACA,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,CAAI,MAAM,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,KAAA,CAAM,GAAG,GAAA,EAAK;AACZ,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,IAAI,CAAA,EAAG;AACjC,QAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,MAC1E;AAGA,MAAA,IAAI,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,2BAA2B,CAAC,CAAA,uCAAA,EAA0C,CAAC,CAAA,MAAA,EAAS,IAAI,MAAM,CAAA;AAAA,SAC5F;AAAA,MACF;AACA,MAAA,MAAM,MAAM,OAAA,EAAQ;AACpB,MAAA,IAAA,CAAK,qBAAqB,GAAG,CAAA;AAC7B,MAAA,MAAMA,OAAAA,GAAS,GAAA,IAAO,IAAI,YAAA,CAAa,CAAC,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,IAAI,MAAA,GAAS,CAAA;AACzB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAC7B,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG,KAAK,KAAA,CAAA,CAAO,CAAA,GAAI,CAAA,IAAK,GAAG,CAAC,CAAA;AACrD,QAAA,IAAI,GAAA,GAAM,CAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,IAAI,CAAA,GAAI,EAAA,EAAI,KAAK,CAAA,EAAG,GAAA,IAAO,IAAI,CAAC,CAAA;AAC7C,QAAAA,OAAAA,CAAO,CAAC,CAAA,GAAI,GAAA,IAAO,KAAK,EAAA,CAAA,GAAM,GAAA;AAAA,MAChC;AACA,MAAA,OAAOA,OAAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA,IAGA,OAAA,GAAU;AACR,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,MAAA,CAAO,WAAW,IAAI,CAAA;AAAA,IACxB;AAAA,GACF;AACF;;;ACtGO,IAAM,aAAA,GAAwB;AAAA,EACnC,UAAU,CAAC,EAAA,EAAI,EAAA,KAAO,UAAA,CAAW,IAAI,EAAE,CAAA;AAAA,EACvC,UAAA,EAAY,CAAC,CAAA,KAAM,YAAA,CAAa,CAAkC;AACpE,CAAA;AASO,SAAS,WAAA,CACd,GAAA,EACA,MAAA,EACA,EAAA,EACA,EAAA,EACY;AACZ,EAAA,IAAI,MAAA,GAAkB,IAAA;AACtB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,WAAA;AACtB,IAAA,IAAI,GAAA,CAAI,KAAA,KAAU,SAAA,IAAa,IAAA,GAAO,IAAA,EAAM;AAC1C,MAAA,MAAA,GAAS,MAAA,CAAO,SAAS,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,GAAI,CAAC,CAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,GAAO,KAAA;AACP,IAAA,EAAA,EAAG;AAAA,EACL,CAAA;AACA,EAAA,KAAA,EAAM;AACN,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,GAAO,KAAA;AACP,IAAA,IAAI,MAAA,KAAW,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA;AAC7C,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAA;AACF;;;ACnCO,SAAS,UAAA,CACd,GAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,MAAM,GAAA,CAAI,WAAA;AAChB,EAAA,KAAA,CAAM,sBAAsB,GAAG,CAAA;AAC/B,EAAA,IAAI,MAAA,IAAU,SAAS,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,cAAA,CAAe,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AACrC,IAAA,KAAA,CAAM,uBAAA,CAAwB,KAAA,EAAO,GAAA,GAAM,MAAA,GAAS,GAAI,CAAA;AAAA,EAC1D,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,EACjC;AACF;AAOO,SAAS,SAAA,CAAU,GAAA,EAAuB,KAAA,EAAmB,KAAA,EAAqB;AACvF,EAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,EAAA,UAAA,CAAW,GAAA,EAAK,OAAO,KAAK,CAAA;AAC9B;;;AC4DO,SAAS,kBACd,GAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,GAA2B,EAAC,EACV;AAClB,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,EAAA;AAC9B,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,aAAA,CAAc,QAAA;AAAA,IACzC,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,aAAA,CAAc;AAAA,GAC/C;AACA,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAsB;AACvC,EAAA,MAAM,QAAgB,EAAC;AAEvB,EAAA,MAAM,OAAe,EAAC;AACtB,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,IAAI,IAAA,GAAO,KAAA;AAEX,EAAA,IAAI,OAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,UAA0B,EAAC;AAE/B,EAAA,MAAM,IAAA,GAAO,MAAe,GAAA,CAAI,KAAA,KAAU,YAAY,MAAA,GAAS,CAAA;AAE/D,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAiB,EAAA,EAAe,IAAA,KAAuB;AACnE,IAAA,MAAM,CAAA,GAAI,IAAI,UAAA,EAAW;AAEzB,IAAA,CAAA,CAAE,KAAK,KAAA,GAAQ,IAAA;AACf,IAAA,UAAA,CAAW,GAAA,EAAK,CAAA,CAAE,IAAA,EAAM,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,QAAQ,CAAC,CAAA;AACd,IAAA,CAAA,CAAE,QAAQ,EAAE,CAAA;AACZ,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA,EAAE;AAC9B,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAkB;AAChC,IAAA,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AACxB,IAAA,CAAA,CAAE,KAAK,UAAA,EAAW;AAClB,IAAA,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,CAAC,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAiB,EAAA,KAC7B,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,OAAO,EAAE,CAAA;AAElD,EAAA,MAAM,OAAO,CAAC,CAAA,KAA+B,CAAA,GAAI,CAAA,CAAE,MAAO,EAAA,GAAK,IAAA;AAC/D,EAAA,MAAM,QAAQ,CAAC,CAAA,KAA+B,CAAA,GAAI,CAAA,CAAE,MAAO,GAAA,GAAM,IAAA;AAEjE,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,EAAS,EAAA,KAAqB;AAC/C,IAAA,IAAI,CAAC,EAAE,KAAA,EAAO;AACd,IAAA,UAAA,CAAW,GAAA,EAAK,EAAE,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,CAAE,QAAA,GAAW,CAAA,GAAI,CAAA,EAAG,EAAE,CAAA;AACxD,IAAA,UAAA,CAAW,GAAA,EAAK,EAAE,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,CAAE,QAAA,GAAW,CAAA,GAAI,CAAA,EAAG,EAAE,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,IAAA,IAAI,EAAE,KAAA,EAAO;AACb,IAAA,MAAM,CAAA,GAAI;AAAA,MACR,EAAA,EAAI,IAAI,UAAA,EAAW;AAAA,MAAG,GAAA,EAAK,IAAI,UAAA,EAAW;AAAA,MAAG,GAAA,EAAK,IAAI,UAAA,EAAW;AAAA,MAAG,GAAA,EAAK,IAAI,UAAA;AAAW,KAC1F;AACA,IAAA,CAAA,CAAE,EAAA,CAAG,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC3B,IAAA,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA;AAC7B,IAAA,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA;AACnB,IAAA,CAAA,CAAE,EAAA,CAAG,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA;AAClB,IAAA,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA;AACnB,IAAA,CAAA,CAAE,KAAA,GAAQ,CAAA;AACV,IAAA,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,WAAW,CAAA,GAAI,CAAA;AACpC,IAAA,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,WAAW,CAAA,GAAI,CAAA;AACpC,IAAA,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA;AACZ,IAAA,IAAI,CAAC,CAAA,EAAG;AAGR,IAAA,CAAA,CAAE,GAAG,UAAA,EAAW;AAChB,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,CAAA,CAAE,GAAG,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAoB;AACrE,IAAA,CAAA,CAAE,IAAI,UAAA,EAAW;AACjB,IAAA,CAAA,CAAE,IAAI,UAAA,EAAW;AACjB,IAAA,CAAA,CAAE,IAAI,UAAA,EAAW;AACjB,IAAA,CAAA,CAAE,KAAA,GAAQ,IAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,OAAO,MAAmB;AAC9B,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACxC,IAAA,IAAI,OAAO,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAM;AAC7C,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AACnD,IAAA,KAAA,IAASC,KAAI,CAAA,EAAGA,EAAAA,GAAI,MAAA,CAAO,MAAA,EAAQA,MAAK,CAAA,EAAG;AAEzC,MAAA,IAAI,IAAA,CAAKA,EAAC,CAAA,KAAM,MAAA,CAAOA,EAAC,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,CAAOA,EAAC,CAAA,EAAE;AAAA,IACnE;AACA,IAAA,MAAM,CAAA,GAAI,MAAM,SAAA,CAAU,CAAC,MAAM,CAAC,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAClD,IAAA,IAAI,CAAA,GAAI,GAAG,OAAO,IAAA;AAClB,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AAClC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAC/B,MAAA,IAAI,KAAK,CAAA,EAAG;AAAE,QAAA,EAAA,GAAK,CAAA,GAAI,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACnC;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,KAAA,CAAM,CAAC,GAAG,EAAA,EAAG;AAAA,EAC1C,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAY,EAAA,KAA6B;AACtD,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM;AACtB,MAAA,KAAA,CAAM,CAAC,CAAA;AACP,MAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,IAAK,IAAA;AAClC,MAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA;AAC9B,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMD,KAAI,CAAA,EAAG,IAAA,CAAKC,KAAI,CAAC,CAAA;AACxC,MAAA,IAAA,CAAK,MAAMD,KAAI,CAAA,EAAG,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA;AAC5B,MAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,CAAC,GAAG,IAAA,CAAKC,KAAI,GAAG,CAAC,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AACzB,MAAA,UAAA,CAAW,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,GAAG,EAAE,CAAA;AACpC,MAAA,UAAA,CAAW,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,GAAG,EAAE,CAAA;AACzC,MAAA,OAAO,MAAM,OAAO,GAAG,CAAA;AAAA,IACzB;AACA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,IAAK,IAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,IAAK,IAAA;AAC5B,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AACtC,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,IAAI,GAAG,IAAA,CAAK,IAAI,GAAG,CAAC,CAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAChB,IAAA,OAAA,GAAU,CAAA;AACV,IAAA,UAAA,CAAW,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,GAAG,EAAE,CAAA;AACrC,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,GAAG,EAAE,CAAA;AACvC,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,OAAA,CAAQ,CAAC,CAAA;AACT,QAAA,CAAA,CAAE,OAAO,OAAA,IAAU;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,OAAO,CAAC,IAAA,IAAQ,CAAC,QAAA,EAAU;AACzB,MAAA,MAAM,OAAO,IAAA,EAAK;AAClB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAA,GAAO,OAAA;AACb,QAAA,OAAA,GAAU,EAAC;AACX,QAAA,KAAA,MAAW,CAAA,IAAK,MAAM,CAAA,EAAE;AACxB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAK,IAAA,EAAK;AAChB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA;AAC7B,MAAA,IAAI,OAAO,CAAA,EAAG;AACZ,QAAA,MAAA,EAAO;AACP,QAAA;AAAA,MACF;AACA,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,MAAA,GAAS,YAAY,GAAA,EAAK,MAAA,EAAQ,IAAI,WAAA,GAAc,EAAA,GAAK,KAAM,MAAM;AACnE,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,IAAA,GAAO,KAAA;AACP,QAAA,MAAA,EAAO;AACP,QAAA,IAAA,EAAK;AAAA,MACP,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,IAAA,EAAM,MAAM,CAAC,CAAA;AAElB,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,EAAsB,QAAA,KAA4B;AAChE,IAAA,MAAM,CAAA,GAAU,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAS,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAc;AACvF,IAAA,CAAA,CAAE,MAAA,GAAS;AAAA,MACT,MAAA;AAAA,MACA,OAAO,EAAA,EAAI;AACT,QAAA,IAAI,CAAA,CAAE,aAAa,EAAA,EAAI;AACvB,QAAA,CAAA,CAAE,QAAA,GAAW,EAAA;AACb,QAAA,SAAA,CAAU,CAAA,EAAG,MAAM,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,QAAA,EAAU,MAAM,CAAA,CAAE,QAAA;AAAA,MAClB,OAAO,KAAA,EAAO;AACZ,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC5B,QAAA,IAAI,OAAO,CAAA,EAAG;AACd,QAAA,KAAA,CAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AACpB,QAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAA,CAAM,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC7D,QAAA,IAAA,EAAK;AAAA,MACP,CAAA;AAAA,MACA,MAAA,GAAS;AACP,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC1B,QAAA,IAAI,KAAK,CAAA,EAAG;AACZ,QAAA,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AAClB,QAAA,CAAA,CAAE,OAAA,GAAU,IAAA;AAEZ,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,IAAK,YAAY,CAAA,EAAG;AACtC,UAAA,OAAA,CAAQ,CAAC,CAAA;AACT,UAAA,CAAA,CAAE,OAAO,OAAA,IAAU;AAAA,QACrB;AACA,QAAA,IAAA,EAAK;AAAA,MACP,CAAA;AAAA,MACA,KAAA,EAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC9B;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,GAAA,CAAI,MAAA,EAAQ,OAAA,GAAU,EAAC,EAAG;AACxB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AACpB,QAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,MAC9E;AACA,MAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,OAAA,CAAQ,YAAY,KAAK,CAAA;AAClD,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,KAAA,CAAM,MAAA;AACrC,MAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAA,CAAM,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC7D,MAAA,IAAA,EAAK;AACL,MAAA,OAAO,CAAA,CAAE,MAAA;AAAA,IACX,CAAA;AAAA,IACA,OAAO,MAAM,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,IACtC,KAAA,GAAQ;AACN,MAAA,KAAA,MAAW,KAAK,CAAC,GAAG,KAAK,CAAA,EAAG,CAAA,CAAE,OAAO,MAAA,EAAO;AAAA,IAC9C,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,OAAW,IAAA,EAAM,OAAO,QAAQ,OAAA,EAAQ;AACrD,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAAE,QAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,MAAG,CAAC,CAAA;AAAA,IAC5D;AAAA,GACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAA,IAAS;AACT,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAM,IAAA,GAAO,OAAA;AACb,MAAA,OAAA,GAAU,EAAC;AACX,MAAA,KAAA,MAAW,CAAA,IAAK,MAAM,CAAA,EAAE;AAAA,IAC1B;AAAA,GACF;AACF;;;ACxQO,SAAS,cAAA,CACd,GAAA,EACA,KAAA,EACA,IAAA,GAAwB,EAAC,EACf;AACV,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,WAAW,CAAA;AAE9B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,EAAW;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,EAAW;AAC5B,IAAA,IAAA,CAAK,QAAQ,MAAM,CAAA;AACnB,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,EAAK,KAAA,EAAO,MAAM,IAAI,CAAA;AACxD,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,YAAY,MAAe;AAC/B,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,MAAA,IAAU,IAAI,CAAA,CAAE,QAAQ,OAAO,IAAA;AACtD,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,EAAa,OAAA,KACjC,CAAC,CAAA,CAAE,KAAA,KAAU,CAAC,OAAA,IAAW,CAAA,CAAE,MAAA,CAAA;AAI7B,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAA+C;AAC5D,IAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,MAAA,EAAO,EAAG;AAC/B,MAAA,MAAM,QAAQ,YAAA,CAAa,CAAA,EAAG,OAAO,CAAA,GAAI,EAAE,IAAA,GAAO,CAAA;AAClD,MAAA,UAAA,CAAW,GAAA,EAAK,CAAA,CAAE,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,MAAM,GAAA,KAAQ,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,MAAS,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAA2B;AACtC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,KAAA,EAAO,CAAC,IAAA,KAAS,GAAA,CAAI,IAAI,CAAA,CAAE,KAAA;AAAA,IAC3B,IAAA,EAAM,CAAC,IAAA,KAAS,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA;AAAA,IAC1B,OAAO,MAAM,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9B,OAAA,GAAU;AACR,MAAA,KAAA,MAAW,KAAK,MAAA,CAAO,MAAA,EAAO,EAAG,CAAA,CAAE,QAAQ,OAAA,EAAQ;AAAA,IACrD,CAAA;AAAA,IACA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,CAAA,GAAI,IAAI,IAAI,CAAA;AAClB,MAAA,OAAO;AAAA,QACL,OAAA,CAAQ,OAAO,MAAA,EAAQ;AACrB,UAAA,CAAA,CAAE,IAAA,GAAO,KAAA;AACT,UAAA,KAAA,CAAM,MAAA,IAAU,SAAS,CAAA,GAAI,EAAE,KAAK,CAAA,EAAG,EAAA,EAAI,MAAA,EAAO,GAAI,MAAS,CAAA;AAAA,QACjE,CAAA;AAAA,QACA,KAAK,EAAA,EAAI;AAAE,UAAA,CAAA,CAAE,KAAA,GAAQ,EAAA;AAAI,UAAA,KAAA,EAAM;AAAA,QAAG,CAAA;AAAA,QAClC,KAAK,EAAA,EAAI;AAAE,UAAA,CAAA,CAAE,MAAA,GAAS,EAAA;AAAI,UAAA,KAAA,EAAM;AAAA,QAAG,CAAA;AAAA,QACnC,IAAA,EAAM,MAAM,CAAA,CAAE,IAAA;AAAA,QACd,KAAA,EAAO,MAAM,CAAA,CAAE,KAAA;AAAA,QACf,MAAA,EAAQ,MAAM,CAAA,CAAE,MAAA;AAAA,QAChB,OAAA,EAAS,MAAM,YAAA,CAAa,CAAA,EAAG,WAAW,CAAA;AAAA,QAC1C,OAAA,EAAS,EAAE,OAAA,CAAQ;AAAA,OACrB;AAAA,IACF;AAAA,GACF;AACF;;;AC1GO,SAAS,QAAA,CACd,KAAA,EACA,IAAA,EACA,EAAA,EACA,IAAA,EACkB;AAClB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAAE,EAAA,KAAO,EAAA,IAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACrG;AAEO,IAAM,OAAA,GAAU,CAAC,CAAA,EAAS,CAAA,KAA4B,EAAE,IAAA,KAAS,CAAA,IAAK,EAAE,EAAA,KAAO,CAAA;AAG/E,IAAM,OAAA,GAAU,CAAC,CAAA,KAAqB,CAAA,CAAE,KAAA,KAAU,SAAA;AAElD,IAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB,CAAA,CAAE,KAAA,KAAU,UAAA;AAGhD,SAAS,QACd,KAAA,EACA,KAAA,EACA,IAAA,EACA,KAAA,GAA2B,MAAM,IAAA,EACxB;AACT,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAO;AACxB,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAK,CAAA;AACpB,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,MAAM,GAAA,EAAI;AACpB,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,IAAA;AACvB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,IAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,CAAA,IAAK,EAAE,EAAA,KAAO,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,EAAE,EAAE,CAAA;AAAA,EACvF;AACA,EAAA,OAAO,KAAA;AACT;AAGO,IAAM,OAAA,GAAU,CAAC,KAAA,EAAwB,CAAA,KAC9C,CAAA,CAAE,EAAA,KAAO,IAAA,IAAQ,OAAA,CAAQ,KAAA,EAAO,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,MAAM,KAAK,CAAA;AAG9C,SAAS,IAAA,CAAK,OAAe,CAAA,EAAe;AACjD,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AACzB,EAAA,IAAI,CAAA,IAAK,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC/B;;;AC/CO,SAAS,WAAA,CACd,GAAA,EACA,MAAA,EACA,IAAA,EACA,EAAA,EACO;AACP,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,EAAW;AAC5B,EAAA,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAC3B,EAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AACjB,EAAA,IAAA,CAAK,QAAQ,EAAE,CAAA;AAEf,EAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAgB;AAElC,EAAA,MAAM,MAAM,MAAY;AACtB,IAAA,MAAA,IAAS;AACT,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAK,EAAA,EAAI;AACP,MAAA,UAAA,CAAW,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,KAAA,CAAM,IAAI,IAAA,EAAM;AACd,MAAA,IAAI,QAAQ,IAAA,IAAO;AACnB,MAAA,IAAI,UAAU,OAAA,EAAS;AACvB,MAAA,IAAI,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACxB,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,KAAU,SAAA,GAAY,EAAA,GAAK,CAAA;AAC9C,MAAA,UAAA,CAAW,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AACpC,MAAA,MAAA,GAAS,YAAY,GAAA,EAAK,MAAA,EAAQ,IAAI,WAAA,GAAc,MAAA,GAAS,KAAM,MAAM;AACvE,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,GAAA,EAAI;AACJ,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,MAAM,GAAA,GAAM,CAAC,GAAG,KAAK,CAAA;AACrB,QAAA,KAAA,CAAM,KAAA,EAAM;AACZ,QAAA,KAAA,MAAW,CAAA,IAAK,KAAK,CAAA,EAAE;AAAA,MACzB,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChCO,SAAS,aAAA,CACd,GAAA,EACA,MAAA,EACA,EAAA,EACA,GAAA,EACa;AACb,EAAA,MAAM,MAAgC,EAAC;AACvC,EAAA,MAAM,WAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1C,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,UAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,IAAI,CAAA,GAAI,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AACrE,IAAA,QAAA,CAAS,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAAA,EACvB;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,EAAW;AAC3B,EAAA,MAAM,WAAW,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA;AACzD,EAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AACf,EAAA,OAAO,EAAE,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,KAAK,QAAA,EAAU,IAAA,kBAAM,IAAI,GAAA,IAAO,OAAA,EAAS,KAAA,EAAO,QAAA,kBAAU,IAAI,KAAI,EAAE;AACvG;AAEO,SAAS,UAAA,CAAW,GAAA,EAAuB,CAAA,EAAgB,IAAA,EAAwC;AACxG,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,EAAK,CAAA,CAAE,KAAK,IAAI,CAAA;AAChD,EAAA,MAAM,CAAA,GAAiB;AAAA,IACrB,GAAG,KAAA;AAAA,IACH,OAAA,GAAU;AACR,MAAA,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA;AACf,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAChB;AAAA,GACF;AACA,EAAA,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACZ,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,YAAA,CAAa,GAAgB,IAAA,EAAoB;AAC/D,EAAA,MAAM,EAAE,KAAI,GAAI,CAAA;AAChB,EAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAC,GAAA,CAAI,KAAA,EAAO;AAC7B,EAAA,CAAA,CAAE,OAAA,GAAU,IAAA;AACZ,EAAA,GAAA,CAAI,KAAA,CAAM,MAAM,MAAM;AACpB,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,CAAA,CAAE,OAAA,GAAU,KAAA;AAAA,EACjC,CAAC,CAAA;AACH;AAGO,SAAS,WAAA,CAAY,GAAgB,IAAA,EAAoB;AAC9D,EAAA,KAAA,MAAW,CAAA,IAAK,EAAE,QAAA,EAAU;AAC1B,IAAA,IAAI,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,OAAO,IAAI,CAAA;AAChC,IAAA,CAAA,CAAE,OAAA,GAAU,KAAA;AAAA,EACd;AACA,EAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AAChB,EAAA,CAAA,CAAE,OAAA,GAAU,KAAA;AACZ,EAAA,CAAA,CAAE,GAAA,CAAI,OAAO,IAAI,CAAA;AACnB;AAGO,SAAS,eAAA,CAAgB,CAAA,EAAgB,CAAA,EAAa,IAAA,EAAoB;AAC/E,EAAA,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA;AACnB,EAAA,IAAI,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,OAAO,IAAI,CAAA;AAChC,EAAA,CAAA,CAAE,OAAA,GAAU,KAAA;AACZ,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,EAAI;AAChC,EAAA,CAAA,CAAE,IAAI,OAAA,IAAU;AAClB;AAIO,SAAS,cAAA,CAAe,GAAgB,IAAA,EAAoB;AACjE,EAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AAC3D,EAAA,WAAA,CAAY,GAAG,IAAI,CAAA;AACnB,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,MAAA,CAAO,EAAE,QAAQ,CAAA,IAAK,GAAA,EAAI;AACjD,EAAA,CAAA,CAAE,SAAS,GAAA,EAAI;AACf,EAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAA,EAAQ;AAClC,EAAA,CAAA,CAAE,KAAK,KAAA,EAAM;AACb,EAAA,CAAA,CAAE,IAAI,OAAA,IAAU;AAClB;;;ACtFO,SAAS,WACd,GAAA,EACA,MAAA,EACA,GACA,IAAA,EACA,EAAA,EACA,SACA,KAAA,EACM;AACN,EAAA,MAAM,GAAA,GAAgB;AAAA,IACpB,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA;AAAA,IACjD,SAAS,CAAA,CAAE;AAAA,GACb;AACA,EAAA,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AAElB,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA,EAAG;AACrC,IAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,KAAK,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC7D,IAAA,KAAA,CAAM,UAAU,IAAI,CAAA;AACpB,IAAA,OAAO,CAAA,CAAE,IAAI,IAAI,CAAA;AACjB,IAAA,OAAO,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACxB;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AAC3C,IAAA,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,KAAM,GAAA,CAAI,UAAA,EAAW;AAC/B,IAAA,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,GAAI,SAAA,CAAU,KAAK,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAI,GAAG,EAAE,CAAA;AAAA,EAC9E;AACA,EAAA,CAAA,CAAE,QAAA,GAAW,UAAU,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA,EAAQ,CAAA,CAAE,KAAK,EAAE,CAAA;AAC1D,EAAA,CAAA,CAAE,GAAA,GAAM,IAAA;AACR,EAAA,CAAA,CAAE,OAAA,GAAU,KAAA;AACZ,EAAA,IAAI,OAAA,EAAS,YAAA,CAAa,CAAA,EAAG,GAAA,CAAI,WAAW,CAAA;AAE5C,EAAA,IAAI,IAAA,GAAO,IAAI,MAAA,CAAO,MAAA;AACtB,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,CAAA,CAAE,KAAA,CAAM,IAAI,MAAM;AAChB,MAAA,IAAA,IAAQ,CAAA;AACR,MAAA,IAAI,OAAO,CAAA,IAAK,CAAC,EAAE,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,MAAA,eAAA,CAAgB,CAAA,EAAG,GAAA,EAAK,GAAA,CAAI,WAAW,CAAA;AACvC,MAAA,KAAA,CAAM,QAAA,EAAS;AAAA,IACjB,CAAC,CAAA;AAAA,EACH;AACF;AAEA,SAAS,SAAA,CACP,GAAA,EACA,MAAA,EACA,IAAA,EACA,IACA,EAAA,EACO;AACP,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,MAAM,EAAE,CAAA;AAC3C,EAAA,CAAA,CAAE,KAAK,EAAE,CAAA;AACT,EAAA,OAAO,CAAA;AACT;;;ACtEO,IAAM,aAAa,CAAC,GAAA,KAAuB,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAE/E,IAAM,IAAA,GAAO,CAAC,GAAA,EAAa,GAAA,KAAyB,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAEjG,IAAM,SAAS,CAAC,EAAA,KAAsB,UAAA,CAAW,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA,CAAG,CAAA;AAClE,IAAM,gBAAgB,CAAC,EAAA,KAAsB,UAAA,CAAW,CAAA,QAAA,EAAW,EAAE,CAAA,gBAAA,CAAkB,CAAA;AACvF,IAAM,MAAA,GAAS,CAAC,EAAA,EAAY,IAAA,KACjC,WAAW,CAAA,MAAA,EAAS,EAAE,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAG,CAAA;AAChD,IAAM,OAAA,GAAU,CAAC,EAAA,EAAY,KAAA,KAClC,WAAW,CAAA,MAAA,EAAS,EAAE,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,CAAG,CAAA;AAC5C,IAAM,WAAA,GAAc,CAAC,IAAA,EAAc,EAAA,KACxC,WAAW,CAAA,YAAA,EAAe,IAAI,CAAA,MAAA,EAAS,EAAE,CAAA,qBAAA,CAAuB,CAAA;;;ACYlE,SAAS,MAAA,CAAO,MAAmC,EAAA,EAA+C;AAChG,EAAA,IAAI,QAAA,IAAY,EAAA,EAAI,OAAO,CAAC,MAAM,EAAE,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA;AACtB,EAAA,IAAI,CAAC,IAAA,CAAK,CAAA,CAAE,GAAA,EAAK,EAAA,CAAG,IAAI,CAAA,EAAG,MAAM,MAAA,CAAO,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,IAAI,CAAA;AACxD,EAAA,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA;AACpB;AAIO,SAAS,YAAY,IAAA,EAAiB;AAC3C,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAO,GAAI,IAAA;AACtC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAE3C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAiB;AACrC,EAAA,MAAM,QAAgB,EAAC;AAEvB,EAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAA4B;AACxC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACtB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,MAAA,CAAO,EAAE,CAAA;AACvB,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAkB;AAC9B,IAAA,CAAA,CAAE,KAAA,GAAQ,MAAA;AACV,IAAA,CAAA,CAAE,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,EAAE,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,EAAA,GAAK,EAAE,EAAA,CAAG,GAAA,CAAI,CAAA,CAAE,IAAI,IAAI,MAAM,CAAA;AAC/E,IAAA,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,EACrB,CAAA;AAGA,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,CAAA,CAAE,KAAA,KAAU,UAAA,IAAc,CAAC,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAC/E,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAG,OAAO,CAAA,EAAG;AAC5B,MAAA,IAAI,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,QAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG;AACtC,MAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAChB,MAAA,cAAA,CAAe,CAAA,EAAG,IAAI,WAAW,CAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,IAAA,IAAI,CAAA,CAAE,UAAU,SAAA,EAAW;AAC3B,IAAA,IAAI,CAAA,CAAE,UAAU,UAAA,EAAY;AAC1B,MAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,CAAA,CAAE,KAAA,GAAQ,SAAA;AACV,IAAA,CAAA,CAAE,KAAA,CAAO,KAAA,CAAM,IAAA,EAAK,EAAG,MAAM;AAC3B,MAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AACb,MAAA,KAAA,EAAM;AAAA,IACR,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,GAAA,EAAK,CAAC,EAAA,KAAe,KAAA,CAAM,IAAI,EAAE,CAAA;AAAA,IACjC,KAAK,MAAM,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA;AAAA,IAC3B,WAAW,MAAM,CAAC,GAAG,KAAA,CAAM,QAAQ,CAAA;AAAA;AAAA,IAEnC,QAAA,EAAU,MAAM,CAAC,GAAG,MAAM,MAAA,EAAO,EAAG,GAAG,OAAO,CAAA;AAAA;AAAA,IAE9C,MAAM,OAAkB;AAAA,MACtB,KAAA,EAAO,IAAI,GAAA,CAAI,CAAC,GAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,CAAC,MAAM,CAAC,EAAA,EAAI,EAAE,KAAA,EAAO,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAC,CAAA;AAAA,MAC9G,KAAA,EAAO,MAAM,MAAA,CAAO,OAAO,EAAE,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,EAAE,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA,CAAE,EAAA,EAAI,MAAM,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,CAAE;AAAA,KACnG,CAAA;AAAA;AAAA,IAEA,IAAA,EAAM,MACJ,KAAA,CAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA,IACpC,CAAC,GAAG,MAAM,MAAA,EAAO,EAAG,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA;AAAA,IACjE,GAAA,CAAI,IAAY,GAAA,EAAyB;AACvC,MAAA,IAAI,MAAM,GAAA,CAAI,EAAE,CAAA,EAAG,MAAM,cAAc,EAAE,CAAA;AACzC,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,EAAK,MAAA,EAAQ,IAAI,GAAG,CAAA;AAC5C,MAAA,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AACf,MAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACd,CAAA;AAAA,IACA,OAAO,EAAA,EAAkB;AACvB,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACtB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AACf,MAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AACb,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AAC3D,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AAAA;AAAA,IAEA,OAAA,CAAQ,EAAA,EAAY,GAAA,EAAmB,OAAA,EAAwB;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAK,EAAE,CAAA;AACjB,MAAA,UAAA,CAAW,KAAK,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,IAAA,IAAQ,OAAA,EAAS;AAAA,QAC/C,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,UAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,QAAS,CAAC,CAAA;AAAA,QAC7E,CAAA;AAAA,QACA,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AACD,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAA;AAAA,IACA,OAAA,CAAQ,MAAc,EAAA,EAAuB;AAC3C,MAAA,MAAM,CAAA,GAAI,KAAK,IAAI,CAAA;AACnB,MAAA,MAAM,CAAC,EAAA,EAAI,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,EAAE,CAAA;AAClC,MAAA,IAAI,QAAA,CAAS,KAAA,EAAO,CAAA,EAAG,EAAA,EAAI,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,MAAM,OAAA,CAAQ,KAAA,EAAO,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA,EAAG;AACxC,QAAA,MAAM,WAAA,CAAY,IAAA,EAAM,EAAA,CAAG,EAAE,CAAA;AAAA,MAC/B;AACA,MAAA,MAAM,CAAA,GAAU,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,IAAI,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,IAAA,EAAK;AACxE,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA,OAAQ,CAAC,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,UAAA,CAAW,MAAc,EAAA,EAAuB;AAC9C,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACxB,MAAA,MAAM,KAAK,QAAA,IAAY,EAAA,GAAK,OAAO,KAAA,CAAM,GAAA,CAAI,GAAG,IAAI,CAAA;AACpD,MAAA,IAAI,CAAC,CAAA,IAAK,EAAA,KAAO,MAAA,EAAW;AAC5B,MAAA,MAAM,CAAA,GAAI,SAAS,KAAA,EAAO,CAAA,EAAG,IAAI,QAAA,IAAY,EAAA,GAAK,EAAA,GAAK,EAAA,CAAG,IAAI,CAAA;AAC9D,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,KAAA,CAAM,CAAC,CAAA;AACP,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAA;AAAA,IACA,GAAA,CAAI,EAAA,EAAY,KAAA,EAAe,KAAA,EAAe,MAAA,EAAuB;AACnE,MAAA,MAAM,CAAA,GAAI,KAAK,EAAE,CAAA;AACjB,MAAA,IAAI,CAAC,IAAA,CAAK,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG,MAAM,OAAA,CAAQ,EAAA,EAAI,KAAK,CAAA;AACvD,MAAA,CAAA,CAAE,IAAI,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,MAAA,IAAU,MAAM,CAAA;AAAA,IAC7C,CAAA;AAAA;AAAA,IAEA,OAAA,GAAgB;AACd,MAAA,KAAA,MAAW,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,CAAE,OAAO,GAAA,EAAI;AAC9C,MAAA,MAAM,MAAM,CAAC,GAAG,MAAM,MAAA,EAAO,EAAG,GAAG,OAAO,CAAA;AAC1C,MAAA,KAAA,CAAM,KAAA,EAAM;AACZ,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,KAAA,MAAW,CAAA,IAAK,GAAA,EAAK,cAAA,CAAe,CAAA,EAAG,IAAI,WAAW,CAAA;AAAA,IACxD;AAAA,GACF;AACF;;;ACnIO,SAAS,gBAAgB,IAAA,EAAqB;AACnD,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAO,GAAI,IAAA;AAChC,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,IAAI,MAAA,GAA8B,IAAA;AAGlC,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAe,IAAA,KAA2B;AAC5D,IAAA,MAAA,IAAS;AACT,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,IAAA,UAAA,CAAW,GAAA,EAAK,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,EAAE,CAAA;AACtC,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,MAAM,CAAA,GAAI,YAAY,GAAA,EAAK,MAAA,EAAQ,IAAI,WAAA,GAAc,EAAA,GAAK,KAAM,MAAM;AACpE,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,IAAA,EAAK;AACL,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,IAAI,SAAS,MAAA,GAAS,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,MAAM,OAAA;AAAA;AAAA,IAEf,IAAA,EAAM,MAAM,MAAA,KAAW,IAAA;AAAA,IACvB,KAAA,GAAc;AACZ,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,UAAA,CAAW,GAAG,MAAM;AAAA,MAAC,CAAC,CAAA;AACtB,MAAA,KAAA,MAAW,KAAK,IAAA,CAAK,IAAA,IAAQ,YAAA,CAAa,CAAA,EAAG,IAAI,WAAW,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,IAAA,GAAa;AACX,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,UAAA,CAAW,GAAG,MAAM;AAClB,QAAA,KAAA,MAAW,KAAK,IAAA,CAAK,GAAA,IAAO,WAAA,CAAY,CAAA,EAAG,IAAI,WAAW,CAAA;AAAA,MAC5D,CAAC,CAAA;AAAA,IACH,CAAA;AAAA;AAAA,IAEA,OAAA,EAAS,MAAM,OAAA,IAAW,MAAA,KAAW,IAAA;AAAA;AAAA,IAErC,QAAQ,IAAA,EAAwB;AAC9B,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,UAAA,CAAW,GAAG,IAAI,CAAA;AAAA,IACpB,CAAA;AAAA;AAAA,IAEA,OAAA,GAAgB;AACd,MAAA,MAAA,IAAS;AACT,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,OAAA,GAAU,KAAA;AAAA,IACZ;AAAA,GACF;AACF;;;ACnDO,IAAM,QAAA,GAAW,CAAC,GAAA,MAAiC;AAAA,EACxD,OAAO,IAAI,GAAA,CAAI,OAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EACtC,QAAQ,GAAA,CAAI;AACd,CAAA,CAAA;AAEA,IAAM,OAAO,CAAC,EAAA,KAAoC,QAAA,IAAY,EAAA,GAAK,OAAO,EAAA,CAAG,IAAA;AAC7E,IAAM,SAAS,CAAC,EAAA,KAA6B,QAAA,IAAY,EAAA,GAAK,KAAK,EAAA,CAAG,IAAA;AAM/D,SAAS,eAAA,CAAgB,MAAiB,OAAA,EAAsC;AACrF,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAChC,EAAA,IAAI,KAAA,GAAQ,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAyB;AACrC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACtB,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,MAAA,CAAO,EAAE,CAAA;AACvB,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,OAAO,CAAC,CAAA,EAAa,IAAA,EAAc,EAAA,KACvC,EAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,OAAO,EAAE,CAAA;AAE9D,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,KAAA;AACH,QAAA,IAAI,KAAA,CAAM,IAAI,CAAA,CAAE,EAAE,GAAG,MAAM,aAAA,CAAc,EAAE,EAAE,CAAA;AAC7C,QAAA,KAAA,CAAM,IAAI,CAAA,CAAE,EAAA,EAAI,QAAA,CAAS,CAAA,CAAE,GAAG,CAAC,CAAA;AAC/B,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,UAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,CAAA,CAAE,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,EAAE,CAAA;AACpF,QAAA;AAAA,MACF,KAAK,SAAA,EAAW;AACd,QAAA,IAAA,CAAK,EAAE,EAAE,CAAA;AACT,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AACxB,QAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACjB,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAChE,QAAA;AAAA,MACF;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,IAAA,CAAK,EAAE,IAAI,CAAA;AACX,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AACpB,QAAA,IAAI,OAAO,IAAA,IAAQ,CAAC,KAAK,EAAE,CAAA,CAAE,MAAM,GAAA,CAAI,MAAA,CAAO,EAAE,EAAE,CAAC,GAAG,MAAM,MAAA,CAAO,IAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA;AACnF,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG;AAC9C,QAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,OAAA,CAAQ,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAG,MAAM,WAAA,CAAY,CAAA,CAAE,IAAA,EAAM,EAAE,CAAA;AAC3E,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAG,CAAA;AACnD,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA;AACH,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,KAAK,GAAG,MAAM,OAAA,CAAQ,CAAA,CAAE,EAAA,EAAI,EAAE,KAAK,CAAA;AAClE,QAAA;AAAA;AACJ,EACF;AACF;;;AClEA,IAAM,SAAA,uBAAgB,OAAA,EAAgC;AAG/C,SAAS,WAAW,KAAA,EAAyB;AAClD,EAAA,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,IAAI;AACzB;AAOO,SAAS,gBAAA,CACd,GAAA,EACA,WAAA,EACA,IAAA,GAA0B,EAAC,EACf;AACZ,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,EAAA;AAC9B,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,aAAA,CAAc,QAAA;AAAA,IACzC,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,aAAA,CAAc;AAAA,GAC/C;AACA,EAAA,MAAM,IAAA,GAAO,MAAe,GAAA,CAAI,KAAA,KAAU,YAAY,MAAA,GAAS,CAAA;AAE/D,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,SAAA,CAAU,GAAA,EAAK,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AAC7B,EAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AAE1B,EAAA,IAAI,UAA0B,EAAC;AAC/B,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,IAAI,CAAC,IAAA,KAAS,KAAA,CAAM,MAAK,IAAK,SAAA,CAAU,MAAK,CAAA,EAAI;AACjD,IAAA,MAAM,IAAA,GAAO,OAAA;AACb,IAAA,OAAA,GAAU,EAAC;AACX,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,CAAA,EAAE;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,QAAQ,WAAA,CAAY;AAAA,IACxB,GAAA;AAAA,IAAK,MAAA;AAAA,IAAQ,IAAA;AAAA,IAAM,MAAA;AAAA,IAAQ,QAAA;AAAA,IAC3B,KAAA,EAAO,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,UAAU,OAAA,EAAQ,EAAG,YAAA,CAAa,CAAA,EAAG,IAAI,WAAW,CAAA;AAAA,IAAG;AAAA,GAC5E,CAAA;AACD,EAAA,MAAM,YAAY,eAAA,CAAgB;AAAA,IAChC,GAAA;AAAA,IAAK,MAAA;AAAA,IAAQ,IAAA;AAAA,IAAM,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,MAAM,KAAA,CAAM,SAAA;AAAA,IAAW,KAAK,KAAA,CAAM;AAAA,GACxE,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,CAAyB,CAAA,KAAyB,CAAA,GAAI,IAAA,KAAe;AACjF,IAAA,IAAI,QAAA,EAAU,MAAM,UAAA,CAAW,mBAAmB,CAAA;AAClD,IAAA,OAAO,CAAA,CAAE,GAAG,IAAI,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,KAAA,GAAoB;AAAA,IACxB,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAAA,IACpB,MAAA,EAAQ,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAAA,IAC1B,OAAA,EAAS,KAAA,CAAM,CAAC,EAAA,EAAY,GAAA,KAA4B;AACtD,MAAA,KAAA,CAAM,OAAA,CAAQ,EAAA,EAAI,GAAA,EAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,IACD,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AAAA,IAC5B,UAAA,EAAY,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA;AAAA,IAClC,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAAA,IACpB,KAAA,EAAO,KAAA,CAAM,CAAC,OAAA,KAAyC;AACrD,MAAA,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,CAAA;AACrC,MAAA,IAAI,MAAA,GAAoC,IAAA;AACxC,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,QAAQ,EAAE,IAAA;AAAM,UACd,KAAK,KAAA;AAAO,YAAA,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,GAAG,CAAA;AAAG,YAAA;AAAA,UACpC,KAAK,QAAA;AAAU,YAAA,KAAA,CAAM,MAAA,CAAO,EAAE,EAAE,CAAA;AAAG,YAAA;AAAA,UACnC,KAAK,SAAA;AAAW,YAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,GAAG,CAAA;AAAG,YAAA;AAAA,UAC5C,KAAK,SAAA;AAAW,YAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAA;AAAG,YAAA;AAAA,UAC7C,KAAK,YAAA;AAAc,YAAA,KAAA,CAAM,UAAA,CAAW,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAA;AAAG,YAAA;AAAA,UACnD,KAAK,KAAA;AACH,YAAA,IAAI;AACF,cAAA,KAAA,CAAM,GAAA,CAAI,EAAE,EAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,YAC5C,SAAS,KAAA,EAAO;AACd,cAAA,MAAA,KAAW,EAAE,KAAA,EAAM;AAAA,YACrB;AACA,YAAA;AAAA;AACJ,MACF;AACA,MAAA,IAAI,MAAA,QAAc,MAAA,CAAO,KAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,IACD,KAAA,EAAO,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AAAA,IAC5B,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,IAC1B,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,GAAA,EAAK,KAAA,CAAM,CAAC,EAAA,EAAY,OAAA,KACtB,UAAA,CAAW,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IAC1C,OAAA,GAAU;AACR,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,QAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACpB,QAAA,QAAA,EAAS;AAAA,MACX,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAI,GAAA,CAAI,UAAU,SAAA,IAAa,SAAA,CAAU,SAAQ,EAAG,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,WACzE,QAAA,EAAS;AAAA,IAChB;AAAA,GACF;AACA,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,SAAA,CAAU,OAAA,EAAQ;AAClB,IAAA,KAAA,CAAM,OAAA,EAAQ;AACd,IAAA,MAAA,CAAO,UAAA,EAAW;AAClB,IAAA,QAAA,EAAS;AAAA,EACX,CAAA;AACA,EAAA,SAAA,CAAU,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC7B,EAAA,OAAO,KAAA;AACT;;;AClHO,SAAS,iBAAA,CACd,KACA,KAAA,EAOa;AACb,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,UAAA,GAAa,CAAA,QAAA;AAKjB,EAAA,MAAM,WAAW,CAAC,aAAA,EAAe,WAAA,EAAa,UAAA,EAAY,SAAS,SAAS,CAAA;AAC5E,EAAA,MAAM,YAAY,MAAY;AAAE,IAAA,KAAK,KAAA,CAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAAG,CAAA;AAC5E,EAAA,MAAM,MAAM,MAAY;AACtB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,KAAA,MAAW,CAAA,IAAK,UAAU,MAAA,CAAO,gBAAA,CAAiB,GAAG,SAAA,EAAW,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACnF,CAAA;AACA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,MAAA,CAAO,mBAAA,CAAoB,GAAG,SAAS,CAAA;AAAA,EACnE,CAAA;AACA,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,SAAA,EAAW,GAAA,EAAI;AAMjC,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,MAAA,MAAA,EAAO;AACP,MAAA,IAAI,cAAA,EAAgB,UAAA,GAAa,KAAA,CAAM,GAAA,EAAI;AAC3C,MAAA,cAAA,GAAiB,KAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,KAAA,CAAM,SAAA,EAAU;AAChB,IAAA,GAAA,EAAI;AAAA,EACN,CAAA;AACA,EAAA,GAAA,CAAI,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,YAAY,MAAM,UAAA;AAAA,IAClB,OAAA,GAAU;AACR,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAA,EAAO;AACP,MAAA,GAAA,CAAI,mBAAA,CAAoB,eAAe,aAAa,CAAA;AAAA,IACtD;AAAA,GACF;AACF;;;ACFO,SAAS,gBAAgB,IAAA,EAAmC;AACjE,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACpC,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AAClC,EAAA,IAAI,QAAiB,EAAC;AACtB,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,MAAA,GAAkB,IAAA;AAEtB,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,UAAU,GAAA,GAAM,SAAA;AACtB,IAAA,MAAM,MAAe,EAAC;AACtB,IAAA,MAAM,OAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,CAAC,KAAA,CAAM,QAAQ,OAAA,GAAU,GAAA,GAAM,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA;AAC1E,IAAA,KAAA,GAAQ,IAAA;AACR,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAClC,IAAA,KAAA,MAAW,SAAS,GAAA,EAAK;AACvB,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,IAAA,GAAO,GAAA,EAAK,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAChF,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACvB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,GAAG,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,OAAA,EAAQ;AACR,IAAA,IAAI,OAAA,EAAS,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAM,QAAQ,CAAA;AAAA,EACpD,CAAA;AAIA,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,WAAA,GAAc,KAAA;AACd,IAAA,IAAI,SAAS,OAAA,EAAQ;AAAA,EACvB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,GAAQ;AACN,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,IAAA,GAAO;AACL,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AACtB,MAAA,MAAA,GAAS,IAAA;AAAA,IACX,CAAA;AAAA,IACA,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW;AACnC,MAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,QAAQ,MAAA,IAAU,SAAA,EAAW,UAAA,KAAe,KAAA,EAAO,CAAA;AACjF,MAAA,IAAI,OAAA,IAAW,CAAC,WAAA,IAAe,CAAC,MAAA,EAAQ;AACtC,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,UAAU,GAAA,EAAK;AACb,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,KAAA,GAAQ,EAAC;AAAA,IACX,CAAA;AAAA,IACA,OAAA,EAAS,MAAM,KAAA,CAAM;AAAA,GACvB;AACF;;;AChHO,SAAS,gBAAA,CACd,GAAA,EACA,OAAA,GAAwB,KAAA,EACZ;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAC7C,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAE3C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAkC;AAEvD,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAqC;AAClD,IAAA,MAAM,EAAA,GAAK,CAAA,IAAA,EAAO,EAAE,OAAO,CAAA,CAAA;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,MAAM,CAAA;AACtB,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd,CAAA;AAEA,EAAA,MAAMC,MAAAA,GAAoB;AAAA,IACxB,MAAM,KAAK,GAAA,EAAK;AACd,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC9B,MAAA,IAAI,UAAU,OAAO,QAAA;AACrB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,MAAA,MAAM,QAAQ,YAAY;AACxB,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,GAAG,CAAA,EAAA,EAAK,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AACtF,QAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,WAAA,EAAY;AACpC,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,eAAA,CAAgB,KAAK,CAAA;AAC9C,QAAA,MAAM,MAAA,GAAS,MAAM,MAAM,CAAA;AAC3B,QAAA,KAAA,CAAM,GAAA,CAAI,KAAK,MAAM,CAAA;AACrB,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,GAAG;AAEH,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,IAAI,CAAA;AACtB,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,IAAA;AAAA,MACf,CAAA,SAAE;AAGA,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,IACA,MAAM,QAAQ,IAAA,EAAM;AAClB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,GAAA,CAAI,CAAC,CAAA,KAAMA,MAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvE,MAAA,OAAO,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,IAChE,CAAA;AAAA,IACA,MAAM,OAAO,KAAA,EAAO;AAClB,MAAA,OAAO,KAAA,CAAM,MAAM,GAAA,CAAI,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,MAAA,KAAW,KAAA,CAAM,MAAM,CAAA;AAAA,IAClC,QAAQ,CAAC,MAAA,KAAW,QAAQ,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,IAAK;AAAA,GAChD;AACA,EAAA,OAAOA,MAAAA;AACT;;;ACvDA,SAAS,WAAA,CACP,GAAA,EAAuB,MAAA,EAAgB,EAAA,EAAsB,MAAiB,IAAA,EAClE;AACZ,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAI,UAAA,GAAkC,IAAA;AACtC,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,KAAA,GAAQ,IAAA;AACR,IAAA,UAAA,IAAa;AACb,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,EAAA,CAAG,mBAAA,CAAoB,SAAS,MAAM,CAAA;AACtC,IAAA,EAAA,CAAG,mBAAA,CAAoB,SAAS,MAAM,CAAA;AAGtC,IAAA,cAAA,CAAe,MAAO,IAAA,CAAK,OAAA,IAAmC,CAAA;AAAA,EAChE,CAAA;AACA,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,OAAA,EAAS,IAAA;AAAA,IACT,KAAK,IAAA,EAAe;AAClB,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,UAAA,IAAa;AACb,MAAA,UAAA,GAAa,IAAA,KAAS,MAAA,IAAa,IAAA,GAAO,GAAA,CAAI,WAAA,GAC1C,YAAY,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA,GACrC,IAAA;AACJ,MAAA,IAAI,CAAC,YAAY,MAAA,EAAO;AAAA,IAC1B,CAAA;AAAA,IACA,UAAA,GAAa;AACX,MAAA,IAAI;AAAE,QAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAkB;AAAA,IACzD;AAAA,GACF;AACA,EAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,MAAM,CAAA;AACnC,EAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,MAAM,CAAA;AACnC,EAAA,EAAA,CAAG,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,GAAA,KAAiB;AAChC,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kDAAA,EAAgD,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAC1E,IAAA,MAAA,EAAO;AAAA,EACT,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,oBAAA,CAAqB,KAAmB,MAAA,EAAgC;AAGtF,EAAA,MAAM,YAAA,uBAAmB,OAAA,EAAuD;AAChF,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,OAAO,IAAA,EAAM;AACnB,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,MAAA,MAAM,EAAA,GAAK,IAAI,KAAA,EAAM;AACrB,MAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,MAAA,EAAW,EAAA,CAAG,cAAc,IAAA,CAAK,WAAA;AAC1D,MAAA,EAAA,CAAG,OAAA,GAAU,MAAA;AACb,MAAA,EAAA,CAAG,GAAA,GAAM,KAAA;AACT,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,OAAA,CAAQ,IAAI,IAAA,EAAM;AAChB,MAAA,OAAO;AAAA,QACL,OAAO,MAAM,IAAA;AAAA,QACb,MAAM,KAAA,EAAO;AACX,UAAA,IAAI,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,IAAA,GAAO,GAAA,CAAI,yBAAyB,EAAE,CAAA;AACtC,YAAA,YAAA,CAAa,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,UAC3B;AACA,UAAA,EAAA,CAAG,IAAA,GAAO,KAAK,IAAA,IAAQ,KAAA;AACvB,UAAA,IAAI,KAAK,MAAA,KAAW,MAAA,EAAW,EAAA,CAAG,WAAA,GAAc,KAAK,MAAA,GAAS,GAAA;AAC9D,UAAA,KAAA,CAAM,SAAS,MAAM;AAAE,YAAA,EAAA,CAAG,eAAe,KAAA,CAAM,IAAA;AAAA,UAAM,CAAA;AACrD,UAAA,KAAA,CAAM,MAAA,EAAO;AACb,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAK,KAAA;AACxB,UAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AACjB,UAAA,OAAO,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAI,MAAM,IAAI,CAAA;AAAA,QAChD;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAA,sBAAe,OAAA;AAAQ,GACzB;AACF;;;ACnEO,SAAS,eAAA,CAAgB,GAAA,GAAgB,EAAC,EAAqB;AACpE,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,IACnC,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,IACjC,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,OAAA,IAAW,CAAC,CAAC,CAAA;AAAA,IAClD,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,WAAW,EAAE;AAAA,GACxC;AACF;AAEA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAqB,CAAA,KAAsB;AAC5D,EAAA,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,OAAO,IAAI,CAAA,CAAE,MAAA;AAC/B,EAAA,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,GAAA,CAAM,CAAA,GAAI,CAAA,CAAE,OAAA,KAAY,CAAA,GAAI,CAAA,CAAE,UAAW,CAAA,CAAE,KAAA;AAC9E,EAAA,OAAO,CAAA,CAAE,OAAA;AACX,CAAA;AAIO,SAAS,aAAA,CAAc,CAAA,EAAqB,CAAA,EAAW,IAAA,EAAuB;AACnF,EAAA,IAAI,SAAS,MAAA,IAAa,CAAA,IAAK,MAAM,OAAO,SAAA,CAAU,GAAG,CAAC,CAAA;AAC1D,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,CAAA,EAAG,OAAO,CAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA,IAAK,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,IAAQ,CAAA,CAAE,OAAA,CAAQ,CAAA;AACtE;AAOO,SAAS,cAAA,CAAe,GAAqB,IAAA,EAAgC;AAClF,EAAA,MAAM,MAAM,IAAA,IAAQ,QAAA;AACpB,EAAA,MAAM,MAAA,GAA0B,CAAC,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA;AACvE,EAAA,KAAA,MAAW,EAAA,IAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAA,GAAS,CAAA,CAAE,KAAK,CAAA,EAAG;AAC/C,IAAA,IAAI,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,EAAE,EAAA,EAAI;AACxC,IAAA,IAAI,MAAM,GAAA,EAAK;AACf,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,UAAU,CAAA,EAAG,EAAE,GAAG,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,MAAA;AAC/B,EAAA,IAAI,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,EAAE,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,UAAU,CAAA,EAAG,IAAI,GAAG,CAAA;AAC5F,EAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,GAAO,EAAE,OAAA,EAAS,KAAA,EAAO,GAAG,CAAA;AAC9C,EAAA,OAAO,MAAA;AACT;;;AC/DA,IAAM,KAAA,uBAAY,OAAA,EAAqD;AAGhE,SAAS,YAAA,CAAa,KAAuB,QAAA,EAA2C;AAC7F,EAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACzB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,KAAA,uBAAY,GAAA,EAAI;AAChB,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACtB;AACA,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC7B,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,IAAA,EAAM;AAET,IAAA,MAAM,IAAA,GAAO,IAAI,YAAA,CAAa,QAAA,CAAS,SAAS,CAAC,CAAA;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,UAAU,CAAC,CAAA;AACpB,IAAA,IAAA,GAAO,GAAA,CAAI,mBAAmB,IAAI,YAAA,CAAa,SAAS,MAAA,GAAS,CAAC,GAAG,IAAI,CAAA;AACzE,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA;AACT;;;ACEO,IAAM,WAAA,GAAc,CAAC,KAAA,MAAmD;AAAA,EAC7E,IAAI,OAAA,GAAU;AAAE,IAAA,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA;AAAA,EAAS,CAAA;AAAA,EACzC,IAAI,QAAQ,EAAA,EAAI;AAAE,IAAA,KAAA,CAAM,CAAC,EAAE,OAAA,GAAU,EAAA;AAAA,EAAI,CAAA;AAAA,EACzC,KAAK,IAAA,EAAe;AAClB,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAwC;AAAA,IACtE;AAAA,EACF,CAAA;AAAA,EACA,UAAA,GAAa;AAAE,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,CAAA,CAAE,UAAA,EAAW;AAAA,EAAG;AACxD,CAAA,CAAA;;;ACxBO,SAAS,gBAAgB,IAAA,EAAsB;AACpD,EAAA,OAAO,GAAA,GAAM,CAAA,KAAA,CAAO,IAAA,GAAO,EAAA,IAAM,EAAA,CAAA;AACnC;AAEA,IAAM,OAAA,GAAkC,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAG;AAI7E,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,MAAM,CAAA,GAAI,4BAAA,CAA6B,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACvD,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAChF,EAAA,IAAI,WAAW,OAAA,CAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,aAAa,CAAA;AACzC,EAAA,KAAA,MAAW,OAAO,CAAA,CAAE,CAAC,GAAG,QAAA,IAAY,GAAA,KAAQ,MAAM,CAAA,GAAI,EAAA;AACtD,EAAA,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,QAAA;AACnC;AAGO,SAAS,YAAY,KAAA,EAAsB;AAChD,EAAA,MAAM,EAAA,GAAK,OAAO,KAAA,KAAU,QAAA,GAAW,QACnC,OAAO,KAAA,KAAU,QAAA,GAAW,eAAA,CAAgB,WAAW,KAAK,CAAC,CAAA,GAC7D,eAAA,CAAgB,MAAM,IAAI,CAAA;AAC9B,EAAA,IAAI,EAAE,EAAA,GAAK,CAAA,CAAA,IAAM,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,4DAAA,EAA+D,EAAE,CAAA,CAAE,CAAA;AAAA,EAC1F;AACA,EAAA,OAAO,EAAA;AACT;;;ACzBO,IAAM,aAAA,GAAgB,CAAA;AAE7B,IAAM,SAAA,GAAY,IAAA;AAElB,IAAM,UAAA,uBAAiB,OAAA,EAAwD;AAIxE,SAAS,YAAA,CAAa,OAAmB,MAAA,EAA8B;AAC5E,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,MAAM,CAAA;AACnC,EAAA,IAAI,CAAA,GAAI,UAAA;AACR,EAAA,MAAM,QAAQ,MAAc;AAC1B,IAAA,CAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,OAAO,IAAI,UAAA,KAAgB,CAAA;AAC7C,IAAA,OAAQ,CAAA,GAAI,aAAe,CAAA,GAAI,CAAA;AAAA,EACjC,CAAA;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,EAAM;AAAA,EACrD,CAAA,MAAA,IAAW,UAAU,MAAA,EAAQ;AAE3B,IAAA,IAAI,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA;AACzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,KAAA,EAAM;AAChB,MAAA,EAAA,GAAK,OAAA,GAAU,KAAK,CAAA,GAAI,SAAA;AACxB,MAAA,EAAA,GAAK,OAAA,GAAU,KAAK,CAAA,GAAI,SAAA;AACxB,MAAA,EAAA,GAAK,KAAA,GAAQ,KAAK,CAAA,GAAI,QAAA;AACtB,MAAA,EAAA,GAAK,MAAA,GAAS,KAAK,CAAA,GAAI,SAAA;AACvB,MAAA,EAAA,GAAK,IAAA,GAAO,KAAK,CAAA,GAAI,SAAA;AACrB,MAAA,EAAA,GAAK,OAAA,GAAU,KAAK,CAAA,GAAI,QAAA;AACxB,MAAA,GAAA,CAAI,CAAC,IAAI,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,MAAA;AAChD,MAAA,EAAA,GAAK,CAAA,GAAI,QAAA;AAAA,IACX;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClC,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,GAAO,KAAA,EAAM,IAAK,IAAA;AAC3B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAA,CAAQ,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,CAAC,CAAA;AAChE,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClC,IAAA,GAAA,CAAI,CAAC,KAAK,IAAA,GAAO,CAAA;AACjB,IAAA,IAAA,IAAQ,IAAI,CAAC,CAAA;AAAA,EACf;AACA,EAAA,IAAA,IAAQ,MAAA;AACR,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClC,IAAA,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA;AACV,IAAA,EAAA,IAAM,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAAA,EACtB;AACA,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,SAAA,GAAY,KAAK,IAAA,CAAK,EAAA,GAAK,MAAM,CAAA,GAAI,CAAA;AAC5D,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,IAAK,KAAA;AAC9C,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,WAAA,CAAY,KAAuB,KAAA,EAAgC;AACjF,EAAA,IAAI,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAChC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,uBAAc,GAAA,EAAI;AAClB,IAAA,UAAA,CAAW,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,aAAa,aAAa,CAAA;AACxD,IAAA,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,MAAA,EAAQ,IAAI,UAAU,CAAA;AACnD,IAAA,MAAA,CAAO,eAAe,CAAC,CAAA,CAAE,IAAI,YAAA,CAAa,KAAA,EAAO,MAAM,CAAC,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,YAAA,GAAe,CAAC,IAAA,KAC3B,OAAO,SAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAI1C,SAAS,gBAAgB,IAAA,EAAuD;AACrF,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,WAAW,iEAAiE,CAAA;AAAA,EACxF;AACA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,EAAE,EAAE,KAAA,GAAQ,CAAA,CAAA,IAAM,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,+DAAA,EAAkE,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAClG;AACA,IAAA,IAAI,EAAE,KAAA,KAAU,MAAA,IAAa,EAAE,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI;AAC3C,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,qEAAA,EAAwE,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACxG;AACA,IAAA,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,IAAQ,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/B,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,MAAM,KAAA,GAAQ,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,IAAQ,KAAK,KAAA,GAAQ,CAAA;AAAA,IAC1C,OAAO,CAAA,CAAE;AAAA,GACX,CAAE,CAAA;AACJ;AAUO,SAAS,YAAY,IAAA,EAAmE;AAC7F,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,MAAA;AAC1B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAAA,IAC5B,SAAS,IAAA,CAAK,KAAA,GAAQ,YAAY,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,GAAI,MAAA;AAAA,IACnD,UAAU,YAAA,CAAa,IAAI,CAAA,GAAI,eAAA,CAAgB,IAAI,CAAA,GAAI;AAAA,GACzD;AACF;AAIO,SAAS,eAAA,CACd,KAAA,EACA,GAAA,EACA,IAAA,EACA,IACA,GAAA,EAC+B;AAC/B,EAAA,MAAM,CAAC,KAAA,EAAO,GAAG,IAAI,CAAA,GAAI,cAAA,CAAe,KAAK,IAAI,CAAA;AACjD,EAAA,KAAA,CAAM,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,KAAK,GAAG,EAAE,CAAA;AACzC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,KAAA,CAAM,uBAAA,CAAwB,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,GAAI,CAAA;AAClF,EAAA,OAAO;AAAA,IACL,QAAQ,EAAA,EAAI;AACV,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,EAAA,GAAK,MAAM,GAAI,CAAA;AAC5C,MAAA,KAAA,CAAM,sBAAsB,EAAE,CAAA;AAC9B,MAAA,KAAA,CAAM,eAAe,GAAA,CAAI,aAAA,CAAc,KAAK,OAAO,CAAC,GAAG,EAAE,CAAA;AACzD,MAAA,KAAA,CAAM,wBAAwB,GAAA,CAAI,CAAC,GAAG,EAAA,GAAK,GAAA,CAAI,UAAU,GAAI,CAAA;AAAA,IAC/D;AAAA,GACF;AACF;AAGO,SAAS,WAAA,CACd,GAAA,EACA,IAAA,EACA,IAAA,EACA,EAAA,EACuD;AACvD,EAAA,MAAM,IAAA,GAAO,IAAI,kBAAA,EAAmB;AACpC,EAAA,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,IAAQ,SAAA;AACzB,EAAA,IAAA,CAAK,CAAA,CAAE,cAAA,CAAe,IAAA,CAAK,CAAA,IAAK,GAAG,EAAE,CAAA;AACrC,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW,IAAA,CAAK,KAAK,cAAA,CAAe,IAAA,CAAK,MAAM,EAAE,CAAA;AACnE,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,CAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAChD,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EACnC;AACA,EAAA,MAAM,MAAA,GAAS,eAAA;AAAA,IACb,IAAA,CAAK,SAAA;AAAA,IAAW,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,IAAG,IAAA;AAAA,IAAM,EAAA;AAAA,IAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,GAAY,MAAA,GAAS;AAAA,GAC7F;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,OAAA,EAAQ;AACzC;AAMO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU;AAAA,MACR,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,OAAO,IAAA,EAAK;AAAA,MACrC,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,MACjC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,MACtC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,MACtC,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,MAClC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,MACtC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAO,GAAA,EAAI;AAAA,MACvC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA;AAAI;AACxC,GACF;AAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU;AAAA,MACR,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,MAChC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAO,EAAA,EAAG;AAAA,MACtC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,EAAA;AAAG;AACvC,GACF;AAAA;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,MAChC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,GAAA,EAAI;AAAA,MACtC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,EAAA,EAAG;AAAA,MACrC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,EAAA,EAAG;AAAA,MACrC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,EAAA,EAAG;AAAA,MACrC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,EAAA;AAAG;AACvC;AAEJ;;;ACtLA,SAAS,UAAA,CACP,GAAA,EACA,KAAA,EACA,MAAA,EACA,OACA,IAAA,EACY;AACZ,EAAA,MAAM,KAAK,MAAA,GAAS,GAAA;AACpB,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA;AAC1C,EAAA,MAAM,OAAO,KAAA,CAAM,QAAA;AAGnB,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,MAAM,GAAA,GAAM,gBAAgB,MAAA,CAAO,IAAA,EAAM,KAAK,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA,KAAM,CAAC,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,WAAA,CAAY,KAAK,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,CAAA,GAAI,IAAA;AACzE,EAAA,MAAA,EAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC3B,EAAA,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAK,KAAM,CAAA;AAChC,EAAA,KAAA,CAAM,GAAA,GAAM,MAAA;AAEZ,EAAA,MAAM,EAAE,OAAO,MAAA,EAAO,GAAI,KAAK,EAAA,EAAI,MAAA,EAAQ,QAAQ,MAAM,CAAA;AACzD,EAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,EAAA,MAAA,EAAO;AACP,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAqB;AAAE,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EAAG,CAAA;AAC3E,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,KAAK,GAAA,CAAI,WAAA;AAEf,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,EAAA,GAAK,GAAA,GAAO,UAAU,IAAA,EAAM;AACtD,IAAA,GAAA,CAAI,QAAQ,EAAE,CAAA;AACd,IAAA,MAAA,EAAQ,QAAQ,EAAE,CAAA;AAClB,IAAA,OAAA,CAAQ,EAAA,GAAK,GAAA,CAAI,OAAA,GAAU,GAAI,CAAA;AAAA,EACjC,CAAA;AACA,EAAA,IAAI,SAAS,MAAA,EAAW,OAAA,CAAQ,MAAM,IAAA,GAAO,GAAA,CAAI,WAAW,GAAI,CAAA;AAChE,EAAA,OAAO,MAAM,MAAA,KAAW,CAAA,GAAI,MAAM,CAAC,CAAA,GAAI,YAAY,KAAK,CAAA;AAC1D;AAIA,SAAS,eAAA,CACP,GAAA,EACA,IAAA,EACA,EAAE,IAAA,EAAM,SAAS,QAAA,EAAS,EAC1B,SAAA,EACA,EAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,MAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkC;AAC9C,IAAA,MAAM,GAAA,GAAM,IAAI,gBAAA,EAAiB;AACjC,IAAA,GAAA,CAAI,SAAA,CAAU,cAAA,CAAe,IAAA,GAAO,KAAA,EAAO,EAAE,CAAA;AAC7C,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,MAAM,MAAM,EAAA,GAAA,CAAM,IAAA,CAAK,MAAO,EAAA,IAAM,IAAA,CAAK,YAAY,GAAA,IAAO,GAAA;AAC5D,MAAA,IAAI,IAAA,CAAK,MAAO,KAAA,KAAU,QAAA,MAAc,SAAA,CAAU,uBAAA,CAAwB,OAAA,GAAU,KAAA,EAAO,GAAG,CAAA;AAAA,WACzF,GAAA,CAAI,SAAA,CAAU,4BAAA,CAA6B,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACzB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,EAAW;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,EAAE,CAAA;AACpC,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,KAAA,GAAQ,GAAI,CAAA;AAC3E,MAAA,GAAA,CAAI,QAAQ,KAAK,CAAA;AACjB,MAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAClB,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,SAAA,CAAU,KAAK,IAAqC,CAAA;AACpD,IAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAChB,IAAA,IAAA,GAAO,CAAC,GAAG,CAAA;AAAA,EACb;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACpC,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAA,CAAoB,KAAuB,MAAA,EAAqC;AAC9F,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAqB,IAAA,KAA8C;AACpF,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,eAAA,CAAgB,YAAA,CAAa,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,IAAA,EAAM;AACT,MAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,MAAA,OAAO;AAAA,QACL,OAAO,MAAM,IAAA;AAAA,QACb,KAAA,EAAO,CAAC,KAAA,EAAO,MAAA,KAAW,UAAA,CAAW,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,CAAC,EAAA,EAAI,IAAA,KAAS;AAC3E,UAAA,MAAM,OAAO,eAAA,CAAgB,GAAA,EAAK,MAAM,QAAA,EAAU,SAAA,EAAW,IAAI,IAAI,CAAA;AACrE,UAAA,OAAO;AAAA,YACL,KAAA,EAAO,IAAA;AAAA,YACP,QAAQ,MAAM;AACZ,cAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,YACvF;AAAA,WACF;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAA,EAAO;AACX,MAAA,OAAO;AAAA,QACL,OAAO,MAAM,IAAA;AAAA,QACb,KAAA,EAAO,CAAC,KAAA,EAAO,MAAA,KAAW,UAAA,CAAW,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,CAAC,EAAA,EAAI,IAAA,KAAS;AAC5E,UAAA,MAAM,MAAA,GAAS,IAAI,kBAAA,EAAmB;AACtC,UAAA,MAAA,CAAO,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAC5C,UAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,UAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAEnB,UAAA,MAAA,CAAO,MAAM,EAAA,EAAI,MAAA,EAAO,GAAI,MAAA,CAAO,OAAO,QAAQ,CAAA;AAClD,UAAA,OAAO;AAAA,YACL,KAAA,EAAO,CAAC,MAAM,CAAA;AAAA,YACd,QAAQ,MAAM;AACZ,cAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,KAAA,CAAM,IAAA;AAClC,cAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,CAAM,MAAA;AAAA,YAC9B;AAAA,WACF;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF;AAAA,GACF;AACF;;;AClJA,IAAM,KAAA,uBAAY,OAAA,EAAyC;AAKpD,SAAS,mBAAmB,GAAA,EAAsC;AACvE,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,GAAA,CAAQ,YAAY;AAClB,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,EAAc,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAE3F,MAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OAAO,kCAAsB,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,IAAA,CAAK,CAAC,oBAAoB,CAAA,EAAG,EAAE,IAAA,EAAM,iBAAA,EAAmB,CAAC,CAAA;AAC7F,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,YAAA,CAAa,SAAA,CAAU,GAAG,CAAA;AAAA,MACtC,CAAA,SAAE;AACA,QAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,GAAG;AACH,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA;AACT;;;ACnBO,IAAM,eAAA,GAAkB,eAAA;;;ACyB/B,SAAS,aAAA,CAAc,MAAoC,EAAA,EAA2B;AACpF,EAAA,IAAI,OAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,MAAM,OAAO,MAAY;AAAE,IAAC,OAAA,IAAkC;AAAA,EAAG,CAAA;AACjE,EAAA,OAAO;AAAA,IACL,IAAI,OAAA,GAAU;AAAE,MAAA,OAAO,OAAA;AAAA,IAAS,CAAA;AAAA,IAChC,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,OAAA,GAAU,EAAA;AACV,MAAA,IAAI,KAAA,iBAAsB,IAAI,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,KAAK,IAAA,EAAe;AAAE,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAI,EAAA,EAAI,IAAA,IAAQ,GAAG,CAAA;AAAA,IAAG,CAAA;AAAA,IACjE,UAAA,GAAa;AAAA,IAAC,CAAA;AAAA,IACd,GAAA,GAAM;AACJ,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,GACF;AACF;AAGA,SAAS,UAAA,CAAW,GAAA,EAAuB,IAAA,EAAoC,EAAA,EAAsB;AACnG,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,CAAM,OAAO,MAAA,EAAQ;AACnB,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,OAAO,GAAA,EAAK,MAAA,IAAU,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,WAAA,GAAc,MAAA,GAAS,GAAA,GAAO,GAAG,CAAA;AAAA,IACpG,CAAA;AAAA,IACA,IAAI,KAAA,EAAO;AAAE,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,IAC/C,IAAA,GAAO;AAAA,IAAC,CAAA;AAAA,IACR,OAAA,GAAU;AAAA,IAAC;AAAA,GACb;AACF;AAEO,SAAS,mBAAA,CACd,GAAA,EACA,QAAA,EACA,MAAA,EACe;AACf,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,GAAG,CAAA,CAAE,IAAA;AAAA,IACrC,MAAM;AAAE,MAAA,KAAA,GAAQ,IAAA;AAAA,IAAM,CAAA;AAAA,IACtB,CAAC,GAAA,KAAiB;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uFAAA,EAAqF,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACjH;AAAA,GACF;AACA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAiB;AAEnC,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAsB;AACpC,IAAA,IAAI,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACxB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAA,GAAO,IAAI,gBAAA,CAAiB,GAAA,EAAK,eAAA,EAAiB;AAAA,QACtD,cAAA,EAAgB,CAAA;AAAA,QAAG,eAAA,EAAiB,CAAA;AAAA,QAAG,kBAAA,EAAoB,CAAC,CAAC;AAAA,OAC9D,CAAA;AACD,MAAA,MAAM,OAAA,uBAAc,GAAA,EAA2B;AAC/C,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA,KAAmC;AACxD,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AACpC,QAAA,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACxB,QAAA,MAAA,EAAQ,GAAA,EAAI;AAAA,MACd,CAAA;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AAC3B,MAAA,GAAA,GAAM,EAAE,MAAM,OAAA,EAAQ;AACtB,MAAA,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,OAAA,GAAU,CACd,KAAA,KACY;AACZ,IAAA,IAAI,MAAA,GAA+B,IAAA;AACnC,IAAA,IAAI,OAAiC,MAAM;AAAA,IAAC,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,OAAO,MAAM,IAAA;AAAA,MACb,IAAA,CAAK,OAAO,EAAA,EAAa;AACvB,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,CAAG,GAAG,CAAA;AACzB,QAAA,IAAA,GAAO,CAAC,CAAA,KAAM;AAAE,UAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA;AAAA,QAAG,CAAA;AAC9C,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,EAAA,CAAG,IAAA,GAAO,KAAM,EAAA,CAAG,KAAA,EAAO,EAAA,CAAG,GAAG,CAAC,CAAA;AACnD,QAAA,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA;AACrC,QAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA;AAChC,QAAA,KAAA,CAAM,SAAS,MAAM;AAAE,UAAA,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,QAAG,CAAA;AACvG,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,UAAA,CAAW,GAAA,EAAK,IAAA,EAAM,MAAM,EAAE,CAAA;AAAA,UACnC,QAAQ,MAAM;AAAE,YAAA,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,EAAA,EAAI,MAAM,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAAA,UAAG;AAAA,SAC/D;AAAA,MACF,CAAA;AAAA,MACA,MAAM,KAAA,EAAO;AACX,QAAA,KAAA,CAAM,UAAU,MAAM;AAAE,UAAA,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,KAAA,CAAM,IAAI,CAAA;AAAA,QAAG,CAAA;AACjE,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,MAAM,KAAA;AAAA,IACb,MAAA;AAAA,IACA,KAAK,IAAA,EAAM;AACT,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,OAAO,IAAA,CAAK,KAAA;AAAA,QAAO,MAAM,IAAA,CAAK,IAAA;AAAA,QAAM,UAAU,IAAA,CAAK,QAAA;AAAA,QAAU,OAAO,IAAA,CAAK,KAAA;AAAA,QACzE,QAAQ,IAAA,CAAK,MAAA;AAAA,QAAQ,UAAU,IAAA,CAAK;AAAA,OACtC;AACA,MAAA,OAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,EAAA,EAAI,OAAO,GAAA,MAAS;AAAA,QACzC,IAAA,EAAM,MAAA;AAAA,QAAQ,IAAI,KAAA,CAAM,EAAA;AAAA,QAAI,EAAA;AAAA,QAAI,KAAA;AAAA,QAAO,GAAA;AAAA,QAAK,MAAM,KAAA,CAAM,IAAA;AAAA,QAAM,QAAQ,KAAA,CAAM,MAAA;AAAA,QAAQ;AAAA,OACtF,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,MAAM,KAAA,EAAO;AACX,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAS;AAC7G,MAAA,OAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,EAAA,EAAI,OAAO,GAAA,MAAS;AAAA,QACzC,IAAA,EAAM,OAAA;AAAA,QAAS,IAAI,KAAA,CAAM,EAAA;AAAA,QAAI,EAAA;AAAA,QAAI,KAAA;AAAA,QAAO,GAAA;AAAA,QAAK,MAAM,KAAA,CAAM,IAAA;AAAA,QAAM,QAAQ,KAAA,CAAM,MAAA;AAAA,QAAQ,KAAA;AAAA;AAAA,QAErF,MAAM,MAAA;AAAO,OACf,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,MAAA,EAAO,EAAG;AAChC,QAAA,GAAA,CAAI,KAAK,IAAA,CAAK,WAAA,CAAY,EAAE,IAAA,EAAM,WAAiC,CAAA;AACnE,QAAA,GAAA,CAAI,IAAA,CAAK,KAAK,SAAA,GAAY,IAAA;AAC1B,QAAA,GAAA,CAAI,KAAK,UAAA,EAAW;AAAA,MACtB;AACA,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd;AAAA,GACF;AACF;;;ACtJA,IAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4BtB,SAAS,KAAA,GAAgD;AACvD,EAAA,IACE,OAAO,MAAA,KAAW,UAAA,IAClB,OAAO,IAAA,KAAS,UAAA,IAChB,OAAO,GAAA,KAAQ,WAAA,IACf,OAAO,GAAA,CAAI,eAAA,KAAoB,UAAA,EAC/B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,IAAA,CAAK,CAAC,aAAa,CAAA,EAAG,EAAE,IAAA,EAAM,iBAAA,EAAmB,CAAC,CAAA;AAChF,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAI,MAAA,CAAO,GAAG,GAAG,GAAA,EAAI;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,GAAA,CAAI,eAAA,CAAgB,GAAG,CAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASO,SAAS,eAAA,GAA6B;AAC3C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,EAAA,IAAI,UAAU,KAAA,EAAM;AAEpB,EAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAqB;AACjC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACxB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,IAAA,CAAA,CAAE,EAAA,EAAG;AAAA,EACP,CAAA;AACA,EAAA,MAAM,GAAA,GAAM,CAAC,EAAA,EAAY,CAAA,KAAqB;AAC5C,IAAA,CAAA,CAAE,WAAW,UAAA,CAAW,MAAM,KAAK,EAAE,CAAA,EAAG,EAAE,EAAE,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,OAAO,SAAA,EAAU;AACzB,IAAA,GAAA,CAAI,eAAA,CAAgB,QAAQ,GAAG,CAAA;AAC/B,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,MAAA,CAAO,iBAAiB,SAAA,EAAW,CAAC,MAAoB,IAAA,CAAK,CAAA,CAAE,IAAc,CAAC,CAAA;AACtF,IAAA,OAAA,CAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAC7C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,EAAQ;AAER,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,KAAK,OAAA,EAAS,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,CAAS,IAAI,EAAA,EAAI;AACf,MAAA,MAAM,EAAA,GAAK,MAAA,EAAA;AACX,MAAA,MAAM,CAAA,GAAa,EAAE,EAAA,EAAI,EAAA,EAAG;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AACjB,MAAA,IAAI,SAAS,OAAA,CAAQ,MAAA,CAAO,YAAY,EAAE,EAAA,EAAI,IAAI,CAAA;AAAA,WAC7C,GAAA,CAAI,IAAI,CAAC,CAAA;AACd,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,WAAW,MAAA,EAAQ;AACjB,MAAA,MAAM,EAAA,GAAK,MAAA;AACX,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,MAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,EAAW,YAAA,CAAa,EAAE,QAAQ,CAAA;AAAA,WAChD,OAAA,EAAS,MAAA,CAAO,WAAA,CAAY,EAAE,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAChC,QAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,EAAW,YAAA,CAAa,EAAE,QAAQ,CAAA;AAAA,MACvD;AACA,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,GACF;AACF;;;ACnFO,SAAS,eAAA,CAAgB,KAAuB,KAAA,EAA0B;AAG/E,EAAA,MAAM,OAAgB,EAAC;AACvB,EAAA,MAAM,WAAW,MAAa;AAC5B,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,YAAW,EAAG,MAAA,EAAQ,GAAA,CAAI,kBAAA,EAAmB,EAAE;AACzE,IAAA,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK;AACnB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAI,IAAK,QAAA,EAAS;AACrC,MAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAK,MAAA,EAAO,GAAI,KAAA;AAE9B,MAAA,UAAA,CAAW,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAI,KAAA,GAAQ,GAAA;AACnB,MAAA,GAAA,CAAI,QAAQ,GAAG,CAAA;AACf,MAAA,IAAI,IAAA,GAAO,IAAA;AACX,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO,CAAC,KAAA,EAAO,MAAA,KAAW,WAAW,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,QACjE,GAAA,EAAK,CAAC,KAAA,KAAU;AAAE,UAAA,MAAA,CAAO,IAAI,KAAA,GAAQ,KAAA;AAAA,QAAO,CAAA;AAAA,QAC5C,IAAA,GAAO;AACL,UAAA,IAAI,CAAC,IAAA,EAAM;AACX,UAAA,IAAA,GAAO,KAAA;AACP,UAAA,GAAA,CAAI,UAAA,EAAW;AACf,UAAA,IAAI,IAAA,CAAK,MAAA,GAAS,KAAA,EAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QAC1C,CAAA;AAAA,QACA,OAAA,GAAU;AACR,UAAA,IAAA,GAAO,KAAA;AACP,UAAA,GAAA,CAAI,UAAA,EAAW;AAAA,QACjB;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,KAAA,GAAQ;AAAE,MAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IAAG;AAAA,GAC7B;AACF;;;AC5DO,IAAM,UAAA,GAAa,CACxB,MAAA,EACA,MAAA,KACS;AACT,EAAA,IAAI,MAAA,EAAQ,cAAA,CAAe,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AACjD,CAAA;AAWO,SAAS,kBAAA,GAAmC;AACjD,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,OAAO;AAAA,IACL,MAAA,GAAS;AACP,MAAA,IAAI,YAAA,EAAc;AAClB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OAGF;AAAA,IACF,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,IAAI,cAAA,EAAgB;AACpB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,OAAA,CAAQ,KAAK,wEAAmE,CAAA;AAAA,IAClF,CAAA;AAAA,IACA,aAAa,EAAA,EAAI;AACf,MAAA,IAAI,kBAAA,EAAoB;AACxB,MAAA,kBAAA,GAAqB,IAAA;AACrB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,8CAA8C,EAAE,CAAA,gHAAA;AAAA,OAElD;AAAA,IACF,CAAA;AAAA,IACA,WAAA,GAAc;AAAE,MAAA,YAAA,GAAe,KAAA;AAAA,IAAO;AAAA,GACxC;AACF;;;ACHO,SAAS,gBAAgB,IAAA,EAAmC;AACjE,EAAA,IAAI,EAAE,IAAA,CAAK,KAAA,IAAS,CAAA,CAAA,EAAI;AACtB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,2DAAA,EAA8D,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACjG;AACA,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,QAAA;AAC5B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA6C;AAC9D,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,SAAS,MAAc;AAC3B,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,IAAI,UAAA,GAAa,QAAA;AACjB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,IAAA,EAAM;AAC9B,MAAA,MAAM,KAAA,GAAQ,KAAA,KAAU,UAAA,GAAa,GAAA,CAAI,OAAO,GAAA,CAAI,SAAA;AACpD,MAAA,IAAI,QAAQ,UAAA,EAAY;AAAE,QAAA,UAAA,GAAa,KAAA;AAAO,QAAA,KAAA,GAAQ,IAAA;AAAA,MAAM;AAAA,IAC9D;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,MAAA,EAAQ;AACd,MAAA,MAAM,KAAA,GAAQ,SAAA,EAAA;AACd,MAAA,IAAI,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,EAAO;AAC1B,QAAA,MAAMC,QAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,KAAI,GAAK,QAAA,EAAA;AAC7C,QAAA,IAAA,CAAK,IAAIA,KAAAA,EAAM,EAAE,GAAG,MAAA,EAAQ,OAAO,CAAA;AACnC,QAAA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,KAAA,EAAO,QAAQ,IAAA,EAAK;AAAA,MACrC;AACA,MAAA,MAAM,OAAO,MAAA,EAAO;AACpB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAG,KAAA;AAG/B,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAChB,MAAA,IAAA,CAAK,IAAI,IAAA,EAAM,EAAE,GAAG,MAAA,EAAQ,OAAO,CAAA;AACnC,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAO;AAAA,IAC/B,CAAA;AAAA,IACA,OAAA,CAAQ,MAAM,KAAA,EAAO;AACnB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,UAAU,KAAA,EAAO;AACrC,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAChB,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM;AACzB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,GAAA,EAAK,KAAA,KAAU,KAAA,EAAO,GAAA,CAAI,IAAA,GAAO,IAAA;AAAA,IACvC,CAAA;AAAA,IACA,MAAA,EAAQ,MAAM,IAAA,CAAK;AAAA,GACrB;AACF;;;ACrEO,SAAS,UAAA,CACd,MAAA,EACA,QAAA,EACA,IAAA,GAAuB,EAAC,EACO;AAC/B,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,GAAA;AACxC,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,SAAA;AAChC,EAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,IAAiB,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,GAAA;AAElC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,QAAA,CAAS,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,QAAA,CAAS,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAElC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,IAAA,GAAO,CAAA;AAAA,EACT,CAAA,MAAA,IAAW,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,OAAO,WAAA,GAAc,WAAA;AAC3B,IAAA,IAAA,GAAO,QAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,aAAA,IAAA,CAAkB,WAAW,WAAA,IAAe,IAAA,CAAA;AAAA,EACzE,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,WAAA,IAAe,WAAA,GAAc,aAAA,IAAiB,QAAA,GAAW,WAAA,CAAA,CAAA;AAAA,EAClE;AACA,EAAA,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAEpC,EAAA,MAAM,GAAA,GAAM,QAAA,IAAY,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,QAAQ,CAAC,CAAA;AAEvE,EAAA,OAAO,EAAE,MAAM,GAAA,EAAI;AACrB;;;ACbA,IAAM,OAAA,GAAU,CAAC,EAAA,MAA6B;AAAA,EAC5C,EAAA;AAAA,EACA,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EAAG,SAAS,MAAM;AAAA,EAAC,CAAA;AAAA,EAAG,SAAS,MAAM;AAAA,EAAC,CAAA;AAAA,EAAG,SAAS,MAAM;AAAA,EAAC,CAAA;AAAA,EAAG,WAAW,MAAM;AAAA,EAAC,CAAA;AAAA,EAC3F,QAAQ,MAAM;AAAA,EAAC,CAAA;AAAA,EAAG,aAAa,MAAM;AAAA,EAAC,CAAA;AAAA,EAAG,WAAW,MAAM;AAC5D,CAAA,CAAA;AAEA,SAAS,aAAA,CAAc,KAAA,EAAkB,MAAA,EAAyB,IAAA,EAAoC;AAIpG,EAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,WAAW,IAAA,EAAM;AAC7C,EAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,EAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AACzB,IAAA,KAAA,CAAM,MAAA,IAAS;AACf,IAAA,UAAA,CAAW,KAAA,CAAM,QAAQ,MAAM,CAAA;AAAA,EACjC;AACA,EAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,IAAI;AAAE,MAAA,KAAA,CAAM,OAAO,IAAA,EAAK;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAwB;AAC3D,IAAA,KAAA,CAAM,OAAO,UAAA,EAAW;AAAA,EAC1B;AACA,EAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,EAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,EAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,EAAA,KAAA,CAAM,KAAK,UAAA,EAAW;AACtB,EAAA,KAAA,CAAM,GAAA,GAAM,IAAA;AACZ,EAAA,KAAA,CAAM,KAAK,IAAA,EAAK;AAChB,EAAA,KAAA,CAAM,GAAA,GAAM,IAAA;AACZ,EAAA,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,CAAA;AACpB,EAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,IAAA,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAGtC,IAAA,KAAA,CAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,EAClD;AACF;AAGA,SAAS,WACP,KAAA,EACA,OAAA,EACA,UACA,aAAA,EACA,MAAA,EACA,YACA,QAAA,EACM;AAEN,EAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,MAAA,KAAW,IAAA,EAAM;AAK7C,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,KAAW,IAAA;AAChC,EAAA,IAAI,CAAC,MAAA,IAAU,QAAA,GAAW,UAAA,IAAc,gBAAgB,UAAA,EAAY;AAClE,IAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AACvB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAM,EAAG;AACpB,IAAA,QAAA,CAAS,OAAO,SAAS,CAAA;AACzB,IAAA;AAAA,EACF;AAMA,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ;AAAA,IAClC,SAAA,EAAW,aAAA;AAAA,IACX,IAAA,EAAM,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM;AAAA,GAC9B,CAAA;AACD,EAAA,KAAA,CAAM,OAAO,QAAA,CAAS,IAAA;AACtB,EAAA,KAAA,CAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,EAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA;AACvC,EAAA,IAAI,QAAA,CAAS,WAAW,IAAA,EAAM;AAC5B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,MAAM,CAAA;AAChD,IAAA,IAAI,MAAA,WAAiB,MAAM,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,aAAa,CAAA;AAAA,EAC7C,SAAS,GAAA,EAAK;AAEZ,IAAA,KAAA,CAAM,KAAK,OAAA,EAAQ;AACnB,IAAA,KAAA,CAAM,GAAA,GAAM,IAAA;AACZ,IAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACxB,IAAA,MAAM,GAAA;AAAA,EACR;AACA,EAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,EAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAA,CAAO,UAAU,MAAM;AAAE,IAAA,QAAA,CAAS,KAAK,CAAA;AAAG,IAAA,MAAA,IAAS;AAAA,EAAG,CAAA;AACtD,EAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACjB;AAEA,SAAS,WAAA,CAAY,GAAA,EAAuB,KAAA,EAAkB,GAAA,EAA4B;AACxF,EAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAc,QAAA,EAAS,GAAI,GAAA;AAC7C,EAAA,OAAO;AAAA,IACL,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,KAAK,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,OAAA,IAAU;AAChB,MAAA,IAAI,MAAA,IAAU,SAAS,CAAA,IAAK,KAAA,CAAM,UAAU,KAAA,CAAM,GAAA,IAAO,CAAC,KAAA,CAAM,QAAA,EAAU;AAKxE,QAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,QAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,QAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AACzB,QAAA,IAAI;AAAE,UAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,SAAS,GAAI,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAc;AAChF,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAI,MAAM,SAAA,EAAW;AACrB,MAAA,KAAA,CAAM,OAAA,IAAU;AAChB,MAAA,IAAI,MAAM,OAAA,IAAW,KAAA,CAAM,MAAA,IAAU,CAAC,MAAM,QAAA,EAAU;AAEpD,QAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,QAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,QAAA,KAAA,CAAM,OAAA,EAAQ;AACd,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,OAAA,CAAQ,OAAO,MAAA,EAAQ;AACrB,MAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,IAAO,KAAA,CAAM,MAAA,EAAQ;AAChC,MAAA,KAAA,CAAM,UAAU,MAAA,IAAU,MAAA,GAAS,IAAI,GAAA,CAAI,WAAA,GAAc,SAAS,GAAA,GAAO,CAAA;AACzE,MAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,aAAa,MAAM,CAAA;AACjD,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,QAAQ,KAAA,EAAO;AACb,MAAA,KAAA,CAAM,IAAA,GAAO,KAAA;AACb,MAAA,KAAA,CAAM,MAAA,IAAS;AAAA,IACjB,CAAA;AAAA,IACA,UAAU,KAAA,EAAO;AACf,MAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,MAAA,KAAA,CAAM,MAAA,IAAS;AAAA,IACjB,CAAA;AAAA,IACA,OAAO,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,QAAA,GAAW,MAAA;AACjB,MAAA,KAAA,CAAM,GAAA,EAAK,IAAI,KAAK,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,YAAY,CAAA,EAAG;AACb,MAAA,KAAA,CAAM,QAAA,GAAW,CAAA;AACjB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,SAAA,EAAW,MAAM,KAAA,CAAM;AAAA,GACzB;AACF;AAEO,SAAS,aAAa,IAAA,EAA0B;AACrD,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAK,GAAI,IAAA;AAC9B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAuB;AACxC,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAY;AAC7B,IAAA,MAAM,CAAA,GAAI,KAAK,QAAA,EAAS;AACxB,IAAA,OAAO,UAAA,CAAW,CAAA,EAAG,CAAA,CAAE,EAAA,EAAI,EAAE,IAAI,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAA2B;AAC3C,IAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACzB,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,MAAM,KAAA,EAAO,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,WAAW,CAAA;AAAA,EACtF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA2B;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAM,QAAA,IAAY,CAAC,MAAM,GAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA;AAClC,IAAA,KAAA,CAAM,cAAc,CAAA,CAAE,IAAA;AACtB,IAAA,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA;AACnB,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAEjB,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,OAAA,GAAU,GAAA,CAAI,WAAA,IAAe,GAAA;AACjD,MAAA,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,QAAA,GAAW,EAAE,IAAA,EAAM,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,MAAS,CAAA;AAAA,IACtE;AACA,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAkB,MAAA,GAA0B,SAAA,KAAoB;AAChF,IAAA,aAAA,CAAc,KAAA,EAAO,QAAQ,IAAI,CAAA;AAAA,EACnC,CAAA;AACA,EAAA,MAAM,GAAA,GAAgB,EAAE,QAAA,EAAU,YAAA,EAAc,QAAA,EAAS;AAEzD,EAAA,OAAO;AAAA,IACL,MAAA,CAAO,QAAQ,OAAA,EAAS;AACtB,MAAA,MAAM,EAAA,GAAK,WAAA,EAAA;AAEX,MAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AACnB,QAAA,IAAA,CAAK,QAAA,EAAS;AACd,QAAA,UAAA,CAAW,MAAA,CAAO,QAAQ,UAAU,CAAA;AACpC,QAAA,OAAO,QAAQ,EAAE,CAAA;AAAA,MACnB;AACA,MAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,QAAA,IAAA,CAAK,MAAA,EAAO;AACZ,QAAA,UAAA,CAAW,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAClC,QAAA,OAAO,QAAQ,EAAE,CAAA;AAAA,MACnB;AAEA,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,IAAO,IAAA,CAAK,UAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACnC,MAAA,MAAM,QAAA,GAAW,IAAI,WAAA,GAAc,GAAA;AACnC,MAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,QAAA;AAC5B,MAAA,MAAM,QAAA,GAAW,OAAO,IAAA,IAAQ,CAAA;AAChC,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,GAAW,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,GAAI,EAAE,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,MAAA,CAAO,OAAO,CAAA,EAAE;AAC/F,MAAA,MAAM,KAAA,GAAQ,WAAW,OAAA,CAAQ,IAAA;AAEjC,MAAA,MAAM,KAAA,GAAmB;AAAA,QACvB,EAAA;AAAA,QAAI,KAAA;AAAA,QAAO,IAAA,EAAM,IAAA;AAAA,QAAM,KAAA,EAAO,CAAA;AAAA,QAAG,KAAK,MAAA,CAAO,SAAA;AAAA,QAAW,QAAQ,MAAA,CAAO,MAAA;AAAA,QACvE,MAAA,EAAQ,IAAA;AAAA,QAAM,GAAA,EAAK,IAAA;AAAA,QAAM,MAAA,EAAQ,IAAA;AAAA,QAAM,OAAA,EAAS,IAAA;AAAA,QAAM,SAAA,EAAW,KAAA;AAAA,QACjE,GAAA,EAAK,IAAA;AAAA,QAAM,MAAA,EAAQ,IAAA;AAAA,QAAM,OAAA,EAAS,IAAA;AAAA,QAClC,QAAA;AAAA,QAAU,aAAa,OAAA,CAAQ,IAAA;AAAA,QAC/B,IAAA,EAAM,OAAO,IAAA,IAAQ,CAAA;AAAA,QAAG,MAAA,EAAQ,OAAO,MAAA,IAAU,CAAA;AAAA,QACjD,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAA,EAAS,IAAA;AAAA,QAAM,QAAA,EAAU,KAAA;AAAA,QAAO,MAAA,EAAQ,KAAA;AAAA,QAAO,OAAA,EAAS;AAAA,OAC1D;AACA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AACnF,QAAA,KAAA,CAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,QAAA,KAAA,CAAM,SAAS,OAAA,CAAQ,MAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,GAAA,GAAM,OAAO,IAAA,CAAK,IAAA,CAAK,SAAS,OAAO,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACpE;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,IAAI,KAAK,CAAA;AAClB,MAAA,MAAM,QAAQ,MAAY;AACxB,QAAA,UAAA,CAAW,KAAA,EAAO,SAAS,QAAA,EAAU,IAAA,EAAM,OAAO,MAAA,EAAQ,IAAA,CAAK,UAAA,EAAW,EAAG,QAAQ,CAAA;AAAA,MACvF,CAAA;AACA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,KAAA,CAAM,UAAU,MAAM;AAAE,UAAA,IAAI,GAAA,CAAI,WAAA,GAAc,GAAA,IAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,QAAG,CAAA;AAAA,MACvE;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,SAAA,EAAW,EAAE,UAAA,EAAY,CAAC,OAAA,CAAQ,IAAA,EAAM,CAAA;AACpF,MAAA,OAAO,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,QAAQ,MAAA,EAAQ;AACd,MAAA,KAAA,MAAW,KAAA,IAAS,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,IAChE,CAAA;AAAA,IACA,QAAQ,GAAA,EAAK;AACX,MAAA,KAAA,MAAW,SAAS,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG;AACtC,QAAA,IAAI,KAAA,CAAM,QAAQ,GAAA,EAAK;AACvB,QAAA,KAAA,CAAM,OAAA,IAAU;AAChB,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB;AAAA,IACF,CAAA;AAAA,IACA,YAAA,GAAe;AACb,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,MAAA,EAAO,eAAgB,KAAK,CAAA;AAAA,IACvD;AAAA,GACF;AACF;;;ACpNA,SAAS,aAAA,CACP,GAAA,EAAuB,MAAA,EAAoB,IAAA,EAAoB,OAAoB,IAAA,EAC1E;AACT,EAAA,OAAO;AAAA,IACL,KAAA,GAAQ;AACN,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,IAAA;AACjC,MAAA,IAAA,CAAK,YAAA,CAAa,MAAM,EAAE,CAAA;AAC1B,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,KAAA,CAAM,OAAO,IAAA,EAAM;AAGjB,MAAA,MAAM,MAAA,GAAS,IAAI,kBAAA,EAAmB;AACtC,MAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AACnC,MAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,MAAA,KAAA,CAAM,SAAS,MAAM;AACnB,QAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,KAAA,CAAM,IAAA;AAClC,QAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,CAAM,MAAA;AAAA,MAC9B,CAAA;AACA,MAAA,KAAA,CAAM,MAAA,EAAO;AAEb,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAK,KAAM,CAAA;AAChC,MAAA,MAAA,CAAO,KAAA,CAAM,OAAO,GAAI,CAAA;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AACF;AAIA,SAAS,QAAA,CAAS,UAAoB,IAAA,EAA0B;AAC9D,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAmB;AAC1C,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,UAAA,CAAW,IAAI,IAAA,EAAM;AAAA,MACnB,IAAA,EAAM,eAAA,CAAgB,EAAE,KAAA,EAAO,IAAA,CAAK,cAAc,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,MACzE,OAAA,sBAAa,GAAA;AAAI,KAClB,CAAA;AAAA,EACH;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAuB;AACvC,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAG,CAAA,CAAA,CAAG,CAAA;AAChE,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAyB;AACvC,IAAA,IAAI,QAAQ,MAAA,EAAW,OAAO,SAAS,GAAG,CAAA,CAAE,KAAK,MAAA,EAAO;AACxD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAK,UAAA,CAAW,MAAA,IAAU,KAAA,IAAS,CAAA,CAAE,KAAK,MAAA,EAAO;AAC5D,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAC5B;AAIA,SAAS,WAAA,CAAY,GAAA,EAAuB,IAAA,EAA0B,QAAA,EAAsC;AAC1G,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,GAAA,EAAK,MAAM,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,KAAK,WAAA,KAAgB,SAAA,GAAY,oBAAoB,GAAA,EAAK,QAAA,EAAU,MAAM,CAAA,GAAI,IAAA;AAC9F,EAAA,MAAM,IAAA,GAAO,MAAO,OAAA,EAAS,KAAA,KAAU,OAAA,GAAU,KAAA;AACjD,EAAA,OAAO;AAAA,IACL,MAAM,CAAC,IAAA,KAAsB,IAAA,EAAK,CAAE,KAAK,IAAI,CAAA;AAAA,IAC7C,OAAO,CAAC,KAAA,KAAwB,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AAAA,IAClD,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,OAAA,EAAS,MAAM,OAAA,EAAS,OAAA;AAAQ,GAClC;AACF;AAGA,SAAS,WAAA,CAAY,GAAA,EAAuB,QAAA,EAAsC,IAAA,EAAyB;AACzG,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAgB;AACjC,EAAA,OAAO;AAAA,IACL,OAAO,GAAA,EAAyB;AAC9B,MAAA,MAAM,IAAI,gBAAA,CAAiB,GAAA,EAAK,QAAA,CAAS,GAAG,GAAG,IAAI,CAAA;AACnD,MAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,MAAA,OAAO;AAAA,QACL,GAAG,CAAA;AAAA,QACH,OAAA,GAAU;AACR,UAAA,CAAA,CAAE,OAAA,EAAQ;AACV,UAAA,KAAK,CAAA,CAAE,SAAQ,CAAE,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QAC5C;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,UAAA,CAAW,CAAC,CAAA;AAClC,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,GACF;AACF;AAGA,SAAS,WAAA,CAAY,KAAuB,IAAA,EAA0B;AACpE,EAAA,MAAM,GAAA,GAAM,MAAc,GAAA,CAAI,WAAA,GAAc,GAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,QAAA,KAAa,MAAA,IAAa,KAAK,UAAA,KAAe,MAAA,GACjE,iBAAgB,GAChB,IAAA;AACJ,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,QAAA,EAAU,SAAA,EAAW,QAAA,IAAY,IAAA,CAAK,YAAY,aAAA,CAAc,QAAA;AAAA,IAChE,UAAA,EAAY,SAAA,EAAW,UAAA,IAAc,IAAA,CAAK,cAAc,aAAA,CAAc;AAAA,GACxE;AACA,EAAA,MAAM,YAAY,eAAA,CAAgB;AAAA,IAChC,GAAA;AAAA;AAAA;AAAA;AAAA,IAIA,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,UAAU,IAAA,CAAK,YAAA;AAAA,IAAc,QAAQ,IAAA,CAAK;AAAA,GAC3C,CAAA;AACD,EAAA,SAAA,CAAU,KAAA,EAAM;AAChB,EAAA,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAU;AAC7C;AAQO,SAAS,iBAAA,CAAkB,IAAA,GAA2B,EAAC,EAAgB;AAC5E,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,IAAW,IAAI,YAAA,EAAa;AAG7C,EAAA,MAAM,WAAA,GAAc,KAAK,OAAA,KAAY,MAAA;AACrC,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,IAAS,CAAC,KAAA,EAAO,SAAS,IAAI,CAAA;AACpD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,EAAK,IAAA,CAAK,OAAO,CAAA;AACjD,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,QAAA,CAAS,UAAU,IAAI,CAAA;AACpD,EAAA,MAAM,EAAE,KAAK,SAAA,EAAW,MAAA,EAAQ,WAAU,GAAI,WAAA,CAAY,KAAK,IAAI,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,QAAA,EAAU,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,YAAA,EAAc,CAAA;AAEpF,EAAA,IAAI,QAAA,GAAiB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAClC,EAAA,IAAI,cAA8B,EAAC;AACnC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAiB;AAClC,EAAA,MAAM,SAAS,eAAA,CAAgB,GAAA,EAAA,CAAM,KAAK,UAAA,IAAc,EAAA,IAAM,SAAS,MAAM,CAAA;AAC7E,EAAA,MAAM,OAAO,kBAAA,EAAmB;AAChC,EAAA,MAAM,KAAA,GAAQ,kBAAkB,GAAA,EAAK;AAAA,IACnC,GAAA;AAAA,IACA,MAAA,EAAQ,MAAM,MAAA,CAAO,MAAA,EAAO;AAAA,IAC5B,SAAA,EAAW,MAAM,IAAA,CAAK,WAAA;AAAY,GACnC,CAAA;AACD,EAAA,MAAM,SAAS,YAAA,CAAa;AAAA,IAC1B,GAAA;AAAA,IAAK,SAAA;AAAA,IAAW,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,IAAA;AAAA,IAClC,UAAU,KAAA,CAAM,KAAA;AAAA,IAChB,UAAA,EAAY,SAAS,CAAC,CAAA;AAAA,IACtB,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,UAAU,MAAM,QAAA;AAAA,IAChB,UAAU,OAAO,EAAE,EAAA,EAAI,QAAA,EAAU,MAAM,WAAA,EAAY;AAAA,GACpD,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,IAAA,EAAM,MAAM,KAAK,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,GAAA,EAAK,MAAM,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,KAAA,CAAM,KAAA,EAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,YAAA,EAAc,CAAA;AAEtF,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,GAAA;AAAA,IACT,KAAA,EAAO,MAAM,GAAA,CAAI,KAAA;AAAA,IACjB,MAAM,MAAA,GAAS;AACb,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,IAAI,GAAA,CAAI,KAAA,KAAU,SAAA,EAAW,MAAM,IAAI,MAAA,EAAO;AAC9C,MAAA,MAAM,KAAA,CAAM,MAAA;AAAA,IACd,CAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,MAAM,CAAC,KAAA,EAAO,QAAA,GAAW,OACvB,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,aAAA,CAAc,KAAK,MAAA,EAAQ,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA,IAAQ,KAAK,CAAC,CAAA;AAAA,IACzF,QAAA,EAAU,CAAC,IAAA,KAAS,MAAA,CAAO,OAAO,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACxD,SAAA,EAAW,CAAC,KAAA,KAAU,MAAA,CAAO,OAAO,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAC7D,MAAA,CAAO,KAAA,EAAO,UAAA,GAAa,EAAC,EAAG;AAC7B,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA;AAC5C,MAAA,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,EAAK;AAChC,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,UAAA,EAAY,QAAQ,OAAA,CAAQ,EAAA,EAAI,UAAU,CAAC,CAAA;AACxE,MAAA,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,MAAM,CAAA;AAChC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK;AACxB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,QAAQ,GAAA,EAAK;AACX,MAAA,SAAA,CAAU,UAAU,GAAG,CAAA;AACvB,MAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,IACvC,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,UAAU,KAAA,CAAM,KAAA;AAAA,IAChB,YAAA,EAAc,MAAA;AAAA,IACd,QAAA,CAAS,SAAS,OAAA,EAAS;AAIzB,MAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,GAAA,EAAK,OAAA,GAAU,KAAA,CAAM,KAAK,OAAO,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AACxF,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,OAAO;AAAA,QACL,GAAG,GAAA;AAAA,QACH,OAAA,GAAU;AACR,UAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,UAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,QACd;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,MAAM,GAAA,EAAK;AACT,MAAA,IAAI,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA;AACpE,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,GAAA,IAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,WAAA,CAAY,GAAG,CAAA,EAAG;AAChB,MAAA,QAAA,GAAW,CAAA;AACX,MAAA,IAAI,GAAG,WAAA,GAAc,CAAA;AACrB,MAAA,MAAA,CAAO,YAAA,EAAa;AAAA,IACtB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AACzB,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,SAAA,CAAU,IAAA,EAAK;AACf,MAAA,SAAA,CAAU,KAAA,EAAM;AAChB,MAAA,SAAA,EAAW,OAAA,EAAQ;AACnB,MAAA,KAAA,MAAW,OAAO,CAAC,GAAG,IAAI,CAAA,MAAO,OAAA,EAAQ;AACzC,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,KAAA,CAAM,OAAA,EAAQ;AACd,MAAA,KAAA,CAAM,OAAA,EAAQ;AACd,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,KAAA,CAAM,OAAA,EAAQ;AACd,MAAA,KAAA,CAAM,OAAO,UAAA,EAAW;AACxB,MAAA,IAAI,aAAa,KAAK,GAAA,CAAI,OAAM,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACzD;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACtSO,SAAS,kBAAA,CAAmB,GAAA,EAAuB,IAAA,GAA4B,EAAC,EAAiB;AACtG,EAAA,MAAM,MAAA,GAAS,IAAI,kBAAA,EAAmB;AACtC,EAAA,MAAA,CAAO,IAAA,GAAO,KAAK,IAAA,IAAQ,SAAA;AAC3B,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW,SAAA,CAAU,KAAK,MAAA,CAAO,SAAA,EAAW,KAAK,SAAS,CAAA;AACjF,EAAA,IAAI,IAAA,CAAK,MAAM,MAAA,EAAW,SAAA,CAAU,KAAK,MAAA,CAAO,CAAA,EAAG,KAAK,CAAC,CAAA;AACzD,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW,SAAA,CAAU,KAAK,MAAA,CAAO,IAAA,EAAM,KAAK,IAAI,CAAA;AAClE,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAA,EAAO;AACjD;AAUA,IAAM,QAAA,GAAW,CAAC,GAAA,KAAwB;AACxC,EAAA,IAAI,EAAE,GAAA,IAAO,CAAA,IAAK,GAAA,IAAO,CAAA,CAAA,QAAU,IAAI,UAAA,CAAW,CAAA,sBAAA,EAAyB,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAChG,EAAA,OAAO,GAAA;AACT,CAAA;AAIA,SAAS,MAAA,CACP,GAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACmD;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,EAAW;AAC7B,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,EAAW;AAC3B,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,EAAW;AAC3B,EAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AACjB,EAAA,GAAA,CAAI,QAAQ,MAAM,CAAA;AAClB,EAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AACnB,EAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAClB,EAAA,GAAA,CAAI,QAAQ,MAAM,CAAA;AAClB,EAAA,IAAI,GAAA,GAAM,SAAS,OAAO,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAA0B;AACvC,IAAA,UAAA,CAAW,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,KAAK,MAAM,CAAA;AACzC,IAAA,UAAA,CAAW,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA;AAAA,EACvC,CAAA;AACA,EAAA,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAChC,EAAA,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAC5B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IAAO,MAAA;AAAA,IACP,KAAK,MAAM,GAAA;AAAA,IACX,MAAA,CAAO,OAAO,MAAA,EAAQ;AACpB,MAAA,GAAA,GAAM,SAAS,KAAK,CAAA;AACpB,MAAA,KAAA,CAAM,MAAM,CAAA;AAAA,IACd;AAAA,GACF;AACF;AAkBO,SAAS,kBAAA,CAAmB,KAAuB,IAAA,EAAyC;AACjG,EAAA,MAAM,SAAA,GAAY,IAAI,eAAA,EAAgB;AAEtC,EAAA,SAAA,CAAU,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AACxC,EAAA,SAAA,CAAU,SAAS,IAAA,CAAK,OAAA;AACxB,EAAA,MAAM,IAAI,MAAA,CAAO,GAAA,EAAK,WAAW,SAAA,EAAW,IAAA,CAAK,OAAO,GAAG,CAAA;AAC3D,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,SAAA,EAAW,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,MAAA,EAAQ,EAAE,MAAA,EAAO;AACrF;AAyBA,IAAM,aAAA,GAAgB,CAAC,KAAA,KAA0B;AAC/C,EAAA,IAAI,EAAE,KAAA,GAAQ,EAAA,IAAM,KAAA,GAAQ,CAAA,CAAA,EAAI;AAC9B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,2BAAA,EAA8B,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAAA,EACtG;AACA,EAAA,OAAO,KAAA;AACT,CAAA;AAIO,SAAS,iBAAA,CAAkB,GAAA,EAAuB,IAAA,GAA2B,EAAC,EAAgB;AACnG,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,GAAA;AAC1B,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,KAAM,IAAI,CAAA;AACnD,EAAA,IAAI,EAAA,GAAK,aAAA,CAAc,IAAA,CAAK,QAAA,IAAY,IAAI,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,OAAA,GAAU,GAAI,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,EAAW;AAC5B,EAAA,MAAM,IAAI,MAAA,CAAO,GAAA,EAAK,OAAO,KAAA,EAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AACpD,EAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAClB,EAAA,IAAA,CAAK,QAAQ,KAAK,CAAA;AAClB,EAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,SAAA,EAAW,IAAA,GAAO,GAAI,CAAA;AAC3C,EAAA,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,EAAE,CAAA;AAC5B,EAAA,OAAO;AAAA,IACL,OAAO,CAAA,CAAE,KAAA;AAAA,IAAO,QAAQ,CAAA,CAAE,MAAA;AAAA,IAAQ,KAAA;AAAA,IAAO,KAAK,CAAA,CAAE,GAAA;AAAA,IAAK,QAAQ,CAAA,CAAE,MAAA;AAAA,IAC/D,OAAA,CAAQ,IAAI,MAAA,EAAQ;AAClB,MAAA,IAAI,EAAE,EAAA,IAAM,CAAA,IAAK,EAAA,IAAM,OAAA,CAAA,EAAU;AAC/B,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6BAAA,EAAgC,EAAE,CAAA,eAAA,EAAkB,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,MACvF;AACA,MAAA,UAAA,CAAW,GAAA,EAAK,KAAA,CAAM,SAAA,EAAW,EAAA,GAAK,KAAM,MAAM,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,UAAU,MAAM,EAAA;AAAA,IAChB,WAAA,CAAY,OAAO,MAAA,EAAQ;AACzB,MAAA,EAAA,GAAK,cAAc,KAAK,CAAA;AACxB,MAAA,UAAA,CAAW,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,CAAM,UAAA,EAAW;AACjB,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAAA,GACF;AACF;AAyBO,SAAS,sBAAA,CACd,GAAA,EACA,IAAA,GAAgC,EAAC,EACf;AAClB,EAAA,MAAM,UAAA,GAAa,IAAI,wBAAA,EAAyB;AAChD,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,UAAA,CAAW,QAAQ,MAAM,CAAA;AACzB,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAmB,KAAA,KAAoC;AAClE,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,SAAA,CAAU,GAAA,EAAK,OAAO,KAAK,CAAA;AAAA,EACtD,CAAA;AACA,EAAA,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACxC,EAAA,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AAChC,EAAA,GAAA,CAAI,UAAA,CAAW,QAAQ,IAAA,CAAK,MAAA,KAAW,SAAY,MAAA,GAAY,IAAA,CAAK,SAAS,GAAI,CAAA;AACjF,EAAA,GAAA,CAAI,UAAA,CAAW,SAAS,IAAA,CAAK,OAAA,KAAY,SAAY,MAAA,GAAY,IAAA,CAAK,UAAU,GAAI,CAAA;AACpF,EAAA,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA;AACjC,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,YAAY,MAAA,EAAO;AACjE;;;ACxIA,IAAI,UAAA,GAAa,CAAA;AAIV,SAAS,aAAA,CAAc,MAAA,EAAiC,YAAA,GAAe,CAAA,EAAW;AACvF,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAChE,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA,IAAK,YAAY,CAAC,CAAA,GAAI,YAAA;AAC7D;AAEA,IAAM,UAAA,GAAa,CAAC,GAAA,KAAsB;AACxC,EAAA,IAAI,EAAE,GAAA,GAAM,CAAA,CAAA,IAAM,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,8DAAA,EAAiE,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7F;AACF,CAAA;AAaO,SAAS,mBAAA,CAAoB,QAAqB,IAAA,EAA2C;AAClG,EAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,IAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,aAAiB,UAAA,EAAY,CAAA,CAAA;AAEzC,EAAA,IAAI,MAAM,IAAA,CAAK,KAAA;AACf,EAAA,IAAI,KAAA,GAAQ,KAAK,MAAA,IAAU,CAAA;AAC3B,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,uBAAa,GAAA,EAA4B;AAC7C,EAAA,MAAM,SAAA,GAAY,CAAC,MAAA,EAAiC,GAAA,KAAuB;AACzE,IAAA,MAAA,uBAAa,GAAA,EAAI;AACjB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AAC9B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAC5B,MAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,WAChB,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,MAAA,GAAS,GAAA,IAAO,aAAA,CAAc,MAAA,EAAQ,YAAY,CAAA;AAAA,EACpD,CAAA;AACA,EAAA,SAAA,CAAU,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,KAAK,MAAM,CAAA;AAExC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAiB;AAEpC,EAAA,MAAM,MAAA,GAAS,MAAc,GAAA,GAAS,GAAA,GAAM,YAAA;AAE5C,EAAA,MAAM,OAAO,MAAY;AAAE,IAAA,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,EAAG,CAAA;AAE/D,EAAA,MAAM,IAAA,GAAO,CAAC,SAAA,KAA4B;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,IAAA,GAAO,SAAA;AACX,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,EAAI,GAAI,IAAA;AAC9B,IAAA,IAAI,MAAA,GAAS,QAAO,EAAG;AACrB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,QAAQ,CAAA;AACxC,MAAA,KAAA,IAAS,IAAA;AACT,MAAA,IAAA,IAAQ,OAAO,MAAA,EAAO;AAAA,IACxB;AACA,IAAA,IAAI,CAAC,IAAA,IAAQ,KAAA,IAAS,MAAA,EAAQ;AAC5B,MAAA,OAAA,GAAU,KAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,KAAA,GAAQ,MAAA;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,IAAI,CAAC,EAAE,SAAA,EAAU,EAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA;AAC3D,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC,EAAG;AACtC,MAAA,MAAM,EAAA,GAAK,IAAA,GAAA,CAAQ,CAAA,CAAE,IAAA,GAAO,QAAQ,MAAA,EAAO;AAC3C,MAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,MAAA,IAAU,CAAA,KAAM,OAAO,UAAU,UAAA,GAAa,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,KAAA,CAAA;AAChF,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,GAAG,MAAK,GAAI,CAAA;AACrC,QAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AAAA,MAC9D,CAAA,MAAA,IAAW,WAAW,CAAA,EAAG;AACvB,QAAA,MAAM,EAAE,MAAM,EAAA,EAAI,MAAA,EAAQ,QAAQ,CAAA,EAAG,GAAG,OAAM,GAAI,CAAA;AAClD,QAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,KAAA,GAAQ,MAAA,EAAO,EAAG,CAAC,CAAA;AAAA,MACzF,CAAA,MAAO;AACL,QAAA,MAAM,EAAE,MAAM,EAAA,EAAI,MAAA,EAAQ,QAAQ,CAAA,EAAG,GAAG,MAAK,GAAI,CAAA;AACjD,QAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,KAAA,GAAQ,MAAA,EAAO,EAAG,CAAC,CAAA;AAAA,MACvF;AAAA,IACF;AAGA,IAAA,MAAM,KAAK,MAAA,EAAO;AAClB,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,MAAA,GAAS,MAAM,IAAI,CAAA;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,MAAA,GAAS,KAAA;AAAA,IACX;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,MAAA,GAAS,IAAA,GAAO,EAAA;AAChB,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,EAAM;AACV,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAA,GAAS,IAAA,IAAQ,OAAO,GAAA,EAAI;AAC5B,MAAA,IAAA,EAAK;AAAA,IACP,CAAA;AAAA,IACA,IAAA,GAAO;AACL,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAClB,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ;AAClC,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IACf,CAAA;AAAA,IACA,SAAS,MAAM,OAAA;AAAA,IACf,OAAO,MAAM,GAAA;AAAA,IACb,SAAS,IAAA,EAAM;AACb,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,GAAA,GAAM,IAAA;AAEN,MAAA,IAAI,CAAC,OAAA,IAAW,MAAA,KAAW,IAAA,IAAQ,MAAA,EAAQ;AAC3C,MAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAClB,MAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,GAAS,QAAO,EAAG,MAAA,CAAO,KAAK,CAAA;AACjD,MAAA,IAAA,EAAK;AAAA,IACP,CAAA;AAAA,IACA,UAAU,IAAA,EAAM;AAAE,MAAA,KAAA,GAAQ,IAAA;AAAA,IAAM,CAAA;AAAA,IAChC;AAAA,GACF;AACF;;;ACpLO,SAAS,iBAAA,CACd,QACA,IAAA,EACwB;AACxB,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,GAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,YAAA;AACrC,EAAA,MAAM,UAAU,IAAA,CAAK,MAAA,IAAU,aAAA,CAAc,MAAA,EAAQ,YAAY,CAAA,IAAK,MAAA;AAGtE,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,IAAa,GAAA;AAE/B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC9B,IAAA,MAAM,MAAA,GAAS,OAAA,IAAW,CAAA,GACrB,IAAA,CAAK,QAAQ,CAAC,CAAA,IAAK,MAAA,GAAA,CACnB,CAAA,CAAE,UAAU,CAAA,IAAK,MAAA,GAAS,eAAA,CAAgB,CAAA,CAAE,QAAQ,CAAA,CAAE,OAAA;AAC3D,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,GAAO,MAAA;AACpB,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,IAAO,IAAA,CAAK,GAAA,IAAO,KAAA,EAAO,IAAA,EAAM,EAAA,GAAK,IAAA,EAAM,KAAA,EAAO,EAAA,GAAK,MAAA,EAAO;AAAA,EAChF,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,IAAI,CAAC,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,MAAM,CAAA;AAEnE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA0C;AAC5D,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,EAAC;AACrC,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACxB,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,IAAQ,MAAA,EAAQ,IAAA,EAAA,EAAQ;AACzC,MAAA,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,KAAK,IAAA,GAAO,IAAA,GAAO,QAAQ,EAAA,EAAI,CAAA,EAAE,EAAG,EAAE,IAAI,IAAA,CAAK,KAAA,GAAQ,OAAO,MAAA,EAAQ,EAAA,EAAI,IAAI,CAAA;AAAA,IAChG;AAAA,EACF;AAEA,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,KAAA,EAAO;AAE/B,IAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA;AAC9C,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,IAAA,IAAQ,IAAA,CAAK,EAAA;AACb,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAAA,IAC5B;AACA,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,EACf;AACA,EAAA,OAAO,KAAA;AACT;;;AChDO,IAAM,SAAA,GAAiC;AAAA,EAC5C;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,MAAM,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,IAC5C,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,MAAM,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,IAClD,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,EAAE,OAAA,EAAS,GAAG,OAAA,EAAS,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,IAC/C,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,MAAM,EAAE,OAAA,EAAS,GAAG,OAAA,EAAS,GAAA,EAAK,SAAS,CAAA,EAAE;AAAA,IAC7C,MAAA,EAAQ;AAAA;AAEZ;AASA,IAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,EAAA,EAAY,EAAA,KAAuB,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,CAAC,CAAA;AAEjG,IAAM,OAAA,GAAU,CAAC,IAAA,MAAgC;AAAA,EAC/C,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,EAClC,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,EACjC,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,CAAC;AACnC,CAAA,CAAA;AAIO,SAAS,aAAa,IAAA,EAAkC;AAC7D,EAAA,MAAM,CAAA,GAAI,QAAQ,IAAI,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,UAAU,GAAA,CAAI,CAAC,UAC5B,CAAA,CAAE,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAA,IAAW,CAAA,KAAM,KAAK,CAAA,CAAE,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAA,KAAY,CAAA,GAAA,CAAK,EAAE,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAA,KAAY,CAAC,CAAA;AACvH,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,KAAA,IAAS,CAAA,GAAI,MAAA,CAAO,CAAA,KAAM,KAAK,CAAA,GAAI,IAAI,CAAE,CAAA;AAC7E,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAC/C,EAAA,MAAM,UAAU,EAAC;AACjB,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAAE,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA;AAAA,EAAO,CAAC,CAAA;AACrE,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,CAAC,CAAC,CAAA,CAAE,MAAM,OAAA,EAAQ;AACxE;AAMO,IAAM,UAAA,GAAmD;AAAA,EAC9D,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA;AAAA,EAC7B,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA;AAAA,EAC7B,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA;AAAA,EAC7B,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE,CAAA;AAAA,EAC9B,QAAA,EAAU,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,EAAE;AACjC;AA4BO,SAAS,YAAY,IAAA,EAA8B;AACxD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,OAAA,EAAQ,GAAI,QAAQ,IAAI,CAAA;AAClD,EAAA,MAAM,YAAY,OAAA,GAAU,IAAA;AAC5B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,GAAU,GAAA,GAAM,QAAA,GAClB,OAAA,GAAU,GAAA,GAAM,QAAA,GAChB,OAAA,GAAU,IAAA,GAAO,QAAA,GACjB,OAAA,GAAU,IAAA,GAAO,SAAA,GACjB,UAAA;AAAA,IACJ,UAAU,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA,IAC1C,MAAA,EAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IAC/C,SAAS,OAAA,IAAW,GAAA,GAAM,SAAA,GAAY,OAAA,IAAW,OAAO,SAAA,GAAY,SAAA;AAAA,IACpE,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IAClC,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAK,OAAO,CAAA;AAAA,IACnC,OAAA,EAAS,UAAU,IAAA,GAAO,CAAA,GAAI,UAAU,GAAA,GAAM,CAAA,GAAI,OAAA,GAAU,IAAA,GAAO,CAAA,GAAI,CAAA;AAAA,IACvE,YAAA,EAAc,YAAY,WAAA,GAAc,SAAA;AAAA,IACxC,gBAAgB,OAAA,GAAU,IAAA,GAAO,CAAA,GAAI,OAAA,GAAU,OAAO,CAAA,GAAI,CAAA;AAAA,IAC1D,QAAQ,SAAA,GAAY,IAAA,CAAK,MAAM,GAAA,IAAO,CAAA,GAAI,QAAQ,CAAA,GAAI;AAAA,GACxD;AACF;;;AChIO,IAAM,eAAA,GAAkB;AAe/B,IAAM,WAAA,GAAc,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAOxB,SAAS,UAAA,CAAW,MAAA,EAAqB,KAAA,EAAe,KAAA,GAAQ,CAAA,EAAa;AAClF,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,CAACC,OAAAA,KACZ,MAAA,CAAO,WAAW,KAAA,GAAQ,KAAA,CAAMA,OAAAA,GAAS,CAAC,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAMA,UAAS,CAAC,CAAA;AAC1E,EAAA,IAAI,MAAA,CAAO,YAAY,SAAA,EAAW;AAChC,IAAA,MAAMC,KAAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,CAACA,KAAAA,EAAMA,KAAAA,GAAO,CAAA,EAAGA,QAAO,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,GAAQ,WAAA,CAAY,MAAM,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,KAAK,MAAM,CAAA;AACxB,EAAA,IAAI,MAAA,CAAO,OAAA,KAAY,SAAA,EAAW,OAAO,CAAC,IAAA,EAAM,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,EAAA,EAAI,IAAA,GAAO,EAAE,CAAA;AAC9E,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,CAAC,IAAA,EAAM,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAM,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,EAAE,CAAA;AAG3D,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,EAAE,CAAA;AACvD,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,MAAA,CAAO,OAAe,IAAA,EAAoC;AACjE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AACvD,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,KAAA;AAC/B,EAAA,IAAI,KAAA,GAAS,SAAS,CAAA,IAAM,CAAA;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAClC,IAAA,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,OAAO,IAAI,UAAA,KAAgB,CAAA;AACrD,IAAA,MAAM,CAAA,GAAI,SAAS,CAAA,GAAI,CAAA,CAAA;AACvB,IAAA,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,KAAA,GAAkB,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,GAAA,EAAK,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,EAAA,EAAG;AAYpE,SAAS,QAAA,CAAS,MAAA,EAAqB,GAAA,EAAa,IAAA,GAAwB,EAAC,EAAkB;AACpG,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,GAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,MAAA,CAAO,cAAc,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA;AACpF,EAAA,MAAM,QAAkB,EAAE,MAAA,EAAQ,OAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,MAAA,EAAO;AACxE,EAAA,MAAM,IAAA,GAAO,OAAO,YAAA,KAAiB,WAAA;AACrC,EAAA,MAAM,OAAO,CAAC,IAAA,EAAc,MAAA,EAAgB,IAAA,EAAc,OAAeC,SAAAA,MAAqC;AAAA,IAC5G,IAAA;AAAA,IAAM,MAAA;AAAA,IAAQ,KAAA,EAAO,EAAE,IAAA,EAAK;AAAA,IAAG,MAAM,IAAA,GAAO,KAAA;AAAA,IAAO,QAAA,EAAAA,SAAAA;AAAA,IACnD,IAAA,EAAM,OAAO,MAAA,GAAS,UAAA;AAAA,IACtB,GAAI,KAAK,GAAA,KAAQ,MAAA,GAAY,EAAC,GAAI,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA;AAAI,GACpD,CAAA;AACA,EAAA,MAAM,MAAM,CAAC,KAAA,EAAeA,SAAAA,KAC1B,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,CAAA,EAAG,iBAAiB,IAAA,EAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQA,SAAQ,CAAC,CAAA;AAEpF,EAAA,IAAI,OAAO,OAAA,KAAY,CAAA,EAAG,OAAO,GAAA,CAAI,GAAG,KAAK,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,OAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,KAAK,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,OAAO,KAAA,GAAQ,KAAA;AAChC,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,GAAQ,iBAAiB,KAAA,EAAA,EAAS;AAC5D,IAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9C,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,KAAA,GAAQ,KAAA,EAAO,OAAO,IAAA,EAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC3D,IAAA,IAAI,MAAA,IAAU,CAAA,IAAK,KAAA,GAAQ,CAAA,KAAM,GAAG,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,EAAO,IAAA,GAAO,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,EACvG;AACA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,CAAA,EAAG,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,KAAK,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC,CAAA,GAAI,IAAI,GAAA,EAAK,EAAE,QAAQ,CAAA,EAAG,OAAA,EAAS,GAAA,EAAK,CAAC,CAAA;AAAA,EACvG;AACA,EAAA,IAAI,MAAA,IAAU,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,GAAG,GAAA,CAAI,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,GAAA,EAAK,CAAC,CAAA;AACxE,EAAA,OAAO,MAAA;AACT;;;ACjDO,SAAS,WAAA,CAAY,QAAqB,IAAA,EAA2B;AAC1E,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,GAAG,SAAQ,GAAI,IAAA;AAC7C,EAAA,IAAIR,OAAAA,GAAS,OAAA;AAEb,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAa,MAAA,KAA0C;AACtE,IAAA,MAAM,GAAA,GAAM,aAAaA,OAAM,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,MAAA,EAAQ,UAAU,MAAA,CAAO,GAAA,CAAI,SAAS,GAAA,CAAI,IAAA,GAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,MACrE,IAAA,EAAMA,OAAAA;AAAA,MACN,GAAA;AAAA,MACA,MAAA,EAAQ,YAAYA,OAAM;AAAA,KAC5B;AAAA,EACF,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAsB,QAAA,CAAS,MAAM,MAAA,EAAQ,KAAA,CAAM,QAAQ,OAAO,CAAA;AAEpF,EAAA,IAAI,OAAA,GAAU,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAA;AAC7B,EAAA,IAAI,IAAA,GAAO,OAAA;AAEX,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAA,EAAQ;AAAA,IACzC,KAAA,EAAO,QAAQ,MAAA,CAAO,KAAA;AAAA,IACtB,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACxB,MAAA,CAAO,MAAM,IAAA,EAAM;AACjB,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,KAAA,GAAQ,SAAS,IAAI,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,IAAA,KAAS,kBAAkB,CAAA,EAAG;AAClC,MAAA,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA;AACvC,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACjC,MAAA,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG,eAAe,CAAA;AAAA,IAClD;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,EAAM;AACV,MAAA,IAAI,MAAA,CAAO,SAAQ,EAAG;AACtB,MAAA,OAAA,GAAU,IAAA,GAAO,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAA;AAChC,MAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACpC,MAAA,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG,eAAe,CAAA;AACnD,MAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,IAAA,EAAM,MAAM,MAAA,CAAO,IAAA,EAAK;AAAA,IACxB,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,EAAQ;AAAA,IAC9B,MAAM,MAAMA,OAAAA;AAAA,IACZ,QAAQ,IAAA,EAAM;AAAE,MAAAA,OAAAA,GAAS,IAAA;AAAA,IAAM,CAAA;AAAA,IAC/B,OAAO,MAAM;AAAA,GACf;AACF;;;ACrFO,SAAS,kBAAA,CACd,MACA,SAAA,EACA,UAAA,EACA,IAAI,CAAA,EACJ,IAAA,GAAO,GACP,IAAA,GAA2B,EAAE,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,GAAE,EAC3C;AAEpB,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,SAAA,EAAW,IAAI,CAAA,EAAG,UAAA,GAAa,MAAM,CAAA;AACjE,EAAA,MAAM,EAAA,GAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA,GAAK,UAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACvB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACvB,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,GAAO,EAAA,CAAA;AACxB,EAAA,MAAM,SAAS,GAAA,IAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,GAAA,IAAO,CAAA,GAAI,EAAA,KAAO,CAAA,GAAI,EAAA,CAAA,CAAA;AACtC,EAAA,MAAM,QAAQ,GAAA,GAAM,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,EAAA,IAAI,EAAA,GAAA,CAAM,IAAI,GAAA,IAAO,CAAA;AACrB,EAAA,IAAI,KAAK,CAAA,GAAI,GAAA;AACb,EAAA,IAAI,EAAA,GAAK,EAAA;AACT,EAAA,IAAI,KAAK,CAAA,GAAI,OAAA;AACb,EAAA,IAAI,KAAK,EAAA,GAAK,GAAA;AACd,EAAA,IAAI,KAAK,CAAA,GAAI,OAAA;AACb,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,EAAA,GAAK,EAAA,GAAA,CAAM,IAAI,GAAA,IAAO,CAAA;AACtB,IAAA,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA,CAAA;AAAA,EACb,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,EAAA,GAAK,IAAI,MAAA,GAAS,CAAA;AAClB,IAAA,EAAA,GAAK,EAAA,GAAK,GAAA;AACV,IAAA,EAAA,GAAK,IAAI,MAAA,GAAS,CAAA;AAClB,IAAA,EAAA,GAAK,IAAI,MAAA,GAAS,CAAA;AAClB,IAAA,EAAA,GAAK,IAAI,MAAA,GAAS,CAAA;AAAA,EACpB,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,GAAA,GAAM,KAAA,CAAA;AAClC,IAAA,EAAA,GAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,GAAA,CAAA;AAChC,IAAA,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,GAAA,GAAM,KAAA,CAAA;AAClC,IAAA,EAAA,GAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,GAAA,GAAM,KAAA;AAC7B,IAAA,EAAA,GAAK,EAAA,IAAM,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,GAAA,CAAA;AAC7B,IAAA,EAAA,GAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,GAAA,GAAM,KAAA;AAAA,EAC/B,CAAA,MAAA,IAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,GAAA,GAAM,KAAA,CAAA;AAClC,IAAA,EAAA,GAAK,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,GAAA,CAAA;AACjC,IAAA,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,GAAA,GAAM,KAAA,CAAA;AAClC,IAAA,EAAA,GAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,GAAA,GAAM,KAAA;AAC7B,IAAA,EAAA,GAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,GAAA,CAAA;AAC5B,IAAA,EAAA,GAAK,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,GAAA,GAAM,KAAA;AAAA,EAC/B,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAE7B,IAAA,EAAA,GAAK,CAAA,GAAI,MAAA;AACT,IAAA,EAAA,GAAK,CAAA,GAAI,MAAA;AACT,IAAA,EAAA,GAAK,SAAS,UAAA,GAAa,MAAA,GAAS,IAAA,KAAS,OAAA,GAAU,IAAI,CAAA,GAAI,MAAA;AAC/D,IAAA,EAAA,GAAK,IAAA,KAAS,UAAA,GAAa,CAAA,GAAI,EAAA,GAAK,GAAA;AACpC,IAAA,EAAA,GAAK,SAAS,UAAA,GAAa,CAAC,SAAS,IAAA,KAAS,OAAA,GAAU,IAAI,CAAA,GAAI,MAAA;AAAA,EAClE;AACA,EAAA,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA;AACf,EAAA,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA;AACf,EAAA,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA;AACf,EAAA,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA;AACf,EAAA,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA;AACf,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,gBAAA,CAAiB,CAAA,EAAuB,EAAA,EAAY,UAAA,EAA4B;AAC9F,EAAA,MAAM,CAAA,GAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,EAAA,GAAM,UAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AACzB,EAAA,MAAM,GAAA,GAAA,CAAO,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,KAAK,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,EAAA,KAAO,KAAK,CAAA,CAAE,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,KAAK,EAAA,KAAO,CAAA;AAC7E,EAAA,MAAM,GAAA,GAAA,CAAO,CAAA,GAAI,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,EAAA,KAAO,CAAA,GAAA,CAAK,CAAA,CAAE,EAAA,GAAK,EAAA,GAAK,CAAA,CAAE,KAAK,EAAA,KAAO,CAAA;AAC1E,EAAA,OAAO,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,GAAG,CAAA;AAClC;;;AClFA,IAAM,GAAA,GAAM,IAAI,IAAA,CAAK,EAAA;AAErB,IAAM,WAAA,GAAc,IAAA;AAIpB,IAAM,uBAAuB,CAAA,GAAI,GAAA;AAIjC,SAAS,QAAA,CAAS,GAAW,EAAA,EAAoB;AAC/C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAC1B,EAAA,IAAI,IAAI,CAAA,EAAG;AACT,IAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,IAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,CAAA,GAAI,IAAI,CAAA,EAAG;AACb,IAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,IAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,CAAA;AACT;AAEO,IAAM,YAAuB,CAAC,KAAA,KAAU,IAAA,CAAK,GAAA,CAAI,MAAM,KAAK,CAAA;AAInE,IAAM,gBAAgB,CAAA,GAAI,OAAA;AAG1B,IAAM,QAAA,GAA2E;AAAA,EAC/E,IAAA,EAAM,SAAA;AAAA,EACN,QAAQ,CAAC,KAAA,EAAO,EAAA,KAAO,aAAA,IAAA,CAAkB,QAAQ,GAAA,GAAM,CAAA,GAAI,EAAA,IAAM,QAAA,CAAS,OAAO,EAAE,CAAA,GAAI,UAAU,KAAA,GAAQ,GAAA,IAAO,GAAG,EAAE,CAAA,CAAA;AAAA,EACrH,QAAA,EAAU,CAAC,KAAA,EAAO,EAAA,KAAO;AACvB,IAAA,MAAM,CAAA,GAAA,CAAK,QAAQ,GAAA,IAAO,CAAA;AAC1B,IAAA,OAAO,iBAAiB,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,GAAG,EAAE,CAAA,CAAA;AAAA,EACpD,CAAA;AAAA,EACA,QAAA,EAAU,CAAC,KAAA,EAAO,EAAA,KAAO;AACvB,IAAA,IAAI,EAAA,GAAK,oBAAA,EAAsB,OAAO,KAAA,GAAQ,IAAA,GAAO,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAC5G,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,GAAA,EAAK,KAAK,CAAA,EAAG;AACpC,MAAA,CAAA,IAAM,OAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,KAAK,KAAM,CAAA,GAAI,CAAA,CAAA;AAC/C,MAAA,IAAA,GAAO,CAAC,IAAA;AAAA,IACV;AACA,IAAA,OAAQ,CAAA,GAAI,CAAA,IAAM,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,CAAA;AAAA,EACnC;AACF,CAAA;AAIA,SAAS,cAAc,MAAA,EAAsC;AAC3D,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAe,KAAA,KAA0B;AACpD,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,KAAK,CAAA,EAAG,CAAA,IAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAI,KAAK,CAAA;AACjF,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,aAAa,CAAA,IAAK,CAAA,SAAU,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA,GAAI,aAAa,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA;AAC5G,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,IAAA,GAAO,CAAA;AACpC,EAAA,OAAO,CAAC,KAAA,EAAO,EAAA,KAAO,KAAA,GAAQ,GAAA,CAAI,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,IAAA,CAAK,GAAA,GAAM,EAAE,CAAA,GAAI,CAAC,CAAC,CAAA;AAC3F;AAGO,SAAS,UAAU,IAAA,EAAgD;AACxE,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,SAAS,IAAI,CAAA,GAAI,cAAc,IAAI,CAAA;AACvE;;;ACzBA,IAAM,SAAS,CAAC,IAAA,EAAc,MAAA,KAA2B,IAAA,GAAO,MAAM,MAAA,GAAS,IAAA,CAAA;AAG/E,SAAS,WAAA,CACP,MACA,UAAA,EAC4D;AAC5D,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,SAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,KAAK,QAAA,IAAY,MAAA,KAAW,IAAI,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA;AAC7E,EAAA,MAAM,YAAA,GAAe,mBAAmB,IAAA,EAAM,IAAA,CAAK,WAAW,UAAA,EAAY,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AAC3F,EAAA,IAAI,SAAS,IAAA,CAAK,SAAA;AAClB,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,IAAA,KAAS;AACrB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,KAAK,IAAA,CAAK,SAAA,GAAY,SAAS,aAAA,CAAc,GAAA,EAAK,GAAG,IAAI,CAAA;AAC/D,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAA,GAAS,EAAA;AACT,QAAA,kBAAA,CAAmB,MAAM,EAAA,EAAI,UAAA,EAAY,KAAK,CAAA,EAAG,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,MAC1E;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,EAAA,GAAK,CAAA,GAAI,EAAA;AAChC,IAAA,EAAA,GAAK,YAAA,CAAa,EAAA,GAAK,CAAA,GAAI,YAAA,CAAa,KAAK,CAAA,GAAI,EAAA;AACjD,IAAA,EAAA,GAAK,YAAA,CAAa,EAAA,GAAK,CAAA,GAAI,YAAA,CAAa,EAAA,GAAK,CAAA;AAC7C,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AACF;AAIA,SAAS,YAAA,CAAa,KAAA,EAAgB,UAAA,EAAoB,MAAA,EAA6B;AACrF,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA,GAAS,YAAY,KAAA,CAAM,MAAA,EAAQ,UAAU,CAAA,GAAI,IAAA;AACtE,EAAA,MAAM,cAAc,GAAA,GAAO,UAAA;AAC3B,EAAA,IAAI,OAAO,KAAA,CAAM,QAAA;AACjB,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAA,CAAM,UAAU,CAAC,CAAA;AACpD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,OAAO;AAAA,IACL,OAAO,GAAA,EAAK,IAAA,GAAO,CAAA,EAAG,EAAA,GAAK,IAAI,MAAA,EAAQ;AACrC,MAAA,IAAI,OAAO,OAAO,KAAA;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,EAAA,EAAI,KAAK,CAAA,EAAG;AACjC,QAAA,MAAM,IAAI,CAAA,GAAI,WAAA;AACd,QAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAA,IAAK,IAAA,GAAO,IAAI,OAAA,EAAS;AACjD,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA;AAC1B,QAAA,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA,GAAO,aAAA,CAAc,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,IAAK,MAAA,GAAS,MAAA,CAAO,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,GAAI,GAAA,CAAA;AAChF,QAAA,CAAA,IAAK,CAAA;AAAA,MACP;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,MAAM,IAAI,CAAA,GAAI,WAAA;AACd,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,MAAA,CAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,IAAA,GAAO,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;AAGO,SAAS,gBAAA,CAAiB,MAAkB,UAAA,EAAiC;AAClF,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAS,GAAI,YAAY,IAAI,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,EAAO,EAAA,IAAM,KAAK,QAAA,IAAY,GAAA;AACnD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO,KAAA,KAAU,QAAA;AACrC,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,MAAA;AAC1B,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAI,CAAA,GAAI,SAAA,GAAY,UAAU,IAAI,CAAA;AAC7D,EAAA,MAAM,KAAA,GAA0E,QAAA,GAC5E,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA,GAChF,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AACpC,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,UAAA,EAAY,CAAC,GAAG,IAAA,KAAS;AACjD,IAAA,IAAI,EAAA,GAAK,IAAA;AACT,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,MAAM,CAAA,GAAI,UAAU,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,EAAA,GAAK,SAAS,IAAA,GAAA,CAAQ,OAAA,GAAU,QAAQ,CAAA,GAAI,IAAA,GAAA,CAAQ,UAAU,IAAA,KAAS,CAAA;AAAA,IACzE;AACA,IAAA,MAAM,MAAA,GAAU,KAAK,IAAA,GAAQ,UAAA;AAC7B,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,SAAS,IAAA,CAAK,KAAA;AAEzB,MAAA,IAAI,MAAM,GAAA,EAAK;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,KAAU,MAAA,GAAY,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,KAAK,KAAK,CAAA;AACzF,MAAA,GAAA,IAAO,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,EAAE,CAAA;AACnC,MAAA,IAAA,CAAK,KAAA,GAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,EAAA,IAAM,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,IAAM,KAAA,uBAAY,GAAA,EAA0B;AAG5C,SAAS,SAAA,CAAU,OAAmB,UAAA,EAAkC;AACtE,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,GAAO,aAAa,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,aAAa,CAAC,CAAA;AACjE,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,iBAAA,CACd,KAAA,EACA,UAAA,EACA,MAAA,GAAuB,KAAK,MAAA,EACf;AACb,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA;AAE9C,EAAA,IAAI,KAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,GAAI,KAAK,MAAM,CAAA;AAC1C,EAAA,OAAO,YAAA,CAAa,KAAA,EAAO,UAAA,EAAY,CAAC,IAAI,IAAA,KAAS;AACnD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AACvB,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAA,CAAM,CAAA,GAAI,KAAK,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA,KAAM,EAAA,GAAK,CAAA,CAAA;AAC7D,IAAA,EAAA,GAAA,CAAM,EAAA,GAAK,QAAQ,IAAA,CAAK,MAAA;AACxB,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,WAAA,CAAY,MAAA,EAAqB,KAAA,EAAgB,UAAA,EAAoB,IAAA,EAA4B;AACxG,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,kBAAA,EAAqB,IAAI,CAAA,8CAAA,CAAgD,CAAA;AAAA,EAChG;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,GAAW,eAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA,CAAE,OAAA;AAC/D,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,IAAA,CAAK,MAAO,KAAA,GAAQ,UAAA,GAAc,GAAI,CAAC,CAAA;AACpE,EAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AACjB,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,UAAA,CAAW,MAAkB,UAAA,EAAkC;AAC7E,EAAA,OAAO,YAAY,gBAAA,CAAiB,IAAA,EAAM,UAAU,CAAA,EAAG,IAAA,EAAM,YAAY,YAAY,CAAA;AACvF;AAGO,SAAS,WAAA,CACd,KAAA,EACA,UAAA,EACA,MAAA,GAAuB,KAAK,MAAA,EACd;AACd,EAAA,OAAO,WAAA,CAAY,kBAAkB,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAG,KAAA,EAAO,YAAY,aAAa,CAAA;AACnG;;;AC3LA,SAAS,WAAW,IAAA,EAA4B;AAC9C,EAAA,IAAI,IAAI,IAAA,KAAS,CAAA;AACjB,EAAA,OAAO,MAAM;AACX,IAAA,CAAA,GAAK,IAAI,UAAA,KAAgB,CAAA;AACzB,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,EAAA,EAAK,IAAI,CAAC,CAAA;AACnC,IAAA,CAAA,IAAK,IAAI,IAAA,CAAK,IAAA,CAAK,IAAK,CAAA,KAAM,CAAA,EAAI,IAAI,EAAE,CAAA;AACxC,IAAA,OAAA,CAAA,CAAS,CAAA,GAAK,CAAA,KAAM,EAAA,MAAS,CAAA,IAAK,UAAA;AAAA,EACpC,CAAA;AACF;AAGO,SAAS,eAAA,CACd,GAAA,EACA,OAAA,EACA,IAAA,GAA+B,EAAC,EACnB;AACb,EAAA,IAAI,EAAE,UAAU,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,CAAA,iCAAA,EAAoC,OAAO,CAAA,kBAAA,CAAoB,CAAA;AACxG,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,EAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,GAAU,GAAA,CAAI,UAAU,CAAC,CAAA;AAC/D,EAAA,MAAM,SAAS,GAAA,CAAI,YAAA,CAAa,QAAA,EAAU,MAAA,EAAQ,IAAI,UAAU,CAAA;AAChE,EAAA,MAAM,IAAA,GAAQ,OAAA,GAAU,EAAA,GAAM,IAAA,CAAK,IAAA;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,KAAK,CAAA,EAAG;AACpC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,GAAO,CAAA,GAAI,UAAU,CAAA;AAC7C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,CAAC,CAAA,GAAA,CAAK,IAAA,EAAK,GAAI,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAK,CAAC,IAAA,GAAO,CAAA,GAAK,MAAM,CAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;AC3BO,SAAS,cAAA,CAAe,QAAA,EAAkB,IAAA,EAAe,WAAA,EAA+B;AAE7F,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,WAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,WAAA;AAET,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAsB;AACpC,IAAA,IAAI,CAAA,IAAK,IAAI,OAAO,EAAA;AACpB,IAAA,OAAO,CAAA,IAAK,KAAK,EAAA,GAAK,EAAA,GAAA,CAAO,KAAK,EAAA,KAAO,CAAA,GAAI,OAAQ,EAAA,GAAK,EAAA,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,WAAW,CAAC,CAAA,KAChB,KAAK,EAAA,GAAA,CAAO,CAAA,GAAI,OAAO,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,CAAA,GAAM,KAAM,EAAA,GAAK,EAAA,KAAO,KAAK,EAAA,CAAA,GAAO,CAAA,GAAA,CAAK,IAAI,EAAA,IAAM,EAAA;AACzF,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KACZ,IAAA,GAAA,CAAS,IAAI,QAAA,GAAY,QAAA,IAAY,QAAA,GAAW,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,GAAG,QAAQ,CAAA;AACnF,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAsB;AAChC,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,GAAG,KAAK,CAAA;AAC3C,IAAA,OAAO,CAAA,IAAK,IAAA,GAAO,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACxE,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,IAAA,KAAuB;AAC9C,IAAA,EAAA,GAAK,CAAA;AACL,IAAA,EAAA,GAAK,CAAA;AACL,IAAA,EAAA,GAAK,IAAA;AACL,IAAA,EAAA,GAAK,IAAA;AAAA,EACP,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,CAAM,MAAM,GAAA,EAAK;AACf,MAAA,GAAA,GAAM,GAAG,KAAK,CAAA;AACd,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AACzB,MAAA,KAAA,GAAQ,QAAA;AACR,MAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AACZ,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,IAAA,CAAK,MAAM,GAAA,EAAK;AACd,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK;AACvB,MAAA,GAAA,GAAM,GAAG,GAAG,CAAA;AACZ,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,GAAA,EAAK,IAAI,GAAG,KAAK,CAAA;AAC1C,MAAA,EAAA,GAAK,OAAO,GAAG,CAAA;AACf,MAAA,EAAA,GAAK,GAAA;AACL,MAAA,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,GAAI,GAAA;AACjC,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA;AAAA,IACA,OAAO,GAAA,EAAK;AACV,MAAA,GAAA,GAAM,CAAA;AACN,MAAA,IAAA,GAAO,GAAA;AACP,MAAA,KAAA,GAAQ,GAAA;AAAA,IACV;AAAA,GACF;AACF;;;ACzDA,SAAS,WAAA,CAAiC,KAAuB,IAAA,EAAe;AAC9E,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,IAAI,IAAA,GAAiB,IAAA;AACrB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAO;AAC1B,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAM,MAAgB,IAAA;AAAA,IACtB,QAAA,EAAU,MAAY,IAAA,GAAO,CAAC,IAAA,EAAM,GAAG,MAAM,CAAA,GAAI,CAAC,GAAG,MAAM,CAAA;AAAA;AAAA,IAE3D,KAAA,CAAM,IAAA,EAAc,KAAA,EAA0B,MAAA,EAAiB,KAAA,EAAuB;AACpF,MAAA,MAAM,OAAO,IAAA,EAAK;AAClB,MAAA,KAAA,CAAM,IAAI,CAAA;AACV,MAAA,IAAA,CAAK,QAAQ,MAAM,CAAA;AACnB,MAAA,IAAA,CAAK,UAAU,MAAM;AACnB,QAAA,IAAI,SAAS,IAAA,EAAM;AACnB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,IAAA,CAAK,UAAA,EAAW;AAChB,QAAA,KAAA,IAAQ;AAAA,MACV,CAAA;AACA,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,WACnC,IAAA,CAA+B,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AACvD,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,IAAI,IAAA,EAAoB;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,MAAA,IAAA,CAAK,UAAU,MAAM;AACnB,QAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAClB,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB,CAAA;AACA,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,OAAA,GAAgB;AACd,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,UAAA,EAAW;AAChB,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAA,CAAO,UAAA,EAAW;AAAA,IACpB,CAAA;AAAA,IACA,KAAA,EAAO,CAAC,KAAA,EAAe,MAAA,KAAyB,WAAW,GAAA,EAAK,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAM;AAAA,GAC5F;AACF;AAUO,SAAS,oBAAA,CAAqB,KAAuB,IAAA,EAA2C;AACrG,EAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,IAAA;AAC1B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,MAAA,CAAO,QAAA,EAAU,MAAM,IAAI,CAAA;AACvD,EAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,EAAK,MAAM,GAAA,CAAI,oBAAoB,CAAA;AAE7D,EAAA,OAAO;AAAA,IACL,QAAQ,EAAC;AAAA,IACT,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,IAAA,CAAK,OAAO,MAAA,EAAQ;AAClB,QAAA,KAAA,MAAW,GAAA,IAAO,MAAM,QAAA,EAAS,aAAc,GAAA,EAAK,GAAA,CAAI,YAAA,EAAc,KAAA,EAAO,MAAM,CAAA;AACnF,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,GAAA,CAAI,WAAW,CAAA;AACxC,QAAA,IAAA,GAAO,KAAA;AAAA,MACT,CAAA;AAAA,MACA,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,IACA,KAAA,CAAM,MAAM,KAAA,EAAO;AACjB,MAAA,IAAI,KAAA,CAAM,MAAK,EAAG;AAClB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,IAAI,WAAW,CAAA;AAC/C,MAAA,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA,KAAM;AACvB,QAAA,CAAA,CAAE,MAAA,GAAS,MAAA;AACX,QAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,QAAA,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,YAAA,EAAc,IAAI,CAAA;AAAA,MACrC,CAAA,EAAG,QAAQ,MAAM;AACf,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,WAAW,CAAA;AAC3B,QAAA,KAAA,IAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,KAAK,IAAA,EAAM;AACT,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACnB,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,WAAW,CAAA;AAC/B,MAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAWO,SAAS,oBAAA,CAAqB,KAAuB,IAAA,EAA2C;AACrG,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,MAAA;AAC1B,EAAA,IAAI,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AAClC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,EAAK,MAAM,GAAA,CAAI,kBAAkB,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,QAAQ,EAAC;AAAA,IACT,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,SAAA,CAAU,OAAO,MAAA,EAAQ;AACvB,QAAA,KAAA,MAAW,GAAA,IAAO,MAAM,QAAA,EAAS,aAAc,GAAA,EAAK,GAAA,CAAI,SAAA,EAAW,KAAA,EAAO,MAAM,CAAA;AAChF,QAAA,SAAA,GAAY,KAAA;AAAA,MACd,CAAA;AAAA,MACA,MAAA,CAAO,OAAO,MAAA,EAAQ;AACpB,QAAA,KAAA,MAAW,GAAA,IAAO,MAAM,QAAA,EAAS,aAAc,GAAA,EAAK,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAC7E,QAAA,MAAA,GAAS,KAAA;AAAA,MACX,CAAA;AAAA,MACA,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,IACA,KAAA,CAAM,MAAM,KAAA,EAAO;AACjB,MAAA,IAAI,KAAA,CAAM,MAAK,EAAG;AAClB,MAAA,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAC,GAAA,KAAQ;AACzB,QAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,GAAA,CAAI,IAAA,GAAO,IAAA;AAAA,aACpC,GAAA,CAAI,eAAA,CAAgB,YAAA,CAAa,GAAA,EAAK,IAAI,CAAC,CAAA;AAChD,QAAA,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AACvC,QAAA,SAAA,CAAU,GAAA,EAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAAA,MACnC,CAAA,EAAG,QAAW,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,MAAM,KAAA,CAAM,GAAA;AAAA,IACZ,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAQO,SAAS,eAAA,CAAgB,KAAuB,IAAA,EAAsC;AAC3F,EAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,EAAK,MAAM,GAAA,CAAI,oBAAoB,CAAA;AAC7D,EAAA,OAAO;AAAA,IACL,QAAQ,EAAC;AAAA,IACT,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,IAC7B,KAAA,CAAM,MAAM,KAAA,EAAO;AACjB,MAAA,IAAI,KAAA,CAAM,MAAK,EAAG;AAClB,MAAA,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAC,GAAA,KAAQ;AACzB,QAAA,GAAA,CAAI,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AACxC,QAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AAAA,MACb,CAAA,EAAG,QAAW,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,MAAM,KAAA,CAAM,GAAA;AAAA,IACZ,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;;;ACnKO,SAAS,cAAA,CAAe,GAAA,EAAuB,IAAA,GAA0B,EAAC,EAAiB;AAChG,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,EAAW;AAC5B,EAAA,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AACxC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,EAAK;AAAA,IACnB,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAC,KAAA,EAAO,MAAA,KAAW,UAAA,CAAW,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAE,GAC/E;AACF;AAGO,SAAS,aAAA,CAAc,GAAA,EAAuB,IAAA,GAAyB,EAAC,EAAiB;AAC9F,EAAA,MAAM,IAAA,GAAO,IAAI,kBAAA,EAAmB;AACpC,EAAA,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,OAAO,CAAC,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,EAAK;AAAA,IACnB,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,EAAE,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,KAAW,UAAA,CAAW,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AAAE,GAC7E;AACF;AAGO,SAAS,aAAA,CAAc,KAAuB,IAAA,EAAmD;AACtG,EAAA,IAAI,KAAK,MAAA,CAAO,MAAA,KAAW,GAAG,MAAM,IAAI,WAAW,kDAAkD,CAAA;AACrG,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,MAAM,SAAoC,EAAC;AAC3C,EAAA,MAAM,SAAkE,EAAC;AACzE,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,IAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,8CAAA,EAAiD,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/E;AACA,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,EAAW;AAC7B,IAAA,KAAA,CAAM,QAAQ,MAAM,CAAA;AACpB,IAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AACf,IAAA,MAAA,CAAO,IAAI,CAAA,GAAI,CAAC,KAAA,EAAO,MAAA,KAAW,WAAW,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO;AAClC;AAGO,SAAS,UAAA,CAAW,QAAsB,MAAA,EAA8C;AAC7F,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAE,EAAA,EAAI,MAAA,CAAO,KAAA,EAAM;AAAA,IAC3B,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,MAAA;AAAA,IACA,GAAI,MAAA,CAAO,OAAA,GAAU,EAAE,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,EAAS,EAAE,GAAI;AAAC,GAC/D;AACF;AAGO,SAAS,UAAA,CAAW,GAAA,EAAuB,IAAA,GAA4B,EAAC,EAAiB;AAC9F,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,kBAAA,CAAmB,KAAK,IAAI,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB,CAAC,KAAA,EAAe,WAAmB,UAAA,CAAW,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACpG,EAAA,OAAO,WAAW,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAO,EAAG;AAAA,IACnD,SAAA,EAAW,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IACjC,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAAA,IACjB,IAAA,EAAM,KAAA,CAAM,MAAA,CAAO,IAAI;AAAA,GACxB,CAAA;AACH;AAGO,SAAS,SAAA,CAAU,GAAA,EAAuB,IAAA,GAA2B,EAAC,EAAiB;AAC5F,EAAA,MAAM,KAAK,iBAAA,CAAkB,GAAA,EAAK,EAAE,GAAG,MAAM,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,IAAI,GAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,CAAC,GAAG,CAAA;AACtG,EAAA,OAAO,WAAW,EAAA,EAAI;AAAA,IACpB,MAAM,CAAC,KAAA,EAAO,WAAW,EAAA,CAAG,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,IACjD,UAAU,CAAC,KAAA,EAAO,WAAW,EAAA,CAAG,WAAA,CAAY,OAAO,MAAM,CAAA;AAAA,IACzD,KAAK,CAAC,KAAA,EAAO,WAAW,EAAA,CAAG,MAAA,CAAO,OAAO,MAAM;AAAA,GAChD,CAAA;AACH;AAUO,SAAS,UAAA,CAAW,GAAA,EAAuB,IAAA,GAA0B,EAAC,EAAiB;AAC5F,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,GAAG,MAAK,GAAI,IAAA;AACtC,EAAA,MAAM,EAAA,GAAK,kBAAA,CAAmB,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,OAAA,IAAW,eAAA,CAAgB,GAAA,EAAK,OAAA,IAAW,CAAC,GAAG,CAAA;AACtG,EAAA,OAAO,UAAA,CAAW,EAAA,EAAI,EAAE,GAAA,EAAK,CAAC,KAAA,EAAO,MAAA,KAAW,EAAA,CAAG,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA,EAAG,CAAA;AAC5E;AAGO,SAAS,cAAA,CAAe,GAAA,EAAuB,IAAA,GAAgC,EAAC,EAAiB;AACtG,EAAA,MAAM,EAAA,GAAK,sBAAA,CAAuB,GAAA,EAAK,IAAI,CAAA;AAC3C,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,EAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAe,KAAA,GAAQ,CAAA,KAAM,CAAC,KAAA,EAAe,MAAA,KAC1D,UAAA,CAAW,GAAA,EAAK,CAAA,EAAG,KAAA,GAAQ,OAAO,MAAM,CAAA;AAC1C,EAAA,OAAO,WAAW,EAAA,EAAI;AAAA,IACpB,SAAA,EAAW,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA;AAAA,IACrC,IAAA,EAAM,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA;AAAA,IAC3B,KAAA,EAAO,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA;AAAA,IAC7B,MAAA,EAAQ,KAAA,CAAM,UAAA,CAAW,MAAA,EAAQ,IAAK,CAAA;AAAA,IACtC,OAAA,EAAS,KAAA,CAAM,UAAA,CAAW,OAAA,EAAS,IAAK,CAAA;AAAA,IACxC,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,IAAI;AAAA,GAC1B,CAAA;AACH","file":"index.js","sourcesContent":["/** Options for `createAnalyserTap` and `AudioEngine.analyser`. */\nexport interface AnalyserTapOptions {\n /** Power of two, 32..32768. Default 2048. */\n fftSize?: number;\n}\n\n/** An `AnalyserNode` attached to a point in the graph, with readers for its\n * spectrum, waveform and level. Each call reads the current window. */\nexport interface AnalyserTap {\n /** The underlying node, exposed for disposal assertions and advanced wiring. */\n node: AnalyserNode;\n /** Frequency data, sized `node.frequencyBinCount` when no array is given. */\n frequencies(out?: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;\n /** Time-domain data, sized `node.fftSize` when no array is given — twice the\n * frequency bin count, which is the whole window rather than half of it. */\n waveform(out?: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;\n /** RMS amplitude over the whole time-domain window, 0..1. */\n level(): number;\n /** `n` averaged frequency bands normalized to 0..1 — the ergonomic form for\n * driving a shader uniform, a vertex color, or a pose. `out`, when given,\n * must be exactly `n` long. */\n bands(n: number, out?: Float32Array<ArrayBuffer>): Float32Array<ArrayBuffer>;\n /** Detach from the tapped node. Idempotent. */\n dispose(): void;\n}\n\n/** Attach a new `AnalyserNode` to `source`. The tap only listens, adding no\n * path to the destination; `dispose()` detaches it. */\nexport function createAnalyserTap(\n ctx: BaseAudioContext,\n source: AudioNode,\n opts: AnalyserTapOptions = {},\n): AnalyserTap {\n const node = ctx.createAnalyser();\n node.fftSize = opts.fftSize ?? 2048;\n source.connect(node);\n let attached = true;\n\n // `node` is public surface, so `fftSize` can change under the tap. Time-domain\n // data is sized by `fftSize`; frequency data by half of it.\n let freqScratch = new Uint8Array(0);\n let timeScratch = new Uint8Array(0);\n const freqBuf = (): Uint8Array<ArrayBuffer> => {\n if (freqScratch.length !== node.frequencyBinCount) {\n freqScratch = new Uint8Array(node.frequencyBinCount);\n }\n return freqScratch;\n };\n const timeBuf = (): Uint8Array<ArrayBuffer> => {\n if (timeScratch.length !== node.fftSize) timeScratch = new Uint8Array(node.fftSize);\n return timeScratch;\n };\n\n return {\n node,\n frequencies(out) {\n const target = out ?? new Uint8Array(node.frequencyBinCount);\n node.getByteFrequencyData(target);\n return target;\n },\n waveform(out) {\n const target = out ?? new Uint8Array(node.fftSize);\n node.getByteTimeDomainData(target);\n return target;\n },\n level() {\n const buf = timeBuf();\n node.getByteTimeDomainData(buf);\n let sum = 0;\n for (let i = 0; i < buf.length; i += 1) {\n // Time-domain bytes center on 128; subtract to get a signed sample.\n const v = (buf[i] - 128) / 128;\n sum += v * v;\n }\n return Math.sqrt(sum / buf.length);\n },\n bands(n, out) {\n if (!Number.isInteger(n) || n < 1) {\n throw new Error('@weasel-js/audio: bands(n) requires a positive integer');\n }\n // Unlike the byte readers, a short `out` here would return fewer bands\n // than asked for with nothing to distinguish it from a correct result.\n if (out && out.length !== n) {\n throw new Error(\n `@weasel-js/audio: bands(${n}, out) requires an out array of length ${n}, got ${out.length}`,\n );\n }\n const buf = freqBuf();\n node.getByteFrequencyData(buf);\n const target = out ?? new Float32Array(n);\n const per = buf.length / n;\n for (let b = 0; b < n; b += 1) {\n const lo = Math.floor(b * per);\n const hi = Math.max(lo + 1, Math.floor((b + 1) * per));\n let sum = 0;\n for (let i = lo; i < hi; i += 1) sum += buf[i];\n target[b] = sum / (hi - lo) / 255;\n }\n return target;\n },\n // `node.disconnect()` would cut the analyser's outgoing edges, and it has\n // none: the edge that keeps it alive is the source's.\n dispose() {\n if (!attached) return;\n attached = false;\n source.disconnect(node);\n },\n };\n}\n","/** A one-shot timer pair, as `AudioEngineOptions.setTimer` takes it. */\nexport interface Timers {\n setTimer(cb: () => void, ms: number): unknown;\n clearTimer(handle: unknown): void;\n}\n\nexport const defaultTimers: Timers = {\n setTimer: (cb, ms) => setTimeout(cb, ms),\n clearTimer: (h) => clearTimeout(h as ReturnType<typeof setTimeout>),\n};\n\n/**\n * Run `cb` once the audio clock reaches `at` (seconds), or at once when the\n * context is not running — a stopped clock never arrives, and nothing is heard\n * meanwhile. The timer alone is not enough: it runs on wall time, and a ramp\n * cut short by an early timer is the click it was scheduled to avoid.\n * Returns a cancel function.\n */\nexport function atAudioTime(\n ctx: BaseAudioContext,\n timers: Timers,\n at: number,\n cb: () => void,\n): () => void {\n let handle: unknown = null;\n let live = true;\n const check = (): void => {\n handle = null;\n if (!live) return;\n const left = at - ctx.currentTime;\n if (ctx.state === 'running' && left > 1e-6) {\n handle = timers.setTimer(check, Math.max(1, left * 1000));\n return;\n }\n live = false;\n cb();\n };\n check();\n return () => {\n live = false;\n if (handle !== null) timers.clearTimer(handle);\n handle = null;\n };\n}\n","/**\n * Every gain write in the package goes through here.\n *\n * Two traps, both silent: a bare `param.value = x` sits *behind* any scheduled\n * ramp, which keeps running and wins; and a ramp with no anchor interpolates\n * from the previous scheduled endpoint rather than from the value the param\n * holds now, so a second ramp jumps before it moves.\n */\nexport function writeParam(\n ctx: BaseAudioContext,\n param: AudioParam,\n value: number,\n rampMs?: number,\n): void {\n const now = ctx.currentTime;\n param.cancelScheduledValues(now);\n if (rampMs && rampMs > 0) {\n param.setValueAtTime(param.value, now);\n param.linearRampToValueAtTime(value, now + rampMs / 1000);\n } else {\n param.setValueAtTime(value, now);\n }\n}\n\n/**\n * Give a param nothing has scheduled yet its starting value. `.value` is\n * written as well, so a ramp `writeParam` anchors before the first render\n * starts there rather than at the param's default.\n */\nexport function initParam(ctx: BaseAudioContext, param: AudioParam, value: number): void {\n param.value = value;\n writeParam(ctx, param, value);\n}\n","import { atAudioTime, defaultTimers, type Timers } from './audioTime';\nimport { writeParam } from './param';\n\n/**\n * Anything with an input and an output node can sit in an insert slot: one of\n * the built-ins (`createFilterEffect` and the rest), or a pair of nodes of your\n * own — `{ input: shaper, output: shaper }` for a single node. Several nodes\n * between the two are fine too. An effect goes in one slot, once.\n */\nexport interface InsertEffect {\n readonly input: AudioNode;\n readonly output: AudioNode;\n /** Called once the effect has left the graph after `remove()` or `clear()`. */\n dispose?(): void;\n}\n\n/** One effect's place in a bus's insert chain. Every edit is click-free: a\n * bypass crossfades the slot's wet and dry, and a structural edit crossfades\n * the old route into the new one. */\nexport interface InsertSlot {\n readonly effect: InsertEffect;\n /** Route around the effect (`true`) or back through it. */\n bypass(on: boolean): void;\n bypassed(): boolean;\n /** Clamped to the chain. */\n moveTo(index: number): void;\n /** Take the effect out, then call its `dispose`. Idempotent. */\n remove(): void;\n /** Position in the chain, or -1 once removed. */\n index(): number;\n}\n\n/** Where `InsertChain.add` puts an effect, and whether it starts bypassed. */\nexport interface InsertAddOptions {\n /** Default: the end of the chain. Clamped. */\n index?: number;\n /** Add it routed around, for a later `bypass(false)`. Default false. */\n bypassed?: boolean;\n}\n\n/**\n * A bus's ordered insert effects, between where voices connect and the bus's\n * fader. `slots()` is the chain as edited; the audio graph follows one\n * crossfade at a time, and `settled()` resolves once it has caught up.\n */\nexport interface InsertChain {\n add(effect: InsertEffect, opts?: InsertAddOptions): InsertSlot;\n slots(): InsertSlot[];\n clear(): void;\n settled(): Promise<void>;\n}\n\n/** Options for an insert chain: its crossfade length, and the timers it schedules with. */\nexport interface InsertChainOptions extends Partial<Timers> {\n /** Crossfade length for every edit, in ms. Default 15. */\n fadeMs?: number;\n}\n\n/** A chain and the switch that cancels its transition in flight. */\nexport interface OwnedInsertChain {\n chain: InsertChain;\n dispose(): void;\n}\n\ninterface Slot {\n handle: InsertSlot;\n effect: InsertEffect;\n bypassed: boolean;\n removed: boolean;\n /** Built on first splice-in, kept across a move, torn down on removal. */\n nodes: { in: GainNode; out: GainNode; dry: GainNode; wet: GainNode } | null;\n}\n\n/** A gain between two consecutive points of the chain — the thing that fades\n * when a route changes. */\ninterface Link { from: AudioNode; to: AudioNode; gain: GainNode }\n\ntype Step =\n | { kind: 'out'; slot: Slot }\n | { kind: 'in'; slot: Slot; at: number };\n\n/**\n * Build an insert chain from `head` to `tail`, which start wired straight\n * through.\n *\n * A structural edit never swaps a connection instantly. A splice-in builds the\n * route through the new slot beside the old one and crossfades the two into\n * `next`; a splice-out does the reverse, so the effect's tail fades rather than\n * cuts. A move is a splice-out followed by a splice-in, never one rewire:\n * crossfading two orders at once would wire `b → c` and `c → b` together, and\n * Web Audio mutes a cycle with no delay in it.\n */\nexport function createInsertChain(\n ctx: BaseAudioContext,\n head: AudioNode,\n tail: AudioNode,\n opts: InsertChainOptions = {},\n): OwnedInsertChain {\n const fadeMs = opts.fadeMs ?? 15;\n const timers: Timers = {\n setTimer: opts.setTimer ?? defaultTimers.setTimer,\n clearTimer: opts.clearTimer ?? defaultTimers.clearTimer,\n };\n const used = new WeakSet<InsertEffect>();\n const order: Slot[] = [];\n /** The slots the audio graph routes through, in graph order. */\n const live: Slot[] = [];\n const links: Link[] = [];\n let busy = false;\n /** The slot a crossfade in flight is taking out of the graph, whose finish disposes it if removed. */\n let leaving: Slot | null = null;\n let cancel: (() => void) | null = null;\n let disposed = false;\n let waiters: (() => void)[] = [];\n\n const fade = (): number => (ctx.state === 'running' ? fadeMs : 0);\n\n const link = (from: AudioNode, to: AudioNode, gain: number): Link => {\n const g = ctx.createGain();\n // `.value` first, so `writeParam` anchors a ramp at it rather than at 1.\n g.gain.value = gain;\n writeParam(ctx, g.gain, gain);\n from.connect(g);\n g.connect(to);\n const l = { from, to, gain: g };\n links.push(l);\n return l;\n };\n\n const unlink = (l: Link): void => {\n l.from.disconnect(l.gain);\n l.gain.disconnect();\n links.splice(links.indexOf(l), 1);\n };\n\n const find = (from: AudioNode, to: AudioNode): Link =>\n links.find((l) => l.from === from && l.to === to)!;\n\n const inOf = (s: Slot | null): AudioNode => (s ? s.nodes!.in : tail);\n const outOf = (s: Slot | null): AudioNode => (s ? s.nodes!.out : head);\n\n const setBypass = (s: Slot, ms: number): void => {\n if (!s.nodes) return;\n writeParam(ctx, s.nodes.wet.gain, s.bypassed ? 0 : 1, ms);\n writeParam(ctx, s.nodes.dry.gain, s.bypassed ? 1 : 0, ms);\n };\n\n const build = (s: Slot): void => {\n if (s.nodes) return;\n const n = {\n in: ctx.createGain(), out: ctx.createGain(), dry: ctx.createGain(), wet: ctx.createGain(),\n };\n n.in.connect(s.effect.input);\n s.effect.output.connect(n.wet);\n n.wet.connect(n.out);\n n.in.connect(n.dry);\n n.dry.connect(n.out);\n s.nodes = n;\n n.wet.gain.value = s.bypassed ? 0 : 1;\n n.dry.gain.value = s.bypassed ? 1 : 0;\n setBypass(s, 0);\n };\n\n const destroy = (s: Slot): void => {\n const n = s.nodes;\n if (!n) return;\n // Targeted, not bare: the effect's nodes are the consumer's, and may be\n // wired to things besides this slot.\n n.in.disconnect();\n try { s.effect.output.disconnect(n.wet); } catch { /* already cut */ }\n n.wet.disconnect();\n n.dry.disconnect();\n n.out.disconnect();\n s.nodes = null;\n };\n\n const plan = (): Step | null => {\n const stale = live.find((s) => s.removed);\n if (stale) return { kind: 'out', slot: stale };\n const wanted = order.filter((s) => live.includes(s));\n for (let i = 0; i < wanted.length; i += 1) {\n // Out now, back in at its place on a later step.\n if (live[i] !== wanted[i]) return { kind: 'out', slot: wanted[i] };\n }\n const i = order.findIndex((s) => !live.includes(s));\n if (i < 0) return null;\n let at = 0;\n for (let j = i - 1; j >= 0; j -= 1) {\n const k = live.indexOf(order[j]);\n if (k >= 0) { at = k + 1; break; }\n }\n return { kind: 'in', slot: order[i], at };\n };\n\n /** Start `step`'s crossfade and return what finishes it. */\n const begin = (step: Step, ms: number): (() => void) => {\n const s = step.slot;\n if (step.kind === 'in') {\n build(s);\n const prev = live[step.at - 1] ?? null;\n const next = live[step.at] ?? null;\n const old = find(outOf(prev), inOf(next));\n link(outOf(prev), inOf(s), 1);\n const incoming = link(outOf(s), inOf(next), 0);\n live.splice(step.at, 0, s);\n writeParam(ctx, old.gain.gain, 0, ms);\n writeParam(ctx, incoming.gain.gain, 1, ms);\n return () => unlink(old);\n }\n const i = live.indexOf(s);\n const prev = live[i - 1] ?? null;\n const next = live[i + 1] ?? null;\n const into = find(outOf(prev), inOf(s));\n const from = find(outOf(s), inOf(next));\n const direct = link(outOf(prev), inOf(next), 0);\n live.splice(i, 1);\n leaving = s;\n writeParam(ctx, from.gain.gain, 0, ms);\n writeParam(ctx, direct.gain.gain, 1, ms);\n return () => {\n leaving = null;\n unlink(into);\n unlink(from);\n if (s.removed) {\n destroy(s);\n s.effect.dispose?.();\n }\n };\n };\n\n const pump = (): void => {\n while (!busy && !disposed) {\n const step = plan();\n if (!step) {\n const done = waiters;\n waiters = [];\n for (const w of done) w();\n return;\n }\n const ms = fade();\n const finish = begin(step, ms);\n if (ms === 0) {\n finish();\n continue;\n }\n busy = true;\n cancel = atAudioTime(ctx, timers, ctx.currentTime + ms / 1000, () => {\n cancel = null;\n busy = false;\n finish();\n pump();\n });\n }\n };\n\n link(head, tail, 1);\n\n const slotOf = (effect: InsertEffect, bypassed: boolean): Slot => {\n const s: Slot = { effect, bypassed, removed: false, nodes: null, handle: null as never };\n s.handle = {\n effect,\n bypass(on) {\n if (s.bypassed === on) return;\n s.bypassed = on;\n setBypass(s, fade());\n },\n bypassed: () => s.bypassed,\n moveTo(index) {\n const from = order.indexOf(s);\n if (from < 0) return;\n order.splice(from, 1);\n order.splice(Math.max(0, Math.min(index, order.length)), 0, s);\n pump();\n },\n remove() {\n const at = order.indexOf(s);\n if (at < 0) return;\n order.splice(at, 1);\n s.removed = true;\n // `plan` only finds a removed slot in the graph; one that is out of it has no later step to dispose it.\n if (!live.includes(s) && leaving !== s) {\n destroy(s);\n s.effect.dispose?.();\n }\n pump();\n },\n index: () => order.indexOf(s),\n };\n return s;\n };\n\n const chain: InsertChain = {\n add(effect, addOpts = {}) {\n if (used.has(effect)) {\n throw new Error('@weasel-js/audio: that effect is already in an insert slot');\n }\n used.add(effect);\n const s = slotOf(effect, addOpts.bypassed ?? false);\n const index = addOpts.index ?? order.length;\n order.splice(Math.max(0, Math.min(index, order.length)), 0, s);\n pump();\n return s.handle;\n },\n slots: () => order.map((s) => s.handle),\n clear() {\n for (const s of [...order]) s.handle.remove();\n },\n settled() {\n if (!busy && plan() === null) return Promise.resolve();\n return new Promise((resolve) => { waiters.push(resolve); });\n },\n };\n return {\n chain,\n dispose() {\n disposed = true;\n cancel?.();\n cancel = null;\n const done = waiters;\n waiters = [];\n for (const w of done) w();\n },\n };\n}\n","import {\n createInsertChain, type InsertChain, type InsertChainOptions, type OwnedInsertChain,\n} from './inserts';\nimport { writeParam } from './param';\n\n/** Controls for one named bus. `rampMs` slews a gain change over that many\n * ms instead of stepping it. */\nexport interface BusHandle {\n setGain(value: number, rampMs?: number): void;\n mute(on: boolean): void;\n solo(on: boolean): void;\n /** The bus's own gain, as last set — not what a mute or solo is imposing. */\n gain(): number;\n /** The mute flag as set, independent of any solo. */\n muted(): boolean;\n /** The solo flag as set; whether it silences anything is a graph-wide answer. */\n soloed(): boolean;\n /** Whether the bus is being heard: unmuted, and soloed if any bus is soloed.\n * Not derivable from `muted()` and `soloed()` alone. */\n audible(): boolean;\n /** Effects between where the bus's voices connect and its fader. */\n readonly inserts: InsertChain;\n}\n\n/** The mix graph built by `createBusGraph`. `input(name)` is where a voice\n * connects; it runs through the bus's inserts to `node(name)`, the fader,\n * which feeds `master`, which feeds the destination. Unknown bus names throw. */\nexport interface BusGraph {\n master: GainNode;\n input(name: string): GainNode;\n node(name: string): GainNode;\n bus(name: string): BusHandle;\n names(): string[];\n /** Cancel every insert transition in flight. The nodes stay wired. */\n dispose(): void;\n}\n\n/** Options for `createBusGraph`: the insert chains' crossfade and timer. */\nexport type BusGraphOptions = InsertChainOptions;\n\ninterface BusState {\n input: GainNode;\n node: GainNode;\n inserts: OwnedInsertChain;\n gain: number;\n muted: boolean;\n soloed: boolean;\n}\n\n/**\n * The mix graph: one `GainNode` per named bus, all routed to a master that\n * routes to the destination.\n *\n * Gain, mute and solo are three inputs to one output value rather than three\n * things that write the node directly — otherwise unmuting restores the wrong\n * value whenever a solo changed it in between. All three write through\n * `writeParam`, so `rampMs` survives instead of being overwritten by the\n * recomputation that follows it.\n */\nexport function createBusGraph(\n ctx: AudioContext,\n names: string[],\n opts: BusGraphOptions = {},\n): BusGraph {\n const master = ctx.createGain();\n master.connect(ctx.destination);\n\n const states = new Map<string, BusState>();\n for (const name of names) {\n const input = ctx.createGain();\n const node = ctx.createGain();\n node.connect(master);\n const inserts = createInsertChain(ctx, input, node, opts);\n states.set(name, { input, node, inserts, gain: 1, muted: false, soloed: false });\n }\n\n const anySoloed = (): boolean => {\n for (const s of states.values()) if (s.soloed) return true;\n return false;\n };\n\n const audibleUnder = (s: BusState, soloing: boolean): boolean =>\n !s.muted && (!soloing || s.soloed);\n\n // `ramp` names the one bus whose own value changed, so a solo does not slew\n // every other bus at whatever rate that bus was last set with.\n const apply = (ramp?: { bus: BusState; ms: number }): void => {\n const soloing = anySoloed();\n for (const s of states.values()) {\n const value = audibleUnder(s, soloing) ? s.gain : 0;\n writeParam(ctx, s.node.gain, value, ramp?.bus === s ? ramp.ms : undefined);\n }\n };\n\n const get = (name: string): BusState => {\n const s = states.get(name);\n if (!s) throw new Error(`@weasel-js/audio: unknown bus \"${name}\"`);\n return s;\n };\n\n return {\n master,\n input: (name) => get(name).input,\n node: (name) => get(name).node,\n names: () => [...states.keys()],\n dispose() {\n for (const s of states.values()) s.inserts.dispose();\n },\n bus(name) {\n const s = get(name);\n return {\n setGain(value, rampMs) {\n s.gain = value;\n apply(rampMs && rampMs > 0 ? { bus: s, ms: rampMs } : undefined);\n },\n mute(on) { s.muted = on; apply(); },\n solo(on) { s.soloed = on; apply(); },\n gain: () => s.gain,\n muted: () => s.muted,\n soloed: () => s.soloed,\n audible: () => audibleUnder(s, anySoloed()),\n inserts: s.inserts.chain,\n };\n },\n };\n}\n","import type { Fader } from './fader';\nimport type { NodeWrapper } from './wrapper';\n\n/**\n * One connection, from a wrapper's `out` to another's `ins[port]` or to the graph's output.\n * `deferred`: accepted, but wiring it now would close a cycle through edges still fading\n * out, so it has no fader until they finish. `closing`: fading out; never reopened, since a\n * reopened close still cuts when its timer fires.\n */\nexport interface Edge {\n readonly from: NodeWrapper;\n /** `null` is the graph's output. */\n readonly to: NodeWrapper | null;\n readonly port: string;\n state: 'deferred' | 'open' | 'closing';\n fader: Fader | null;\n}\n\n/** The edge a caller can still see: open or deferred, never one fading out. */\nexport function findLive(\n edges: readonly Edge[],\n from: NodeWrapper,\n to: NodeWrapper | null,\n port: string,\n): Edge | undefined {\n return edges.find((e) => e.state !== 'closing' && e.from === from && e.to === to && e.port === port);\n}\n\nexport const touches = (e: Edge, w: NodeWrapper): boolean => e.from === w || e.to === w;\n\n/** The edges the caller sees, which a new connection must not close a cycle through. */\nexport const logical = (e: Edge): boolean => e.state !== 'closing';\n/** The edges wired in the audio graph, which Web Audio mutes a cycle through. */\nexport const wired = (e: Edge): boolean => e.state !== 'deferred';\n\n/** Whether `goal` is downstream of `start` along the edges `admit` accepts. */\nexport function reaches<N, E extends { readonly from: N; readonly to: N | null }>(\n edges: readonly E[],\n start: N,\n goal: N,\n admit: (e: E) => boolean = () => true,\n): boolean {\n const seen = new Set<N>();\n const stack = [start];\n while (stack.length > 0) {\n const n = stack.pop()!;\n if (n === goal) return true;\n if (seen.has(n)) continue;\n seen.add(n);\n for (const e of edges) if (admit(e) && e.from === n && e.to !== null) stack.push(e.to);\n }\n return false;\n}\n\n/** Whether wiring `e` now would close a cycle in the audio graph. */\nexport const blocked = (edges: readonly Edge[], e: Edge): boolean =>\n e.to !== null && reaches(edges, e.to, e.from, wired);\n\n/** Drop `e` from `edges` if it is still there. */\nexport function drop(edges: Edge[], e: Edge): void {\n const i = edges.indexOf(e);\n if (i >= 0) edges.splice(i, 1);\n}\n","import { atAudioTime, type Timers } from '../audioTime';\nimport { initParam, writeParam } from '../param';\n\nexport interface Fader {\n readonly gain: GainNode;\n /** Ramp to 1 over `ms`. */\n open(ms: number): void;\n /** Ramp to 0 over `ms`, then disconnect both ends and call `done`. A close already\n * under way keeps its length, and each distinct `done` runs once when it lands. */\n close(ms: number, done?: () => void): void;\n /** Disconnect now, canceling any pending close. */\n cut(): void;\n}\n\n/** A gain from `from` to `to`, starting silent: the unit every graph edit fades through. */\nexport function createFader(\n ctx: BaseAudioContext,\n timers: Timers,\n from: AudioNode,\n to: AudioNode,\n): Fader {\n const gain = ctx.createGain();\n initParam(ctx, gain.gain, 0);\n from.connect(gain);\n gain.connect(to);\n\n let cancel: (() => void) | null = null;\n let closing = false;\n let closed = false;\n let cutDone = false;\n const dones = new Set<() => void>();\n\n const cut = (): void => {\n cancel?.();\n cancel = null;\n if (cutDone) return;\n cutDone = true;\n from.disconnect(gain);\n gain.disconnect();\n };\n\n return {\n gain,\n open(ms) {\n writeParam(ctx, gain.gain, 1, ms);\n },\n close(ms, done) {\n if (closed) done?.();\n if (closed || cutDone) return;\n if (done) dones.add(done);\n if (closing) return;\n closing = true;\n const length = ctx.state === 'running' ? ms : 0;\n writeParam(ctx, gain.gain, 0, length);\n cancel = atAudioTime(ctx, timers, ctx.currentTime + length / 1000, () => {\n cancel = null;\n cut();\n closed = true;\n const all = [...dones];\n dones.clear();\n for (const d of all) d();\n });\n },\n cut,\n };\n}\n","import { createAnalyserTap, type AnalyserTap, type AnalyserTapOptions } from '../analyser';\nimport type { Timers } from '../audioTime';\nimport { createFader, type Fader } from './fader';\nimport type { GraphNodeDef } from './types';\n\n/**\n * One node of the graph. Edges attach only to the stable `ins` and `out`, and\n * the def sits between them behind faders, so a def can be crossfaded out for\n * another without touching a single edge or tap.\n */\nexport interface NodeWrapper {\n readonly id: string;\n def: GraphNodeDef;\n /** One stable gain per input port; each feeds `def.inputs[port]` through `inFaders[port]`. */\n readonly ins: Record<string, GainNode>;\n readonly inFaders: Record<string, Fader>;\n /** The stable output, fed by `def.output` through `outFader`. */\n readonly out: GainNode;\n outFader: Fader;\n readonly taps: Set<AnalyserTap>;\n /** Whether `def.start` has run since the last `def.stop`. */\n running: boolean;\n /** Defs a `replace` is fading out, each until its own faders close. */\n readonly outgoing: Set<Outgoing>;\n}\n\n/** A def on its way out of a wrapper, behind the faders that are closing it. */\nexport interface Outgoing {\n readonly def: GraphNodeDef;\n readonly faders: readonly Fader[];\n running: boolean;\n}\n\nexport function createWrapper(\n ctx: BaseAudioContext,\n timers: Timers,\n id: string,\n def: GraphNodeDef,\n): NodeWrapper {\n const ins: Record<string, GainNode> = {};\n const inFaders: Record<string, Fader> = {};\n for (const port of Object.keys(def.inputs)) {\n ins[port] = ctx.createGain();\n inFaders[port] = createFader(ctx, timers, ins[port], def.inputs[port]);\n inFaders[port].open(0);\n }\n const out = ctx.createGain();\n const outFader = createFader(ctx, timers, def.output, out);\n outFader.open(0);\n return { id, def, ins, inFaders, out, outFader, taps: new Set(), running: false, outgoing: new Set() };\n}\n\nexport function tapWrapper(ctx: BaseAudioContext, w: NodeWrapper, opts?: AnalyserTapOptions): AnalyserTap {\n const inner = createAnalyserTap(ctx, w.out, opts);\n const t: AnalyserTap = {\n ...inner,\n dispose() {\n w.taps.delete(t);\n inner.dispose();\n },\n };\n w.taps.add(t);\n return t;\n}\n\nexport function startWrapper(w: NodeWrapper, when: number): void {\n const { def } = w;\n if (w.running || !def.start) return;\n w.running = true;\n def.start(when, () => {\n if (w.def === def) w.running = false;\n });\n}\n\n/** Stops the def and any a `replace` is still fading out. */\nexport function stopWrapper(w: NodeWrapper, when: number): void {\n for (const o of w.outgoing) {\n if (o.running) o.def.stop?.(when);\n o.running = false;\n }\n if (!w.running) return;\n w.running = false;\n w.def.stop?.(when);\n}\n\n/** Stop, cut and dispose a def leaving; cutting its faders cancels their closes. */\nexport function releaseOutgoing(w: NodeWrapper, o: Outgoing, when: number): void {\n w.outgoing.delete(o);\n if (o.running) o.def.stop?.(when);\n o.running = false;\n for (const f of o.faders) f.cut();\n o.def.dispose?.();\n}\n\n/** Tear down a wrapper whose edges are already cut. Its faders go before\n * `def.dispose`, which may blanket-disconnect the nodes they are wired from. */\nexport function releaseWrapper(w: NodeWrapper, when: number): void {\n for (const o of [...w.outgoing]) releaseOutgoing(w, o, when);\n stopWrapper(w, when);\n for (const f of Object.values(w.inFaders)) f.cut();\n w.outFader.cut();\n for (const t of w.taps) t.dispose();\n w.taps.clear();\n w.def.dispose?.();\n}\n","import type { Timers } from '../audioTime';\nimport { createFader, type Fader } from './fader';\nimport type { GraphNodeDef } from './types';\nimport { releaseOutgoing, startWrapper, type NodeWrapper, type Outgoing } from './wrapper';\n\nexport interface ReplaceHooks {\n /** Close every edge into `w.ins[port]`; called before the port is dropped. */\n closePort(port: string): void;\n /** Called when the old def has faded out and been disposed, to wake `settled`. */\n onSettle(): void;\n}\n\n/**\n * Crossfade `w` from its def to `next` over `ms`, keeping its stable `ins`,\n * `out`, edges and taps. The old def keeps its input and output faders, which\n * close; `next` gets fresh ones, which open. A def still fading in from an\n * earlier replace closes from wherever its fade got to.\n */\nexport function replaceDef(\n ctx: BaseAudioContext,\n timers: Timers,\n w: NodeWrapper,\n next: GraphNodeDef,\n ms: number,\n playing: boolean,\n hooks: ReplaceHooks,\n): void {\n const old: Outgoing = {\n def: w.def,\n faders: [...Object.values(w.inFaders), w.outFader],\n running: w.running,\n };\n w.outgoing.add(old);\n\n for (const port of Object.keys(w.ins)) {\n if (Object.prototype.hasOwnProperty.call(next.inputs, port)) continue;\n hooks.closePort(port);\n delete w.ins[port];\n delete w.inFaders[port];\n }\n for (const port of Object.keys(next.inputs)) {\n w.ins[port] ??= ctx.createGain();\n w.inFaders[port] = openFader(ctx, timers, w.ins[port], next.inputs[port], ms);\n }\n w.outFader = openFader(ctx, timers, next.output, w.out, ms);\n w.def = next;\n w.running = false;\n if (playing) startWrapper(w, ctx.currentTime);\n\n let open = old.faders.length;\n for (const f of old.faders) {\n f.close(ms, () => {\n open -= 1;\n if (open > 0 || !w.outgoing.has(old)) return;\n releaseOutgoing(w, old, ctx.currentTime);\n hooks.onSettle();\n });\n }\n}\n\nfunction openFader(\n ctx: BaseAudioContext,\n timers: Timers,\n from: AudioNode,\n to: AudioNode,\n ms: number,\n): Fader {\n const f = createFader(ctx, timers, from, to);\n f.open(ms);\n return f;\n}\n","export const graphError = (msg: string): Error => new Error(`@weasel-js/audio: ${msg}`);\n\nexport const owns = (rec: object, key: string): boolean => Object.prototype.hasOwnProperty.call(rec, key);\n\nexport const noNode = (id: string): Error => graphError(`no node \"${id}\"`);\nexport const duplicateNode = (id: string): Error => graphError(`a node \"${id}\" already exists`);\nexport const noPort = (id: string, port: string): Error =>\n graphError(`node \"${id}\" has no input port \"${port}\"`);\nexport const noParam = (id: string, param: string): Error =>\n graphError(`node \"${id}\" has no param \"${param}\"`);\nexport const closesCycle = (from: string, to: string): Error =>\n graphError(`connecting \"${from}\" to \"${to}\" would close a cycle`);\n","import type { Timers } from '../audioTime';\nimport { blocked, drop, findLive, logical, reaches, touches, type Edge } from './edges';\nimport { createFader } from './fader';\nimport { replaceDef } from './replace';\nimport type { GraphNodeDef, GraphTarget } from './types';\nimport { closesCycle, duplicateNode, noNode, noParam, noPort, owns } from './errors';\nimport type { GraphView } from './validate';\nimport { createWrapper, releaseWrapper, type NodeWrapper } from './wrapper';\n\nexport interface EditsDeps {\n ctx: BaseAudioContext;\n timers: Timers;\n /** The fade for an edit made now: 0 unless the context is running. */\n fade(): number;\n /** Where an edge to `{ output: true }` lands. */\n output: AudioNode;\n /** Called when a node is added, to start it if the graph is playing. */\n onAdd(w: NodeWrapper): void;\n /** Called after every close finishes, to wake `settled`. */\n onSettle(): void;\n}\n\n/** The far end of `to`, checked: its wrapper (null for the output) and port. */\nfunction target(live: (id: string) => NodeWrapper, to: GraphTarget): [NodeWrapper | null, string] {\n if ('output' in to) return [null, ''];\n const w = live(to.node);\n if (!owns(w.ins, to.port)) throw noPort(to.node, to.port);\n return [w, to.port];\n}\n\n/** The graph's nodes and edges: every structural edit, and the bookkeeping that\n * lets a removed node finish fading out after its id is free again. */\nexport function createEdits(deps: EditsDeps) {\n const { ctx, timers, fade, output } = deps;\n const nodes = new Map<string, NodeWrapper>();\n /** Out of `nodes` at once, released once no edge touches them. */\n const leaving = new Set<NodeWrapper>();\n const edges: Edge[] = [];\n\n const live = (id: string): NodeWrapper => {\n const w = nodes.get(id);\n if (!w) throw noNode(id);\n return w;\n };\n\n const wire = (e: Edge): void => {\n e.state = 'open';\n e.fader = createFader(ctx, timers, e.from.out, e.to ? e.to.ins[e.port] : output);\n e.fader.open(fade());\n };\n\n /** Wire what is no longer blocked, release what nothing touches, then wake `settled`. */\n const sweep = (): void => {\n for (const e of edges) if (e.state === 'deferred' && !blocked(edges, e)) wire(e);\n for (const w of [...leaving]) {\n if (edges.some((e) => touches(e, w))) continue;\n leaving.delete(w);\n releaseWrapper(w, ctx.currentTime);\n }\n deps.onSettle();\n };\n\n /** Fade an open edge out; a deferred one was never wired and just goes. */\n const close = (e: Edge): void => {\n if (e.state === 'closing') return;\n if (e.state === 'deferred') {\n drop(edges, e);\n return;\n }\n e.state = 'closing';\n e.fader!.close(fade(), () => {\n drop(edges, e);\n sweep();\n });\n };\n\n return {\n live,\n has: (id: string) => nodes.has(id),\n ids: () => [...nodes.keys()],\n liveNodes: () => [...nodes.values()],\n /** Live and leaving: every wrapper whose def has not been released. */\n allNodes: () => [...nodes.values(), ...leaving],\n /** The live nodes and the edges a caller can see, by id, for `validatePatches`. */\n view: (): GraphView => ({\n nodes: new Map([...nodes].map(([id, w]) => [id, { ports: new Set(Object.keys(w.ins)), params: w.def.params }])),\n edges: edges.filter(logical).map((e) => ({ from: e.from.id, to: e.to?.id ?? null, port: e.port })),\n }),\n /** An edge is fading out or waiting to be wired, or a replaced def is fading out. */\n busy: () =>\n edges.some((e) => e.state !== 'open') ||\n [...nodes.values(), ...leaving].some((w) => w.outgoing.size > 0),\n add(id: string, def: GraphNodeDef): void {\n if (nodes.has(id)) throw duplicateNode(id);\n const w = createWrapper(ctx, timers, id, def);\n nodes.set(id, w);\n deps.onAdd(w);\n },\n remove(id: string): void {\n const w = nodes.get(id);\n if (!w) return;\n nodes.delete(id);\n leaving.add(w);\n for (const e of edges.filter((x) => touches(x, w))) close(e);\n sweep();\n },\n /** Crossfade `id` into `def`; edges into a port `def` lacks close with it. */\n replace(id: string, def: GraphNodeDef, playing: boolean): void {\n const w = live(id);\n replaceDef(ctx, timers, w, def, fade(), playing, {\n closePort: (port) => {\n for (const e of edges.filter((x) => x.to === w && x.port === port)) close(e);\n },\n onSettle: deps.onSettle,\n });\n deps.onSettle();\n },\n connect(from: string, to: GraphTarget): void {\n const w = live(from);\n const [tw, port] = target(live, to);\n if (findLive(edges, w, tw, port)) return;\n if (tw && reaches(edges, tw, w, logical)) {\n throw closesCycle(from, tw.id);\n }\n const e: Edge = { from: w, to: tw, port, state: 'deferred', fader: null };\n edges.push(e);\n if (!blocked(edges, e)) wire(e);\n },\n disconnect(from: string, to: GraphTarget): void {\n const w = nodes.get(from);\n const tw = 'output' in to ? null : nodes.get(to.node);\n if (!w || tw === undefined) return;\n const e = findLive(edges, w, tw, 'output' in to ? '' : to.port);\n if (!e) return;\n close(e);\n deps.onSettle();\n },\n set(id: string, param: string, value: number, rampMs?: number): void {\n const w = live(id);\n if (!owns(w.def.params, param)) throw noParam(id, param);\n w.def.params[param](value, rampMs ?? fade());\n },\n /** Cut every edge, canceling its close, then release every def. */\n dispose(): void {\n for (const e of edges.splice(0)) e.fader?.cut();\n const all = [...nodes.values(), ...leaving];\n nodes.clear();\n leaving.clear();\n for (const w of all) releaseWrapper(w, ctx.currentTime);\n },\n };\n}\n","import { atAudioTime, type Timers } from '../audioTime';\nimport { writeParam } from '../param';\nimport { startWrapper, stopWrapper, type NodeWrapper } from './wrapper';\n\nexport interface TransportDeps {\n ctx: BaseAudioContext;\n timers: Timers;\n fade(): number;\n /** The graph's output gain, which a start fades in and a stop fades to silence. */\n output: GainNode;\n /** The wrappers a start starts. */\n live(): NodeWrapper[];\n /** The wrappers a stop stops, leaving ones included. */\n all(): NodeWrapper[];\n /** Called when an output fade finishes, to wake `settled`. */\n onSettle(): void;\n}\n\n/** Start and stop: sources follow `playing`, and the output fades in on a start\n * and out on a stop, which stops the sources once it is silent. */\nexport function createTransport(deps: TransportDeps) {\n const { ctx, timers, output } = deps;\n let playing = false;\n /** Cancels the output fade in flight, in either direction. */\n let cancel: (() => void) | null = null;\n\n /** Ramp the output to `value`, then run `then`; tracked until it lands. */\n const fadeOutput = (value: number, then: () => void): void => {\n cancel?.();\n cancel = null;\n const ms = deps.fade();\n writeParam(ctx, output.gain, value, ms);\n let pending = true;\n const c = atAudioTime(ctx, timers, ctx.currentTime + ms / 1000, () => {\n pending = false;\n cancel = null;\n then();\n deps.onSettle();\n });\n if (pending) cancel = c;\n };\n\n return {\n playing: () => playing,\n /** An output fade is in flight. */\n busy: () => cancel !== null,\n start(): void {\n if (playing) return;\n playing = true;\n fadeOutput(1, () => {});\n for (const w of deps.live()) startWrapper(w, ctx.currentTime);\n },\n stop(): void {\n if (!playing) return;\n playing = false;\n fadeOutput(0, () => {\n for (const w of deps.all()) stopWrapper(w, ctx.currentTime);\n });\n },\n /** Playing, or an output fade is still in flight: the output may not be silent. */\n audible: () => playing || cancel !== null,\n /** Fade the output to silence, then run `then` instead of stopping the sources. */\n fadeOut(then: () => void): void {\n playing = false;\n fadeOutput(0, then);\n },\n /** Cancel the fade in flight and forget playing; the caller stops the sources. */\n dispose(): void {\n cancel?.();\n cancel = null;\n playing = false;\n },\n };\n}\n","import { closesCycle, duplicateNode, noNode, noParam, noPort, owns } from './errors';\nimport { reaches } from './edges';\nimport type { GraphNodeDef, GraphPatch, GraphTarget } from './types';\n\n/** What a caller can see of a live node: its port names and its params. */\nexport interface ViewNode {\n readonly ports: ReadonlySet<string>;\n readonly params: object;\n}\n\n/** A connection the caller can see, open or deferred, by id. `to` null is the output. */\nexport interface ViewEdge {\n readonly from: string;\n readonly to: string | null;\n readonly port: string;\n}\n\nexport interface GraphView {\n readonly nodes: ReadonlyMap<string, ViewNode>;\n readonly edges: readonly ViewEdge[];\n}\n\nexport const viewNode = (def: GraphNodeDef): ViewNode => ({\n ports: new Set(Object.keys(def.inputs)),\n params: def.params,\n});\n\nconst toId = (to: GraphTarget): string | null => ('output' in to ? null : to.node);\nconst toPort = (to: GraphTarget): string => ('output' in to ? '' : to.port);\n\n/**\n * Throw the error the first structurally wrong patch would, applying each to a\n * copy of `view` in order, so a list that would fail partway changes nothing.\n */\nexport function validatePatches(view: GraphView, patches: readonly GraphPatch[]): void {\n const nodes = new Map(view.nodes);\n let edges = [...view.edges];\n const live = (id: string): ViewNode => {\n const n = nodes.get(id);\n if (!n) throw noNode(id);\n return n;\n };\n const same = (e: ViewEdge, from: string, to: GraphTarget): boolean =>\n e.from === from && e.to === toId(to) && e.port === toPort(to);\n\n for (const p of patches) {\n switch (p.kind) {\n case 'add':\n if (nodes.has(p.id)) throw duplicateNode(p.id);\n nodes.set(p.id, viewNode(p.def));\n break;\n case 'remove':\n if (nodes.delete(p.id)) edges = edges.filter((e) => e.from !== p.id && e.to !== p.id);\n break;\n case 'replace': {\n live(p.id);\n const n = viewNode(p.def);\n nodes.set(p.id, n);\n edges = edges.filter((e) => e.to !== p.id || n.ports.has(e.port));\n break;\n }\n case 'connect': {\n live(p.from);\n const to = toId(p.to);\n if (to !== null && !live(to).ports.has(toPort(p.to))) throw noPort(to, toPort(p.to));\n if (edges.some((e) => same(e, p.from, p.to))) break;\n if (to !== null && reaches(edges, to, p.from)) throw closesCycle(p.from, to);\n edges.push({ from: p.from, to, port: toPort(p.to) });\n break;\n }\n case 'disconnect':\n edges = edges.filter((e) => !same(e, p.from, p.to));\n break;\n case 'set':\n if (!owns(live(p.id).params, p.param)) throw noParam(p.id, p.param);\n break;\n }\n }\n}\n","import type { AnalyserTap, AnalyserTapOptions } from '../analyser';\nimport { defaultTimers, type Timers } from '../audioTime';\nimport { initParam } from '../param';\nimport { createEdits } from './edits';\nimport { graphError } from './errors';\nimport { createTransport } from './transport';\nimport type { AudioGraph, AudioGraphOptions, GraphNodeDef, GraphPatch } from './types';\nimport { validatePatches } from './validate';\nimport { startWrapper, tapWrapper } from './wrapper';\n\nexport type { NodeWrapper } from './wrapper';\n\nconst teardowns = new WeakMap<AudioGraph, () => void>();\n\n/** Internal: tear `graph` down now, with no fade, as `dispose` would on a silent graph. */\nexport function disposeNow(graph: AudioGraph): void {\n teardowns.get(graph)?.();\n}\n\n/**\n * A patchable graph of node defs feeding `destination`. Every structural edit\n * fades: a connection opens through its own gain and closes through it before\n * the cut, and a removed node leaves once its edges have closed.\n */\nexport function createAudioGraph(\n ctx: BaseAudioContext,\n destination: AudioNode,\n opts: AudioGraphOptions = {},\n): AudioGraph {\n const fadeMs = opts.fadeMs ?? 15;\n const timers: Timers = {\n setTimer: opts.setTimer ?? defaultTimers.setTimer,\n clearTimer: opts.clearTimer ?? defaultTimers.clearTimer,\n };\n const fade = (): number => (ctx.state === 'running' ? fadeMs : 0);\n\n const output = ctx.createGain();\n initParam(ctx, output.gain, 0);\n output.connect(destination);\n\n let waiters: (() => void)[] = [];\n let disposed = false;\n let torn = false;\n const onSettle = (): void => {\n if (!torn && (edits.busy() || transport.busy())) return;\n const done = waiters;\n waiters = [];\n for (const w of done) w();\n };\n\n const edits = createEdits({\n ctx, timers, fade, output, onSettle,\n onAdd: (w) => { if (transport.playing()) startWrapper(w, ctx.currentTime); },\n });\n const transport = createTransport({\n ctx, timers, fade, output, onSettle, live: edits.liveNodes, all: edits.allNodes,\n });\n const guard = <A extends unknown[], R>(f: (...args: A) => R) => (...args: A): R => {\n if (disposed) throw graphError('graph is disposed');\n return f(...args);\n };\n\n const graph: AudioGraph = {\n add: guard(edits.add),\n remove: guard(edits.remove),\n replace: guard((id: string, def: GraphNodeDef): void => {\n edits.replace(id, def, transport.playing());\n }),\n connect: guard(edits.connect),\n disconnect: guard(edits.disconnect),\n set: guard(edits.set),\n apply: guard((patches: readonly GraphPatch[]): void => {\n validatePatches(edits.view(), patches);\n let failed: { error: unknown } | null = null;\n for (const p of patches) {\n switch (p.kind) {\n case 'add': graph.add(p.id, p.def); break;\n case 'remove': graph.remove(p.id); break;\n case 'replace': graph.replace(p.id, p.def); break;\n case 'connect': graph.connect(p.from, p.to); break;\n case 'disconnect': graph.disconnect(p.from, p.to); break;\n case 'set':\n try {\n graph.set(p.id, p.param, p.value, p.rampMs);\n } catch (error) {\n failed ??= { error };\n }\n break;\n }\n }\n if (failed) throw failed.error;\n }),\n start: guard(transport.start),\n stop: guard(transport.stop),\n playing: transport.playing,\n has: edits.has,\n ids: edits.ids,\n tap: guard((id: string, tapOpts?: AnalyserTapOptions): AnalyserTap =>\n tapWrapper(ctx, edits.live(id), tapOpts)),\n settled() {\n return new Promise((resolve) => {\n waiters.push(resolve);\n onSettle();\n });\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (ctx.state === 'running' && transport.audible()) transport.fadeOut(teardown);\n else teardown();\n },\n };\n const teardown = (): void => {\n if (torn) return;\n disposed = true;\n torn = true;\n transport.dispose();\n edits.dispose();\n output.disconnect();\n onSettle();\n };\n teardowns.set(graph, teardown);\n return graph;\n}\n","/** Keeps a context resumable: gesture listeners while it is not running, and\n * the time it last resumed, which is where a suspension's backlog ends. */\nexport interface ResumeWatch {\n /** Engine time before which a queued entry is stale — set on resume, so a\n * suspension does not end in one pass that fires its whole backlog. */\n staleFloor(): number;\n dispose(): void;\n}\n\nexport function createResumeWatch(\n ctx: BaseAudioContext,\n hooks: {\n /** Engine time in ms. */\n now(): number;\n unlock(): Promise<void>;\n /** The context stopped running. */\n onSuspend(): void;\n },\n): ResumeWatch {\n let disposed = false;\n let suspendedSince = false;\n let staleFloor = -Infinity;\n\n // Resume on a user gesture, and keep listening until one takes. On touch a\n // tap grants activation at pointerup, touchend and click, not at pointerdown\n // or touchstart, so the first events of a first tap resume nothing.\n const gestures = ['pointerdown', 'pointerup', 'touchend', 'click', 'keydown'] as const;\n const onGesture = (): void => { void hooks.unlock().catch(() => undefined); };\n const arm = (): void => {\n if (typeof window === 'undefined') return;\n for (const g of gestures) window.addEventListener(g, onGesture, { passive: true });\n };\n const disarm = (): void => {\n if (typeof window === 'undefined') return;\n for (const g of gestures) window.removeEventListener(g, onGesture);\n };\n if (ctx.state !== 'running') arm();\n\n // A browser suspends the context when the tab goes away, and the gesture\n // listeners are long removed by then. Without this the engine is\n // permanently silent afterwards, with no diagnostic — the drop warning is a\n // once-per-engine latch.\n const onStateChange = (): void => {\n if (disposed) return;\n if (ctx.state === 'running') {\n disarm();\n if (suspendedSince) staleFloor = hooks.now();\n suspendedSince = false;\n return;\n }\n suspendedSince = true;\n hooks.onSuspend();\n arm();\n };\n ctx.addEventListener('statechange', onStateChange);\n\n return {\n staleFloor: () => staleFloor,\n dispose() {\n disposed = true;\n disarm();\n ctx.removeEventListener('statechange', onStateChange);\n },\n };\n}\n","/** Clock and timer for `createScheduler`. */\nexport interface SchedulerOptions {\n /** Engine time in ms. Backed by `AudioContext.currentTime * 1000` in production. */\n now: () => number;\n /** One-shot: it fires once and the pass re-arms it. `setInterval` here would\n * leave every previous timer running. */\n setTimer: (cb: () => void, ms: number) => unknown;\n clearTimer: (handle: unknown) => void;\n /** How far ahead to book events, in ms. Default 100. */\n lookahead?: number;\n /** Time between passes, in ms. Default 25. */\n interval?: number;\n /** An event fired `lateMs` after its time `when`: the passes that should\n * have reached it inside the lookahead stalled, and whatever it starts will\n * sound late by that much. Never called for an event booked inside the\n * lookahead or for a time already past, which no pass was meant to catch. */\n onLate?: (lateMs: number, when: number) => void;\n}\n\ninterface Entry {\n when: number;\n fire: (when: number) => void;\n key?: string;\n /** Booked for a time past the lookahead, so a pass reaching it late is reported. */\n waited: boolean;\n}\n\n/** A queue of callbacks keyed to engine time. See `createScheduler`. */\nexport interface Scheduler {\n start(): void;\n /** Stop the timer. The queue survives; `clear()` empties it. */\n stop(): void;\n /** Book `fire` for engine time `when`, receiving `when` so it can hand the\n * true time to `source.start()` rather than \"now\". It runs on the first\n * pass whose lookahead window reaches it — or, when the window already\n * covers it and the scheduler is running, at the end of the current task,\n * in time order with everything else then due. `reportLate: false` keeps\n * it from `onLate`, for a callback whose work no longer depends on when it\n * runs. */\n schedule(when: number, fire: (when: number) => void, key?: string, opts?: { reportLate?: boolean }): void;\n /** Drop queued events with this key. A pass takes its whole batch out of the\n * queue before firing any of it, so a callback cannot cancel a sibling that\n * came due alongside it. */\n cancelKey(key: string): void;\n /** Drop every queued event. Without this, a stop/start cycle fires\n * everything that came due meanwhile in one burst on the first pass. */\n clear(): void;\n pending(): number;\n}\n\n/**\n * Lookahead scheduler. Each pass fires everything due within `lookahead` ms,\n * in time order, handing each callback its own scheduled time. An event\n * scheduled inside that window does not wait up to `interval` for the next\n * pass: the end of the current task fires what is due then.\n *\n * It runs on its own timer rather than on an animation frame, which stops\n * entirely when nothing is animating. The timer is one-shot: the pass re-arms\n * it at the end, so passes cannot overlap. A main-thread `setTimeout` is clamped\n * to a second in a hidden tab, which the lookahead cannot cover; the engine\n * passes `createTickTimer` instead.\n */\nexport function createScheduler(opts: SchedulerOptions): Scheduler {\n const lookahead = opts.lookahead ?? 100;\n const interval = opts.interval ?? 25;\n let queue: Entry[] = [];\n let running = false;\n let handle: unknown = null;\n\n let flushQueued = false;\n\n const fireDue = (): void => {\n const now = opts.now();\n const horizon = now + lookahead;\n const due: Entry[] = [];\n const rest: Entry[] = [];\n for (const entry of queue) (entry.when <= horizon ? due : rest).push(entry);\n queue = rest;\n due.sort((a, b) => a.when - b.when);\n for (const entry of due) {\n if (entry.waited && entry.when < now) opts.onLate?.(now - entry.when, entry.when);\n try {\n entry.fire(entry.when);\n } catch (err) {\n console.error('@weasel-js/audio scheduler: callback threw', err);\n }\n }\n };\n\n const pass = (): void => {\n fireDue();\n if (running) handle = opts.setTimer(pass, interval);\n };\n\n // A microtask rather than firing inside `schedule()`: everything booked in\n // one task is fired as one batch, sorted by time, exactly as a pass would.\n const flush = (): void => {\n flushQueued = false;\n if (running) fireDue();\n };\n\n return {\n start() {\n if (running) return;\n running = true;\n handle = opts.setTimer(pass, interval);\n },\n stop() {\n if (!running) return;\n running = false;\n opts.clearTimer(handle);\n handle = null;\n },\n schedule(when, fire, key, entryOpts) {\n const waited = when > opts.now() + lookahead;\n queue.push({ when, fire, key, waited: waited && entryOpts?.reportLate !== false });\n if (running && !flushQueued && !waited) {\n flushQueued = true;\n queueMicrotask(flush);\n }\n },\n cancelKey(key) {\n queue = queue.filter((e) => e.key !== key);\n },\n clear() {\n queue = [];\n },\n pending: () => queue.length,\n };\n}\n","/** Opaque reference to a decoded sound. Mirrors `TextureHandle` in core. */\nexport interface SoundHandle { readonly id: string }\n\n/** Decoded buffers behind opaque `SoundHandle`s. Nothing is ever evicted. */\nexport interface SoundCache {\n load(url: string): Promise<SoundHandle>;\n loadAll(urls: Record<string, string>): Promise<Record<string, SoundHandle>>;\n decode(bytes: ArrayBuffer): Promise<SoundHandle>;\n /** Take ownership of a buffer the caller already has — a procedural synth,\n * an OfflineAudioContext render, a recording. Synchronous; nothing to decode. */\n register(buffer: AudioBuffer): SoundHandle;\n buffer(handle: SoundHandle): AudioBuffer | null;\n}\n\n/** Create a cache that decodes through `ctx`. `load` fetches with `fetchFn`,\n * returns the existing handle for a url already loaded, and shares one fetch\n * between concurrent loads of it; a failed load is not cached. */\nexport function createSoundCache(\n ctx: AudioContext,\n fetchFn: typeof fetch = fetch,\n): SoundCache {\n let counter = 0;\n const buffers = new Map<string, AudioBuffer>();\n const byUrl = new Map<string, SoundHandle>();\n // In-flight loads, so two concurrent `load` calls for one url share a fetch.\n const inflight = new Map<string, Promise<SoundHandle>>();\n\n const store = (buffer: AudioBuffer): SoundHandle => {\n const id = `snd_${++counter}`;\n buffers.set(id, buffer);\n return { id };\n };\n\n const cache: SoundCache = {\n async load(url) {\n const existing = byUrl.get(url);\n if (existing) return existing;\n const pending = inflight.get(url);\n if (pending) return pending;\n\n const task = (async () => {\n const res = await fetchFn(url);\n if (!res.ok) throw new Error(`@weasel-js/audio: failed to load ${url} (${res.status})`);\n const bytes = await res.arrayBuffer();\n const buffer = await ctx.decodeAudioData(bytes);\n const handle = store(buffer);\n byUrl.set(url, handle);\n return handle;\n })();\n\n inflight.set(url, task);\n try {\n return await task;\n } finally {\n // Always clear: a failed load must not be cached, or a retry can never\n // succeed for the lifetime of the page.\n inflight.delete(url);\n }\n },\n async loadAll(urls) {\n const names = Object.keys(urls);\n const handles = await Promise.all(names.map((n) => cache.load(urls[n])));\n return Object.fromEntries(names.map((n, i) => [n, handles[i]]));\n },\n async decode(bytes) {\n return store(await ctx.decodeAudioData(bytes));\n },\n register: (buffer) => store(buffer),\n buffer: (handle) => buffers.get(handle.id) ?? null,\n };\n return cache;\n}\n","import { atAudioTime, type Timers } from './audioTime';\nimport type { SourceLike, Starter } from './liveVoice';\nimport type { StreamOptions, VoiceHandle } from './types';\n\n/** How `stream` makes its source, and which voice holds each element. */\nexport interface StreamStarters {\n /** The element a call names, made from a URL when it is one. */\n element(media: HTMLMediaElement | string, opts: StreamOptions): HTMLMediaElement;\n starter(el: HTMLMediaElement, opts: StreamOptions): Starter;\n /** An element has one playhead: the voice streaming it now, to stop before\n * another starts. */\n streaming: WeakMap<HTMLMediaElement, VoiceHandle>;\n}\n\n/** A media element's playback as a voice source: `stop(when)` pauses once\n * the audio clock reaches `when`, and the element ending ends the voice. */\nfunction mediaSource(\n ctx: BaseAudioContext, timers: Timers, el: HTMLMediaElement, node: AudioNode, into: AudioNode,\n): SourceLike {\n let ended = false;\n let cancelWait: (() => void) | null = null;\n const finish = (): void => {\n if (ended) return;\n ended = true;\n cancelWait?.();\n el.pause();\n el.removeEventListener('ended', finish);\n el.removeEventListener('error', finish);\n // Queued, as a source node's `onended` is: the engine may be inside the\n // teardown that called `stop()`.\n queueMicrotask(() => (shim.onended as (() => void) | null)?.());\n };\n const shim: SourceLike = {\n onended: null,\n stop(when?: number) {\n if (ended) return;\n cancelWait?.();\n cancelWait = when !== undefined && when > ctx.currentTime\n ? atAudioTime(ctx, timers, when, finish)\n : null;\n if (!cancelWait) finish();\n },\n disconnect() {\n try { node.disconnect(into); } catch { /* not wired */ }\n },\n };\n el.addEventListener('ended', finish);\n el.addEventListener('error', finish);\n el.play().catch((err: unknown) => {\n if (ended) return;\n console.warn(`@weasel-js/audio: a stream would not start — ${String(err)}`);\n finish();\n });\n return shim;\n}\n\nexport function createStreamStarters(ctx: AudioContext, timers: Timers): StreamStarters {\n // An element can be routed into a graph once, ever: the node is kept for the\n // element's lifetime and handed from voice to voice.\n const mediaSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();\n return {\n element(media, opts) {\n if (typeof media !== 'string') return media;\n const el = new Audio();\n if (opts.crossOrigin !== undefined) el.crossOrigin = opts.crossOrigin;\n el.preload = 'auto';\n el.src = media;\n return el;\n },\n starter(el, opts) {\n return {\n ready: () => true,\n start(voice) {\n let node = mediaSources.get(el);\n if (!node) {\n node = ctx.createMediaElementSource(el);\n mediaSources.set(el, node);\n }\n el.loop = opts.loop ?? false;\n if (opts.offset !== undefined) el.currentTime = opts.offset / 1000;\n voice.retune = () => { el.playbackRate = voice.rate; };\n voice.retune();\n const into = voice.out!.input!;\n node.connect(into);\n return mediaSource(ctx, timers, el, node, into);\n },\n };\n },\n streaming: new WeakMap(),\n };\n}\n","/** An ADSR envelope. Times are ms; `sustain` is a level, 0..1, of the peak. */\nexport interface Envelope {\n /** Default 5 — long enough that the onset does not click. */\n attack?: number;\n /** Default 0. */\n decay?: number;\n /** Default 1. */\n sustain?: number;\n /** Default 30. */\n release?: number;\n}\n\n/** An envelope with every default filled in and every value in range. */\nexport type ResolvedEnvelope = Required<Envelope>;\n\n/** One breakpoint of an envelope's curve: a level at a time. */\nexport interface EnvelopePoint {\n /** ms from the note's start. */\n at: number;\n value: number;\n}\n\n/** Fill an envelope's defaults, clamping times to zero or more and `sustain` to 0..1. */\nexport function resolveEnvelope(env: Envelope = {}): ResolvedEnvelope {\n return {\n attack: Math.max(0, env.attack ?? 5),\n decay: Math.max(0, env.decay ?? 0),\n sustain: Math.min(1, Math.max(0, env.sustain ?? 1)),\n release: Math.max(0, env.release ?? 30),\n };\n}\n\nconst heldLevel = (e: ResolvedEnvelope, t: number): number => {\n if (t < e.attack) return t / e.attack;\n if (t < e.attack + e.decay) return 1 - ((1 - e.sustain) * (t - e.attack)) / e.decay;\n return e.sustain;\n};\n\n/** The level `t` ms after the start. With `gate`, the release begins that many\n * ms in, from whatever level the envelope had reached. */\nexport function envelopeLevel(e: ResolvedEnvelope, t: number, gate?: number): number {\n if (gate === undefined || t <= gate) return heldLevel(e, t);\n if (e.release === 0) return 0;\n return Math.max(0, heldLevel(e, gate) * (1 - (t - gate) / e.release));\n}\n\n/**\n * Breakpoints joined by linear ramps. Without `gate` they end at the sustain,\n * held until something releases the note; with it they end at zero, `gate +\n * release` ms in.\n */\nexport function envelopePoints(e: ResolvedEnvelope, gate?: number): EnvelopePoint[] {\n const end = gate ?? Infinity;\n const points: EnvelopePoint[] = [{ at: 0, value: e.attack > 0 ? 0 : 1 }];\n for (const at of [e.attack, e.attack + e.decay]) {\n if (at <= points[points.length - 1].at) continue;\n if (at >= end) break;\n points.push({ at, value: heldLevel(e, at) });\n }\n if (gate === undefined) return points;\n if (gate > points[points.length - 1].at) points.push({ at: gate, value: heldLevel(e, gate) });\n points.push({ at: gate + e.release, value: 0 });\n return points;\n}\n","const cache = new WeakMap<BaseAudioContext, Map<string, PeriodicWave>>();\n\n/** A wave of sines, partial k at amplitude `partials[k - 1]`, made once per context. */\nexport function periodicWave(ctx: BaseAudioContext, partials: readonly number[]): PeriodicWave {\n let byKey = cache.get(ctx);\n if (!byKey) {\n byKey = new Map();\n cache.set(ctx, byKey);\n }\n const key = partials.join(',');\n let wave = byKey.get(key);\n if (!wave) {\n // Sine terms only: partial k sits at imag[k], and index 0 is the DC term.\n const imag = new Float32Array(partials.length + 1);\n imag.set(partials, 1);\n wave = ctx.createPeriodicWave(new Float32Array(partials.length + 1), imag);\n byKey.set(key, wave);\n }\n return wave;\n}\n","import type { Vec2 } from './spatialize';\nimport type { PlayOptions, VoiceDropReason } from './types';\nimport type { VoicePool } from './voicePool';\nimport type { VoiceOut } from './voiceChains';\n\n/** A voice pool and its token index. Tokens restart at 1 in every pool, so the\n * index has to be per pool — keyed by bus name, a shared pool would look a\n * steal victim up under the wrong name and silently never tear it down. */\nexport interface Slots {\n pool: VoicePool;\n byToken: Map<number, LiveVoice>;\n}\n\n/** What `play` and `playNote` share apart from the node they make. */\nexport type VoiceOptions = Omit<PlayOptions, 'loop'>;\n\n/** What a voice plays through: a scheduled source node, or a stand-in with\n * the same end-of-life contract — `onended` fires asynchronously, once. */\nexport type SourceLike = Pick<AudioScheduledSourceNode, 'onended' | 'stop' | 'disconnect'>;\n\n/** Several sources stopped together, as one: the first carries `onended`. */\nexport const sourceGroup = (nodes: AudioScheduledSourceNode[]): SourceLike => ({\n get onended() { return nodes[0].onended; },\n set onended(fn) { nodes[0].onended = fn; },\n stop(when?: number) {\n for (const n of nodes) {\n try { n.stop(when); } catch { /* not started, or already stopped */ }\n }\n },\n disconnect() { for (const n of nodes) n.disconnect(); },\n});\n\n/** How one kind of voice makes its node. */\nexport interface Starter {\n /** False drops the voice when it comes due. */\n ready(): boolean;\n /** Build the node, connect it into `voice.out.input`, and start it at\n * `when`, engine ms. A booked voice's source already exists: this hands it over. */\n start(voice: LiveVoice, when: number): SourceLike;\n /**\n * For a voice whose samples are made off the main thread: hand it over at\n * the call rather than when the scheduler fires, so a stall between the two\n * cannot delay it. Returns the voice's output in place of a node chain, and\n * what cancels it if it is torn down before it starts.\n */\n book?(voice: LiveVoice, at: { bus: string; when: number; level: number; pan: number }): Booking;\n}\n\n/** What `Starter.book` returns. */\nexport interface Booking {\n out: VoiceOut;\n cancel(): void;\n}\n\nexport interface LiveVoice {\n id: number;\n slots: Slots;\n /** Null until the scheduler fires it: a voice booked seconds out must not\n * hold a slot, and must not be an eviction candidate, while silent. */\n slot: number | null;\n token: number;\n key?: string;\n onDrop?: (reason: VoiceDropReason) => void;\n source: SourceLike | null;\n /** A synth voice's envelope gain, between its sources and the chain. */\n env: GainNode | null;\n /** Writes `rate` and `detune` to the node, once there is one. */\n retune: (() => void) | null;\n /** A synth voice's note-off. Null for a buffer voice, and until it starts. */\n release: (() => void) | null;\n releasing: boolean;\n /** Null once torn down, when a chain goes back to be reused: a handle\n * that outlives its voice must not write to another voice's nodes. */\n out: VoiceOut | null;\n /** A booked voice's cancel, until it starts. */\n unbook: (() => void) | null;\n /** A booked voice's start, run ahead of the scheduler once the audio clock\n * has passed its time: the processor is already playing it. */\n catchUp: (() => void) | null;\n baseGain: number;\n spatialGain: number;\n rate: number;\n detune: number;\n /** Kept so `setListener` can re-spatialize a voice that is already playing. */\n position?: Vec2;\n playing: boolean;\n canceled: boolean;\n /** `stop(fadeMs)` owns the output's level from here until the source ends. */\n fading: boolean;\n /** Context time a `setGain` ramp on the level ends at; 0 when none was asked for. */\n rampEnd: number;\n}\n","/** A pitch: hertz as a number, a scientific pitch name (`'A4'`, `'C#3'`,\n * `'Bb2'`), or a MIDI note number wrapped as `{ midi }` so it cannot be read\n * as hertz. */\nexport type Pitch = number | string | { midi: number };\n\n/** Equal temperament, A4 = MIDI 69 = 440 Hz. Fractional notes are cents. */\nexport function midiToFrequency(midi: number): number {\n return 440 * 2 ** ((midi - 69) / 12);\n}\n\nconst LETTERS: Record<string, number> = { c: 0, d: 2, e: 4, f: 5, g: 7, a: 9, b: 11 };\n\n/** MIDI number of a scientific pitch name: C4 is 60. Accepts any run of `#`\n * or `b` after the letter. */\nexport function noteToMidi(name: string): number {\n const m = /^([A-Ga-g])([#b]*)(-?\\d+)$/.exec(name.trim());\n if (!m) throw new Error(`@weasel-js/audio: cannot read \"${name}\" as a note name`);\n let semitone = LETTERS[m[1].toLowerCase()];\n for (const acc of m[2]) semitone += acc === '#' ? 1 : -1;\n return (Number(m[3]) + 1) * 12 + semitone;\n}\n\n/** A pitch in hertz. Throws on a note name it cannot read, and on a frequency that is not positive and finite. */\nexport function toFrequency(pitch: Pitch): number {\n const hz = typeof pitch === 'number' ? pitch\n : typeof pitch === 'string' ? midiToFrequency(noteToMidi(pitch))\n : midiToFrequency(pitch.midi);\n if (!(hz > 0) || !Number.isFinite(hz)) {\n throw new RangeError(`@weasel-js/audio: a pitch must be a positive frequency, got ${hz}`);\n }\n return hz;\n}\n","import { envelopeLevel, envelopePoints, resolveEnvelope, type ResolvedEnvelope } from './envelope';\nimport { toFrequency } from './pitch';\nimport type { Inharmonic, NoiseColor, NoteOptions, SynthPartial, VoiceFilter, Waveform } from './types';\n\n/** Seconds of noise in each cached loop: long enough that the repeat is not\n * heard as a pitch. */\nexport const NOISE_SECONDS = 2;\n/** Every color is scaled to this RMS, so changing color does not change level. */\nconst NOISE_RMS = 0.25;\n\nconst noiseCache = new WeakMap<BaseAudioContext, Map<NoiseColor, AudioBuffer>>();\n\n/** Samples of `color` noise, seeded so every context gets the same loop. The\n * end is pulled onto the start, so the loop point does not click. */\nexport function noiseSamples(color: NoiseColor, length: number): Float32Array {\n const out = new Float32Array(length);\n let s = 0x9e3779b9;\n const white = (): number => {\n s = (Math.imul(s, 1664525) + 1013904223) >>> 0;\n return (s / 0x100000000) * 2 - 1;\n };\n if (color === 'white') {\n for (let i = 0; i < length; i += 1) out[i] = white();\n } else if (color === 'pink') {\n // Paul Kellet's refined filter: within 0.05 dB of -3 dB/octave above 9 Hz.\n let b0 = 0, b1 = 0, b2 = 0, b3 = 0, b4 = 0, b5 = 0, b6 = 0;\n for (let i = 0; i < length; i += 1) {\n const w = white();\n b0 = 0.99886 * b0 + w * 0.0555179;\n b1 = 0.99332 * b1 + w * 0.0750759;\n b2 = 0.969 * b2 + w * 0.153852;\n b3 = 0.8665 * b3 + w * 0.3104856;\n b4 = 0.55 * b4 + w * 0.5329522;\n b5 = -0.7616 * b5 - w * 0.016898;\n out[i] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + w * 0.5362;\n b6 = w * 0.115926;\n }\n } else {\n // A leaky integrator: -6 dB/octave down to a few Hz, without wandering off.\n let y = 0;\n for (let i = 0; i < length; i += 1) {\n y = (y + 0.02 * white()) / 1.02;\n out[i] = y;\n }\n }\n const step = (out[length - 1] - out[0]) / Math.max(1, length - 1);\n let mean = 0;\n for (let i = 0; i < length; i += 1) {\n out[i] -= step * i;\n mean += out[i];\n }\n mean /= length;\n let sq = 0;\n for (let i = 0; i < length; i += 1) {\n out[i] -= mean;\n sq += out[i] * out[i];\n }\n const scale = sq > 0 ? NOISE_RMS / Math.sqrt(sq / length) : 0;\n for (let i = 0; i < length; i += 1) out[i] *= scale;\n return out;\n}\n\n/** One looping noise buffer per color per context, made on first use. */\nexport function noiseBuffer(ctx: BaseAudioContext, color: NoiseColor): AudioBuffer {\n let byColor = noiseCache.get(ctx);\n if (!byColor) {\n byColor = new Map();\n noiseCache.set(ctx, byColor);\n }\n let buffer = byColor.get(color);\n if (!buffer) {\n const length = Math.round(ctx.sampleRate * NOISE_SECONDS);\n buffer = ctx.createBuffer(1, length, ctx.sampleRate);\n buffer.getChannelData(0).set(noiseSamples(color, length));\n byColor.set(color, buffer);\n }\n return buffer;\n}\n\nexport const isInharmonic = (wave: Waveform): wave is Inharmonic =>\n typeof wave === 'object' && !Array.isArray(wave);\n\n/** Partials with their levels normalized to sum to 1, checked where the note\n * was written rather than when it comes due. */\nexport function resolvePartials(wave: Inharmonic): (SynthPartial & { gain: number })[] {\n if (wave.partials.length === 0) {\n throw new RangeError('@weasel-js/audio: an inharmonic wave needs at least one partial');\n }\n let total = 0;\n for (const p of wave.partials) {\n if (!(p.ratio > 0) || !Number.isFinite(p.ratio)) {\n throw new RangeError(`@weasel-js/audio: partial ratio must be a positive number, got ${p.ratio}`);\n }\n if (p.decay !== undefined && !(p.decay > 0)) {\n throw new RangeError(`@weasel-js/audio: partial decay must be a positive number of ms, got ${p.decay}`);\n }\n total += Math.abs(p.gain ?? 1);\n }\n return wave.partials.map((p) => ({\n ratio: p.ratio,\n gain: total > 0 ? (p.gain ?? 1) / total : 0,\n decay: p.decay,\n }));\n}\n\n/** What of a note is checked where it was written, not when it comes due. */\nexport interface ResolvedNote {\n from: number;\n glideTo: number | undefined;\n partials: (SynthPartial & { gain: number })[] | null;\n}\n\n/** A note's pitch, glide target and partials. Throws on a bad pitch or partial. */\nexport function resolveNote(note: Pick<NoteOptions, 'pitch' | 'glide' | 'wave'>): ResolvedNote {\n const wave = note.wave ?? 'sine';\n return {\n from: toFrequency(note.pitch),\n glideTo: note.glide ? toFrequency(note.glide.to) : undefined,\n partials: isInharmonic(wave) ? resolvePartials(wave) : null,\n };\n}\n\n/** An envelope written onto a param from `t0` (seconds), mapped through `map`,\n * and the note-off that releases it from wherever it has got to. */\nexport function envelopeOnParam(\n param: AudioParam,\n env: ResolvedEnvelope,\n gate: number | undefined,\n t0: number,\n map: (level: number) => number,\n): { release(at: number): void } {\n const [first, ...rest] = envelopePoints(env, gate);\n param.setValueAtTime(map(first.value), t0);\n for (const p of rest) param.linearRampToValueAtTime(map(p.value), t0 + p.at / 1000);\n return {\n release(at) {\n const elapsed = Math.max(0, (at - t0) * 1000);\n param.cancelScheduledValues(at);\n param.setValueAtTime(map(envelopeLevel(env, elapsed)), at);\n param.linearRampToValueAtTime(map(0), at + env.release / 1000);\n },\n };\n}\n\n/** A voice filter's node, scheduled from `t0`, with its envelope's release. */\nexport function voiceFilter(\n ctx: BaseAudioContext,\n spec: VoiceFilter,\n gate: number | undefined,\n t0: number,\n): { node: BiquadFilterNode; release(at: number): void } {\n const node = ctx.createBiquadFilter();\n node.type = spec.type ?? 'lowpass';\n node.Q.setValueAtTime(spec.Q ?? 1, t0);\n if (spec.gain !== undefined) node.gain.setValueAtTime(spec.gain, t0);\n const amount = spec.amount ?? 0;\n if (!spec.envelope || amount === 0) {\n node.frequency.setValueAtTime(spec.frequency, t0);\n return { node, release: () => {} };\n }\n const cutoff = envelopeOnParam(\n node.frequency, resolveEnvelope(spec.envelope), gate, t0, (v) => spec.frequency + amount * v,\n );\n return { node, release: cutoff.release };\n}\n\n/**\n * Ready-made inharmonic waves. The ratios are the textbook modes of each\n * object; the levels and decays are a starting point to spread and adjust.\n */\nexport const partialPresets = {\n /** A church bell's hum, prime, tierce, quint and nominal, and above. */\n bell: {\n partials: [\n { ratio: 0.5, gain: 0.6, decay: 1800 },\n { ratio: 1, gain: 1, decay: 1200 },\n { ratio: 1.183, gain: 0.7, decay: 900 },\n { ratio: 1.506, gain: 0.4, decay: 700 },\n { ratio: 2, gain: 0.8, decay: 600 },\n { ratio: 2.514, gain: 0.3, decay: 400 },\n { ratio: 2.662, gain: 0.25, decay: 350 },\n { ratio: 3.011, gain: 0.2, decay: 300 },\n ],\n },\n /** A tuned bar: its overtones sit near 4 and 10 times the fundamental and die fast. */\n marimba: {\n partials: [\n { ratio: 1, gain: 1, decay: 350 },\n { ratio: 3.984, gain: 0.35, decay: 90 },\n { ratio: 9.95, gain: 0.12, decay: 30 },\n ],\n },\n /** Struck sheet metal: modes nowhere near the harmonic series. */\n metal: {\n partials: [\n { ratio: 1, gain: 1, decay: 160 },\n { ratio: 1.71, gain: 0.53, decay: 120 },\n { ratio: 2.43, gain: 0.36, decay: 94 },\n { ratio: 3.19, gain: 0.27, decay: 78 },\n { ratio: 4.61, gain: 0.22, decay: 66 },\n { ratio: 5.87, gain: 0.18, decay: 58 },\n ],\n },\n} satisfies Record<string, Inharmonic>;\n","import { resolveEnvelope, type Envelope } from './envelope';\nimport { periodicWave } from './periodicWave';\nimport { sourceGroup, type LiveVoice, type SourceLike, type Starter } from './liveVoice';\nimport {\n envelopeOnParam, noiseBuffer, resolveNote, voiceFilter, type ResolvedNote,\n} from './synthVoice';\nimport type { Inharmonic, NoiseOptions, NoteOptions, VoiceFilter, Waveform } from './types';\n\n/** How `playNote` and `playNoise` make their nodes. */\nexport interface SynthStarters {\n /** Throws on a bad pitch or partial, at the call rather than when it comes due. */\n note(note: NoteOptions): Starter;\n noise(noise: NoiseOptions): Starter;\n}\n\n/**\n * What every synth voice shares once its sources exist: sources → optional\n * filter → envelope gain → the voice's chain, the envelopes on both, the stop\n * at the end of the release, and the note-off. `make` builds and starts the\n * sources at `t0`, connected into the node it is handed.\n */\nfunction synthStart(\n ctx: BaseAudioContext,\n voice: LiveVoice,\n whenMs: number,\n patch: { envelope?: Envelope; filter?: VoiceFilter; duration?: number },\n make: (t0: number, into: AudioNode) => { nodes: AudioScheduledSourceNode[]; retune: () => void },\n): SourceLike {\n const t0 = whenMs / 1000;\n const env = resolveEnvelope(patch.envelope);\n const gate = patch.duration;\n // Its own gain, not the chain's: `setGain` and a fade cancel whatever is\n // scheduled on the chain's gain, and would take the envelope with it.\n const shaper = ctx.createGain();\n const amp = envelopeOnParam(shaper.gain, env, gate, t0, (v) => v);\n const filter = patch.filter ? voiceFilter(ctx, patch.filter, gate, t0) : null;\n filter?.node.connect(shaper);\n shaper.connect(voice.out!.input!);\n voice.env = shaper;\n\n const { nodes, retune } = make(t0, filter?.node ?? shaper);\n voice.retune = retune;\n retune();\n const stopAll = (at: number): void => { for (const n of nodes) n.stop(at); };\n voice.release = () => {\n const at = ctx.currentTime;\n // Already past its gate: the release is running and the stop is booked.\n if (gate !== undefined && at * 1000 - whenMs >= gate) return;\n amp.release(at);\n filter?.release(at);\n stopAll(at + env.release / 1000);\n };\n if (gate !== undefined) stopAll(t0 + (gate + env.release) / 1000);\n return nodes.length === 1 ? nodes[0] : sourceGroup(nodes);\n}\n\n/** A note's oscillators, started at `t0` into `into`: one with the note's\n * wave, or one sine per partial of an inharmonic wave. */\nfunction noteOscillators(\n ctx: BaseAudioContext,\n note: NoteOptions,\n { from, glideTo, partials }: ResolvedNote,\n applyWave: (osc: OscillatorNode, wave: Exclude<Waveform, Inharmonic>) => void,\n t0: number,\n into: AudioNode,\n): OscillatorNode[] {\n const wave = note.wave ?? 'sine';\n const tone = (ratio: number): OscillatorNode => {\n const osc = ctx.createOscillator();\n osc.frequency.setValueAtTime(from * ratio, t0);\n if (glideTo !== undefined) {\n const end = t0 + (note.glide!.ms ?? note.duration ?? 100) / 1000;\n if (note.glide!.curve === 'linear') osc.frequency.linearRampToValueAtTime(glideTo * ratio, end);\n else osc.frequency.exponentialRampToValueAtTime(glideTo * ratio, end);\n }\n return osc;\n };\n let oscs: OscillatorNode[];\n if (partials) {\n // Sines summed by hand: a PeriodicWave can only hold whole-number partials.\n oscs = partials.map((p) => {\n const osc = tone(p.ratio);\n const level = ctx.createGain();\n level.gain.setValueAtTime(p.gain, t0);\n if (p.decay !== undefined) level.gain.setTargetAtTime(0, t0, p.decay / 1000);\n osc.connect(level);\n level.connect(into);\n return osc;\n });\n } else {\n const osc = tone(1);\n applyWave(osc, wave as Exclude<Waveform, Inharmonic>);\n osc.connect(into);\n oscs = [osc];\n }\n for (const osc of oscs) osc.start(t0);\n return oscs;\n}\n\nexport function createSynthStarters(ctx: BaseAudioContext, random: () => number): SynthStarters {\n const applyWave = (osc: OscillatorNode, wave: Exclude<Waveform, Inharmonic>): void => {\n if (typeof wave === 'string') {\n osc.type = wave;\n return;\n }\n osc.setPeriodicWave(periodicWave(ctx, wave));\n };\n\n return {\n note(note) {\n const resolved = resolveNote(note);\n return {\n ready: () => true,\n start: (voice, whenMs) => synthStart(ctx, voice, whenMs, note, (t0, into) => {\n const oscs = noteOscillators(ctx, note, resolved, applyWave, t0, into);\n return {\n nodes: oscs,\n retune: () => {\n for (const osc of oscs) osc.detune.value = voice.detune + 1200 * Math.log2(voice.rate);\n },\n };\n }),\n };\n },\n\n noise(noise) {\n return {\n ready: () => true,\n start: (voice, whenMs) => synthStart(ctx, voice, whenMs, noise, (t0, into) => {\n const source = ctx.createBufferSource();\n source.buffer = noiseBuffer(ctx, noise.noise);\n source.loop = true;\n source.connect(into);\n // A random point in the loop, so two hits in a row are not the same hit.\n source.start(t0, random() * source.buffer.duration);\n return {\n nodes: [source],\n retune: () => {\n source.playbackRate.value = voice.rate;\n source.detune.value = voice.detune;\n },\n };\n }),\n };\n },\n };\n}\n","const loads = new WeakMap<BaseAudioContext, Promise<void>>();\n\n/** Add the voice processor to a context's worklet scope, once per context.\n * Rejects where there is no `audioWorklet` (an insecure page), or where the\n * page's CSP refuses a `blob:` script. */\nexport function loadVoiceProcessor(ctx: BaseAudioContext): Promise<void> {\n let load = loads.get(ctx);\n if (!load) {\n load = (async () => {\n if (!ctx.audioWorklet) throw new Error('@weasel-js/audio: this context has no audioWorklet');\n // Imported here, so an engine that never asks for worklet voices does not carry the source.\n const { voiceProcessorSource } = await import('./voiceProcessor.gen');\n const url = URL.createObjectURL(new Blob([voiceProcessorSource], { type: 'text/javascript' }));\n try {\n await ctx.audioWorklet.addModule(url);\n } finally {\n URL.revokeObjectURL(url);\n }\n })();\n loads.set(ctx, load);\n }\n return load;\n}\n","import type { KernelNoise, KernelNote } from '../voiceKernel';\n\n/** The name the voice processor registers under in an `AudioWorkletGlobalScope`. */\nexport const VOICE_PROCESSOR = 'weasel-voices';\n\n/** What a voice starts with. Times are context seconds. */\ninterface VoiceStart {\n id: number;\n /** When the voice's first sample sounds. */\n at: number;\n level: number;\n pan: number;\n rate: number;\n detune: number;\n}\n\n/** What the engine posts to a bus's voice processor. Every time is context\n * seconds, and one already past applies at the next render quantum. */\nexport type ToProcessor =\n | (VoiceStart & { kind: 'note'; patch: KernelNote })\n | (VoiceStart & { kind: 'noise'; patch: KernelNoise; seed: number })\n /** `end` 0 sets the level at once; otherwise it ramps there linearly, from\n * wherever it is, by `end` — what `writeParam` does to a gain. */\n | { kind: 'level'; id: number; value: number; end: number }\n | { kind: 'pan'; id: number; value: number }\n | { kind: 'retune'; id: number; rate: number; detune: number }\n | { kind: 'release'; id: number }\n /** Silence the voice at `at`, or before it starts if that is earlier. */\n | { kind: 'stop'; id: number; at: number }\n | { kind: 'dispose' };\n\n/** What a voice processor posts back: a voice has stopped making sound, for\n * good — it played out, or reached its stop. */\nexport interface FromProcessor {\n kind: 'ended';\n id: number;\n}\n","import type { Booking, LiveVoice, SourceLike, Starter } from '../liveVoice';\nimport { resolveNote } from '../synthVoice';\nimport type { NoiseOptions, NoteOptions } from '../types';\nimport type { VoiceOut } from '../voiceChains';\nimport { loadVoiceProcessor } from './loadVoiceProcessor';\nimport { VOICE_PROCESSOR, type FromProcessor, type ToProcessor } from './protocol';\n\n/** Synth voices rendered by the voice processor, one processor per bus. */\nexport interface WorkletVoices {\n /** True once the processor has loaded into the context. */\n ready(): boolean;\n /** Settles once the processor has loaded, or has failed to. */\n loaded: Promise<void>;\n note(note: NoteOptions): Starter;\n noise(noise: NoiseOptions): Starter;\n dispose(): void;\n}\n\n/** What a voice's events are sent to, and the sources waiting on its `ended`. */\ninterface Bus {\n node: AudioWorkletNode;\n sources: Map<number, WorkletSource>;\n}\n\ntype WorkletSource = SourceLike & { end(): void };\n\n/** A booked voice as a source: `stop` posts the stop, and the processor's\n * `ended` is its `onended`, however early that comes. */\nfunction workletSource(post: (event: ToProcessor) => void, id: number): WorkletSource {\n let onended: SourceLike['onended'] = null;\n let ended = false;\n const fire = (): void => { (onended as (() => void) | null)?.(); };\n return {\n get onended() { return onended; },\n set onended(fn) {\n onended = fn;\n if (ended) queueMicrotask(fire);\n },\n stop(when?: number) { post({ kind: 'stop', id, at: when ?? 0 }); },\n disconnect() {},\n end() {\n if (ended) return;\n ended = true;\n fire();\n },\n };\n}\n\n/** The voice's level and pan, sent to the processor rather than set on a node. */\nfunction workletOut(ctx: BaseAudioContext, post: (event: ToProcessor) => void, id: number): VoiceOut {\n return {\n input: null,\n level(value, rampMs) {\n post({ kind: 'level', id, value, end: rampMs && rampMs > 0 ? ctx.currentTime + rampMs / 1000 : 0 });\n },\n pan(value) { post({ kind: 'pan', id, value }); },\n free() {},\n abandon() {},\n };\n}\n\nexport function createWorkletVoices(\n ctx: BaseAudioContext,\n busInput: (bus: string) => AudioNode,\n random: () => number,\n): WorkletVoices {\n let ready = false;\n const loaded = loadVoiceProcessor(ctx).then(\n () => { ready = true; },\n (err: unknown) => {\n console.warn(`@weasel-js/audio: the voice worklet did not load, so synth voices stay on nodes — ${String(err)}`);\n },\n );\n const buses = new Map<string, Bus>();\n\n const busFor = (name: string): Bus => {\n let bus = buses.get(name);\n if (!bus) {\n const node = new AudioWorkletNode(ctx, VOICE_PROCESSOR, {\n numberOfInputs: 0, numberOfOutputs: 1, outputChannelCount: [2],\n });\n const sources = new Map<number, WorkletSource>();\n node.port.onmessage = (e: MessageEvent<FromProcessor>) => {\n const source = sources.get(e.data.id);\n sources.delete(e.data.id);\n source?.end();\n };\n node.connect(busInput(name));\n bus = { node, sources };\n buses.set(name, bus);\n }\n return bus;\n };\n\n /** A starter that posts the voice when it is played and hands over its\n * source when the scheduler fires. */\n const starter = (\n event: (voice: LiveVoice, at: number, level: number, pan: number) => ToProcessor,\n ): Starter => {\n let source: WorkletSource | null = null;\n let post: (e: ToProcessor) => void = () => {};\n return {\n ready: () => true,\n book(voice, at): Booking {\n const bus = busFor(at.bus);\n post = (e) => { bus.node.port.postMessage(e); };\n post(event(voice, at.when / 1000, at.level, at.pan));\n source = workletSource(post, voice.id);\n bus.sources.set(voice.id, source);\n voice.retune = () => { post({ kind: 'retune', id: voice.id, rate: voice.rate, detune: voice.detune }); };\n return {\n out: workletOut(ctx, post, voice.id),\n cancel: () => { post({ kind: 'stop', id: voice.id, at: 0 }); },\n };\n },\n start(voice) {\n voice.release = () => { post({ kind: 'release', id: voice.id }); };\n return source!;\n },\n };\n };\n\n return {\n ready: () => ready,\n loaded,\n note(note) {\n resolveNote(note);\n const patch = {\n pitch: note.pitch, wave: note.wave, envelope: note.envelope, glide: note.glide,\n filter: note.filter, duration: note.duration,\n };\n return starter((voice, at, level, pan) => ({\n kind: 'note', id: voice.id, at, level, pan, rate: voice.rate, detune: voice.detune, patch,\n }));\n },\n noise(noise) {\n const patch = { noise: noise.noise, envelope: noise.envelope, filter: noise.filter, duration: noise.duration };\n return starter((voice, at, level, pan) => ({\n kind: 'noise', id: voice.id, at, level, pan, rate: voice.rate, detune: voice.detune, patch,\n // A random point in the loop, so two hits in a row are not the same hit.\n seed: random(),\n }));\n },\n dispose() {\n for (const bus of buses.values()) {\n bus.node.port.postMessage({ kind: 'dispose' } satisfies ToProcessor);\n bus.node.port.onmessage = null;\n bus.node.disconnect();\n }\n buses.clear();\n },\n };\n}\n","/** Runs in the worker. A message with `ms` books timer `id`; one without clears\n * it. Each timer posts its id back once, when it elapses. */\nconst WORKER_SOURCE = `const timers = new Map();\nself.onmessage = (e) => {\n const id = e.data.id;\n clearTimeout(timers.get(id));\n timers.delete(id);\n if (e.data.ms === undefined) return;\n timers.set(id, setTimeout(() => {\n timers.delete(id);\n self.postMessage(id);\n }, e.data.ms));\n};\n`;\n\n/** The timer pair `createTickTimer` returns, shaped for `SchedulerOptions`. */\nexport interface TickTimer {\n /** One-shot, as `createScheduler` expects. */\n setTimer(cb: () => void, ms: number): unknown;\n clearTimer(handle: unknown): void;\n /** Terminate the worker and drop every pending timer. */\n dispose(): void;\n}\n\ninterface Pending {\n cb: () => void;\n ms: number;\n fallback?: ReturnType<typeof setTimeout>;\n}\n\nfunction spawn(): { worker: Worker; url: string } | null {\n if (\n typeof Worker !== 'function' ||\n typeof Blob !== 'function' ||\n typeof URL === 'undefined' ||\n typeof URL.createObjectURL !== 'function'\n ) {\n return null;\n }\n let url: string | undefined;\n try {\n url = URL.createObjectURL(new Blob([WORKER_SOURCE], { type: 'text/javascript' }));\n return { worker: new Worker(url), url };\n } catch {\n if (url !== undefined) URL.revokeObjectURL(url);\n return null;\n }\n}\n\n/**\n * A timer for the scheduler's pass that is not held to the main thread's\n * hidden-tab clamp: each delay runs inside a dedicated Worker, which posts back\n * when it elapses. Falls back to `setTimeout` when no worker can be made — no\n * `Worker` global, a constructor that throws, or a worker that fails to load,\n * which is how a CSP refusal can arrive.\n */\nexport function createTickTimer(): TickTimer {\n let nextId = 1;\n const pending = new Map<number, Pending>();\n let spawned = spawn();\n\n const fire = (id: number): void => {\n const p = pending.get(id);\n if (!p) return;\n pending.delete(id);\n p.cb();\n };\n const arm = (id: number, p: Pending): void => {\n p.fallback = setTimeout(() => fire(id), p.ms);\n };\n const release = (): void => {\n if (!spawned) return;\n spawned.worker.terminate();\n URL.revokeObjectURL(spawned.url);\n spawned = null;\n };\n\n if (spawned) {\n spawned.worker.addEventListener('message', (e: MessageEvent) => fire(e.data as number));\n spawned.worker.addEventListener('error', () => {\n if (!spawned) return;\n release();\n // Anything posted to a worker that never loaded is lost with it.\n for (const [id, p] of pending) arm(id, p);\n });\n }\n\n return {\n setTimer(cb, ms) {\n const id = nextId++;\n const p: Pending = { cb, ms };\n pending.set(id, p);\n if (spawned) spawned.worker.postMessage({ id, ms });\n else arm(id, p);\n return id;\n },\n clearTimer(handle) {\n const id = handle as number;\n const p = pending.get(id);\n if (!p) return;\n pending.delete(id);\n if (p.fallback !== undefined) clearTimeout(p.fallback);\n else spawned?.worker.postMessage({ id });\n },\n dispose() {\n for (const p of pending.values()) {\n if (p.fallback !== undefined) clearTimeout(p.fallback);\n }\n pending.clear();\n release();\n },\n };\n}\n","import { writeParam } from './param';\n\n/** Where a voice's level and pan are applied, between its source and its bus. */\nexport interface VoiceOut {\n /** What a node voice's source connects into. Null for a voice whose samples\n * are made off the main thread, which has no node of its own. */\n readonly input: AudioNode | null;\n /** The level at once, or a linear ramp to it ending `rampMs` from now,\n * from wherever it is — `writeParam`'s semantics. */\n level(value: number, rampMs?: number): void;\n pan(value: number): void;\n /** Done with, and free to be reused. */\n free(): void;\n /** Off its bus and never reused: something half-built is still wired into it. */\n abandon(): void;\n}\n\n/** A gain and a stereo panner per voice, handed from voice to voice so a new\n * voice does not build two nodes. */\nexport interface ChainPool {\n take(bus: AudioNode, gain: number, pan: number): VoiceOut;\n clear(): void;\n}\n\ninterface Chain {\n gain: GainNode;\n panner: StereoPannerNode;\n}\n\nexport function createChainPool(ctx: BaseAudioContext, limit: number): ChainPool {\n // An idle chain is kept off its bus: still wired to the destination, it costs\n // the audio thread every render quantum whether or not anything sounds.\n const idle: Chain[] = [];\n const newChain = (): Chain => {\n const chain = { gain: ctx.createGain(), panner: ctx.createStereoPanner() };\n chain.panner.connect(chain.gain);\n return chain;\n };\n return {\n take(bus, gain, pan) {\n const chain = idle.pop() ?? newChain();\n const { gain: amp, panner } = chain;\n // Not a bare `.value`: a reused gain can still hold the last voice's fade.\n writeParam(ctx, amp.gain, gain);\n panner.pan.value = pan;\n amp.connect(bus);\n let held = true;\n return {\n input: panner,\n level: (value, rampMs) => writeParam(ctx, amp.gain, value, rampMs),\n pan: (value) => { panner.pan.value = value; },\n free() {\n if (!held) return;\n held = false;\n amp.disconnect();\n if (idle.length < limit) idle.push(chain);\n },\n abandon() {\n held = false;\n amp.disconnect();\n },\n };\n },\n clear() { idle.length = 0; },\n };\n}\n","import type { VoiceDropReason } from './types';\n\n/** Tell a voice's owner it never played. Queued, as a source's `onended` is:\n * a play dropped on the spot would otherwise call back before `play()` has\n * returned the handle. */\nexport const reportDrop = (\n onDrop: ((reason: VoiceDropReason) => void) | undefined,\n reason: VoiceDropReason,\n): void => {\n if (onDrop) queueMicrotask(() => onDrop(reason));\n};\n\n/** The console warnings for a dropped play, each given once per engine. */\nexport interface DropWarnings {\n locked(): void;\n disposed(): void;\n unknownSound(id: string): void;\n /** Let `locked` warn again, after the context suspended a second time. */\n rearmLocked(): void;\n}\n\nexport function createDropWarnings(): DropWarnings {\n let warnedLocked = false;\n let warnedDisposed = false;\n let warnedUnknownSound = false;\n return {\n locked() {\n if (warnedLocked) return;\n warnedLocked = true;\n console.warn(\n '@weasel-js/audio: play() before the AudioContext was unlocked — the voice was dropped. ' +\n 'Browsers require a user gesture; call engine.unlock() from one, or wait for the ' +\n 'automatic gesture listener.',\n );\n },\n disposed() {\n if (warnedDisposed) return;\n warnedDisposed = true;\n console.warn('@weasel-js/audio: play() after dispose() — the voice was dropped.');\n },\n unknownSound(id) {\n if (warnedUnknownSound) return;\n warnedUnknownSound = true;\n console.warn(\n `@weasel-js/audio: play() was handed sound \"${id}\", which this engine never loaded — ` +\n 'the voice was dropped. A handle belongs to the engine that produced it.',\n );\n },\n rearmLocked() { warnedLocked = false; },\n };\n}\n","/** Which voice a full pool evicts: the earliest started, or the lowest gain. */\nexport type StealPolicy = 'oldest' | 'quietest';\n\n/** Options for `createVoicePool`. */\nexport interface VoicePoolOptions {\n /** Maximum concurrent voices, at least 1. Beyond this, `acquire` steals. */\n limit: number;\n /** Default 'oldest'. */\n steal?: StealPolicy;\n}\n\n/** What the pool knows about a voice, for choosing one to steal. */\nexport interface VoiceRecord {\n /** Engine time the voice started, in ms. */\n startedAt: number;\n /** Current gain, consulted by the 'quietest' steal policy. */\n gain: number;\n}\n\n/** The result of `VoicePool.acquire`. */\nexport interface Acquisition {\n slot: number;\n /** Identifies this voice, not its slot: a stolen slot is reissued at once,\n * so `release` and `setGain` take the token and ignore a stale one. */\n token: number;\n /** Token of the voice evicted to make room, or null. The caller is\n * responsible for actually stopping that voice's nodes. */\n stolen: number | null;\n}\n\n/** Slot accounting for concurrent voices. See `createVoicePool`. */\nexport interface VoicePool {\n acquire(record: VoiceRecord): Acquisition;\n release(slot: number, token: number): void;\n setGain(slot: number, token: number, gain: number): void;\n active(): number;\n}\n\n/**\n * Slot bookkeeping for concurrent voices, with a steal policy for when the\n * limit is reached.\n *\n * This is pure accounting — it owns no audio nodes. The engine reuses its\n * `GainNode`/`StereoPannerNode` chains separately, and mints a fresh\n * `AudioBufferSourceNode` per play, because a source node is single-use by\n * specification and cannot be restarted once stopped.\n */\nexport function createVoicePool(opts: VoicePoolOptions): VoicePool {\n if (!(opts.limit >= 1)) {\n throw new RangeError(`@weasel-js/audio: voice pool limit must be at least 1, got ${opts.limit}`);\n }\n const steal = opts.steal ?? 'oldest';\n const live = new Map<number, VoiceRecord & { token: number }>();\n const free: number[] = [];\n let nextSlot = 0;\n let nextToken = 1;\n\n const victim = (): number => {\n let worst = -1;\n let worstScore = Infinity;\n for (const [slot, rec] of live) {\n const score = steal === 'quietest' ? rec.gain : rec.startedAt;\n if (score < worstScore) { worstScore = score; worst = slot; }\n }\n return worst;\n };\n\n return {\n acquire(record) {\n const token = nextToken++;\n if (live.size < opts.limit) {\n const slot = free.length > 0 ? free.pop()! : nextSlot++;\n live.set(slot, { ...record, token });\n return { slot, token, stolen: null };\n }\n const slot = victim();\n const stolen = live.get(slot)!.token;\n // Re-inserting moves the slot to the back of the iteration order, so\n // voices tied on score take turns being the victim.\n live.delete(slot);\n live.set(slot, { ...record, token });\n return { slot, token, stolen };\n },\n release(slot, token) {\n if (live.get(slot)?.token !== token) return;\n live.delete(slot);\n free.push(slot);\n },\n setGain(slot, token, gain) {\n const rec = live.get(slot);\n if (rec?.token === token) rec.gain = gain;\n },\n active: () => live.size,\n };\n}\n","/** A 2D world position, in the consumer's own units. */\nexport interface Vec2 { x: number; y: number }\n\n/** Distance and pan model for `spatialize`, in the same units as the\n * positions. */\nexport interface SpatialOptions {\n /** Distance within which gain stays at 1. Default 1. The inverse model needs\n * this above 0: at 0 it cliffs gain from 1 to 0 at any nonzero distance. */\n refDistance?: number;\n /** Distance at which linear rolloff reaches 0. Ignored by inverse. Default\n * 10000. At or below `refDistance` it gives the same 1-to-0 cliff, there. */\n maxDistance?: number;\n /** Default 'inverse' — the natural-sounding one. */\n rolloff?: 'inverse' | 'linear';\n /** How sharply gain falls. Default 1. */\n rolloffFactor?: number;\n /** Horizontal distance mapping to full left/right. Default 500. */\n panWidth?: number;\n}\n\n/**\n * Map a source position to a gain and a stereo pan, relative to the listener.\n *\n * Pure — no Web Audio, no state. This is the whole spatial model.\n */\nexport function spatialize(\n source: Vec2,\n listener: Vec2,\n opts: SpatialOptions = {},\n): { gain: number; pan: number } {\n const refDistance = opts.refDistance ?? 1;\n const maxDistance = opts.maxDistance ?? 10000;\n const rolloff = opts.rolloff ?? 'inverse';\n const rolloffFactor = opts.rolloffFactor ?? 1;\n const panWidth = opts.panWidth ?? 500;\n\n const dx = source.x - listener.x;\n const dy = source.y - listener.y;\n const distance = Math.hypot(dx, dy);\n\n let gain: number;\n if (distance <= refDistance) {\n gain = 1;\n } else if (rolloff === 'linear') {\n const span = maxDistance - refDistance;\n gain = span <= 0 ? 0 : 1 - rolloffFactor * ((distance - refDistance) / span);\n } else {\n gain = refDistance / (refDistance + rolloffFactor * (distance - refDistance));\n }\n gain = Math.min(1, Math.max(0, gain));\n\n const pan = panWidth <= 0 ? 0 : Math.min(1, Math.max(-1, dx / panWidth));\n\n return { gain, pan };\n}\n","import type { Scheduler } from './scheduler';\nimport { spatialize, type SpatialOptions, type Vec2 } from './spatialize';\nimport type { VoiceDropReason, VoiceHandle } from './types';\nimport type { ChainPool } from './voiceChains';\nimport { reportDrop, type DropWarnings } from './voiceDrops';\nimport type { LiveVoice, Slots, SourceLike, Starter, VoiceOptions } from './liveVoice';\n\n/** Every voice the engine has booked or is playing, whatever makes its node. */\nexport interface Voices {\n /**\n * Everything a voice does apart from making its node: the lock and dispose\n * checks, the output, the booking, the stale-backlog check, the slot and any\n * steal, and the handle.\n */\n launch(common: VoiceOptions, starter: Starter): VoiceHandle;\n stopAll(reason: VoiceDropReason): void;\n /** Stop every voice booked under `key`. */\n stopKey(key: string): void;\n /** Re-spatialize every voice with a position, after the listener moved. */\n respatialize(): void;\n}\n\nexport interface VoicesDeps {\n ctx: BaseAudioContext;\n scheduler: Pick<Scheduler, 'schedule'>;\n chains: ChainPool;\n busInput(bus: string): AudioNode;\n slotsFor(bus: string): Slots;\n defaultBus: string;\n warn: DropWarnings;\n staleFloor(): number;\n disposed(): boolean;\n listener(): { at: Vec2; opts: SpatialOptions };\n}\n\ninterface VoiceOps {\n teardown(voice: LiveVoice, reason?: VoiceDropReason): void;\n applySpatial(voice: LiveVoice): void;\n poolGain(voice: LiveVoice): void;\n}\n\nconst dropped = (id: number): VoiceHandle => ({\n id,\n stop: () => {}, release: () => {}, setGain: () => {}, setRate: () => {}, setDetune: () => {},\n setPan: () => {}, setPosition: () => {}, isPlaying: () => false,\n});\n\nfunction teardownVoice(voice: LiveVoice, reason: VoiceDropReason, live: Map<number, LiveVoice>): void {\n // First, and never at a call site: teardown is what makes a voice dead, and\n // a queued callback that outlives it must find it canceled. The steal path\n // has no other place to set this.\n voice.canceled = true;\n if (!voice.playing && voice.source === null) return;\n voice.playing = false;\n if (voice.source === null) {\n voice.unbook?.();\n reportDrop(voice.onDrop, reason);\n }\n voice.unbook = null;\n if (voice.source) {\n try { voice.source.stop(); } catch { /* already stopped */ }\n voice.source.disconnect();\n }\n voice.source = null;\n voice.retune = null;\n voice.release = null;\n voice.env?.disconnect();\n voice.env = null;\n voice.out?.free();\n voice.out = null;\n live.delete(voice.id);\n if (voice.slot !== null) {\n voice.slots.byToken.delete(voice.token);\n // Safe on the steal path too: the pool has already reissued this slot\n // under a new token, and it ignores a release carrying the old one.\n voice.slots.pool.release(voice.slot, voice.token);\n }\n}\n\n/** The scheduler's half of a voice: it came due at `scheduledWhen`. */\nfunction startVoice(\n voice: LiveVoice,\n starter: Starter,\n bookedAt: number,\n scheduledWhen: number,\n onDone: (() => void) | undefined,\n staleFloor: number,\n teardown: VoiceOps['teardown'],\n): void {\n // A source already: `catchUp` started it ahead of this pass.\n if (voice.canceled || voice.source !== null) return;\n // Came due while the context was suspended: starting it now would play\n // a backlog at once, which is what dropping a locked play avoids. A voice\n // played since the resume is no backlog, however early its `when`. Nor is a\n // booked voice: the audio thread holds it, and its clock stopped too.\n const booked = voice.unbook !== null;\n if (!booked && bookedAt < staleFloor && scheduledWhen < staleFloor) {\n teardown(voice, 'stale');\n return;\n }\n if (!starter.ready()) {\n teardown(voice, 'unready');\n return;\n }\n\n // The slot is taken here, not at booking time. A voice booked a bar out\n // would otherwise hold one while silent — and, its `startedAt` being in\n // the future, be the last thing the 'oldest' policy evicts, so booking\n // a bar of events would evict everything currently audible.\n const { slots } = voice;\n const acquired = slots.pool.acquire({\n startedAt: scheduledWhen,\n gain: voice.baseGain * voice.spatialGain,\n });\n voice.slot = acquired.slot;\n voice.token = acquired.token;\n slots.byToken.set(acquired.token, voice);\n if (acquired.stolen !== null) {\n const victim = slots.byToken.get(acquired.stolen);\n if (victim) teardown(victim);\n }\n\n let source: SourceLike;\n try {\n source = starter.start(voice, scheduledWhen);\n } catch (err) {\n // Not back to the idle chains: whatever the starter built before it threw is still wired into this one.\n voice.out?.abandon();\n voice.out = null;\n teardown(voice, 'failed');\n throw err;\n }\n voice.unbook = null;\n voice.catchUp = null;\n source.onended = () => { teardown(voice); onDone?.(); };\n voice.source = source;\n}\n\nfunction voiceHandle(ctx: BaseAudioContext, voice: LiveVoice, ops: VoiceOps): VoiceHandle {\n const { teardown, applySpatial, poolGain } = ops;\n return {\n id: voice.id,\n stop(fadeMs) {\n voice.catchUp?.();\n if (fadeMs && fadeMs > 0 && voice.source && voice.out && !voice.canceled) {\n // Canceled but not torn down: the fade is what ends this voice, and\n // stopping the source now would cut the ramp scheduled a line above\n // it — which is the click `fadeMs` exists to avoid. `onended` does\n // the bookkeeping when the fade reaches the end.\n voice.canceled = true;\n voice.fading = true;\n voice.out.level(0, fadeMs);\n try { voice.source.stop(ctx.currentTime + fadeMs / 1000); } catch { /* ended */ }\n return;\n }\n teardown(voice);\n },\n release() {\n if (voice.releasing) return;\n voice.catchUp?.();\n if (voice.release && voice.source && !voice.canceled) {\n // Like a fade: `onended` tears the voice down once the release is out.\n voice.releasing = true;\n voice.canceled = true;\n voice.release();\n return;\n }\n teardown(voice);\n },\n setGain(value, rampMs) {\n voice.baseGain = value;\n if (!voice.out || voice.fading) return;\n voice.rampEnd = rampMs && rampMs > 0 ? ctx.currentTime + rampMs / 1000 : 0;\n voice.out.level(value * voice.spatialGain, rampMs);\n poolGain(voice);\n },\n setRate(value) {\n voice.rate = value;\n voice.retune?.();\n },\n setDetune(cents) {\n voice.detune = cents;\n voice.retune?.();\n },\n setPan(value) {\n voice.position = undefined;\n voice.out?.pan(value);\n },\n setPosition(p) {\n voice.position = p;\n applySpatial(voice);\n },\n isPlaying: () => voice.playing,\n };\n}\n\nexport function createVoices(deps: VoicesDeps): Voices {\n const { ctx, chains, warn } = deps;\n const live = new Map<number, LiveVoice>();\n let nextVoiceId = 1;\n\n const spatialOf = (p: Vec2) => {\n const l = deps.listener();\n return spatialize(p, l.at, l.opts);\n };\n\n const poolGain = (voice: LiveVoice): void => {\n if (voice.slot === null) return;\n voice.slots.pool.setGain(voice.slot, voice.token, voice.baseGain * voice.spatialGain);\n };\n\n const applySpatial = (voice: LiveVoice): void => {\n if (!voice.position || !voice.out) return;\n const s = spatialOf(voice.position);\n voice.spatialGain = s.gain;\n voice.out.pan(s.pan);\n if (!voice.fading) {\n // A level write cancels what is scheduled, so a ramp still running is rescheduled to the same end.\n const left = (voice.rampEnd - ctx.currentTime) * 1000;\n voice.out.level(voice.baseGain * s.gain, left > 0 ? left : undefined);\n }\n poolGain(voice);\n };\n\n const teardown = (voice: LiveVoice, reason: VoiceDropReason = 'stopped'): void => {\n teardownVoice(voice, reason, live);\n };\n const ops: VoiceOps = { teardown, applySpatial, poolGain };\n\n return {\n launch(common, starter) {\n const id = nextVoiceId++;\n\n if (deps.disposed()) {\n warn.disposed();\n reportDrop(common.onDrop, 'disposed');\n return dropped(id);\n }\n if (ctx.state !== 'running') {\n warn.locked();\n reportDrop(common.onDrop, 'locked');\n return dropped(id);\n }\n\n const busName = common.bus ?? deps.defaultBus;\n const slots = deps.slotsFor(busName);\n const bookedAt = ctx.currentTime * 1000;\n const when = common.when ?? bookedAt;\n const baseGain = common.gain ?? 1;\n const spatial = common.position ? spatialOf(common.position) : { gain: 1, pan: common.pan ?? 0 };\n const level = baseGain * spatial.gain;\n\n const voice: LiveVoice = {\n id, slots, slot: null, token: 0, key: common.cancelKey, onDrop: common.onDrop,\n source: null, env: null, retune: null, release: null, releasing: false,\n out: null, unbook: null, catchUp: null,\n baseGain, spatialGain: spatial.gain,\n rate: common.rate ?? 1, detune: common.detune ?? 0,\n position: common.position,\n playing: true, canceled: false, fading: false, rampEnd: 0,\n };\n if (starter.book) {\n const booking = starter.book(voice, { bus: busName, when, level, pan: spatial.pan });\n voice.out = booking.out;\n voice.unbook = booking.cancel;\n } else {\n voice.out = chains.take(deps.busInput(busName), level, spatial.pan);\n }\n live.set(id, voice);\n const begin = (): void => {\n startVoice(voice, starter, bookedAt, when, common.onDone, deps.staleFloor(), teardown);\n };\n if (starter.book) {\n voice.catchUp = () => { if (ctx.currentTime * 1000 >= when) begin(); };\n }\n // A booked voice already sounds at its time, however late this runs.\n deps.scheduler.schedule(when, begin, common.cancelKey, { reportLate: !starter.book });\n return voiceHandle(ctx, voice, ops);\n },\n stopAll(reason) {\n for (const voice of [...live.values()]) teardown(voice, reason);\n },\n stopKey(key) {\n for (const voice of [...live.values()]) {\n if (voice.key !== key) continue;\n voice.catchUp?.();\n teardown(voice);\n }\n },\n respatialize() {\n for (const voice of live.values()) applySpatial(voice);\n },\n };\n}\n","import { createAnalyserTap, type AnalyserTap, type AnalyserTapOptions } from './analyser';\nimport { defaultTimers, type Timers } from './audioTime';\nimport { createBusGraph, type BusHandle } from './buses';\nimport { createAudioGraph, disposeNow } from './graph/createAudioGraph';\nimport type { AudioGraph, AudioGraphOptions } from './graph/types';\nimport type { Slots, Starter } from './liveVoice';\nimport { createResumeWatch } from './resumeWatch';\nimport { createScheduler } from './scheduler';\nimport { createSoundCache, type SoundCache, type SoundHandle } from './soundCache';\nimport type { SpatialOptions, Vec2 } from './spatialize';\nimport { createStreamStarters } from './streamStarter';\nimport { createSynthStarters } from './synthStarters';\nimport { createWorkletVoices } from './worklet/workletVoices';\nimport { createTickTimer } from './tickTimer';\nimport type {\n AudioEngineOptions, NoiseOptions, NoteOptions, PlayOptions, StreamOptions, VoiceHandle,\n} from './types';\nimport { createChainPool } from './voiceChains';\nimport { createDropWarnings, type DropWarnings } from './voiceDrops';\nimport { createVoicePool } from './voicePool';\nimport { createVoices } from './voices';\n\n/** A sound engine: named mix buses, a per-bus voice pool, lookahead\n * scheduling and 2D spatialization over one `AudioContext`. Times are engine\n * ms (`now()`). */\nexport interface AudioEngine {\n /** The engine's `AudioContext` — the one passed as `options.context`, or the\n * one the engine created. Use it for `createBuffer`, for analysis, or for a\n * node graph of your own alongside the engine's.\n *\n * `dispose()` closes a context the engine created, and every call on a\n * closed context throws; a context you passed in is left open, because it is\n * yours to close. The reference stays valid either way — read `state()`\n * rather than assuming. */\n readonly context: AudioContext;\n state(): AudioContextState;\n unlock(): Promise<void>;\n /** Engine time in ms. */\n now(): number;\n load(url: string): Promise<SoundHandle>;\n loadAll(urls: Record<string, string>): Promise<Record<string, SoundHandle>>;\n decode(bytes: ArrayBuffer): Promise<SoundHandle>;\n /** Play a buffer the consumer already holds — a synth, an offline render, a\n * recording. `load` and `decode` both assume encoded bytes. */\n register(buffer: AudioBuffer): SoundHandle;\n play(sound: SoundHandle, opts?: PlayOptions): VoiceHandle;\n /** Play a synthesized note: an oscillator with harmonic partials, or summed\n * sines at any ratios, under an ADSR envelope and an optional filter. It is a voice like any other — same handle, same bus pool\n * and stealing, same `cancelKey`. */\n playNote(note: NoteOptions): VoiceHandle;\n /** Play noise — white, pink or brown, from a looping buffer made once per\n * context — under an envelope and an optional filter with its own cutoff\n * envelope. A voice like `playNote`'s in every other respect. */\n playNoise(noise: NoiseOptions): VoiceHandle;\n /** Stream long audio — music, ambience — from a media element or a URL\n * through a `MediaElementAudioSourceNode`, instead of decoding it whole. It\n * is a voice on a bus like any other, with the exceptions `StreamOptions`\n * lists. An element has one playhead, so streaming one that is already\n * streaming stops the earlier voice. */\n stream(media: HTMLMediaElement | string, opts?: StreamOptions): VoiceHandle;\n /** Book a callback against the audio clock through the engine's lookahead\n * scheduler; it receives its own `when` to hand on to `play` or `playNote`.\n * `stopKey(key)` cancels it. One that came due during a suspension fires\n * late on resume, with its original `when`, so compare against `now()`. */\n schedule(when: number, fire: (when: number) => void, key?: string): void;\n stopKey(key: string): void;\n stopAll(): void;\n bus(name: string): BusHandle;\n /** The configured bus names, in order. The first is `play()`'s default. */\n busNames(): string[];\n /** Voices currently sounding, on one bus or on all of them. A voice booked\n * for a future `when` is not counted until it starts. */\n activeVoices(bus?: string): number;\n analyser(busName?: string, opts?: AnalyserTapOptions): AnalyserTap;\n /** A graph feeding `bus`'s input (default: the first bus). Disposed with the engine. */\n graph(bus?: string): AudioGraph;\n setListener(p: Vec2, opts?: SpatialOptions): void;\n dispose(): void;\n}\n\n/** How `play` makes its node: a fresh buffer source per voice. */\nfunction bufferStarter(\n ctx: BaseAudioContext, sounds: SoundCache, warn: DropWarnings, sound: SoundHandle, loop: boolean,\n): Starter {\n return {\n ready() {\n if (sounds.buffer(sound)) return true;\n warn.unknownSound(sound.id);\n return false;\n },\n start(voice, when) {\n // A fresh source per play: AudioBufferSourceNode is single-use by\n // specification and cannot be restarted once stopped.\n const source = ctx.createBufferSource();\n source.buffer = sounds.buffer(sound)!;\n source.loop = loop;\n voice.retune = () => {\n source.playbackRate.value = voice.rate;\n source.detune.value = voice.detune;\n };\n voice.retune();\n // Still live when this runs, so the voice still holds its chain.\n source.connect(voice.out!.input!);\n source.start(when / 1000);\n return source;\n },\n };\n}\n\n/** One voice pool per bus, not one global pool: the limit is per bus, and a\n * shared pool lets a burst of one-shots on `sfx` steal the music bed. */\nfunction busSlots(busNames: string[], opts: AudioEngineOptions) {\n const slotsByBus = new Map<string, Slots>();\n for (const name of busNames) {\n slotsByBus.set(name, {\n pool: createVoicePool({ limit: opts.voiceLimit ?? 32, steal: opts.steal }),\n byToken: new Map(),\n });\n }\n const slotsFor = (bus: string): Slots => {\n const s = slotsByBus.get(bus);\n if (!s) throw new Error(`@weasel-js/audio: unknown bus \"${bus}\"`);\n return s;\n };\n const active = (bus?: string): number => {\n if (bus !== undefined) return slotsFor(bus).pool.active();\n let total = 0;\n for (const s of slotsByBus.values()) total += s.pool.active();\n return total;\n };\n return { slotsFor, active };\n}\n\n/** How synth voices are made: in the voice worklet once it has loaded, when\n * `synthVoices` asks for it, and on nodes otherwise. */\nfunction engineSynth(ctx: BaseAudioContext, opts: AudioEngineOptions, busInput: (bus: string) => AudioNode) {\n const random = opts.random ?? Math.random;\n const nodes = createSynthStarters(ctx, random);\n const worklet = opts.synthVoices === 'worklet' ? createWorkletVoices(ctx, busInput, random) : null;\n const pick = () => (worklet?.ready() ? worklet : nodes);\n return {\n note: (note: NoteOptions) => pick().note(note),\n noise: (noise: NoiseOptions) => pick().noise(noise),\n loaded: worklet?.loaded,\n dispose: () => worklet?.dispose(),\n };\n}\n\n/** The graphs `engine.graph` has made and not seen torn down. */\nfunction patchGraphs(ctx: BaseAudioContext, busInput: (bus: string) => AudioNode, opts: AudioGraphOptions) {\n const live = new Set<AudioGraph>();\n return {\n create(bus: string): AudioGraph {\n const g = createAudioGraph(ctx, busInput(bus), opts);\n live.add(g);\n return {\n ...g,\n dispose() {\n g.dispose();\n void g.settled().then(() => live.delete(g));\n },\n };\n },\n /** Tear every graph down now: the engine is closing, so nothing fades. */\n dispose() {\n for (const g of live) disposeNow(g);\n live.clear();\n },\n };\n}\n\n/** The timer that wakes the scheduler, and the scheduler. */\nfunction engineClock(ctx: BaseAudioContext, opts: AudioEngineOptions) {\n const now = (): number => ctx.currentTime * 1000;\n const tickTimer = opts.setTimer === undefined && opts.clearTimer === undefined\n ? createTickTimer()\n : null;\n const timers: Timers = {\n setTimer: tickTimer?.setTimer ?? opts.setTimer ?? defaultTimers.setTimer,\n clearTimer: tickTimer?.clearTimer ?? opts.clearTimer ?? defaultTimers.clearTimer,\n };\n const scheduler = createScheduler({\n now,\n // One-shot, not repeating: the scheduler re-arms at the end of every pass,\n // so an interval would leave the previous one running and double the live\n // timer count per tick.\n setTimer: timers.setTimer,\n clearTimer: timers.clearTimer,\n lookahead: opts.lookahead,\n interval: opts.tickInterval, onLate: opts.onLate,\n });\n scheduler.start();\n return { now, tickTimer, timers, scheduler };\n}\n\n/**\n * Create an engine. Browsers start the context suspended: `play()` before it\n * is unlocked drops the voice with a warning. The engine resumes it on the\n * first pointer, key or touch gesture, or call `unlock()` from one. Call\n * `dispose()` when done.\n */\nexport function createAudioEngine(opts: AudioEngineOptions = {}): AudioEngine {\n const ctx = opts.context ?? new AudioContext();\n // A context the engine made is a context the engine closes; a consumer's is\n // theirs to keep.\n const ownsContext = opts.context === undefined;\n const busNames = opts.buses ?? ['sfx', 'music', 'ui'];\n if (busNames.length === 0) {\n throw new Error('@weasel-js/audio: an engine needs at least one bus');\n }\n const sounds = createSoundCache(ctx, opts.fetchFn);\n const { slotsFor, active } = busSlots(busNames, opts);\n const { now, tickTimer, timers, scheduler } = engineClock(ctx, opts);\n const graph = createBusGraph(ctx, busNames, { ...timers, fadeMs: opts.insertFadeMs });\n\n let listener: Vec2 = { x: 0, y: 0 };\n let spatialOpts: SpatialOptions = {};\n let disposed = false;\n const taps = new Set<AnalyserTap>();\n const chains = createChainPool(ctx, (opts.voiceLimit ?? 32) * busNames.length);\n const warn = createDropWarnings();\n const watch = createResumeWatch(ctx, {\n now,\n unlock: () => engine.unlock(),\n onSuspend: () => warn.rearmLocked(),\n });\n const voices = createVoices({\n ctx, scheduler, chains, slotsFor, warn,\n busInput: graph.input,\n defaultBus: busNames[0],\n staleFloor: watch.staleFloor,\n disposed: () => disposed,\n listener: () => ({ at: listener, opts: spatialOpts }),\n });\n const synth = engineSynth(ctx, opts, graph.input);\n const streams = createStreamStarters(ctx, timers);\n const patches = patchGraphs(ctx, graph.input, { ...timers, fadeMs: opts.insertFadeMs });\n\n const engine: AudioEngine = {\n context: ctx,\n state: () => ctx.state,\n async unlock() {\n if (disposed) return;\n if (ctx.state !== 'running') await ctx.resume();\n await synth.loaded;\n },\n now,\n load: sounds.load,\n loadAll: sounds.loadAll,\n decode: sounds.decode,\n register: sounds.register,\n play: (sound, playOpts = {}) =>\n voices.launch(playOpts, bufferStarter(ctx, sounds, warn, sound, playOpts.loop ?? false)),\n playNote: (note) => voices.launch(note, synth.note(note)),\n playNoise: (noise) => voices.launch(noise, synth.noise(noise)),\n stream(media, streamOpts = {}) {\n const el = streams.element(media, streamOpts);\n streams.streaming.get(el)?.stop();\n const handle = voices.launch(streamOpts, streams.starter(el, streamOpts));\n streams.streaming.set(el, handle);\n return handle;\n },\n schedule(when, fire, key) {\n if (disposed) return;\n scheduler.schedule(when, fire, key);\n },\n stopKey(key) {\n scheduler.cancelKey(key);\n voices.stopKey(key);\n },\n stopAll: () => voices.stopAll('stopped'),\n bus: graph.bus,\n busNames: graph.names,\n activeVoices: active,\n analyser(busName, tapOpts) {\n // Every tap is one more live FFT on the graph. They are tracked so\n // `dispose()` detaches them; a consumer calling this per frame still\n // wants to keep one tap rather than mint one.\n const tap = createAnalyserTap(ctx, busName ? graph.node(busName) : graph.master, tapOpts);\n taps.add(tap);\n return {\n ...tap,\n dispose() {\n taps.delete(tap);\n tap.dispose();\n },\n };\n },\n graph(bus) {\n if (disposed) throw new Error('@weasel-js/audio: engine is disposed');\n return patches.create(bus ?? busNames[0]);\n },\n setListener(p, o) {\n listener = p;\n if (o) spatialOpts = o;\n voices.respatialize();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n voices.stopAll('disposed');\n chains.clear();\n scheduler.stop();\n scheduler.clear();\n tickTimer?.dispose();\n for (const tap of [...taps]) tap.dispose();\n taps.clear();\n watch.dispose();\n synth.dispose();\n patches.dispose();\n graph.dispose();\n graph.master.disconnect();\n if (ownsContext) void ctx.close().catch(() => undefined);\n },\n };\n\n return engine;\n}\n","import type { InsertEffect } from './inserts';\nimport { initParam, writeParam } from './param';\n\n// Built-in insert effects. Each exposes its Web Audio nodes for anything its\n// options do not cover; times are ms, as everywhere else in the package.\n\n/** Options for `createFilterEffect`. Unset ones keep the node's defaults. */\nexport interface FilterEffectOptions {\n /** Default 'lowpass'. */\n type?: BiquadFilterType;\n /** Hz. Default 350, the node's own. */\n frequency?: number;\n Q?: number;\n /** dB, for the shelf and peaking types. */\n gain?: number;\n}\n\n/** A filter insert, with its `BiquadFilterNode` exposed. */\nexport interface FilterEffect extends InsertEffect {\n readonly filter: BiquadFilterNode;\n}\n\n/** A `BiquadFilterNode`. Write its params through `filter` to sweep it. */\nexport function createFilterEffect(ctx: BaseAudioContext, opts: FilterEffectOptions = {}): FilterEffect {\n const filter = ctx.createBiquadFilter();\n filter.type = opts.type ?? 'lowpass';\n if (opts.frequency !== undefined) initParam(ctx, filter.frequency, opts.frequency);\n if (opts.Q !== undefined) initParam(ctx, filter.Q, opts.Q);\n if (opts.gain !== undefined) initParam(ctx, filter.gain, opts.gain);\n return { input: filter, output: filter, filter };\n}\n\n/** A wet/dry mix around an effect, for the effects whose output replaces\n * rather than colors the signal. */\nexport interface WetDryMix {\n /** 0 is all dry, 1 all wet. */\n mix(): number;\n setMix(mix: number, rampMs?: number): void;\n}\n\nconst checkMix = (mix: number): number => {\n if (!(mix >= 0 && mix <= 1)) throw new RangeError(`@weasel-js/audio: mix ${mix} is outside 0..1`);\n return mix;\n};\n\n/** `input → dry → output` beside `input → wetIn … wetOut → wet → output`.\n * The dry route is wired first. */\nfunction wetDry(\n ctx: BaseAudioContext,\n wetIn: AudioNode,\n wetOut: AudioNode,\n initial: number,\n): WetDryMix & { input: GainNode; output: GainNode } {\n const input = ctx.createGain();\n const output = ctx.createGain();\n const dry = ctx.createGain();\n const wet = ctx.createGain();\n input.connect(dry);\n dry.connect(output);\n input.connect(wetIn);\n wetOut.connect(wet);\n wet.connect(output);\n let mix = checkMix(initial);\n const write = (rampMs?: number): void => {\n writeParam(ctx, dry.gain, 1 - mix, rampMs);\n writeParam(ctx, wet.gain, mix, rampMs);\n };\n initParam(ctx, dry.gain, 1 - mix);\n initParam(ctx, wet.gain, mix);\n return {\n input, output,\n mix: () => mix,\n setMix(value, rampMs) {\n mix = checkMix(value);\n write(rampMs);\n },\n };\n}\n\n/** Options for `createReverbEffect`. */\nexport interface ReverbEffectOptions {\n /** The room: an impulse response, loaded or synthesized like any buffer. */\n impulse: AudioBuffer;\n /** Default 0.3. */\n mix?: number;\n /** Scale the impulse to a consistent level. Default true, the node's own. */\n normalize?: boolean;\n}\n\n/** A reverb insert, with its `ConvolverNode` exposed. */\nexport interface ReverbEffect extends InsertEffect, WetDryMix {\n readonly convolver: ConvolverNode;\n}\n\n/** Convolution reverb from an impulse buffer, with a wet/dry mix. */\nexport function createReverbEffect(ctx: BaseAudioContext, opts: ReverbEffectOptions): ReverbEffect {\n const convolver = ctx.createConvolver();\n // Before the buffer: the node reads `normalize` when the buffer is set.\n convolver.normalize = opts.normalize ?? true;\n convolver.buffer = opts.impulse;\n const m = wetDry(ctx, convolver, convolver, opts.mix ?? 0.3);\n return { input: m.input, output: m.output, convolver, mix: m.mix, setMix: m.setMix };\n}\n\n/** Options for `createDelayEffect`. */\nexport interface DelayEffectOptions {\n /** ms. Default 250. */\n time?: number;\n /** How much of each repeat feeds the next, -1..1 exclusive. Default 0.35. */\n feedback?: number;\n /** Default 0.35. */\n mix?: number;\n /** The longest `time` the line can be set to later, ms. Default the larger\n * of 1000 and `time`. */\n maxTime?: number;\n}\n\n/** A feedback delay insert, with its `DelayNode` exposed. Ramps are ms. */\nexport interface DelayEffect extends InsertEffect, WetDryMix {\n readonly delay: DelayNode;\n setTime(ms: number, rampMs?: number): void;\n feedback(): number;\n setFeedback(value: number, rampMs?: number): void;\n /** Break the feedback loop. Called for you when the slot is removed. */\n dispose(): void;\n}\n\nconst checkFeedback = (value: number): number => {\n if (!(value > -1 && value < 1)) {\n throw new RangeError(`@weasel-js/audio: feedback ${value} must be inside -1..1, or the repeats grow`);\n }\n return value;\n};\n\n/** A feedback delay with a wet/dry mix. Ramping `setTime` bends the pitch of\n * the repeats while it moves, as a tape delay does. */\nexport function createDelayEffect(ctx: BaseAudioContext, opts: DelayEffectOptions = {}): DelayEffect {\n const time = opts.time ?? 250;\n const maxTime = opts.maxTime ?? Math.max(1000, time);\n let fb = checkFeedback(opts.feedback ?? 0.35);\n const delay = ctx.createDelay(maxTime / 1000);\n const loop = ctx.createGain();\n const m = wetDry(ctx, delay, delay, opts.mix ?? 0.35);\n delay.connect(loop);\n loop.connect(delay);\n initParam(ctx, delay.delayTime, time / 1000);\n initParam(ctx, loop.gain, fb);\n return {\n input: m.input, output: m.output, delay, mix: m.mix, setMix: m.setMix,\n setTime(ms, rampMs) {\n if (!(ms >= 0 && ms <= maxTime)) {\n throw new RangeError(`@weasel-js/audio: delay time ${ms} is outside 0..${maxTime} ms`);\n }\n writeParam(ctx, delay.delayTime, ms / 1000, rampMs);\n },\n feedback: () => fb,\n setFeedback(value, rampMs) {\n fb = checkFeedback(value);\n writeParam(ctx, loop.gain, fb, rampMs);\n },\n dispose() {\n delay.disconnect();\n loop.disconnect();\n },\n };\n}\n\n/** Options for `createCompressorEffect`. Unset ones keep the node's defaults. */\nexport interface CompressorEffectOptions {\n /** dB. */\n threshold?: number;\n /** dB. */\n knee?: number;\n ratio?: number;\n /** ms. */\n attack?: number;\n /** ms. */\n release?: number;\n /** Linear gain after the compressor, to win back the level it takes. Default 1. */\n makeup?: number;\n}\n\n/** A compressor insert, with its `DynamicsCompressorNode` and makeup `GainNode` exposed. */\nexport interface CompressorEffect extends InsertEffect {\n readonly compressor: DynamicsCompressorNode;\n readonly makeup: GainNode;\n}\n\n/** A `DynamicsCompressorNode` into a makeup gain. Unset options keep the\n * node's defaults. */\nexport function createCompressorEffect(\n ctx: BaseAudioContext,\n opts: CompressorEffectOptions = {},\n): CompressorEffect {\n const compressor = ctx.createDynamicsCompressor();\n const makeup = ctx.createGain();\n compressor.connect(makeup);\n const set = (param: AudioParam, value: number | undefined): void => {\n if (value !== undefined) initParam(ctx, param, value);\n };\n set(compressor.threshold, opts.threshold);\n set(compressor.knee, opts.knee);\n set(compressor.ratio, opts.ratio);\n set(compressor.attack, opts.attack === undefined ? undefined : opts.attack / 1000);\n set(compressor.release, opts.release === undefined ? undefined : opts.release / 1000);\n set(makeup.gain, opts.makeup ?? 1);\n return { input: compressor, output: makeup, compressor, makeup };\n}\n","import type { AudioEngine } from './createAudioEngine';\nimport type { SoundHandle } from './soundCache';\nimport type { NoiseOptions, NoteOptions, PlayOptions, VoiceHandle } from './types';\n\n/** A synth note on a step. `length` is its gate in steps, default 1.\n *\n * Any event's `step` may be fractional: it is booked with the step it sits in\n * and sounds that fraction of a step later, so `2.5` is halfway from step 2 to\n * step 3. That is swing, a flam, or a hit that drags. */\nexport interface PatternNote extends Omit<NoteOptions, 'when' | 'duration'> {\n step: number;\n length?: number;\n}\n\n/** Noise on a step: a hi-hat, a snare's rattle. `length` is its gate in steps,\n * default 1. */\nexport interface PatternNoise extends Omit<NoiseOptions, 'when' | 'duration'> {\n step: number;\n length?: number;\n}\n\n/** A buffer played on a step: a drum hit, a sample. */\nexport interface PatternHit extends Omit<PlayOptions, 'when'> {\n step: number;\n sound: SoundHandle;\n}\n\n/** Anything a pattern plays on a step. */\nexport type PatternEvent = PatternNote | PatternNoise | PatternHit;\n\n/** Options for `createPatternPlayer`. */\nexport interface PatternPlayerOptions {\n /** Beats per minute. */\n tempo: number;\n /** Steps per beat. Default 4, so a step is a sixteenth note in 4/4. */\n stepsPerBeat?: number;\n events?: readonly PatternEvent[];\n /** Steps in one pass. Default: through the last event, rounded up to a whole\n * beat. */\n length?: number;\n /** Default true. */\n loop?: boolean;\n /** Cents added to every event's own `detune`: a number, or a function of\n * the event's `step`, for a pattern that drifts in pitch as it plays. A\n * function is asked as each event is booked. Default 0. */\n detune?: PatternDetune;\n /** Called as each step is booked — up to a lookahead ahead of it sounding —\n * with its index in the pattern and its engine time in ms. */\n onStep?: (step: number, when: number) => void;\n}\n\n/** See `PatternPlayerOptions.detune`. */\nexport type PatternDetune = number | ((step: number) => number);\n\n/** A running sequence of steps. See `createPatternPlayer`. */\nexport interface PatternPlayer {\n /** Start from step 0 at engine time `when`, default now. No-op while playing. */\n start(when?: number): void;\n /** Book nothing further, and release every voice the player started. */\n stop(): void;\n playing(): boolean;\n tempo(): number;\n /** Takes effect from the next step not yet booked. Called from `onStep`,\n * that is the step after the one reported, which keeps its own length. */\n setTempo(bpm: number): void;\n /** Takes effect from the next step not yet booked. */\n setDetune(detune: PatternDetune): void;\n /** Takes effect from the next step not yet booked. */\n setEvents(events: readonly PatternEvent[], length?: number): void;\n}\n\nlet nextPlayer = 1;\n\n/** Steps in one pass of `events` when no length is given: through the last\n * event, rounded up to a whole beat. */\nexport function patternLength(events: readonly PatternEvent[], stepsPerBeat = 4): number {\n let last = -1;\n for (const e of events) last = Math.max(last, Math.floor(e.step));\n return Math.max(1, Math.ceil((last + 1) / stepsPerBeat)) * stepsPerBeat;\n}\n\nconst checkTempo = (bpm: number): void => {\n if (!(bpm > 0) || !Number.isFinite(bpm)) {\n throw new RangeError(`@weasel-js/audio: tempo must be a positive number of bpm, got ${bpm}`);\n }\n};\n\n/**\n * A step sequencer over `engine`. Each step is one `engine.schedule` booking;\n * when it fires, it books that step's events at the step's exact time and then\n * books the step after it. So nothing is booked further ahead than the\n * scheduler's lookahead, which is what lets a tempo change or new events land\n * on the very next step.\n *\n * A step that fires more than a step late — a stalled timer, a suspended\n * context — skips to the next step still ahead of the clock, keeping phase,\n * rather than playing the missed ones at once.\n */\nexport function createPatternPlayer(engine: AudioEngine, opts: PatternPlayerOptions): PatternPlayer {\n checkTempo(opts.tempo);\n const stepsPerBeat = opts.stepsPerBeat ?? 4;\n const loop = opts.loop ?? true;\n const key = `\\u0000pattern:${nextPlayer++}`;\n\n let bpm = opts.tempo;\n let drift = opts.detune ?? 0;\n let length = 1;\n let byStep = new Map<number, PatternEvent[]>();\n const setEvents = (events: readonly PatternEvent[], len?: number): void => {\n byStep = new Map();\n for (const e of events) {\n const step = Math.floor(e.step);\n const list = byStep.get(step);\n if (list) list.push(e);\n else byStep.set(step, [e]);\n }\n length = len ?? patternLength(events, stepsPerBeat);\n };\n setEvents(opts.events ?? [], opts.length);\n\n let running = false;\n let inStep = false;\n /** Steps booked since `start`, not wrapped. */\n let count = 0;\n let lastAt: number | null = null;\n let nextAt = 0;\n const voices = new Set<VoiceHandle>();\n\n const stepMs = (): number => 60_000 / bpm / stepsPerBeat;\n\n const book = (): void => { engine.schedule(nextAt, fire, key); };\n\n const fire = (scheduled: number): void => {\n if (!running) return;\n let when = scheduled;\n const behind = engine.now() - when;\n if (behind > stepMs()) {\n const skip = Math.ceil(behind / stepMs());\n count += skip;\n when += skip * stepMs();\n }\n if (!loop && count >= length) {\n running = false;\n return;\n }\n const step = count % length;\n for (const v of voices) if (!v.isPlaying()) voices.delete(v);\n for (const e of byStep.get(step) ?? []) {\n const at = when + (e.step - step) * stepMs();\n const detune = (e.detune ?? 0) + (typeof drift === 'function' ? drift(e.step) : drift);\n if ('sound' in e) {\n const { step: _s, sound, ...play } = e;\n voices.add(engine.play(sound, { ...play, detune, when: at }));\n } else if ('noise' in e) {\n const { step: _s, length: steps = 1, ...noise } = e;\n voices.add(engine.playNoise({ ...noise, detune, when: at, duration: steps * stepMs() }));\n } else {\n const { step: _s, length: steps = 1, ...note } = e;\n voices.add(engine.playNote({ ...note, detune, when: at, duration: steps * stepMs() }));\n }\n }\n // Read before `onStep`: a tempo set there starts with the next step, and\n // this one keeps the length its events were gated by.\n const ms = stepMs();\n inStep = true;\n try {\n opts.onStep?.(step, when);\n } finally {\n inStep = false;\n }\n if (!running) return;\n count += 1;\n lastAt = when;\n nextAt = when + ms;\n book();\n };\n\n return {\n start(when) {\n if (running) return;\n running = true;\n count = 0;\n lastAt = null;\n nextAt = when ?? engine.now();\n book();\n },\n stop() {\n if (!running) return;\n running = false;\n engine.stopKey(key);\n for (const v of voices) v.release();\n voices.clear();\n },\n playing: () => running,\n tempo: () => bpm,\n setTempo(next) {\n checkTempo(next);\n bpm = next;\n // From inside `onStep` the step after this one is about to be booked.\n if (!running || lastAt === null || inStep) return;\n engine.stopKey(key);\n nextAt = Math.max(lastAt + stepMs(), engine.now());\n book();\n },\n setDetune(next) { drift = next; },\n setEvents,\n };\n}\n","import { resolveEnvelope } from './envelope';\nimport { patternLength, type PatternEvent, type PatternHit } from './patternPlayer';\n\n/** Options for `patternVoicePeaks`. The first four mean what they mean to\n * `createPatternPlayer`, and should be the values the player is given. */\nexport interface PatternLoadOptions {\n tempo: number;\n stepsPerBeat?: number;\n length?: number;\n loop?: boolean;\n /** The bus of an event that names none: the engine's first. Default 'sfx'. */\n bus?: string;\n /** The engine's `lookahead` in ms. Default 100. */\n lookahead?: number;\n /** How long a buffer hit sounds, in ms. Default: one step. */\n hitMs?: (hit: PatternHit) => number;\n}\n\n/**\n * The most voices a pattern holds at once on each bus, to set against the\n * engine's `voiceLimit` before the pattern plays: past the limit, each new\n * event steals a voice that is still ringing.\n *\n * A note or a noise holds its voice through its gate and its envelope's\n * release. With `loop`, what rings past the end of a pass is counted against\n * the start of the next.\n */\nexport function patternVoicePeaks(\n events: readonly PatternEvent[],\n opts: PatternLoadOptions,\n): Record<string, number> {\n const stepsPerBeat = opts.stepsPerBeat ?? 4;\n const stepMs = 60_000 / opts.tempo / stepsPerBeat;\n const passMs = (opts.length ?? patternLength(events, stepsPerBeat)) * stepMs;\n // The engine takes a voice's slot when its booking fires, which is up to a\n // lookahead before the voice sounds.\n const lead = opts.lookahead ?? 100;\n\n const spans = events.map((e) => {\n const sounds = 'sound' in e\n ? (opts.hitMs?.(e) ?? stepMs)\n : (e.length ?? 1) * stepMs + resolveEnvelope(e.envelope).release;\n const at = e.step * stepMs;\n return { bus: e.bus ?? opts.bus ?? 'sfx', from: at - lead, until: at + sounds };\n });\n // Enough passes that the last one meets every tail still ringing into it.\n const longest = Math.max(0, ...spans.map((s) => s.until - s.from));\n const passes = opts.loop === false ? 0 : Math.ceil(longest / passMs);\n\n const edges = new Map<string, { at: number; by: number }[]>();\n for (const span of spans) {\n const list = edges.get(span.bus) ?? [];\n edges.set(span.bus, list);\n for (let pass = 0; pass <= passes; pass++) {\n list.push({ at: span.from + pass * passMs, by: 1 }, { at: span.until + pass * passMs, by: -1 });\n }\n }\n\n const peaks: Record<string, number> = {};\n for (const [bus, list] of edges) {\n // A voice ending as another starts has freed its slot.\n list.sort((a, b) => a.at - b.at || a.by - b.by);\n let held = 0;\n let peak = 0;\n for (const edge of list) {\n held += edge.by;\n peak = Math.max(peak, held);\n }\n peaks[bus] = peak;\n }\n return peaks;\n}\n","/** Where a score sits on the three axes it is steered by. Values outside a\n * range are read as its nearest end. */\nexport interface ScoreMood {\n /** -1 dark to 1 bright. */\n valence: number;\n /** 0 consonant and settled to 1 dissonant. */\n tension: number;\n /** 0 still to 1 driving. */\n urgency: number;\n}\n\n/** The scoring devices of factual screen content that a mood can land on. */\nexport type ScoreCueName = 'dread' | 'investigation' | 'wonder' | 'urgency';\n\n/** One named device: the mood that produces it, and what it does to a listener\n * in words, for a consumer to show beside the score. */\nexport interface ScoreCue {\n name: ScoreCueName;\n mood: ScoreMood;\n device: string;\n}\n\n/** The built-in cues: each names a mood and the musical device that carries it. */\nexport const scoreCues: readonly ScoreCue[] = [\n {\n name: 'dread',\n mood: { valence: -1, tension: 1, urgency: 0 },\n device: 'Sustained low tones a minor second and a tritone apart, with no pulse.',\n },\n {\n name: 'investigation',\n mood: { valence: -0.4, tension: 0.5, urgency: 0.5 },\n device: 'A plucked minor ostinato that adds a layer every two bars.',\n },\n {\n name: 'wonder',\n mood: { valence: 1, tension: 0.1, urgency: 0.1 },\n device: 'Lydian chords in open voicings, swelling in with a soft attack.',\n },\n {\n name: 'urgency',\n mood: { valence: 0, tension: 0.7, urgency: 1 },\n device: 'Driving sixteenths on stacked fourths and fifths, a new chord every bar.',\n },\n];\n\n/** Which cue a mood is applying: the nearest, and how much of each. */\nexport interface ScoreCueReading {\n name: ScoreCueName;\n /** Each cue's share, summing to 1. A mood at a cue's own `mood` is all that cue. */\n weights: Record<ScoreCueName, number>;\n}\n\nconst clamp = (value: number, lo: number, hi: number): number => Math.min(hi, Math.max(lo, value));\n\nconst inRange = (mood: ScoreMood): ScoreMood => ({\n valence: clamp(mood.valence, -1, 1),\n tension: clamp(mood.tension, 0, 1),\n urgency: clamp(mood.urgency, 0, 1),\n});\n\n/** Name the cue a mood is applying, and weigh the others against it by\n * inverse squared distance. */\nexport function readScoreCue(mood: ScoreMood): ScoreCueReading {\n const m = inRange(mood);\n // Valence spans twice what the other axes do.\n const distance = scoreCues.map((cue) =>\n ((m.valence - cue.mood.valence) / 2) ** 2 + (m.tension - cue.mood.tension) ** 2 + (m.urgency - cue.mood.urgency) ** 2);\n const exact = distance.indexOf(0);\n const raw = distance.map((d, i) => (exact >= 0 ? Number(i === exact) : 1 / d));\n const total = raw.reduce((sum, w) => sum + w, 0);\n const weights = {} as Record<ScoreCueName, number>;\n scoreCues.forEach((cue, i) => { weights[cue.name] = raw[i] / total; });\n return { name: scoreCues[raw.indexOf(Math.max(...raw))].name, weights };\n}\n\n/** The modes a score draws on, brightest first. */\nexport type ScoreMode = 'lydian' | 'ionian' | 'dorian' | 'aeolian' | 'phrygian';\n\n/** Each mode's seven tones, in semitones above its tonic. */\nexport const scoreModes: Record<ScoreMode, readonly number[]> = {\n lydian: [0, 2, 4, 6, 7, 9, 11],\n ionian: [0, 2, 4, 5, 7, 9, 11],\n dorian: [0, 2, 3, 5, 7, 9, 10],\n aeolian: [0, 2, 3, 5, 7, 8, 10],\n phrygian: [0, 1, 3, 5, 7, 8, 10],\n};\n\n/** The musical parameters a mood resolves to. Each follows one axis only. */\nexport interface ScoreParams {\n /** From valence. */\n mode: ScoreMode;\n /** MIDI note of the tonic the chords are built up from. From valence. */\n register: number;\n /** Octaves a chord is opened across, 1 to 3. From valence. */\n spread: number;\n /** How the tones above a root are chosen: thirds from the mode, stacked\n * fourths and fifths, or a minor second and a tritone. From tension. */\n harmony: 'triadic' | 'quartal' | 'cluster';\n /** The most layers a pulsed score builds up to. From tension. */\n layers: number;\n /** Beats per minute. From urgency. */\n tempo: number;\n /** Notes to a beat; 0 is no pulse at all. From urgency. */\n density: 0 | 1 | 2 | 4;\n /** From urgency. */\n articulation: 'sustained' | 'plucked';\n /** Bars a chord lasts. From urgency. */\n harmonicRhythm: number;\n /** Envelope attack in ms. From urgency. */\n attack: number;\n}\n\n/** Resolve a mood to the parameters `scoreBar` writes music from. */\nexport function scoreParams(mood: ScoreMood): ScoreParams {\n const { valence, tension, urgency } = inRange(mood);\n const sustained = urgency < 0.35;\n return {\n mode: valence > 0.6 ? 'lydian'\n : valence > 0.2 ? 'ionian'\n : valence > -0.2 ? 'dorian'\n : valence > -0.6 ? 'aeolian'\n : 'phrygian',\n register: 36 + 12 * Math.round(valence + 1),\n spread: 1 + Math.round(2 * Math.max(0, valence)),\n harmony: tension >= 0.8 ? 'cluster' : tension >= 0.55 ? 'quartal' : 'triadic',\n layers: 1 + Math.round(4 * tension),\n tempo: Math.round(60 + 80 * urgency),\n density: urgency < 0.15 ? 0 : urgency < 0.4 ? 1 : urgency < 0.75 ? 2 : 4,\n articulation: sustained ? 'sustained' : 'plucked',\n harmonicRhythm: urgency < 0.33 ? 4 : urgency < 0.66 ? 2 : 1,\n attack: sustained ? Math.round(800 * (1 - urgency)) : 5,\n };\n}\n","import type { Envelope } from './envelope';\nimport type { PatternNote } from './patternPlayer';\nimport { scoreModes, type ScoreParams } from './scoreMood';\n\n/** Steps in a bar of score: sixteenths in 4/4. */\nexport const SCORE_BAR_STEPS = 16;\n\n/** How `scoreBar` places and routes its notes. */\nexport interface ScoreBarOptions {\n /** Semitones above C for the tonic. Default 0. */\n tonic?: number;\n /** Default: the engine's first bus. */\n bus?: string;\n /** The level the notes sounding on one step add up to at most. Default 0.5. */\n gain?: number;\n /** Chooses the order an ostinato takes a chord's tones in. Default: rising. */\n seed?: number;\n}\n\n/** Scale degrees a progression takes its roots from, a chord at a time. */\nconst PROGRESSION = [0, 5, 3, 4];\n\n/**\n * The chord a score plays, as MIDI notes, root first. `chord` counts chords\n * since the score began; a cluster stays on the tonic, and the other harmonies\n * walk a four-chord progression inside the mode.\n */\nexport function scoreChord(params: ScoreParams, chord: number, tonic = 0): number[] {\n const scale = scoreModes[params.mode];\n const tone = (degree: number): number =>\n params.register + tonic + scale[degree % 7] + 12 * Math.floor(degree / 7);\n if (params.harmony === 'cluster') {\n const root = tone(0);\n return [root, root + 1, root + 6];\n }\n const degree = PROGRESSION[chord % PROGRESSION.length];\n const root = tone(degree);\n if (params.harmony === 'quartal') return [root, root + 7, root + 12, root + 17];\n if (params.spread < 2) return [root, tone(degree + 2), tone(degree + 4)];\n const open = [root, tone(degree + 4), tone(degree + 2) + 12];\n // The fourth above the root, two octaves up: on a Lydian tonic, the raised\n // fourth the mode is heard by.\n if (params.spread >= 3) open.push(tone(degree + 3) + 24);\n return open;\n}\n\n/** The order an ostinato takes `count` chord tones in. */\nfunction figure(count: number, seed: number | undefined): number[] {\n const order = Array.from({ length: count }, (_, i) => i);\n if (seed === undefined) return order;\n let state = (seed >>> 0) || 1;\n for (let i = count - 1; i > 0; i--) {\n state = (Math.imul(state, 1664525) + 1013904223) >>> 0;\n const j = state % (i + 1);\n [order[i], order[j]] = [order[j], order[i]];\n }\n return order;\n}\n\nconst PLUCK: Envelope = { attack: 5, decay: 140, sustain: 0.2, release: 80 };\n\n/**\n * One bar of score as pattern events, for a player `SCORE_BAR_STEPS` long.\n * `bar` counts bars since the score began: it picks the chord, by the harmonic\n * rhythm, and how many layers a pulsed score has built up to, one more every\n * two bars. The same arguments always write the same bar.\n *\n * With no pulse, the bar is its chord held throughout. With one, the layers\n * are an ostinato over the chord's tones, a bass on the root, the ostinato\n * doubled an octave up on the off pulses, and the chord held as a pad.\n */\nexport function scoreBar(params: ScoreParams, bar: number, opts: ScoreBarOptions = {}): PatternNote[] {\n const gain = opts.gain ?? 0.5;\n const chord = scoreChord(params, Math.floor(bar / params.harmonicRhythm), opts.tonic);\n const swell: Envelope = { attack: params.attack, release: params.attack };\n const held = params.articulation === 'sustained';\n const note = (step: number, length: number, midi: number, level: number, envelope: Envelope): PatternNote => ({\n step, length, pitch: { midi }, gain: gain * level, envelope,\n wave: held ? 'sine' : 'triangle',\n ...(opts.bus === undefined ? {} : { bus: opts.bus }),\n });\n const pad = (level: number, envelope: Envelope): PatternNote[] =>\n chord.map((midi) => note(0, SCORE_BAR_STEPS, midi, level / chord.length, envelope));\n\n if (params.density === 0) return pad(1, swell);\n\n const layers = Math.min(params.layers, 1 + Math.floor(bar / 2));\n const every = 4 / params.density;\n const order = figure(chord.length, opts.seed);\n const envelope = held ? swell : PLUCK;\n const events: PatternNote[] = [];\n for (let pulse = 0; pulse * every < SCORE_BAR_STEPS; pulse++) {\n const midi = chord[order[pulse % order.length]];\n events.push(note(pulse * every, every, midi, 0.4, envelope));\n if (layers >= 3 && pulse % 2 === 1) events.push(note(pulse * every, every, midi + 12, 0.15, envelope));\n }\n if (layers >= 2) {\n for (const step of [0, 8]) events.push(note(step, 8, chord[0] - 12, 0.3, { attack: 5, release: 120 }));\n }\n if (layers >= 4) events.push(...pad(0.15, { attack: 120, release: 200 }));\n return events;\n}\n","import type { AudioEngine } from './createAudioEngine';\nimport { createPatternPlayer } from './patternPlayer';\nimport { SCORE_BAR_STEPS, scoreBar, type ScoreBarOptions } from './scoreBar';\nimport {\n readScoreCue, scoreParams, type ScoreCueReading, type ScoreMood, type ScoreParams,\n} from './scoreMood';\n\n/** What a score is playing in one bar, and why: the mood it was given, the cue\n * that mood applies, and the parameters the bar was written from. */\nexport interface ScoreState {\n /** Bars since `start`. */\n bar: number;\n /** Bars since the cue last changed, which is what a pulsed score's layers\n * build up from. */\n cueBar: number;\n mood: ScoreMood;\n cue: ScoreCueReading;\n params: ScoreParams;\n}\n\n/** Options for `createScore`. */\nexport interface ScoreOptions extends ScoreBarOptions {\n mood: ScoreMood;\n /** Called as each bar's first step is booked — up to a lookahead before it\n * sounds — with what the bar plays and its engine time in ms. */\n onBar?: (state: ScoreState, when: number) => void;\n}\n\n/** A running generative score. See `createScore`. */\nexport interface Score {\n /** Start from bar 0 at engine time `when`, default now. No-op while playing. */\n start(when?: number): void;\n /** Book nothing further, and release every voice the score started. */\n stop(): void;\n playing(): boolean;\n /** The mood last set, which the next bar will take. */\n mood(): ScoreMood;\n /** Takes effect at the next bar line. */\n setMood(mood: ScoreMood): void;\n /** The bar most recently booked. */\n state(): ScoreState;\n}\n\n/**\n * Music written continuously from a mood rather than chosen from clips. Each\n * bar is `scoreBar` of the mood's `scoreParams`, booked through a pattern\n * player, and a new mood lands on the next bar line with its tempo.\n *\n * These devices work on a listener without asking them, which is what they are\n * for. `state()` and `onBar` name the cue in force and every parameter behind\n * it, so a consumer can show what is being applied as well as play it.\n */\nexport function createScore(engine: AudioEngine, opts: ScoreOptions): Score {\n const { mood: initial, onBar, ...barOpts } = opts;\n let target = initial;\n\n const stateAt = (bar: number, before: ScoreState | null): ScoreState => {\n const cue = readScoreCue(target);\n return {\n bar,\n cueBar: before && before.cue.name === cue.name ? before.cueBar + 1 : 0,\n mood: target,\n cue,\n params: scoreParams(target),\n };\n };\n const eventsOf = (state: ScoreState) => scoreBar(state.params, state.cueBar, barOpts);\n\n let current = stateAt(0, null);\n let next = current;\n\n const player = createPatternPlayer(engine, {\n tempo: current.params.tempo,\n length: SCORE_BAR_STEPS,\n events: eventsOf(current),\n onStep(step, when) {\n if (step === 0) {\n current = next;\n onBar?.(current, when);\n }\n if (step !== SCORE_BAR_STEPS - 1) return;\n next = stateAt(current.bar + 1, current);\n player.setTempo(next.params.tempo);\n player.setEvents(eventsOf(next), SCORE_BAR_STEPS);\n },\n });\n\n return {\n start(when) {\n if (player.playing()) return;\n current = next = stateAt(0, null);\n player.setTempo(current.params.tempo);\n player.setEvents(eventsOf(current), SCORE_BAR_STEPS);\n player.start(when);\n },\n stop: () => player.stop(),\n playing: () => player.playing(),\n mood: () => target,\n setMood(mood) { target = mood; },\n state: () => current,\n };\n}\n","/** A biquad's coefficients, already divided by `a0`. */\nexport interface BiquadCoefficients {\n b0: number;\n b1: number;\n b2: number;\n a1: number;\n a2: number;\n}\n\n/**\n * The coefficients a `BiquadFilterNode` of `type` runs at `frequency`, by the\n * formulas in the Web Audio specification. `Q` is in dB for a lowpass or a\n * highpass and a plain quality factor for the rest, as it is on the node, and\n * `gain` is dB, read by the shelves and the peaking filter only. Pass `into`\n * to have them written to an object you keep, which allocates nothing.\n */\nexport function biquadCoefficients(\n type: BiquadFilterType,\n frequency: number,\n sampleRate: number,\n Q = 1,\n gain = 0,\n into: BiquadCoefficients = { b0: 0, b1: 0, b2: 0, a1: 0, a2: 0 },\n): BiquadCoefficients {\n // Strictly inside (0, Nyquist), where every formula below is finite.\n const f = Math.min(Math.max(frequency, 1e-3), sampleRate * 0.4999);\n const w0 = (2 * Math.PI * f) / sampleRate;\n const cos = Math.cos(w0);\n const sin = Math.sin(w0);\n const A = 10 ** (gain / 40);\n const alphaQ = sin / (2 * Math.max(Q, 1e-4));\n const alphaDb = sin / (2 * 10 ** (Q / 20));\n const shelf = sin * Math.SQRT2 * Math.sqrt(A);\n let b0 = (1 - cos) / 2;\n let b1 = 1 - cos;\n let b2 = b0;\n let a0 = 1 + alphaDb;\n let a1 = -2 * cos;\n let a2 = 1 - alphaDb;\n if (type === 'highpass') {\n b0 = b2 = (1 + cos) / 2;\n b1 = -(1 + cos);\n } else if (type === 'peaking') {\n b0 = 1 + alphaQ * A;\n b1 = -2 * cos;\n b2 = 1 - alphaQ * A;\n a0 = 1 + alphaQ / A;\n a2 = 1 - alphaQ / A;\n } else if (type === 'lowshelf') {\n b0 = A * (A + 1 - (A - 1) * cos + shelf);\n b1 = 2 * A * (A - 1 - (A + 1) * cos);\n b2 = A * (A + 1 - (A - 1) * cos - shelf);\n a0 = A + 1 + (A - 1) * cos + shelf;\n a1 = -2 * (A - 1 + (A + 1) * cos);\n a2 = A + 1 + (A - 1) * cos - shelf;\n } else if (type === 'highshelf') {\n b0 = A * (A + 1 + (A - 1) * cos + shelf);\n b1 = -2 * A * (A - 1 + (A + 1) * cos);\n b2 = A * (A + 1 + (A - 1) * cos - shelf);\n a0 = A + 1 - (A - 1) * cos + shelf;\n a1 = 2 * (A - 1 - (A + 1) * cos);\n a2 = A + 1 - (A - 1) * cos - shelf;\n } else if (type !== 'lowpass') {\n // Bandpass, notch, and allpass share a denominator and differ above it.\n a0 = 1 + alphaQ;\n a2 = 1 - alphaQ;\n b0 = type === 'bandpass' ? alphaQ : type === 'notch' ? 1 : 1 - alphaQ;\n b1 = type === 'bandpass' ? 0 : -2 * cos;\n b2 = type === 'bandpass' ? -alphaQ : type === 'notch' ? 1 : 1 + alphaQ;\n }\n into.b0 = b0 / a0;\n into.b1 = b1 / a0;\n into.b2 = b2 / a0;\n into.a1 = a1 / a0;\n into.a2 = a2 / a0;\n return into;\n}\n\n/** How much a filter with coefficients `c` passes at `hz`, in dB. */\nexport function biquadResponseDb(c: BiquadCoefficients, hz: number, sampleRate: number): number {\n const w = (2 * Math.PI * hz) / sampleRate;\n const c1 = Math.cos(w);\n const s1 = Math.sin(w);\n const c2 = Math.cos(2 * w);\n const s2 = Math.sin(2 * w);\n const num = (c.b0 + c.b1 * c1 + c.b2 * c2) ** 2 + (c.b1 * s1 + c.b2 * s2) ** 2;\n const den = (1 + c.a1 * c1 + c.a2 * c2) ** 2 + (c.a1 * s1 + c.a2 * s2) ** 2;\n return 10 * Math.log10(num / den);\n}\n","import type { Inharmonic, Waveform } from './types';\n\n/** One cycle of a wave: its value at `phase` (0..1) when a sample advances it\n * by `dt` cycles. `dt` is how a shape knows what would land past Nyquist. */\nexport type WaveShape = (phase: number, dt: number) => number;\n\nconst TAU = 2 * Math.PI;\n/** Points a harmonic wave is measured at to find its peak. */\nconst PEAK_POINTS = 4096;\n\n/** Cycles a sample above which a triangle is summed from its odd harmonics.\n * Below it the plain shape's first folded harmonic is its 65th, 72 dB down. */\nconst TRIANGLE_SUMMED_FROM = 1 / 128;\n\n/** The correction that rounds a unit step at `t = 0` over the sample either\n * side of it, which is what keeps a square or a sawtooth from aliasing. */\nfunction polyBlep(t: number, dt: number): number {\n const d = Math.min(dt, 0.5);\n if (t < d) {\n const x = t / d;\n return x + x - x * x - 1;\n }\n if (t > 1 - d) {\n const x = (t - 1) / d;\n return x * x + x + x + 1;\n }\n return 0;\n}\n\nexport const sineShape: WaveShape = (phase) => Math.sin(TAU * phase);\n\n/** The level an `OscillatorNode` plays a square or a sawtooth at. Its table is the Fourier sum\n * scaled so the overshoot beside each step peaks at 1, which leaves the flat at 1 / 1.17898. */\nconst STEPPED_LEVEL = 1 / 1.17898;\n\n/** Each starts at zero, rising, as the `OscillatorNode` types do. */\nconst BUILT_IN: Record<'sine' | 'square' | 'sawtooth' | 'triangle', WaveShape> = {\n sine: sineShape,\n square: (phase, dt) => STEPPED_LEVEL * ((phase < 0.5 ? 1 : -1) + polyBlep(phase, dt) - polyBlep((phase + 0.5) % 1, dt)),\n sawtooth: (phase, dt) => {\n const t = (phase + 0.5) % 1;\n return STEPPED_LEVEL * (2 * t - 1 - polyBlep(t, dt));\n },\n triangle: (phase, dt) => {\n if (dt < TRIANGLE_SUMMED_FROM) return phase < 0.25 ? 4 * phase : phase < 0.75 ? 2 - 4 * phase : 4 * phase - 4;\n let v = 0;\n let sign = 1;\n for (let k = 1; k * dt < 0.5; k += 2) {\n v += (sign * Math.sin(TAU * k * phase)) / (k * k);\n sign = -sign;\n }\n return (v * 8) / (Math.PI * Math.PI);\n },\n};\n\n/** Sine harmonics at `levels`, the fundamental first, scaled so the whole wave\n * peaks at 1 as a `PeriodicWave` is. A harmonic at or past Nyquist is left out. */\nfunction harmonicShape(levels: readonly number[]): WaveShape {\n const sum = (phase: number, count: number): number => {\n let v = 0;\n for (let k = 1; k <= count; k += 1) v += levels[k - 1] * Math.sin(TAU * k * phase);\n return v;\n };\n let peak = 0;\n for (let i = 0; i < PEAK_POINTS; i += 1) peak = Math.max(peak, Math.abs(sum(i / PEAK_POINTS, levels.length)));\n const scale = peak > 0 ? 1 / peak : 0;\n return (phase, dt) => scale * sum(phase, Math.min(levels.length, Math.ceil(0.5 / dt) - 1));\n}\n\n/** The shape of a wave an oscillator plays at one pitch. */\nexport function waveShape(wave: Exclude<Waveform, Inharmonic>): WaveShape {\n return typeof wave === 'string' ? BUILT_IN[wave] : harmonicShape(wave);\n}\n","/**\n * Synth voices as arithmetic: the samples `playNote` and `playNoise` make,\n * computed with no `AudioContext`. A kernel renders a block at a time, so it\n * can run wherever samples are wanted: an offline render into a buffer, or the\n * inside of an `AudioWorkletProcessor`.\n */\nimport { biquadCoefficients } from './biquad';\nimport { envelopeLevel, resolveEnvelope, type Envelope } from './envelope';\nimport { sineShape, waveShape } from './oscillator';\nimport { NOISE_SECONDS, isInharmonic, noiseSamples, resolveNote } from './synthVoice';\nimport type { NoiseColor, NoiseOptions, NoteOptions, VoiceFilter } from './types';\n\n/** What of a `playNote` call shapes its samples. Routing, position, and timing\n * belong to whatever plays them. */\nexport type KernelNote = Pick<\n NoteOptions, 'pitch' | 'wave' | 'envelope' | 'glide' | 'filter' | 'duration' | 'gain' | 'detune'\n>;\n\n/** What of a `playNoise` call shapes its samples. */\nexport type KernelNoise = Pick<\n NoiseOptions, 'noise' | 'envelope' | 'filter' | 'duration' | 'gain' | 'rate' | 'detune'\n>;\n\n/** One voice, rendered a block at a time. */\nexport interface VoiceKernel {\n /** Add the voice's next samples into `out[from..to)`, the whole of `out` by\n * default. False once the voice has ended; it adds nothing from then on. */\n render(out: Float32Array, from?: number, to?: number): boolean;\n /** Note-off at the next sample: the envelopes release from wherever they\n * have got to. Does nothing once the gate has closed. */\n release(): void;\n /** What `setRate` and `setDetune` do to a sounding voice. `detune` is cents. */\n retune(rate: number, detune: number): void;\n}\n\n/** One raw sample, `t` ms into the voice, with its pitch multiplied by `tune`. */\ntype Source = (t: number, tune: number) => number;\n\ninterface Shaping {\n envelope?: Envelope;\n filter?: VoiceFilter;\n duration?: number;\n gain?: number;\n rate?: number;\n detune?: number;\n}\n\nconst tuning = (rate: number, detune: number): number => rate * 2 ** (detune / 1200);\n\n/** A voice filter as a function of one sample, its cutoff following its envelope. */\nfunction filterStage(\n spec: VoiceFilter,\n sampleRate: number,\n): (x: number, t: number, gate: number | undefined) => number {\n const type = spec.type ?? 'lowpass';\n const amount = spec.amount ?? 0;\n const env = spec.envelope && amount !== 0 ? resolveEnvelope(spec.envelope) : null;\n const coefficients = biquadCoefficients(type, spec.frequency, sampleRate, spec.Q, spec.gain);\n let cutoff = spec.frequency;\n let z1 = 0;\n let z2 = 0;\n return (x, t, gate) => {\n if (env) {\n const hz = spec.frequency + amount * envelopeLevel(env, t, gate);\n if (hz !== cutoff) {\n cutoff = hz;\n biquadCoefficients(type, hz, sampleRate, spec.Q, spec.gain, coefficients);\n }\n }\n const y = coefficients.b0 * x + z1;\n z1 = coefficients.b1 * x - coefficients.a1 * y + z2;\n z2 = coefficients.b2 * x - coefficients.a2 * y;\n return y;\n };\n}\n\n/** What every kernel shares once it has a source: source → optional filter →\n * envelope, the gate, and the end at the close of the release. */\nfunction createKernel(patch: Shaping, sampleRate: number, source: Source): VoiceKernel {\n const env = resolveEnvelope(patch.envelope);\n const gain = patch.gain ?? 1;\n const filter = patch.filter ? filterStage(patch.filter, sampleRate) : null;\n const msPerSample = 1000 / sampleRate;\n let gate = patch.duration;\n let tune = tuning(patch.rate ?? 1, patch.detune ?? 0);\n let n = 0;\n let ended = false;\n return {\n render(out, from = 0, to = out.length) {\n if (ended) return false;\n for (let i = from; i < to; i += 1) {\n const t = n * msPerSample;\n if (gate !== undefined && t >= gate + env.release) {\n ended = true;\n return false;\n }\n const raw = source(t, tune);\n out[i] += gain * envelopeLevel(env, t, gate) * (filter ? filter(raw, t, gate) : raw);\n n += 1;\n }\n return true;\n },\n release() {\n const t = n * msPerSample;\n if (gate === undefined || t < gate) gate = t;\n },\n retune(rate, detune) {\n tune = tuning(rate, detune);\n },\n };\n}\n\n/** A `playNote` voice. Throws on a bad pitch or partial, as `playNote` does. */\nexport function createNoteKernel(note: KernelNote, sampleRate: number): VoiceKernel {\n const { from, glideTo, partials } = resolveNote(note);\n const glideMs = note.glide?.ms ?? note.duration ?? 100;\n const linear = note.glide?.curve === 'linear';\n const wave = note.wave ?? 'sine';\n const shape = isInharmonic(wave) ? sineShape : waveShape(wave);\n const tones: { ratio: number; gain: number; decay?: number; phase: number }[] = partials\n ? partials.map((p) => ({ ratio: p.ratio, gain: p.gain, decay: p.decay, phase: 0 }))\n : [{ ratio: 1, gain: 1, phase: 0 }];\n return createKernel(note, sampleRate, (t, tune) => {\n let hz = from;\n if (glideTo !== undefined) {\n const k = glideMs > 0 ? Math.min(1, t / glideMs) : 1;\n hz = linear ? from + (glideTo - from) * k : from * (glideTo / from) ** k;\n }\n const cycles = (hz * tune) / sampleRate;\n let sum = 0;\n for (const tone of tones) {\n const dt = cycles * tone.ratio;\n // An oscillator at or past Nyquist is silent, not folded back.\n if (dt >= 0.5) continue;\n const level = tone.decay === undefined ? tone.gain : tone.gain * Math.exp(-t / tone.decay);\n sum += level * shape(tone.phase, dt);\n tone.phase = (tone.phase + dt) % 1;\n }\n return sum;\n });\n}\n\nconst loops = new Map<string, Float32Array>();\n\n/** The loop `noiseBuffer` gives a context at this rate, made once per color and rate. */\nfunction noiseLoop(color: NoiseColor, sampleRate: number): Float32Array {\n const key = `${color}:${sampleRate}`;\n let loop = loops.get(key);\n if (!loop) {\n loop = noiseSamples(color, Math.round(sampleRate * NOISE_SECONDS));\n loops.set(key, loop);\n }\n return loop;\n}\n\n/** A `playNoise` voice. `random` picks where in the loop it starts. */\nexport function createNoiseKernel(\n noise: KernelNoise,\n sampleRate: number,\n random: () => number = Math.random,\n): VoiceKernel {\n const loop = noiseLoop(noise.noise, sampleRate);\n // On a whole sample: between two, white noise is their average, and quieter for it.\n let at = Math.floor(random() * loop.length);\n return createKernel(noise, sampleRate, (_t, tune) => {\n const i = Math.floor(at);\n const a = loop[i];\n const sample = a + (loop[(i + 1) % loop.length] - a) * (at - i);\n at = (at + tune) % loop.length;\n return sample;\n });\n}\n\nfunction renderWhole(kernel: VoiceKernel, patch: Shaping, sampleRate: number, what: string): Float32Array {\n if (patch.duration === undefined) {\n throw new RangeError(`@weasel-js/audio: ${what} needs a duration to know where the voice ends`);\n }\n const total = patch.duration + resolveEnvelope(patch.envelope).release;\n const out = new Float32Array(Math.round((total * sampleRate) / 1000));\n kernel.render(out);\n return out;\n}\n\n/** A whole note as samples, through its release: `duration + release` ms at\n * `sampleRate`. Put them in an `AudioBuffer` and `engine.register` it to play\n * the note as a sound. */\nexport function renderNote(note: KernelNote, sampleRate: number): Float32Array {\n return renderWhole(createNoteKernel(note, sampleRate), note, sampleRate, 'renderNote');\n}\n\n/** A whole noise voice as samples, through its release. */\nexport function renderNoise(\n noise: KernelNoise,\n sampleRate: number,\n random: () => number = Math.random,\n): Float32Array {\n return renderWhole(createNoiseKernel(noise, sampleRate, random), noise, sampleRate, 'renderNoise');\n}\n","/** Options for `impulseResponse`: the tail's decay, channel count and noise seed. */\nexport interface ImpulseResponseOptions {\n /** How far the tail falls by its end, dB. Default 60 (an RT60). */\n decayDb?: number;\n /** Default 2. */\n channels?: number;\n /** Seed for the noise, so the same call makes the same buffer. Default 1. */\n seed?: number;\n}\n\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** Noise under an exponential decay that falls `decayDb` over `seconds`. */\nexport function impulseResponse(\n ctx: BaseAudioContext,\n seconds: number,\n opts: ImpulseResponseOptions = {},\n): AudioBuffer {\n if (!(seconds > 0)) throw new RangeError(`@weasel-js/audio: impulse length ${seconds} s must be above 0`);\n const decayDb = opts.decayDb ?? 60;\n const channels = opts.channels ?? 2;\n const seed = opts.seed ?? 1;\n const length = Math.max(1, Math.round(seconds * ctx.sampleRate));\n const buffer = ctx.createBuffer(channels, length, ctx.sampleRate);\n const rate = (decayDb / 20) * Math.LN10;\n for (let c = 0; c < channels; c += 1) {\n const data = buffer.getChannelData(c);\n const rand = mulberry32(seed + c * 0x9e3779b1);\n for (let i = 0; i < length; i += 1) {\n data[i] = (rand() * 2 - 1) * Math.exp((-rate * i) / length);\n }\n }\n return buffer;\n}\n","/**\n * Where a buffer source is in its buffer at a context time, given when it\n * started and stopped and the playback rate it followed, ramps included.\n */\nexport interface Playhead {\n /** A node starts at `when`, or at `now` if that is later. Returns its offset. */\n start(when: number, now: number): number;\n /** The node stops at `when`, or at `now` if that is later. */\n stop(when: number, now: number): void;\n /** The rate moves linearly from where it is now to `value` over `rampMs`. */\n rate(value: number, rampMs: number, now: number): void;\n /** Back to the top, as a non-looping buffer that played out. */\n rewind(now: number): void;\n}\n\nexport function createPlayhead(duration: number, loop: boolean, initialRate: number): Playhead {\n /** The position at `from`; it moves only between `from` and `until`. */\n let pos = 0;\n let from = 0;\n let until = 0;\n /** The rate: `r0` at `t0`, ramping linearly to `r1` at `t1`, then held. */\n let t0 = 0;\n let r0 = initialRate;\n let t1 = 0;\n let r1 = initialRate;\n\n const rateAt = (t: number): number => {\n if (t >= t1) return r1;\n return t <= t0 ? r0 : r0 + ((r1 - r0) * (t - t0)) / (t1 - t0);\n };\n /** The distance covered from `t0` to `t`. */\n const distance = (t: number): number =>\n t <= t1 ? ((t - t0) * (r0 + rateAt(t))) / 2 : ((t1 - t0) * (r0 + r1)) / 2 + (t - t1) * r1;\n const wrap = (p: number): number =>\n loop ? ((p % duration) + duration) % duration : Math.min(Math.max(p, 0), duration);\n const at = (t: number): number => {\n const x = Math.min(Math.max(t, from), until);\n return x <= from ? wrap(pos) : wrap(pos + distance(x) - distance(from));\n };\n const hold = (t: number, rate: number): void => {\n t0 = t;\n t1 = t;\n r0 = rate;\n r1 = rate;\n };\n\n return {\n start(when, now) {\n pos = at(until);\n from = Math.max(when, now);\n until = Infinity;\n hold(now, r1);\n return pos;\n },\n stop(when, now) {\n until = Math.max(when, now, from);\n },\n rate(value, rampMs, now) {\n pos = at(now);\n from = Math.min(Math.max(now, from), until);\n r0 = rateAt(now);\n t0 = now;\n t1 = now + Math.max(0, rampMs) / 1000;\n r1 = value;\n },\n rewind(now) {\n pos = 0;\n from = now;\n until = now;\n },\n };\n}\n","import { periodicWave } from '../periodicWave';\nimport { initParam, writeParam } from '../param';\nimport { noiseBuffer } from '../synthVoice';\nimport type { Inharmonic, NoiseColor, Waveform } from '../types';\nimport { createPlayhead } from './playhead';\nimport type { GraphNodeDef } from './types';\n\n/** The waves an oscillator node takes: any `Waveform` except an inharmonic one. */\nexport type OscillatorWave = Exclude<Waveform, Inharmonic>;\n\ntype Scheduled = AudioBufferSourceNode | OscillatorNode;\n\n/** A source's stable output gain and the one live, single-use node behind it.\n * A node told to stop later stays `sounding` until it ends. */\nfunction sourceShell<N extends Scheduled>(ctx: BaseAudioContext, make: () => N) {\n const output = ctx.createGain();\n let live: N | null = null;\n const ending = new Set<N>();\n return {\n output,\n live: (): N | null => live,\n sounding: (): N[] => (live ? [live, ...ending] : [...ending]),\n /** `onEnd` runs if the node ends while it is still the live one: it played out. */\n begin(when: number, setup: (node: N) => void, offset?: number, onEnd?: () => void): N {\n const node = make();\n setup(node);\n node.connect(output);\n node.onended = () => {\n if (live !== node) return;\n live = null;\n node.disconnect();\n onEnd?.();\n };\n if (offset === undefined) node.start(when);\n else (node as AudioBufferSourceNode).start(when, offset);\n live = node;\n return node;\n },\n end(when: number): void {\n if (!live) return;\n const node = live;\n live = null;\n ending.add(node);\n node.onended = () => {\n ending.delete(node);\n node.disconnect();\n };\n node.stop(when);\n },\n dispose(): void {\n if (live) {\n live.stop();\n live.disconnect();\n live = null;\n }\n output.disconnect();\n },\n level: (value: number, rampMs: number): void => writeParam(ctx, output.gain, value, rampMs),\n };\n}\n\n/** Options for `createFileSourceNode`: the buffer to play and whether it loops. */\nexport interface FileSourceNodeOptions {\n buffer: AudioBuffer;\n /** Default true. */\n loop?: boolean;\n}\n\n/** Plays a buffer, picking up where `stop` left it. Params: `rate`, `level`. */\nexport function createFileSourceNode(ctx: BaseAudioContext, opts: FileSourceNodeOptions): GraphNodeDef {\n const { buffer } = opts;\n const loop = opts.loop ?? true;\n let rate = 1;\n const head = createPlayhead(buffer.duration, loop, rate);\n const shell = sourceShell(ctx, () => ctx.createBufferSource());\n\n return {\n inputs: {},\n output: shell.output,\n params: {\n rate(value, rampMs) {\n for (const src of shell.sounding()) writeParam(ctx, src.playbackRate, value, rampMs);\n head.rate(value, rampMs, ctx.currentTime);\n rate = value;\n },\n level: shell.level,\n },\n start(when, ended) {\n if (shell.live()) return;\n const offset = head.start(when, ctx.currentTime);\n shell.begin(when, (s) => {\n s.buffer = buffer;\n s.loop = loop;\n initParam(ctx, s.playbackRate, rate);\n }, offset, () => {\n head.rewind(ctx.currentTime);\n ended?.();\n });\n },\n stop(when) {\n if (!shell.live()) return;\n head.stop(when, ctx.currentTime);\n shell.end(when);\n },\n dispose: shell.dispose,\n };\n}\n\n/** Options for `createOscillatorNode`: the wave shape and starting frequency. */\nexport interface OscillatorNodeOptions {\n /** Default 'sine'. An array is the amplitude of each whole-number partial. */\n wave?: OscillatorWave;\n /** Hz. Default 440. */\n frequency?: number;\n}\n\n/** A tone. Params: `frequency`, `detune`, `level`. */\nexport function createOscillatorNode(ctx: BaseAudioContext, opts: OscillatorNodeOptions): GraphNodeDef {\n const wave = opts.wave ?? 'sine';\n let frequency = opts.frequency ?? 440;\n let detune = 0;\n const shell = sourceShell(ctx, () => ctx.createOscillator());\n\n return {\n inputs: {},\n output: shell.output,\n params: {\n frequency(value, rampMs) {\n for (const osc of shell.sounding()) writeParam(ctx, osc.frequency, value, rampMs);\n frequency = value;\n },\n detune(value, rampMs) {\n for (const osc of shell.sounding()) writeParam(ctx, osc.detune, value, rampMs);\n detune = value;\n },\n level: shell.level,\n },\n start(when, ended) {\n if (shell.live()) return;\n shell.begin(when, (osc) => {\n if (typeof wave === 'string') osc.type = wave;\n else osc.setPeriodicWave(periodicWave(ctx, wave));\n initParam(ctx, osc.frequency, frequency);\n initParam(ctx, osc.detune, detune);\n }, undefined, ended);\n },\n stop: shell.end,\n dispose: shell.dispose,\n };\n}\n\n/** Options for `createNoiseNode`: the noise color whose shared buffer it loops. */\nexport interface NoiseNodeOptions {\n color: NoiseColor;\n}\n\n/** A loop of the shared noise buffer for its color. Param: `level`. */\nexport function createNoiseNode(ctx: BaseAudioContext, opts: NoiseNodeOptions): GraphNodeDef {\n const shell = sourceShell(ctx, () => ctx.createBufferSource());\n return {\n inputs: {},\n output: shell.output,\n params: { level: shell.level },\n start(when, ended) {\n if (shell.live()) return;\n shell.begin(when, (src) => {\n src.buffer = noiseBuffer(ctx, opts.color);\n src.loop = true;\n }, undefined, ended);\n },\n stop: shell.end,\n dispose: shell.dispose,\n };\n}\n","import {\n type CompressorEffectOptions, createCompressorEffect, createDelayEffect, createFilterEffect,\n createReverbEffect, type DelayEffectOptions, type FilterEffectOptions, type ReverbEffectOptions,\n} from '../effects';\nimport { impulseResponse } from '../impulse';\nimport type { InsertEffect } from '../inserts';\nimport { initParam, writeParam } from '../param';\nimport type { GraphNodeDef } from './types';\n\n/** A graph node that multiplies its input by a gain: port `in`; param `gain`. */\nexport function createGainNode(ctx: BaseAudioContext, opts: { gain?: number } = {}): GraphNodeDef {\n const node = ctx.createGain();\n initParam(ctx, node.gain, opts.gain ?? 1);\n return {\n inputs: { in: node },\n output: node,\n params: { gain: (value, rampMs) => writeParam(ctx, node.gain, value, rampMs) },\n };\n}\n\n/** A graph node that pans its input in stereo: port `in`; param `pan`. */\nexport function createPanNode(ctx: BaseAudioContext, opts: { pan?: number } = {}): GraphNodeDef {\n const node = ctx.createStereoPanner();\n initParam(ctx, node.pan, opts.pan ?? 0);\n return {\n inputs: { in: node },\n output: node,\n params: { pan: (value, rampMs) => writeParam(ctx, node.pan, value, rampMs) },\n };\n}\n\n/** One port and one level param per name in `inputs`, summed into `output`. */\nexport function createMixNode(ctx: BaseAudioContext, opts: { inputs: readonly string[] }): GraphNodeDef {\n if (opts.inputs.length === 0) throw new RangeError('@weasel-js/audio: a mix needs at least one input');\n const output = ctx.createGain();\n const inputs: Record<string, AudioNode> = {};\n const params: Record<string, (value: number, rampMs: number) => void> = {};\n for (const name of opts.inputs) {\n if (Object.prototype.hasOwnProperty.call(inputs, name)) {\n throw new RangeError(`@weasel-js/audio: a mix has two inputs named \"${name}\"`);\n }\n const level = ctx.createGain();\n level.connect(output);\n inputs[name] = level;\n params[name] = (value, rampMs) => writeParam(ctx, level.gain, value, rampMs);\n }\n return { inputs, output, params };\n}\n\n/** Wrap an insert effect as a node with one port, `in`. */\nexport function insertNode(effect: InsertEffect, params: GraphNodeDef['params']): GraphNodeDef {\n return {\n inputs: { in: effect.input },\n output: effect.output,\n params,\n ...(effect.dispose ? { dispose: () => effect.dispose!() } : {}),\n };\n}\n\n/** A graph node over a filter insert: port `in`; params `frequency`, `Q`, `gain`. */\nexport function filterNode(ctx: BaseAudioContext, opts: FilterEffectOptions = {}): GraphNodeDef {\n const { filter } = createFilterEffect(ctx, opts);\n const write = (p: AudioParam) => (value: number, rampMs: number) => writeParam(ctx, p, value, rampMs);\n return insertNode({ input: filter, output: filter }, {\n frequency: write(filter.frequency),\n Q: write(filter.Q),\n gain: write(filter.gain),\n });\n}\n\n/** A graph node over a delay insert: port `in`; params `time` (ms), `feedback`, `mix`. */\nexport function delayNode(ctx: BaseAudioContext, opts: DelayEffectOptions = {}): GraphNodeDef {\n const fx = createDelayEffect(ctx, { ...opts, maxTime: opts.maxTime ?? Math.max(2000, opts.time ?? 0) });\n return insertNode(fx, {\n time: (value, rampMs) => fx.setTime(value, rampMs),\n feedback: (value, rampMs) => fx.setFeedback(value, rampMs),\n mix: (value, rampMs) => fx.setMix(value, rampMs),\n });\n}\n\n/** Options for `reverbNode`: the reverb effect's options, plus an `impulse` or the `seconds` of a synthesized one. */\nexport type ReverbNodeOptions = Omit<ReverbEffectOptions, 'impulse'> & {\n impulse?: AudioBuffer;\n /** Length of the synthesized impulse when none is given. Default 2. */\n seconds?: number;\n};\n\n/** A graph node over a reverb insert: port `in`; param `mix`. */\nexport function reverbNode(ctx: BaseAudioContext, opts: ReverbNodeOptions = {}): GraphNodeDef {\n const { seconds, impulse, ...rest } = opts;\n const fx = createReverbEffect(ctx, { ...rest, impulse: impulse ?? impulseResponse(ctx, seconds ?? 2) });\n return insertNode(fx, { mix: (value, rampMs) => fx.setMix(value, rampMs) });\n}\n\n/** A graph node over a compressor insert: port `in`; params `threshold`, `knee`, `ratio`, `attack` (ms), `release` (ms), `makeup`. */\nexport function compressorNode(ctx: BaseAudioContext, opts: CompressorEffectOptions = {}): GraphNodeDef {\n const fx = createCompressorEffect(ctx, opts);\n const { compressor, makeup } = fx;\n const write = (p: AudioParam, scale = 1) => (value: number, rampMs: number) =>\n writeParam(ctx, p, value * scale, rampMs);\n return insertNode(fx, {\n threshold: write(compressor.threshold),\n knee: write(compressor.knee),\n ratio: write(compressor.ratio),\n attack: write(compressor.attack, 0.001),\n release: write(compressor.release, 0.001),\n makeup: write(makeup.gain),\n });\n}\n"]}
|