{"version":3,"file":"index.cjs","names":[],"sources":["../src/version.ts","../src/grid.ts","../src/bit-enumerator.ts","../src/cell-grid.ts","../src/change-grid.ts","../src/frac-grid.ts","../src/color.ts","../src/patterns.ts","../src/color-grid.ts","../src/hsb-color.ts","../src/color-func.ts","../src/gradients.ts","../src/hex.ts","../src/format-utils.ts","../src/lib.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * The available versions of LifeHash.\n */\nexport enum Version {\n  /** DEPRECATED. Uses HSB gamut. Not CMYK-friendly. Has some minor gradient bugs. */\n  version1 = 0,\n  /** CMYK-friendly gamut. Recommended for most purposes. */\n  version2 = 1,\n  /** Double resolution. CMYK-friendly gamut. */\n  detailed = 2,\n  /** Optimized for generating machine-vision fiducials. High-contrast. CMYK-friendly gamut. */\n  fiducial = 3,\n  /** Optimized for generating machine-vision fiducials. High-contrast. Grayscale. */\n  grayscale_fiducial = 4,\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\n/**\n * A class that holds a 2-dimensional grid of values,\n * and allows the reading, writing, and iteration through those values.\n */\nexport class Grid<T> {\n  public readonly storage: T[];\n\n  constructor(\n    public readonly width: number,\n    public readonly height: number,\n    defaultValue: T,\n  ) {\n    this.storage = new Array<T>(width * height).fill(defaultValue);\n  }\n\n  private offset(x: number, y: number): number {\n    return y * this.width + x;\n  }\n\n  private static circularIndex(index: number, modulus: number): number {\n    return ((index % modulus) + modulus) % modulus;\n  }\n\n  setAll(value: T): void {\n    this.storage.fill(value);\n  }\n\n  setValue(value: T, x: number, y: number): void {\n    this.storage[this.offset(x, y)] = value;\n  }\n\n  getValue(x: number, y: number): T {\n    return this.storage[this.offset(x, y)];\n  }\n\n  forAll(f: (x: number, y: number) => void): void {\n    for (let y = 0; y < this.height; y++) {\n      for (let x = 0; x < this.width; x++) {\n        f(x, y);\n      }\n    }\n  }\n\n  forNeighborhood(\n    px: number,\n    py: number,\n    f: (ox: number, oy: number, nx: number, ny: number) => void,\n  ): void {\n    for (let oy = -1; oy <= 1; oy++) {\n      for (let ox = -1; ox <= 1; ox++) {\n        const nx = Grid.circularIndex(ox + px, this.width);\n        const ny = Grid.circularIndex(oy + py, this.height);\n        f(ox, oy, nx, ny);\n      }\n    }\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport type { Data } from \"./data\";\n\n/**\n * A class that takes a block of data and returns its bits singularly or in clusters.\n */\nexport class BitEnumerator {\n  private index = 0;\n  private mask = 0x80;\n\n  constructor(private readonly data: Data) {}\n\n  hasNext(): boolean {\n    return this.mask !== 0 || this.index !== this.data.length - 1;\n  }\n\n  next(): boolean {\n    if (!this.hasNext()) {\n      throw new Error(\"BitEnumerator underflow\");\n    }\n\n    if (this.mask === 0) {\n      this.mask = 0x80;\n      this.index++;\n    }\n\n    const b = (this.data[this.index] & this.mask) !== 0;\n\n    this.mask >>= 1;\n\n    return b;\n  }\n\n  nextUint2(): number {\n    let bitMask = 0x02;\n    let value = 0;\n    for (let i = 0; i < 2; i++) {\n      if (this.next()) {\n        value |= bitMask;\n      }\n      bitMask >>= 1;\n    }\n    return value;\n  }\n\n  nextUint8(): number {\n    let bitMask = 0x80;\n    let value = 0;\n    for (let i = 0; i < 8; i++) {\n      if (this.next()) {\n        value |= bitMask;\n      }\n      bitMask >>= 1;\n    }\n    return value;\n  }\n\n  nextUint16(): number {\n    let bitMask = 0x8000;\n    let value = 0;\n    for (let i = 0; i < 16; i++) {\n      if (this.next()) {\n        value |= bitMask;\n      }\n      bitMask >>= 1;\n    }\n    return value;\n  }\n\n  nextFrac(): number {\n    return this.nextUint16() / 65535.0;\n  }\n\n  forAll(f: (bit: boolean) => void): void {\n    while (this.hasNext()) {\n      f(this.next());\n    }\n  }\n}\n\n/**\n * A class that accumulates bits fed into it and returns a block of data containing those bits.\n */\nexport class BitAggregator {\n  private readonly _data: number[] = [];\n  private bitMask = 0;\n\n  append(bit: boolean): void {\n    if (this.bitMask === 0) {\n      this.bitMask = 0x80;\n      this._data.push(0);\n    }\n\n    if (bit) {\n      this._data[this._data.length - 1] |= this.bitMask;\n    }\n\n    this.bitMask >>= 1;\n  }\n\n  data(): Data {\n    return new Uint8Array(this._data);\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Grid } from \"./grid\";\nimport type { Data } from \"./data\";\nimport { BitAggregator, BitEnumerator } from \"./bit-enumerator\";\nimport type { ChangeGrid } from \"./change-grid\";\n\n/**\n * A class that holds an array of boolean cells and that is\n * capable of running Conway's Game of Life to produce the next generation.\n */\nexport class CellGrid {\n  public readonly grid: Grid<boolean>;\n\n  constructor(width: number, height: number) {\n    this.grid = new Grid<boolean>(width, height, false);\n  }\n\n  private static isAliveInNextGeneration(currentAlive: boolean, neighborsCount: number): boolean {\n    if (currentAlive) {\n      return neighborsCount === 2 || neighborsCount === 3;\n    } else {\n      return neighborsCount === 3;\n    }\n  }\n\n  private countNeighbors(px: number, py: number): number {\n    let total = 0;\n    this.grid.forNeighborhood(px, py, (ox, oy, nx, ny) => {\n      if (ox === 0 && oy === 0) {\n        return;\n      }\n      if (this.grid.getValue(nx, ny)) {\n        total++;\n      }\n    });\n    return total;\n  }\n\n  data(): Data {\n    const a = new BitAggregator();\n    this.grid.forAll((x, y) => {\n      a.append(this.grid.getValue(x, y));\n    });\n    return a.data();\n  }\n\n  setData(data: Data): void {\n    const e = new BitEnumerator(data);\n    let i = 0;\n    e.forAll((b) => {\n      this.grid.storage[i] = b;\n      i++;\n    });\n  }\n\n  nextGeneration(\n    currentChangeGrid: ChangeGrid,\n    nextCellGrid: CellGrid,\n    nextChangeGrid: ChangeGrid,\n  ): void {\n    nextCellGrid.grid.setAll(false);\n    nextChangeGrid.grid.setAll(false);\n\n    const width = this.grid.width;\n    const height = this.grid.height;\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        const currentAlive = this.grid.getValue(x, y);\n        if (currentChangeGrid.grid.getValue(x, y)) {\n          const neighborsCount = this.countNeighbors(x, y);\n          const nextAlive = CellGrid.isAliveInNextGeneration(currentAlive, neighborsCount);\n          if (nextAlive) {\n            nextCellGrid.grid.setValue(true, x, y);\n          }\n          if (currentAlive !== nextAlive) {\n            nextChangeGrid.setChanged(x, y);\n          }\n        } else {\n          nextCellGrid.grid.setValue(currentAlive, x, y);\n        }\n      }\n    }\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Grid } from \"./grid\";\n\n/**\n * A grid used to optimize the running of Conway's Game of Life by keeping\n * track of cells that need consideration in the next generation, which\n * allows the pruning of cells that don't need consideration.\n */\nexport class ChangeGrid {\n  public readonly grid: Grid<boolean>;\n\n  constructor(width: number, height: number) {\n    this.grid = new Grid<boolean>(width, height, false);\n  }\n\n  setChanged(px: number, py: number): void {\n    const width = this.grid.width;\n    const height = this.grid.height;\n    for (let oy = -1; oy <= 1; oy++) {\n      for (let ox = -1; ox <= 1; ox++) {\n        const nx = (((ox + px) % width) + width) % width;\n        const ny = (((oy + py) % height) + height) % height;\n        this.grid.setValue(true, nx, ny);\n      }\n    }\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Grid } from \"./grid\";\nimport type { CellGrid } from \"./cell-grid\";\n\n/**\n * A grid of floating point values in [0..1], used for onion-skinning\n * the generations of the Game of Life into a single grayscale image.\n */\nexport class FracGrid {\n  public readonly grid: Grid<number>;\n\n  constructor(width: number, height: number) {\n    this.grid = new Grid<number>(width, height, 0);\n  }\n\n  overlay(cellGrid: CellGrid, frac: number): void {\n    const width = this.grid.width;\n    const height = this.grid.height;\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        if (cellGrid.grid.getValue(x, y)) {\n          this.grid.setValue(frac, x, y);\n        }\n      }\n    }\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\n/**\n * Interpolate `t` from [0..1] to [a..b].\n */\nexport function lerpTo(toA: number, toB: number, t: number): number {\n  return t * (toB - toA) + toA;\n}\n\n/**\n * Interpolate `t` from [a..b] to [0..1].\n */\nexport function lerpFrom(fromA: number, fromB: number, t: number): number {\n  return (fromA - t) / (fromA - fromB);\n}\n\n/**\n * Interpolate `t` from [a..b] to [c..d].\n */\nexport function lerp(fromA: number, fromB: number, toC: number, toD: number, t: number): number {\n  return lerpTo(toC, toD, lerpFrom(fromA, fromB, t));\n}\n\n/**\n * Return the minimum of `a` and `b`.\n */\nexport function min(a: number, b: number): number;\n/**\n * Return the minimum of `a`, `b`, and `c`.\n */\n// eslint-disable-next-line no-redeclare\nexport function min(a: number, b: number, c: number): number;\n// eslint-disable-next-line no-redeclare\nexport function min(a: number, b: number, c?: number): number {\n  if (c !== undefined) {\n    return Math.min(Math.min(a, b), c);\n  }\n  return a < b ? a : b;\n}\n\n/**\n * Return the maximum of `a` and `b`.\n */\nexport function max(a: number, b: number): number;\n/**\n * Return the maximum of `a`, `b`, and `c`.\n */\n// eslint-disable-next-line no-redeclare\nexport function max(a: number, b: number, c: number): number;\n// eslint-disable-next-line no-redeclare\nexport function max(a: number, b: number, c?: number): number {\n  if (c !== undefined) {\n    return Math.max(Math.max(a, b), c);\n  }\n  return a > b ? a : b;\n}\n\n/**\n * Return `n` clamped to the range [0..1].\n */\nexport function clamped(n: number): number {\n  return max(min(n, 1), 0);\n}\n\n/**\n * Return `dividend` MODULO `divisor` where `dividend` can be negative,\n * but the result is always non-negative.\n *\n * Round-trips through `f32` to mirror Rust's `(x as f32) % (y as f32)` —\n * which the Rust crate uses to match the original C++ `fmodf`.\n */\nconst moduloF32 = new Float32Array(1);\nfunction toF32(x: number): number {\n  moduloF32[0] = x;\n  return moduloF32[0];\n}\nexport function modulo(dividend: number, divisor: number): number {\n  const d = toF32(divisor);\n  const a = toF32(toF32(dividend) % d);\n  const b = toF32(a + d) % d;\n  return toF32(b);\n}\n\n/**\n * A struct representing a color.\n */\nexport class Color {\n  constructor(\n    public r = 0,\n    public g = 0,\n    public b = 0,\n  ) {}\n\n  static white = new Color(1, 1, 1);\n  static black = new Color(0, 0, 0);\n  static red = new Color(1, 0, 0);\n  static green = new Color(0, 1, 0);\n  static blue = new Color(0, 0, 1);\n  static cyan = new Color(0, 1, 1);\n  static magenta = new Color(1, 0, 1);\n  static yellow = new Color(1, 1, 0);\n\n  /**\n   * Create a Color from uint8 values [0..255].\n   */\n  static fromUint8Values(r: number, g: number, b: number): Color {\n    return new Color(r / 255, g / 255, b / 255);\n  }\n\n  /**\n   * Linearly interpolate from this color to another.\n   */\n  lerpTo(other: Color, t: number): Color {\n    const f = clamped(t);\n    const red = clamped(this.r * (1 - f) + other.r * f);\n    const green = clamped(this.g * (1 - f) + other.g * f);\n    const blue = clamped(this.b * (1 - f) + other.b * f);\n    return new Color(red, green, blue);\n  }\n\n  /**\n   * Lighten this color by interpolating towards white.\n   */\n  lighten(t: number): Color {\n    return this.lerpTo(Color.white, t);\n  }\n\n  /**\n   * Darken this color by interpolating towards black.\n   */\n  darken(t: number): Color {\n    return this.lerpTo(Color.black, t);\n  }\n\n  /**\n   * Apply a burn effect to this color.\n   */\n  burn(t: number): Color {\n    const f = max(1.0 - t, 1.0e-7);\n    return new Color(\n      min(1.0 - (1.0 - this.r) / f, 1.0),\n      min(1.0 - (1.0 - this.g) / f, 1.0),\n      min(1.0 - (1.0 - this.b) / f, 1.0),\n    );\n  }\n\n  /**\n   * Calculate the luminance of this color.\n   *\n   * Uses `f32`-precision multiplies/squares/sqrt to mirror Rust's\n   * `as f32 → powi(2) → sqrt() → as f64`, which in turn mirrors the\n   * original C++ `sqrtf`/`powf`.\n   */\n  luminance(): number {\n    const r = Math.fround(0.299 * this.r);\n    const g = Math.fround(0.587 * this.g);\n    const b = Math.fround(0.114 * this.b);\n    const r2 = Math.fround(r * r);\n    const g2 = Math.fround(g * g);\n    const b2 = Math.fround(b * b);\n    const sum = Math.fround(Math.fround(r2 + g2) + b2);\n    return Math.fround(Math.sqrt(sum));\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { type BitEnumerator } from \"./bit-enumerator\";\nimport { Version } from \"./version\";\n\n/**\n * The symmetries used by LifeHash.\n */\nexport enum Pattern {\n  /** Mirror around central axes. */\n  snowflake = \"snowflake\",\n  /** Rotate around center. */\n  pinwheel = \"pinwheel\",\n  /** Identity (no symmetry). */\n  fiducial = \"fiducial\",\n}\n\n/**\n * A function that takes a deterministic source of bits and selects a pattern\n * used to add symmetry to a particular LifeHash version.\n */\nexport function selectPattern(entropy: BitEnumerator, version: Version): Pattern {\n  switch (version) {\n    case Version.fiducial:\n    case Version.grayscale_fiducial:\n      return Pattern.fiducial;\n    case Version.version1:\n    case Version.version2:\n    case Version.detailed:\n      return entropy.next() ? Pattern.snowflake : Pattern.pinwheel;\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Grid } from \"./grid\";\nimport { Color } from \"./color\";\nimport type { FracGrid } from \"./frac-grid\";\nimport type { ColorFunc } from \"./color-func\";\nimport { Pattern } from \"./patterns\";\n\ninterface Transform {\n  transpose: boolean;\n  reflectX: boolean;\n  reflectY: boolean;\n}\n\nconst snowflakeTransforms: Transform[] = [\n  { transpose: false, reflectX: false, reflectY: false },\n  { transpose: false, reflectX: true, reflectY: false },\n  { transpose: false, reflectX: false, reflectY: true },\n  { transpose: false, reflectX: true, reflectY: true },\n];\n\nconst pinwheelTransforms: Transform[] = [\n  { transpose: false, reflectX: false, reflectY: false },\n  { transpose: true, reflectX: true, reflectY: false },\n  { transpose: true, reflectX: false, reflectY: true },\n  { transpose: false, reflectX: true, reflectY: true },\n];\n\nconst fiducialTransforms: Transform[] = [{ transpose: false, reflectX: false, reflectY: false }];\n\n/**\n * A class that takes a grayscale grid and applies color and\n * symmetry to it to yield the finished LifeHash.\n */\nexport class ColorGrid {\n  public readonly grid: Grid<Color>;\n\n  constructor(fracGrid: FracGrid, gradient: ColorFunc, pattern: Pattern) {\n    const multiplier = pattern === Pattern.fiducial ? 1 : 2;\n    const targetWidth = fracGrid.grid.width * multiplier;\n    const targetHeight = fracGrid.grid.height * multiplier;\n\n    this.grid = new Grid<Color>(targetWidth, targetHeight, new Color());\n\n    const maxX = targetWidth - 1;\n    const maxY = targetHeight - 1;\n\n    const transforms: Transform[] = ColorGrid.getTransforms(pattern);\n\n    const fracWidth = fracGrid.grid.width;\n    const fracHeight = fracGrid.grid.height;\n    for (let y = 0; y < fracHeight; y++) {\n      for (let x = 0; x < fracWidth; x++) {\n        const value = fracGrid.grid.getValue(x, y);\n        const color = gradient(value);\n        for (const t of transforms) {\n          let px = x;\n          let py = y;\n          if (t.transpose) {\n            [px, py] = [py, px];\n          }\n          if (t.reflectX) {\n            px = maxX - px;\n          }\n          if (t.reflectY) {\n            py = maxY - py;\n          }\n          this.grid.setValue(color, px, py);\n        }\n      }\n    }\n  }\n\n  private static getTransforms(pattern: Pattern): Transform[] {\n    switch (pattern) {\n      case Pattern.snowflake:\n        return snowflakeTransforms;\n      case Pattern.pinwheel:\n        return pinwheelTransforms;\n      case Pattern.fiducial:\n        return fiducialTransforms;\n    }\n  }\n\n  colors(): number[] {\n    const result: number[] = [];\n    for (const c of this.grid.storage) {\n      result.push(c.r, c.g, c.b);\n    }\n    return result;\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Color, clamped, modulo } from \"./color\";\n\n/**\n * A struct representing a color in the HSB space.\n * Only used by version1 LifeHashes.\n */\nexport class HSBColor {\n  constructor(\n    public hue: number,\n    public saturation = 1,\n    public brightness = 1,\n  ) {}\n\n  /**\n   * Create an HSBColor from a hue alone, with saturation and brightness both set to 1.\n   */\n  static fromHue(hue: number): HSBColor {\n    return new HSBColor(hue, 1, 1);\n  }\n\n  /**\n   * Convert to RGB Color.\n   */\n  color(): Color {\n    const v = clamped(this.brightness);\n    const s = clamped(this.saturation);\n\n    if (s <= 0) {\n      return new Color(v, v, v);\n    }\n\n    let h = modulo(this.hue, 1);\n    if (h < 0) {\n      h += 1;\n    }\n    h *= 6;\n\n    // C++/Rust use floorf on an f32, which can pick a different sextant than\n    // a plain f64 floor when h is just below an integer boundary.\n    const i = Math.floor(Math.fround(h));\n    const f = h - i;\n    const p = v * (1 - s);\n    const q = v * (1 - s * f);\n    const t = v * (1 - s * (1 - f));\n\n    switch (i) {\n      case 0:\n        return new Color(v, t, p);\n      case 1:\n        return new Color(q, v, p);\n      case 2:\n        return new Color(p, v, t);\n      case 3:\n        return new Color(p, q, v);\n      case 4:\n        return new Color(t, p, v);\n      case 5:\n        return new Color(v, p, q);\n      default:\n        throw new Error(\"Internal error in HSB conversion\");\n    }\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Color, modulo } from \"./color\";\n\n/**\n * A function that takes a fraction [0..1] and returns a color along a gradient.\n */\nexport type ColorFunc = (t: number) => Color;\n\n/**\n * Returns the reverse of the given color function.\n */\nexport function reverse(c: ColorFunc): ColorFunc {\n  return (t: number) => c(1 - t);\n}\n\n/**\n * Returns a color function that blends from one color to another.\n */\nexport function blend2(color1: Color, color2: Color): ColorFunc {\n  return (t: number) => color1.lerpTo(color2, t);\n}\n\n/**\n * Returns a color function that blends through each of the given colors at equal intervals.\n */\nexport function blend(colors: Color[]): ColorFunc {\n  const count = colors.length;\n  switch (count) {\n    case 0:\n      return blend2(Color.black, Color.black);\n    case 1:\n      return blend2(colors[0], colors[0]);\n    case 2:\n      return blend2(colors[0], colors[1]);\n    default:\n      return (t: number) => {\n        if (t >= 1) {\n          return colors[count - 1];\n        } else if (t <= 0) {\n          return colors[0];\n        }\n        const segments = count - 1;\n        const s = t * segments;\n        const segment = Math.floor(s);\n        const segmentFrac = modulo(s, 1);\n        const c1 = colors[segment];\n        const c2 = colors[segment + 1];\n        return c1.lerpTo(c2, segmentFrac);\n      };\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Color, lerp, modulo } from \"./color\";\nimport { HSBColor } from \"./hsb-color\";\nimport { blend, blend2, reverse, type ColorFunc } from \"./color-func\";\nimport { type BitEnumerator } from \"./bit-enumerator\";\nimport { Version } from \"./version\";\n\nfunction grayscale(): ColorFunc {\n  return blend2(Color.black, Color.white);\n}\n\nfunction selectGrayscale(entropy: BitEnumerator): ColorFunc {\n  return entropy.next() ? grayscale() : reverse(grayscale());\n}\n\nfunction makeHue(t: number): Color {\n  return HSBColor.fromHue(t).color();\n}\n\nfunction spectrum(): ColorFunc {\n  return blend([\n    Color.fromUint8Values(0, 168, 222),\n    Color.fromUint8Values(51, 51, 145),\n    Color.fromUint8Values(233, 19, 136),\n    Color.fromUint8Values(235, 45, 46),\n    Color.fromUint8Values(253, 233, 43),\n    Color.fromUint8Values(0, 158, 84),\n    Color.fromUint8Values(0, 168, 222),\n  ]);\n}\n\nfunction spectrumCmykSafe(): ColorFunc {\n  return blend([\n    Color.fromUint8Values(0, 168, 222),\n    Color.fromUint8Values(41, 60, 130),\n    Color.fromUint8Values(210, 59, 130),\n    Color.fromUint8Values(217, 63, 53),\n    Color.fromUint8Values(244, 228, 81),\n    Color.fromUint8Values(0, 158, 84),\n    Color.fromUint8Values(0, 168, 222),\n  ]);\n}\n\nfunction adjustForLuminance(color: Color, contrastColor: Color): Color {\n  const lum = color.luminance();\n  const contrastLum = contrastColor.luminance();\n  const threshold = 0.6;\n  const offset = Math.abs(lum - contrastLum);\n\n  if (offset > threshold) {\n    return color;\n  }\n\n  const boost = 0.7;\n  const t = lerp(0, threshold, boost, 0, offset);\n\n  if (contrastLum > lum) {\n    // Darken this color\n    return color.darken(t).burn(t * 0.6);\n  } else {\n    // Lighten this color\n    return color.lighten(t).burn(t * 0.6);\n  }\n}\n\n// Monochromatic gradient functions\nfunction monochromatic(entropy: BitEnumerator, hueGenerator: ColorFunc): ColorFunc {\n  const hue = entropy.nextFrac();\n  const isTint = entropy.next();\n  const isReversed = entropy.next();\n  const keyAdvance = entropy.nextFrac() * 0.3 + 0.05;\n  const neutralAdvance = entropy.nextFrac() * 0.3 + 0.05;\n\n  let keyColor = hueGenerator(hue);\n  let contrastBrightness: number;\n\n  if (isTint) {\n    contrastBrightness = 1;\n    keyColor = keyColor.darken(0.5);\n  } else {\n    contrastBrightness = 0;\n  }\n\n  const neutralColor = grayscale()(contrastBrightness);\n  const keyColor2 = keyColor.lerpTo(neutralColor, keyAdvance);\n  const neutralColor2 = neutralColor.lerpTo(keyColor, neutralAdvance);\n\n  const gradient = blend2(keyColor2, neutralColor2);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\nfunction monochromaticFiducial(entropy: BitEnumerator): ColorFunc {\n  const hue = entropy.nextFrac();\n  const isReversed = entropy.next();\n  const isTint = entropy.next();\n\n  const contrastColor = isTint ? Color.white : Color.black;\n  const spec = spectrumCmykSafe();\n  const keyColor = adjustForLuminance(spec(hue), contrastColor);\n\n  const gradient = blend([keyColor, contrastColor, keyColor]);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\n// Complementary gradient functions\nfunction complementary(entropy: BitEnumerator, hueGenerator: ColorFunc): ColorFunc {\n  const spectrum1 = entropy.nextFrac();\n  const spectrum2 = modulo(spectrum1 + 0.5, 1);\n  const lighterAdvance = entropy.nextFrac() * 0.3;\n  const darkerAdvance = entropy.nextFrac() * 0.3;\n  const isReversed = entropy.next();\n\n  const color1 = hueGenerator(spectrum1);\n  const color2 = hueGenerator(spectrum2);\n\n  const luma1 = color1.luminance();\n  const luma2 = color2.luminance();\n\n  let darkerColor: Color;\n  let lighterColor: Color;\n  if (luma1 > luma2) {\n    darkerColor = color2;\n    lighterColor = color1;\n  } else {\n    darkerColor = color1;\n    lighterColor = color2;\n  }\n\n  const adjustedLighterColor = lighterColor.lighten(lighterAdvance);\n  const adjustedDarkerColor = darkerColor.darken(darkerAdvance);\n\n  const gradient = blend2(adjustedDarkerColor, adjustedLighterColor);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\nfunction complementaryFiducial(entropy: BitEnumerator): ColorFunc {\n  const spectrum1 = entropy.nextFrac();\n  const spectrum2 = modulo(spectrum1 + 0.5, 1);\n  const isTint = entropy.next();\n  const isReversed = entropy.next();\n  const neutralColorBias = entropy.next();\n\n  const neutralColor = isTint ? Color.white : Color.black;\n  const spec = spectrumCmykSafe();\n  const color1 = spec(spectrum1);\n  const color2 = spec(spectrum2);\n\n  const biasedNeutralColor = neutralColor.lerpTo(neutralColorBias ? color1 : color2, 0.2).burn(0.1);\n\n  const gradient = blend([\n    adjustForLuminance(color1, biasedNeutralColor),\n    biasedNeutralColor,\n    adjustForLuminance(color2, biasedNeutralColor),\n  ]);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\n// Triadic gradient functions\nfunction triadic(entropy: BitEnumerator, hueGenerator: ColorFunc): ColorFunc {\n  const spectrum1 = entropy.nextFrac();\n  const spectrum2 = modulo(spectrum1 + 1.0 / 3, 1);\n  const spectrum3 = modulo(spectrum1 + 2.0 / 3, 1);\n  const lighterAdvance = entropy.nextFrac() * 0.3;\n  const darkerAdvance = entropy.nextFrac() * 0.3;\n  const isReversed = entropy.next();\n\n  const color1 = hueGenerator(spectrum1);\n  const color2 = hueGenerator(spectrum2);\n  const color3 = hueGenerator(spectrum3);\n\n  const colors = [color1, color2, color3].sort((a, b) => a.luminance() - b.luminance());\n\n  const darkerColor = colors[0];\n  const middleColor = colors[1];\n  const lighterColor = colors[2];\n\n  const adjustedLighterColor = lighterColor.lighten(lighterAdvance);\n  const adjustedDarkerColor = darkerColor.darken(darkerAdvance);\n\n  const gradient = blend([adjustedLighterColor, middleColor, adjustedDarkerColor]);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\nfunction triadicFiducial(entropy: BitEnumerator): ColorFunc {\n  const spectrum1 = entropy.nextFrac();\n  const spectrum2 = modulo(spectrum1 + 1.0 / 3, 1);\n  const spectrum3 = modulo(spectrum1 + 2.0 / 3, 1);\n  const isTint = entropy.next();\n  const neutralInsertIndex = (entropy.nextUint8() % 2) + 1;\n  const isReversed = entropy.next();\n\n  const neutralColor = isTint ? Color.white : Color.black;\n\n  const spec = spectrumCmykSafe();\n  const colors = [spec(spectrum1), spec(spectrum2), spec(spectrum3)];\n\n  switch (neutralInsertIndex) {\n    case 1:\n      colors[0] = adjustForLuminance(colors[0], neutralColor);\n      colors[1] = adjustForLuminance(colors[1], neutralColor);\n      colors[2] = adjustForLuminance(colors[2], colors[1]);\n      break;\n    case 2:\n      colors[1] = adjustForLuminance(colors[1], neutralColor);\n      colors[2] = adjustForLuminance(colors[2], neutralColor);\n      colors[0] = adjustForLuminance(colors[0], colors[1]);\n      break;\n    default:\n      throw new Error(\"Internal error\");\n  }\n\n  colors.splice(neutralInsertIndex, 0, neutralColor);\n\n  const gradient = blend(colors);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\n// Analogous gradient functions\nfunction analogous(entropy: BitEnumerator, hueGenerator: ColorFunc): ColorFunc {\n  const spectrum1 = entropy.nextFrac();\n  const spectrum2 = modulo(spectrum1 + 1.0 / 12, 1);\n  const spectrum3 = modulo(spectrum1 + 2.0 / 12, 1);\n  const spectrum4 = modulo(spectrum1 + 3.0 / 12, 1);\n  const advance = entropy.nextFrac() * 0.5 + 0.2;\n  const isReversed = entropy.next();\n\n  const color1 = hueGenerator(spectrum1);\n  const color2 = hueGenerator(spectrum2);\n  const color3 = hueGenerator(spectrum3);\n  const color4 = hueGenerator(spectrum4);\n\n  let darkestColor: Color;\n  let darkColor: Color;\n  let lightColor: Color;\n  let lightestColor: Color;\n\n  if (color1.luminance() < color4.luminance()) {\n    darkestColor = color1;\n    darkColor = color2;\n    lightColor = color3;\n    lightestColor = color4;\n  } else {\n    darkestColor = color4;\n    darkColor = color3;\n    lightColor = color2;\n    lightestColor = color1;\n  }\n\n  const adjustedDarkestColor = darkestColor.darken(advance);\n  const adjustedDarkColor = darkColor.darken(advance / 2);\n  const adjustedLightColor = lightColor.lighten(advance / 2);\n  const adjustedLightestColor = lightestColor.lighten(advance);\n\n  const gradient = blend([\n    adjustedDarkestColor,\n    adjustedDarkColor,\n    adjustedLightColor,\n    adjustedLightestColor,\n  ]);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\nfunction analogousFiducial(entropy: BitEnumerator): ColorFunc {\n  const spectrum1 = entropy.nextFrac();\n  const spectrum2 = modulo(spectrum1 + 1.0 / 10, 1);\n  const spectrum3 = modulo(spectrum1 + 2.0 / 10, 1);\n  const isTint = entropy.next();\n  const neutralInsertIndex = (entropy.nextUint8() % 2) + 1;\n  const isReversed = entropy.next();\n\n  const neutralColor = isTint ? Color.white : Color.black;\n\n  const spec = spectrumCmykSafe();\n  const colors = [spec(spectrum1), spec(spectrum2), spec(spectrum3)];\n\n  switch (neutralInsertIndex) {\n    case 1:\n      colors[0] = adjustForLuminance(colors[0], neutralColor);\n      colors[1] = adjustForLuminance(colors[1], neutralColor);\n      colors[2] = adjustForLuminance(colors[2], colors[1]);\n      break;\n    case 2:\n      colors[1] = adjustForLuminance(colors[1], neutralColor);\n      colors[2] = adjustForLuminance(colors[2], neutralColor);\n      colors[0] = adjustForLuminance(colors[0], colors[1]);\n      break;\n    default:\n      throw new Error(\"Internal error\");\n  }\n\n  colors.splice(neutralInsertIndex, 0, neutralColor);\n\n  const gradient = blend(colors);\n  return isReversed ? reverse(gradient) : gradient;\n}\n\n/**\n * A function that takes a deterministic source of bits and selects a gradient\n * used to color a particular LifeHash version.\n */\nexport function selectGradient(entropy: BitEnumerator, version: Version): ColorFunc {\n  if (version === Version.grayscale_fiducial) {\n    return selectGrayscale(entropy);\n  }\n\n  const value = entropy.nextUint2();\n\n  switch (value) {\n    case 0:\n      switch (version) {\n        case Version.version1:\n          return monochromatic(entropy, makeHue);\n        case Version.version2:\n        case Version.detailed:\n          return monochromatic(entropy, spectrumCmykSafe());\n        case Version.fiducial:\n          return monochromaticFiducial(entropy);\n        default:\n          return grayscale();\n      }\n    case 1:\n      switch (version) {\n        case Version.version1:\n          return complementary(entropy, spectrum());\n        case Version.version2:\n        case Version.detailed:\n          return complementary(entropy, spectrumCmykSafe());\n        case Version.fiducial:\n          return complementaryFiducial(entropy);\n        default:\n          return grayscale();\n      }\n    case 2:\n      switch (version) {\n        case Version.version1:\n          return triadic(entropy, spectrum());\n        case Version.version2:\n        case Version.detailed:\n          return triadic(entropy, spectrumCmykSafe());\n        case Version.fiducial:\n          return triadicFiducial(entropy);\n        default:\n          return grayscale();\n      }\n    case 3:\n      switch (version) {\n        case Version.version1:\n          return analogous(entropy, spectrum());\n        case Version.version2:\n        case Version.detailed:\n          return analogous(entropy, spectrumCmykSafe());\n        case Version.fiducial:\n          return analogousFiducial(entropy);\n        default:\n          return grayscale();\n      }\n    default:\n      return grayscale();\n  }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport type { Data } from \"./data\";\n\nconst HEX_CHARS = \"0123456789abcdef\";\n\nfunction byteToHex(byte: number): string {\n  return HEX_CHARS[(byte >> 4) & 0xf] + HEX_CHARS[byte & 0xf];\n}\n\n/**\n * Convert data to a hex string.\n */\nexport function dataToHex(data: Data): string {\n  let result = \"\";\n  for (const c of data) {\n    result += byteToHex(c);\n  }\n  return result;\n}\n\nfunction hexDigitToBin(hex: string): number {\n  if (hex >= \"0\" && hex <= \"9\") {\n    return hex.charCodeAt(0) - \"0\".charCodeAt(0);\n  } else if (hex >= \"A\" && hex <= \"F\") {\n    return hex.charCodeAt(0) - \"A\".charCodeAt(0) + 10;\n  } else if (hex >= \"a\" && hex <= \"f\") {\n    return hex.charCodeAt(0) - \"a\".charCodeAt(0) + 10;\n  } else {\n    throw new Error(\"Invalid hex digit\");\n  }\n}\n\n/**\n * Convert a hex string to data.\n */\nexport function hexToData(hex: string): Data {\n  const len = hex.length;\n  if (len % 2 !== 0) {\n    throw new Error(\"Hex string must have even number of characters.\");\n  }\n\n  const count = len / 2;\n  const result = new Uint8Array(count);\n\n  for (let i = 0; i < count; i++) {\n    const b1 = hexDigitToBin(hex[i * 2]);\n    const b2 = hexDigitToBin(hex[i * 2 + 1]);\n    result[i] = (b1 << 4) | b2;\n  }\n\n  return result;\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport type { Data } from \"./data\";\nimport { dataToHex } from \"./hex\";\nimport { BitEnumerator } from \"./bit-enumerator\";\n\nexport { dataToHex as toHex };\n\n/**\n * Convert the given UTF-8 string to a block of data.\n */\nexport function toData(utf8: string): Data {\n  return new TextEncoder().encode(utf8);\n}\n\n/**\n * Convert the given block of data to a string of 1s and 0s.\n */\nexport function toBinary(data: Data): string {\n  const e = new BitEnumerator(data);\n  let result = \"\";\n  e.forAll((b) => {\n    result += b ? \"1\" : \"0\";\n  });\n  return result;\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n */\n\nimport { Version } from \"./version\";\nimport type { Data } from \"./data\";\nimport { CellGrid } from \"./cell-grid\";\nimport { ChangeGrid } from \"./change-grid\";\nimport { FracGrid } from \"./frac-grid\";\nimport { ColorGrid } from \"./color-grid\";\nimport { BitEnumerator } from \"./bit-enumerator\";\nimport { selectGradient } from \"./gradients\";\nimport { selectPattern } from \"./patterns\";\nimport { sha256 } from \"./sha256\";\nimport { toData } from \"./format-utils\";\nimport { clamped, lerpFrom, min, max } from \"./color\";\nimport { dataToHex } from \"./hex\";\n\nexport { Version } from \"./version\";\n\n/**\n * An RGB(A) image returned from the functions that make LifeHashes.\n */\nexport interface Image {\n  width: number;\n  height: number;\n  colors: Uint8Array;\n}\n\nfunction makeImage(\n  width: number,\n  height: number,\n  floatColors: number[],\n  moduleSize: number,\n  hasAlpha: boolean,\n): Image {\n  if (!Number.isInteger(moduleSize) || moduleSize <= 0) {\n    throw new Error(\"Invalid module size\");\n  }\n\n  const scaledWidth = width * moduleSize;\n  const scaledHeight = height * moduleSize;\n  const resultComponents = hasAlpha ? 4 : 3;\n  const scaledCapacity = scaledWidth * scaledHeight * resultComponents;\n\n  const resultColors = new Uint8Array(scaledCapacity);\n\n  // Match C++/Rust loop order: outer uses scaledWidth, inner uses\n  // scaledHeight (variables intentionally swapped relative to their names —\n  // harmless because LifeHash images are always square).\n  for (let targetY = 0; targetY < scaledWidth; targetY++) {\n    for (let targetX = 0; targetX < scaledHeight; targetX++) {\n      const sourceX = Math.floor(targetX / moduleSize);\n      const sourceY = Math.floor(targetY / moduleSize);\n      const sourceOffset = (sourceY * width + sourceX) * 3;\n      const targetOffset = (targetY * scaledWidth + targetX) * resultComponents;\n\n      // Rust `(x as u8)` truncates an f64 toward zero and saturates to\n      // [0, 255]; Math.trunc + Uint8Array assignment does the same in JS.\n      resultColors[targetOffset] = Math.trunc(clamped(floatColors[sourceOffset]) * 255);\n      resultColors[targetOffset + 1] = Math.trunc(clamped(floatColors[sourceOffset + 1]) * 255);\n      resultColors[targetOffset + 2] = Math.trunc(clamped(floatColors[sourceOffset + 2]) * 255);\n\n      if (hasAlpha) {\n        resultColors[targetOffset + 3] = 255;\n      }\n    }\n  }\n\n  return { width: scaledWidth, height: scaledHeight, colors: resultColors };\n}\n\n/**\n * Make a LifeHash from a UTF-8 string, which may be of any length.\n * The caller is responsible to ensure that the string has undergone any\n * necessary Unicode normalization in order to produce consistent results.\n */\nexport function makeFromUtf8(\n  s: string,\n  version: Version = Version.version2,\n  moduleSize = 1,\n  hasAlpha = false,\n): Image {\n  return makeFromData(toData(s), version, moduleSize, hasAlpha);\n}\n\n/**\n * Make a LifeHash from given data, which may be of any size.\n */\nexport function makeFromData(\n  data: Data,\n  version: Version = Version.version2,\n  moduleSize = 1,\n  hasAlpha = false,\n): Image {\n  const digest = sha256(data);\n  return makeFromDigest(digest, version, moduleSize, hasAlpha);\n}\n\n/**\n * Make a LifeHash from the SHA256 digest of some other data.\n * The digest must be exactly 32 pseudorandom bytes. This is the base\n * LifeHash creation algorithm, but if you don't already have a SHA256 hash of\n * some data, then you should access it by calling `makeFromData()`. If you\n * are starting with a UTF-8 string, call `makeFromUtf8()`.\n */\nexport function makeFromDigest(\n  digest: Data,\n  version: Version = Version.version2,\n  moduleSize = 1,\n  hasAlpha = false,\n): Image {\n  if (digest.length !== 32) {\n    throw new Error(\"Digest must be 32 bytes\");\n  }\n\n  let length: number;\n  let maxGenerations: number;\n\n  switch (version) {\n    case Version.version1:\n    case Version.version2:\n      length = 16;\n      maxGenerations = 150;\n      break;\n    case Version.detailed:\n    case Version.fiducial:\n    case Version.grayscale_fiducial:\n      length = 32;\n      maxGenerations = 300;\n      break;\n    default:\n      throw new Error(\"Invalid version\");\n  }\n\n  // These get reused from generation to generation by swapping them.\n  let currentCellGrid = new CellGrid(length, length);\n  let nextCellGrid = new CellGrid(length, length);\n  let currentChangeGrid = new ChangeGrid(length, length);\n  let nextChangeGrid = new ChangeGrid(length, length);\n\n  const historySet = new Set<string>();\n  const history: Data[] = [];\n\n  // Initialize the cell grid based on version\n  switch (version) {\n    case Version.version1:\n      nextCellGrid.setData(new Uint8Array(digest));\n      break;\n    case Version.version2:\n      // Ensure that .version2 in no way resembles .version1\n      nextCellGrid.setData(sha256(new Uint8Array(digest)));\n      break;\n    case Version.detailed:\n    case Version.fiducial:\n    case Version.grayscale_fiducial: {\n      let digest1: Data = new Uint8Array(digest);\n      // Ensure that grayscale fiducials in no way resemble the regular color fiducials\n      if (version === Version.grayscale_fiducial) {\n        digest1 = sha256(digest1);\n      }\n      const digest2 = sha256(digest1);\n      const digest3 = sha256(digest2);\n      const digest4 = sha256(digest3);\n\n      const digestFinal = new Uint8Array(128);\n      digestFinal.set(digest1, 0);\n      digestFinal.set(digest2, 32);\n      digestFinal.set(digest3, 64);\n      digestFinal.set(digest4, 96);\n\n      nextCellGrid.setData(digestFinal);\n      break;\n    }\n  }\n\n  nextChangeGrid.grid.setAll(true);\n\n  // Run the Game of Life\n  while (history.length < maxGenerations) {\n    // Swap grids\n    [currentCellGrid, nextCellGrid] = [nextCellGrid, currentCellGrid];\n    [currentChangeGrid, nextChangeGrid] = [nextChangeGrid, currentChangeGrid];\n\n    const data = currentCellGrid.data();\n    const hash = sha256(data);\n    const hashHex = dataToHex(hash);\n\n    if (historySet.has(hashHex)) {\n      break;\n    }\n    historySet.add(hashHex);\n    history.push(data);\n\n    currentCellGrid.nextGeneration(currentChangeGrid, nextCellGrid, nextChangeGrid);\n  }\n\n  // Build the frac grid from history\n  const fracGrid = new FracGrid(length, length);\n  for (let i = 0; i < history.length; i++) {\n    currentCellGrid.setData(history[i]);\n    const frac = clamped(lerpFrom(0, history.length, i + 1));\n    fracGrid.overlay(currentCellGrid, frac);\n  }\n\n  // Normalizing the frac_grid to the range 0..1 was a step left out of .version1\n  // In some cases it can cause the full range of the gradient to go unused.\n  // This fixes the problem for the other versions, while remaining compatible\n  // with .version1.\n  if (version !== Version.version1) {\n    let minValue = Infinity;\n    let maxValue = -Infinity;\n\n    fracGrid.grid.forAll((x, y) => {\n      const value = fracGrid.grid.getValue(x, y);\n      minValue = min(minValue, value);\n      maxValue = max(maxValue, value);\n    });\n\n    fracGrid.grid.forAll((x, y) => {\n      const value = lerpFrom(minValue, maxValue, fracGrid.grid.getValue(x, y));\n      fracGrid.grid.setValue(value, x, y);\n    });\n  }\n\n  // Select gradient and pattern\n  const entropy = new BitEnumerator(new Uint8Array(digest));\n\n  switch (version) {\n    case Version.detailed:\n      // Throw away a bit of entropy to ensure we generate different colors and patterns from .version1\n      entropy.next();\n      break;\n    case Version.version2:\n      // Throw away two bits of entropy to ensure we generate different colors and patterns from .version1 or .detailed.\n      entropy.nextUint2();\n      break;\n    case Version.version1:\n    case Version.fiducial:\n    case Version.grayscale_fiducial:\n      // No entropy adjustment needed\n      break;\n  }\n\n  const gradient = selectGradient(entropy, version);\n  const pattern = selectPattern(entropy, version);\n  const colorGrid = new ColorGrid(fracGrid, gradient, pattern);\n\n  return makeImage(\n    colorGrid.grid.width,\n    colorGrid.grid.height,\n    colorGrid.colors(),\n    moduleSize,\n    hasAlpha,\n  );\n}\n"],"mappings":"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"}