{
  "version": 3,
  "sources": ["../src/algorithm/binarySearch.ts", "../src/algorithm/traverse.ts", "../src/array/arrayRange.ts", "../src/array/arraySerial.ts", "../src/array/arraySet.ts", "../src/array/constants.ts", "../src/array/utils.ts", "../src/BinaryHeap.ts", "../src/CDS/CDS.ts", "../src/Clock/Clock.ts", "../src/Clock/ClockFrame.ts", "../src/Clock/ClockRealtime.ts", "../src/color/colorFromAtariST.ts", "../src/color/colorFromHex.ts", "../src/math/lerp.ts", "../src/color/colorHSV2RGB.ts", "../src/math/clamp.ts", "../src/math/saturate.ts", "../src/color/colorToHex.ts", "../src/math/vec/vecDot.ts", "../src/color/colorTurbo.ts", "../src/color/eotfRec709.ts", "../src/color/oetfRec709.ts", "../src/dag/dagEdgesParents.ts", "../src/dag/dagEdgesAncestors.ts", "../src/dag/dagEdgesChildren.ts", "../src/dag/dagEdgesDescendants.ts", "../src/dag/dagEdgesParent.ts", "../src/dag/dagEdgesResolve.ts", "../src/debounce.ts", "../src/dsp/BiquadFilter/BiquadFilter.ts", "../src/dsp/BiquadFilter/BPF.ts", "../src/dsp/BiquadFilter/HPF.ts", "../src/dsp/BiquadFilter/LPF.ts", "../src/dsp/Phasor.ts", "../src/dsp/SawtoothOscillator.ts", "../src/dsp/SineOscillator.ts", "../src/dsp/SquareOscillator.ts", "../src/dsp/TriangleOscillator.ts", "../src/ExpSmooth/ExpSmooth.ts", "../src/edt/edt.ts", "../src/float32ArrayToWav.ts", "../src/fmix32.ts", "../src/Pool/Pool.ts", "../src/GPUTimer/GPUTimer.ts", "../src/HistoryMeanCalculator/HistoryMeanCalculator.ts", "../src/HistoryMeanCalculator/HistoryPercentileCalculator.ts", "../src/HistoryMeanCalculator/HistoryMedianCalculator.ts", "../src/int16ArrayToWav.ts", "../src/MapOfSet/MapOfSet.ts", "../src/math/vec/vecScale.ts", "../src/math/mat3/mat3FromMat4Transpose.ts", "../src/math/mat3/mat3Inverse.ts", "../src/math/mat3/mat3CreateNormalMatrix.ts", "../src/math/mat3/mat3Determinant.ts", "../src/math/mat3/mat3FromMat4.ts", "../src/math/mat3/mat3FromQuaternion.ts", "../src/math/mat3/mat3Multiply.ts", "../src/math/mat3/mat3Transpose.ts", "../src/math/mat3/Matrix3.ts", "../src/math/mat4/mat4FromQuaternion.ts", "../src/math/mat4/mat4Compose.ts", "../src/math/quat/quatFromMatrix3.ts", "../src/math/quat/quatFromMatrix4.ts", "../src/math/vec/vecLength.ts", "../src/math/mat4/mat4Determinant.ts", "../src/math/mat4/mat4Decompose.ts", "../src/math/mat4/mat4FromMat3.ts", "../src/math/mat4/mat4Inverse.ts", "../src/math/vec/vecAdd.ts", "../src/math/vec/vecNormalize.ts", "../src/math/vec/vecSub.ts", "../src/math/vec3/vec3Cross.ts", "../src/math/mat4/mat4LookAt.ts", "../src/math/mat4/mat4LookAtInverse.ts", "../src/math/mat4/mat4Multiply.ts", "../src/math/mat4/mat4Perspective.ts", "../src/math/mat4/mat4RotationX.ts", "../src/math/mat4/mat4RotationY.ts", "../src/math/mat4/mat4RotationZ.ts", "../src/math/mat4/mat4Scale.ts", "../src/math/mat4/mat4ScaleScalar.ts", "../src/math/mat4/mat4Translate.ts", "../src/math/mat4/mat4Transpose.ts", "../src/math/mat4/Matrix4.ts", "../src/math/vec/vecLengthSq.ts", "../src/math/vec/vecAbs.ts", "../src/math/vec/vecDivide.ts", "../src/math/vec/vecLerp.ts", "../src/math/vec/vecManhattanLength.ts", "../src/math/vec/vecMultiply.ts", "../src/math/vec/vecNeg.ts", "../src/math/vec/Vector.ts", "../src/math/quat/quatExp.ts", "../src/math/quat/quatFromAxisAngle.ts", "../src/math/quat/quatInverse.ts", "../src/math/quat/quatLog.ts", "../src/math/quat/quatLogVec3.ts", "../src/math/vec3/vec3OrthoNormalize.ts", "../src/math/quat/quatLookRotation.ts", "../src/math/quat/quatMultiply.ts", "../src/math/quat/quatNlerp.ts", "../src/math/quat/quatNormalize.ts", "../src/math/quat/quatRotationX.ts", "../src/math/quat/quatRotationY.ts", "../src/math/quat/quatRotationZ.ts", "../src/math/quat/quatSlerp.ts", "../src/math/quat/Quaternion.ts", "../src/math/vec3/vec3ApplyMatrix3.ts", "../src/math/vec4/vec4ApplyMatrix4.ts", "../src/math/vec3/vec3ApplyMatrix4.ts", "../src/math/vec3/vec3ApplyQuaternion.ts", "../src/math/vec3/vec3QuatExp.ts", "../src/math/vec3/Vector3.ts", "../src/math/box3/box3ContainsPoint.ts", "../src/math/box3/Box3.ts", "../src/math/quat/quatFromEuler.ts", "../src/math/mod.ts", "../src/math/sanitizeAngle.ts", "../src/math/euler/eulerFromMat3.ts", "../src/math/euler/eulerFromMat4.ts", "../src/math/euler/eulerFromQuaternion.ts", "../src/math/euler/Euler.ts", "../src/math/ray3/ray3DistanceToSphere.ts", "../src/math/line3/line3Delta.ts", "../src/math/ray3/ray3FromLine3.ts", "../src/math/ray3/Ray3.ts", "../src/math/line3/line3ApplyMatrix4.ts", "../src/math/line3/line3At.ts", "../src/math/line3/line3ClosestPointToPoint.ts", "../src/math/line3/line3DistanceToPoint.ts", "../src/math/line3/Line3.ts", "../src/math/linearstep.ts", "../src/math/mat2/mat2Determinant.ts", "../src/math/mat2/mat2Inverse.ts", "../src/math/mat2/mat2Multiply.ts", "../src/math/mat2/mat2Transpose.ts", "../src/math/mat2/Matrix2.ts", "../src/math/plane3/plane3ApplyMatrix4.ts", "../src/math/plane3/plane3DistanceToPoint.ts", "../src/math/plane3/plane3Normalize.ts", "../src/math/plane3/Plane3.ts", "../src/math/plane3/planes3ContainPoint.ts", "../src/math/plane3/planes3FromBox3.ts", "../src/math/plane3/planes3FromProjectionMatrix.ts", "../src/math/plane3/planes3IntersectBox3.ts", "../src/math/plane3/planes3IntersectSphere3.ts", "../src/math/plane3/Planes3.ts", "../src/math/range.ts", "../src/math/smootherstep.ts", "../src/math/smootheststep.ts", "../src/math/smoothstep.ts", "../src/math/sphere3/sphere3ContainsPoint.ts", "../src/math/sphere3/Sphere3.ts", "../src/math/step.ts", "../src/math/vec4/vec4ApplyMatrix3.ts", "../src/math/vec4/Vector4.ts", "../src/midi/midiParse.ts", "../src/notifyObservers.ts", "../src/poker/pokerRanksByStrength.ts", "../src/poker/pokerSuitsByIndex.ts", "../src/poker/createPokerDeck.ts", "../src/poker/pokerHandStrengthMap.ts", "../src/poker/pokerRankStrengthMap.ts", "../src/poker/pokerSuitIndexMap.ts", "../src/poker/sortPokerCardsByRank.ts", "../src/poker/evaluatePokerHand.ts", "../src/poker/pokerCardToUnicode.ts", "../src/poker/pokerHandsByStrength.ts", "../src/retry/asyncRetry.ts", "../src/retry/retry.ts", "../src/SmoothDamp/SmoothDamp.ts", "../src/Swap/Swap.ts", "../src/stniccc/parseSTNICCC.ts", "../src/stniccc/stnicccToSVG.ts", "../src/TapTempo/TapTempo.ts", "../src/throttle.ts", "../src/tinyseq/createTinyseqPolyReader.ts", "../src/tinyseq/createTinyseqReader.ts", "../src/tinyseq/tinyseqFromMidiParseResult.ts", "../src/Xorshift/Xorshift.ts", "../src/yugop/getYugopText.ts"],
  "sourcesContent": ["// yoinked from https://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers\n\n/**\n * Look for an index from a sorted list using binary search.\n *\n * If you don't provide a compare function, it will look for **the first same value** it can find.\n * If it cannot find an exactly matching value, it can return N where the length of given array is N.\n *\n * @param array A sorted array\n * @param compare Make this function return `false` if you want to point right side of given element, `true` if you want to point left side of given element.\n * @returns An index found\n */\nexport function binarySearch<T>(array: ArrayLike<T>, element: T): number;\nexport function binarySearch<T>(array: ArrayLike<T>, compare: (element: T) => boolean): number;\nexport function binarySearch<T>(\n  array: ArrayLike<T>,\n  elementOrCompare: T | ((element: T) => boolean),\n): number {\n  if (typeof elementOrCompare !== 'function') {\n    return binarySearch(array, (element) => element < elementOrCompare);\n  }\n  const compare = elementOrCompare as (element: T) => boolean;\n\n  let start = 0;\n  let end = array.length;\n\n  while (start < end) {\n    const center = (start + end) >> 1;\n    const centerElement = array[center];\n\n    const compareResult = compare(centerElement);\n\n    if (compareResult) {\n      start = center + 1;\n    } else {\n      end = center;\n    }\n  }\n\n  return start;\n}\n", "/**\n * Generic traverse function.\n *\n * It performs Depth-First Search.\n *\n * The `traverser` function will be executed for each descendants.\n * You need to return their \"children\" in an array.\n * If you want to stop the traversal, return `false` instead.\n *\n * @example\n * ```js\n * // replicate Three.js traverse for no reason\n * const meshes = [];\n * traverse( object3DRoot, ( object ) => {\n *   if ( object.isMesh ) {\n *     meshes.push( object );\n *   }\n *   return object3DRoot.children;\n * } );\n * ```\n *\n * @param root The \"root\" node\n * @param traverser The traverse function. If the node has \"children\" return them in an array.\n */\nexport function traverse<TNode>(root: TNode, traverser: (node: TNode) => TNode[] | false): void {\n  const nodesNeedProcess: TNode[] = [root];\n  const nodesSeen = new Set<TNode>(nodesNeedProcess);\n\n  while (nodesNeedProcess.length > 0) {\n    const currentNode = nodesNeedProcess.shift()!;\n\n    const children = traverser(currentNode);\n\n    if (!children) {\n      break;\n    }\n\n    const nodesFound = children.filter((node) => !nodesSeen.has(node));\n    nodesNeedProcess.unshift(...nodesFound);\n    nodesFound.map((node) => nodesSeen.add(node));\n  }\n}\n", "export function arrayRange(start: number, end: number, step?: number): number[] {\n  let current = start;\n  const ret: number[] = [];\n\n  if (start < end) {\n    step = step ?? 1;\n    while (current < end) {\n      ret.push(current);\n      current += step;\n    }\n  } else {\n    step = step ?? -1;\n    while (current > end) {\n      ret.push(current);\n      current += step;\n    }\n  }\n\n  return ret;\n}\n", "export const arraySerial = (count: number): number[] => [...Array(count)].map((_, i) => i);\n", "export function arraySetDelete<T>(array: Array<T>, value: T): boolean {\n  const index = array.indexOf(value);\n  if (index === -1) {\n    return false;\n  }\n\n  array.splice(index, 1);\n  return true;\n}\n\nexport function arraySetHas<T>(array: Array<T>, value: T): boolean {\n  return array.indexOf(value) !== -1;\n}\n\nexport function arraySetAdd<T>(array: Array<T>, value: T): boolean {\n  const index = array.indexOf(value);\n  if (index !== -1) {\n    return false;\n  }\n\n  array.push(value);\n  return true;\n}\n\nexport function arraySetUnion<T>(a: Array<T>, b: Array<T>): Array<T> {\n  const out = [...a];\n  b.forEach((v) => {\n    if (!arraySetHas(out, v)) {\n      out.push(v);\n    }\n  });\n  return out;\n}\n\nexport function arraySetDiff<T>(from: Array<T>, diff: Array<T>): Array<T> {\n  const out = [...from];\n  diff.forEach((v) => {\n    arraySetDelete(out, v);\n  });\n  return out;\n}\n", "/**\n * `[ -1, -1, 1, -1, -1, 1, 1, 1 ]`\n */\nexport const TRIANGLE_STRIP_QUAD = [-1, -1, 1, -1, -1, 1, 1, 1];\n\n/**\n * `[ -1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0 ]`\n */\nexport const TRIANGLE_STRIP_QUAD_3D = [-1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0];\n\n/**\n * `[ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1 ]`\n */\nexport const TRIANGLE_STRIP_QUAD_NORMAL = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1];\n\n/**\n * `[ 0, 0, 1, 0, 0, 1, 1, 1 ]`\n */\nexport const TRIANGLE_STRIP_QUAD_UV = [0, 0, 1, 0, 0, 1, 1, 1];\n", "/**\n * Shuffle given `array` using given `dice` RNG. **Destructive**.\n */\nexport function shuffleArray<T>(array: T[], dice?: () => number): T[] {\n  const f = dice ? dice : () => Math.random();\n  for (let i = 0; i < array.length - 1; i++) {\n    const ir = i + Math.floor(f() * (array.length - i));\n    const temp = array[ir];\n    array[ir] = array[i];\n    array[i] = temp;\n  }\n  return array;\n}\n\n/**\n * I like wireframe\n *\n * `triIndexToLineIndex( [ 0, 1, 2, 5, 6, 7 ] )` -> `[ 0, 1, 1, 2, 2, 0, 5, 6, 6, 7, 7, 5 ]`\n */\nexport function triIndexToLineIndex<T>(array: T[]): T[] {\n  const ret: T[] = [];\n  for (let i = 0; i < array.length / 3; i++) {\n    const head = i * 3;\n    ret.push(\n      array[head],\n      array[head + 1],\n      array[head + 1],\n      array[head + 2],\n      array[head + 2],\n      array[head],\n    );\n  }\n  return ret;\n}\n\n/**\n * `matrix2d( 3, 2 )` -> `[ 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2 ]`\n */\nexport function matrix2d(w: number, h: number): number[] {\n  const arr: number[] = [];\n  for (let iy = 0; iy < h; iy++) {\n    for (let ix = 0; ix < w; ix++) {\n      arr.push(ix, iy);\n    }\n  }\n  return arr;\n}\n\n/**\n * See also: {@link matrix2d}\n */\nexport function matrix3d(w: number, h: number, d: number): number[] {\n  const arr: number[] = [];\n  for (let iz = 0; iz < d; iz++) {\n    for (let iy = 0; iy < h; iy++) {\n      for (let ix = 0; ix < w; ix++) {\n        arr.push(ix, iy, iz);\n      }\n    }\n  }\n  return arr;\n}\n", "export class BinaryHeap<T> {\n  public readonly array: T[];\n  public readonly elementIndexMap: Map<T, number>;\n  public comparator: (a: T, b: T) => number;\n\n  public static defaultComparator(a: unknown, b: unknown): number {\n    const aStr = `${a}`;\n    const bStr = `${b}`;\n\n    if (aStr > bStr) {\n      return 1;\n    } else if (aStr < bStr) {\n      return -1;\n    } else {\n      return 0;\n    }\n  }\n\n  public get length(): number {\n    return this.array.length;\n  }\n\n  public get isEmpty(): boolean {\n    return this.array.length === 0;\n  }\n\n  public get root(): T {\n    return this.array[0];\n  }\n\n  public constructor(init?: T[], comparator?: (a: T, b: T) => number) {\n    this.array = [];\n    this.elementIndexMap = new Map();\n    this.comparator = comparator ?? BinaryHeap.defaultComparator;\n\n    if (init != null) {\n      for (const el of init) {\n        this.push(el);\n      }\n    }\n  }\n\n  public push(...elements: T[]): void {\n    elements.map((el) => {\n      const i = this.length;\n      this.array.push(el);\n      this.elementIndexMap.set(el, i);\n      this.__up(i, el);\n    });\n  }\n\n  public pop(): T | null {\n    if (this.isEmpty) {\n      return null;\n    }\n\n    const el = this.array[0];\n    this.elementIndexMap.delete(el);\n\n    if (this.length === 1) {\n      this.array.splice(0);\n    } else {\n      const rep = this.array.pop();\n      this.__down(0, rep!);\n    }\n\n    return el;\n  }\n\n  public delete(i: number): boolean {\n    this.elementIndexMap.delete(this.array[i]);\n\n    const rep = this.array.pop();\n    if (rep != null) {\n      i = this.__up(i, rep);\n      i = this.__down(i, rep);\n    }\n\n    return true;\n  }\n\n  public replace(i: number, rep: T): number | null {\n    if (i != null) {\n      this.elementIndexMap.delete(this.array[i]);\n\n      i = this.__up(i, rep);\n      i = this.__down(i, rep);\n    }\n\n    return i ?? null;\n  }\n\n  private __up(i: number, el: T): number {\n    let ic = i;\n\n    while (ic !== 0) {\n      const ip = (ic - 1) >> 1;\n\n      const p = this.array[ip];\n      if (this.comparator(el, p) < 0) {\n        this.array[ic] = p;\n        this.elementIndexMap.set(p, ic);\n        ic = ip;\n      } else {\n        break;\n      }\n    }\n\n    this.array[ic] = el;\n    this.elementIndexMap.set(el, ic);\n    return ic;\n  }\n\n  private __down(i: number, el: T): number {\n    let ip = i;\n\n    while ((ip << 1) + 1 < this.length) {\n      const ic1 = (ip << 1) + 1;\n      const ic2 = (ip << 1) + 2;\n\n      if (ic2 < this.length) {\n        const c1 = this.array[ic1];\n        const c2 = this.array[ic2];\n\n        const pickLeft = this.comparator(c1, c2) < 0;\n        const c = pickLeft ? c1 : c2;\n        const ic = pickLeft ? ic1 : ic2;\n\n        if (this.comparator(c, el) < 0) {\n          this.array[ip] = c;\n          this.elementIndexMap.set(c, ip);\n          ip = ic;\n        } else {\n          break;\n        }\n      } else if (this.comparator(this.array[ic1], el) < 0) {\n        this.array[ip] = this.array[ic1];\n        this.elementIndexMap.set(this.array[ip], ip);\n        ip = ic1;\n      } else {\n        break;\n      }\n    }\n\n    this.array[ip] = el;\n    this.elementIndexMap.set(el, ip);\n    return ip;\n  }\n}\n", "/**\n * The implementation of Critical Damped Spring (CDS).\n *\n * This is the very naive implementation. No `deltaTime` clamping or sub-stepping.\n * You may want to do such improvement yourself if you need this to be more robust.\n *\n * Shoutouts to Keijiro Takahashi\n */\nexport class CDS {\n  /**\n   * The factor (stiffness) of the spring.\n   * I recomment a value around 100 or 1000.\n   */\n  public factor = 100.0;\n\n  /**\n   * The ratio (damping) of the spring.\n   * 1.0 == critical damping.\n   */\n  public ratio = 1.0;\n\n  /**\n   * The current velocity of the spring.\n   */\n  public velocity = 0.0;\n\n  /**\n   * The current value of the spring.\n   */\n  public value = 0.0;\n\n  /**\n   * The target value of the spring.\n   * You usually want to set this value to control the spring.\n   */\n  public target = 0.0;\n\n  public update(deltaTime: number): number {\n    this.velocity +=\n      (this.factor * (this.target - this.value) -\n        2.0 * this.velocity * Math.sqrt(this.factor) * this.ratio) *\n      deltaTime;\n\n    this.value += this.velocity * deltaTime;\n    return this.value;\n  }\n}\n", "/**\n * Class that deals with time.\n * In this base class, you need to set time manually from `Automaton.update()`.\n * Best for sync with external clock stuff.\n */\nexport class Clock {\n  /**\n   * Its current time.\n   */\n  protected __time = 0.0;\n\n  /**\n   * Its deltaTime of last update.\n   */\n  protected __deltaTime = 0.0;\n\n  /**\n   * Whether its currently playing or not.\n   */\n  protected __isPlaying = false;\n\n  /**\n   * Its current time.\n   */\n  public get time(): number {\n    return this.__time;\n  }\n\n  /**\n   * Its deltaTime of last update.\n   */\n  public get deltaTime(): number {\n    return this.__deltaTime;\n  }\n\n  /**\n   * Whether its currently playing or not.\n   */\n  public get isPlaying(): boolean {\n    return this.__isPlaying;\n  }\n\n  /**\n   * Update the clock.\n   * @param time Time. You need to set manually when you are using manual Clock\n   */\n  public update(time?: number): void {\n    const prevTime = this.__time;\n    this.__time = time || 0.0;\n    this.__deltaTime = this.__time - prevTime;\n  }\n\n  /**\n   * Start the clock.\n   */\n  public play(): void {\n    this.__isPlaying = true;\n  }\n\n  /**\n   * Stop the clock.\n   */\n  public pause(): void {\n    this.__isPlaying = false;\n  }\n\n  /**\n   * Set the time manually.\n   * @param time Time\n   */\n  public setTime(time: number): void {\n    this.__time = time;\n  }\n}\n", "import { Clock } from './Clock';\n\n/**\n * Class that deals with time.\n * This is \"frame\" type clock, the frame increases every {@link ClockFrame#update} call.\n * @param fps Frames per second\n */\nexport class ClockFrame extends Clock {\n  /**\n   * Its current frame.\n   */\n  private __frame = 0;\n\n  /**\n   * Its fps.\n   */\n  private __fps: number;\n\n  public constructor(fps = 60) {\n    super();\n    this.__fps = fps;\n  }\n\n  /**\n   * Its current frame.\n   */\n  public get frame(): number {\n    return this.__frame;\n  }\n\n  /**\n   * Its fps.\n   */\n  public get fps(): number {\n    return this.__fps;\n  }\n\n  /**\n   * Update the clock. It will increase the frame by 1.\n   */\n  public update(): void {\n    if (this.__isPlaying) {\n      this.__time = this.__frame / this.__fps;\n      this.__deltaTime = 1.0 / this.__fps;\n      this.__frame++;\n    } else {\n      this.__deltaTime = 0.0;\n    }\n  }\n\n  /**\n   * Set the time manually.\n   * The set time will be converted into internal frame count, so the time will not be exactly same as set one.\n   * @param time Time\n   */\n  public setTime(time: number): void {\n    this.__frame = Math.floor(this.__fps * time);\n    this.__time = this.__frame / this.__fps;\n  }\n}\n", "import { Clock } from './Clock';\n\n/**\n * Class that deals with time.\n * This is \"realtime\" type clock, the time goes on as real world.\n */\nexport class ClockRealtime extends Clock {\n  /**\n   * \"You set the time manually to `__rtTime` when it's `__rtDate`.\"\n   */\n  private __rtTime = 0.0;\n\n  /**\n   * \"You set the time manually to `__rtTime` when it's `__rtDate`.\"\n   */\n  private __rtDate: number = performance.now();\n\n  /**\n   * The clock is realtime. yeah.\n   */\n  public get isRealtime(): boolean {\n    return true;\n  }\n\n  /**\n   * Update the clock. Time is calculated based on time in real world.\n   */\n  public update(): void {\n    const now = performance.now();\n\n    if (this.__isPlaying) {\n      const prevTime = this.__time;\n      const deltaDate = now - this.__rtDate;\n      this.__time = this.__rtTime + deltaDate / 1000.0;\n      this.__deltaTime = this.time - prevTime;\n    } else {\n      this.__rtTime = this.time;\n      this.__rtDate = now;\n      this.__deltaTime = 0.0;\n    }\n  }\n\n  /**\n   * Set the time manually.\n   * @param time Time\n   */\n  public setTime(time: number): void {\n    this.__time = time;\n    this.__rtTime = this.time;\n    this.__rtDate = performance.now();\n  }\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * Converts the input color in Atari-ST color palette format to a {@link RawRGB}.\n *\n * @param stColor A color in Atari-ST format\n */\nexport function colorFromAtariST(stColor: number): RawRGB {\n  return [((stColor >> 8) & 7) / 7.0, ((stColor >> 4) & 7) / 7.0, (stColor & 7) / 7.0];\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * Converts the input hex color to {@link RawRGB}.\n *\n * Supported formats:\n * - `#RRGGBB`\n * - `#RGB`\n * - `0xRRGGBB`\n *\n * @param hex - Hex representation of the color\n * @returns Color in {@link RawRGB}\n */\nexport function colorFromHex(hex: number | string): RawRGB {\n  if (typeof hex === 'number') {\n    hex = hex.toString(16).padStart(6, '0');\n  }\n\n  if (hex.startsWith('#')) {\n    hex = hex.slice(1);\n  }\n\n  if (hex.length === 6) {\n    const r = parseInt(hex.slice(0, 2), 16) / 255.0;\n    const g = parseInt(hex.slice(2, 4), 16) / 255.0;\n    const b = parseInt(hex.slice(4, 6), 16) / 255.0;\n    return [r, g, b];\n  } else if (hex.length === 3) {\n    const r = parseInt(hex[0] + hex[0], 16) / 255.0;\n    const g = parseInt(hex[1] + hex[1], 16) / 255.0;\n    const b = parseInt(hex[2] + hex[2], 16) / 255.0;\n    return [r, g, b];\n  } else {\n    throw new Error(`Invalid hex color: ${hex}`);\n  }\n}\n", "/**\n * `lerp`, or `mix`.\n * Return a linear interpolation of two numbers.\n * The {@link t} won't be clamped.\n *\n * @param a - A number\n * @param b - Another number\n * @param t - A number interpolating two numbers. Usually in range [0, 1] but not clamped\n */\nexport function lerp(a: number, b: number, t: number): number {\n  return a + (b - a) * t;\n}\n", "import { lerp } from '../math/lerp';\nimport type { RawRGB } from './RawRGB';\n\n/**\n * Convert a color from HSV to RGB.\n * Each component of the HSV must be given in [0 - 1] range.\n *\n * Ref: https://en.wikipedia.org/wiki/HSV_color_space\n */\nexport function colorHSV2RGB([h, s, v]: [number, number, number]): RawRGB {\n  const ht = (h % 1.0) * 6.0;\n\n  return [0.0, 4.0, 2.0].map((p) => {\n    const colH = Math.min(Math.max(Math.abs(((ht + p) % 6.0) - 3.0) - 1.0, 0.0), 1.0);\n    const colS = lerp(1.0, colH, s);\n    return v * colS;\n  }) as RawRGB;\n}\n", "/**\n * `clamp`\n *\n * @param x - value to clamp\n * @param minVal - lower bound\n * @param maxVal - upper bound\n */\nexport function clamp(x: number, minVal: number, maxVal: number): number {\n  return Math.min(Math.max(x, minVal), maxVal);\n}\n", "import { clamp } from './clamp';\n\n/**\n * `clamp(x, 0.0, 1.0)`\n *\n * @param x - value to clamp\n */\nexport function saturate(x: number): number {\n  return clamp(x, 0.0, 1.0);\n}\n", "import { saturate } from '../math/saturate';\nimport type { RawRGB } from './RawRGB';\n\n/**\n * Converts the input {@link RawRGB} to hex representation (e.g. #7f7f7f)\n *\n * @param color - color in {@link RawRGB}\n * @returns Hex representation of the color\n */\nexport function colorToHex(color: RawRGB): string {\n  const hexArray = color.map((v) =>\n    Math.round(saturate(v) * 255.0)\n      .toString(16)\n      .padStart(2, '0'),\n  );\n  return `#${hexArray.join('')}`;\n}\n", "/**\n * Return a dot product of given two vectors.\n */\nexport function vecDot<T extends number[]>(vecA: T, vecB: T): number {\n  return vecA.reduce((sum, v, i) => sum + v * vecB[i], 0.0);\n}\n", "/*!\n * Turbo colormap\n *\n * Copyright 2019 Google LLC. (Apache-2.0)\n *\n * https://gist.github.com/mikhailov-work/0d177465a8151eb6ede1768d51d476c7\n */\n\nimport { saturate } from '../math/saturate';\nimport { vecDot } from '../math/vec/vecDot';\nimport type { RawRGB } from './RawRGB';\n\n/**\n * Generate a turbo gradient.\n *\n * Ref: https://gist.github.com/mikhailov-work/0d177465a8151eb6ede1768d51d476c7\n */\nexport function colorTurbo(x: number): RawRGB {\n  const kr = [0.13572138, 4.6153926, -42.66032258, 132.13108234, -152.94239396, 59.28637943];\n  const kg = [0.09140261, 2.19418839, 4.84296658, -14.18503333, 4.27729857, 2.82956604];\n  const kb = [0.1066733, 12.64194608, -60.58204836, 110.36276771, -89.90310912, 27.34824973];\n\n  const xt = saturate(x);\n  const xv = [1.0, xt, xt * xt, xt * xt * xt, xt * xt * xt * xt, xt * xt * xt * xt * xt];\n\n  const col = [saturate(vecDot(kr, xv)), saturate(vecDot(kg, xv)), saturate(vecDot(kb, xv))];\n\n  return col as RawRGB;\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * EOTF of Rec.709 a.k.a. sRGB-to-Linear\n */\nexport function eotfRec709(value: RawRGB): RawRGB {\n  return value.map((v) => (v < 0.081 ? v / 4.5 : ((v + 0.099) / 1.099) ** (1.0 / 0.45))) as RawRGB;\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * OETF of Rec.709 a.k.a. Linear-to-sRGB\n */\nexport function oetfRec709(luminance: RawRGB): RawRGB {\n  return luminance.map((l) => (l < 0.018 ? 4.5 * l : 1.099 * l ** 0.45 - 0.099)) as RawRGB;\n}\n", "import type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all parent sources the specified destination has.\n * @param edges An array of dag edge\n * @param destination The target destination\n *\n * See also: {@link dagEdgesChildren}\n */\nexport function dagEdgesParents<T>(edges: RawDagEdge<T>[], destination: T): T[] {\n  return edges.filter((edge) => edge[1] === destination).map((edge) => edge[0]);\n}\n", "import { traverse } from '../algorithm/traverse';\nimport { dagEdgesParents } from './dagEdgesParents';\nimport type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all ancestor sources the specified destination has.\n * @param edges An array of dag edge\n * @param destination The target destination\n *\n * See also: {@link dagEdgesChildren}\n */\nexport function dagEdgesAncestors<T>(edges: RawDagEdge<T>[], destination: T): T[] {\n  const ancestors = new Set<T>();\n\n  traverse(destination, (node) => {\n    const parents = dagEdgesParents(edges, node);\n    parents.map((parent) => ancestors.add(parent));\n    return parents;\n  });\n\n  return Array.from(ancestors);\n}\n", "import type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all children destinations the specified source has.\n * @param edges An array of dag edge\n * @param source The target source\n *\n * See also: {@link dagEdgesDescendant}\n */\nexport function dagEdgesChildren<T>(edges: RawDagEdge<T>[], source: T): T[] {\n  return edges.filter((edge) => edge[0] === source).map((edge) => edge[1]);\n}\n", "import { traverse } from '../algorithm/traverse';\nimport { dagEdgesChildren } from './dagEdgesChildren';\nimport type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all descendant destinations the specified source has.\n * @param edges An array of dag edge\n * @param source The target source\n *\n * See also: {@link dagEdgesChildren}\n */\nexport function dagEdgesDescendants<T>(edges: RawDagEdge<T>[], source: T): T[] {\n  const descendants = new Set<T>();\n\n  traverse(source, (node) => {\n    const children = dagEdgesChildren(edges, node);\n    children.map((child) => descendants.add(child));\n    return children;\n  });\n\n  return Array.from(descendants);\n}\n", "import type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return first parent source the specified destination has.\n * If it can't find a parent, it will return `null` instead.\n *\n * @param edges An array of dag edge\n * @param destination The target destination\n *\n * See also: {@link dagEdgesParents}\n */\nexport function dagEdgesParent<T>(edges: RawDagEdge<T>[], destination: T): T | null {\n  return edges.find((edge) => edge[1] === destination)?.[0] ?? null;\n}\n", "import { dagEdgesParent } from './dagEdgesParent';\nimport type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Resolve dag dependency relationship and give you a correct order.\n *\n * @param edges An array of dag edges\n * @param nodes An array of dag nodes\n */\nexport function dagEdgesResolve<T>(edges: RawDagEdge<T>[], nodes: T[]): T[] {\n  const order: T[] = [];\n\n  const nodeSet = new Set(nodes);\n  let tempEdges = edges.concat();\n\n  while (tempEdges.length > 0) {\n    nodeSet.forEach((node) => {\n      // is this an entrypoint?\n      const hasParents = dagEdgesParent(tempEdges, node) != null;\n\n      if (!hasParents) {\n        nodeSet.delete(node);\n        order.push(node);\n\n        // delete the structure of tempEdges from entrypoint side\n        tempEdges = tempEdges.filter(([src]) => src !== node);\n      }\n    });\n  }\n\n  return order.concat(Array.from(nodeSet));\n  //                   ^^^^^^^^^^^^^^^^^^^^^ terminator nodes\n}\n", "/**\n * Make the given function a debounced one.\n *\n * @example\n * ```ts\n * const func = debounce( 100, () => {\n *   // some expensive procedure\n * } );\n *\n * func();\n * func();\n * func();\n * ```\n */\nexport function debounce(func: () => void, timeoutMs: number): () => void {\n  /** Timeout ID for the queued function call */\n  let queueId: ReturnType<typeof setTimeout> | null | undefined;\n\n  return () => {\n    // clear any previously queued calls\n    if (queueId) {\n      clearTimeout(queueId);\n    }\n\n    // queue for execution after the timeout\n    queueId = setTimeout(() => {\n      func();\n      queueId = null;\n    }, timeoutMs);\n  };\n}\n", "/**\n * A biquad IIR filter.\n */\nexport class BiquadFilter {\n  /** Normalized feed-forward coefficient (b0 / a0). */\n  public b0a0 = 0.0;\n  /** Normalized feed-forward coefficient (b1 / a0). */\n  public b1a0 = 0.0;\n  /** Normalized feed-forward coefficient (b2 / a0). */\n  public b2a0 = 0.0;\n  /** Normalized feedback coefficient (a1 / a0). */\n  public a1a0 = 0.0;\n  /** Normalized feedback coefficient (a2 / a0). */\n  public a2a0 = 0.0;\n\n  /** Previous input sample x[n-1]. */\n  public x1 = 0.0;\n  /** Previous input sample x[n-2]. */\n  public x2 = 0.0;\n  /** Previous output sample y[n-1]. */\n  public y1 = 0.0;\n  /** Previous output sample y[n-2]. */\n  public y2 = 0.0;\n\n  /**\n   * Process a single sample.\n   *\n   * @param x0 Input sample.\n   * @returns Output sample.\n   */\n  public process(x0: number): number {\n    const y0 =\n      this.b0a0 * x0 +\n      this.b1a0 * this.x1 +\n      this.b2a0 * this.x2 -\n      this.a1a0 * this.y1 -\n      this.a2a0 * this.y2;\n\n    this.x2 = this.x1;\n    this.x1 = x0;\n    this.y2 = this.y1;\n    this.y1 = y0;\n\n    return y0;\n  }\n}\n", "import { BiquadFilter } from './BiquadFilter';\n\n/**\n * BPF made of {@link BiquadFilter}.\n */\nexport class BPF extends BiquadFilter {\n  /**\n   * @param f0Norm Normalized center frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  constructor(f0Norm: number, Q: number) {\n    super();\n    this.setCoefficientsFromParams(f0Norm, Q);\n  }\n\n  /**\n   * Update coefficients from normalized center frequency and Q.\n   *\n   * @param f0Norm Normalized center frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  public setCoefficientsFromParams(f0Norm: number, Q: number): void {\n    const omega0 = 2.0 * Math.PI * f0Norm;\n    const cosOmega0 = Math.cos(omega0);\n    const sinOmega0 = Math.sin(omega0);\n    const alpha = (0.5 * sinOmega0) / Q;\n\n    const a0 = 1.0 + alpha;\n    this.a1a0 = (-2.0 * cosOmega0) / a0;\n    this.a2a0 = (1.0 - alpha) / a0;\n    this.b0a0 = alpha / a0;\n    this.b1a0 = 0.0;\n    this.b2a0 = -this.b0a0;\n  }\n}\n", "import { BiquadFilter } from './BiquadFilter';\n\n/**\n * HPF made of {@link BiquadFilter}.\n */\nexport class HPF extends BiquadFilter {\n  /**\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  constructor(f0Norm: number, Q: number) {\n    super();\n    this.setCoefficientsFromParams(f0Norm, Q);\n  }\n\n  /**\n   * Update coefficients from normalized cutoff and Q.\n   *\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  public setCoefficientsFromParams(f0Norm: number, Q: number): void {\n    const omega0 = 2.0 * Math.PI * f0Norm;\n    const cosOmega0 = Math.cos(omega0);\n    const sinOmega0 = Math.sin(omega0);\n    const alpha = (0.5 * sinOmega0) / Q;\n\n    const a0 = 1.0 + alpha;\n    this.a1a0 = (-2.0 * cosOmega0) / a0;\n    this.a2a0 = (1.0 - alpha) / a0;\n    this.b1a0 = (cosOmega0 - 1.0) / a0;\n    this.b0a0 = this.b2a0 = -this.b1a0 / 2.0;\n  }\n}\n", "import { BiquadFilter } from './BiquadFilter';\n\n/**\n * LPF made of {@link BiquadFilter}.\n */\nexport class LPF extends BiquadFilter {\n  /**\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  constructor(f0Norm: number, Q: number) {\n    super();\n    this.setCoefficientsFromParams(f0Norm, Q);\n  }\n\n  /**\n   * Update coefficients from normalized cutoff and Q.\n   *\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  public setCoefficientsFromParams(f0Norm: number, Q: number): void {\n    const omega0 = 2.0 * Math.PI * f0Norm;\n    const cosOmega0 = Math.cos(omega0);\n    const sinOmega0 = Math.sin(omega0);\n    const alpha = (0.5 * sinOmega0) / Q;\n\n    const a0 = 1.0 + alpha;\n    this.a1a0 = (-2.0 * cosOmega0) / a0;\n    this.a2a0 = (1.0 - alpha) / a0;\n    this.b1a0 = (1.0 - cosOmega0) / a0;\n    this.b0a0 = this.b2a0 = this.b1a0 / 2.0;\n  }\n}\n", "/**\n * A Pure Data like phasor.\n */\nexport class Phasor {\n  public freqNorm: number;\n  public phase: number;\n\n  /**\n   * @param freqNorm Normalized frequency. `freq / sampleRate`.\n   */\n  constructor(freqNorm: number) {\n    this.freqNorm = freqNorm;\n    this.phase = 0.0;\n  }\n\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const out = this.phase;\n    this.phase = (this.phase + this.freqNorm) % 1.0;\n    return out;\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A sawtooth wave oscillator.\n */\nexport class SawtoothOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return phase * 2.0 - 1.0;\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A sine wave oscillator.\n */\nexport class SineOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return Math.sin(phase * 2.0 * Math.PI);\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A square wave oscillator.\n */\nexport class SquareOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return phase < 0.5 ? 1.0 : -1.0;\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A triangle wave oscillator.\n */\nexport class TriangleOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return 1.0 - 4.0 * Math.abs(phase - 0.5);\n  }\n}\n", "import { lerp } from '../math/lerp';\n\n/**\n * Do exp smoothing\n */\nexport class ExpSmooth {\n  public factor = 10.0;\n  public target = 0.0;\n  public value = 0.0;\n\n  public update(deltaTime: number): number {\n    this.value = lerp(this.target, this.value, Math.exp(-this.factor * deltaTime));\n    return this.value;\n  }\n}\n", "// yoinked from https://github.com/mapbox/tiny-sdf (BSD 2-Clause)\n// implements http://people.cs.uchicago.edu/~pff/papers/dt.pdf\n\n/**\n * Compute a one dimensional edt from the source data.\n * Returning distance will be squared.\n * Intended to be used internally in {@link edt2d}.\n *\n * @param data Data of the source\n * @param offset Offset of the source from beginning\n * @param stride Stride of the source\n * @param length Length of the source\n */\nexport function edt1d(data: Float32Array, offset: number, stride: number, length: number): void {\n  // index of rightmost parabola in lower envelope\n  let k = 0;\n\n  // locations of parabolas in lower envelope\n  const v = new Float32Array(length);\n  v[0] = 0.0;\n\n  // locations of boundaries between parabolas\n  const z = new Float32Array(length + 1);\n  z[0] = -Infinity;\n  z[1] = Infinity;\n\n  // create a straight array of input data\n  const f = new Float32Array(length);\n  for (let q = 0; q < length; q++) {\n    f[q] = data[offset + q * stride];\n  }\n\n  // compute lower envelope\n  for (let q = 1; q < length; q++) {\n    let s = 0.0;\n\n    while (0 <= k) {\n      s = (f[q] + q * q - f[v[k]] - v[k] * v[k]) / (2.0 * q - 2.0 * v[k]);\n      if (s <= z[k]) {\n        k--;\n      } else {\n        break;\n      }\n    }\n\n    k++;\n    v[k] = q;\n    z[k] = s;\n    z[k + 1] = Infinity;\n  }\n\n  k = 0;\n\n  // fill in values of distance transform\n  for (let q = 0; q < length; q++) {\n    while (z[k + 1] < q) {\n      k++;\n    }\n    const qSubVK = q - v[k];\n    data[offset + q * stride] = f[v[k]] + qSubVK * qSubVK;\n  }\n}\n\n/**\n * Compute a two dimensional edt from the source data.\n * Returning distance will be squared.\n *\n * @param data Data of the source.\n * @param width Width of the source.\n * @param height Height of the source.\n */\nexport function edt2d(data: Float32Array, width: number, height: number): void {\n  for (let x = 0; x < width; x++) {\n    edt1d(data, x, width, height);\n  }\n\n  for (let y = 0; y < height; y++) {\n    edt1d(data, y * width, 1, width);\n  }\n}\n", "/**\n * Convert given Float32Array to 32 bit float wav format.\n *\n * @param src An array of Float32Array, each representing a channel.\n * @param sampleRate The output sample rate.\n * @returns An ArrayBuffer containing the wav data.\n */\nexport function float32ArrayToWav(src: Float32Array[], sampleRate: number): ArrayBuffer {\n  const channels = src.length;\n  const samples = src[0].length;\n  const byteLength = channels * samples * 4 + 44;\n  const array = new Uint8Array(byteLength);\n  const view = new DataView(array.buffer);\n\n  let head = 0;\n\n  // 'RIFF'\n  array[head++] = 0x52;\n  array[head++] = 0x49;\n  array[head++] = 0x46;\n  array[head++] = 0x46;\n\n  // chunk size\n  const riffChunkSize = byteLength - 8;\n  array[head++] = riffChunkSize & 255;\n  array[head++] = (riffChunkSize >> 8) & 255;\n  array[head++] = (riffChunkSize >> 16) & 255;\n  array[head++] = (riffChunkSize >> 24) & 255;\n\n  // 'WAVE'\n  array[head++] = 0x57;\n  array[head++] = 0x41;\n  array[head++] = 0x56;\n  array[head++] = 0x45;\n\n  // 'fmt '\n  array[head++] = 0x66;\n  array[head++] = 0x6d;\n  array[head++] = 0x74;\n  array[head++] = 0x20;\n\n  // chunk size\n  array[head++] = 16;\n  array[head++] = 0;\n  array[head++] = 0;\n  array[head++] = 0;\n\n  // format tag: IEEE float\n  array[head++] = 3;\n  array[head++] = 0;\n\n  // channels\n  array[head++] = channels;\n  array[head++] = 0;\n\n  // samples per sec\n  array[head++] = sampleRate & 255;\n  array[head++] = (sampleRate >> 8) & 255;\n  array[head++] = (sampleRate >> 16) & 255;\n  array[head++] = (sampleRate >> 24) & 255;\n\n  // avg bytes per sec\n  const avgBytesPerSec = 4 * channels * sampleRate;\n  array[head++] = avgBytesPerSec & 255;\n  array[head++] = (avgBytesPerSec >> 8) & 255;\n  array[head++] = (avgBytesPerSec >> 16) & 255;\n  array[head++] = (avgBytesPerSec >> 24) & 255;\n\n  // block align\n  array[head++] = 4 * channels;\n  array[head++] = 0;\n\n  // bits per sample\n  array[head++] = 32;\n  array[head++] = 0;\n\n  // 'data'\n  array[head++] = 0x64;\n  array[head++] = 0x61;\n  array[head++] = 0x74;\n  array[head++] = 0x61;\n\n  // chunk size\n  const dataChunkSize = 4 * channels * samples;\n  array[head++] = dataChunkSize & 255;\n  array[head++] = (dataChunkSize >> 8) & 255;\n  array[head++] = (dataChunkSize >> 16) & 255;\n  array[head++] = (dataChunkSize >> 24) & 255;\n\n  // data\n  for (let iSample = 0; iSample < samples; iSample++) {\n    for (let iCh = 0; iCh < channels; iCh++) {\n      view.setFloat32(head, src[iCh][iSample], true);\n      head += 4;\n    }\n  }\n\n  return array.buffer;\n}\n", "/**\n * The finalization mix function used in MurmurHash3 to avalanche the bits of a hash to finalize it.\n * Useful for generating a nice-looking hash from a simple integer sequence.\n *\n * @param h - the hash to finalize\n * @returns the finalized hash\n */\nexport function fmix32(h: number): number {\n  h ^= h >>> 16;\n  h = Math.imul(h, 0x85ebca6b);\n  h ^= h >>> 13;\n  h = Math.imul(h, 0xc2b2ae35);\n  h ^= h >>> 16;\n\n  return h >>> 0;\n}\n", "export class Pool<T> {\n  public array: T[];\n\n  public index = 0;\n\n  public get current(): T {\n    return this.array[this.index];\n  }\n\n  public constructor(array: T[]) {\n    this.array = array;\n  }\n\n  public next(): T {\n    this.index = (this.index + 1) % this.array.length;\n    return this.current;\n  }\n}\n", "import { Pool } from '../Pool/Pool';\n\ninterface EXT_disjoint_timer_query_webgl2 {\n  readonly TIME_ELAPSED_EXT: number;\n}\n\nexport class GPUTimer {\n  public queries: Pool<WebGLQuery>;\n  public stack: Promise<number>[];\n  public ext: EXT_disjoint_timer_query_webgl2;\n  public readonly gl: WebGL2RenderingContext;\n\n  private __loopTasks: Set<() => void>;\n\n  public static isSupported(gl: WebGLRenderingContext | WebGL2RenderingContext): boolean {\n    return new Set(gl.getSupportedExtensions()).has('EXT_disjoint_timer_query_webgl2');\n  }\n\n  public constructor(gl: WebGL2RenderingContext) {\n    this.gl = gl;\n\n    const queries = new Array(1024).fill(1).map(() => gl.createQuery()!);\n    this.queries = new Pool(queries);\n\n    this.stack = [];\n\n    const ext = gl.getExtension('EXT_disjoint_timer_query_webgl2');\n    if (!ext) {\n      throw new Error('EXT_disjoint_timer_query_webgl2 is not supported');\n    }\n    this.ext = ext;\n\n    this.__loopTasks = new Set();\n\n    // loop\n    const update = (): void => {\n      this.update();\n      requestAnimationFrame(update);\n    };\n    update();\n  }\n\n  public update(): void {\n    Array.from(this.__loopTasks).forEach((task) => task());\n  }\n\n  public async measure(func: () => void): Promise<number> {\n    const { gl } = this;\n\n    if (this.stack.length !== 0) {\n      gl.endQuery(this.ext.TIME_ELAPSED_EXT);\n      const promiseFinishingPrev = this.check(this.queries.current);\n\n      this.stack = this.stack.map(async (promiseAccum) => {\n        return (await promiseAccum) + (await promiseFinishingPrev);\n      });\n    }\n\n    this.stack.push(Promise.resolve(0.0));\n\n    gl.beginQuery(this.ext.TIME_ELAPSED_EXT, this.queries.next());\n\n    func();\n\n    gl.endQuery(this.ext.TIME_ELAPSED_EXT);\n\n    const promiseAccum = this.stack.pop()!;\n    const promiseThis = this.check(this.queries.current);\n\n    if (this.stack.length !== 0) {\n      this.stack = this.stack.map(async (promiseAccum) => {\n        return (await promiseAccum) + (await promiseThis);\n      });\n\n      gl.beginQuery(this.ext.TIME_ELAPSED_EXT, this.queries.next());\n    }\n\n    return (await promiseAccum) + (await promiseThis);\n  }\n\n  public check(query: WebGLQuery): Promise<number> {\n    const { gl } = this;\n\n    return new Promise((resolve) => {\n      const task = (): void => {\n        const isAvailable = gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE);\n\n        if (isAvailable) {\n          this.__loopTasks.delete(task);\n          resolve(gl.getQueryParameter(query, gl.QUERY_RESULT) * 0.001 * 0.001);\n        }\n      };\n\n      this.__loopTasks.add(task);\n    });\n  }\n}\n", "/**\n * Useful for tap tempo\n * See also: {@link HistoryMeanCalculator}\n */\nexport class HistoryMeanCalculator {\n  private __recalcForEach = 0;\n  private __countUntilRecalc = 0;\n  private __history: number[] = [];\n  private __index = 0;\n  private __length: number;\n  private __count = 0;\n  private __cache = 0;\n\n  public constructor(length: number) {\n    this.__length = length;\n    this.__recalcForEach = length;\n    for (let i = 0; i < length; i++) {\n      this.__history[i] = 0;\n    }\n  }\n\n  public get mean(): number {\n    const count = Math.min(this.__count, this.__length);\n    return count === 0 ? 0.0 : this.__cache / count;\n  }\n\n  public get recalcForEach(): number {\n    return this.__recalcForEach;\n  }\n\n  public set recalcForEach(value: number) {\n    const delta = value - this.__recalcForEach;\n    this.__recalcForEach = value;\n    this.__countUntilRecalc = Math.max(0, this.__countUntilRecalc + delta);\n  }\n\n  public reset(): void {\n    this.__index = 0;\n    this.__count = 0;\n    this.__cache = 0;\n    this.__countUntilRecalc = 0;\n    for (let i = 0; i < this.__length; i++) {\n      this.__history[i] = 0;\n    }\n  }\n\n  public push(value: number): void {\n    const prev = this.__history[this.__index];\n    this.__history[this.__index] = value;\n    this.__count++;\n    this.__index = (this.__index + 1) % this.__length;\n\n    if (this.__countUntilRecalc === 0) {\n      this.recalc();\n    } else {\n      this.__countUntilRecalc--;\n      this.__cache -= prev;\n      this.__cache += value;\n    }\n  }\n\n  public recalc(): void {\n    this.__countUntilRecalc = this.__recalcForEach;\n    const sum = this.__history\n      .slice(0, Math.min(this.__count, this.__length))\n      .reduce((sum, v) => sum + v, 0);\n    this.__cache = sum;\n  }\n}\n", "import { binarySearch } from '../algorithm/binarySearch';\n\n/**\n * Useful for fps calc\n * See also: {@link HistoryMeanCalculator}\n */\nexport class HistoryPercentileCalculator {\n  private __history: number[] = [];\n  private __sorted: number[] = [];\n  private __index = 0;\n  private readonly __length: number;\n\n  public constructor(length: number) {\n    this.__length = length;\n  }\n\n  public get median(): number {\n    return this.percentile(50.0);\n  }\n\n  public percentile(percentile: number): number {\n    if (this.__history.length === 0) {\n      return 0.0;\n    }\n    return this.__sorted[Math.round(percentile * 0.01 * (this.__history.length - 1))];\n  }\n\n  public reset(): void {\n    this.__index = 0;\n    this.__history = [];\n    this.__sorted = [];\n  }\n\n  public push(value: number): void {\n    const prev = this.__history[this.__index];\n    this.__history[this.__index] = value;\n    this.__index = (this.__index + 1) % this.__length;\n\n    // remove the prev from sorted array\n    if (this.__sorted.length === this.__length) {\n      const prevIndex = binarySearch(this.__sorted, prev);\n      this.__sorted.splice(prevIndex, 1);\n    }\n\n    const index = binarySearch(this.__sorted, value);\n    this.__sorted.splice(index, 0, value);\n  }\n}\n", "import { HistoryPercentileCalculator } from './HistoryPercentileCalculator';\n\n/**\n * @deprecated It's actually just a special case of {@link HistoryPercentileCalculator}\n */\nexport class HistoryMedianCalculator extends HistoryPercentileCalculator {\n  public constructor(length: number) {\n    super(length);\n    console.warn('HistoryMedianCalculator: Deprecated. Use HistoryPercentileCalculator instead');\n  }\n}\n", "/**\n * Convert given Int16Array to 16 bit wav format.\n *\n * @param src An array of Int16Array, each representing a channel.\n * @param sampleRate The output sample rate.\n * @returns An ArrayBuffer containing the wav data.\n */\nexport function int16ArrayToWav(src: Int16Array[], sampleRate: number): ArrayBuffer {\n  const channels = src.length;\n  const samples = src[0].length;\n  const byteLength = channels * samples * 2 + 44;\n  const array = new Uint8Array(byteLength);\n\n  let head = 0;\n\n  // 'RIFF'\n  array[head++] = 0x52;\n  array[head++] = 0x49;\n  array[head++] = 0x46;\n  array[head++] = 0x46;\n\n  // chunk size\n  const riffChunkSize = byteLength - 8;\n  array[head++] = riffChunkSize & 255;\n  array[head++] = (riffChunkSize >> 8) & 255;\n  array[head++] = (riffChunkSize >> 16) & 255;\n  array[head++] = (riffChunkSize >> 24) & 255;\n\n  // 'WAVE'\n  array[head++] = 0x57;\n  array[head++] = 0x41;\n  array[head++] = 0x56;\n  array[head++] = 0x45;\n\n  // 'fmt '\n  array[head++] = 0x66;\n  array[head++] = 0x6d;\n  array[head++] = 0x74;\n  array[head++] = 0x20;\n\n  // chunk size\n  array[head++] = 16;\n  array[head++] = 0;\n  array[head++] = 0;\n  array[head++] = 0;\n\n  // format tag\n  array[head++] = 1;\n  array[head++] = 0;\n\n  // channels\n  array[head++] = channels;\n  array[head++] = 0;\n\n  // samples per sec\n  array[head++] = sampleRate & 255;\n  array[head++] = (sampleRate >> 8) & 255;\n  array[head++] = (sampleRate >> 16) & 255;\n  array[head++] = (sampleRate >> 24) & 255;\n\n  // avg bytes per sec\n  const avgBytesPerSec = 2 * channels * sampleRate;\n  array[head++] = avgBytesPerSec & 255;\n  array[head++] = (avgBytesPerSec >> 8) & 255;\n  array[head++] = (avgBytesPerSec >> 16) & 255;\n  array[head++] = (avgBytesPerSec >> 24) & 255;\n\n  // block align\n  array[head++] = 2 * channels;\n  array[head++] = 0;\n\n  // bits per sample\n  array[head++] = 16;\n  array[head++] = 0;\n\n  // 'data'\n  array[head++] = 0x64;\n  array[head++] = 0x61;\n  array[head++] = 0x74;\n  array[head++] = 0x61;\n\n  // chunk size\n  const dataChunkSize = 2 * channels * samples;\n  array[head++] = dataChunkSize & 255;\n  array[head++] = (dataChunkSize >> 8) & 255;\n  array[head++] = (dataChunkSize >> 16) & 255;\n  array[head++] = (dataChunkSize >> 24) & 255;\n\n  // data\n  for (let iSample = 0; iSample < samples; iSample++) {\n    for (let iCh = 0; iCh < channels; iCh++) {\n      const data = src[iCh][iSample];\n      array[head++] = data & 255;\n      array[head++] = (data >> 8) & 255;\n    }\n  }\n\n  return array.buffer;\n}\n", "export class MapOfSet<K, V> {\n  public readonly map: Map<K, Set<V>>;\n\n  public constructor() {\n    this.map = new Map();\n  }\n\n  public get(key: K): Set<V> {\n    return this.map.get(key) ?? new Set();\n  }\n\n  public add(key: K, value: V): void {\n    let set = this.map.get(key);\n    if (set == null) {\n      set = new Set();\n      this.map.set(key, set);\n    }\n    set.add(value);\n  }\n}\n", "/**\n * Scale the given vector by a scalar.\n */\nexport function vecScale<T extends number[]>(vec: T, scalar: number): T {\n  return vec.map((v) => v * scalar) as T;\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Who needs this?\n *\n * Intended to be used by {@link mat3CreateNormalMatrix}.\n */\nexport function mat3FromMat4Transpose(source: RawMatrix4): RawMatrix3 {\n  return [\n    source[0],\n    source[4],\n    source[8],\n    source[1],\n    source[5],\n    source[9],\n    source[2],\n    source[6],\n    source[10],\n  ];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Return an inverse of given mat3.\n *\n * Yoinked from Three.js\n */\nexport function mat3Inverse(m: RawMatrix3): RawMatrix3 {\n  const n11 = m[0],\n    n21 = m[1],\n    n31 = m[2],\n    n12 = m[3],\n    n22 = m[4],\n    n32 = m[5],\n    n13 = m[6],\n    n23 = m[7],\n    n33 = m[8],\n    t11 = n33 * n22 - n32 * n23,\n    t12 = n32 * n13 - n33 * n12,\n    t13 = n23 * n12 - n22 * n13,\n    det = n11 * t11 + n21 * t12 + n31 * t13;\n\n  if (det === 0.0) {\n    return vecScale(m, 0.0);\n  }\n\n  return vecScale(\n    [\n      t11,\n      n31 * n23 - n33 * n21,\n      n32 * n21 - n31 * n22,\n      t12,\n      n33 * n11 - n31 * n13,\n      n31 * n12 - n32 * n11,\n      t13,\n      n21 * n13 - n23 * n11,\n      n22 * n11 - n21 * n12,\n    ],\n    1.0 / det,\n  );\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { mat3FromMat4Transpose } from './mat3FromMat4Transpose';\nimport { mat3Inverse } from './mat3Inverse';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Create a normal matrix out of a matrix4.\n *\n * @param matrix A matrix4\n */\nexport function mat3CreateNormalMatrix(m: RawMatrix4): RawMatrix3 {\n  return mat3Inverse(mat3FromMat4Transpose(m));\n}\n", "import type { RawMatrix3 } from './RawMatrix3';\n\nexport function mat3Determinant(m: RawMatrix3): number {\n  const n11 = m[0],\n    n21 = m[1],\n    n31 = m[2],\n    n12 = m[3],\n    n22 = m[4],\n    n32 = m[5],\n    n13 = m[6],\n    n23 = m[7],\n    n33 = m[8],\n    t11 = n33 * n22 - n32 * n23,\n    t12 = n32 * n13 - n33 * n12,\n    t13 = n23 * n12 - n22 * n13;\n\n  return n11 * t11 + n21 * t12 + n31 * t13;\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Create a matrix3 from matrix4.\n */\nexport function mat3FromMat4(source: RawMatrix4): RawMatrix3 {\n  return [\n    source[0],\n    source[1],\n    source[2],\n    source[4],\n    source[5],\n    source[6],\n    source[8],\n    source[9],\n    source[10],\n  ];\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Convert a quaternion into a matrix3.\n *\n * Yoinked from Three.js.\n *\n * See: https://threejs.org/docs/#api/en/math/Matrix4.makeRotationFromQuaternion\n */\nexport function mat3FromQuaternion(quat: RawQuaternion): RawMatrix3 {\n  const x = quat[0];\n  const y = quat[1];\n  const z = quat[2];\n  const w = quat[3];\n\n  return [\n    1.0 - 2.0 * y * y - 2.0 * z * z,\n    2.0 * x * y + 2.0 * z * w,\n    2.0 * x * z - 2.0 * y * w,\n    2.0 * x * y - 2.0 * z * w,\n    1.0 - 2.0 * x * x - 2.0 * z * z,\n    2.0 * y * z + 2.0 * x * w,\n    2.0 * x * z + 2.0 * y * w,\n    2.0 * y * z - 2.0 * x * w,\n    1.0 - 2.0 * x * x - 2.0 * y * y,\n  ];\n}\n", "import type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Return a multiplication result of matrices.\n */\nexport function mat3Multiply(...mats: RawMatrix3[]): RawMatrix3 {\n  if (mats.length < 2) {\n    return mats[0];\n  }\n\n  const a = mats.shift()!;\n  const b = mat3Multiply(...mats);\n  const a00 = a[0],\n    a01 = a[1],\n    a02 = a[2],\n    a10 = a[3],\n    a11 = a[4],\n    a12 = a[5],\n    a20 = a[6],\n    a21 = a[7],\n    a22 = a[8],\n    b00 = b[0],\n    b01 = b[1],\n    b02 = b[2],\n    b10 = b[3],\n    b11 = b[4],\n    b12 = b[5],\n    b20 = b[6],\n    b21 = b[7],\n    b22 = b[8];\n\n  return [\n    a00 * b00 + a10 * b01 + a20 * b02,\n    a01 * b00 + a11 * b01 + a21 * b02,\n    a02 * b00 + a12 * b01 + a22 * b02,\n\n    a00 * b10 + a10 * b11 + a20 * b12,\n    a01 * b10 + a11 * b11 + a21 * b12,\n    a02 * b10 + a12 * b11 + a22 * b12,\n\n    a00 * b20 + a10 * b21 + a20 * b22,\n    a01 * b20 + a11 * b21 + a21 * b22,\n    a02 * b20 + a12 * b21 + a22 * b22,\n  ];\n}\n", "import type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Transpose a mat3.\n */\nexport function mat3Transpose(source: RawMatrix3): RawMatrix3 {\n  return [\n    source[0],\n    source[3],\n    source[6],\n    source[1],\n    source[4],\n    source[7],\n    source[2],\n    source[5],\n    source[8],\n  ];\n}\n", "import { Matrix4 } from '../mat4/Matrix4';\nimport type { Quaternion } from '../quat/Quaternion';\nimport { vecScale } from '../vec/vecScale';\nimport { mat3CreateNormalMatrix } from './mat3CreateNormalMatrix';\nimport { mat3Determinant } from './mat3Determinant';\nimport { mat3FromMat4 } from './mat3FromMat4';\nimport { mat3FromQuaternion } from './mat3FromQuaternion';\nimport { mat3Inverse } from './mat3Inverse';\nimport { mat3Multiply } from './mat3Multiply';\nimport { mat3Transpose } from './mat3Transpose';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n// biome-ignore format: matrix\nconst rawIdentityMatrix3: RawMatrix3 = [\n  1.0, 0.0, 0.0,\n  0.0, 1.0, 0.0,\n  0.0, 0.0, 1.0,\n];\n\n/**\n * A Matrix3.\n */\nexport class Matrix3 {\n  public elements: RawMatrix3;\n\n  public constructor(v: RawMatrix3 = rawIdentityMatrix3) {\n    this.elements = v;\n  }\n\n  /**\n   * Itself but transposed.\n   */\n  public get transpose(): Matrix3 {\n    return new Matrix3(mat3Transpose(this.elements));\n  }\n\n  /**\n   * Its determinant.\n   */\n  public get determinant(): number {\n    return mat3Determinant(this.elements);\n  }\n\n  /**\n   * Itself but inverted.\n   */\n  public get inverse(): Matrix3 {\n    return new Matrix3(mat3Inverse(this.elements));\n  }\n\n  /**\n   * Itself but matrix4.\n   */\n  public get matrix4(): Matrix4 {\n    return Matrix4.fromMatrix3(this);\n  }\n\n  public toString(): string {\n    const m = this.elements.map((v) => v.toFixed(3));\n    return `Matrix3( ${m[0]}, ${m[3]}, ${m[6]}; ${m[1]}, ${m[4]}, ${m[7]}; ${m[2]}, ${m[5]}, ${m[8]} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Matrix3 {\n    return new Matrix3(this.elements.concat() as RawMatrix3);\n  }\n\n  /**\n   * Multiply this Matrix3 by one or more Matrix3s.\n   */\n  public multiply(...matrices: Matrix3[]): Matrix3 {\n    return Matrix3.multiply(this, ...matrices);\n  }\n\n  /**\n   * Multiply this Matrix3 by a scalar.\n   */\n  public scaleScalar(scalar: number): Matrix3 {\n    return new Matrix3(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * An identity Matrix4.\n   */\n  public static get identity(): Matrix3 {\n    return new Matrix3(rawIdentityMatrix3);\n  }\n\n  /**\n   * Multiply two or more matrices.\n   * @param matrices Matrices\n   */\n  public static multiply(...matrices: Matrix3[]): Matrix3 {\n    if (matrices.length === 0) {\n      return Matrix3.identity;\n    } else {\n      return new Matrix3(mat3Multiply(...matrices.map((m) => m.elements)));\n    }\n  }\n\n  /**\n   * Create a normal matrix out of matrix4.\n   * @param matrix4 A matrix4\n   */\n  public static createNormalMatrix(matrix4: Matrix4): Matrix3 {\n    return new Matrix3(mat3CreateNormalMatrix(matrix4.elements));\n  }\n\n  /**\n   * Cast a {@link Matrix4} into a Matrix3.\n   * @param matrix4 A matrix4\n   */\n  public static fromMatrix4(matrix4: Matrix4): Matrix3 {\n    return new Matrix3(mat3FromMat4(matrix4.elements));\n  }\n\n  /**\n   * Create a matrix out of a {@link Quaternion}.\n   * @param quaternion A quaternion\n   */\n  public static fromQuaternion(quaternion: Quaternion): Matrix3 {\n    return new Matrix3(mat3FromQuaternion(quaternion.elements));\n  }\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawMatrix4 } from '.';\n\n/**\n * Convert a quaternion into a matrix4.\n *\n * Yoinked from Three.js.\n *\n * See: https://threejs.org/docs/#api/en/math/Matrix4.makeRotationFromQuaternion\n */\nexport function mat4FromQuaternion(quat: RawQuaternion): RawMatrix4 {\n  const x = quat[0];\n  const y = quat[1];\n  const z = quat[2];\n  const w = quat[3];\n\n  return [\n    1.0 - 2.0 * y * y - 2.0 * z * z,\n    2.0 * x * y + 2.0 * z * w,\n    2.0 * x * z - 2.0 * y * w,\n    0.0,\n    2.0 * x * y - 2.0 * z * w,\n    1.0 - 2.0 * x * x - 2.0 * z * z,\n    2.0 * y * z + 2.0 * x * w,\n    0.0,\n    2.0 * x * z + 2.0 * y * w,\n    2.0 * y * z - 2.0 * x * w,\n    1.0 - 2.0 * x * x - 2.0 * y * y,\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    1.0,\n  ];\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { mat4FromQuaternion } from './mat4FromQuaternion';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Compose a matrix out of position, scale, and rotation.\n * Yoinked from Three.js.\n */\nexport function mat4Compose(\n  position: RawVector3,\n  rotation: RawQuaternion,\n  scale: RawVector3,\n): RawMatrix4 {\n  const matRot = mat4FromQuaternion(rotation);\n\n  const sx = scale[0],\n    sy = scale[1],\n    sz = scale[2];\n\n  return [\n    matRot[0] * sx,\n    matRot[1] * sx,\n    matRot[2] * sx,\n    0.0,\n\n    matRot[4] * sy,\n    matRot[5] * sy,\n    matRot[6] * sy,\n    0.0,\n\n    matRot[8] * sz,\n    matRot[9] * sz,\n    matRot[10] * sz,\n    0.0,\n\n    position[0],\n    position[1],\n    position[2],\n    1.0,\n  ];\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of a rotation matrix.\n * Yoinked from Three.js.\n */\nexport function quatFromMatrix3(m: RawMatrix3): RawQuaternion {\n  const m11 = m[0],\n    m12 = m[3],\n    m13 = m[6],\n    m21 = m[1],\n    m22 = m[4],\n    m23 = m[7],\n    m31 = m[2],\n    m32 = m[5],\n    m33 = m[8],\n    trace = m11 + m22 + m33;\n\n  if (trace > 0) {\n    const s = 0.5 / Math.sqrt(trace + 1.0);\n    return [(m32 - m23) * s, (m13 - m31) * s, (m21 - m12) * s, 0.25 / s];\n  } else if (m11 > m22 && m11 > m33) {\n    const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n    return [0.25 * s, (m12 + m21) / s, (m13 + m31) / s, (m32 - m23) / s];\n  } else if (m22 > m33) {\n    const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n    return [(m12 + m21) / s, 0.25 * s, (m23 + m32) / s, (m13 - m31) / s];\n  } else {\n    const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n    return [(m13 + m31) / s, (m23 + m32) / s, 0.25 * s, (m21 - m12) / s];\n  }\n}\n", "import { mat3FromMat4 } from '../mat3/mat3FromMat4';\nimport type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { quatFromMatrix3 } from './quatFromMatrix3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of a rotation matrix.\n */\nexport function quatFromMatrix4(m: RawMatrix4): RawQuaternion {\n  return quatFromMatrix3(mat3FromMat4(m));\n}\n", "/**\n * Return an euclidean length of given vector.\n */\nexport function vecLength<T extends number[]>(vec: T): number {\n  return Math.sqrt(vec.reduce((sum, v) => sum + v * v, 0.0));\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Return a determinant of given mat4.\n */\nexport function mat4Determinant(m: RawMatrix4): number {\n  const a00 = m[0],\n    a01 = m[1],\n    a02 = m[2],\n    a03 = m[3],\n    a10 = m[4],\n    a11 = m[5],\n    a12 = m[6],\n    a13 = m[7],\n    a20 = m[8],\n    a21 = m[9],\n    a22 = m[10],\n    a23 = m[11],\n    a30 = m[12],\n    a31 = m[13],\n    a32 = m[14],\n    a33 = m[15],\n    b00 = a00 * a11 - a01 * a10,\n    b01 = a00 * a12 - a02 * a10,\n    b02 = a00 * a13 - a03 * a10,\n    b03 = a01 * a12 - a02 * a11,\n    b04 = a01 * a13 - a03 * a11,\n    b05 = a02 * a13 - a03 * a12,\n    b06 = a20 * a31 - a21 * a30,\n    b07 = a20 * a32 - a22 * a30,\n    b08 = a20 * a33 - a23 * a30,\n    b09 = a21 * a32 - a22 * a31,\n    b10 = a21 * a33 - a23 * a31,\n    b11 = a22 * a33 - a23 * a32;\n\n  return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n", "import { quatFromMatrix4 } from '../quat/quatFromMatrix4';\nimport type { RawQuaternion } from '../quat/RawQuaternion';\nimport { vecLength } from '../vec/vecLength';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { mat4Determinant } from './mat4Determinant';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Decompose a matrix into a position, a scale, and a rotation.\n * Yoinked from Three.js.\n */\nexport function mat4Decompose(m: RawMatrix4): {\n  position: RawVector3;\n  scale: RawVector3;\n  rotation: RawQuaternion;\n} {\n  let sx = vecLength([m[0], m[1], m[2]]);\n  const sy = vecLength([m[4], m[5], m[6]]);\n  const sz = vecLength([m[8], m[9], m[10]]);\n\n  // if determinant is negative, we need to invert one scale\n  const det = mat4Determinant(m);\n  if (det < 0) {\n    sx = -sx;\n  }\n\n  const invSx = 1.0 / sx;\n  const invSy = 1.0 / sy;\n  const invSz = 1.0 / sz;\n\n  const rotationMatrix = m.concat() as RawMatrix4;\n\n  rotationMatrix[0] *= invSx;\n  rotationMatrix[1] *= invSx;\n  rotationMatrix[2] *= invSx;\n\n  rotationMatrix[4] *= invSy;\n  rotationMatrix[5] *= invSy;\n  rotationMatrix[6] *= invSy;\n\n  rotationMatrix[8] *= invSz;\n  rotationMatrix[9] *= invSz;\n  rotationMatrix[10] *= invSz;\n\n  return {\n    position: [m[12], m[13], m[14]],\n    scale: [sx, sy, sz],\n    rotation: quatFromMatrix4(rotationMatrix),\n  };\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Create a matrix4 from matrix3.\n */\nexport function mat4FromMat3(source: RawMatrix3): RawMatrix4 {\n  return [\n    source[0],\n    source[1],\n    source[2],\n    0.0,\n    source[3],\n    source[4],\n    source[5],\n    0.0,\n    source[6],\n    source[7],\n    source[8],\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    1.0,\n  ];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n *  an inverse of given mat4.\n */\nexport function mat4Inverse(m: RawMatrix4): RawMatrix4 {\n  const a00 = m[0],\n    a01 = m[1],\n    a02 = m[2],\n    a03 = m[3],\n    a10 = m[4],\n    a11 = m[5],\n    a12 = m[6],\n    a13 = m[7],\n    a20 = m[8],\n    a21 = m[9],\n    a22 = m[10],\n    a23 = m[11],\n    a30 = m[12],\n    a31 = m[13],\n    a32 = m[14],\n    a33 = m[15],\n    b00 = a00 * a11 - a01 * a10,\n    b01 = a00 * a12 - a02 * a10,\n    b02 = a00 * a13 - a03 * a10,\n    b03 = a01 * a12 - a02 * a11,\n    b04 = a01 * a13 - a03 * a11,\n    b05 = a02 * a13 - a03 * a12,\n    b06 = a20 * a31 - a21 * a30,\n    b07 = a20 * a32 - a22 * a30,\n    b08 = a20 * a33 - a23 * a30,\n    b09 = a21 * a32 - a22 * a31,\n    b10 = a21 * a33 - a23 * a31,\n    b11 = a22 * a33 - a23 * a32;\n\n  const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (det === 0.0) {\n    return vecScale(m, 0.0);\n  }\n\n  return vecScale(\n    [\n      a11 * b11 - a12 * b10 + a13 * b09,\n      a02 * b10 - a01 * b11 - a03 * b09,\n      a31 * b05 - a32 * b04 + a33 * b03,\n      a22 * b04 - a21 * b05 - a23 * b03,\n      a12 * b08 - a10 * b11 - a13 * b07,\n      a00 * b11 - a02 * b08 + a03 * b07,\n      a32 * b02 - a30 * b05 - a33 * b01,\n      a20 * b05 - a22 * b02 + a23 * b01,\n      a10 * b10 - a11 * b08 + a13 * b06,\n      a01 * b08 - a00 * b10 - a03 * b06,\n      a30 * b04 - a31 * b02 + a33 * b00,\n      a21 * b02 - a20 * b04 - a23 * b00,\n      a11 * b07 - a10 * b09 - a12 * b06,\n      a00 * b09 - a01 * b07 + a02 * b06,\n      a31 * b01 - a30 * b03 - a32 * b00,\n      a20 * b03 - a21 * b01 + a22 * b00,\n    ],\n    1.0 / det,\n  );\n}\n", "/**\n * Return a sum of vectors.\n */\nexport function vecAdd<T extends number[]>(...vecs: T[]): T {\n  if (vecs.length < 2) {\n    return vecs[0];\n  }\n\n  const a = vecs.shift()!;\n  const b = vecAdd(...vecs);\n\n  return a.map((v, i) => v + b[i]) as T;\n}\n", "import { vecLength } from './vecLength';\nimport { vecScale } from './vecScale';\n\n/**\n * Normalize given vector.\n * If the length of given vector is 0.0, it will return a zero vector instead.\n */\nexport function vecNormalize<T extends number[]>(vec: T): T {\n  const len = vecLength(vec);\n  const invLen = len === 0.0 ? 0.0 : 1.0 / len;\n  return vecScale(vec, invLen);\n}\n", "/**\n * Subtract a vector from a vector.\n */\nexport function vecSub<T extends number[]>(vecA: T, vecB: T): T {\n  return vecA.map((v, i) => v - vecB[i]) as T;\n}\n", "import type { RawVector3 } from './RawVector3';\n\n/**\n * Return a cross product of two vec3s.\n */\nexport function vec3Cross(vecA: RawVector3, vecB: RawVector3): RawVector3 {\n  return [\n    vecA[1] * vecB[2] - vecA[2] * vecB[1],\n    vecA[2] * vecB[0] - vecA[0] * vecB[2],\n    vecA[0] * vecB[1] - vecA[1] * vecB[0],\n  ];\n}\n", "import { vecAdd } from '../vec/vecAdd';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3Cross } from '../vec3/vec3Cross';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a \"LookAt\" matrix.\n *\n * See also: {@link mat4LookAtInverse}\n */\nexport function mat4LookAt(\n  position: RawVector3,\n  target: RawVector3 = [0.0, 0.0, 0.0],\n  up: RawVector3 = [0.0, 1.0, 0.0],\n  roll = 0.0,\n): RawMatrix4 {\n  const dir = vecNormalize(vecSub(position, target));\n\n  let sid = vecNormalize(vec3Cross(up, dir));\n\n  if (roll !== 0.0) {\n    sid = vecAdd(vecScale(sid, Math.cos(roll)), vecScale(vec3Cross(dir, sid), Math.sin(roll)));\n  }\n\n  const top = vec3Cross(dir, sid);\n\n  // biome-ignore format: matrix\n  return [\n    sid[0], sid[1], sid[2], 0.0,\n    top[0], top[1], top[2], 0.0,\n    dir[0], dir[1], dir[2], 0.0,\n    position[0], position[1], position[2], 1.0,\n  ];\n}\n", "import { vecAdd } from '../vec/vecAdd';\nimport { vecDot } from '../vec/vecDot';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3Cross } from '../vec3/vec3Cross';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate an inverse of \"LookAt\" matrix. Good for creating a view matrix.\n *\n * See also: {@link mat4LookAt}\n */\nexport function mat4LookAtInverse(\n  position: RawVector3,\n  target: RawVector3 = [0.0, 0.0, 0.0],\n  up: RawVector3 = [0.0, 1.0, 0.0],\n  roll = 0.0,\n): RawMatrix4 {\n  const dir = vecNormalize(vecSub(position, target));\n\n  let sid = vecNormalize(vec3Cross(up, dir));\n\n  if (roll !== 0.0) {\n    // biome-ignore format: readability\n    sid = vecAdd(\n      vecScale(sid, Math.cos(roll)),\n      vecScale(vec3Cross(dir, sid), Math.sin(roll)),\n    );\n  }\n\n  const top = vec3Cross(dir, sid);\n\n  // biome-ignore format: matrix\n  return [\n    sid[0], top[0], dir[0], 0.0,\n    sid[1], top[1], dir[1], 0.0,\n    sid[2], top[2], dir[2], 0.0,\n    -vecDot(sid, position), -vecDot(top, position), -vecDot(dir, position), 1.0,\n  ];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Return a multiplication result of matrices.\n */\nexport function mat4Multiply(...mats: RawMatrix4[]): RawMatrix4 {\n  if (mats.length < 2) {\n    return mats[0];\n  }\n\n  const a = mats.shift()!;\n  const b = mat4Multiply(...mats);\n  const a00 = a[0],\n    a01 = a[1],\n    a02 = a[2],\n    a03 = a[3],\n    a10 = a[4],\n    a11 = a[5],\n    a12 = a[6],\n    a13 = a[7],\n    a20 = a[8],\n    a21 = a[9],\n    a22 = a[10],\n    a23 = a[11],\n    a30 = a[12],\n    a31 = a[13],\n    a32 = a[14],\n    a33 = a[15],\n    b00 = b[0],\n    b01 = b[1],\n    b02 = b[2],\n    b03 = b[3],\n    b10 = b[4],\n    b11 = b[5],\n    b12 = b[6],\n    b13 = b[7],\n    b20 = b[8],\n    b21 = b[9],\n    b22 = b[10],\n    b23 = b[11],\n    b30 = b[12],\n    b31 = b[13],\n    b32 = b[14],\n    b33 = b[15];\n\n  return [\n    a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03,\n    a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03,\n    a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03,\n    a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03,\n\n    a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13,\n    a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13,\n    a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13,\n    a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13,\n\n    a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23,\n    a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23,\n    a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23,\n    a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23,\n\n    a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33,\n    a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33,\n    a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33,\n    a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33,\n  ];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a \"Perspective\" projection matrix.\n *\n * @param fov Field of View Y, **IN DEGREES**\n * @param near Near clip plane\n * @param far Far clip plane\n * @param aspect Aspect ratio. **`1.0` BY DEFAULT**\n */\nexport function mat4Perspective(fov = 45.0, near = 0.01, far = 100.0, aspect = 1.0): RawMatrix4 {\n  const p = 1.0 / Math.tan((fov * Math.PI) / 360.0);\n  const d = far - near;\n  return [\n    p / aspect,\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    p,\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    -(far + near) / d,\n    -1.0,\n    0.0,\n    0.0,\n    (-2 * far * near) / d,\n    0.0,\n  ];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d rotation matrix, rotates around x axis.\n */\nexport function mat4RotationX(theta: number): RawMatrix4 {\n  const c = Math.cos(theta);\n  const s = Math.sin(theta);\n\n  return [1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d rotation matrix, rotates around y axis.\n */\nexport function mat4RotationY(theta: number): RawMatrix4 {\n  const c = Math.cos(theta);\n  const s = Math.sin(theta);\n\n  return [c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d rotation matrix, rotates around z axis.\n */\nexport function mat4RotationZ(theta: number): RawMatrix4 {\n  const c = Math.cos(theta);\n  const s = Math.sin(theta);\n\n  return [c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d scaling matrix.\n */\nexport function mat4Scale(vec: RawVector3): RawMatrix4 {\n  return [vec[0], 0, 0, 0, 0, vec[1], 0, 0, 0, 0, vec[2], 0, 0, 0, 0, 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d scaling matrix by a scalar.\n */\nexport function mat4ScaleScalar(scalar: number): RawMatrix4 {\n  return [scalar, 0, 0, 0, 0, scalar, 0, 0, 0, 0, scalar, 0, 0, 0, 0, 1];\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a translation matrix.\n */\nexport function mat4Translate(vec: RawVector3): RawMatrix4 {\n  return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, vec[0], vec[1], vec[2], 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Transpose a mat4.\n */\nexport function mat4Transpose(m: RawMatrix4): RawMatrix4 {\n  return [\n    m[0],\n    m[4],\n    m[8],\n    m[12],\n    m[1],\n    m[5],\n    m[9],\n    m[13],\n    m[2],\n    m[6],\n    m[10],\n    m[14],\n    m[3],\n    m[7],\n    m[11],\n    m[15],\n  ];\n}\n", "import { Matrix3 } from '../mat3/Matrix3';\nimport { Quaternion } from '../quat/Quaternion';\nimport { vecScale } from '../vec/vecScale';\nimport { Vector3 } from '../vec3/Vector3';\nimport { mat4Compose } from './mat4Compose';\nimport { mat4Decompose } from './mat4Decompose';\nimport { mat4Determinant } from './mat4Determinant';\nimport { mat4FromMat3 } from './mat4FromMat3';\nimport { mat4FromQuaternion } from './mat4FromQuaternion';\nimport { mat4Inverse } from './mat4Inverse';\nimport { mat4LookAt } from './mat4LookAt';\nimport { mat4LookAtInverse } from './mat4LookAtInverse';\nimport { mat4Multiply } from './mat4Multiply';\nimport { mat4Perspective } from './mat4Perspective';\nimport { mat4RotationX } from './mat4RotationX';\nimport { mat4RotationY } from './mat4RotationY';\nimport { mat4RotationZ } from './mat4RotationZ';\nimport { mat4Scale } from './mat4Scale';\nimport { mat4ScaleScalar } from './mat4ScaleScalar';\nimport { mat4Translate } from './mat4Translate';\nimport { mat4Transpose } from './mat4Transpose';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n// biome-ignore format: matrix\nconst rawIdentityMatrix4: RawMatrix4 = [\n  1.0, 0.0, 0.0, 0.0,\n  0.0, 1.0, 0.0, 0.0,\n  0.0, 0.0, 1.0, 0.0,\n  0.0, 0.0, 0.0, 1.0,\n];\n\n/**\n * A Matrix4.\n */\nexport class Matrix4 {\n  public elements: RawMatrix4;\n\n  public constructor(v: RawMatrix4 = rawIdentityMatrix4) {\n    this.elements = v;\n  }\n\n  /**\n   * Itself but transposed.\n   */\n  public get transpose(): Matrix4 {\n    return new Matrix4(mat4Transpose(this.elements));\n  }\n\n  /**\n   * Its determinant.\n   */\n  public get determinant(): number {\n    return mat4Determinant(this.elements);\n  }\n\n  /**\n   * Itself but inverted.\n   */\n  public get inverse(): Matrix4 {\n    return new Matrix4(mat4Inverse(this.elements));\n  }\n\n  /**\n   * Itself but matrix3.\n   */\n  public get matrix3(): Matrix3 {\n    return Matrix3.fromMatrix4(this);\n  }\n\n  /**\n   * Itself but normal matrix.\n   */\n  public get normalMatrix(): Matrix3 {\n    return Matrix3.createNormalMatrix(this);\n  }\n\n  public toString(): string {\n    const m = this.elements.map((v) => v.toFixed(3));\n    return `Matrix4( ${m[0]}, ${m[4]}, ${m[8]}, ${m[12]}; ${m[1]}, ${m[5]}, ${m[9]}, ${m[13]}; ${m[2]}, ${m[6]}, ${m[10]}, ${m[14]}; ${m[3]}, ${m[7]}, ${m[11]}, ${m[15]} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Matrix4 {\n    return new Matrix4(this.elements.concat() as RawMatrix4);\n  }\n\n  /**\n   * Multiply this Matrix4 by one or more Matrix4s.\n   */\n  public multiply(...matrices: Matrix4[]): Matrix4 {\n    return Matrix4.multiply(this, ...matrices);\n  }\n\n  /**\n   * Multiply this Matrix4 by a scalar.\n   */\n  public scaleScalar(scalar: number): Matrix4 {\n    return new Matrix4(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * Decompose this matrix into a position, a scale, and a rotation.\n   */\n  public decompose(): {\n    position: Vector3;\n    scale: Vector3;\n    rotation: Quaternion;\n  } {\n    const { position, scale, rotation } = mat4Decompose(this.elements);\n\n    return {\n      position: new Vector3(position),\n      scale: new Vector3(scale),\n      rotation: new Quaternion(rotation),\n    };\n  }\n\n  /**\n   * An identity Matrix4.\n   */\n  public static get identity(): Matrix4 {\n    return new Matrix4(rawIdentityMatrix4);\n  }\n\n  /**\n   * Multiply two or more matrices.\n   * @param matrices Matrices\n   */\n  public static multiply(...matrices: Matrix4[]): Matrix4 {\n    if (matrices.length === 0) {\n      return Matrix4.identity;\n    } else {\n      return new Matrix4(mat4Multiply(...matrices.map((m) => m.elements)));\n    }\n  }\n\n  /**\n   * Create a matrix out of a {@link Quaternion}.\n   * @param quaternion A quaternion\n   */\n  public static fromQuaternion(quaternion: Quaternion): Matrix4 {\n    return new Matrix4(mat4FromQuaternion(quaternion.elements));\n  }\n\n  /**\n   * Cast a {@link Matrix3} into a Matrix4.\n   * @param matrix3 A matrix3\n   */\n  public static fromMatrix3(matrix3: Matrix3): Matrix4 {\n    return new Matrix4(mat4FromMat3(matrix3.elements));\n  }\n\n  /**\n   * Generate a translation matrix.\n   * @param vector Translation\n   */\n  public static translate(vector: Vector3): Matrix4 {\n    return new Matrix4(mat4Translate(vector.elements));\n  }\n\n  /**\n   * Generate a 3d scaling matrix.\n   * @param vector Scale\n   */\n  public static scale(vector: Vector3): Matrix4 {\n    return new Matrix4(mat4Scale(vector.elements));\n  }\n\n  /**\n   * Generate a 3d scaling matrix by a scalar.\n   * @param vector Scale\n   */\n  public static scaleScalar(scalar: number): Matrix4 {\n    return new Matrix4(mat4ScaleScalar(scalar));\n  }\n\n  /**\n   * Generate a 3d rotation matrix, rotates around x axis.\n   * @param vector Scale\n   */\n  public static rotationX(theta: number): Matrix4 {\n    return new Matrix4(mat4RotationX(theta));\n  }\n\n  /**\n   * Generate a 3d rotation matrix, rotates around y axis.\n   * @param vector Scale\n   */\n  public static rotationY(theta: number): Matrix4 {\n    return new Matrix4(mat4RotationY(theta));\n  }\n\n  /**\n   * Generate a 3d rotation matrix, rotates around z axis.\n   * @param vector Scale\n   */\n  public static rotationZ(theta: number): Matrix4 {\n    return new Matrix4(mat4RotationZ(theta));\n  }\n\n  /**\n   * Generate a \"LookAt\" matrix.\n   *\n   * See also: {@link lookAtInverse}\n   */\n  public static lookAt(\n    position: Vector3,\n    target = new Vector3([0.0, 0.0, 0.0]),\n    up = new Vector3([0.0, 1.0, 0.0]),\n    roll = 0.0,\n  ): Matrix4 {\n    return new Matrix4(mat4LookAt(position.elements, target.elements, up.elements, roll));\n  }\n\n  /**\n   * Generate an inverse of \"LookAt\" matrix. Good for creating a view matrix.\n   *\n   * See also: {@link lookAt}\n   */\n  public static lookAtInverse(\n    position: Vector3,\n    target = new Vector3([0.0, 0.0, 0.0]),\n    up = new Vector3([0.0, 1.0, 0.0]),\n    roll = 0.0,\n  ): Matrix4 {\n    return new Matrix4(mat4LookAtInverse(position.elements, target.elements, up.elements, roll));\n  }\n\n  /**\n   * Generate a \"Perspective\" projection matrix.\n   * It won't include aspect!\n   */\n  public static perspective(fov = 45.0, near = 0.01, far = 100.0): Matrix4 {\n    return new Matrix4(mat4Perspective(fov, near, far));\n  }\n\n  /**\n   * Compose a matrix out of position, scale, and rotation.\n   * Yoinked from Three.js.\n   */\n  public static compose(position: Vector3, rotation: Quaternion, scale: Vector3): Matrix4 {\n    return new Matrix4(mat4Compose(position.elements, rotation.elements, scale.elements));\n  }\n}\n", "/**\n * Return an squared euclidean length of given vector.\n */\nexport function vecLengthSq<T extends number[]>(vec: T): number {\n  return vec.reduce((sum, v) => sum + v * v, 0.0);\n}\n", "/**\n * Return a vector with the absolute of each component of the given vector.\n */\nexport function vecAbs<T extends number[]>(vec: T): T {\n  return vec.map((v) => Math.abs(v)) as T;\n}\n", "/**\n * Divide a vector by a vector.\n */\nexport function vecDivide<T extends number[]>(vecA: T, vecB: T): T {\n  return vecA.map((v, i) => v / vecB[i]) as T;\n}\n", "/**\n * Return a linear interpolation of two vectors.\n * The {@link t} won't be clamped.\n *\n * @param vecA - A vector\n * @param vecB - Another vector\n * @param t - A number interpolating two vectors. Usually in range [0, 1] but not clamped\n */\nexport function vecLerp<T extends number[]>(vecA: T, vecB: T, t: number): T {\n  return vecA.map((v, i) => v + (vecB[i] - v) * t) as T;\n}\n", "/**\n * Return a manhattan length of given vector.\n */\nexport function vecManhattanLength<T extends number[]>(vec: T): number {\n  return vec.reduce((sum, v) => sum + Math.abs(v), 0.0);\n}\n", "/**\n * Return a product of vectors.\n */\nexport function vecMultiply<T extends number[]>(...vecs: T[]): T {\n  if (vecs.length < 2) {\n    return vecs[0];\n  }\n\n  const a = vecs.shift()!;\n  const b = vecMultiply(...vecs);\n\n  return a.map((v, i) => v * b[i]) as T;\n}\n", "/**\n * Negate a vector.\n */\nexport function vecNeg<T extends number[]>(vec: T): T {\n  return vec.map((v) => -v) as T;\n}\n", "import { vecAbs } from './vecAbs';\nimport { vecAdd } from './vecAdd';\nimport { vecDivide } from './vecDivide';\nimport { vecDot } from './vecDot';\nimport { vecLength } from './vecLength';\nimport { vecLengthSq } from './vecLengthSq';\nimport { vecLerp } from './vecLerp';\nimport { vecManhattanLength } from './vecManhattanLength';\nimport { vecMultiply } from './vecMultiply';\nimport { vecNeg } from './vecNeg';\nimport { vecNormalize } from './vecNormalize';\nimport { vecScale } from './vecScale';\nimport { vecSub } from './vecSub';\n\n/**\n * A Vector.\n */\nexport abstract class Vector<T extends Vector<T>> {\n  public abstract elements: number[];\n\n  /**\n   * The length of this.\n   * a.k.a. `magnitude`\n   */\n  public get length(): number {\n    return vecLength(this.elements);\n  }\n\n  /**\n   * The squared length of this.\n   */\n  public get lengthSq(): number {\n    return vecLengthSq(this.elements);\n  }\n\n  /**\n   * The manhattan length of this.\n   */\n  public get manhattanLength(): number {\n    return vecManhattanLength(this.elements);\n  }\n\n  /**\n   * A normalized Vector3 of this.\n   */\n  public get normalized(): T {\n    return this.__new(vecNormalize(this.elements));\n  }\n\n  /**\n   * This but negated.\n   */\n  public get negated(): T {\n    return this.__new(vecNeg(this.elements));\n  }\n\n  /**\n   * This but each component is the absolute.\n   */\n  public get abs(): T {\n    return this.__new(vecAbs(this.elements));\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): T {\n    return this.__new(this.elements.concat());\n  }\n\n  /**\n   * Add one or more Vector into this.\n   * @param vectors Other Vectors\n   */\n  public add(...vectors: T[]): T {\n    return this.__new(vecAdd(this.elements, ...vectors.map((v) => v.elements)));\n  }\n\n  /**\n   * Substract this from another Vector.\n   * @param v Another vector\n   */\n  public sub(vector: T): T {\n    return this.__new(vecSub(this.elements, vector.elements));\n  }\n\n  /**\n   * Multiply one or more Vector with this.\n   * @param vectors Other Vectors\n   */\n  public multiply(...vectors: T[]): T {\n    return this.__new(vecMultiply(this.elements, ...vectors.map((v) => v.elements)));\n  }\n\n  /**\n   * Divide this from another Vector.\n   * @param vector Another Vector\n   */\n  public divide(vector: T): T {\n    return this.__new(vecDivide(this.elements, vector.elements));\n  }\n\n  /**\n   * Scale this by scalar.\n   * a.k.a. `multiplyScalar`\n   * @param scalar A scalar\n   */\n  public scale(scalar: number): T {\n    return this.__new(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * Linearly interpolate the vector with another vector.\n   * The {@link t} won't be clamped.\n   *\n   * @param vector - Another vector\n   * @param t - A number interpolating two vectors. Usually in range [0, 1] but not clamped\n   */\n  public lerp(vector: T, t: number): T {\n    return this.__new(vecLerp(this.elements, vector.elements, t));\n  }\n\n  /**\n   * Dot two Vectors.\n   * @param vector Another vector\n   */\n  public dot(vector: T): number {\n    return vecDot(this.elements, vector.elements);\n  }\n\n  protected abstract __new(v: number[]): T;\n}\n", "import { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from '../vec3';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst EPSILON = 1e-6;\n\n/**\n * Return an exponential map of a quaternion.\n */\nexport function quatExp(quat: RawQuaternion): RawQuaternion {\n  const [x, y, z, w] = quat;\n  const v: RawVector3 = [x, y, z];\n\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0, Math.exp(w)];\n  }\n\n  return vecScale([...vecScale(v, Math.sin(vl) / vl), Math.cos(vl)], Math.exp(w));\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of axis and angle.\n * Assumes axis is normalized.\n */\nexport function quatFromAxisAngle(axis: RawVector3, angle: number): RawQuaternion {\n  const halfAngle = angle / 2.0;\n  const sinHalfAngle = Math.sin(halfAngle);\n  return [\n    axis[0] * sinHalfAngle,\n    axis[1] * sinHalfAngle,\n    axis[2] * sinHalfAngle,\n    Math.cos(halfAngle),\n  ];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Return an inverse of a quaternion.\n */\nexport function quatInverse(quat: RawQuaternion): RawQuaternion {\n  return [-quat[0], -quat[1], -quat[2], quat[3]];\n}\n", "import { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from '../vec3';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst EPSILON = 1e-6;\n\n/**\n * Return a logarithm map of a quaternion.\n */\nexport function quatLog(quat: RawQuaternion): RawQuaternion {\n  const [x, y, z, w] = quat;\n  const v: RawVector3 = [x, y, z];\n\n  const ql = vecLength(quat);\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0, Math.log(ql)];\n  }\n\n  return [...vecScale(v, Math.acos(w / ql) / vl), Math.log(ql)];\n}\n", "import { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst EPSILON = 1e-6;\n\n/**\n * Return a logarithm map of a quaternion as a vec3.\n */\nexport function quatLogVec3(quat: RawQuaternion): RawVector3 {\n  const [x, y, z, w] = quat;\n  const v: RawVector3 = [x, y, z];\n\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0];\n  }\n\n  return vecScale(v, Math.acos(w) / vl);\n}\n", "import { vecDot } from '../vec/vecDot';\nimport { vecNeg } from '../vec/vecNeg';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from './RawVector3';\nimport { vec3Cross } from './vec3Cross';\n\n/**\n * Return a tangent which is orthogonal to normal.\n * If binormal is specified, it is also returned and it's orthogonal to both normal and tangent.\n */\nexport function vec3OrthoNormalize(\n  normal: RawVector3,\n  tangent: RawVector3 = [0.0, 1.0, 0.0],\n  binormal?: RawVector3,\n): {\n  normal: RawVector3;\n  tangent: RawVector3;\n  binormal: RawVector3;\n} {\n  const n = vecNormalize(normal);\n  let t = vecNormalize(tangent);\n\n  let dotNT = vecDot(n, t);\n\n  if (dotNT === 1.0) {\n    if (Math.abs(n[1]) > Math.abs(n[2])) {\n      t = [0.0, 0.0, 1.0];\n    } else {\n      t = [0.0, 1.0, 0.0];\n    }\n    dotNT = vecDot(n, t);\n  }\n\n  t = vecNormalize(vecSub(t, vecScale(n, dotNT)));\n\n  let b = vec3Cross(t, n);\n  if (binormal && vecDot(b, binormal) < 0.0) {\n    b = vecNeg(b);\n  }\n\n  return {\n    normal: n,\n    tangent: t,\n    binormal: b,\n  };\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3OrthoNormalize } from '../vec3/vec3OrthoNormalize';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Return a quaternion which looks at the direction of `look`.\n */\nexport function quatLookRotation(look: RawVector3, up?: RawVector3): RawQuaternion {\n  const { normal, tangent, binormal } = vec3OrthoNormalize(look, up ?? [0.0, 1.0, 0.0]);\n\n  const w = Math.sqrt(1.0 + binormal[0] + tangent[1] + normal[2]) * 0.5;\n  const invW4 = 0.25 / w;\n\n  return [\n    (tangent[2] - normal[1]) * invW4,\n    (normal[0] - binormal[2]) * invW4,\n    (binormal[1] - tangent[0]) * invW4,\n    w,\n  ];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Return a multiplication result of quaternions.\n */\nexport function quatMultiply(...quats: RawQuaternion[]): RawQuaternion {\n  if (quats.length < 2) {\n    return quats[0];\n  }\n\n  const a = quats.shift()!;\n  const b = quatMultiply(...quats);\n\n  return [\n    a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n    a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n    a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n    a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n  ];\n}\n", "import { vecDot } from '../vec/vecDot';\nimport { vecLerp } from '../vec/vecLerp';\nimport { vecNeg } from '../vec/vecNeg';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Interpolate between two quaternions using normalized lerp.\n * When the dot product of the two quaternions is negative, the second quaternion is negated to ensure the shortest path is taken.\n *\n * This should behave the same as Unity's `Quaternion.LerpUnclamped`.\n *\n * @param a - \"from\" quaternion\n * @param b - \"to\" quaternion\n * @param t - How much do we want to rotate the a to b\n * @returns The interpolated quaternion\n */\nexport function quatNlerp(a: RawQuaternion, b: RawQuaternion, t: number): RawQuaternion {\n  const bt = vecDot(a, b) < 0 ? vecNeg(b) : b;\n  return vecNormalize(vecLerp(a, bt, t));\n}\n", "import { vecLength } from '../vec/vecLength';\nimport { vecScale } from '../vec/vecScale';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Normalize given quaternion.\n *\n * It's almost identical as {@link vecNormalize},\n * but it will return an identity quaternion instead\n * when it recieves a quaternion which length is zero.\n */\nexport function quatNormalize(vec: RawQuaternion): RawQuaternion {\n  const len = vecLength(vec);\n  if (len === 0.0) {\n    return [0.0, 0.0, 0.0, 1.0];\n  }\n  return vecScale(vec, 1.0 / len);\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a quaternion rotates around x axis.\n * @param theta An angle around x axis, in degree\n */\nexport function quatRotationX(theta: number): RawQuaternion {\n  return [Math.sin(theta / 2.0), 0.0, 0.0, Math.cos(theta / 2.0)];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a quaternion rotates around y axis.\n * @param theta An angle around y axis, in degree\n */\nexport function quatRotationY(theta: number): RawQuaternion {\n  return [0.0, Math.sin(theta / 2.0), 0.0, Math.cos(theta / 2.0)];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a quaternion rotates around z axis.\n * @param theta An angle around z axis, in degree\n */\nexport function quatRotationZ(theta: number): RawQuaternion {\n  return [0.0, 0.0, Math.sin(theta / 2.0), Math.cos(theta / 2.0)];\n}\n", "import { vecDot, vecNeg, vecNormalize } from '..';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Interpolate between two quaternions using spherical lerp.\n *\n * @param a - \"from\" quaternion\n * @param b - \"to\" quaternion\n * @param t - How much do we want to rotate the a to b\n * @returns The interpolated quaternion\n */\nexport function quatSlerp(a: RawQuaternion, b: RawQuaternion, t: number): RawQuaternion {\n  if (t === 0.0) {\n    return a.concat() as RawQuaternion;\n  }\n  if (t === 1.0) {\n    return b.concat() as RawQuaternion;\n  }\n\n  // Ref: https://github.com/mrdoob/three.js/blob/master/src/math/Quaternion.js\n  // Ref: http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n  let cosHalfTheta = vecDot(a, b);\n\n  if (cosHalfTheta < 0.0) {\n    b = vecNeg(b);\n    cosHalfTheta = -cosHalfTheta;\n  }\n\n  // I think you two are same\n  if (cosHalfTheta >= 1.0) {\n    return a.concat() as RawQuaternion;\n  }\n\n  const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n  // fallback to simple lerp\n  if (sqrSinHalfTheta <= Number.EPSILON) {\n    const s = 1.0 - t;\n\n    return vecNormalize([\n      s * a[0] + t * b[0],\n      s * a[1] + t * b[1],\n      s * a[2] + t * b[2],\n      s * a[3] + t * b[3],\n    ]);\n  }\n\n  // welcome\n  const sinHalfTheta = Math.sqrt(sqrSinHalfTheta);\n  const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);\n  const ratioA = Math.sin((1.0 - t) * halfTheta) / sinHalfTheta;\n  const ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n\n  return [\n    a[0] * ratioA + b[0] * ratioB,\n    a[1] * ratioA + b[1] * ratioB,\n    a[2] * ratioA + b[2] * ratioB,\n    a[3] * ratioA + b[3] * ratioB,\n  ];\n}\n", "import { Matrix4 } from '../mat4/Matrix4';\nimport { mat4FromQuaternion } from '../mat4/mat4FromQuaternion';\nimport { vecLength } from '../vec/vecLength';\nimport { vecLengthSq } from '../vec/vecLengthSq';\nimport { Vector3 } from '../vec3/Vector3';\nimport { quatExp } from './quatExp';\nimport { quatFromAxisAngle } from './quatFromAxisAngle';\nimport { quatFromMatrix4 } from './quatFromMatrix4';\nimport { quatInverse } from './quatInverse';\nimport { quatLog } from './quatLog';\nimport { quatLogVec3 } from './quatLogVec3';\nimport { quatLookRotation } from './quatLookRotation';\nimport { quatMultiply } from './quatMultiply';\nimport { quatNlerp } from './quatNlerp';\nimport { quatNormalize } from './quatNormalize';\nimport { quatRotationX } from './quatRotationX';\nimport { quatRotationY } from './quatRotationY';\nimport { quatRotationZ } from './quatRotationZ';\nimport { quatSlerp } from './quatSlerp';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst rawIdentityQuaternion: RawQuaternion = [0.0, 0.0, 0.0, 1.0];\n\n/**\n * A Quaternion.\n */\nexport class Quaternion {\n  public elements: RawQuaternion; // [ x, y, z; w ]\n\n  public constructor(elements: RawQuaternion = rawIdentityQuaternion) {\n    this.elements = elements;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  /**\n   * An y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  /**\n   * An z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  /**\n   * An w component of this.\n   */\n  public get w(): number {\n    return this.elements[3];\n  }\n\n  public toString(): string {\n    return `Quaternion( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)}, ${this.w.toFixed(3)} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Quaternion {\n    return new Quaternion(this.elements.concat() as RawQuaternion);\n  }\n\n  /**\n   * Itself but converted into a Matrix4.\n   */\n  public get matrix4(): Matrix4 {\n    return new Matrix4(mat4FromQuaternion(this.elements));\n  }\n\n  /**\n   * An inverse of this.\n   */\n  public get inversed(): Quaternion {\n    return new Quaternion(quatInverse(this.elements));\n  }\n\n  /**\n   * The length of this.\n   */\n  public get length(): number {\n    return vecLength(this.elements);\n  }\n\n  /**\n   * The squared length of this.\n   */\n  public get lengthSq(): number {\n    return vecLengthSq(this.elements);\n  }\n\n  /**\n   * A normalized this.\n   */\n  public get normalized(): Quaternion {\n    return new Quaternion(quatNormalize(this.elements));\n  }\n\n  /**\n   * An exponential map of this.\n   */\n  public get exp(): Quaternion {\n    return new Quaternion(quatExp(this.elements));\n  }\n\n  /**\n   * A logarithm map of this.\n   */\n  public get log(): Quaternion {\n    return new Quaternion(quatLog(this.elements));\n  }\n\n  /**\n   * A logarithm map of this as a Vector3.\n   */\n  public get logVec3(): Vector3 {\n    return new Vector3(quatLogVec3(this.elements));\n  }\n\n  /**\n   * Multiply one or more Quaternions with this.\n   * @param quaternions Other Quaternions\n   */\n  public multiply(...quaternions: Quaternion[]): Quaternion {\n    return Quaternion.multiply(this, ...quaternions);\n  }\n\n  /**\n   * Interpolate between this and given quaternion using normalized lerp.\n   * When the dot product of the two quaternions is negative, the given quaternion is negated to ensure the shortest path is taken.\n   *\n   * This should behave the same as Unity's `Quaternion.LerpUnclamped`.\n   *\n   * @param b - \"to\" quaternion\n   * @param t - How much do we want to rotate this to b\n   * @returns The interpolated quaternion\n   */\n  public nlerp(b: Quaternion, t: number): Quaternion {\n    return Quaternion.nlerp(this, b, t);\n  }\n\n  /**\n   * Interpolate between this and given quaternion using spherical lerp.\n   *\n   * @param b - Another Quaternion\n   * @param t - How much do we want to rotate this to b\n   * @returns The interpolated quaternion\n   */\n  public slerp(b: Quaternion, t: number): Quaternion {\n    return Quaternion.slerp(this, b, t);\n  }\n\n  /**\n   * An identity Quaternion.\n   */\n  public static get identity(): Quaternion {\n    return new Quaternion(rawIdentityQuaternion);\n  }\n\n  /**\n   * Multiply two or more quaternions.\n   * @param quaternion Quaternions\n   */\n  public static multiply(...quaternions: Quaternion[]): Quaternion {\n    if (quaternions.length === 0) {\n      return Quaternion.identity;\n    } else {\n      return new Quaternion(quatMultiply(...quaternions.map((q) => q.elements)));\n    }\n  }\n\n  /**\n   * Interpolate between two quaternions using normalized lerp.\n   * When the dot product of the two quaternions is negative, the second quaternion is negated to ensure the shortest path is taken.\n   *\n   * This should behave the same as Unity's `Quaternion.LerpUnclamped`.\n   *\n   * @param a - \"from\" quaternion\n   * @param b - \"to\" quaternion\n   * @param t - How much do we want to rotate the a to b\n   * @returns The interpolated quaternion\n   */\n  public static nlerp(a: Quaternion, b: Quaternion, t: number): Quaternion {\n    return new Quaternion(quatNlerp(a.elements, b.elements, t));\n  }\n\n  /**\n   * Interpolate between two quaternions using spherical lerp.\n   *\n   * @param a - \"from\" quaternion\n   * @param b - \"to\" quaternion\n   * @param t - How much do we want to rotate the a to b\n   * @returns The interpolated quaternion\n   */\n  public static slerp(a: Quaternion, b: Quaternion, t: number): Quaternion {\n    return new Quaternion(quatSlerp(a.elements, b.elements, t));\n  }\n\n  /**\n   * Return a quaternion which rotates around x axis.\n   * @param theta An angle around x axis, in degree\n   */\n  public static rotationX(theta: number): Quaternion {\n    return new Quaternion(quatRotationX(theta));\n  }\n\n  /**\n   * Return a quaternion which rotates around y axis.\n   * @param theta An angle around y axis, in degree\n   */\n  public static rotationY(theta: number): Quaternion {\n    return new Quaternion(quatRotationY(theta));\n  }\n\n  /**\n   * Return a quaternion which rotates around z axis.\n   * @param theta An angle around z axis, in degree\n   */\n  public static rotationZ(theta: number): Quaternion {\n    return new Quaternion(quatRotationZ(theta));\n  }\n\n  /**\n   * Return a quaternion which looks at the direction of `look`.\n   * @param look Position where the quaternion will look at\n   * @param up The \"up vector\"\n   */\n  public static lookRotation(look: Vector3, up: Vector3): Quaternion {\n    return new Quaternion(quatLookRotation(look.elements, up.elements));\n  }\n\n  /**\n   * Generate a Quaternion out of angle and axis.\n   */\n  public static fromAxisAngle(axis: Vector3, angle: number): Quaternion {\n    return new Quaternion(quatFromAxisAngle(axis.elements, angle));\n  }\n\n  /**\n   * Generate a Quaternion out of a rotation matrix.\n   */\n  public static fromMatrix4(matrix: Matrix4): Quaternion {\n    return new Quaternion(quatFromMatrix4(matrix.elements));\n  }\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawVector3 } from './RawVector3';\n\n/**\n * Apply a 3x3 matrix to a vec3.\n */\nexport function vec3ApplyMatrix3(v: RawVector3, m: RawMatrix3): RawVector3 {\n  return [\n    m[0] * v[0] + m[3] * v[1] + m[6] * v[2],\n    m[1] * v[0] + m[4] * v[1] + m[7] * v[2],\n    m[2] * v[0] + m[5] * v[1] + m[8] * v[2],\n  ];\n}\n", "import type { RawMatrix4 } from '../mat4';\nimport type { RawVector4 } from './RawVector4';\n\n/**\n * Multiply a vec4 by a mat4.\n */\nexport function vec4ApplyMatrix4(v: RawVector4, m: RawMatrix4): RawVector4 {\n  return [\n    m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12] * v[3],\n    m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13] * v[3],\n    m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14] * v[3],\n    m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3],\n  ];\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { vecScale } from '../vec/vecScale';\nimport { vec4ApplyMatrix4 } from '../vec4/vec4ApplyMatrix4';\nimport type { RawVector3 } from './RawVector3';\n\n/**\n * Apply a 4x4 matrix to a vec3 (with an implicit 1 in the 4th dimension).\n */\nexport function vec3ApplyMatrix4(v: RawVector3, m: RawMatrix4): RawVector3 {\n  const vec4 = vec4ApplyMatrix4([...v, 1], m);\n  const xyz: RawVector3 = [vec4[0], vec4[1], vec4[2]];\n  const w = vec4[3];\n  return vecScale(xyz, 1.0 / w);\n}\n", "import { quatInverse } from '../quat/quatInverse';\nimport { quatMultiply } from '../quat/quatMultiply';\nimport type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawVector3 } from './RawVector3';\n\n/**\n * Apply a vec3 (with an implicit 1 in the 4th dimension) a quaternion.\n */\nexport function vec3ApplyQuaternion(vec: RawVector3, quat: RawQuaternion): RawVector3 {\n  const p: RawQuaternion = [...vec, 0.0];\n  const r = quatInverse(quat);\n  const res = quatMultiply(quat, p, r);\n  res.pop();\n  return res as unknown as RawVector3;\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from './RawVector3';\n\nconst EPSILON = 1e-6;\n\n/**\n * Treating the given vec3 as a quaternion with w = 0, return its exponential map.\n */\nexport function vec3QuatExp(v: RawVector3): RawQuaternion {\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0, 1.0];\n  }\n\n  return [...vecScale(v, Math.sin(vl) / vl), Math.cos(vl)];\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Quaternion } from '../quat/Quaternion';\nimport { Vector } from '../vec/Vector';\nimport type { RawVector3 } from './RawVector3';\nimport { vec3ApplyMatrix3 } from './vec3ApplyMatrix3';\nimport { vec3ApplyMatrix4 } from './vec3ApplyMatrix4';\nimport { vec3ApplyQuaternion } from './vec3ApplyQuaternion';\nimport { vec3Cross } from './vec3Cross';\nimport { vec3OrthoNormalize } from './vec3OrthoNormalize';\nimport { vec3QuatExp } from './vec3QuatExp';\n\n/**\n * A Vector3.\n */\nexport class Vector3 extends Vector<Vector3> {\n  public elements: RawVector3;\n\n  public constructor(v: RawVector3 = [0.0, 0.0, 0.0]) {\n    super();\n    this.elements = v;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  public set x(x: number) {\n    this.elements[0] = x;\n  }\n\n  /**\n   * An y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  public set y(y: number) {\n    this.elements[1] = y;\n  }\n\n  /**\n   * An z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  public set z(z: number) {\n    this.elements[2] = z;\n  }\n\n  public toString(): string {\n    return `Vector3( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)} )`;\n  }\n\n  /**\n   * Return a cross of this and another Vector3.\n   * @param vector Another vector\n   */\n  public cross(vector: Vector3): Vector3 {\n    return new Vector3(vec3Cross(this.elements, vector.elements));\n  }\n\n  /**\n   * Rotate this vector using a Quaternion.\n   * @param quaternion A quaternion\n   */\n  public applyQuaternion(quaternion: Quaternion): Vector3 {\n    return new Vector3(vec3ApplyQuaternion(this.elements, quaternion.elements));\n  }\n\n  /**\n   * Apply a 3x3 matrix to this vector.\n   */\n  public applyMatrix3(matrix: Matrix3): Vector3 {\n    return new Vector3(vec3ApplyMatrix3(this.elements, matrix.elements));\n  }\n\n  /**\n   * Apply a 4x4 matrix to this vector (with an implicit 1 in the 4th dimension).\n   */\n  public applyMatrix4(matrix: Matrix4): Vector3 {\n    return new Vector3(vec3ApplyMatrix4(this.elements, matrix.elements));\n  }\n\n  /**\n   * Treating this as a quaternion with w = 0, an exponential map of the quaternion.\n   */\n  public get quatExp(): Quaternion {\n    return new Quaternion(vec3QuatExp(this.elements));\n  }\n\n  protected __new(v: RawVector3): Vector3 {\n    return new Vector3(v);\n  }\n\n  /**\n   * Vector3( 0.0, 0.0, 0.0 )\n   */\n  public static get zero(): Vector3 {\n    return new Vector3([0.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 1.0, 0.0, 0.0 )\n   */\n  public static get px(): Vector3 {\n    return new Vector3([1.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector3( -1.0, 0.0, 0.0 )\n   */\n  public static get nx(): Vector3 {\n    return new Vector3([-1.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 0.0, 1.0, 0.0 )\n   */\n  public static get py(): Vector3 {\n    return new Vector3([0.0, 1.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 0.0, -1.0, 0.0 )\n   */\n  public static get ny(): Vector3 {\n    return new Vector3([0.0, -1.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 0.0, 0.0, 1.0 )\n   */\n  public static get pz(): Vector3 {\n    return new Vector3([0.0, 0.0, 1.0]);\n  }\n\n  /**\n   * Vector3( 0.0, 0.0, -1.0 )\n   */\n  public static get nz(): Vector3 {\n    return new Vector3([0.0, 0.0, -1.0]);\n  }\n\n  /**\n   * Vector3( 1.0, 1.0, 1.0 )\n   */\n  public static get one(): Vector3 {\n    return new Vector3([1.0, 1.0, 1.0]);\n  }\n\n  /**\n   * Return a tangent which is orthogonal to normal.\n   * If binormal is specified, it is also returned and it's orthogonal to both normal and tangent.\n   */\n  public static orthoNormalize(\n    normal: Vector3,\n    tangent: Vector3,\n    binormal: Vector3,\n  ): {\n    normal: Vector3;\n    tangent: Vector3;\n    binormal: Vector3;\n  } {\n    const result = vec3OrthoNormalize(normal.elements, tangent.elements, binormal.elements);\n    return {\n      normal: new Vector3(result.normal),\n      tangent: new Vector3(result.tangent),\n      binormal: new Vector3(result.binormal),\n    };\n  }\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawBox3 } from './RawBox3';\n\n/**\n * Test if given point is contained in given box or not.\n * @param box A box\n * @param point A point\n */\nexport function box3ContainsPoint(box: RawBox3, point: RawVector3): boolean {\n  return (\n    box[0][0] <= point[0] &&\n    box[1][0] >= point[0] &&\n    box[0][1] <= point[1] &&\n    box[1][1] >= point[1] &&\n    box[0][2] <= point[2] &&\n    box[1][2] >= point[2]\n  );\n}\n", "import { Vector3 } from '../vec3/Vector3';\nimport { box3ContainsPoint } from './box3ContainsPoint';\nimport type { RawBox3 } from './RawBox3';\n\n/**\n * A 3D box.\n */\nexport class Box3 {\n  public min: Vector3;\n  public max: Vector3;\n\n  public constructor(min: Vector3 = Vector3.zero, max: Vector3 = Vector3.zero) {\n    this.min = min;\n    this.max = max;\n  }\n\n  /**\n   * Itself but {@link RawBox3} form.\n   */\n  public get raw(): RawBox3 {\n    return [this.min.elements, this.max.elements];\n  }\n\n  /**\n   * Test if given point is contained in the box or not.\n   *\n   * @param point A point\n   */\n  public containsPoint(point: Vector3): boolean {\n    return box3ContainsPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Convert {@link RawBox3} to class form.\n   * @param box A {@link RawBox3}\n   */\n  public static fromRaw(box: RawBox3): Box3 {\n    return new Box3(new Vector3(box[0]), new Vector3(box[1]));\n  }\n}\n", "import type { EulerOrder } from '../euler/EulerOrder';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of euler angles.\n */\nexport function quatFromEuler(euler: RawVector3, order?: EulerOrder): RawQuaternion {\n  const [i, j, k, sign] =\n    !order || order === 'XYZ'\n      ? [0, 1, 2, 1]\n      : order === 'XZY'\n        ? [0, 2, 1, -1]\n        : order === 'YXZ'\n          ? [1, 0, 2, -1]\n          : order === 'YZX'\n            ? [1, 2, 0, 1]\n            : order === 'ZXY'\n              ? [2, 0, 1, 1]\n              : [2, 1, 0, -1];\n\n  const ti = 0.5 * euler[i];\n  const tj = 0.5 * sign * euler[j];\n  const tk = 0.5 * euler[k];\n\n  const ci = Math.cos(ti);\n  const cj = Math.cos(tj);\n  const ck = Math.cos(tk);\n  const si = Math.sin(ti);\n  const sj = Math.sin(tj);\n  const sk = Math.sin(tk);\n\n  const result: RawQuaternion = [0.0, 0.0, 0.0, ck * cj * ci + sk * sj * si];\n  result[i] = ck * cj * si - sk * sj * ci;\n  result[j] = sign * (ck * sj * ci + sk * cj * si);\n  result[k] = sk * cj * ci - ck * sj * si;\n\n  return result;\n}\n", "/**\n * GLSL Style `mod` function.\n * \"compute value of one parameter modulo another\"\n *\n * @param value - value to mod\n * @param divisor - divisor to mod by\n */\nexport function mod(value: number, divisor: number): number {\n  return value - Math.floor(value / divisor) * divisor;\n}\n", "import { mod } from './mod';\n\n/**\n * Enclose arbitrary angle (in radian) into [-\u03C0, \u03C0)\n */\nexport function sanitizeAngle(angle: number): number {\n  return mod(angle + Math.PI, 2.0 * Math.PI) - Math.PI;\n}\n", "import { clamp } from '../clamp';\nimport type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport { sanitizeAngle } from '../sanitizeAngle';\nimport { vecManhattanLength } from '../vec/vecManhattanLength';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\n\n/**\n * Return a euler angles out of a matrix3.\n * Make sure the input matrix is normalized.\n *\n * @param m An input rotation matrix\n * @param order An order of output euler angles. Assume as `XYZ` if not specified\n */\nexport function eulerFromMat3(m: RawMatrix3, order?: EulerOrder): RawVector3 {\n  const [i, j, k, sign] =\n    !order || order === 'XYZ'\n      ? [0, 1, 2, 1]\n      : order === 'XZY'\n        ? [0, 2, 1, -1]\n        : order === 'YXZ'\n          ? [1, 0, 2, -1]\n          : order === 'YZX'\n            ? [1, 2, 0, 1]\n            : order === 'ZXY'\n              ? [2, 0, 1, 1]\n              : [2, 1, 0, -1];\n\n  const result: RawVector3 = [0.0, 0.0, 0.0];\n\n  const c = m[k + i * 3];\n  result[j] = -sign * Math.asin(clamp(c, -1.0, 1.0));\n\n  if (Math.abs(c) < 0.999999) {\n    result[i] = sign * Math.atan2(m[k + j * 3], m[k * 4]);\n    result[k] = sign * Math.atan2(m[j + i * 3], m[i * 4]);\n  } else {\n    // \"y is 90deg\" cases\n    result[i] = sign * Math.atan2(-m[j + k * 3], m[j * 4]);\n  }\n\n  if (vecManhattanLength(result) > 1.5 * Math.PI) {\n    // \"two big revolutions\" cases\n    result[i] = sanitizeAngle(result[i] + Math.PI);\n    result[j] = sanitizeAngle(Math.PI - result[j]);\n    result[k] = sanitizeAngle(result[k] + Math.PI);\n  }\n\n  return result;\n}\n", "import { mat3FromMat4 } from '../mat3/mat3FromMat4';\nimport type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\nimport { eulerFromMat3 } from './eulerFromMat3';\n\n/**\n * Return a euler angles out of a matrix4.\n * Make sure the input matrix is normalized.\n *\n * @param m An input rotation matrix\n * @param order An order of output euler angles. Assume as `XYZ` if not specified\n */\nexport function eulerFromMat4(m: RawMatrix4, order?: EulerOrder): RawVector3 {\n  return eulerFromMat3(mat3FromMat4(m), order);\n}\n", "import { mat3FromQuaternion } from '../mat3/mat3FromQuaternion';\nimport type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\nimport { eulerFromMat3 } from './eulerFromMat3';\n\n/**\n * Return a euler angles out of a quaternion.\n *\n * @param m An input quaternion\n * @param order An order of output euler angles. Assume as `XYZ` if not specified\n */\nexport function eulerFromQuaternion(m: RawQuaternion, order?: EulerOrder): RawVector3 {\n  return eulerFromMat3(mat3FromQuaternion(m), order);\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Quaternion } from '../quat/Quaternion';\nimport { quatFromEuler } from '../quat/quatFromEuler';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\nimport { eulerFromMat3 } from './eulerFromMat3';\nimport { eulerFromMat4 } from './eulerFromMat4';\nimport { eulerFromQuaternion } from './eulerFromQuaternion';\n\n/**\n * An Euler rotations.\n */\nexport class Euler {\n  public elements: RawVector3; // [ x, y, z ]\n\n  /**\n   * An order of this euler.\n   * 'XYZ' by default.\n   *\n   * Note that this is **extrinsic** rotations (which is same as Blender, Maya, and Unity).\n   * Three.js uses intrinsic rotations so you have to reverse the order if you want to match the behavior with Three.js.\n   */\n  public order: EulerOrder;\n\n  public constructor(elements: RawVector3 = [0.0, 0.0, 0.0], order: EulerOrder = 'XYZ') {\n    this.elements = elements;\n    this.order = order;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  /**\n   * An y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  /**\n   * An z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  public toString(): string {\n    return `Euler( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)} (${this.order}) )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Euler {\n    return new Euler(this.elements.concat() as RawVector3, this.order);\n  }\n\n  /**\n   * Itself but converted into a Quaternion.\n   */\n  public get quaternion(): Quaternion {\n    return new Quaternion(quatFromEuler(this.elements, this.order));\n  }\n\n  /**\n   * Itself but converted into a Matrix4.\n   */\n  public get matrix4(): Matrix4 {\n    return this.quaternion.matrix4;\n  }\n\n  /**\n   * Generate an Euler out of a matrix3.\n   */\n  public static fromMatrix3(matrix: Matrix3, order: EulerOrder): Euler {\n    return new Euler(eulerFromMat3(matrix.elements, order), order);\n  }\n\n  /**\n   * Generate an Euler out of a matrix4.\n   */\n  public static fromMatrix4(matrix: Matrix4, order: EulerOrder): Euler {\n    return new Euler(eulerFromMat4(matrix.elements, order), order);\n  }\n\n  /**\n   * Generate an Euler out of a quaternion.\n   */\n  public static fromQuaternion(quaternion: Quaternion, order: EulerOrder): Euler {\n    return new Euler(eulerFromQuaternion(quaternion.elements, order), order);\n  }\n}\n", "import type { RawSphere3 } from '../sphere3/RawSphere3';\nimport { vecDot } from '../vec/vecDot';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawRay3 } from './RawRay3';\n\n/**\n * Return distances from given ray to sphere.\n *\n * The returning distance can be negative.\n *\n * The first returning value will be the distance of the incident point.\n * If the ray does not intersect with sphere, it will return `null`.\n *\n * @param ray A ray\n * @param sphere A target sphere\n */\nexport function ray3DistanceToSphere(\n  [ro, rd]: RawRay3,\n  sphere: RawSphere3,\n): [number, number] | null {\n  const v = vecSub(ro, sphere[0]);\n  const b = vecDot(v, rd);\n  const c = vecDot(v, v) - sphere[1];\n  const d = b * b - c;\n\n  if (d < 0.0) {\n    return null;\n  }\n\n  const sqrtD = Math.sqrt(d);\n\n  return [-b - sqrtD, -b + sqrtD];\n}\n", "import { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a vector that represents delta of given line.\n *\n * @param line A line\n */\nexport function line3Delta(line: RawLine3): RawVector3 {\n  return vecSub(line[1], line[0]);\n}\n", "import { line3Delta } from '../line3/line3Delta';\nimport type { RawLine3 } from '../line3/RawLine3';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport type { RawRay3 } from './RawRay3';\n\n/**\n * Convert the given line to a ray.\n *\n * @param line A line\n */\nexport function ray3FromLine3(line: RawLine3): RawRay3 {\n  return [line[0], vecNormalize(line3Delta(line))];\n}\n", "import type { Line3 } from '../line3/Line3';\nimport type { Sphere3 } from '../sphere3/Sphere3';\nimport { Vector3 } from '../vec3/Vector3';\nimport type { RawRay3 } from './RawRay3';\nimport { ray3DistanceToSphere } from './ray3DistanceToSphere';\nimport { ray3FromLine3 } from './ray3FromLine3';\n\n/**\n * A 3D ray.\n */\nexport class Ray3 {\n  /**\n   * The origin of the ray.\n   */\n  public origin: Vector3;\n\n  /**\n   * The direction of the ray.\n   * Make sure the direction is normalized.\n   */\n  public direction: Vector3;\n\n  public constructor(start: Vector3 = Vector3.zero, end: Vector3 = Vector3.pz) {\n    this.origin = start;\n    this.direction = end;\n  }\n\n  /**\n   * Itself but {@link RawRay3} form.\n   */\n  public get raw(): RawRay3 {\n    return [this.origin.elements, this.direction.elements];\n  }\n\n  /**\n   * Return distances from given ray to sphere.\n   *\n   * The returning distance can be negative.\n   *\n   * The first returning value will be the distance of the incident point.\n   * If the ray does not intersect with sphere, it will return `null`.\n   *\n   * @param sphere A target sphere\n   */\n  public distanceToSphere(sphere: Sphere3): [number, number] | null {\n    return ray3DistanceToSphere(this.raw, sphere.raw);\n  }\n\n  /**\n   * Convert {@link RawRay3} to class form.\n   * @param ray A {@link RawRay3}\n   */\n  public static fromRaw(ray: RawRay3): Ray3 {\n    return new Ray3(new Vector3(ray[0]), new Vector3(ray[1]));\n  }\n\n  /**\n   * Create a ray out of a line.\n   *\n   * @param line A {@link Line3}\n   */\n  public static fromLine3(line: Line3): Ray3 {\n    return Ray3.fromRaw(ray3FromLine3(line.raw));\n  }\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { vec3ApplyMatrix4 } from '../vec3/vec3ApplyMatrix4';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Apply given matrix4 to given line.\n *\n * @param line A line\n * @param matrix A matrix4 which will be applied to the line\n */\nexport function line3ApplyMatrix4([start, end]: RawLine3, matrix: RawMatrix4): RawLine3 {\n  return [vec3ApplyMatrix4(start, matrix), vec3ApplyMatrix4(end, matrix)];\n}\n", "import { vecAdd } from '../vec/vecAdd';\nimport { vecScale } from '../vec/vecScale';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a vector that represents a certain point of given line.\n * Same as start at t = 0, same as end at t = 1.\n *\n * @param line A line\n * @param t A parameter t\n */\nexport function line3At(line: RawLine3, t: number): RawVector3 {\n  return vecAdd(vecScale(line[0], 1.0 - t), vecScale(line[1], t));\n}\n", "import { saturate } from '../saturate';\nimport { vecDot } from '../vec/vecDot';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { line3At } from './line3At';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a point that is on the given line which is closest to the given point.\n *\n * If `segment` is true, it will treat the line as a segment which has start and end.\n * Otherwise it will treat the line is infinite.\n *\n * @param line A line\n * @param point A point\n * @param segment Is the line a segment?\n */\nexport function line3ClosestPointToPoint(\n  line: RawLine3,\n  point: RawVector3,\n  segment?: boolean,\n): RawVector3 {\n  const ap = vecSub(point, line[0]);\n  const ab = vecSub(line[1], line[0]);\n\n  let t = vecDot(ap, ab) / vecDot(ab, ab);\n  segment && (t = saturate(t));\n\n  return line3At(line, t);\n}\n", "import { vecLength } from '../vec/vecLength';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { line3ClosestPointToPoint } from './line3ClosestPointToPoint';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a distance from the given line to the given point.\n *\n * If `segment` is true, it will treat the line as a segment which has start and end.\n * Otherwise it will treat the line is infinite.\n *\n * @param line A line\n * @param point A point\n * @param segment Is the line a segment?\n */\nexport function line3DistanceToPoint(line: RawLine3, point: RawVector3, segment?: boolean): number {\n  return vecLength(vecSub(line3ClosestPointToPoint(line, point, segment), point));\n}\n", "import type { Matrix4 } from '../mat4/Matrix4';\nimport { Ray3 } from '../ray3/Ray3';\nimport { Vector3 } from '../vec3/Vector3';\nimport { line3ApplyMatrix4 } from './line3ApplyMatrix4';\nimport { line3At } from './line3At';\nimport { line3ClosestPointToPoint } from './line3ClosestPointToPoint';\nimport { line3Delta } from './line3Delta';\nimport { line3DistanceToPoint } from './line3DistanceToPoint';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * A 3D line.\n */\nexport class Line3 {\n  public start: Vector3;\n  public end: Vector3;\n\n  public constructor(start: Vector3 = Vector3.zero, end: Vector3 = Vector3.zero) {\n    this.start = start;\n    this.end = end;\n  }\n\n  /**\n   * Itself but {@link RawLine3} form.\n   */\n  public get raw(): RawLine3 {\n    return [this.start.elements, this.end.elements];\n  }\n\n  /**\n   * Itself but a ray.\n   */\n  public get ray(): Ray3 {\n    return Ray3.fromLine3(this);\n  }\n\n  /**\n   * A vector that represents delta of the line.\n   */\n  public delta(): Vector3 {\n    return new Vector3(line3Delta(this.raw));\n  }\n\n  /**\n   * Its length.\n   */\n  public length(): number {\n    return this.delta.length;\n  }\n\n  /**\n   * Return a vector that represents a certain point of the line.\n   * Same as start at t = 0, same as end at t = 1.\n   *\n   * @param t A parameter t\n   */\n  public at(t: number): Vector3 {\n    return new Vector3(line3At(this.raw, t));\n  }\n\n  /**\n   * Apply given matrix4 to the line.\n   *\n   * @param matrix A matrix4 which will be applied to the line\n   */\n  public applyMatrix4(matrix: Matrix4): Line3 {\n    return Line3.fromRaw(line3ApplyMatrix4(this.raw, matrix.elements));\n  }\n\n  /**\n   * Return a point that is on the line which is closest to the given point.\n   *\n   * If `segment` is true, it will treat the line as a segment which has start and end.\n   * Otherwise it will treat the line is infinite.\n   *\n   * @param point A point\n   * @param segment Is the line a segment?\n   */\n  public closestPointToPoint(point: Vector3, segment: boolean): Vector3 {\n    return new Vector3(line3ClosestPointToPoint(this.raw, point.elements, segment));\n  }\n\n  /**\n   * Return a distance from the line to the given point.\n   *\n   * If `segment` is true, it will treat the line as a segment which has start and end.\n   * Otherwise it will treat the line is infinite.\n   *\n   * @param point A point\n   * @param segment Is the line a segment?\n   */\n  public distanceToPoint(point: Vector3, segment: boolean): number {\n    return line3DistanceToPoint(this.raw, point.elements, segment);\n  }\n\n  /**\n   * Convert {@link RawLine3} to class form.\n   * @param line A {@link RawLine3}\n   */\n  public static fromRaw(line: RawLine3): Line3 {\n    return new Line3(new Vector3(line[0]), new Vector3(line[1]));\n  }\n}\n", "import { saturate } from './saturate';\n\n/**\n * `smoothstep` but not smooth\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function linearstep(edge0: number, edge1: number, x: number): number {\n  return saturate((x - edge0) / (edge1 - edge0));\n}\n", "import type { RawMatrix2 } from './RawMatrix2';\n\nexport function mat2Determinant(m: RawMatrix2): number {\n  return m[0] * m[3] - m[2] * m[1];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport type { RawMatrix2 } from './RawMatrix2';\n\n/**\n * Return an inverse of given matrix.\n */\nexport function mat2Inverse(m: RawMatrix2): RawMatrix2 {\n  const n11 = m[0],\n    n21 = m[1],\n    n12 = m[2],\n    n22 = m[3],\n    det = n11 * n22 - n12 * n21;\n\n  if (det === 0.0) {\n    return vecScale(m, 0.0);\n  }\n\n  return vecScale([n22, -n21, -n12, n11], 1.0 / det);\n}\n", "import type { RawMatrix2 } from './RawMatrix2';\n\n/**\n * Return a multiplication result of matrices.\n */\nexport function mat2Multiply(...mats: RawMatrix2[]): RawMatrix2 {\n  if (mats.length < 2) {\n    return mats[0];\n  }\n\n  const a = mats.shift()!;\n  const b = mat2Multiply(...mats);\n  const a00 = a[0],\n    a01 = a[1],\n    a10 = a[2],\n    a11 = a[3],\n    b00 = b[0],\n    b01 = b[1],\n    b10 = b[2],\n    b11 = b[3];\n\n  return [\n    a00 * b00 + a10 * b01,\n    a01 * b00 + a11 * b01,\n\n    a00 * b10 + a10 * b11,\n    a01 * b10 + a11 * b11,\n  ];\n}\n", "import type { RawMatrix2 } from './RawMatrix2';\n\n/**\n * Transpose a mat2.\n */\nexport function mat2Transpose(source: RawMatrix2): RawMatrix2 {\n  return [source[0], source[2], source[1], source[3]];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport { mat2Determinant } from './mat2Determinant';\nimport { mat2Inverse } from './mat2Inverse';\nimport { mat2Multiply } from './mat2Multiply';\nimport { mat2Transpose } from './mat2Transpose';\nimport type { RawMatrix2 } from './RawMatrix2';\n\nconst rawIdentityMatrix2: RawMatrix2 = [1.0, 0.0, 0.0, 1.0];\n\n/**\n * A Matrix2.\n */\nexport class Matrix2 {\n  public elements: RawMatrix2;\n\n  public constructor(v: RawMatrix2 = rawIdentityMatrix2) {\n    this.elements = v;\n  }\n\n  /**\n   * Itself but transposed.\n   */\n  public get transpose(): Matrix2 {\n    return new Matrix2(mat2Transpose(this.elements));\n  }\n\n  /**\n   * Its determinant.\n   */\n  public get determinant(): number {\n    return mat2Determinant(this.elements);\n  }\n\n  /**\n   * Itself but inverted.\n   */\n  public get inverse(): Matrix2 {\n    return new Matrix2(mat2Inverse(this.elements));\n  }\n\n  public toString(): string {\n    const m = this.elements.map((v) => v.toFixed(3));\n    return `Matrix2( ${m[0]}, ${m[2]}; ${m[1]}, ${m[3]} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Matrix2 {\n    return new Matrix2(this.elements.concat() as RawMatrix2);\n  }\n\n  /**\n   * Multiply this Matrix2 by one or more Matrix2s.\n   */\n  public multiply(...matrices: Matrix2[]): Matrix2 {\n    return Matrix2.multiply(this, ...matrices);\n  }\n\n  /**\n   * Multiply this Matrix3 by a scalar.\n   */\n  public scaleScalar(scalar: number): Matrix2 {\n    return new Matrix2(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * An identity Matrix4.\n   */\n  public static get identity(): Matrix2 {\n    return new Matrix2(rawIdentityMatrix2);\n  }\n\n  /**\n   * Multiply two or more matrices.\n   * @param matrices Matrices\n   */\n  public static multiply(...matrices: Matrix2[]): Matrix2 {\n    if (matrices.length === 0) {\n      return Matrix2.identity;\n    } else {\n      return new Matrix2(mat2Multiply(...matrices.map((m) => m.elements)));\n    }\n  }\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { vecDot } from '../vec/vecDot';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vec3ApplyMatrix3 } from '../vec3/vec3ApplyMatrix3';\nimport { vec3ApplyMatrix4 } from '../vec3/vec3ApplyMatrix4';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Apply given matrix4 to given plane.\n *\n * @param plane A plane\n * @param matrix A matrix4 which will be applied to the plane\n * @param normalMatrix A normalMatrix made out of {@link matrix}\n */\nexport function plane3ApplyMatrix4(\n  [normal, distance]: RawPlane3,\n  matrix: RawMatrix4,\n  normalMatrix: RawMatrix3,\n): RawPlane3 {\n  // normal\u306A\u3093\u3060\u304B\u3089normalMatrix\u5F53\u3066\u308C\u3070\u30E8\u30B7\uFF01\n  const newNormal = vecNormalize(vec3ApplyMatrix3(normal, normalMatrix));\n\n  // \u3068\u308A\u3042\u3048\u305A\u4E00\u70B9\u89B3\u6E2C\u3057\u3066\u3042\u3068\u3067dot\u53D6\u308A\u76F4\u3057\u3061\u3083\u304A\u3046\u305C\uFF01\n  const coplanar = vecScale(normal, -distance);\n  const refPoint = vec3ApplyMatrix4(coplanar, matrix);\n  const newDistance = -vecDot(refPoint, normal);\n\n  return [newNormal, newDistance];\n}\n", "import { vecDot } from '../vec/vecDot';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Return a signed distance from given plane to the given point.\n * Make sure the `normal` is normalized.\n */\nexport function plane3DistanceToPoint([normal, distance]: RawPlane3, point: RawVector3): number {\n  return vecDot(normal, point) + distance;\n}\n", "import { vecLength } from '../vec/vecLength';\nimport { vecScale } from '../vec/vecScale';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Normalize a given plane?\n * This normalizes the normal and also divide distance by its original normal length.\n *\n * I don't come up with any use cases other than {@link planesFromProjectionMatrix}.\n *\n * @param plane The plane you want to normalize\n */\nexport function plane3Normalize([normal, distance]: RawPlane3): RawPlane3 {\n  const invL = 1.0 / vecLength(normal);\n  return [vecScale(normal, invL), distance * invL];\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Vector3 } from '../vec3/Vector3';\nimport { plane3ApplyMatrix4 } from './plane3ApplyMatrix4';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport { plane3Normalize } from './plane3Normalize';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * A 3D plane.\n */\nexport class Plane3 {\n  public normal: Vector3;\n  public distance: number;\n\n  /**\n   * Itself but {@link RawPlane3} form.\n   */\n  public get raw(): RawPlane3 {\n    return [this.normal.elements, this.distance];\n  }\n\n  /**\n   * Normalized plane?\n   * This normalizes the normal and also divide distance by its original normal length.\n   */\n  public get normalized(): Plane3 {\n    return Plane3.fromRaw(plane3Normalize(this.raw));\n  }\n\n  public constructor(normal: Vector3 = Vector3.pz, distance = 0.0) {\n    this.normal = normal;\n    this.distance = distance;\n  }\n\n  /**\n   * Apply given matrix4 to the plane.\n   *\n   * @param matrix A matrix4 which will be applied to the plane\n   * @param normalMatrix A normalMatrix made out of {@link matrix}. Optional\n   */\n  public applyMatrix4(matrix: Matrix4, normalMatrix?: Matrix3): Plane3 {\n    return Plane3.fromRaw(\n      plane3ApplyMatrix4(\n        this.raw,\n        matrix.elements,\n        normalMatrix?.elements ?? matrix.normalMatrix.elements,\n      ),\n    );\n  }\n\n  /**\n   * Return a signed distance from given plane to the given point.\n   *\n   * @param point A point\n   */\n  public distanceToPoint(point: Vector3): number {\n    return plane3DistanceToPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Convert {@link RawPlane3} to class form.\n   * @param plane A {@link RawPlane3}\n   */\n  public static fromRaw(plane: RawPlane3): Plane3 {\n    return new Plane3(new Vector3(plane[0]), plane[1]);\n  }\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Test if given point is contained in given planes or not.\n *\n * @param planes A list of planes\n * @param point A point\n */\nexport function planes3ContainPoint(planes: RawPlane3[], point: RawVector3): boolean {\n  return planes.every((plane) => plane3DistanceToPoint(plane, point) >= 0.0);\n}\n", "import type { RawBox3 } from '../box3/RawBox3';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Generate a set of plane3 out of a {@link RawBox3}.\n *\n * @param box A box\n */\nexport function planes3FromBox3(box: RawBox3): RawPlane3[] {\n  return [\n    [[1.0, 0.0, 0.0], -box[0][0]], // xn\n    [[-1.0, 0.0, 0.0], box[1][0]], // xp\n    [[0.0, 1.0, 0.0], -box[0][1]], // yn\n    [[0.0, -1.0, 0.0], box[1][1]], // yp\n    [[0.0, 0.0, 1.0], -box[0][2]], // yn\n    [[0.0, 0.0, -1.0], box[1][2]], // yp\n  ];\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { plane3Normalize } from './plane3Normalize';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Create frustum planes out of given projection matrix.\n *\n * @param m A projection matrix\n */\nexport function planes3FromProjectionMatrix(m: RawMatrix4): RawPlane3[] {\n  const m11 = m[0],\n    m12 = m[4],\n    m13 = m[8],\n    m14 = m[12],\n    m21 = m[1],\n    m22 = m[5],\n    m23 = m[9],\n    m24 = m[13],\n    m31 = m[2],\n    m32 = m[6],\n    m33 = m[10],\n    m34 = m[14],\n    m41 = m[3],\n    m42 = m[7],\n    m43 = m[11],\n    m44 = m[15];\n\n  return [\n    plane3Normalize([[m41 - m11, m42 - m12, m43 - m13], m44 - m14]), // xp\n    plane3Normalize([[m41 + m11, m42 + m12, m43 + m13], m44 + m14]), // xn\n    plane3Normalize([[m41 - m21, m42 - m22, m43 - m23], m44 - m24]), // yp\n    plane3Normalize([[m41 + m21, m42 + m22, m43 + m23], m44 + m24]), // yn\n    plane3Normalize([[m41 - m31, m42 - m32, m43 - m33], m44 - m34]), // zn\n    plane3Normalize([[m41 + m31, m42 + m32, m43 + m33], m44 + m34]), // zp\n  ];\n}\n", "import type { RawBox3 } from '../box3/RawBox3';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Test if given box intersects with planes or not.\n *\n * @param planes A list of planes\n * @param box A box3\n */\nexport function planes3IntersectBox3(planes: RawPlane3[], box: RawBox3): boolean {\n  return planes.every((plane) => {\n    const v = plane[0].map((nc, i) => box[nc > 0.0 ? 1 : 0][i]) as RawVector3;\n    return plane3DistanceToPoint(plane, v) >= 0.0;\n  });\n}\n", "import type { RawSphere3 } from '../sphere3/RawSphere3';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Test if given sphere intersects with planes or not.\n *\n * It does not do strict intersection test but still should work well with frustum cull use cases.\n * See the test case for more details.\n *\n * @param planes A list of planes\n * @param sphere A sphere3\n */\nexport function planes3IntersectSphere3(planes: RawPlane3[], sphere: RawSphere3): boolean {\n  return planes.every((plane) => plane3DistanceToPoint(plane, sphere[0]) >= -sphere[1]);\n}\n", "import type { Box3 } from '../box3/Box3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport type { Sphere3 } from '../sphere3/Sphere3';\nimport type { Vector3 } from '../vec3/Vector3';\nimport { Plane3 } from './Plane3';\nimport { planes3ContainPoint } from './planes3ContainPoint';\nimport { planes3FromBox3 } from './planes3FromBox3';\nimport { planes3FromProjectionMatrix } from './planes3FromProjectionMatrix';\nimport { planes3IntersectBox3 } from './planes3IntersectBox3';\nimport { planes3IntersectSphere3 } from './planes3IntersectSphere3';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * A set of {@link Plane3}.\n */\nexport class Planes3 {\n  public planes: Plane3[];\n\n  /**\n   * Itself but {@link RawPlane3}[] form.\n   */\n  public get raw(): RawPlane3[] {\n    return this.planes.map((plane) => plane.raw);\n  }\n\n  public constructor(planes: Plane3[]) {\n    this.planes = planes;\n  }\n\n  /**\n   * Test if given point is contained in the planes or not.\n   *\n   * @param point A point\n   */\n  public containPoint(point: Vector3): boolean {\n    return planes3ContainPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Test if given box intersects with the planes or not.\n   *\n   * @param box A box3\n   */\n  public intersectBox3(box: Box3): boolean {\n    return planes3IntersectBox3(this.raw, box.raw);\n  }\n\n  /**\n   * Test if given sphere intersects with the planes or not.\n   *\n   * It does not do strict intersection test but still should work well with frustum cull use cases.\n   * See the test case for more details.\n   *\n   * @param sphere A sphere3\n   */\n  public intersectSphere3(sphere: Sphere3): boolean {\n    return planes3IntersectSphere3(this.raw, sphere.raw);\n  }\n\n  /**\n   * Convert {@link RawPlane3}[] to class form.\n   *\n   * @param planes A {@link RawPlane3}[]\n   */\n  public static fromRaw(planes: RawPlane3[]): Planes3 {\n    return new Planes3(planes.map((plane) => Plane3.fromRaw(plane)));\n  }\n\n  /**\n   * Generate a set of plane3 out of a {@link RawBox3}.\n   *\n   * @param box A box\n   */\n  public static fromBox3(box: Box3): Planes3 {\n    return Planes3.fromRaw(planes3FromBox3(box.raw));\n  }\n\n  /**\n   * Create frustum planes out of given projection matrix.\n   *\n   * @param matrix A projection matrix\n   */\n  public static fromProjectionMatrix(matrix: Matrix4): Planes3 {\n    return Planes3.fromRaw(planes3FromProjectionMatrix(matrix.elements));\n  }\n}\n", "/**\n * Transform a value from input range to output range.\n *\n * This function does NOT clamp the output value.\n *\n * This function is inspired by the Processing's `map()` function.\n *\n * @param x - value to transform\n * @param x0 - lower edge of the input range\n * @param x1 - upper edge of the input range\n * @param y0 - lower edge of the output range\n * @param y1 - upper edge of the output range\n */\nexport function range(x: number, x0: number, x1: number, y0: number, y1: number): number {\n  return ((x - x0) * (y1 - y0)) / (x1 - x0) + y0;\n}\n", "import { linearstep } from './linearstep';\n\n/**\n * `smoothstep` but more smooth\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function smootherstep(edge0: number, edge1: number, x: number): number {\n  const t = linearstep(edge0, edge1, x);\n  return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\n}\n", "import { linearstep } from './linearstep';\n\n/**\n * `smoothstep` but WAY more smooth\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function smootheststep(edge0: number, edge1: number, x: number): number {\n  const t = linearstep(edge0, edge1, x);\n  return t * t * t * t * (t * (t * (-20.0 * t + 70.0) - 84.0) + 35.0);\n}\n", "import { linearstep } from './linearstep';\n\n/**\n * world famous `smoothstep` function\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function smoothstep(edge0: number, edge1: number, x: number): number {\n  const t = linearstep(edge0, edge1, x);\n  return t * t * (3.0 - 2.0 * t);\n}\n", "import { vecLengthSq } from '../vec/vecLengthSq';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawSphere3 } from './RawSphere3';\n\n/**\n * Test if given point is contained in given sphere or not.\n * @param sphere A sphere\n * @param point A point\n */\nexport function sphere3ContainsPoint(sphere: RawSphere3, point: RawVector3): boolean {\n  return vecLengthSq(vecSub(sphere[0], point)) <= sphere[1] * sphere[1];\n}\n", "import { Vector3 } from '../vec3/Vector3';\nimport type { RawSphere3 } from './RawSphere3';\nimport { sphere3ContainsPoint } from './sphere3ContainsPoint';\n\n/**\n * A 3D sphere.\n */\nexport class Sphere3 {\n  public origin: Vector3;\n  public radius: number;\n\n  public constructor(origin: Vector3 = Vector3.zero, radius: number = 0.0) {\n    this.origin = origin;\n    this.radius = radius;\n  }\n\n  /**\n   * Itself but {@link RawSphere3} form.\n   */\n  public get raw(): RawSphere3 {\n    return [this.origin.elements, this.radius];\n  }\n\n  /**\n   * Test if given point is contained in the sphere or not.\n   *\n   * @param point A point\n   */\n  public containsPoint(point: Vector3): boolean {\n    return sphere3ContainsPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Convert {@link RawSphere3} to class form.\n   * @param sphere A {@link RawSphere3}\n   */\n  public static fromRaw(sphere: RawSphere3): Sphere3 {\n    return new Sphere3(new Vector3(sphere[0]), sphere[1]);\n  }\n}\n", "/**\n * GLSL style heaviside step function.\n *\n * `edge <= x ? 1.0 : 0.0`\n *\n * @param edge - threshold value\n * @param x - value to test\n */\nexport function step(edge: number, x: number): number {\n  return edge <= x ? 1.0 : 0.0;\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3ApplyMatrix3 } from '../vec3/vec3ApplyMatrix3';\nimport type { RawVector4 } from './RawVector4';\n\n/**\n * Apply a vec4 a mat3 (with an implicit 1 on m44).\n */\nexport function vec4ApplyMatrix3(v: RawVector4, m: RawMatrix3): RawVector4 {\n  const v3: RawVector3 = [v[0], v[1], v[2]];\n  const xyz = vec3ApplyMatrix3(v3, m);\n  const w = v[3];\n  return [xyz[0], xyz[1], xyz[2], w];\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Vector } from '../vec/Vector';\nimport type { RawVector4 } from './RawVector4';\nimport { vec4ApplyMatrix3 } from './vec4ApplyMatrix3';\nimport { vec4ApplyMatrix4 } from './vec4ApplyMatrix4';\n\n/**\n * A Vector3.\n */\nexport class Vector4 extends Vector<Vector4> {\n  public elements: RawVector4;\n\n  public constructor(v: RawVector4 = [0.0, 0.0, 0.0, 0.0]) {\n    super();\n    this.elements = v;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  public set x(x: number) {\n    this.elements[0] = x;\n  }\n\n  /**\n   * A y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  public set y(y: number) {\n    this.elements[1] = y;\n  }\n\n  /**\n   * A z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  public set z(z: number) {\n    this.elements[2] = z;\n  }\n\n  /**\n   * A w component of this.\n   */\n  public get w(): number {\n    return this.elements[3];\n  }\n\n  public set w(z: number) {\n    this.elements[3] = z;\n  }\n\n  public toString(): string {\n    return `Vector4( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)}, ${this.w.toFixed(3)} )`;\n  }\n\n  /**\n   * Apply this vector a mat3 (with an implicit 1 on m44).\n   */\n  public applyMatrix3(matrix: Matrix3): Vector4 {\n    return new Vector4(vec4ApplyMatrix3(this.elements, matrix.elements));\n  }\n\n  /**\n   * Multiply this vector by a mat4.\n   */\n  public applyMatrix4(matrix: Matrix4): Vector4 {\n    return new Vector4(vec4ApplyMatrix4(this.elements, matrix.elements));\n  }\n\n  protected __new(v: RawVector4): Vector4 {\n    return new Vector4(v);\n  }\n\n  /**\n   * Vector4( 0.0, 0.0, 0.0, 0.0 )\n   */\n  public static get zero(): Vector4 {\n    return new Vector4([0.0, 0.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector4( 1.0, 1.0, 1.0, 1.0 )\n   */\n  public static get one(): Vector4 {\n    return new Vector4([1.0, 1.0, 1.0, 1.0]);\n  }\n}\n", "import { arraySerial } from '../array/arraySerial';\nimport type {\n  MidiParseResult,\n  MidiParseResultHeader,\n  MidiParseResultTrack,\n} from './MidiParseResult';\n\nfunction readU8(array: Uint8Array, headBox: [number]): number {\n  return array[headBox[0]++];\n}\n\n/**\n * Big endian\n */\nfunction readU16(array: Uint8Array, headBox: [number]): number {\n  return readU8(array, headBox) * 256 + readU8(array, headBox);\n}\n\n/**\n * Big endian\n */\nfunction readU32(array: Uint8Array, headBox: [number]): number {\n  return readU16(array, headBox) * 65536 + readU16(array, headBox);\n}\n\nfunction readUVar(array: Uint8Array, headBox: [number]): number {\n  let v = 0;\n  for (;;) {\n    const vv = readU8(array, headBox);\n    v = v * 128 + (vv & 127);\n\n    if (vv < 128) {\n      return v;\n    }\n  }\n}\n\nfunction parseHeader(array: Uint8Array, headBox: [number]): MidiParseResultHeader {\n  // skip type and length (4+4)\n  // length has to be 6, there's no need to parse\n  headBox[0] += 8;\n\n  // biome-ignore format: readability\n  return [\n    readU16(array, headBox),\n    readU16(array, headBox),\n    readU16(array, headBox),\n  ];\n}\n\nfunction parseTrack(array: Uint8Array, headBox: [number]): MidiParseResultTrack {\n  // skip type (4)\n  headBox[0] += 4;\n\n  const endOfTrack = headBox[0] + readU32(array, headBox) + 4;\n\n  const track: MidiParseResultTrack = [];\n  let type = 0;\n\n  while (headBox[0] < endOfTrack) {\n    const delta = readUVar(array, headBox);\n    const status = readU8(array, headBox);\n    type = status < 128 ? type : status;\n    const data0 = status < 128 ? status : readU8(array, headBox);\n\n    if (type < 0xc0) {\n      // note on (9x), note off (8x), polyphonic key pressure (Ax), control change (Bx)\n\n      track.push([\n        delta,\n        type,\n        data0, // note or cc number\n        readU8(array, headBox), // velocity, pressure, or data\n      ]);\n    } else if (type === 0xff) {\n      // meta events\n\n      const eventLength = readU8(array, headBox);\n\n      // biome-ignore format: readability\n      track.push([\n        delta,\n        type,\n        data0,\n        arraySerial(eventLength).map(() => readU8(array, headBox)),\n      ]);\n\n      if (data0 === 0x2f) {\n        // end of track\n        break;\n      }\n    } else {\n      throw new Error(`${type}`);\n    }\n  }\n\n  return track;\n}\n\nexport function midiParse(buffer: ArrayBuffer): MidiParseResult {\n  const array = new Uint8Array(buffer);\n  const headBox: [number] = [0];\n\n  const header = parseHeader(array, headBox);\n  const tracks: MidiParseResultTrack[] = [];\n\n  while (headBox[0] < array.length) {\n    tracks.push(parseTrack(array, headBox));\n  }\n\n  return [header, tracks];\n}\n", "/**\n * An utility type definition to use along with {@link notifyObservers}.\n */\nexport type Observer<TEvent = void> = (event: TEvent) => void;\n\n/**\n * A bare function to notify observers.\n * The incredibly cheap implementation of the observer pattern.\n *\n * Use along with the utility type definition {@link Observer}.\n *\n * @example\n * ```ts\n * const observers = new Set<Observer<string>>();\n *\n * observers.add( ( text ) => console.log( text ) );\n * observers.add( ( text ) => alert( text ) );\n *\n * notifyObservers( observers, 'wenis' );\n * ```\n *\n * @param observers The iterator of observers\n * @param param The param you want to give to observers\n */\nexport function notifyObservers(observers: Iterable<Observer<void>>): void;\nexport function notifyObservers<T>(observers: Iterable<Observer<T>>, param: T): void;\nexport function notifyObservers<T>(observers: Iterable<Observer<T>>, param?: T): void {\n  for (const observer of observers) {\n    observer(param as T);\n  }\n}\n", "import type { PokerRank } from './PokerRank';\n\nexport const pokerRanksByStrength: PokerRank[] = [\n  '2',\n  '3',\n  '4',\n  '5',\n  '6',\n  '7',\n  '8',\n  '9',\n  'T',\n  'J',\n  'Q',\n  'K',\n  'A',\n];\n", "import type { PokerSuit } from './PokerSuit';\n\nexport const pokerSuitsByIndex: PokerSuit[] = ['c', 'd', 'h', 's'];\n", "import type { PokerCard } from './PokerCard';\nimport { pokerRanksByStrength } from './pokerRanksByStrength';\nimport { pokerSuitsByIndex } from './pokerSuitsByIndex';\n\n/**\n * Create a 52-card deck.\n * You might want to use {@link shuffleArray} to shuffle the deck.\n */\nexport function createPokerDeck(): PokerCard[] {\n  const array: PokerCard[] = [];\n\n  pokerSuitsByIndex.map((suit) =>\n    pokerRanksByStrength.map((rank) => array.push((rank + suit) as PokerCard)),\n  );\n\n  return array;\n}\n", "import type { PokerHand } from './PokerHand';\n\nexport const pokerHandStrengthMap: { [hand in PokerHand]: number } = {\n  HighCard: 0,\n  OnePair: 1,\n  TwoPair: 2,\n  ThreeOfAKind: 3,\n  Straight: 4,\n  Flush: 5,\n  FullHouse: 6,\n  FourOfAKind: 7,\n  StraightFlush: 8,\n};\n", "import type { PokerRank } from './PokerRank';\n\nexport const pokerRankStrengthMap: { [rank in PokerRank]: number } = {\n  '2': 0,\n  '3': 1,\n  '4': 2,\n  '5': 3,\n  '6': 4,\n  '7': 5,\n  '8': 6,\n  '9': 7,\n  T: 8,\n  J: 9,\n  Q: 10,\n  K: 11,\n  A: 12,\n};\n", "import type { PokerSuit } from './PokerSuit';\n\nexport const pokerSuitIndexMap: { [suit in PokerSuit]: number } = {\n  c: 0,\n  d: 1,\n  h: 2,\n  s: 3,\n};\n", "import type { PokerCard } from './PokerCard';\nimport type { PokerRank } from './PokerRank';\nimport type { PokerSuit } from './PokerSuit';\nimport { pokerRankStrengthMap } from './pokerRankStrengthMap';\nimport { pokerSuitIndexMap } from './pokerSuitIndexMap';\n\n/**\n * Sort given array of cards in place by rank (and suit).\n */\nexport function sortPokerCardsByRank(cards: PokerCard[]): PokerCard[] {\n  return cards\n    .sort((a, b) => pokerSuitIndexMap[a[1] as PokerSuit] - pokerSuitIndexMap[b[1] as PokerSuit])\n    .sort(\n      (a, b) => pokerRankStrengthMap[a[0] as PokerRank] - pokerRankStrengthMap[b[0] as PokerRank],\n    );\n}\n", "import { MapOfSet } from '../MapOfSet/MapOfSet';\nimport type { PokerCard } from './PokerCard';\nimport type { PokerHand } from './PokerHand';\nimport type { PokerRank } from './PokerRank';\nimport type { PokerSuit } from './PokerSuit';\nimport { pokerHandStrengthMap } from './pokerHandStrengthMap';\nimport { pokerRankStrengthMap } from './pokerRankStrengthMap';\nimport { pokerRanksByStrength } from './pokerRanksByStrength';\nimport { sortPokerCardsByRank } from './sortPokerCardsByRank';\n\nexport interface EvaluatePokerHandResult {\n  hand: PokerHand;\n  strength: number[];\n  cards: [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard];\n}\n\nexport function evaluatePokerHand(cards: PokerCard[]): EvaluatePokerHandResult {\n  // cards mutable edition\n  const cards_ = cards.concat();\n\n  const cardsByRank = new MapOfSet<PokerRank, PokerCard>();\n  const cardsBySuit = new MapOfSet<PokerSuit, PokerCard>();\n\n  cards_.map((card) => {\n    const rank = card[0] as PokerRank;\n    const suit = card[1] as PokerSuit;\n    cardsByRank.add(rank, card);\n    cardsBySuit.add(suit, card);\n  });\n\n  // pairs\n  const fours: PokerRank[] = [];\n  const threes: PokerRank[] = [];\n  const twos: PokerRank[] = [];\n\n  pokerRanksByStrength.map((rank) => {\n    const cards = cardsByRank.get(rank);\n    if (cards.size > 3) {\n      fours.push(rank);\n    } else if (cards.size > 2) {\n      threes.push(rank);\n    } else if (cards.size > 1) {\n      twos.push(rank);\n    }\n  });\n\n  // straight\n  let straightCards: PokerCard[] | undefined;\n  {\n    let current: PokerCard[] = [];\n\n    // handle steel wheel\n    const a = Array.from(cardsByRank.get('A'))[0];\n    if (a) {\n      current.push(a);\n    }\n\n    pokerRanksByStrength.map((rank) => {\n      const card = Array.from(cardsByRank.get(rank))[0];\n      if (card) {\n        current.push(card);\n\n        if (current.length > 4) {\n          straightCards = current;\n        }\n      } else {\n        current = [];\n      }\n    });\n  }\n\n  // straight flush\n  if (straightCards) {\n    for (const [suit, cardsSet] of cardsBySuit.map) {\n      if (cardsSet.size > 0) {\n        let straightFlushCards: PokerCard[] | undefined;\n        let current: PokerCard[] = [];\n\n        // handle steel wheel\n        const target = ('A' + suit) as PokerCard;\n        const a = cardsSet.has(target);\n        if (a) {\n          current.push(target);\n        }\n\n        pokerRanksByStrength.map((rank) => {\n          const target = (rank + suit) as PokerCard;\n          if (cardsSet.has(target)) {\n            current.push(target);\n\n            if (current.length > 4) {\n              straightFlushCards = current;\n            }\n          } else {\n            current = [];\n          }\n        });\n\n        if (straightFlushCards) {\n          straightFlushCards.splice(0, straightFlushCards.length - 5);\n\n          const hand = 'StraightFlush';\n          const strength = [\n            pokerHandStrengthMap[hand],\n            pokerRankStrengthMap[straightFlushCards[4][0] as PokerRank],\n          ];\n\n          return {\n            hand,\n            cards: straightFlushCards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n            strength,\n          };\n        }\n      }\n    }\n  }\n\n  // four of a kind\n  if (fours.length > 0) {\n    fours.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    fours.splice(0, fours.length - 1);\n\n    // 5s, 5c, Kd, 6d, 9c, 5d, 5h\n\n    const sameCards = Array.from(cardsByRank.get(fours[0]));\n    sameCards.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // Kd, 6d, 9c\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 1);\n    // Kd\n\n    const hand = 'FourOfAKind';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[fours[0]],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...sameCards);\n    sortPokerCardsByRank(cards_);\n    // 5c, 5d, 5h, 5s, Kd\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // full house\n  if (threes.length > 0 && threes.length + twos.length > 1) {\n    threes.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n\n    // tricky part: it is possible to have two or more threes at once\n    // just transfer threes which is not highest\n    // and wish we'll do this right in the rest of the code\n    twos.push(...threes.splice(0, threes.length - 1));\n\n    twos.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    twos.splice(0, twos.length - 1);\n\n    // 7d, 7s, Tc, Td, 7h, 9d, Th\n\n    const sameCards = Array.from(cardsByRank.get(threes[0]));\n    sameCards.push(...Array.from(cardsByRank.get(twos[0])));\n    // sameCards: Tc, Td, Th, 7d, 7s, 7h\n\n    sortPokerCardsByRank(sameCards).splice(0, sameCards.length - 5);\n    // sameCards: 7h, 7s, Tc, Td, Th\n\n    const hand = 'FullHouse';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[threes[0]],\n      pokerRankStrengthMap[twos[0]],\n    ];\n\n    return {\n      hand,\n      cards: sameCards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // flush\n  for (const [_suit, cardsSet] of cardsBySuit.map) {\n    if (cardsSet.size > 4) {\n      const cards = sortPokerCardsByRank(Array.from(cardsSet));\n      cards.splice(0, cards.length - 5);\n\n      const hand = 'Flush';\n      const strength = [\n        pokerHandStrengthMap[hand],\n        ...cards\n          .concat()\n          .reverse()\n          .map((card) => pokerRankStrengthMap[card[0] as PokerRank]),\n      ];\n\n      return {\n        hand,\n        cards: cards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n        strength,\n      };\n    }\n  }\n\n  // straight\n  if (straightCards) {\n    straightCards.splice(0, straightCards.length - 5);\n\n    const hand = 'Straight';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[straightCards[4][0] as PokerRank],\n    ];\n\n    return {\n      hand,\n      cards: straightCards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // three of a kind\n  if (threes.length > 0) {\n    threes.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    threes.splice(0, threes.length - 1);\n\n    // Ah, Ad, Kc, 7s, 4s, Qc, As\n\n    const sameCards = Array.from(cardsByRank.get(threes[0]));\n    sameCards.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // Kc, 7s, 4s, Qc\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 2);\n    // Qc, Kc\n\n    const hand = 'ThreeOfAKind';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[threes[0]],\n      pokerRankStrengthMap[cards_[1][0] as PokerRank],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...sameCards);\n    sortPokerCardsByRank(cards_);\n    // Qc, Kc, Ad, Ah, As\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // two pair\n  if (twos.length > 1) {\n    twos.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    twos.splice(0, twos.length - 2);\n\n    // 4c, 8d, 7h, 4h, 8h, Jc, 2s\n\n    const pairs = Array.from(cardsByRank.get(twos[0]));\n    pairs.push(...Array.from(cardsByRank.get(twos[1])));\n    pairs.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // 7h, Jc, 2s\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 1);\n    // Jc\n\n    const hand = 'TwoPair';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[twos[1]],\n      pokerRankStrengthMap[twos[0]],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...pairs);\n    sortPokerCardsByRank(cards_);\n    // 4c, 4h, 8d, 8h, Jc\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // one pair\n  if (twos.length > 0) {\n    // 3c, 5d, 8c, 8s, Ac, Qd, 7h\n\n    const pair = Array.from(cardsByRank.get(twos[0]));\n    pair.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // 3c, 5d, Ac, Qd, 7h\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 3);\n    // 7h, Qd, Ac\n\n    const hand = 'OnePair';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[twos[0]],\n      pokerRankStrengthMap[cards_[2][0] as PokerRank],\n      pokerRankStrengthMap[cards_[1][0] as PokerRank],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...pair);\n    sortPokerCardsByRank(cards_);\n    // 7h, 8c, 8s, Qd, Ac\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // high card\n  {\n    const hand = 'HighCard';\n\n    // 2h, 5c, 6c, 7s, Td, Ad, Kd\n\n    sortPokerCardsByRank(cards_);\n    // 2h, 5c, 6c, 7s, Td, Kd, Ad\n\n    cards_.splice(0, cards_.length - 5);\n    // 6c, 7s, Td, Kd, Ad\n\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[cards_[4][0] as PokerRank],\n      pokerRankStrengthMap[cards_[3][0] as PokerRank],\n      pokerRankStrengthMap[cards_[2][0] as PokerRank],\n      pokerRankStrengthMap[cards_[1][0] as PokerRank],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n}\n", "import type { PokerCard } from './PokerCard';\nimport type { PokerRank } from './PokerRank';\nimport type { PokerSuit } from './PokerSuit';\n\nconst rankMap: Record<PokerRank, number> = {\n  A: 1,\n  '2': 2,\n  '3': 3,\n  '4': 4,\n  '5': 5,\n  '6': 6,\n  '7': 7,\n  '8': 8,\n  '9': 9,\n  T: 10,\n  J: 11,\n  Q: 13,\n  K: 14,\n};\n\nconst suitMap: Record<PokerSuit, number> = {\n  s: 0,\n  h: 16,\n  d: 32,\n  c: 48,\n};\n\nexport function pokerCardToUnicode(card: PokerCard): string {\n  const rank = card[0] as PokerRank;\n  const suit = card[1] as PokerSuit;\n\n  return String.fromCodePoint(0x1f0a0 + rankMap[rank] + suitMap[suit]);\n}\n", "import type { PokerHand } from './PokerHand';\n\nexport const pokerHandsByStrength: PokerHand[] = [\n  'HighCard',\n  'OnePair',\n  'TwoPair',\n  'ThreeOfAKind',\n  'Straight',\n  'Flush',\n  'FullHouse',\n  'FourOfAKind',\n  'StraightFlush',\n];\n", "/**\n * Retry given function for n times.\n *\n * See also: {@link retry}\n */\nexport async function asyncRetry<T>(func: () => Promise<T>, n: number): Promise<T> {\n  return await func().catch((error) => {\n    if (n <= 1) {\n      throw error;\n    }\n\n    return asyncRetry(func, n - 1);\n  });\n}\n", "/**\n * Retry given function for n times.\n *\n * See also: {@link asyncRetry}\n */\nexport function retry<T>(func: () => T, n: number): T {\n  try {\n    return func();\n  } catch (error) {\n    if (n <= 1) {\n      throw error;\n    }\n\n    return retry(func, n - 1);\n  }\n}\n", "/**\n * The naive implementation of so-called SmoothDamp.\n * Pretty much the same as {@link CDS}, but it has a way easier parameter to tweak, {@link smoothTime}.\n *\n * Ref: Game Programming Gems 4, Chapter 1.10\n *\n * See: https://github.com/Unity-Technologies/UnityCsReference/blob/a2bdfe9b3c4cd4476f44bf52f848063bfaf7b6b9/Runtime/Export/Math/Mathf.cs#L308\n */\nexport class SmoothDamp {\n  public smoothTime = 1.0;\n  public velocity = 0.0;\n  public value = 0.0;\n  public target = 0.0;\n\n  public update(deltaTime: number): number {\n    const omega = 2.0 / this.smoothTime;\n    const x = omega * deltaTime;\n    const exp = 1.0 / (1.0 + x + 0.48 * x * x + 0.235 * x * x * x);\n    const delta = this.value - this.target;\n    const temp = (this.velocity + omega * delta) * deltaTime;\n    this.velocity = (this.velocity - omega * temp) * exp;\n    this.value = this.target + (delta + temp) * exp;\n    return this.value;\n  }\n}\n", "/**\n * Useful for swap buffer\n */\nexport class Swap<T> {\n  public i: T;\n  public o: T;\n\n  public constructor(a: T, b: T) {\n    this.i = a;\n    this.o = b;\n  }\n\n  public swap(): void {\n    const i = this.i;\n    this.i = this.o;\n    this.o = i;\n  }\n}\n", "import type { STNICCCFrame } from './STNICCCFrame';\n\n/**\n * Ref: http://arsantica-online.com/st-niccc-competition/\n *\n * @param buffer The input ST-NICCC data\n */\nexport function parseSTNICCC(buffer: ArrayBuffer): STNICCCFrame[] {\n  const frames: STNICCCFrame[] = [];\n\n  const array = new Uint8Array(buffer);\n\n  const palette = new Uint16Array(16);\n\n  let head = 0;\n\n  // when poly-descriptor says 0xfe\n  let shouldSkip = false;\n\n  // when poly-descriptor says 0xfd\n  let shouldEnd = false;\n\n  // > Every frame stores the following data:\n  for (;;) {\n    // > 1 byte Flags Bit 0: Frame needs to clear the screen.\n    // > Bit 1: Frame contains palette data.\n    // > Bit 2: Frame is stored in indexed mode.\n    const flags = array[head++];\n    const needsClear = (flags & 1) === 1;\n    const hasPalette = ((flags >> 1) & 1) === 1;\n    const indexedMode = ((flags >> 2) & 1) === 1;\n\n    // > If frame contains palette data\n    if (hasPalette) {\n      // > 1 word Bitmask\n      const bitmask = (array[head++] << 8) | array[head++];\n\n      // > For every set bit in the Bitmask (0-15)\n      for (let i = 0; i < 16; i++) {\n        if ((bitmask >> (15 - i)) & 1) {\n          // > 1 word Color The color has to be copied into the palette at the reverse index of the actual bit,\n          // > because the bitmask is stored in reverse order.\n          // > In other words: If bit 15 of mask is set -> update color 0 of palette,\n          // > \u2026\n          // > if bit 0 of mask is set -> update color 15 of palette.\n\n          palette[i] = (array[head++] << 8) | array[head++];\n        }\n      }\n    }\n\n    // > If frame is stored in indexed mode\n    if (indexedMode) {\n      // > 1 byte Number of vertices (0-255)\n      const nVertices = array[head++];\n\n      // > For every Vertex\n      // > {\n      // > 1 byte X-position\n      // > 1 byte Y-position\n      // > }\n      const vertices = array.subarray(head, head + 2 * nVertices);\n      head += 2 * nVertices;\n\n      const polygons: { colorIndex: number; indices: number[] }[] = [];\n\n      // > While (\u2026)\n      for (;;) {\n        // > 1 byte Poly-descriptor Contains: hi-nibble - 4 bits color-index\n        // > lo-nibble - 4 bits number of polygon vertices\n        // >\n        // > Some special cases are encoded in the descriptor byte:\n        // > $ff = End of frame\n        // > $fe = End of frame and the stream skips to the next 64KB block\n        // > $fd = End of stream (we are done \\o/)\n        const descriptor = array[head++];\n\n        if (descriptor === 0xff) {\n          // end of frame\n          break;\n        } else if (descriptor === 0xfe) {\n          // end of frame + skip to the next 64KB\n          shouldSkip = true;\n          break;\n        } else if (descriptor === 0xfd) {\n          // end of stream\n          shouldEnd = true;\n          break;\n        }\n\n        const colorIndex = (descriptor >> 4) & 15;\n        const nIndices = descriptor & 15;\n\n        // > For every vertex of the polygon\n        // > {\n        // > 1 byte Vertex-id (0-255)\n        // > }\n        const indices = array.subarray(head, head + nIndices);\n        head += nIndices;\n\n        polygons.push({\n          colorIndex,\n          indices: Array.from(indices),\n        });\n      }\n\n      frames.push({\n        needsClear,\n        indexedMode,\n        palette: Array.from(palette),\n        vertices: Array.from(vertices),\n        polygons,\n      });\n\n      // > Else if frame is stored in non-indexed mode\n    } else {\n      const polygons: { colorIndex: number; vertices: number[] }[] = [];\n\n      // > While (\u2026)\n      for (;;) {\n        // > 1 byte Poly-descriptor (See indexed mode)\n        const descriptor = array[head++];\n\n        if (descriptor === 0xff) {\n          // end of frame\n          break;\n        } else if (descriptor === 0xfe) {\n          // end of frame + skip to the next 64KB\n          shouldSkip = true;\n          break;\n        } else if (descriptor === 0xfd) {\n          // end of stream\n          shouldEnd = true;\n          break;\n        }\n\n        const colorIndex = (descriptor >> 4) & 15;\n        const nVertices = descriptor & 15;\n\n        // > For every vertex of the polygon\n        // > {\n        // > 1 byte Vertex-id (0-255)\n        // > }\n        const vertices = array.subarray(head, head + 2 * nVertices);\n        head += 2 * nVertices;\n\n        polygons.push({\n          colorIndex,\n          vertices: Array.from(vertices),\n        });\n      }\n\n      frames.push({\n        needsClear,\n        indexedMode,\n        palette: Array.from(palette),\n        polygons,\n      });\n    }\n\n    if (shouldSkip) {\n      head = (Math.floor(head / 0x10000) + 1) * 0x10000;\n      shouldSkip = false;\n    }\n\n    if (shouldEnd) {\n      break;\n    }\n  }\n\n  return frames;\n}\n", "import { colorFromAtariST } from '../color/colorFromAtariST';\nimport { colorToHex } from '../color/colorToHex';\nimport type { STNICCCFrame } from './STNICCCFrame';\n\nexport function stnicccToSVG(\n  frames: STNICCCFrame[],\n  options: {\n    fps?: number;\n  } = {},\n): string {\n  const delta = 1.0 / (options?.fps ?? 30.0);\n\n  let svg =\n    '<svg width=\"256\" height=\"200\" viewBox=\"0 0 256 200\" xmlns=\"http://www.w3.org/2000/svg\">';\n\n  let style = `g{visibility:hidden;animation-duration:${(delta * frames.length).toFixed(3)}s;animation-iteration-count:infinite;animation-name:frame}@keyframes frame{0%{visibility:visible}${200.0 / frames.length}%{visibility:hidden}}`;\n\n  frames.map((frame, iFrame) => {\n    const { indexedMode, palette, polygons } = frame;\n\n    style += `#f${iFrame}{animation-delay:${(delta * iFrame).toFixed(3)}s}`;\n\n    const paletteInHex = palette.map((stColor) => {\n      const color = colorFromAtariST(stColor);\n      return colorToHex(color);\n    });\n\n    let childrenStr = '<rect width=\"256\" height=\"200\" fill=\"#000\" />';\n\n    let currentColorIndex = -1;\n    let d = '';\n\n    if (indexedMode) {\n      const { vertices } = frame;\n\n      polygons.map(({ colorIndex, indices }) => {\n        if (currentColorIndex !== colorIndex) {\n          if (currentColorIndex !== -1) {\n            const colorHex = paletteInHex[currentColorIndex];\n            childrenStr += `<path d=\"${d}\" fill=\"${colorHex}\" />`;\n          }\n\n          currentColorIndex = colorIndex;\n          d = '';\n        }\n\n        for (let i = 0; i < indices.length; i++) {\n          const index = indices[i];\n          const x = vertices[2 * index];\n          const y = vertices[2 * index + 1];\n\n          d += i === 0 ? `M${x},${y}` : `L${x},${y}`;\n        }\n      });\n    } else {\n      polygons.map(({ colorIndex, vertices }) => {\n        if (currentColorIndex !== colorIndex) {\n          if (currentColorIndex !== -1) {\n            const colorHex = paletteInHex[currentColorIndex];\n            childrenStr += `<path d=\"${d}\" fill=\"${colorHex}\" />`;\n          }\n\n          currentColorIndex = colorIndex;\n          d = '';\n        }\n\n        for (let i = 0; i < vertices.length; i += 2) {\n          const x = vertices[i];\n          const y = vertices[i + 1];\n\n          d += i === 0 ? `M${x},${y}` : `L${x},${y}`;\n        }\n      });\n    }\n\n    const colorHex = paletteInHex[currentColorIndex];\n    childrenStr += `<path d=\"${d}\" fill=\"${colorHex}\" />`;\n\n    svg += `<g id=\"f${iFrame}\">${childrenStr}</g>`;\n  });\n\n  svg += `<style>${style}</style></svg>`;\n\n  return svg;\n}\n", "import { HistoryMeanCalculator } from '../HistoryMeanCalculator/HistoryMeanCalculator';\n\nexport class TapTempo {\n  private __bpm = 0.0;\n  private __lastTap = 0.0;\n  private __lastBeat = 0.0;\n  private __lastTime = 0.0;\n  private __calc: HistoryMeanCalculator = new HistoryMeanCalculator(16);\n\n  public get beatDuration(): number {\n    return 60.0 / this.__bpm;\n  }\n\n  public get bpm(): number {\n    return this.__bpm;\n  }\n\n  public set bpm(bpm: number) {\n    this.__lastBeat = this.beat;\n    this.__lastTime = performance.now();\n    this.__bpm = bpm;\n  }\n\n  public get beat(): number {\n    return this.__lastBeat + ((performance.now() - this.__lastTime) * 0.001) / this.beatDuration;\n  }\n\n  public reset(): void {\n    this.__calc.reset();\n  }\n\n  public nudge(amount: number): void {\n    this.__lastBeat = this.beat + amount;\n    this.__lastTime = performance.now();\n  }\n\n  public tap(): void {\n    const now = performance.now();\n    const delta = (now - this.__lastTap) * 0.001;\n\n    if (2.0 < delta) {\n      this.reset();\n    } else {\n      this.__calc.push(delta);\n      this.__bpm = 60.0 / this.__calc.mean;\n    }\n\n    this.__lastTap = now;\n    this.__lastTime = now;\n    this.__lastBeat = 0.0;\n  }\n}\n", "/**\n * Make the given function a throttled one.\n *\n * @example\n * ```ts\n * const func = throttle( 100, () => {\n *   // some expensive procedure\n * } );\n *\n * func();\n * func();\n * func();\n * ```\n */\nexport function throttle(func: () => void, rateMs: number): () => void {\n  /** Timeout ID for the queued function call */\n  let queueId: ReturnType<typeof setTimeout> | null | undefined;\n\n  /** Timestamp of the last execution */\n  let lastTime = -Infinity;\n\n  return () => {\n    const now = Date.now();\n    const untilNextExec = lastTime + rateMs - now;\n\n    // clear any previously queued calls\n    if (queueId) {\n      clearTimeout(queueId);\n    }\n\n    if (untilNextExec <= 0) {\n      // if enough time has passed, execute immediately\n      lastTime = now;\n      func();\n    } else {\n      // if not, queue for execution after the next good time\n      queueId = setTimeout(() => {\n        lastTime = Date.now();\n        func();\n      }, untilNextExec);\n    }\n  };\n}\n", "import { arraySerial } from '../array';\n\n/**\n * Parse a polyphonic tinyseq buffer.\n *\n * Returns [ time, offTime, note, reserved, time, offTime, note, reserved, ... ]\n */\nexport function createTinyseqPolyReader(\n  buffer: Uint8Array,\n  options: {\n    poly?: number;\n    blockSize?: number;\n    sampleRate?: number;\n    stepsPerSecond?: number;\n  } = {},\n): () => Float32Array[] {\n  const poly = options.poly ?? 8;\n  const blockSize = options.blockSize ?? 128;\n  const sampleRate = options.sampleRate ?? 48000;\n  const stepsPerSecond = options.stepsPerSecond ?? 1.0;\n\n  let samples = 0;\n  let pos = 0;\n  let note: number;\n  const notes = arraySerial(poly).fill(-1);\n  const notesTime = arraySerial(poly).fill(-Infinity);\n  const notesOffTime = arraySerial(poly).fill(-Infinity);\n  let nextStep = 0;\n\n  return () => {\n    const ret = arraySerial(poly).map(() => new Float32Array(4 * blockSize));\n\n    arraySerial(blockSize).map((iSample) => {\n      const t = samples / sampleRate;\n      const s = t * stepsPerSecond;\n\n      if (s >= nextStep) {\n        const eventNote = buffer[pos];\n        const eventDeltaStep = buffer[pos + 1];\n\n        note = ((pos === 0 ? 60 : note) + eventNote) & 127;\n\n        // find same note\n        let iPoly = notes.indexOf(note);\n\n        // find earliest note off\n        let tEarliest = Infinity;\n\n        if (iPoly === -1) {\n          notesTime.map((tOn, jPoly) => {\n            const tOff = notesOffTime[jPoly];\n            if (tOn <= tOff) {\n              if (tOff < tEarliest) {\n                iPoly = jPoly;\n                tEarliest = tOff;\n              }\n            }\n          });\n        }\n\n        // find earliest note on\n        if (iPoly === -1) {\n          notesTime.map((tOn, jPoly) => {\n            if (tOn < tEarliest) {\n              iPoly = jPoly;\n              tEarliest = tOn;\n            }\n          });\n        }\n\n        notes[iPoly] = note;\n\n        if (eventNote & 128) {\n          if (notesOffTime[iPoly] < notesTime[iPoly]) {\n            notesOffTime[iPoly] = t;\n          }\n        } else {\n          if (notesOffTime[iPoly] >= notesTime[iPoly]) {\n            notesTime[iPoly] = t;\n          }\n        }\n\n        nextStep += eventDeltaStep;\n\n        pos = (pos + 2) % buffer.length;\n      }\n\n      samples++;\n\n      arraySerial(poly).map((iPoly) => {\n        const noteTime = notesTime[iPoly];\n        const noteOffTime = notesOffTime[iPoly];\n\n        ret[iPoly][4 * iSample + 0] = t - noteTime; // time\n        ret[iPoly][4 * iSample + 1] = noteOffTime < noteTime ? 0.0 : t - noteOffTime; // offTime\n        ret[iPoly][4 * iSample + 2] = notes[iPoly]; // note\n        ret[iPoly][4 * iSample + 3] = 0.0; // reserved\n      });\n    });\n\n    return ret;\n  };\n}\n", "import { arraySerial } from '../array';\n\n/**\n * Parse a tinyseq buffer.\n *\n * Returns [ time, offTime, note, reserved, time, offTime, note, reserved, ... ]\n */\nexport function createTinyseqReader(\n  buffer: Uint8Array,\n  options: {\n    blockSize?: number;\n    sampleRate?: number;\n    stepsPerSecond?: number;\n  } = {},\n): () => Float32Array {\n  const blockSize = options.blockSize ?? 128;\n  const sampleRate = options.sampleRate ?? 48000;\n  const stepsPerSecond = options.stepsPerSecond ?? 960.0;\n\n  let samples = 0;\n  let pos = 0;\n  let note: number;\n  let noteTime = -Infinity;\n  let noteOffTime = -Infinity;\n  let nextStep = 0;\n\n  return () => {\n    return new Float32Array(\n      arraySerial(blockSize).flatMap(() => {\n        const t = samples / sampleRate;\n        const s = t * stepsPerSecond;\n\n        if (s >= nextStep) {\n          const eventNote = buffer[pos];\n          const eventDeltaStep = buffer[pos + 1];\n\n          note = ((pos === 0 ? 60 : note) + eventNote) & 127;\n          if (eventNote & 128) {\n            if (noteOffTime < noteTime) {\n              noteOffTime = t;\n            }\n          } else {\n            if (noteOffTime >= noteTime) {\n              noteTime = t;\n            }\n          }\n\n          nextStep += eventDeltaStep;\n\n          pos = (pos + 2) % buffer.length;\n        }\n\n        samples++;\n\n        return [\n          t - noteTime, // time\n          noteOffTime < noteTime ? 0.0 : t - noteOffTime, // offTime\n          note, // note\n          0.0, // reserved\n        ];\n      }),\n    );\n  };\n}\n", "import { arraySerial } from '../array';\nimport type { MidiParseResult } from '../midi';\n\n/**\n * Convert the parsed midi result to a tinyseq binary.\n *\n * See: {@link midiParse}\n *\n * @param midi The parsed midi result\n * @param track The index of the midi track you want to convert\n * @param tickMultiplier Multiply this value to tick\n * @returns A tinyseq binary\n */\nexport function tinyseqFromMidiParseResult(\n  midi: MidiParseResult,\n  {\n    track,\n    tickMultiplier,\n  }: {\n    track?: number;\n    tickMultiplier?: number;\n  } = {},\n): Uint8Array {\n  const data: number[] = [];\n  let lastNote = 60;\n  let delta = 0;\n\n  const trackEvents = midi[1][track ?? 0.0];\n\n  // [ delta, midi event, note, vel ][] -> [ onoff (0 or 128) + deltaNote, delta, ... ]\n  // [ [ 4, 144, 60, 100 ], [ 4, 128, 60, 100 ] ] -> [ 128, 4, 0, 4, 128, 0 ]\n\n  arraySerial(trackEvents.length + 1).map((i) => {\n    delta += (trackEvents[i]?.[0] ?? 0) * (tickMultiplier ?? 1.0);\n\n    if (delta === 0 && i === 0) {\n      return;\n    } // ignore if it's the first event and delta is 0\n\n    const evMsg = trackEvents[i - 1]?.[1] ?? 128;\n    const evNote = trackEvents[i - 1]?.[2] ?? 60;\n\n    if (evMsg >= 160) {\n      return;\n    } // ignore if the msg is not a note event\n\n    const noteDelta = (evNote - lastNote + 128) & 127;\n    lastNote = evNote;\n    const onoff = evMsg < 144 ? 128 : 0; // 0 if on (144 - 159), 128 if off (128 - 143)\n\n    // probably 240 is more efficient than 256 since the division in most of midi files are 480 or 960\n    let deltaConsume = Math.floor(Math.min(delta, 240));\n    data.push(noteDelta + onoff, deltaConsume);\n    delta -= deltaConsume;\n\n    while (delta >= 1) {\n      deltaConsume = Math.floor(Math.min(delta, 240));\n      data.push(onoff, deltaConsume);\n      delta -= deltaConsume;\n    }\n  });\n\n  return new Uint8Array(data);\n}\n", "export class Xorshift {\n  public seed: number;\n\n  public constructor(seed?: number) {\n    this.seed = seed || 1;\n  }\n\n  public gen(seed?: number): number {\n    if (seed) {\n      this.seed = seed;\n    }\n\n    this.seed = this.seed ^ (this.seed << 13);\n    this.seed = this.seed ^ (this.seed >>> 17);\n    this.seed = this.seed ^ (this.seed << 5);\n    return this.seed / 2 ** 32 + 0.5;\n  }\n\n  public set(seed?: number): void {\n    this.seed = seed || this.seed || 1;\n  }\n}\n\nexport default Xorshift;\n", "import { linearstep } from '../math/linearstep';\n\n/**\n * https://twitter.com/yugop\n *\n * @param text The input text\n * @param phase The value between 0.0 and 1.0\n * @param randomRatio The nerd value\n */\nexport function getYugopText(text: string, phase: number, randomRatio = 0.5): string {\n  if (phase >= 1.0) {\n    return text;\n  }\n  if (phase < 0.0) {\n    return '';\n  }\n\n  /*\n   * ------=====\n   * .------====\n   * ..------===\n   * ...------==\n   * ....------=\n   * ^     ^   ^\n   * |     |   |\n   * |     |   phase is 1.0\n   * |     phase is randomRatio\n   * phase is 0.0\n   */\n\n  const displayTween = linearstep(0.0, 1.0 - randomRatio, phase);\n  const fixTween = linearstep(randomRatio, 1.0, phase);\n\n  const displayLength = 1.0 + Math.floor(displayTween * (text.length - 1));\n  const fixLength = phase < randomRatio ? 0 : 1.0 + Math.floor(fixTween * (text.length - 1));\n  const randomLength = displayLength - fixLength;\n\n  const randomStr = [...Array(randomLength)]\n    .map(() => String.fromCharCode(33 + Math.floor(93 * Math.random())))\n    .join('');\n\n  return text.substring(0, fixLength) + randomStr;\n}\n"],
  "mappings": "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",
  "names": ["step", "promiseAccum", "sum", "EPSILON", "EPSILON", "EPSILON", "cards", "target", "colorHex"]
}
