@danielsimonjr/mathts-wasm 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["~lib/rt/common.ts","src/types/complex.ts","~lib/rt/stub.ts","~lib/util/error.ts","src/ops/scalar.ts","~lib/util/math.ts","~lib/util/number.ts","~lib/util/string.ts","~lib/math.ts","~lib/builtins.ts","src/ops/array.ts","~lib/util/sort.ts","~lib/shared/runtime.ts","~lib/typedarray.ts","~lib/arraybuffer.ts","src/ops/matrix.ts","src/ops/complex-ops.ts","src/ops/complex-array.ts"],"names":[],"mappings":"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","sourceRoot":"./mathts-debug","sourcesContent":["// Alignment guarantees\n\n// @ts-ignore: decorator\n@inline export const AL_BITS: u32 = 4; // 16 bytes to fit up to v128\n// @ts-ignore: decorator\n@inline export const AL_SIZE: usize = 1 << <usize>AL_BITS;\n// @ts-ignore: decorator\n@inline export const AL_MASK: usize = AL_SIZE - 1;\n\n// Extra debugging\n\n// @ts-ignore: decorator\n@inline export const DEBUG = true;\n// @ts-ignore: decorator\n@inline export const TRACE = false;\n// @ts-ignore: decorator\n@inline export const RTRACE = isDefined(ASC_RTRACE);\n// @ts-ignore: decorator\n@inline export const PROFILE = isDefined(ASC_PROFILE);\n\n// Memory manager\n\n// ╒════════════ Memory manager block layout (32-bit) ═════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤\n// │ MM info │ -4\n// ╞>ptr═══════════════════════════════════════════════════════════╡\n// │ ... │\n@unmanaged export class BLOCK {\n /** Memory manager info. */\n mmInfo: usize;\n}\n\n/** Overhead of a memory manager block. */\n// @ts-ignore: decorator\n@inline export const BLOCK_OVERHEAD: usize = offsetof<BLOCK>();\n\n/** Maximum size of a memory manager block's payload. */\n// @ts-ignore: decorator\n@inline export const BLOCK_MAXSIZE: usize = (1 << 30) - BLOCK_OVERHEAD;\n\n// Garbage collector\n\n// ╒══════════ Garbage collector object layout (32-bit) ═══════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤\n// │ Memory manager block │ -20\n// ╞═══════════════════════════════════════════════════════════════╡\n// │ GC info │ -16\n// ├───────────────────────────────────────────────────────────────┤\n// │ GC info │ -12\n// ├───────────────────────────────────────────────────────────────┤\n// │ RT id │ -8\n// ├───────────────────────────────────────────────────────────────┤\n// │ RT size │ -4\n// ╞>ptr═══════════════════════════════════════════════════════════╡\n// │ ... │\n@unmanaged export class OBJECT extends BLOCK {\n /** Garbage collector info. */\n gcInfo: u32;\n /** Garbage collector info. */\n gcInfo2: u32;\n /** Runtime class id. */\n rtId: u32;\n /** Runtime object size. */\n rtSize: u32;\n}\n\n/** Overhead of a garbage collector object. Excludes memory manager block overhead. */\n// @ts-ignore: decorator\n@inline export const OBJECT_OVERHEAD: usize = (offsetof<OBJECT>() - BLOCK_OVERHEAD + AL_MASK) & ~AL_MASK;\n\n/** Maximum size of a garbage collector object's payload. */\n// @ts-ignore: decorator\n@inline export const OBJECT_MAXSIZE: usize = BLOCK_MAXSIZE - OBJECT_OVERHEAD;\n\n/** Total of memory manager and garbage collector overhead. */\n// @ts-ignore: decorator\n@inline export const TOTAL_OVERHEAD: usize = BLOCK_OVERHEAD + OBJECT_OVERHEAD;\n","/**\r\n * AssemblyScript-compatible Complex Number Implementation\r\n *\r\n * This is a simplified Complex number class designed for AssemblyScript\r\n * compilation. It avoids:\r\n * - Optional parameters (use overloaded functions instead)\r\n * - Regex parsing (use factory functions)\r\n * - Closures\r\n * - Dynamic types\r\n */\r\n\r\n/**\r\n * Complex number represented as (re + im*i)\r\n */\r\n@final\r\nexport class Complex {\r\n /** Real part */\r\n re: f64;\r\n /** Imaginary part */\r\n im: f64;\r\n\r\n constructor(re: f64, im: f64) {\r\n this.re = re;\r\n this.im = im;\r\n }\r\n\r\n /**\r\n * Create a copy of this complex number\r\n */\r\n clone(): Complex {\r\n return new Complex(this.re, this.im);\r\n }\r\n\r\n /**\r\n * Check equality with another complex number\r\n */\r\n equals(other: Complex): bool {\r\n return this.re == other.re && this.im == other.im;\r\n }\r\n\r\n /**\r\n * Check approximate equality (within epsilon)\r\n */\r\n approxEquals(other: Complex, epsilon: f64 = 1e-12): bool {\r\n const diffRe = this.re - other.re;\r\n const diffIm = this.im - other.im;\r\n return abs(diffRe) < epsilon && abs(diffIm) < epsilon;\r\n }\r\n\r\n // =========================================================================\r\n // Arithmetic Operations\r\n // =========================================================================\r\n\r\n /**\r\n * Add another complex number\r\n */\r\n add(other: Complex): Complex {\r\n return new Complex(this.re + other.re, this.im + other.im);\r\n }\r\n\r\n /**\r\n * Add a real number\r\n */\r\n addReal(value: f64): Complex {\r\n return new Complex(this.re + value, this.im);\r\n }\r\n\r\n /**\r\n * Subtract another complex number\r\n */\r\n sub(other: Complex): Complex {\r\n return new Complex(this.re - other.re, this.im - other.im);\r\n }\r\n\r\n /**\r\n * Subtract a real number\r\n */\r\n subReal(value: f64): Complex {\r\n return new Complex(this.re - value, this.im);\r\n }\r\n\r\n /**\r\n * Multiply by another complex number\r\n * (a + bi)(c + di) = (ac - bd) + (ad + bc)i\r\n */\r\n mul(other: Complex): Complex {\r\n return new Complex(\r\n this.re * other.re - this.im * other.im,\r\n this.re * other.im + this.im * other.re\r\n );\r\n }\r\n\r\n /**\r\n * Multiply by a real number\r\n */\r\n mulReal(value: f64): Complex {\r\n return new Complex(this.re * value, this.im * value);\r\n }\r\n\r\n /**\r\n * Divide by another complex number\r\n * (a + bi) / (c + di) = ((ac + bd) + (bc - ad)i) / (c² + d²)\r\n */\r\n div(other: Complex): Complex {\r\n const denom = other.re * other.re + other.im * other.im;\r\n if (denom == 0.0) {\r\n return new Complex(f64.NaN, f64.NaN);\r\n }\r\n return new Complex(\r\n (this.re * other.re + this.im * other.im) / denom,\r\n (this.im * other.re - this.re * other.im) / denom\r\n );\r\n }\r\n\r\n /**\r\n * Divide by a real number\r\n */\r\n divReal(value: f64): Complex {\r\n if (value == 0.0) {\r\n return new Complex(f64.NaN, f64.NaN);\r\n }\r\n return new Complex(this.re / value, this.im / value);\r\n }\r\n\r\n /**\r\n * Negate the complex number\r\n */\r\n neg(): Complex {\r\n return new Complex(-this.re, -this.im);\r\n }\r\n\r\n /**\r\n * Complex conjugate\r\n */\r\n conj(): Complex {\r\n return new Complex(this.re, -this.im);\r\n }\r\n\r\n /**\r\n * Reciprocal (1/z)\r\n */\r\n reciprocal(): Complex {\r\n const denom = this.re * this.re + this.im * this.im;\r\n if (denom == 0.0) {\r\n return new Complex(f64.NaN, f64.NaN);\r\n }\r\n return new Complex(this.re / denom, -this.im / denom);\r\n }\r\n\r\n // =========================================================================\r\n // Magnitude and Phase\r\n // =========================================================================\r\n\r\n /**\r\n * Absolute value (magnitude)\r\n * |z| = sqrt(re² + im²)\r\n */\r\n abs(): f64 {\r\n return sqrt(this.re * this.re + this.im * this.im);\r\n }\r\n\r\n /**\r\n * Squared magnitude (avoids sqrt for comparisons)\r\n */\r\n abs2(): f64 {\r\n return this.re * this.re + this.im * this.im;\r\n }\r\n\r\n /**\r\n * Argument (phase angle in radians)\r\n * arg(z) = Math.atan2(im, re)\r\n */\r\n arg(): f64 {\r\n return Math.atan2(this.im, this.re);\r\n }\r\n\r\n // =========================================================================\r\n // Exponential and Logarithmic\r\n // =========================================================================\r\n\r\n /**\r\n * Complex exponential\r\n * Math.exp(a + bi) = Math.exp(a) * (Math.cos(b) + i*Math.sin(b))\r\n */\r\n exp(): Complex {\r\n const expRe = Math.exp(this.re);\r\n return new Complex(expRe * Math.cos(this.im), expRe * Math.sin(this.im));\r\n }\r\n\r\n /**\r\n * Complex natural logarithm (principal value)\r\n * Math.log(z) = log|z| + i*arg(z)\r\n */\r\n log(): Complex {\r\n return new Complex(Math.log(this.abs()), this.arg());\r\n }\r\n\r\n /**\r\n * Complex square root (principal value)\r\n */\r\n sqrt(): Complex {\r\n const r = this.abs();\r\n const halfArg = this.arg() / 2.0;\r\n const sqrtR = sqrt(r);\r\n return new Complex(sqrtR * Math.cos(halfArg), sqrtR * Math.sin(halfArg));\r\n }\r\n\r\n /**\r\n * Complex power (z^n where n is real)\r\n */\r\n powReal(n: f64): Complex {\r\n if (n == 0.0) {\r\n return new Complex(1.0, 0.0);\r\n }\r\n const r = this.abs();\r\n const theta = this.arg();\r\n const rn = Math.pow(r, n);\r\n const nTheta = n * theta;\r\n return new Complex(rn * Math.cos(nTheta), rn * Math.sin(nTheta));\r\n }\r\n\r\n /**\r\n * Complex power (z^w where w is complex)\r\n * z^w = Math.exp(w * Math.log(z))\r\n */\r\n pow(w: Complex): Complex {\r\n if (this.re == 0.0 && this.im == 0.0) {\r\n if (w.re > 0.0) {\r\n return new Complex(0.0, 0.0);\r\n }\r\n return new Complex(f64.NaN, f64.NaN);\r\n }\r\n return w.mul(this.log()).exp();\r\n }\r\n\r\n // =========================================================================\r\n // Trigonometric Functions\r\n // =========================================================================\r\n\r\n /**\r\n * Complex sine\r\n * Math.sin(z) = (Math.exp(iz) - Math.exp(-iz)) / 2i\r\n */\r\n sin(): Complex {\r\n return new Complex(\r\n Math.sin(this.re) * cosh(this.im),\r\n Math.cos(this.re) * sinh(this.im)\r\n );\r\n }\r\n\r\n /**\r\n * Complex cosine\r\n * Math.cos(z) = (Math.exp(iz) + Math.exp(-iz)) / 2\r\n */\r\n cos(): Complex {\r\n return new Complex(\r\n Math.cos(this.re) * cosh(this.im),\r\n -Math.sin(this.re) * sinh(this.im)\r\n );\r\n }\r\n\r\n /**\r\n * Complex tangent\r\n * Math.tan(z) = Math.sin(z) / Math.cos(z)\r\n */\r\n tan(): Complex {\r\n return this.sin().div(this.cos());\r\n }\r\n\r\n // =========================================================================\r\n // Hyperbolic Functions\r\n // =========================================================================\r\n\r\n /**\r\n * Complex hyperbolic sine\r\n */\r\n sinh(): Complex {\r\n return new Complex(\r\n sinh(this.re) * Math.cos(this.im),\r\n cosh(this.re) * Math.sin(this.im)\r\n );\r\n }\r\n\r\n /**\r\n * Complex hyperbolic cosine\r\n */\r\n cosh(): Complex {\r\n return new Complex(\r\n cosh(this.re) * Math.cos(this.im),\r\n sinh(this.re) * Math.sin(this.im)\r\n );\r\n }\r\n\r\n /**\r\n * Complex hyperbolic tangent\r\n */\r\n tanh(): Complex {\r\n return this.sinh().div(this.cosh());\r\n }\r\n\r\n /**\r\n * Complex inverse sine: asin(z) = -i * ln(iz + sqrt(1 - z²))\r\n */\r\n asin(): Complex {\r\n const iz = new Complex(-this.im, this.re);\r\n const z2 = this.mul(this);\r\n const inner = new Complex(1.0 - z2.re, -z2.im).sqrt();\r\n const logArg = iz.add(inner);\r\n const ln = logArg.log();\r\n return new Complex(ln.im, -ln.re);\r\n }\r\n\r\n /**\r\n * Complex inverse cosine: acos(z) = -i * ln(z + sqrt(z² - 1))\r\n */\r\n acos(): Complex {\r\n const z2 = this.mul(this);\r\n const inner = new Complex(z2.re - 1.0, z2.im).sqrt();\r\n const logArg = this.add(inner);\r\n const ln = logArg.log();\r\n return new Complex(ln.im, -ln.re);\r\n }\r\n\r\n /**\r\n * Complex inverse tangent: atan(z) = (i/2) * ln((i+z)/(i-z))\r\n */\r\n atan(): Complex {\r\n const iPlusZ = new Complex(this.re, this.im + 1.0);\r\n const iMinusZ = new Complex(-this.re, 1.0 - this.im);\r\n const ratio = iPlusZ.div(iMinusZ);\r\n const ln = ratio.log();\r\n return new Complex(-ln.im * 0.5, ln.re * 0.5);\r\n }\r\n\r\n /**\r\n * Complex inverse hyperbolic sine: asinh(z) = ln(z + sqrt(z² + 1))\r\n */\r\n asinh(): Complex {\r\n const z2 = this.mul(this);\r\n const inner = new Complex(z2.re + 1.0, z2.im).sqrt();\r\n return this.add(inner).log();\r\n }\r\n\r\n /**\r\n * Complex inverse hyperbolic cosine: acosh(z) = ln(z + sqrt(z² - 1))\r\n */\r\n acosh(): Complex {\r\n const z2 = this.mul(this);\r\n const inner = new Complex(z2.re - 1.0, z2.im).sqrt();\r\n return this.add(inner).log();\r\n }\r\n\r\n /**\r\n * Complex inverse hyperbolic tangent: atanh(z) = 0.5 * ln((1+z)/(1-z))\r\n */\r\n atanh(): Complex {\r\n const onePlusZ = new Complex(1.0 + this.re, this.im);\r\n const oneMinusZ = new Complex(1.0 - this.re, -this.im);\r\n const ln = onePlusZ.div(oneMinusZ).log();\r\n return new Complex(ln.re * 0.5, ln.im * 0.5);\r\n }\r\n\r\n // =========================================================================\r\n // Query Methods\r\n // =========================================================================\r\n\r\n /**\r\n * Check if this is a real number (imaginary part is zero)\r\n */\r\n isReal(): bool {\r\n return this.im == 0.0;\r\n }\r\n\r\n /**\r\n * Check if this is purely imaginary (real part is zero)\r\n */\r\n isImaginary(): bool {\r\n return this.re == 0.0;\r\n }\r\n\r\n /**\r\n * Check if this is zero\r\n */\r\n isZero(): bool {\r\n return this.re == 0.0 && this.im == 0.0;\r\n }\r\n\r\n /**\r\n * Check if this is NaN\r\n */\r\n isNaN(): bool {\r\n return isNaN(this.re) || isNaN(this.im);\r\n }\r\n\r\n /**\r\n * Check if this is finite\r\n */\r\n isFinite(): bool {\r\n return isFinite(this.re) && isFinite(this.im);\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Factory Functions (avoid constructor overloading)\r\n// =============================================================================\r\n\r\n/**\r\n * Create a complex number from real and imaginary parts\r\n */\r\nexport function complex(re: f64, im: f64): Complex {\r\n return new Complex(re, im);\r\n}\r\n\r\n/**\r\n * Create a complex number from polar coordinates (r, theta)\r\n */\r\nexport function complexFromPolar(r: f64, theta: f64): Complex {\r\n return new Complex(r * Math.cos(theta), r * Math.sin(theta));\r\n}\r\n\r\n/**\r\n * Create a complex number from a real value (im = 0)\r\n */\r\nexport function complexFromReal(value: f64): Complex {\r\n return new Complex(value, 0.0);\r\n}\r\n\r\n/**\r\n * Create a complex number from an imaginary value (re = 0)\r\n */\r\nexport function complexFromImaginary(value: f64): Complex {\r\n return new Complex(0.0, value);\r\n}\r\n\r\n// =============================================================================\r\n// Constants\r\n// =============================================================================\r\n\r\n/** Complex zero */\r\nexport const COMPLEX_ZERO: Complex = new Complex(0.0, 0.0);\r\n\r\n/** Complex one */\r\nexport const COMPLEX_ONE: Complex = new Complex(1.0, 0.0);\r\n\r\n/** Complex imaginary unit i */\r\nexport const COMPLEX_I: Complex = new Complex(0.0, 1.0);\r\n\r\n/** Complex negative one */\r\nexport const COMPLEX_NEG_ONE: Complex = new Complex(-1.0, 0.0);\r\n\r\n// =============================================================================\r\n// Math helpers (AS doesn't have Math.sinh, Math.cosh by default in older versions)\r\n// =============================================================================\r\n\r\nfunction sinh(x: f64): f64 {\r\n const ex = Math.exp(x);\r\n return (ex - 1.0 / ex) / 2.0;\r\n}\r\n\r\nfunction cosh(x: f64): f64 {\r\n const ex = Math.exp(x);\r\n return (ex + 1.0 / ex) / 2.0;\r\n}\r\n","import { AL_MASK, OBJECT, OBJECT_OVERHEAD, BLOCK_MAXSIZE, BLOCK_OVERHEAD, BLOCK, OBJECT_MAXSIZE } from \"./common\";\nimport { E_ALLOCATION_TOO_LARGE } from \"../util/error\";\n\n// === A minimal runtime stub ===\n\n// @ts-ignore: decorator\n@lazy let startOffset: usize = ((__heap_base + BLOCK_OVERHEAD + AL_MASK) & ~AL_MASK) - BLOCK_OVERHEAD;\n// @ts-ignore: decorator\n@lazy let offset: usize = startOffset;\n\nfunction maybeGrowMemory(newOffset: usize): void {\n // assumes newOffset is aligned\n let pagesBefore = memory.size();\n let maxOffset = ((<usize>pagesBefore << 16) + AL_MASK) & ~AL_MASK;\n if (newOffset > maxOffset) {\n let pagesNeeded = <i32>(((newOffset - maxOffset + 0xffff) & ~0xffff) >>> 16);\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) unreachable(); // out of memory\n }\n }\n offset = newOffset;\n}\n\n// @ts-ignore: decorator\n@inline function computeSize(size: usize): usize {\n return ((size + BLOCK_OVERHEAD + AL_MASK) & ~AL_MASK) - BLOCK_OVERHEAD;\n}\n\n// @ts-ignore: decorator\n@unsafe @global\nexport function __alloc(size: usize): usize {\n if (size > BLOCK_MAXSIZE) throw new Error(E_ALLOCATION_TOO_LARGE);\n let block = changetype<BLOCK>(offset);\n let ptr = offset + BLOCK_OVERHEAD;\n let payloadSize = computeSize(size);\n maybeGrowMemory(ptr + payloadSize);\n block.mmInfo = payloadSize;\n return ptr;\n}\n\n// @ts-ignore: decorator\n@unsafe @global\nexport function __realloc(ptr: usize, size: usize): usize {\n assert(ptr != 0 && !(ptr & AL_MASK)); // must exist and be aligned\n let block = changetype<BLOCK>(ptr - BLOCK_OVERHEAD);\n let actualSize = block.mmInfo;\n let isLast = ptr + actualSize == offset;\n let payloadSize = computeSize(size);\n if (size > actualSize) {\n if (isLast) { // last block: grow\n if (size > BLOCK_MAXSIZE) throw new Error(E_ALLOCATION_TOO_LARGE);\n maybeGrowMemory(ptr + payloadSize);\n block.mmInfo = payloadSize;\n } else { // copy to new block at least double the size\n let newPtr = __alloc(max<usize>(payloadSize, actualSize << 1));\n memory.copy(newPtr, ptr, actualSize);\n block = changetype<BLOCK>((ptr = newPtr) - BLOCK_OVERHEAD);\n }\n } else if (isLast) { // last block: shrink\n offset = ptr + payloadSize;\n block.mmInfo = payloadSize;\n }\n return ptr;\n}\n\n// @ts-ignore: decorator\n@unsafe @global\nexport function __free(ptr: usize): void {\n assert(ptr != 0 && !(ptr & AL_MASK)); // must exist and be aligned\n let block = changetype<BLOCK>(ptr - BLOCK_OVERHEAD);\n if (ptr + block.mmInfo == offset) { // last block: discard\n offset = changetype<usize>(block);\n }\n}\n\n// @ts-ignore: decorator\n@unsafe @global\nexport function __reset(): void { // special\n offset = startOffset;\n}\n\n// @ts-ignore: decorator\n@unsafe @global\nexport function __new(size: usize, id: u32): usize {\n if (size > OBJECT_MAXSIZE) throw new Error(E_ALLOCATION_TOO_LARGE);\n let ptr = __alloc(OBJECT_OVERHEAD + size);\n let object = changetype<OBJECT>(ptr - BLOCK_OVERHEAD);\n object.gcInfo = 0;\n object.gcInfo2 = 0;\n object.rtId = id;\n object.rtSize = <u32>size;\n return ptr + OBJECT_OVERHEAD;\n}\n\n// @ts-ignore: decorator\n@unsafe @global\nexport function __renew(oldPtr: usize, size: usize): usize {\n if (size > OBJECT_MAXSIZE) throw new Error(E_ALLOCATION_TOO_LARGE);\n let newPtr = __realloc(oldPtr - OBJECT_OVERHEAD, OBJECT_OVERHEAD + size);\n changetype<OBJECT>(newPtr - BLOCK_OVERHEAD).rtSize = <u32>size;\n return newPtr + OBJECT_OVERHEAD;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __link(parentPtr: usize, childPtr: usize, expectMultiple: bool): void {\n // nop\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __pin(ptr: usize): usize {\n return ptr;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __unpin(ptr: usize): void {\n // nop\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nfunction __visit(ptr: usize, cookie: u32): void { // eslint-disable-line @typescript-eslint/no-unused-vars\n // nop\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __collect(): void {\n // nop\n}\n","// Common error messages for use across the standard library. Keeping error messages compact\n// and reusing them where possible ensures minimal static data in binaries.\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_INDEXOUTOFRANGE: string = \"Index out of range\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_VALUEOUTOFRANGE: string = \"Value out of range\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_INVALIDLENGTH: string = \"Invalid length\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_EMPTYARRAY: string = \"Array is empty\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_HOLEYARRAY: string = \"Element type must be nullable if array is holey\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_NOTIMPLEMENTED: string = \"Not implemented\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_KEYNOTFOUND: string = \"Key does not exist\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_ALLOCATION_TOO_LARGE: string = \"Allocation too large\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_ALREADY_PINNED: string = \"Object already pinned\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_NOT_PINNED: string = \"Object is not pinned\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_URI_MALFORMED: string = \"URI malformed\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_INVALIDDATE: string = \"Invalid Date\";\n\n// @ts-ignore: decorator\n@lazy @inline\nexport const E_UNPAIRED_SURROGATE: string = \"Unpaired surrogate\";\n","/**\r\n * Scalar Operations for AssemblyScript\r\n *\r\n * Basic numeric operations exported for WASM.\r\n * These wrap the built-in AssemblyScript math functions with\r\n * consistent naming and behavior.\r\n */\r\n\r\n// =============================================================================\r\n// Basic Arithmetic\r\n// =============================================================================\r\n\r\n/**\r\n * Add two f64 values\r\n */\r\nexport function add_f64(a: f64, b: f64): f64 {\r\n return a + b;\r\n}\r\n\r\n/**\r\n * Subtract two f64 values\r\n */\r\nexport function sub_f64(a: f64, b: f64): f64 {\r\n return a - b;\r\n}\r\n\r\n/**\r\n * Multiply two f64 values\r\n */\r\nexport function mul_f64(a: f64, b: f64): f64 {\r\n return a * b;\r\n}\r\n\r\n/**\r\n * Divide two f64 values\r\n */\r\nexport function div_f64(a: f64, b: f64): f64 {\r\n return a / b;\r\n}\r\n\r\n/**\r\n * Modulo operation\r\n */\r\nexport function mod_f64(a: f64, b: f64): f64 {\r\n return a % b;\r\n}\r\n\r\n/**\r\n * Negation\r\n */\r\nexport function neg_f64(a: f64): f64 {\r\n return -a;\r\n}\r\n\r\n// =============================================================================\r\n// Power and Roots\r\n// =============================================================================\r\n\r\n/**\r\n * Square root\r\n */\r\nexport function sqrt_f64(a: f64): f64 {\r\n return sqrt(a);\r\n}\r\n\r\n/**\r\n * Power (a^b)\r\n */\r\nexport function pow_f64(a: f64, b: f64): f64 {\r\n return Math.pow(a, b);\r\n}\r\n\r\n/**\r\n * Square\r\n */\r\nexport function square_f64(a: f64): f64 {\r\n return a * a;\r\n}\r\n\r\n/**\r\n * Cube\r\n */\r\nexport function cube_f64(a: f64): f64 {\r\n return a * a * a;\r\n}\r\n\r\n/**\r\n * Cube root\r\n */\r\nexport function cbrt_f64(a: f64): f64 {\r\n if (a >= 0) {\r\n return Math.pow(a, 1.0 / 3.0);\r\n }\r\n return -Math.pow(-a, 1.0 / 3.0);\r\n}\r\n\r\n/**\r\n * N-th root\r\n */\r\nexport function nthRoot_f64(a: f64, n: f64): f64 {\r\n if (n == 0.0) return f64.NaN;\r\n if (a >= 0) {\r\n return Math.pow(a, 1.0 / n);\r\n }\r\n // For negative bases, only odd integer roots are real\r\n const nInt = i64(n);\r\n if (f64(nInt) == n && (nInt & 1) == 1) {\r\n return -Math.pow(-a, 1.0 / n);\r\n }\r\n return f64.NaN;\r\n}\r\n\r\n// =============================================================================\r\n// Exponential and Logarithmic\r\n// =============================================================================\r\n\r\n/**\r\n * Natural exponential (e^x)\r\n */\r\nexport function exp_f64(a: f64): f64 {\r\n return Math.exp(a);\r\n}\r\n\r\n/**\r\n * e^x - 1 (more accurate for small x)\r\n */\r\nexport function expm1_f64(a: f64): f64 {\r\n return Math.expm1(a);\r\n}\r\n\r\n/**\r\n * Natural logarithm\r\n */\r\nexport function log_f64(a: f64): f64 {\r\n return Math.log(a);\r\n}\r\n\r\n/**\r\n * Math.log(1 + x) (more accurate for small x)\r\n */\r\nexport function log1p_f64(a: f64): f64 {\r\n return Math.log1p(a);\r\n}\r\n\r\n/**\r\n * Base-10 logarithm\r\n */\r\nexport function log10_f64(a: f64): f64 {\r\n return Math.log10(a);\r\n}\r\n\r\n/**\r\n * Base-2 logarithm\r\n */\r\nexport function log2_f64(a: f64): f64 {\r\n return Math.log2(a);\r\n}\r\n\r\n// =============================================================================\r\n// Trigonometric Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Sine\r\n */\r\nexport function sin_f64(a: f64): f64 {\r\n return Math.sin(a);\r\n}\r\n\r\n/**\r\n * Cosine\r\n */\r\nexport function cos_f64(a: f64): f64 {\r\n return Math.cos(a);\r\n}\r\n\r\n/**\r\n * Tangent\r\n */\r\nexport function tan_f64(a: f64): f64 {\r\n return Math.tan(a);\r\n}\r\n\r\n/**\r\n * Arc sine\r\n */\r\nexport function asin_f64(a: f64): f64 {\r\n return Math.asin(a);\r\n}\r\n\r\n/**\r\n * Arc cosine\r\n */\r\nexport function acos_f64(a: f64): f64 {\r\n return Math.acos(a);\r\n}\r\n\r\n/**\r\n * Arc tangent\r\n */\r\nexport function atan_f64(a: f64): f64 {\r\n return Math.atan(a);\r\n}\r\n\r\n/**\r\n * Two-argument arc tangent\r\n */\r\nexport function atan2_f64(y: f64, x: f64): f64 {\r\n return Math.atan2(y, x);\r\n}\r\n\r\n// =============================================================================\r\n// Hyperbolic Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Hyperbolic sine\r\n */\r\nexport function sinh_f64(a: f64): f64 {\r\n const ex = Math.exp(a);\r\n return (ex - 1.0 / ex) / 2.0;\r\n}\r\n\r\n/**\r\n * Hyperbolic cosine\r\n */\r\nexport function cosh_f64(a: f64): f64 {\r\n const ex = Math.exp(a);\r\n return (ex + 1.0 / ex) / 2.0;\r\n}\r\n\r\n/**\r\n * Hyperbolic tangent\r\n */\r\nexport function tanh_f64(a: f64): f64 {\r\n const ex = Math.exp(2.0 * a);\r\n return (ex - 1.0) / (ex + 1.0);\r\n}\r\n\r\n/**\r\n * Inverse hyperbolic sine\r\n */\r\nexport function asinh_f64(a: f64): f64 {\r\n return Math.log(a + sqrt(a * a + 1.0));\r\n}\r\n\r\n/**\r\n * Inverse hyperbolic cosine\r\n */\r\nexport function acosh_f64(a: f64): f64 {\r\n return Math.log(a + sqrt(a * a - 1.0));\r\n}\r\n\r\n/**\r\n * Inverse hyperbolic tangent\r\n */\r\nexport function atanh_f64(a: f64): f64 {\r\n return 0.5 * Math.log((1.0 + a) / (1.0 - a));\r\n}\r\n\r\n// =============================================================================\r\n// Rounding and Comparison\r\n// =============================================================================\r\n\r\n/**\r\n * Absolute value\r\n */\r\nexport function abs_f64(a: f64): f64 {\r\n return abs(a);\r\n}\r\n\r\n/**\r\n * Floor\r\n */\r\nexport function floor_f64(a: f64): f64 {\r\n return floor(a);\r\n}\r\n\r\n/**\r\n * Ceiling\r\n */\r\nexport function ceil_f64(a: f64): f64 {\r\n return ceil(a);\r\n}\r\n\r\n/**\r\n * Round to nearest\r\n */\r\nexport function round_f64(a: f64): f64 {\r\n return nearest(a);\r\n}\r\n\r\n/**\r\n * Truncate (round toward zero)\r\n */\r\nexport function trunc_f64(a: f64): f64 {\r\n return trunc(a);\r\n}\r\n\r\n/**\r\n * Sign function (-1, 0, or 1)\r\n */\r\nexport function sign_f64(a: f64): f64 {\r\n if (a > 0.0) return 1.0;\r\n if (a < 0.0) return -1.0;\r\n return 0.0;\r\n}\r\n\r\n/**\r\n * Minimum of two values\r\n */\r\nexport function min_f64(a: f64, b: f64): f64 {\r\n return min(a, b);\r\n}\r\n\r\n/**\r\n * Maximum of two values\r\n */\r\nexport function max_f64(a: f64, b: f64): f64 {\r\n return max(a, b);\r\n}\r\n\r\n/**\r\n * Clamp value to range [lo, hi]\r\n */\r\nexport function clamp_f64(value: f64, lo: f64, hi: f64): f64 {\r\n return max(lo, min(hi, value));\r\n}\r\n\r\n// =============================================================================\r\n// Special Values\r\n// =============================================================================\r\n\r\n/**\r\n * Check if value is NaN\r\n */\r\nexport function isNaN_f64(a: f64): bool {\r\n return isNaN(a);\r\n}\r\n\r\n/**\r\n * Check if value is finite\r\n */\r\nexport function isFinite_f64(a: f64): bool {\r\n return isFinite(a);\r\n}\r\n\r\n// =============================================================================\r\n// Constants\r\n// =============================================================================\r\n\r\n/** Mathematical constant pi */\r\nexport const PI: f64 = 3.141592653589793;\r\n\r\n/** Mathematical constant e */\r\nexport const E: f64 = 2.718281828459045;\r\n\r\n/** Golden ratio phi */\r\nexport const PHI: f64 = 1.618033988749895;\r\n\r\n/** Square root of 2 */\r\nexport const SQRT2: f64 = 1.4142135623730951;\r\n\r\n/** Square root of 1/2 */\r\nexport const SQRT1_2: f64 = 0.7071067811865476;\r\n\r\n/** Natural log of 2 */\r\nexport const LN2: f64 = 0.6931471805599453;\r\n\r\n/** Natural log of 10 */\r\nexport const LN10: f64 = 2.302585092994046;\r\n\r\n/** Log base 2 of e */\r\nexport const LOG2E: f64 = 1.4426950408889634;\r\n\r\n/** Log base 10 of e */\r\nexport const LOG10E: f64 = 0.4342944819032518;\r\n\r\n/** Machine epsilon for f64 */\r\nexport const EPSILON: f64 = 2.220446049250313e-16;\r\n","//\n// Lookup data for exp2f\n//\n\n// @ts-ignore: decorator\n@inline const EXP2F_TABLE_BITS = 5;\n\n// @ts-ignore: decorator\n@lazy @inline const EXP2F_DATA_TAB = memory.data<u64>([\n // exp2f_data_tab[i] = uint(2^(i/N)) - (i << 52-BITS)\n // used for computing 2^(k/N) for an int |k| < 150 N as\n // double(tab[k%N] + (k << 52-BITS))\n 0x3FF0000000000000, 0x3FEFD9B0D3158574, 0x3FEFB5586CF9890F, 0x3FEF9301D0125B51,\n 0x3FEF72B83C7D517B, 0x3FEF54873168B9AA, 0x3FEF387A6E756238, 0x3FEF1E9DF51FDEE1,\n 0x3FEF06FE0A31B715, 0x3FEEF1A7373AA9CB, 0x3FEEDEA64C123422, 0x3FEECE086061892D,\n 0x3FEEBFDAD5362A27, 0x3FEEB42B569D4F82, 0x3FEEAB07DD485429, 0x3FEEA47EB03A5585,\n 0x3FEEA09E667F3BCD, 0x3FEE9F75E8EC5F74, 0x3FEEA11473EB0187, 0x3FEEA589994CCE13,\n 0x3FEEACE5422AA0DB, 0x3FEEB737B0CDC5E5, 0x3FEEC49182A3F090, 0x3FEED503B23E255D,\n 0x3FEEE89F995AD3AD, 0x3FEEFF76F2FB5E47, 0x3FEF199BDD85529C, 0x3FEF3720DCEF9069,\n 0x3FEF5818DCFBA487, 0x3FEF7C97337B9B5F, 0x3FEFA4AFA2A490DA, 0x3FEFD0765B6E4540\n]);\n\n// ULP error: 0.502 (nearest rounding.)\n// Relative error: 1.69 * 2^-34 in [-1/64, 1/64] (before rounding.)\n// Wrong count: 168353 (all nearest rounding wrong results with fma.)\n// @ts-ignore: decorator\n@inline\nexport function exp2f_lut(x: f32): f32 {\n const\n N = 1 << EXP2F_TABLE_BITS,\n N_MASK = N - 1,\n shift = reinterpret<f64>(0x4338000000000000) / N, // 0x1.8p+52\n Ox127f = reinterpret<f32>(0x7F000000);\n\n const\n C0 = reinterpret<f64>(0x3FAC6AF84B912394), // 0x1.c6af84b912394p-5\n C1 = reinterpret<f64>(0x3FCEBFCE50FAC4F3), // 0x1.ebfce50fac4f3p-3\n C2 = reinterpret<f64>(0x3FE62E42FF0C52D6); // 0x1.62e42ff0c52d6p-1\n\n let xd = <f64>x;\n let ix = reinterpret<u32>(x);\n let ux = ix >> 20 & 0x7FF;\n if (ux >= 0x430) {\n // |x| >= 128 or x is nan.\n if (ix == 0xFF800000) return 0; // x == -Inf -> 0\n if (ux >= 0x7F8) return x + x; // x == Inf/NaN -> Inf/NaN\n if (x > 0) return x * Ox127f; // x > 0 -> HugeVal (Owerflow)\n if (x <= -150) return 0; // x <= -150 -> 0 (Underflow)\n }\n\n // x = k/N + r with r in [-1/(2N), 1/(2N)] and int k.\n let kd = xd + shift;\n let ki = reinterpret<u64>(kd);\n let r = xd - (kd - shift);\n let t: u64, y: f64, s: f64;\n\n // exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1)\n t = load<u64>(EXP2F_DATA_TAB + ((<usize>ki & N_MASK) << alignof<u64>()));\n t += ki << (52 - EXP2F_TABLE_BITS);\n s = reinterpret<f64>(t);\n y = C2 * r + 1;\n y += (C0 * r + C1) * (r * r);\n y *= s;\n\n return <f32>y;\n}\n\n// ULP error: 0.502 (nearest rounding.)\n// Relative error: 1.69 * 2^-34 in [-ln2/64, ln2/64] (before rounding.)\n// Wrong count: 170635 (all nearest rounding wrong results with fma.)\n// @ts-ignore: decorator\n@inline\nexport function expf_lut(x: f32): f32 {\n const\n N = 1 << EXP2F_TABLE_BITS,\n N_MASK = N - 1,\n shift = reinterpret<f64>(0x4338000000000000), // 0x1.8p+52\n InvLn2N = reinterpret<f64>(0x3FF71547652B82FE) * N, // 0x1.71547652b82fep+0\n Ox1p127f = reinterpret<f32>(0x7F000000);\n\n const\n C0 = reinterpret<f64>(0x3FAC6AF84B912394) / N / N / N, // 0x1.c6af84b912394p-5\n C1 = reinterpret<f64>(0x3FCEBFCE50FAC4F3) / N / N, // 0x1.ebfce50fac4f3p-3\n C2 = reinterpret<f64>(0x3FE62E42FF0C52D6) / N; // 0x1.62e42ff0c52d6p-1\n\n let xd = <f64>x;\n let ix = reinterpret<u32>(x);\n let ux = ix >> 20 & 0x7FF;\n if (ux >= 0x42B) {\n // |x| >= 88 or x is nan.\n if (ix == 0xFF800000) return 0; // x == -Inf -> 0\n if (ux >= 0x7F8) return x + x; // x == Inf/NaN -> Inf/NaN\n if (x > reinterpret<f32>(0x42B17217)) return x * Ox1p127f; // x > log(0x1p128) ~= 88.72 -> HugeVal (Owerflow)\n if (x < reinterpret<f32>(0xC2CFF1B4)) return 0; // x < log(0x1p-150) ~= -103.97 -> 0 (Underflow)\n }\n\n // x*N/Ln2 = k + r with r in [-1/2, 1/2] and int k.\n let z = InvLn2N * xd;\n\n // Round and convert z to int, the result is in [-150*N, 128*N] and\n // ideally ties-to-even rule is used, otherwise the magnitude of r\n // can be bigger which gives larger approximation error.\n let kd = <f64>(z + shift);\n let ki = reinterpret<u64>(kd);\n let r = z - (kd - shift);\n let s: f64, y: f64, t: u64;\n\n // exp(x) = 2^(k/N) * 2^(r/N) ~= s * (C0*r^3 + C1*r^2 + C2*r + 1)\n t = load<u64>(EXP2F_DATA_TAB + ((<usize>ki & N_MASK) << alignof<u64>()));\n t += ki << (52 - EXP2F_TABLE_BITS);\n s = reinterpret<f64>(t);\n z = C0 * r + C1;\n y = C2 * r + 1;\n y += z * (r * r);\n y *= s;\n\n return <f32>y;\n}\n\n//\n// Lookup data for log2f\n//\n\n// @ts-ignore: decorator\n@inline const LOG2F_TABLE_BITS = 4;\n\n// @ts-ignore: decorator\n@lazy @inline const LOG2F_DATA_TAB = memory.data<u64>([\n 0x3FF661EC79F8F3BE, 0xBFDEFEC65B963019, // 0x1.661ec79f8f3bep+0, -0x1.efec65b963019p-2,\n 0x3FF571ED4AAF883D, 0xBFDB0B6832D4FCA4, // 0x1.571ed4aaf883dp+0, -0x1.b0b6832d4fca4p-2,\n 0x3FF49539F0F010B0, 0xBFD7418B0A1FB77B, // 0x1.49539f0f010bp+0 , -0x1.7418b0a1fb77bp-2,\n 0x3FF3C995B0B80385, 0xBFD39DE91A6DCF7B, // 0x1.3c995b0b80385p+0, -0x1.39de91a6dcf7bp-2,\n 0x3FF30D190C8864A5, 0xBFD01D9BF3F2B631, // 0x1.30d190c8864a5p+0, -0x1.01d9bf3f2b631p-2,\n 0x3FF25E227B0B8EA0, 0xBFC97C1D1B3B7AF0, // 0x1.25e227b0b8eap+0 , -0x1.97c1d1b3b7afp-3 ,\n 0x3FF1BB4A4A1A343F, 0xBFC2F9E393AF3C9F, // 0x1.1bb4a4a1a343fp+0, -0x1.2f9e393af3c9fp-3,\n 0x3FF12358F08AE5BA, 0xBFB960CBBF788D5C, // 0x1.12358f08ae5bap+0, -0x1.960cbbf788d5cp-4,\n 0x3FF0953F419900A7, 0xBFAA6F9DB6475FCE, // 0x1.0953f419900a7p+0, -0x1.a6f9db6475fcep-5,\n 0x3FF0000000000000, 0, // 0x1p+0, 0x0,\n 0x3FEE608CFD9A47AC, 0x3FB338CA9F24F53D, // 0x1.e608cfd9a47acp-1, 0x1.338ca9f24f53dp-4,\n 0x3FECA4B31F026AA0, 0x3FC476A9543891BA, // 0x1.ca4b31f026aap-1 , 0x1.476a9543891bap-3,\n 0x3FEB2036576AFCE6, 0x3FCE840B4AC4E4D2, // 0x1.b2036576afce6p-1, 0x1.e840b4ac4e4d2p-3,\n 0x3FE9C2D163A1AA2D, 0x3FD40645F0C6651C, // 0x1.9c2d163a1aa2dp-1, 0x1.40645f0c6651cp-2,\n 0x3FE886E6037841ED, 0x3FD88E9C2C1B9FF8, // 0x1.886e6037841edp-1, 0x1.88e9c2c1b9ff8p-2,\n 0x3FE767DCF5534862, 0x3FDCE0A44EB17BCC // 0x1.767dcf5534862p-1, 0x1.ce0a44eb17bccp-2\n]);\n\n// ULP error: 0.752 (nearest rounding.)\n// Relative error: 1.9 * 2^-26 (before rounding.)\n// @ts-ignore: decorator\n@inline\nexport function log2f_lut(x: f32): f32 {\n const\n N_MASK = (1 << LOG2F_TABLE_BITS) - 1,\n Ox1p23f = reinterpret<f32>(0x4B000000); // 0x1p23f\n\n const\n A0 = reinterpret<f64>(0xBFD712B6F70A7E4D), // -0x1.712b6f70a7e4dp-2\n A1 = reinterpret<f64>(0x3FDECABF496832E0), // 0x1.ecabf496832ep-2\n A2 = reinterpret<f64>(0xBFE715479FFAE3DE), // -0x1.715479ffae3dep-1\n A3 = reinterpret<f64>(0x3FF715475F35C8B8); // 0x1.715475f35c8b8p0\n\n let ux = reinterpret<u32>(x);\n // Fix sign of zero with downward rounding when x==1.\n // if (WANT_ROUNDING && predict_false(ix == 0x3f800000)) return 0;\n if (ux - 0x00800000 >= 0x7F800000 - 0x00800000) {\n // x < 0x1p-126 or inf or nan.\n if (ux * 2 == 0) return -Infinity;\n if (ux == 0x7F800000) return x; // log2(inf) == inf.\n if ((ux >> 31) || ux * 2 >= 0xFF000000) return (x - x) / (x - x);\n // x is subnormal, normalize it.\n ux = reinterpret<u32>(x * Ox1p23f);\n ux -= 23 << 23;\n }\n // x = 2^k z; where z is in range [OFF,2*OFF] and exact.\n // The range is split into N subintervals.\n // The ith subinterval contains z and c is near its center.\n let tmp = ux - 0x3F330000;\n let i = (tmp >> (23 - LOG2F_TABLE_BITS)) & N_MASK;\n let top = tmp & 0xFF800000;\n let iz = ux - top;\n let k = <i32>tmp >> 23;\n\n let invc = load<f64>(LOG2F_DATA_TAB + (i << (1 + alignof<f64>())), 0 << alignof<f64>());\n let logc = load<f64>(LOG2F_DATA_TAB + (i << (1 + alignof<f64>())), 1 << alignof<f64>());\n let z = <f64>reinterpret<f32>(iz);\n\n // log2(x) = log1p(z/c-1)/ln2 + log2(c) + k\n let r = z * invc - 1;\n let y0 = logc + <f64>k;\n\n // Pipelined polynomial evaluation to approximate log1p(r)/ln2.\n let y = A1 * r + A2;\n let p = A3 * r + y0;\n let r2 = r * r;\n y += A0 * r2;\n y = y * r2 + p;\n\n return <f32>y;\n}\n\n//\n// Lookup data for logf. See: https://git.musl-libc.org/cgit/musl/tree/src/math/logf.c\n//\n\n// @ts-ignore: decorator\n@inline const LOGF_TABLE_BITS = 4;\n\n// @ts-ignore: decorator\n@lazy @inline const LOGF_DATA_TAB = memory.data<u64>([\n 0x3FF661EC79F8F3BE, 0xBFD57BF7808CAADE, // 0x1.661ec79f8f3bep+0, -0x1.57bf7808caadep-2,\n 0x3FF571ED4AAF883D, 0xBFD2BEF0A7C06DDB, // 0x1.571ed4aaf883dp+0, -0x1.2bef0a7c06ddbp-2,\n 0x3FF49539F0F010B0, 0xBFD01EAE7F513A67, // 0x1.49539f0f010bp+0 , -0x1.01eae7f513a67p-2,\n 0x3FF3C995B0B80385, 0xBFCB31D8A68224E9, // 0x1.3c995b0b80385p+0, -0x1.b31d8a68224e9p-3,\n 0x3FF30D190C8864A5, 0xBFC6574F0AC07758, // 0x1.30d190c8864a5p+0, -0x1.6574f0ac07758p-3,\n 0x3FF25E227B0B8EA0, 0xBFC1AA2BC79C8100, // 0x1.25e227b0b8eap+0 , -0x1.1aa2bc79c81p-3 ,\n 0x3FF1BB4A4A1A343F, 0xBFBA4E76CE8C0E5E, // 0x1.1bb4a4a1a343fp+0, -0x1.a4e76ce8c0e5ep-4,\n 0x3FF12358F08AE5BA, 0xBFB1973C5A611CCC, // 0x1.12358f08ae5bap+0, -0x1.1973c5a611cccp-4,\n 0x3FF0953F419900A7, 0xBFA252F438E10C1E, // 0x1.0953f419900a7p+0, -0x1.252f438e10c1ep-5,\n 0x3FF0000000000000, 0, // 0x1p+0, 0,\n 0x3FEE608CFD9A47AC, 0x3FAAA5AA5DF25984, // 0x1.e608cfd9a47acp-1, 0x1.aa5aa5df25984p-5,\n 0x3FECA4B31F026AA0, 0x3FBC5E53AA362EB4, // 0x1.ca4b31f026aap-1 , 0x1.c5e53aa362eb4p-4,\n 0x3FEB2036576AFCE6, 0x3FC526E57720DB08, // 0x1.b2036576afce6p-1, 0x1.526e57720db08p-3,\n 0x3FE9C2D163A1AA2D, 0x3FCBC2860D224770, // 0x1.9c2d163a1aa2dp-1, 0x1.bc2860d22477p-3 ,\n 0x3FE886E6037841ED, 0x3FD1058BC8A07EE1, // 0x1.886e6037841edp-1, 0x1.1058bc8a07ee1p-2,\n 0x3FE767DCF5534862, 0x3FD4043057B6EE09 // 0x1.767dcf5534862p-1, 0x1.4043057b6ee09p-2\n]);\n\n// ULP error: 0.818 (nearest rounding.)\n// Relative error: 1.957 * 2^-26 (before rounding.)\n// @ts-ignore: decorator\n@inline\nexport function logf_lut(x: f32): f32 {\n const\n N_MASK = (1 << LOGF_TABLE_BITS) - 1,\n Ox1p23f = reinterpret<f32>(0x4B000000); // 0x1p23f\n\n const\n Ln2 = reinterpret<f64>(0x3FE62E42FEFA39EF), // 0x1.62e42fefa39efp-1;\n A0 = reinterpret<f64>(0xBFD00EA348B88334), // -0x1.00ea348b88334p-2\n A1 = reinterpret<f64>(0x3FD5575B0BE00B6A), // 0x1.5575b0be00b6ap-2\n A2 = reinterpret<f64>(0xBFDFFFFEF20A4123); // -0x1.ffffef20a4123p-2\n\n let ux = reinterpret<u32>(x);\n // Fix sign of zero with downward rounding when x==1.\n // if (WANT_ROUNDING && ux == 0x3f800000) return 0;\n if (ux - 0x00800000 >= 0x7F800000 - 0x00800000) {\n // x < 0x1p-126 or inf or nan.\n if ((ux << 1) == 0) return -Infinity;\n if (ux == 0x7F800000) return x; // log(inf) == inf.\n if ((ux >> 31) || (ux << 1) >= 0xFF000000) return (x - x) / (x - x);\n // x is subnormal, normalize it.\n ux = reinterpret<u32>(x * Ox1p23f);\n ux -= 23 << 23;\n }\n // x = 2^k z; where z is in range [OFF,2*OFF] and exact.\n // The range is split into N subintervals.\n // The ith subinterval contains z and c is near its center.\n let tmp = ux - 0x3F330000;\n let i = (tmp >> (23 - LOGF_TABLE_BITS)) & N_MASK;\n let k = <i32>tmp >> 23;\n let iz = ux - (tmp & 0x1FF << 23);\n\n let invc = load<f64>(LOGF_DATA_TAB + (i << (1 + alignof<f64>())), 0 << alignof<f64>());\n let logc = load<f64>(LOGF_DATA_TAB + (i << (1 + alignof<f64>())), 1 << alignof<f64>());\n\n let z = <f64>reinterpret<f32>(iz);\n\n // log(x) = log1p(z/c-1) + log(c) + k*Ln2\n let r = z * invc - 1;\n let y0 = logc + <f64>k * Ln2;\n\n // Pipelined polynomial evaluation to approximate log1p(r).\n let r2 = r * r;\n let y = A1 * r + A2;\n y += A0 * r2;\n y = y * r2 + (y0 + r);\n\n return <f32>y;\n}\n\n//\n// Lookup data for powf. See: https://git.musl-libc.org/cgit/musl/tree/src/math/powf.c\n//\n\n// @ts-ignore: decorator\n@inline\nfunction zeroinfnanf(ux: u32): bool {\n return (ux << 1) - 1 >= (<u32>0x7f800000 << 1) - 1;\n}\n\n// Returns 0 if not int, 1 if odd int, 2 if even int. The argument is\n// the bit representation of a non-zero finite floating-point value.\n// @ts-ignore: decorator\n@inline\nfunction checkintf(iy: u32): i32 {\n let e = iy >> 23 & 0xFF;\n if (e < 0x7F ) return 0;\n if (e > 0x7F + 23) return 2;\n e = 1 << (0x7F + 23 - e);\n if (iy & (e - 1)) return 0;\n if (iy & e ) return 1;\n return 2;\n}\n\n// Subnormal input is normalized so ix has negative biased exponent.\n// Output is multiplied by N (POWF_SCALE) if TOINT_INTRINICS is set.\n// @ts-ignore: decorator\n@inline\nfunction log2f_inline(ux: u32): f64 {\n const N_MASK = (1 << LOG2F_TABLE_BITS) - 1;\n\n const\n A0 = reinterpret<f64>(0x3FD27616C9496E0B), // 0x1.27616c9496e0bp-2\n A1 = reinterpret<f64>(0xBFD71969A075C67A), // -0x1.71969a075c67ap-2\n A2 = reinterpret<f64>(0x3FDEC70A6CA7BADD), // 0x1.ec70a6ca7baddp-2\n A3 = reinterpret<f64>(0xBFE7154748BEF6C8), // -0x1.7154748bef6c8p-1\n A4 = reinterpret<f64>(0x3FF71547652AB82B); // 0x1.71547652ab82bp+0\n\n // x = 2^k z; where z is in range [OFF,2*OFF] and exact.\n // The range is split into N subintervals.\n // The ith subinterval contains z and c is near its center.\n let tmp = ux - 0x3F330000;\n let i = usize((tmp >> (23 - LOG2F_TABLE_BITS)) & N_MASK);\n let top = tmp & 0xFF800000;\n let uz = ux - top;\n let k = <i32>top >> 23;\n\n let invc = load<f64>(LOG2F_DATA_TAB + (i << (1 + alignof<f64>())), 0 << alignof<f64>());\n let logc = load<f64>(LOG2F_DATA_TAB + (i << (1 + alignof<f64>())), 1 << alignof<f64>());\n let z = <f64>reinterpret<f32>(uz);\n\n // log2(x) = log1p(z/c-1)/ln2 + log2(c) + k\n let r = z * invc - 1;\n let y0 = logc + <f64>k;\n\n // Pipelined polynomial evaluation to approximate log1p(r)/ln2.\n let y = A0 * r + A1;\n let p = A2 * r + A3;\n let q = A4 * r + y0;\n\n r *= r;\n q += p * r;\n y = y * (r * r) + q;\n\n return y;\n}\n\n// The output of log2 and thus the input of exp2 is either scaled by N\n// (in case of fast toint intrinsics) or not. The unscaled xd must be\n// in [-1021,1023], sign_bias sets the sign of the result.\n// @ts-ignore: decorator\n@inline\nfunction exp2f_inline(xd: f64, signBias: u32): f32 {\n const\n N = 1 << EXP2F_TABLE_BITS,\n N_MASK = N - 1,\n shift = reinterpret<f64>(0x4338000000000000) / N; // 0x1.8p+52\n\n const\n C0 = reinterpret<f64>(0x3FAC6AF84B912394), // 0x1.c6af84b912394p-5\n C1 = reinterpret<f64>(0x3FCEBFCE50FAC4F3), // 0x1.ebfce50fac4f3p-3\n C2 = reinterpret<f64>(0x3FE62E42FF0C52D6); // 0x1.62e42ff0c52d6p-1\n\n // x = k/N + r with r in [-1/(2N), 1/(2N)]\n let kd = <f64>(xd + shift);\n let ki = reinterpret<u64>(kd);\n let r = xd - (kd - shift);\n let t: u64, z: f64, y: f64, s: f64;\n\n // exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1)\n t = load<u64>(EXP2F_DATA_TAB + ((<usize>ki & N_MASK) << alignof<u64>()));\n t += (ki + signBias) << (52 - EXP2F_TABLE_BITS);\n s = reinterpret<f64>(t);\n z = C0 * r + C1;\n y = C2 * r + 1;\n y += z * (r * r);\n y *= s;\n return <f32>y;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction xflowf(sign: u32, y: f32): f32 {\n return select<f32>(-y, y, sign) * y;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction oflowf(sign: u32): f32 {\n return xflowf(sign, reinterpret<f32>(0x70000000)); // 0x1p97f\n}\n\n// @ts-ignore: decorator\n@inline\nfunction uflowf(sign: u32): f32 {\n return xflowf(sign, reinterpret<f32>(0x10000000)); // 0x1p-95f\n}\n\n// @ts-ignore: decorator\n@inline\nexport function powf_lut(x: f32, y: f32): f32 {\n const\n Ox1p23f = reinterpret<f32>(0x4B000000), // 0x1p23f\n UPPER_LIMIT = reinterpret<f64>(0x405FFFFFFFD1D571), // 0x1.fffffffd1d571p+6\n LOWER_LIMIT = -150.0,\n SIGN_BIAS = 1 << (EXP2F_TABLE_BITS + 11);\n\n let signBias: u32 = 0;\n let ix = reinterpret<u32>(x);\n let iy = reinterpret<u32>(y);\n let ny = 0;\n\n if (i32(ix - 0x00800000 >= 0x7f800000 - 0x00800000) | (ny = i32(zeroinfnanf(iy)))) {\n // Either (x < 0x1p-126 or inf or nan) or (y is 0 or inf or nan).\n if (ny) {\n if ((iy << 1) == 0) return 1.0;\n if (ix == 0x3F800000) return NaN; // original: 1.0\n if ((ix << 1) > (<u32>0x7F800000 << 1) || (iy << 1) > (<u32>0x7F800000 << 1)) return x + y;\n if ((ix << 1) == (0x3F800000 << 1)) return NaN; // original: 1.0\n if (((ix << 1) < (0x3F800000 << 1)) == !(iy >> 31)) return 0; // |x| < 1 && y==inf or |x| > 1 && y==-inf.\n return y * y;\n }\n if (zeroinfnanf(ix)) {\n let x2 = x * x;\n if ((ix >> 31) && checkintf(iy) == 1) x2 = -x2;\n return <i32>iy < 0 ? 1 / x2 : x2;\n }\n // x and y are non-zero finite.\n if (<i32>ix < 0) {\n // Finite x < 0.\n let yint = checkintf(iy);\n if (yint == 0) return (x - x) / (x - x);\n if (yint == 1) signBias = SIGN_BIAS;\n ix &= 0x7FFFFFFF;\n }\n if (ix < 0x00800000) {\n // Normalize subnormal x so exponent becomes negative.\n ix = reinterpret<u32>(x * Ox1p23f);\n ix &= 0x7FFFFFFF;\n ix -= 23 << 23;\n }\n }\n let logx = log2f_inline(ix);\n let ylogx = y * logx; // cannot overflow, y is single prec.\n if ((reinterpret<u64>(ylogx) >> 47 & 0xFFFF) >= 0x80BF) { // reinterpret<u64>(126.0) >> 47\n // |y * log(x)| >= 126\n if (ylogx > UPPER_LIMIT) return oflowf(signBias); // overflow\n if (ylogx <= LOWER_LIMIT) return uflowf(signBias); // underflow\n }\n return exp2f_inline(ylogx, signBias);\n}\n\n//\n// Lookup data for exp. See: https://git.musl-libc.org/cgit/musl/tree/src/math/exp.c\n//\n\n// @ts-ignore: decorator\n@inline const EXP_TABLE_BITS = 7;\n\n// @ts-ignore: decorator\n@lazy @inline const EXP_DATA_TAB = memory.data<u64>([\n 0x0000000000000000, 0x3FF0000000000000,\n 0x3C9B3B4F1A88BF6E, 0x3FEFF63DA9FB3335,\n 0xBC7160139CD8DC5D, 0x3FEFEC9A3E778061,\n 0xBC905E7A108766D1, 0x3FEFE315E86E7F85,\n 0x3C8CD2523567F613, 0x3FEFD9B0D3158574,\n 0xBC8BCE8023F98EFA, 0x3FEFD06B29DDF6DE,\n 0x3C60F74E61E6C861, 0x3FEFC74518759BC8,\n 0x3C90A3E45B33D399, 0x3FEFBE3ECAC6F383,\n 0x3C979AA65D837B6D, 0x3FEFB5586CF9890F,\n 0x3C8EB51A92FDEFFC, 0x3FEFAC922B7247F7,\n 0x3C3EBE3D702F9CD1, 0x3FEFA3EC32D3D1A2,\n 0xBC6A033489906E0B, 0x3FEF9B66AFFED31B,\n 0xBC9556522A2FBD0E, 0x3FEF9301D0125B51,\n 0xBC5080EF8C4EEA55, 0x3FEF8ABDC06C31CC,\n 0xBC91C923B9D5F416, 0x3FEF829AAEA92DE0,\n 0x3C80D3E3E95C55AF, 0x3FEF7A98C8A58E51,\n 0xBC801B15EAA59348, 0x3FEF72B83C7D517B,\n 0xBC8F1FF055DE323D, 0x3FEF6AF9388C8DEA,\n 0x3C8B898C3F1353BF, 0x3FEF635BEB6FCB75,\n 0xBC96D99C7611EB26, 0x3FEF5BE084045CD4,\n 0x3C9AECF73E3A2F60, 0x3FEF54873168B9AA,\n 0xBC8FE782CB86389D, 0x3FEF4D5022FCD91D,\n 0x3C8A6F4144A6C38D, 0x3FEF463B88628CD6,\n 0x3C807A05B0E4047D, 0x3FEF3F49917DDC96,\n 0x3C968EFDE3A8A894, 0x3FEF387A6E756238,\n 0x3C875E18F274487D, 0x3FEF31CE4FB2A63F,\n 0x3C80472B981FE7F2, 0x3FEF2B4565E27CDD,\n 0xBC96B87B3F71085E, 0x3FEF24DFE1F56381,\n 0x3C82F7E16D09AB31, 0x3FEF1E9DF51FDEE1,\n 0xBC3D219B1A6FBFFA, 0x3FEF187FD0DAD990,\n 0x3C8B3782720C0AB4, 0x3FEF1285A6E4030B,\n 0x3C6E149289CECB8F, 0x3FEF0CAFA93E2F56,\n 0x3C834D754DB0ABB6, 0x3FEF06FE0A31B715,\n 0x3C864201E2AC744C, 0x3FEF0170FC4CD831,\n 0x3C8FDD395DD3F84A, 0x3FEEFC08B26416FF,\n 0xBC86A3803B8E5B04, 0x3FEEF6C55F929FF1,\n 0xBC924AEDCC4B5068, 0x3FEEF1A7373AA9CB,\n 0xBC9907F81B512D8E, 0x3FEEECAE6D05D866,\n 0xBC71D1E83E9436D2, 0x3FEEE7DB34E59FF7,\n 0xBC991919B3CE1B15, 0x3FEEE32DC313A8E5,\n 0x3C859F48A72A4C6D, 0x3FEEDEA64C123422,\n 0xBC9312607A28698A, 0x3FEEDA4504AC801C,\n 0xBC58A78F4817895B, 0x3FEED60A21F72E2A,\n 0xBC7C2C9B67499A1B, 0x3FEED1F5D950A897,\n 0x3C4363ED60C2AC11, 0x3FEECE086061892D,\n 0x3C9666093B0664EF, 0x3FEECA41ED1D0057,\n 0x3C6ECCE1DAA10379, 0x3FEEC6A2B5C13CD0,\n 0x3C93FF8E3F0F1230, 0x3FEEC32AF0D7D3DE,\n 0x3C7690CEBB7AAFB0, 0x3FEEBFDAD5362A27,\n 0x3C931DBDEB54E077, 0x3FEEBCB299FDDD0D,\n 0xBC8F94340071A38E, 0x3FEEB9B2769D2CA7,\n 0xBC87DECCDC93A349, 0x3FEEB6DAA2CF6642,\n 0xBC78DEC6BD0F385F, 0x3FEEB42B569D4F82,\n 0xBC861246EC7B5CF6, 0x3FEEB1A4CA5D920F,\n 0x3C93350518FDD78E, 0x3FEEAF4736B527DA,\n 0x3C7B98B72F8A9B05, 0x3FEEAD12D497C7FD,\n 0x3C9063E1E21C5409, 0x3FEEAB07DD485429,\n 0x3C34C7855019C6EA, 0x3FEEA9268A5946B7,\n 0x3C9432E62B64C035, 0x3FEEA76F15AD2148,\n 0xBC8CE44A6199769F, 0x3FEEA5E1B976DC09,\n 0xBC8C33C53BEF4DA8, 0x3FEEA47EB03A5585,\n 0xBC845378892BE9AE, 0x3FEEA34634CCC320,\n 0xBC93CEDD78565858, 0x3FEEA23882552225,\n 0x3C5710AA807E1964, 0x3FEEA155D44CA973,\n 0xBC93B3EFBF5E2228, 0x3FEEA09E667F3BCD,\n 0xBC6A12AD8734B982, 0x3FEEA012750BDABF,\n 0xBC6367EFB86DA9EE, 0x3FEE9FB23C651A2F,\n 0xBC80DC3D54E08851, 0x3FEE9F7DF9519484,\n 0xBC781F647E5A3ECF, 0x3FEE9F75E8EC5F74,\n 0xBC86EE4AC08B7DB0, 0x3FEE9F9A48A58174,\n 0xBC8619321E55E68A, 0x3FEE9FEB564267C9,\n 0x3C909CCB5E09D4D3, 0x3FEEA0694FDE5D3F,\n 0xBC7B32DCB94DA51D, 0x3FEEA11473EB0187,\n 0x3C94ECFD5467C06B, 0x3FEEA1ED0130C132,\n 0x3C65EBE1ABD66C55, 0x3FEEA2F336CF4E62,\n 0xBC88A1C52FB3CF42, 0x3FEEA427543E1A12,\n 0xBC9369B6F13B3734, 0x3FEEA589994CCE13,\n 0xBC805E843A19FF1E, 0x3FEEA71A4623C7AD,\n 0xBC94D450D872576E, 0x3FEEA8D99B4492ED,\n 0x3C90AD675B0E8A00, 0x3FEEAAC7D98A6699,\n 0x3C8DB72FC1F0EAB4, 0x3FEEACE5422AA0DB,\n 0xBC65B6609CC5E7FF, 0x3FEEAF3216B5448C,\n 0x3C7BF68359F35F44, 0x3FEEB1AE99157736,\n 0xBC93091FA71E3D83, 0x3FEEB45B0B91FFC6,\n 0xBC5DA9B88B6C1E29, 0x3FEEB737B0CDC5E5,\n 0xBC6C23F97C90B959, 0x3FEEBA44CBC8520F,\n 0xBC92434322F4F9AA, 0x3FEEBD829FDE4E50,\n 0xBC85CA6CD7668E4B, 0x3FEEC0F170CA07BA,\n 0x3C71AFFC2B91CE27, 0x3FEEC49182A3F090,\n 0x3C6DD235E10A73BB, 0x3FEEC86319E32323,\n 0xBC87C50422622263, 0x3FEECC667B5DE565,\n 0x3C8B1C86E3E231D5, 0x3FEED09BEC4A2D33,\n 0xBC91BBD1D3BCBB15, 0x3FEED503B23E255D,\n 0x3C90CC319CEE31D2, 0x3FEED99E1330B358,\n 0x3C8469846E735AB3, 0x3FEEDE6B5579FDBF,\n 0xBC82DFCD978E9DB4, 0x3FEEE36BBFD3F37A,\n 0x3C8C1A7792CB3387, 0x3FEEE89F995AD3AD,\n 0xBC907B8F4AD1D9FA, 0x3FEEEE07298DB666,\n 0xBC55C3D956DCAEBA, 0x3FEEF3A2B84F15FB,\n 0xBC90A40E3DA6F640, 0x3FEEF9728DE5593A,\n 0xBC68D6F438AD9334, 0x3FEEFF76F2FB5E47,\n 0xBC91EEE26B588A35, 0x3FEF05B030A1064A,\n 0x3C74FFD70A5FDDCD, 0x3FEF0C1E904BC1D2,\n 0xBC91BDFBFA9298AC, 0x3FEF12C25BD71E09,\n 0x3C736EAE30AF0CB3, 0x3FEF199BDD85529C,\n 0x3C8EE3325C9FFD94, 0x3FEF20AB5FFFD07A,\n 0x3C84E08FD10959AC, 0x3FEF27F12E57D14B,\n 0x3C63CDAF384E1A67, 0x3FEF2F6D9406E7B5,\n 0x3C676B2C6C921968, 0x3FEF3720DCEF9069,\n 0xBC808A1883CCB5D2, 0x3FEF3F0B555DC3FA,\n 0xBC8FAD5D3FFFFA6F, 0x3FEF472D4A07897C,\n 0xBC900DAE3875A949, 0x3FEF4F87080D89F2,\n 0x3C74A385A63D07A7, 0x3FEF5818DCFBA487,\n 0xBC82919E2040220F, 0x3FEF60E316C98398,\n 0x3C8E5A50D5C192AC, 0x3FEF69E603DB3285,\n 0x3C843A59AC016B4B, 0x3FEF7321F301B460,\n 0xBC82D52107B43E1F, 0x3FEF7C97337B9B5F,\n 0xBC892AB93B470DC9, 0x3FEF864614F5A129,\n 0x3C74B604603A88D3, 0x3FEF902EE78B3FF6,\n 0x3C83C5EC519D7271, 0x3FEF9A51FBC74C83,\n 0xBC8FF7128FD391F0, 0x3FEFA4AFA2A490DA,\n 0xBC8DAE98E223747D, 0x3FEFAF482D8E67F1,\n 0x3C8EC3BC41AA2008, 0x3FEFBA1BEE615A27,\n 0x3C842B94C3A9EB32, 0x3FEFC52B376BBA97,\n 0x3C8A64A931D185EE, 0x3FEFD0765B6E4540,\n 0xBC8E37BAE43BE3ED, 0x3FEFDBFDAD9CBE14,\n 0x3C77893B4D91CD9D, 0x3FEFE7C1819E90D8,\n 0x3C5305C14160CC89, 0x3FEFF3C22B8F71F1\n]);\n\n// Handle cases that may overflow or underflow when computing the result that\n// is scale*(1+TMP) without intermediate rounding. The bit representation of\n// scale is in SBITS, however it has a computed exponent that may have\n// overflown into the sign bit so that needs to be adjusted before using it as\n// a double. (int32_t)KI is the k used in the argument reduction and exponent\n// adjustment of scale, positive k here means the result may overflow and\n// negative k means the result may underflow.\n// @ts-ignore: decorator\n@inline\nfunction specialcase(tmp: f64, sbits: u64, ki: u64): f64 {\n const\n Ox1p_1022 = reinterpret<f64>(0x0010000000000000), // 0x1p-1022\n Ox1p1009 = reinterpret<f64>(0x7F00000000000000); // 0x1p1009\n\n let scale: f64;\n if (!(ki & 0x80000000)) {\n // k > 0, the exponent of scale might have overflowed by <= 460.\n sbits -= u64(1009) << 52;\n scale = reinterpret<f64>(sbits);\n return Ox1p1009 * (scale + scale * tmp); // 0x1p1009\n }\n // k < 0, need special care in the subnormal range.\n sbits += u64(1022) << 52;\n // Note: sbits is signed scale.\n scale = reinterpret<f64>(sbits);\n let y = scale + scale * tmp;\n if (abs(y) < 1.0) {\n // Round y to the right precision before scaling it into the subnormal\n // range to avoid double rounding that can cause 0.5+E/2 ulp error where\n // E is the worst-case ulp error outside the subnormal range. So this\n // is only useful if the goal is better than 1 ulp worst-case error.\n let one = copysign(1.0, y);\n let lo = scale - y + scale * tmp;\n let hi = one + y;\n lo = one - hi + y + lo;\n y = (hi + lo) - one;\n // Fix the sign of 0.\n if (y == 0.0) y = reinterpret<f64>(sbits & 0x8000000000000000);\n }\n return y * Ox1p_1022;\n}\n\n// @ts-ignore: decorator\n@inline\nexport function exp_lut(x: f64): f64 {\n const\n N = 1 << EXP_TABLE_BITS,\n N_MASK = N - 1;\n\n const\n InvLn2N = reinterpret<f64>(0x3FF71547652B82FE) * N, // 0x1.71547652b82fep0\n NegLn2hiN = reinterpret<f64>(0xBF762E42FEFA0000), // -0x1.62e42fefa0000p-8\n NegLn2loN = reinterpret<f64>(0xBD0CF79ABC9E3B3A), // -0x1.cf79abc9e3b3ap-47\n shift = reinterpret<f64>(0x4338000000000000); // 0x1.8p52;\n\n const\n C2 = reinterpret<f64>(0x3FDFFFFFFFFFFDBD), // __exp_data.poly[0] (0x1.ffffffffffdbdp-2)\n C3 = reinterpret<f64>(0x3FC555555555543C), // __exp_data.poly[1] (0x1.555555555543cp-3)\n C4 = reinterpret<f64>(0x3FA55555CF172B91), // __exp_data.poly[2] (0x1.55555cf172b91p-5)\n C5 = reinterpret<f64>(0x3F81111167A4D017); // __exp_data.poly[3] (0x1.1111167a4d017p-7)\n\n let ux = reinterpret<u64>(x);\n let abstop = u32(ux >> 52) & 0x7FF;\n if (abstop - 0x3C9 >= 0x03F) {\n if (abstop - 0x3C9 >= 0x80000000) return 1;\n if (abstop >= 0x409) {\n if (ux == 0xFFF0000000000000) return 0;\n if (abstop >= 0x7FF) {\n return 1.0 + x;\n } else {\n return select<f64>(0, Infinity, <i64>ux < 0);\n }\n }\n // Large x is special cased below.\n abstop = 0;\n }\n\n // exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)]\n // x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N]\n let z = InvLn2N * x;\n // #if TOINT_INTRINSICS\n // \tkd = roundtoint(z);\n // \tki = converttoint(z);\n // #elif EXP_USE_TOINT_NARROW\n // \t// z - kd is in [-0.5-2^-16, 0.5] in all rounding modes.\n // let kd = z + shift;\n // let ki = reinterpret<u64>(kd) >> 16;\n // let kd = <f64><i32>ki;\n // #else\n // z - kd is in [-1, 1] in non-nearest rounding modes.\n let kd = z + shift;\n let ki = reinterpret<u64>(kd);\n kd -= shift;\n // #endif\n let r = x + kd * NegLn2hiN + kd * NegLn2loN;\n // 2^(k/N) ~= scale * (1 + tail).\n let idx = usize((ki & N_MASK) << 1);\n let top = ki << (52 - EXP_TABLE_BITS);\n\n let tail = reinterpret<f64>(load<u64>(EXP_DATA_TAB + (idx << alignof<u64>()))); // T[idx]\n // This is only a valid scale when -1023*N < k < 1024*N\n let sbits = load<u64>(EXP_DATA_TAB + (idx << alignof<u64>()), 1 << alignof<u64>()) + top; // T[idx + 1]\n // exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (tail + exp(r) - 1).\n // Evaluation is optimized assuming superscalar pipelined execution.\n let r2 = r * r;\n // Without fma the worst case error is 0.25/N ulp larger.\n // Worst case error is less than 0.5+1.11/N+(abs poly error * 2^53) ulp.\n let tmp = tail + r + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);\n if (abstop == 0) return specialcase(tmp, sbits, ki);\n let scale = reinterpret<f64>(sbits);\n // Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there\n // is no spurious underflow here even without fma.\n return scale + scale * tmp;\n}\n\n//\n// Lookup data for exp2. See: https://git.musl-libc.org/cgit/musl/tree/src/math/exp2.c\n//\n\n// Handle cases that may overflow or underflow when computing the result that\n// is scale*(1+TMP) without intermediate rounding. The bit representation of\n// scale is in SBITS, however it has a computed exponent that may have\n// overflown into the sign bit so that needs to be adjusted before using it as\n// a double. (int32_t)KI is the k used in the argument reduction and exponent\n// adjustment of scale, positive k here means the result may overflow and\n// negative k means the result may underflow.\n// @ts-ignore: decorator\n@inline\nfunction specialcase2(tmp: f64, sbits: u64, ki: u64): f64 {\n const Ox1p_1022 = reinterpret<f64>(0x10000000000000); // 0x1p-1022\n let scale: f64;\n if ((ki & 0x80000000) == 0) {\n // k > 0, the exponent of scale might have overflowed by 1\n sbits -= u64(1) << 52;\n scale = reinterpret<f64>(sbits);\n return 2 * (scale * tmp + scale);\n }\n // k < 0, need special care in the subnormal range\n sbits += u64(1022) << 52;\n scale = reinterpret<f64>(sbits);\n let y = scale * tmp + scale;\n if (y < 1.0) {\n // Round y to the right precision before scaling it into the subnormal\n // range to avoid double rounding that can cause 0.5+E/2 ulp error where\n // E is the worst-case ulp error outside the subnormal range. So this\n // is only useful if the goal is better than 1 ulp worst-case error.\n let hi: f64, lo: f64;\n lo = scale - y + scale * tmp;\n hi = 1.0 + y;\n lo = 1.0 - hi + y + lo;\n y = (hi + lo) - 1.0;\n }\n return y * Ox1p_1022;\n}\n\n// @ts-ignore: decorator\n@inline\nexport function exp2_lut(x: f64): f64 {\n const\n N = 1 << EXP_TABLE_BITS,\n N_MASK = N - 1,\n shift = reinterpret<f64>(0x4338000000000000) / N; // 0x1.8p52\n\n const\n C1 = reinterpret<f64>(0x3FE62E42FEFA39EF), // 0x1.62e42fefa39efp-1\n C2 = reinterpret<f64>(0x3FCEBFBDFF82C424), // 0x1.ebfbdff82c424p-3\n C3 = reinterpret<f64>(0x3FAC6B08D70CF4B5), // 0x1.c6b08d70cf4b5p-5\n C4 = reinterpret<f64>(0x3F83B2ABD24650CC), // 0x1.3b2abd24650ccp-7\n C5 = reinterpret<f64>(0x3F55D7E09B4E3A84); // 0x1.5d7e09b4e3a84p-10\n\n let ux = reinterpret<u64>(x);\n let abstop = u32(ux >> 52) & 0x7ff;\n if (abstop - 0x3C9 >= 0x03F) {\n if (abstop - 0x3C9 >= 0x80000000) return 1.0;\n if (abstop >= 0x409) {\n if (ux == 0xFFF0000000000000) return 0;\n if (abstop >= 0x7FF) return 1.0 + x;\n if (<i64>ux >= 0) return Infinity;\n else if (ux >= 0xC090CC0000000000) return 0;\n }\n if ((ux << 1) > 0x811A000000000000) abstop = 0; // Large x is special cased below.\n }\n\n // exp2(x) = 2^(k/N) * 2^r, with 2^r in [2^(-1/2N),2^(1/2N)].\n // x = k/N + r, with int k and r in [-1/2N, 1/2N]\n let kd = x + shift;\n let ki = reinterpret<u64>(kd);\n kd -= shift; // k/N for int k\n let r = x - kd;\n // 2^(k/N) ~= scale * (1 + tail)\n let idx = usize((ki & N_MASK) << 1);\n let top = ki << (52 - EXP_TABLE_BITS);\n\n let tail = reinterpret<f64>(load<u64>(EXP_DATA_TAB + (idx << alignof<u64>()), 0 << alignof<u64>())); // T[idx])\n // This is only a valid scale when -1023*N < k < 1024*N\n let sbits = load<u64>(EXP_DATA_TAB + (idx << alignof<u64>()), 1 << alignof<u64>()) + top; // T[idx + 1]\n // exp2(x) = 2^(k/N) * 2^r ~= scale + scale * (tail + 2^r - 1).\n // Evaluation is optimized assuming superscalar pipelined execution\n let r2 = r * r;\n // Without fma the worst case error is 0.5/N ulp larger.\n // Worst case error is less than 0.5+0.86/N+(abs poly error * 2^53) ulp.\n let tmp = tail + r * C1 + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);\n if (abstop == 0) return specialcase2(tmp, sbits, ki);\n let scale = reinterpret<f64>(sbits);\n // Note: tmp == 0 or |tmp| > 2^-65 and scale > 2^-928, so there\n // is no spurious underflow here even without fma.\n return scale * tmp + scale;\n}\n\n//\n// Lookup data for log2. See: https://git.musl-libc.org/cgit/musl/tree/src/math/log2.c\n//\n\n// @ts-ignore: decorator\n@inline const LOG2_TABLE_BITS = 6;\n\n/* Algorithm:\n\n x = 2^k z\n log2(x) = k + log2(c) + log2(z/c)\n log2(z/c) = poly(z/c - 1)\n\nwhere z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls\ninto the ith one, then table entries are computed as\n\n tab[i].invc = 1/c\n tab[i].logc = (double)log2(c)\n tab2[i].chi = (double)c\n tab2[i].clo = (double)(c - (double)c)\n\nwhere c is near the center of the subinterval and is chosen by trying +-2^29\nfloating point invc candidates around 1/center and selecting one for which\n\n 1) the rounding error in 0x1.8p10 + logc is 0,\n 2) the rounding error in z - chi - clo is < 0x1p-64 and\n 3) the rounding error in (double)log2(c) is minimized (< 0x1p-68).\n\nNote: 1) ensures that k + logc can be computed without rounding error, 2)\nensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to a\nsingle rounding error when there is no fast fma for z*invc - 1, 3) ensures\nthat logc + poly(z/c - 1) has small error, however near x == 1 when\n|log2(x)| < 0x1p-4, this is not enough so that is special cased. */\n\n// @ts-ignore: decorator\n@lazy @inline const LOG2_DATA_TAB1 = memory.data<u64>([\n // invc , logc\n 0x3FF724286BB1ACF8, 0xBFE1095FEECDB000,\n 0x3FF6E1F766D2CCA1, 0xBFE08494BD76D000,\n 0x3FF6A13D0E30D48A, 0xBFE00143AEE8F800,\n 0x3FF661EC32D06C85, 0xBFDEFEC5360B4000,\n 0x3FF623FA951198F8, 0xBFDDFDD91AB7E000,\n 0x3FF5E75BA4CF026C, 0xBFDCFFAE0CC79000,\n 0x3FF5AC055A214FB8, 0xBFDC043811FDA000,\n 0x3FF571ED0F166E1E, 0xBFDB0B67323AE000,\n 0x3FF53909590BF835, 0xBFDA152F5A2DB000,\n 0x3FF5014FED61ADDD, 0xBFD9217F5AF86000,\n 0x3FF4CAB88E487BD0, 0xBFD8304DB0719000,\n 0x3FF49539B4334FEE, 0xBFD74189F9A9E000,\n 0x3FF460CBDFAFD569, 0xBFD6552BB5199000,\n 0x3FF42D664EE4B953, 0xBFD56B23A29B1000,\n 0x3FF3FB01111DD8A6, 0xBFD483650F5FA000,\n 0x3FF3C995B70C5836, 0xBFD39DE937F6A000,\n 0x3FF3991C4AB6FD4A, 0xBFD2BAA1538D6000,\n 0x3FF3698E0CE099B5, 0xBFD1D98340CA4000,\n 0x3FF33AE48213E7B2, 0xBFD0FA853A40E000,\n 0x3FF30D191985BDB1, 0xBFD01D9C32E73000,\n 0x3FF2E025CAB271D7, 0xBFCE857DA2FA6000,\n 0x3FF2B404CF13CD82, 0xBFCCD3C8633D8000,\n 0x3FF288B02C7CCB50, 0xBFCB26034C14A000,\n 0x3FF25E2263944DE5, 0xBFC97C1C2F4FE000,\n 0x3FF234563D8615B1, 0xBFC7D6023F800000,\n 0x3FF20B46E33EAF38, 0xBFC633A71A05E000,\n 0x3FF1E2EEFDCDA3DD, 0xBFC494F5E9570000,\n 0x3FF1BB4A580B3930, 0xBFC2F9E424E0A000,\n 0x3FF19453847F2200, 0xBFC162595AFDC000,\n 0x3FF16E06C0D5D73C, 0xBFBF9C9A75BD8000,\n 0x3FF1485F47B7E4C2, 0xBFBC7B575BF9C000,\n 0x3FF12358AD0085D1, 0xBFB960C60FF48000,\n 0x3FF0FEF00F532227, 0xBFB64CE247B60000,\n 0x3FF0DB2077D03A8F, 0xBFB33F78B2014000,\n 0x3FF0B7E6D65980D9, 0xBFB0387D1A42C000,\n 0x3FF0953EFE7B408D, 0xBFAA6F9208B50000,\n 0x3FF07325CAC53B83, 0xBFA47A954F770000,\n 0x3FF05197E40D1B5C, 0xBF9D23A8C50C0000,\n 0x3FF03091C1208EA2, 0xBF916A2629780000,\n 0x3FF0101025B37E21, 0xBF7720F8D8E80000,\n 0x3FEFC07EF9CAA76B, 0x3F86FE53B1500000,\n 0x3FEF4465D3F6F184, 0x3FA11CCCE10F8000,\n 0x3FEECC079F84107F, 0x3FAC4DFC8C8B8000,\n 0x3FEE573A99975AE8, 0x3FB3AA321E574000,\n 0x3FEDE5D6F0BD3DE6, 0x3FB918A0D08B8000,\n 0x3FED77B681FF38B3, 0x3FBE72E9DA044000,\n 0x3FED0CB5724DE943, 0x3FC1DCD2507F6000,\n 0x3FECA4B2DC0E7563, 0x3FC476AB03DEA000,\n 0x3FEC3F8EE8D6CB51, 0x3FC7074377E22000,\n 0x3FEBDD2B4F020C4C, 0x3FC98EDE8BA94000,\n 0x3FEB7D6C006015CA, 0x3FCC0DB86AD2E000,\n 0x3FEB20366E2E338F, 0x3FCE840AAFCEE000,\n 0x3FEAC57026295039, 0x3FD0790AB4678000,\n 0x3FEA6D01BC2731DD, 0x3FD1AC056801C000,\n 0x3FEA16D3BC3FF18B, 0x3FD2DB11D4FEE000,\n 0x3FE9C2D14967FEAD, 0x3FD406464EC58000,\n 0x3FE970E4F47C9902, 0x3FD52DBE093AF000,\n 0x3FE920FB3982BCF2, 0x3FD651902050D000,\n 0x3FE8D30187F759F1, 0x3FD771D2CDEAF000,\n 0x3FE886E5EBB9F66D, 0x3FD88E9C857D9000,\n 0x3FE83C97B658B994, 0x3FD9A80155E16000,\n 0x3FE7F405FFC61022, 0x3FDABE186ED3D000,\n 0x3FE7AD22181415CA, 0x3FDBD0F2AEA0E000,\n 0x3FE767DCF99EFF8C, 0x3FDCE0A43DBF4000\n]);\n\n// @ts-ignore: decorator\n@lazy @inline const LOG2_DATA_TAB2 = memory.data<u64>([\n // chi , clo\n 0x3FE6200012B90A8E, 0x3C8904AB0644B605,\n 0x3FE66000045734A6, 0x3C61FF9BEA62F7A9,\n 0x3FE69FFFC325F2C5, 0x3C827ECFCB3C90BA,\n 0x3FE6E00038B95A04, 0x3C88FF8856739326,\n 0x3FE71FFFE09994E3, 0x3C8AFD40275F82B1,\n 0x3FE7600015590E10, 0xBC72FD75B4238341,\n 0x3FE7A00012655BD5, 0x3C7808E67C242B76,\n 0x3FE7E0003259E9A6, 0xBC6208E426F622B7,\n 0x3FE81FFFEDB4B2D2, 0xBC8402461EA5C92F,\n 0x3FE860002DFAFCC3, 0x3C6DF7F4A2F29A1F,\n 0x3FE89FFFF78C6B50, 0xBC8E0453094995FD,\n 0x3FE8E00039671566, 0xBC8A04F3BEC77B45,\n 0x3FE91FFFE2BF1745, 0xBC77FA34400E203C,\n 0x3FE95FFFCC5C9FD1, 0xBC76FF8005A0695D,\n 0x3FE9A0003BBA4767, 0x3C70F8C4C4EC7E03,\n 0x3FE9DFFFE7B92DA5, 0x3C8E7FD9478C4602,\n 0x3FEA1FFFD72EFDAF, 0xBC6A0C554DCDAE7E,\n 0x3FEA5FFFDE04FF95, 0x3C867DA98CE9B26B,\n 0x3FEA9FFFCA5E8D2B, 0xBC8284C9B54C13DE,\n 0x3FEADFFFDDAD03EA, 0x3C5812C8EA602E3C,\n 0x3FEB1FFFF10D3D4D, 0xBC8EFADDAD27789C,\n 0x3FEB5FFFCE21165A, 0x3C53CB1719C61237,\n 0x3FEB9FFFD950E674, 0x3C73F7D94194CE00,\n 0x3FEBE000139CA8AF, 0x3C750AC4215D9BC0,\n 0x3FEC20005B46DF99, 0x3C6BEEA653E9C1C9,\n 0x3FEC600040B9F7AE, 0xBC7C079F274A70D6,\n 0x3FECA0006255FD8A, 0xBC7A0B4076E84C1F,\n 0x3FECDFFFD94C095D, 0x3C88F933F99AB5D7,\n 0x3FED1FFFF975D6CF, 0xBC582C08665FE1BE,\n 0x3FED5FFFA2561C93, 0xBC7B04289BD295F3,\n 0x3FED9FFF9D228B0C, 0x3C870251340FA236,\n 0x3FEDE00065BC7E16, 0xBC75011E16A4D80C,\n 0x3FEE200002F64791, 0x3C89802F09EF62E0,\n 0x3FEE600057D7A6D8, 0xBC7E0B75580CF7FA,\n 0x3FEEA00027EDC00C, 0xBC8C848309459811,\n 0x3FEEE0006CF5CB7C, 0xBC8F8027951576F4,\n 0x3FEF2000782B7DCC, 0xBC8F81D97274538F,\n 0x3FEF6000260C450A, 0xBC4071002727FFDC,\n 0x3FEF9FFFE88CD533, 0xBC581BDCE1FDA8B0,\n 0x3FEFDFFFD50F8689, 0x3C87F91ACB918E6E,\n 0x3FF0200004292367, 0x3C9B7FF365324681,\n 0x3FF05FFFE3E3D668, 0x3C86FA08DDAE957B,\n 0x3FF0A0000A85A757, 0xBC57E2DE80D3FB91,\n 0x3FF0E0001A5F3FCC, 0xBC91823305C5F014,\n 0x3FF11FFFF8AFBAF5, 0xBC8BFABB6680BAC2,\n 0x3FF15FFFE54D91AD, 0xBC9D7F121737E7EF,\n 0x3FF1A00011AC36E1, 0x3C9C000A0516F5FF,\n 0x3FF1E00019C84248, 0xBC9082FBE4DA5DA0,\n 0x3FF220000FFE5E6E, 0xBC88FDD04C9CFB43,\n 0x3FF26000269FD891, 0x3C8CFE2A7994D182,\n 0x3FF2A00029A6E6DA, 0xBC700273715E8BC5,\n 0x3FF2DFFFE0293E39, 0x3C9B7C39DAB2A6F9,\n 0x3FF31FFFF7DCF082, 0x3C7DF1336EDC5254,\n 0x3FF35FFFF05A8B60, 0xBC9E03564CCD31EB,\n 0x3FF3A0002E0EAECC, 0x3C75F0E74BD3A477,\n 0x3FF3E000043BB236, 0x3C9C7DCB149D8833,\n 0x3FF4200002D187FF, 0x3C7E08AFCF2D3D28,\n 0x3FF460000D387CB1, 0x3C820837856599A6,\n 0x3FF4A00004569F89, 0xBC89FA5C904FBCD2,\n 0x3FF4E000043543F3, 0xBC781125ED175329,\n 0x3FF51FFFCC027F0F, 0x3C9883D8847754DC,\n 0x3FF55FFFFD87B36F, 0xBC8709E731D02807,\n 0x3FF59FFFF21DF7BA, 0x3C87F79F68727B02,\n 0x3FF5DFFFEBFC3481, 0xBC9180902E30E93E\n]);\n\n// @ts-ignore: decorator\n@inline\nexport function log2_lut(x: f64): f64 {\n const N_MASK = (1 << LOG2_TABLE_BITS) - 1;\n\n const\n LO: u64 = 0x3FEEA4AF00000000, // reinterpret<u64>(1.0 - 0x1.5b51p-5)\n HI: u64 = 0x3FF0B55900000000; // reinterpret<u64>(1.0 + 0x1.6ab2p-5)\n\n const\n InvLn2hi = reinterpret<f64>(0x3FF7154765200000), // 0x1.7154765200000p+0\n InvLn2lo = reinterpret<f64>(0x3DE705FC2EEFA200), // 0x1.705fc2eefa200p-33\n Ox1p52 = reinterpret<f64>(0x4330000000000000); // 0x1p52\n\n const\n B0 = reinterpret<f64>(0xBFE71547652B82FE), // -0x1.71547652b82fep-1\n B1 = reinterpret<f64>(0x3FDEC709DC3A03F7), // 0x1.ec709dc3a03f7p-2\n B2 = reinterpret<f64>(0xBFD71547652B7C3F), // -0x1.71547652b7c3fp-2\n B3 = reinterpret<f64>(0x3FD2776C50F05BE4), // 0x1.2776c50f05be4p-2\n B4 = reinterpret<f64>(0xBFCEC709DD768FE5), // -0x1.ec709dd768fe5p-3\n B5 = reinterpret<f64>(0x3FCA61761EC4E736), // 0x1.a61761ec4e736p-3\n B6 = reinterpret<f64>(0xBFC7153FBC64A79B), // -0x1.7153fbc64a79bp-3\n B7 = reinterpret<f64>(0x3FC484D154F01B4A), // 0x1.484d154f01b4ap-3\n B8 = reinterpret<f64>(0xBFC289E4A72C383C), // -0x1.289e4a72c383cp-3\n B9 = reinterpret<f64>(0x3FC0B32F285AEE66); // 0x1.0b32f285aee66p-3\n\n const\n A0 = reinterpret<f64>(0xBFE71547652B8339), // -0x1.71547652b8339p-1\n A1 = reinterpret<f64>(0x3FDEC709DC3A04BE), // 0x1.ec709dc3a04bep-2\n A2 = reinterpret<f64>(0xBFD7154764702FFB), // -0x1.7154764702ffbp-2\n A3 = reinterpret<f64>(0x3FD2776C50034C48), // 0x1.2776c50034c48p-2\n A4 = reinterpret<f64>(0xBFCEC7B328EA92BC), // -0x1.ec7b328ea92bcp-3\n A5 = reinterpret<f64>(0x3FCA6225E117F92E); // 0x1.a6225e117f92ep-3\n\n let ix = reinterpret<u64>(x);\n if (ix - LO < HI - LO) {\n let r = x - 1.0;\n // #if __FP_FAST_FMA\n // hi = r * InvLn2hi;\n // lo = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -hi);\n // #else\n let rhi = reinterpret<f64>(reinterpret<u64>(r) & 0xFFFFFFFF00000000);\n let rlo = r - rhi;\n let hi = rhi * InvLn2hi;\n let lo = rlo * InvLn2hi + r * InvLn2lo;\n // #endif\n let r2 = r * r; // rounding error: 0x1p-62\n let r4 = r2 * r2;\n // Worst-case error is less than 0.54 ULP (0.55 ULP without fma)\n let p = r2 * (B0 + r * B1);\n let y = hi + p;\n lo += hi - y + p;\n lo += r4 * (B2 + r * B3 + r2 * (B4 + r * B5) +\n r4 * (B6 + r * B7 + r2 * (B8 + r * B9)));\n return y + lo;\n }\n let top = u32(ix >> 48);\n if (top - 0x0010 >= 0x7ff0 - 0x0010) {\n // x < 0x1p-1022 or inf or nan.\n if ((ix << 1) == 0) return -1.0 / (x * x);\n if (ix == 0x7FF0000000000000) return x; // log(inf) == inf\n if ((top & 0x8000) || (top & 0x7FF0) == 0x7FF0) return (x - x) / (x - x);\n // x is subnormal, normalize it.\n ix = reinterpret<u64>(x * Ox1p52);\n ix -= u64(52) << 52;\n }\n\n // x = 2^k z; where z is in range [OFF,2*OFF) and exact.\n // The range is split into N subintervals.\n // The ith subinterval contains z and c is near its center.\n let tmp = ix - 0x3FE6000000000000;\n let i = <usize>((tmp >> (52 - LOG2_TABLE_BITS)) & N_MASK);\n let k = <i64>tmp >> 52;\n let iz = ix - (tmp & 0xFFF0000000000000);\n\n let invc = load<f64>(LOG2_DATA_TAB1 + (i << (1 + alignof<f64>())), 0 << alignof<f64>()); // T[i].invc;\n let logc = load<f64>(LOG2_DATA_TAB1 + (i << (1 + alignof<f64>())), 1 << alignof<f64>()); // T[i].logc;\n let z = reinterpret<f64>(iz);\n let kd = <f64>k;\n\n // log2(x) = log2(z/c) + log2(c) + k.\n // r ~= z/c - 1, |r| < 1/(2*N).\n // #if __FP_FAST_FMA\n // \t// rounding error: 0x1p-55/N.\n // \tr = __builtin_fma(z, invc, -1.0);\n // \tt1 = r * InvLn2hi;\n // \tt2 = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -t1);\n // #else\n // rounding error: 0x1p-55/N + 0x1p-65.\n let chi = load<f64>(LOG2_DATA_TAB2 + (i << (1 + alignof<f64>())), 0 << alignof<f64>()); // T[i].chi;\n let clo = load<f64>(LOG2_DATA_TAB2 + (i << (1 + alignof<f64>())), 1 << alignof<f64>()); // T[i].clo;\n\n let r = (z - chi - clo) * invc;\n let rhi = reinterpret<f64>(reinterpret<u64>(r) & 0xFFFFFFFF00000000);\n let rlo = r - rhi;\n let t1 = rhi * InvLn2hi;\n let t2 = rlo * InvLn2hi + r * InvLn2lo;\n // #endif\n\n // hi + lo = r/ln2 + log2(c) + k\n let t3 = kd + logc;\n let hi = t3 + t1;\n let lo = t3 - hi + t1 + t2;\n\n // log2(r+1) = r/ln2 + r^2*poly(r)\n // Evaluation is optimized assuming superscalar pipelined execution\n let r2 = r * r; // rounding error: 0x1p-54/N^2\n // Worst-case error if |y| > 0x1p-4: 0.547 ULP (0.550 ULP without fma).\n // ~ 0.5 + 2/N/ln2 + abs-poly-error*0x1p56 ULP (+ 0.003 ULP without fma).\n let p = A0 + r * A1 + r2 * (A2 + r * A3) + (r2 * r2) * (A4 + r * A5);\n return lo + r2 * p + hi;\n}\n\n//\n// Lookup data for log. See: https://git.musl-libc.org/cgit/musl/tree/src/math/log.c\n//\n\n// @ts-ignore: decorator\n@inline const LOG_TABLE_BITS = 7;\n\n/* Algorithm:\n\n x = 2^k z\n log(x) = k ln2 + log(c) + log(z/c)\n log(z/c) = poly(z/c - 1)\n\nwhere z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls\ninto the ith one, then table entries are computed as\n\n tab[i].invc = 1/c\n tab[i].logc = (double)log(c)\n tab2[i].chi = (double)c\n tab2[i].clo = (double)(c - (double)c)\n\nwhere c is near the center of the subinterval and is chosen by trying +-2^29\nfloating point invc candidates around 1/center and selecting one for which\n\n 1) the rounding error in 0x1.8p9 + logc is 0,\n 2) the rounding error in z - chi - clo is < 0x1p-66 and\n 3) the rounding error in (double)log(c) is minimized (< 0x1p-66).\n\nNote: 1) ensures that k*ln2hi + logc can be computed without rounding error,\n2) ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to\na single rounding error when there is no fast fma for z*invc - 1, 3) ensures\nthat logc + poly(z/c - 1) has small error, however near x == 1 when\n|log(x)| < 0x1p-4, this is not enough so that is special cased.*/\n\n// @ts-ignore: decorator\n@lazy @inline const LOG_DATA_TAB1 = memory.data<u64>([\n // invc , logc\n 0x3FF734F0C3E0DE9F, 0xBFD7CC7F79E69000,\n 0x3FF713786A2CE91F, 0xBFD76FEEC20D0000,\n 0x3FF6F26008FAB5A0, 0xBFD713E31351E000,\n 0x3FF6D1A61F138C7D, 0xBFD6B85B38287800,\n 0x3FF6B1490BC5B4D1, 0xBFD65D5590807800,\n 0x3FF69147332F0CBA, 0xBFD602D076180000,\n 0x3FF6719F18224223, 0xBFD5A8CA86909000,\n 0x3FF6524F99A51ED9, 0xBFD54F4356035000,\n 0x3FF63356AA8F24C4, 0xBFD4F637C36B4000,\n 0x3FF614B36B9DDC14, 0xBFD49DA7FDA85000,\n 0x3FF5F66452C65C4C, 0xBFD445923989A800,\n 0x3FF5D867B5912C4F, 0xBFD3EDF439B0B800,\n 0x3FF5BABCCB5B90DE, 0xBFD396CE448F7000,\n 0x3FF59D61F2D91A78, 0xBFD3401E17BDA000,\n 0x3FF5805612465687, 0xBFD2E9E2EF468000,\n 0x3FF56397CEE76BD3, 0xBFD2941B3830E000,\n 0x3FF54725E2A77F93, 0xBFD23EC58CDA8800,\n 0x3FF52AFF42064583, 0xBFD1E9E129279000,\n 0x3FF50F22DBB2BDDF, 0xBFD1956D2B48F800,\n 0x3FF4F38F4734DED7, 0xBFD141679AB9F800,\n 0x3FF4D843CFDE2840, 0xBFD0EDD094EF9800,\n 0x3FF4BD3EC078A3C8, 0xBFD09AA518DB1000,\n 0x3FF4A27FC3E0258A, 0xBFD047E65263B800,\n 0x3FF4880524D48434, 0xBFCFEB224586F000,\n 0x3FF46DCE1B192D0B, 0xBFCF474A7517B000,\n 0x3FF453D9D3391854, 0xBFCEA4443D103000,\n 0x3FF43A2744B4845A, 0xBFCE020D44E9B000,\n 0x3FF420B54115F8FB, 0xBFCD60A22977F000,\n 0x3FF40782DA3EF4B1, 0xBFCCC00104959000,\n 0x3FF3EE8F5D57FE8F, 0xBFCC202956891000,\n 0x3FF3D5D9A00B4CE9, 0xBFCB81178D811000,\n 0x3FF3BD60C010C12B, 0xBFCAE2C9CCD3D000,\n 0x3FF3A5242B75DAB8, 0xBFCA45402E129000,\n 0x3FF38D22CD9FD002, 0xBFC9A877681DF000,\n 0x3FF3755BC5847A1C, 0xBFC90C6D69483000,\n 0x3FF35DCE49AD36E2, 0xBFC87120A645C000,\n 0x3FF34679984DD440, 0xBFC7D68FB4143000,\n 0x3FF32F5CCEFFCB24, 0xBFC73CB83C627000,\n 0x3FF3187775A10D49, 0xBFC6A39A9B376000,\n 0x3FF301C8373E3990, 0xBFC60B3154B7A000,\n 0x3FF2EB4EBB95F841, 0xBFC5737D76243000,\n 0x3FF2D50A0219A9D1, 0xBFC4DC7B8FC23000,\n 0x3FF2BEF9A8B7FD2A, 0xBFC4462C51D20000,\n 0x3FF2A91C7A0C1BAB, 0xBFC3B08ABC830000,\n 0x3FF293726014B530, 0xBFC31B996B490000,\n 0x3FF27DFA5757A1F5, 0xBFC2875490A44000,\n 0x3FF268B39B1D3BBF, 0xBFC1F3B9F879A000,\n 0x3FF2539D838FF5BD, 0xBFC160C8252CA000,\n 0x3FF23EB7AAC9083B, 0xBFC0CE7F57F72000,\n 0x3FF22A012BA940B6, 0xBFC03CDC49FEA000,\n 0x3FF2157996CC4132, 0xBFBF57BDBC4B8000,\n 0x3FF201201DD2FC9B, 0xBFBE370896404000,\n 0x3FF1ECF4494D480B, 0xBFBD17983EF94000,\n 0x3FF1D8F5528F6569, 0xBFBBF9674ED8A000,\n 0x3FF1C52311577E7C, 0xBFBADC79202F6000,\n 0x3FF1B17C74CB26E9, 0xBFB9C0C3E7288000,\n 0x3FF19E010C2C1AB6, 0xBFB8A646B372C000,\n 0x3FF18AB07BB670BD, 0xBFB78D01B3AC0000,\n 0x3FF1778A25EFBCB6, 0xBFB674F145380000,\n 0x3FF1648D354C31DA, 0xBFB55E0E6D878000,\n 0x3FF151B990275FDD, 0xBFB4485CDEA1E000,\n 0x3FF13F0EA432D24C, 0xBFB333D94D6AA000,\n 0x3FF12C8B7210F9DA, 0xBFB22079F8C56000,\n 0x3FF11A3028ECB531, 0xBFB10E4698622000,\n 0x3FF107FBDA8434AF, 0xBFAFFA6C6AD20000,\n 0x3FF0F5EE0F4E6BB3, 0xBFADDA8D4A774000,\n 0x3FF0E4065D2A9FCE, 0xBFABBCECE4850000,\n 0x3FF0D244632CA521, 0xBFA9A1894012C000,\n 0x3FF0C0A77CE2981A, 0xBFA788583302C000,\n 0x3FF0AF2F83C636D1, 0xBFA5715E67D68000,\n 0x3FF09DDB98A01339, 0xBFA35C8A49658000,\n 0x3FF08CABAF52E7DF, 0xBFA149E364154000,\n 0x3FF07B9F2F4E28FB, 0xBF9E72C082EB8000,\n 0x3FF06AB58C358F19, 0xBF9A55F152528000,\n 0x3FF059EEA5ECF92C, 0xBF963D62CF818000,\n 0x3FF04949CDD12C90, 0xBF9228FB8CAA0000,\n 0x3FF038C6C6F0ADA9, 0xBF8C317B20F90000,\n 0x3FF02865137932A9, 0xBF8419355DAA0000,\n 0x3FF0182427EA7348, 0xBF781203C2EC0000,\n 0x3FF008040614B195, 0xBF60040979240000,\n 0x3FEFE01FF726FA1A, 0x3F6FEFF384900000,\n 0x3FEFA11CC261EA74, 0x3F87DC41353D0000,\n 0x3FEF6310B081992E, 0x3F93CEA3C4C28000,\n 0x3FEF25F63CEEADCD, 0x3F9B9FC114890000,\n 0x3FEEE9C8039113E7, 0x3FA1B0D8CE110000,\n 0x3FEEAE8078CBB1AB, 0x3FA58A5BD001C000,\n 0x3FEE741AA29D0C9B, 0x3FA95C8340D88000,\n 0x3FEE3A91830A99B5, 0x3FAD276AEF578000,\n 0x3FEE01E009609A56, 0x3FB07598E598C000,\n 0x3FEDCA01E577BB98, 0x3FB253F5E30D2000,\n 0x3FED92F20B7C9103, 0x3FB42EDD8B380000,\n 0x3FED5CAC66FB5CCE, 0x3FB606598757C000,\n 0x3FED272CAA5EDE9D, 0x3FB7DA76356A0000,\n 0x3FECF26E3E6B2CCD, 0x3FB9AB434E1C6000,\n 0x3FECBE6DA2A77902, 0x3FBB78C7BB0D6000,\n 0x3FEC8B266D37086D, 0x3FBD431332E72000,\n 0x3FEC5894BD5D5804, 0x3FBF0A3171DE6000,\n 0x3FEC26B533BB9F8C, 0x3FC067152B914000,\n 0x3FEBF583EEECE73F, 0x3FC147858292B000,\n 0x3FEBC4FD75DB96C1, 0x3FC2266ECDCA3000,\n 0x3FEB951E0C864A28, 0x3FC303D7A6C55000,\n 0x3FEB65E2C5EF3E2C, 0x3FC3DFC33C331000,\n 0x3FEB374867C9888B, 0x3FC4BA366B7A8000,\n 0x3FEB094B211D304A, 0x3FC5933928D1F000,\n 0x3FEADBE885F2EF7E, 0x3FC66ACD2418F000,\n 0x3FEAAF1D31603DA2, 0x3FC740F8EC669000,\n 0x3FEA82E63FD358A7, 0x3FC815C0F51AF000,\n 0x3FEA5740EF09738B, 0x3FC8E92954F68000,\n 0x3FEA2C2A90AB4B27, 0x3FC9BB3602F84000,\n 0x3FEA01A01393F2D1, 0x3FCA8BED1C2C0000,\n 0x3FE9D79F24DB3C1B, 0x3FCB5B515C01D000,\n 0x3FE9AE2505C7B190, 0x3FCC2967CCBCC000,\n 0x3FE9852EF297CE2F, 0x3FCCF635D5486000,\n 0x3FE95CBAEEA44B75, 0x3FCDC1BD3446C000,\n 0x3FE934C69DE74838, 0x3FCE8C01B8CFE000,\n 0x3FE90D4F2F6752E6, 0x3FCF5509C0179000,\n 0x3FE8E6528EFFD79D, 0x3FD00E6C121FB800,\n 0x3FE8BFCE9FCC007C, 0x3FD071B80E93D000,\n 0x3FE899C0DABEC30E, 0x3FD0D46B9E867000,\n 0x3FE87427AA2317FB, 0x3FD13687334BD000,\n 0x3FE84F00ACB39A08, 0x3FD1980D67234800,\n 0x3FE82A49E8653E55, 0x3FD1F8FFE0CC8000,\n 0x3FE8060195F40260, 0x3FD2595FD7636800,\n 0x3FE7E22563E0A329, 0x3FD2B9300914A800,\n 0x3FE7BEB377DCB5AD, 0x3FD3187210436000,\n 0x3FE79BAA679725C2, 0x3FD377266DEC1800,\n 0x3FE77907F2170657, 0x3FD3D54FFBAF3000,\n 0x3FE756CADBD6130C, 0x3FD432EEE32FE000\n]);\n\n// @ts-ignore: decorator\n@lazy @inline const LOG_DATA_TAB2 = memory.data<u64>([\n // chi , clo\n 0x3FE61000014FB66B, 0x3C7E026C91425B3C,\n 0x3FE63000034DB495, 0x3C8DBFEA48005D41,\n 0x3FE650000D94D478, 0x3C8E7FA786D6A5B7,\n 0x3FE67000074E6FAD, 0x3C61FCEA6B54254C,\n 0x3FE68FFFFEDF0FAE, 0xBC7C7E274C590EFD,\n 0x3FE6B0000763C5BC, 0xBC8AC16848DCDA01,\n 0x3FE6D0001E5CC1F6, 0x3C833F1C9D499311,\n 0x3FE6EFFFEB05F63E, 0xBC7E80041AE22D53,\n 0x3FE710000E869780, 0x3C7BFF6671097952,\n 0x3FE72FFFFC67E912, 0x3C8C00E226BD8724,\n 0x3FE74FFFDF81116A, 0xBC6E02916EF101D2,\n 0x3FE770000F679C90, 0xBC67FC71CD549C74,\n 0x3FE78FFFFA7EC835, 0x3C81BEC19EF50483,\n 0x3FE7AFFFFE20C2E6, 0xBC707E1729CC6465,\n 0x3FE7CFFFED3FC900, 0xBC808072087B8B1C,\n 0x3FE7EFFFE9261A76, 0x3C8DC0286D9DF9AE,\n 0x3FE81000049CA3E8, 0x3C897FD251E54C33,\n 0x3FE8300017932C8F, 0xBC8AFEE9B630F381,\n 0x3FE850000633739C, 0x3C89BFBF6B6535BC,\n 0x3FE87000204289C6, 0xBC8BBF65F3117B75,\n 0x3FE88FFFEBF57904, 0xBC89006EA23DCB57,\n 0x3FE8B00022BC04DF, 0xBC7D00DF38E04B0A,\n 0x3FE8CFFFE50C1B8A, 0xBC88007146FF9F05,\n 0x3FE8EFFFFC918E43, 0x3C83817BD07A7038,\n 0x3FE910001EFA5FC7, 0x3C893E9176DFB403,\n 0x3FE9300013467BB9, 0x3C7F804E4B980276,\n 0x3FE94FFFE6EE076F, 0xBC8F7EF0D9FF622E,\n 0x3FE96FFFDE3C12D1, 0xBC7082AA962638BA,\n 0x3FE98FFFF4458A0D, 0xBC87801B9164A8EF,\n 0x3FE9AFFFDD982E3E, 0xBC8740E08A5A9337,\n 0x3FE9CFFFED49FB66, 0x3C3FCE08C19BE000,\n 0x3FE9F00020F19C51, 0xBC8A3FAA27885B0A,\n 0x3FEA10001145B006, 0x3C74FF489958DA56,\n 0x3FEA300007BBF6FA, 0x3C8CBEAB8A2B6D18,\n 0x3FEA500010971D79, 0x3C88FECADD787930,\n 0x3FEA70001DF52E48, 0xBC8F41763DD8ABDB,\n 0x3FEA90001C593352, 0xBC8EBF0284C27612,\n 0x3FEAB0002A4F3E4B, 0xBC69FD043CFF3F5F,\n 0x3FEACFFFD7AE1ED1, 0xBC823EE7129070B4,\n 0x3FEAEFFFEE510478, 0x3C6A063EE00EDEA3,\n 0x3FEB0FFFDB650D5B, 0x3C5A06C8381F0AB9,\n 0x3FEB2FFFFEAACA57, 0xBC79011E74233C1D,\n 0x3FEB4FFFD995BADC, 0xBC79FF1068862A9F,\n 0x3FEB7000249E659C, 0x3C8AFF45D0864F3E,\n 0x3FEB8FFFF9871640, 0x3C7CFE7796C2C3F9,\n 0x3FEBAFFFD204CB4F, 0xBC63FF27EEF22BC4,\n 0x3FEBCFFFD2415C45, 0xBC6CFFB7EE3BEA21,\n 0x3FEBEFFFF86309DF, 0xBC814103972E0B5C,\n 0x3FEC0FFFE1B57653, 0x3C8BC16494B76A19,\n 0x3FEC2FFFF1FA57E3, 0xBC64FEEF8D30C6ED,\n 0x3FEC4FFFDCBFE424, 0xBC843F68BCEC4775,\n 0x3FEC6FFFED54B9F7, 0x3C847EA3F053E0EC,\n 0x3FEC8FFFEB998FD5, 0x3C7383068DF992F1,\n 0x3FECB0002125219A, 0xBC68FD8E64180E04,\n 0x3FECCFFFDD94469C, 0x3C8E7EBE1CC7EA72,\n 0x3FECEFFFEAFDC476, 0x3C8EBE39AD9F88FE,\n 0x3FED1000169AF82B, 0x3C757D91A8B95A71,\n 0x3FED30000D0FF71D, 0x3C89C1906970C7DA,\n 0x3FED4FFFEA790FC4, 0xBC580E37C558FE0C,\n 0x3FED70002EDC87E5, 0xBC7F80D64DC10F44,\n 0x3FED900021DC82AA, 0xBC747C8F94FD5C5C,\n 0x3FEDAFFFD86B0283, 0x3C8C7F1DC521617E,\n 0x3FEDD000296C4739, 0x3C88019EB2FFB153,\n 0x3FEDEFFFE54490F5, 0x3C6E00D2C652CC89,\n 0x3FEE0FFFCDABF694, 0xBC7F8340202D69D2,\n 0x3FEE2FFFDB52C8DD, 0x3C7B00C1CA1B0864,\n 0x3FEE4FFFF24216EF, 0x3C72FFA8B094AB51,\n 0x3FEE6FFFE88A5E11, 0xBC57F673B1EFBE59,\n 0x3FEE9000119EFF0D, 0xBC84808D5E0BC801,\n 0x3FEEAFFFDFA51744, 0x3C780006D54320B5,\n 0x3FEED0001A127FA1, 0xBC5002F860565C92,\n 0x3FEEF00007BABCC4, 0xBC8540445D35E611,\n 0x3FEF0FFFF57A8D02, 0xBC4FFB3139EF9105,\n 0x3FEF30001EE58AC7, 0x3C8A81ACF2731155,\n 0x3FEF4FFFF5823494, 0x3C8A3F41D4D7C743,\n 0x3FEF6FFFFCA94C6B, 0xBC6202F41C987875,\n 0x3FEF8FFFE1F9C441, 0x3C777DD1F477E74B,\n 0x3FEFAFFFD2E0E37E, 0xBC6F01199A7CA331,\n 0x3FEFD0001C77E49E, 0x3C7181EE4BCEACB1,\n 0x3FEFEFFFF7E0C331, 0xBC6E05370170875A,\n 0x3FF00FFFF465606E, 0xBC8A7EAD491C0ADA,\n 0x3FF02FFFF3867A58, 0xBC977F69C3FCB2E0,\n 0x3FF04FFFFDFC0D17, 0x3C97BFFE34CB945B,\n 0x3FF0700003CD4D82, 0x3C820083C0E456CB,\n 0x3FF08FFFF9F2CBE8, 0xBC6DFFDFBE37751A,\n 0x3FF0B000010CDA65, 0xBC913F7FAEE626EB,\n 0x3FF0D00001A4D338, 0x3C807DFA79489FF7,\n 0x3FF0EFFFFADAFDFD, 0xBC77040570D66BC0,\n 0x3FF110000BBAFD96, 0x3C8E80D4846D0B62,\n 0x3FF12FFFFAE5F45D, 0x3C9DBFFA64FD36EF,\n 0x3FF150000DD59AD9, 0x3C9A0077701250AE,\n 0x3FF170000F21559A, 0x3C8DFDF9E2E3DEEE,\n 0x3FF18FFFFC275426, 0x3C910030DC3B7273,\n 0x3FF1B000123D3C59, 0x3C997F7980030188,\n 0x3FF1CFFFF8299EB7, 0xBC65F932AB9F8C67,\n 0x3FF1EFFFF48AD400, 0x3C937FBF9DA75BEB,\n 0x3FF210000C8B86A4, 0x3C9F806B91FD5B22,\n 0x3FF2300003854303, 0x3C93FFC2EB9FBF33,\n 0x3FF24FFFFFBCF684, 0x3C7601E77E2E2E72,\n 0x3FF26FFFF52921D9, 0x3C7FFCBB767F0C61,\n 0x3FF2900014933A3C, 0xBC7202CA3C02412B,\n 0x3FF2B00014556313, 0xBC92808233F21F02,\n 0x3FF2CFFFEBFE523B, 0xBC88FF7E384FDCF2,\n 0x3FF2F0000BB8AD96, 0xBC85FF51503041C5,\n 0x3FF30FFFFB7AE2AF, 0xBC810071885E289D,\n 0x3FF32FFFFEAC5F7F, 0xBC91FF5D3FB7B715,\n 0x3FF350000CA66756, 0x3C957F82228B82BD,\n 0x3FF3700011FBF721, 0x3C8000BAC40DD5CC,\n 0x3FF38FFFF9592FB9, 0xBC943F9D2DB2A751,\n 0x3FF3B00004DDD242, 0x3C857F6B707638E1,\n 0x3FF3CFFFF5B2C957, 0x3C7A023A10BF1231,\n 0x3FF3EFFFEAB0B418, 0x3C987F6D66B152B0,\n 0x3FF410001532AFF4, 0x3C67F8375F198524,\n 0x3FF4300017478B29, 0x3C8301E672DC5143,\n 0x3FF44FFFE795B463, 0x3C89FF69B8B2895A,\n 0x3FF46FFFE80475E0, 0xBC95C0B19BC2F254,\n 0x3FF48FFFEF6FC1E7, 0x3C9B4009F23A2A72,\n 0x3FF4AFFFE5BEA704, 0xBC94FFB7BF0D7D45,\n 0x3FF4D000171027DE, 0xBC99C06471DC6A3D,\n 0x3FF4F0000FF03EE2, 0x3C977F890B85531C,\n 0x3FF5100012DC4BD1, 0x3C6004657166A436,\n 0x3FF530001605277A, 0xBC96BFCECE233209,\n 0x3FF54FFFECDB704C, 0xBC8902720505A1D7,\n 0x3FF56FFFEF5F54A9, 0x3C9BBFE60EC96412,\n 0x3FF5900017E61012, 0x3C887EC581AFEF90,\n 0x3FF5B00003C93E92, 0xBC9F41080ABF0CC0,\n 0x3FF5D0001D4919BC, 0xBC98812AFB254729,\n 0x3FF5EFFFE7B87A89, 0xBC947EB780ED6904\n]);\n\n// @ts-ignore: decorator\n@inline\nexport function log_lut(x: f64): f64 {\n const N_MASK = (1 << LOG_TABLE_BITS) - 1;\n\n const\n B0 = reinterpret<f64>(0xBFE0000000000000), // -0x1p-1\n B1 = reinterpret<f64>(0x3FD5555555555577), // 0x1.5555555555577p-2\n B2 = reinterpret<f64>(0xBFCFFFFFFFFFFDCB), // -0x1.ffffffffffdcbp-3\n B3 = reinterpret<f64>(0x3FC999999995DD0C), // 0x1.999999995dd0cp-3\n B4 = reinterpret<f64>(0xBFC55555556745A7), // -0x1.55555556745a7p-3\n B5 = reinterpret<f64>(0x3FC24924A344DE30), // 0x1.24924a344de3p-3\n B6 = reinterpret<f64>(0xBFBFFFFFA4423D65), // -0x1.fffffa4423d65p-4\n B7 = reinterpret<f64>(0x3FBC7184282AD6CA), // 0x1.c7184282ad6cap-4\n B8 = reinterpret<f64>(0xBFB999EB43B068FF), // -0x1.999eb43b068ffp-4\n B9 = reinterpret<f64>(0x3FB78182F7AFD085), // 0x1.78182f7afd085p-4\n B10 = reinterpret<f64>(0xBFB5521375D145CD); // -0x1.5521375d145cdp-4\n\n const\n A0 = reinterpret<f64>(0xBFE0000000000001), // -0x1.0000000000001p-1\n A1 = reinterpret<f64>(0x3FD555555551305B), // 0x1.555555551305bp-2\n A2 = reinterpret<f64>(0xBFCFFFFFFFEB4590), // -0x1.fffffffeb459p-3\n A3 = reinterpret<f64>(0x3FC999B324F10111), // 0x1.999b324f10111p-3\n A4 = reinterpret<f64>(0xBFC55575E506C89F); // -0x1.55575e506c89fp-3\n\n const\n LO: u64 = 0x3FEE000000000000,\n HI: u64 = 0x3FF1090000000000;\n\n const\n Ln2hi = reinterpret<f64>(0x3FE62E42FEFA3800), // 0x1.62e42fefa3800p-1\n Ln2lo = reinterpret<f64>(0x3D2EF35793C76730), // 0x1.ef35793c76730p-45\n Ox1p27 = reinterpret<f64>(0x41A0000000000000), // 0x1p27\n Ox1p52 = reinterpret<f64>(0x4330000000000000); // 0x1p52\n\n let ix = reinterpret<u64>(x);\n if (ix - LO < HI - LO) {\n let r = x - 1.0;\n let r2 = r * r;\n let r3 = r2 * r;\n let y =\n r3 * (B1 + r * B2 + r2 * B3 +\n r3 * (B4 + r * B5 + r2 * B6 +\n r3 * (B7 + r * B8 + r2 * B9 + r3 * B10)));\n // Worst-case error is around 0.507 ULP\n let w = r * Ox1p27;\n let rhi = r + w - w;\n let rlo = r - rhi;\n w = rhi * rhi * B0; // B[0] == -0.5\n let hi = r + w;\n let lo = r - hi + w;\n lo += B0 * rlo * (rhi + r);\n return y + lo + hi;\n }\n let top = u32(ix >> 48);\n if (top - 0x0010 >= 0x7FF0 - 0x0010) {\n // x < 0x1p-1022 or inf or nan\n if ((ix << 1) == 0) return -1.0 / (x * x);\n if (ix == reinterpret<u64>(Infinity)) return x; // log(inf) == inf\n if ((top & 0x8000) || (top & 0x7FF0) == 0x7FF0) return (x - x) / (x - x);\n // x is subnormal, normalize it\n ix = reinterpret<u64>(x * Ox1p52);\n ix -= u64(52) << 52;\n }\n\n // x = 2^k z; where z is in range [OFF,2*OFF) and exact.\n // The range is split into N subintervals.\n // The ith subinterval contains z and c is near its center.\n let tmp = ix - 0x3FE6000000000000;\n let i = <usize>((tmp >> (52 - LOG_TABLE_BITS)) & N_MASK);\n let k = <i64>tmp >> 52;\n let iz = ix - (tmp & (u64(0xFFF) << 52));\n\n let invc = load<f64>(LOG_DATA_TAB1 + (i << (1 + alignof<f64>())), 0 << alignof<f64>()); // T[i].invc;\n let logc = load<f64>(LOG_DATA_TAB1 + (i << (1 + alignof<f64>())), 1 << alignof<f64>()); // T[i].logc;\n let z = reinterpret<f64>(iz);\n\n // log(x) = log1p(z/c-1) + log(c) + k*Ln2.\n // r ~= z/c - 1, |r| < 1/(2*N)\n // #if __FP_FAST_FMA\n // \t// rounding error: 0x1p-55/N\n // \tr = __builtin_fma(z, invc, -1.0);\n // #else\n // rounding error: 0x1p-55/N + 0x1p-66\n const chi = load<f64>(LOG_DATA_TAB2 + (i << (1 + alignof<f64>())), 0 << alignof<f64>()); // T2[i].chi\n const clo = load<f64>(LOG_DATA_TAB2 + (i << (1 + alignof<f64>())), 1 << alignof<f64>()); // T2[i].clo\n let r = (z - chi - clo) * invc;\n // #endif\n let kd = <f64>k;\n\n // hi + lo = r + log(c) + k*Ln2\n let w = kd * Ln2hi + logc;\n let hi = w + r;\n let lo = w - hi + r + kd * Ln2lo;\n\n // log(x) = lo + (log1p(r) - r) + hi\n let r2 = r * r; // rounding error: 0x1p-54/N^2\n // Worst case error if |y| > 0x1p-5:\n // 0.5 + 4.13/N + abs-poly-error*2^57 ULP (+ 0.002 ULP without fma)\n // Worst case error if |y| > 0x1p-4:\n // 0.5 + 2.06/N + abs-poly-error*2^56 ULP (+ 0.001 ULP without fma).\n return lo + r2 * A0 + r * r2 * (A1 + r * A2 + r2 * (A3 + r * A4)) + hi;\n}\n\n//\n// Lookup data for pow. See: https://git.musl-libc.org/cgit/musl/tree/src/math/pow.c\n//\n\n// @ts-ignore: decorator\n@inline const POW_LOG_TABLE_BITS = 7;\n\n/* Algorithm:\n\n x = 2^k z\n log(x) = k ln2 + log(c) + log(z/c)\n log(z/c) = poly(z/c - 1)\n\nwhere z is in [0x1.69555p-1; 0x1.69555p0] which is split into N subintervals\nand z falls into the ith one, then table entries are computed as\n\n tab[i].invc = 1/c\n tab[i].logc = round(0x1p43*log(c))/0x1p43\n tab[i].logctail = (double)(log(c) - logc)\n\nwhere c is chosen near the center of the subinterval such that 1/c has only a\nfew precision bits so z/c - 1 is exactly representible as double:\n\n 1/c = center < 1 ? round(N/center)/N : round(2*N/center)/N/2\n\nNote: |z/c - 1| < 1/N for the chosen c, |log(c) - logc - logctail| < 0x1p-97,\nthe last few bits of logc are rounded away so k*ln2hi + logc has no rounding\nerror and the interval for z is selected such that near x == 1, where log(x)\nis tiny, large cancellation error is avoided in logc + poly(z/c - 1). */\n\n// @ts-ignore: decorator\n@lazy @inline const POW_LOG_DATA_TAB = memory.data<u64>([\n // invc ,pad, logc , logctail\n 0x3FF6A00000000000, 0, 0xBFD62C82F2B9C800, 0x3CFAB42428375680,\n 0x3FF6800000000000, 0, 0xBFD5D1BDBF580800, 0xBD1CA508D8E0F720,\n 0x3FF6600000000000, 0, 0xBFD5767717455800, 0xBD2362A4D5B6506D,\n 0x3FF6400000000000, 0, 0xBFD51AAD872DF800, 0xBCE684E49EB067D5,\n 0x3FF6200000000000, 0, 0xBFD4BE5F95777800, 0xBD041B6993293EE0,\n 0x3FF6000000000000, 0, 0xBFD4618BC21C6000, 0x3D13D82F484C84CC,\n 0x3FF5E00000000000, 0, 0xBFD404308686A800, 0x3CDC42F3ED820B3A,\n 0x3FF5C00000000000, 0, 0xBFD3A64C55694800, 0x3D20B1C686519460,\n 0x3FF5A00000000000, 0, 0xBFD347DD9A988000, 0x3D25594DD4C58092,\n 0x3FF5800000000000, 0, 0xBFD2E8E2BAE12000, 0x3D267B1E99B72BD8,\n 0x3FF5600000000000, 0, 0xBFD2895A13DE8800, 0x3D15CA14B6CFB03F,\n 0x3FF5600000000000, 0, 0xBFD2895A13DE8800, 0x3D15CA14B6CFB03F,\n 0x3FF5400000000000, 0, 0xBFD22941FBCF7800, 0xBD165A242853DA76,\n 0x3FF5200000000000, 0, 0xBFD1C898C1699800, 0xBD1FAFBC68E75404,\n 0x3FF5000000000000, 0, 0xBFD1675CABABA800, 0x3D1F1FC63382A8F0,\n 0x3FF4E00000000000, 0, 0xBFD1058BF9AE4800, 0xBD26A8C4FD055A66,\n 0x3FF4C00000000000, 0, 0xBFD0A324E2739000, 0xBD0C6BEE7EF4030E,\n 0x3FF4A00000000000, 0, 0xBFD0402594B4D000, 0xBCF036B89EF42D7F,\n 0x3FF4A00000000000, 0, 0xBFD0402594B4D000, 0xBCF036B89EF42D7F,\n 0x3FF4800000000000, 0, 0xBFCFB9186D5E4000, 0x3D0D572AAB993C87,\n 0x3FF4600000000000, 0, 0xBFCEF0ADCBDC6000, 0x3D2B26B79C86AF24,\n 0x3FF4400000000000, 0, 0xBFCE27076E2AF000, 0xBD172F4F543FFF10,\n 0x3FF4200000000000, 0, 0xBFCD5C216B4FC000, 0x3D21BA91BBCA681B,\n 0x3FF4000000000000, 0, 0xBFCC8FF7C79AA000, 0x3D27794F689F8434,\n 0x3FF4000000000000, 0, 0xBFCC8FF7C79AA000, 0x3D27794F689F8434,\n 0x3FF3E00000000000, 0, 0xBFCBC286742D9000, 0x3D194EB0318BB78F,\n 0x3FF3C00000000000, 0, 0xBFCAF3C94E80C000, 0x3CBA4E633FCD9066,\n 0x3FF3A00000000000, 0, 0xBFCA23BC1FE2B000, 0xBD258C64DC46C1EA,\n 0x3FF3A00000000000, 0, 0xBFCA23BC1FE2B000, 0xBD258C64DC46C1EA,\n 0x3FF3800000000000, 0, 0xBFC9525A9CF45000, 0xBD2AD1D904C1D4E3,\n 0x3FF3600000000000, 0, 0xBFC87FA06520D000, 0x3D2BBDBF7FDBFA09,\n 0x3FF3400000000000, 0, 0xBFC7AB890210E000, 0x3D2BDB9072534A58,\n 0x3FF3400000000000, 0, 0xBFC7AB890210E000, 0x3D2BDB9072534A58,\n 0x3FF3200000000000, 0, 0xBFC6D60FE719D000, 0xBD10E46AA3B2E266,\n 0x3FF3000000000000, 0, 0xBFC5FF3070A79000, 0xBD1E9E439F105039,\n 0x3FF3000000000000, 0, 0xBFC5FF3070A79000, 0xBD1E9E439F105039,\n 0x3FF2E00000000000, 0, 0xBFC526E5E3A1B000, 0xBD20DE8B90075B8F,\n 0x3FF2C00000000000, 0, 0xBFC44D2B6CCB8000, 0x3D170CC16135783C,\n 0x3FF2C00000000000, 0, 0xBFC44D2B6CCB8000, 0x3D170CC16135783C,\n 0x3FF2A00000000000, 0, 0xBFC371FC201E9000, 0x3CF178864D27543A,\n 0x3FF2800000000000, 0, 0xBFC29552F81FF000, 0xBD248D301771C408,\n 0x3FF2600000000000, 0, 0xBFC1B72AD52F6000, 0xBD2E80A41811A396,\n 0x3FF2600000000000, 0, 0xBFC1B72AD52F6000, 0xBD2E80A41811A396,\n 0x3FF2400000000000, 0, 0xBFC0D77E7CD09000, 0x3D0A699688E85BF4,\n 0x3FF2400000000000, 0, 0xBFC0D77E7CD09000, 0x3D0A699688E85BF4,\n 0x3FF2200000000000, 0, 0xBFBFEC9131DBE000, 0xBD2575545CA333F2,\n 0x3FF2000000000000, 0, 0xBFBE27076E2B0000, 0x3D2A342C2AF0003C,\n 0x3FF2000000000000, 0, 0xBFBE27076E2B0000, 0x3D2A342C2AF0003C,\n 0x3FF1E00000000000, 0, 0xBFBC5E548F5BC000, 0xBD1D0C57585FBE06,\n 0x3FF1C00000000000, 0, 0xBFBA926D3A4AE000, 0x3D253935E85BAAC8,\n 0x3FF1C00000000000, 0, 0xBFBA926D3A4AE000, 0x3D253935E85BAAC8,\n 0x3FF1A00000000000, 0, 0xBFB8C345D631A000, 0x3D137C294D2F5668,\n 0x3FF1A00000000000, 0, 0xBFB8C345D631A000, 0x3D137C294D2F5668,\n 0x3FF1800000000000, 0, 0xBFB6F0D28AE56000, 0xBD269737C93373DA,\n 0x3FF1600000000000, 0, 0xBFB51B073F062000, 0x3D1F025B61C65E57,\n 0x3FF1600000000000, 0, 0xBFB51B073F062000, 0x3D1F025B61C65E57,\n 0x3FF1400000000000, 0, 0xBFB341D7961BE000, 0x3D2C5EDACCF913DF,\n 0x3FF1400000000000, 0, 0xBFB341D7961BE000, 0x3D2C5EDACCF913DF,\n 0x3FF1200000000000, 0, 0xBFB16536EEA38000, 0x3D147C5E768FA309,\n 0x3FF1000000000000, 0, 0xBFAF0A30C0118000, 0x3D2D599E83368E91,\n 0x3FF1000000000000, 0, 0xBFAF0A30C0118000, 0x3D2D599E83368E91,\n 0x3FF0E00000000000, 0, 0xBFAB42DD71198000, 0x3D1C827AE5D6704C,\n 0x3FF0E00000000000, 0, 0xBFAB42DD71198000, 0x3D1C827AE5D6704C,\n 0x3FF0C00000000000, 0, 0xBFA77458F632C000, 0xBD2CFC4634F2A1EE,\n 0x3FF0C00000000000, 0, 0xBFA77458F632C000, 0xBD2CFC4634F2A1EE,\n 0x3FF0A00000000000, 0, 0xBFA39E87B9FEC000, 0x3CF502B7F526FEAA,\n 0x3FF0A00000000000, 0, 0xBFA39E87B9FEC000, 0x3CF502B7F526FEAA,\n 0x3FF0800000000000, 0, 0xBF9F829B0E780000, 0xBD2980267C7E09E4,\n 0x3FF0800000000000, 0, 0xBF9F829B0E780000, 0xBD2980267C7E09E4,\n 0x3FF0600000000000, 0, 0xBF97B91B07D58000, 0xBD288D5493FAA639,\n 0x3FF0400000000000, 0, 0xBF8FC0A8B0FC0000, 0xBCDF1E7CF6D3A69C,\n 0x3FF0400000000000, 0, 0xBF8FC0A8B0FC0000, 0xBCDF1E7CF6D3A69C,\n 0x3FF0200000000000, 0, 0xBF7FE02A6B100000, 0xBD19E23F0DDA40E4,\n 0x3FF0200000000000, 0, 0xBF7FE02A6B100000, 0xBD19E23F0DDA40E4,\n 0x3FF0000000000000, 0, 0, 0,\n 0x3FF0000000000000, 0, 0, 0,\n 0x3FEFC00000000000, 0, 0x3F80101575890000, 0xBD10C76B999D2BE8,\n 0x3FEF800000000000, 0, 0x3F90205658938000, 0xBD23DC5B06E2F7D2,\n 0x3FEF400000000000, 0, 0x3F98492528C90000, 0xBD2AA0BA325A0C34,\n 0x3FEF000000000000, 0, 0x3FA0415D89E74000, 0x3D0111C05CF1D753,\n 0x3FEEC00000000000, 0, 0x3FA466AED42E0000, 0xBD2C167375BDFD28,\n 0x3FEE800000000000, 0, 0x3FA894AA149FC000, 0xBD197995D05A267D,\n 0x3FEE400000000000, 0, 0x3FACCB73CDDDC000, 0xBD1A68F247D82807,\n 0x3FEE200000000000, 0, 0x3FAEEA31C006C000, 0xBD0E113E4FC93B7B,\n 0x3FEDE00000000000, 0, 0x3FB1973BD1466000, 0xBD25325D560D9E9B,\n 0x3FEDA00000000000, 0, 0x3FB3BDF5A7D1E000, 0x3D2CC85EA5DB4ED7,\n 0x3FED600000000000, 0, 0x3FB5E95A4D97A000, 0xBD2C69063C5D1D1E,\n 0x3FED400000000000, 0, 0x3FB700D30AEAC000, 0x3CEC1E8DA99DED32,\n 0x3FED000000000000, 0, 0x3FB9335E5D594000, 0x3D23115C3ABD47DA,\n 0x3FECC00000000000, 0, 0x3FBB6AC88DAD6000, 0xBD1390802BF768E5,\n 0x3FECA00000000000, 0, 0x3FBC885801BC4000, 0x3D2646D1C65AACD3,\n 0x3FEC600000000000, 0, 0x3FBEC739830A2000, 0xBD2DC068AFE645E0,\n 0x3FEC400000000000, 0, 0x3FBFE89139DBE000, 0xBD2534D64FA10AFD,\n 0x3FEC000000000000, 0, 0x3FC1178E8227E000, 0x3D21EF78CE2D07F2,\n 0x3FEBE00000000000, 0, 0x3FC1AA2B7E23F000, 0x3D2CA78E44389934,\n 0x3FEBA00000000000, 0, 0x3FC2D1610C868000, 0x3D039D6CCB81B4A1,\n 0x3FEB800000000000, 0, 0x3FC365FCB0159000, 0x3CC62FA8234B7289,\n 0x3FEB400000000000, 0, 0x3FC4913D8333B000, 0x3D25837954FDB678,\n 0x3FEB200000000000, 0, 0x3FC527E5E4A1B000, 0x3D2633E8E5697DC7,\n 0x3FEAE00000000000, 0, 0x3FC6574EBE8C1000, 0x3D19CF8B2C3C2E78,\n 0x3FEAC00000000000, 0, 0x3FC6F0128B757000, 0xBD25118DE59C21E1,\n 0x3FEAA00000000000, 0, 0x3FC7898D85445000, 0xBD1C661070914305,\n 0x3FEA600000000000, 0, 0x3FC8BEAFEB390000, 0xBD073D54AAE92CD1,\n 0x3FEA400000000000, 0, 0x3FC95A5ADCF70000, 0x3D07F22858A0FF6F,\n 0x3FEA000000000000, 0, 0x3FCA93ED3C8AE000, 0xBD28724350562169,\n 0x3FE9E00000000000, 0, 0x3FCB31D8575BD000, 0xBD0C358D4EACE1AA,\n 0x3FE9C00000000000, 0, 0x3FCBD087383BE000, 0xBD2D4BC4595412B6,\n 0x3FE9A00000000000, 0, 0x3FCC6FFBC6F01000, 0xBCF1EC72C5962BD2,\n 0x3FE9600000000000, 0, 0x3FCDB13DB0D49000, 0xBD2AFF2AF715B035,\n 0x3FE9400000000000, 0, 0x3FCE530EFFE71000, 0x3CC212276041F430,\n 0x3FE9200000000000, 0, 0x3FCEF5ADE4DD0000, 0xBCCA211565BB8E11,\n 0x3FE9000000000000, 0, 0x3FCF991C6CB3B000, 0x3D1BCBECCA0CDF30,\n 0x3FE8C00000000000, 0, 0x3FD07138604D5800, 0x3CF89CDB16ED4E91,\n 0x3FE8A00000000000, 0, 0x3FD0C42D67616000, 0x3D27188B163CEAE9,\n 0x3FE8800000000000, 0, 0x3FD1178E8227E800, 0xBD2C210E63A5F01C,\n 0x3FE8600000000000, 0, 0x3FD16B5CCBACF800, 0x3D2B9ACDF7A51681,\n 0x3FE8400000000000, 0, 0x3FD1BF99635A6800, 0x3D2CA6ED5147BDB7,\n 0x3FE8200000000000, 0, 0x3FD214456D0EB800, 0x3D0A87DEBA46BAEA,\n 0x3FE7E00000000000, 0, 0x3FD2BEF07CDC9000, 0x3D2A9CFA4A5004F4,\n 0x3FE7C00000000000, 0, 0x3FD314F1E1D36000, 0xBD28E27AD3213CB8,\n 0x3FE7A00000000000, 0, 0x3FD36B6776BE1000, 0x3D116ECDB0F177C8,\n 0x3FE7800000000000, 0, 0x3FD3C25277333000, 0x3D183B54B606BD5C,\n 0x3FE7600000000000, 0, 0x3FD419B423D5E800, 0x3D08E436EC90E09D,\n 0x3FE7400000000000, 0, 0x3FD4718DC271C800, 0xBD2F27CE0967D675,\n 0x3FE7200000000000, 0, 0x3FD4C9E09E173000, 0xBD2E20891B0AD8A4,\n 0x3FE7000000000000, 0, 0x3FD522AE0738A000, 0x3D2EBE708164C759,\n 0x3FE6E00000000000, 0, 0x3FD57BF753C8D000, 0x3D1FADEDEE5D40EF,\n 0x3FE6C00000000000, 0, 0x3FD5D5BDDF596000, 0xBD0A0B2A08A465DC\n]);\n\n// Returns 0 if not int, 1 if odd int, 2 if even int. The argument is\n// the bit representation of a non-zero finite floating-point value.\n// @ts-ignore: decorator\n@inline\nfunction checkint(iy: u64): i32 {\n let e = iy >> 52 & 0x7FF;\n if (e < 0x3FF ) return 0;\n if (e > 0x3FF + 52) return 2;\n e = u64(1) << (0x3FF + 52 - e);\n if (iy & (e - 1)) return 0;\n if (iy & e ) return 1;\n return 2;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction xflow(sign: u32, y: f64): f64 {\n return select(-y, y, sign) * y;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction uflow(sign: u32): f64 {\n return xflow(sign, reinterpret<f64>(0x1000000000000000)); // 0x1p-767\n}\n\n// @ts-ignore: decorator\n@inline\nfunction oflow(sign: u32): f64 {\n return xflow(sign, reinterpret<f64>(0x7000000000000000)); // 0x1p769\n}\n\n// Returns 1 if input is the bit representation of 0, infinity or nan.\n// @ts-ignore: decorator\n@inline\nfunction zeroinfnan(u: u64): bool {\n return (u << 1) - 1 >= 0xFFE0000000000000 - 1;\n}\n\n// @ts-ignore: decorator\n@lazy let log_tail: f64 = 0;\n\n// Compute y+TAIL = log(x) where the rounded result is y and TAIL has about\n// additional 15 bits precision. IX is the bit representation of x, but\n// normalized in the subnormal range using the sign bit for the exponent.\n// @ts-ignore: decorator\n@inline\nfunction log_inline(ix: u64): f64 {\n const N = 1 << POW_LOG_TABLE_BITS;\n const N_MASK = N - 1;\n\n const\n Ln2hi = reinterpret<f64>(0x3FE62E42FEFA3800),\n Ln2lo = reinterpret<f64>(0x3D2EF35793C76730);\n\n const\n A0 = reinterpret<f64>(0xBFE0000000000000),\n A1 = reinterpret<f64>(0xBFE5555555555560),\n A2 = reinterpret<f64>(0x3FE0000000000006),\n A3 = reinterpret<f64>(0x3FE999999959554E),\n A4 = reinterpret<f64>(0xBFE555555529A47A),\n A5 = reinterpret<f64>(0xBFF2495B9B4845E9),\n A6 = reinterpret<f64>(0x3FF0002B8B263FC3);\n\n // x = 2^k z; where z is in range [OFF,2*OFF) and exact.\n // The range is split into N subintervals.\n // The ith subinterval contains z and c is near its center.\n let tmp = ix - 0x3fE6955500000000;\n let i = usize((tmp >> (52 - POW_LOG_TABLE_BITS)) & N_MASK);\n let k = <i64>tmp >> 52;\n let iz = ix - (tmp & u64(0xFFF) << 52);\n let z = reinterpret<f64>(iz);\n let kd = <f64>k;\n\n // log(x) = k*Ln2 + log(c) + log1p(z/c-1).\n let invc = load<f64>(POW_LOG_DATA_TAB + (i << (2 + alignof<f64>())), 0 << alignof<f64>()); // tab[i].invc\n let logc = load<f64>(POW_LOG_DATA_TAB + (i << (2 + alignof<f64>())), 2 << alignof<f64>()); // tab[i].logc\n let logctail = load<f64>(POW_LOG_DATA_TAB + (i << (2 + alignof<f64>())), 3 << alignof<f64>()); // tab[i].logctail\n\n // Note: 1/c is j/N or j/N/2 where j is an integer in [N,2N) and\n // |z/c - 1| < 1/N, so r = z/c - 1 is exactly representible.\n // Split z such that rhi, rlo and rhi*rhi are exact and |rlo| <= |r|.\n let zhi = reinterpret<f64>((iz + u64(0x80000000)) & 0xFFFFFFFF00000000);\n let zlo = z - zhi;\n let rhi = zhi * invc - 1.0;\n let rlo = zlo * invc;\n let r = rhi + rlo;\n\n // k * Ln2 + log(c) + r.\n let t1 = kd * Ln2hi + logc;\n let t2 = t1 + r;\n let lo1 = kd * Ln2lo + logctail;\n let lo2 = t1 - t2 + r;\n\n // Evaluation is optimized assuming superscalar pipelined execution.\n let ar = A0 * r; // A[0] = -0.5\n let ar2 = r * ar;\n let ar3 = r * ar2;\n // k * Ln2 + log(c) + r + A[0] * r * r.\n let arhi = A0 * rhi;\n let arhi2 = rhi * arhi;\n let hi = t2 + arhi2;\n let lo3 = rlo * (ar + arhi);\n let lo4 = t2 - hi + arhi2;\n\n // p = log1p(r) - r - A[0] * r * r.\n let p = ar3 * (A1 + r * A2 + ar2 * (A3 + r * A4 + ar2 * (A5 + r * A6)));\n let lo = lo1 + lo2 + lo3 + lo4 + p;\n let y = hi + lo;\n log_tail = hi - y + lo;\n\n return y;\n}\n\n// @ts-ignore: decorator\n@inline const SIGN_BIAS = 0x800 << EXP_TABLE_BITS;\n\n// Computes sign*exp(x+xtail) where |xtail| < 2^-8/N and |xtail| <= |x|.\n// The sign_bias argument is SIGN_BIAS or 0 and sets the sign to -1 or 1.\n// @ts-ignore: decorator\n@inline\nfunction exp_inline(x: f64, xtail: f64, sign_bias: u32): f64 {\n const N = 1 << EXP_TABLE_BITS;\n const N_MASK = N - 1;\n\n const\n InvLn2N = reinterpret<f64>(0x3FF71547652B82FE) * N, // 0x1.71547652b82fep0\n NegLn2hiN = reinterpret<f64>(0xBF762E42FEFA0000), // -0x1.62e42fefa0000p-8\n NegLn2loN = reinterpret<f64>(0xBD0CF79ABC9E3B3A), // -0x1.cf79abc9e3b3ap-47\n shift = reinterpret<f64>(0x4338000000000000); // 0x1.8p52\n\n const\n C2 = reinterpret<f64>(0x3FDFFFFFFFFFFDBD), // __exp_data.poly[0] (0x1.ffffffffffdbdp-2)\n C3 = reinterpret<f64>(0x3FC555555555543C), // __exp_data.poly[1] (0x1.555555555543cp-3)\n C4 = reinterpret<f64>(0x3FA55555CF172B91), // __exp_data.poly[2] (0x1.55555cf172b91p-5)\n C5 = reinterpret<f64>(0x3F81111167A4D017); // __exp_data.poly[3] (0x1.1111167a4d017p-7)\n\n let abstop: u32;\n let ki: u64, top: u64, sbits: u64;\n let idx: usize;\n // double_t for better performance on targets with FLT_EVAL_METHOD==2.\n let kd: f64, z: f64, r: f64, r2: f64, scale: f64, tail: f64, tmp: f64;\n\n let ux = reinterpret<u64>(x);\n abstop = u32(ux >> 52) & 0x7FF;\n if (abstop - 0x3C9 >= 0x03F) {\n if (abstop - 0x3C9 >= 0x80000000) {\n // Avoid spurious underflow for tiny x.\n // Note: 0 is common input.\n return select(-1.0, 1.0, sign_bias);\n }\n if (abstop >= 0x409) { // top12(1024.0)\n // Note: inf and nan are already handled.\n return <i64>ux < 0\n ? uflow(sign_bias)\n : oflow(sign_bias);\n }\n // Large x is special cased below.\n abstop = 0;\n }\n\n // exp(x) = 2^(k/N) * exp(r), with exp(r) in [2^(-1/2N),2^(1/2N)].\n // x = ln2/N*k + r, with int k and r in [-ln2/2N, ln2/2N].\n z = InvLn2N * x;\n\n // #if TOINT_INTRINSICS\n // kd = roundtoint(z);\n // ki = converttoint(z);\n // #elif EXP_USE_TOINT_NARROW\n // // z - kd is in [-0.5-2^-16, 0.5] in all rounding modes.\n // kd = eval_as_double(z + shift);\n // ki = asuint64(kd) >> 16;\n // kd = (double_t)(int32_t)ki;\n // #else\n // z - kd is in [-1, 1] in non-nearest rounding modes\n kd = z + shift;\n ki = reinterpret<u64>(kd);\n kd -= shift;\n // #endif\n r = x + kd * NegLn2hiN + kd * NegLn2loN;\n // The code assumes 2^-200 < |xtail| < 2^-8/N\n r += xtail;\n // 2^(k/N) ~= scale * (1 + tail)\n idx = usize((ki & N_MASK) << 1);\n top = (ki + sign_bias) << (52 - EXP_TABLE_BITS);\n\n tail = reinterpret<f64>(load<u64>(EXP_DATA_TAB + (idx << alignof<u64>())));\n // This is only a valid scale when -1023*N < k < 1024*N\n sbits = load<u64>(EXP_DATA_TAB + (idx << alignof<u64>()), 1 << alignof<u64>()) + top;\n // exp(x) = 2^(k/N) * exp(r) ~= scale + scale * (tail + exp(r) - 1).\n // Evaluation is optimized assuming superscalar pipelined execution.\n r2 = r * r;\n // Without fma the worst case error is 0.25/N ulp larger.\n // Worst case error is less than 0.5+1.11/N+(abs poly error * 2^53) ulp\n tmp = tail + r + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);\n if (abstop == 0) return specialcase(tmp, sbits, ki);\n scale = reinterpret<f64>(sbits);\n // Note: tmp == 0 or |tmp| > 2^-200 and scale > 2^-739, so there\n // is no spurious underflow here even without fma.\n return scale + scale * tmp;\n}\n\n// @ts-ignore: decorator\n@inline\nexport function pow_lut(x: f64, y: f64): f64 {\n const Ox1p52 = reinterpret<f64>(0x4330000000000000); // 0x1p52\n\n let sign_bias: u32 = 0;\n let ix = reinterpret<u64>(x);\n let iy = reinterpret<u64>(y);\n let topx = ix >> 52;\n let topy = iy >> 52;\n\n if (topx - 0x001 >= 0x7FF - 0x001 || (topy & 0x7FF) - 0x3BE >= 0x43e - 0x3BE) {\n // Note: if |y| > 1075 * ln2 * 2^53 ~= 0x1.749p62 then pow(x,y) = inf/0\n // and if |y| < 2^-54 / 1075 ~= 0x1.e7b6p-65 then pow(x,y) = +-1.\n // Special cases: (x < 0x1p-126 or inf or nan) or\n // (|y| < 0x1p-65 or |y| >= 0x1p63 or nan).\n if (zeroinfnan(iy)) {\n if ((iy << 1) == 0) return 1.0;\n if (ix == 0x3FF0000000000000) return NaN; // original: 1.0\n if ((ix << 1) > 0xFFE0000000000000 || (iy << 1) > 0xFFE0000000000000) return x + y;\n if ((ix << 1) == 0x7FE0000000000000) return NaN; // original: 1.0\n if (((ix << 1) < 0x7FE0000000000000) == !(iy >> 63)) return 0; // |x|<1 && y==inf or |x|>1 && y==-inf.\n return y * y;\n }\n if (zeroinfnan(ix)) {\n let x2 = x * x;\n if (i32(ix >> 63) && checkint(iy) == 1) x2 = -x2;\n return <i64>iy < 0 ? 1 / x2 : x2;\n }\n // Here x and y are non-zero finite\n if (<i64>ix < 0) {\n // Finite x < 0\n let yint = checkint(iy);\n if (yint == 0) return (x - x) / (x - x);\n if (yint == 1) sign_bias = SIGN_BIAS;\n ix &= 0x7FFFFFFFFFFFFFFF;\n topx &= 0x7FF;\n }\n if ((topy & 0x7FF) - 0x3BE >= 0x43E - 0x3BE) {\n // Note: sign_bias == 0 here because y is not odd.\n if (ix == 0x3FF0000000000000) return 1;\n if ((topy & 0x7FF) < 0x3BE) return 1; // |y| < 2^-65, x^y ~= 1 + y*log(x).\n return (ix > 0x3FF0000000000000) == (topy < 0x800) ? Infinity : 0;\n }\n if (topx == 0) {\n // Normalize subnormal x so exponent becomes negative.\n ix = reinterpret<u64>(x * Ox1p52);\n ix &= 0x7FFFFFFFFFFFFFFF;\n ix -= u64(52) << 52;\n }\n }\n\n let hi = log_inline(ix);\n let lo = log_tail;\n let ehi: f64, elo: f64;\n // #if __FP_FAST_FMA\n // ehi = y * hi;\n // elo = y * lo + __builtin_fma(y, hi, -ehi);\n // #else\n let yhi = reinterpret<f64>(iy & 0xFFFFFFFFF8000000);\n let ylo = y - yhi;\n let lhi = reinterpret<f64>(reinterpret<u64>(hi) & 0xFFFFFFFFF8000000);\n let llo = hi - lhi + lo;\n ehi = yhi * lhi;\n elo = ylo * lhi + y * llo; // |elo| < |ehi| * 2^-25.\n // #endif\n return exp_inline(ehi, elo, sign_bias);\n}\n","/// <reference path=\"../rt/index.d.ts\" />\n\nimport { idof } from \"../builtins\";\nimport { CharCode } from \"./string\";\n\n// @ts-ignore: decorator\n@inline\nexport const MAX_DOUBLE_LENGTH = 28;\n\n// @ts-ignore: decorator\n@lazy @inline const POWERS10 = memory.data<u32>([\n 1,\n 10,\n 100,\n 1000,\n 10000,\n 100000,\n 1000000,\n 10000000,\n 100000000,\n 1000000000\n]);\n\n/*\n Lookup table for pairwise char codes in range [0-99]\n\n \"00\", \"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\",\n \"10\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\", \"18\", \"19\",\n \"20\", \"21\", \"22\", \"23\", \"24\", \"25\", \"26\", \"27\", \"28\", \"29\",\n \"30\", \"31\", \"32\", \"33\", \"34\", \"35\", \"36\", \"37\", \"38\", \"39\",\n \"40\", \"41\", \"42\", \"43\", \"44\", \"45\", \"46\", \"47\", \"48\", \"49\",\n \"50\", \"51\", \"52\", \"53\", \"54\", \"55\", \"56\", \"57\", \"58\", \"59\",\n \"60\", \"61\", \"62\", \"63\", \"64\", \"65\", \"66\", \"67\", \"68\", \"69\",\n \"70\", \"71\", \"72\", \"73\", \"74\", \"75\", \"76\", \"77\", \"78\", \"79\",\n \"80\", \"81\", \"82\", \"83\", \"84\", \"85\", \"86\", \"87\", \"88\", \"89\",\n \"90\", \"91\", \"92\", \"93\", \"94\", \"95\", \"96\", \"97\", \"98\", \"99\"\n*/\n// @ts-ignore: decorator\n@lazy @inline const DIGITS = memory.data<u32>([\n 0x00300030, 0x00310030, 0x00320030, 0x00330030, 0x00340030,\n 0x00350030, 0x00360030, 0x00370030, 0x00380030, 0x00390030,\n 0x00300031, 0x00310031, 0x00320031, 0x00330031, 0x00340031,\n 0x00350031, 0x00360031, 0x00370031, 0x00380031, 0x00390031,\n 0x00300032, 0x00310032, 0x00320032, 0x00330032, 0x00340032,\n 0x00350032, 0x00360032, 0x00370032, 0x00380032, 0x00390032,\n 0x00300033, 0x00310033, 0x00320033, 0x00330033, 0x00340033,\n 0x00350033, 0x00360033, 0x00370033, 0x00380033, 0x00390033,\n 0x00300034, 0x00310034, 0x00320034, 0x00330034, 0x00340034,\n 0x00350034, 0x00360034, 0x00370034, 0x00380034, 0x00390034,\n 0x00300035, 0x00310035, 0x00320035, 0x00330035, 0x00340035,\n 0x00350035, 0x00360035, 0x00370035, 0x00380035, 0x00390035,\n 0x00300036, 0x00310036, 0x00320036, 0x00330036, 0x00340036,\n 0x00350036, 0x00360036, 0x00370036, 0x00380036, 0x00390036,\n 0x00300037, 0x00310037, 0x00320037, 0x00330037, 0x00340037,\n 0x00350037, 0x00360037, 0x00370037, 0x00380037, 0x00390037,\n 0x00300038, 0x00310038, 0x00320038, 0x00330038, 0x00340038,\n 0x00350038, 0x00360038, 0x00370038, 0x00380038, 0x00390038,\n 0x00300039, 0x00310039, 0x00320039, 0x00330039, 0x00340039,\n 0x00350039, 0x00360039, 0x00370039, 0x00380039, 0x00390039\n]);\n\n// Lookup table for pairwise char codes in range [0x00-0xFF]\n// @ts-ignore: decorator\n@lazy @inline const HEX_DIGITS =\n\"000102030405060708090a0b0c0d0e0f\\\n101112131415161718191a1b1c1d1e1f\\\n202122232425262728292a2b2c2d2e2f\\\n303132333435363738393a3b3c3d3e3f\\\n404142434445464748494a4b4c4d4e4f\\\n505152535455565758595a5b5c5d5e5f\\\n606162636465666768696a6b6c6d6e6f\\\n707172737475767778797a7b7c7d7e7f\\\n808182838485868788898a8b8c8d8e8f\\\n909192939495969798999a9b9c9d9e9f\\\na0a1a2a3a4a5a6a7a8a9aaabacadaeaf\\\nb0b1b2b3b4b5b6b7b8b9babbbcbdbebf\\\nc0c1c2c3c4c5c6c7c8c9cacbcccdcecf\\\nd0d1d2d3d4d5d6d7d8d9dadbdcdddedf\\\ne0e1e2e3e4e5e6e7e8e9eaebecedeeef\\\nf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff\";\n\n// @ts-ignore: decorator\n@lazy @inline const ANY_DIGITS = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n\n// @ts-ignore: decorator\n@lazy @inline const EXP_POWERS = memory.data<i16>([/* eslint-disable indent */\n -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,\n -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,\n -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,\n -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,\n -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,\n 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,\n 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,\n 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,\n 907, 933, 960, 986, 1013, 1039, 1066\n/* eslint-enable indent */]);\n\n// 1e-348, 1e-340, ..., 1e340\n// @ts-ignore: decorator\n@lazy @inline const FRC_POWERS = memory.data<u64>([\n 0xFA8FD5A0081C0288, 0xBAAEE17FA23EBF76, 0x8B16FB203055AC76, 0xCF42894A5DCE35EA,\n 0x9A6BB0AA55653B2D, 0xE61ACF033D1A45DF, 0xAB70FE17C79AC6CA, 0xFF77B1FCBEBCDC4F,\n 0xBE5691EF416BD60C, 0x8DD01FAD907FFC3C, 0xD3515C2831559A83, 0x9D71AC8FADA6C9B5,\n 0xEA9C227723EE8BCB, 0xAECC49914078536D, 0x823C12795DB6CE57, 0xC21094364DFB5637,\n 0x9096EA6F3848984F, 0xD77485CB25823AC7, 0xA086CFCD97BF97F4, 0xEF340A98172AACE5,\n 0xB23867FB2A35B28E, 0x84C8D4DFD2C63F3B, 0xC5DD44271AD3CDBA, 0x936B9FCEBB25C996,\n 0xDBAC6C247D62A584, 0xA3AB66580D5FDAF6, 0xF3E2F893DEC3F126, 0xB5B5ADA8AAFF80B8,\n 0x87625F056C7C4A8B, 0xC9BCFF6034C13053, 0x964E858C91BA2655, 0xDFF9772470297EBD,\n 0xA6DFBD9FB8E5B88F, 0xF8A95FCF88747D94, 0xB94470938FA89BCF, 0x8A08F0F8BF0F156B,\n 0xCDB02555653131B6, 0x993FE2C6D07B7FAC, 0xE45C10C42A2B3B06, 0xAA242499697392D3,\n 0xFD87B5F28300CA0E, 0xBCE5086492111AEB, 0x8CBCCC096F5088CC, 0xD1B71758E219652C,\n 0x9C40000000000000, 0xE8D4A51000000000, 0xAD78EBC5AC620000, 0x813F3978F8940984,\n 0xC097CE7BC90715B3, 0x8F7E32CE7BEA5C70, 0xD5D238A4ABE98068, 0x9F4F2726179A2245,\n 0xED63A231D4C4FB27, 0xB0DE65388CC8ADA8, 0x83C7088E1AAB65DB, 0xC45D1DF942711D9A,\n 0x924D692CA61BE758, 0xDA01EE641A708DEA, 0xA26DA3999AEF774A, 0xF209787BB47D6B85,\n 0xB454E4A179DD1877, 0x865B86925B9BC5C2, 0xC83553C5C8965D3D, 0x952AB45CFA97A0B3,\n 0xDE469FBD99A05FE3, 0xA59BC234DB398C25, 0xF6C69A72A3989F5C, 0xB7DCBF5354E9BECE,\n 0x88FCF317F22241E2, 0xCC20CE9BD35C78A5, 0x98165AF37B2153DF, 0xE2A0B5DC971F303A,\n 0xA8D9D1535CE3B396, 0xFB9B7CD9A4A7443C, 0xBB764C4CA7A44410, 0x8BAB8EEFB6409C1A,\n 0xD01FEF10A657842C, 0x9B10A4E5E9913129, 0xE7109BFBA19C0C9D, 0xAC2820D9623BF429,\n 0x80444B5E7AA7CF85, 0xBF21E44003ACDD2D, 0x8E679C2F5E44FF8F, 0xD433179D9C8CB841,\n 0x9E19DB92B4E31BA9, 0xEB96BF6EBADF77D9, 0xAF87023B9BF0EE6B\n]);\n\n// @ts-ignore: decorator\n@inline\nexport function isPowerOf2<T extends number>(value: T): bool {\n return popcnt<T>(value) == 1;\n}\n\n// Count number of decimals for u32 values\n// In our case input value always non-zero so we can simplify some parts\nexport function decimalCount32(value: u32): u32 {\n if (value < 100000) {\n if (value < 100) {\n return 1 + u32(value >= 10);\n } else {\n return 3 + u32(value >= 10000) + u32(value >= 1000);\n }\n } else {\n if (value < 10000000) {\n return 6 + u32(value >= 1000000);\n } else {\n return 8 + u32(value >= 1000000000) + u32(value >= 100000000);\n }\n }\n}\n\n// Count number of decimals for u64 values\n// In our case input value always greater than 2^32-1 so we can skip some parts\nexport function decimalCount64High(value: u64): u32 {\n if (value < 1000000000000000) {\n if (value < 1000000000000) {\n return 10 + u32(value >= 100000000000) + u32(value >= 10000000000);\n } else {\n return 13 + u32(value >= 100000000000000) + u32(value >= 10000000000000);\n }\n } else {\n if (value < 100000000000000000) {\n return 16 + u32(value >= 10000000000000000);\n } else {\n return 18 + u32(value >= 10000000000000000000) + u32(value >= 1000000000000000000);\n }\n }\n}\n\nfunction ulog_base(num: u64, base: i32): u32 {\n if (isPowerOf2(base)) {\n return (63 - <u32>clz(num)) / (31 - <u32>clz(base)) + 1;\n }\n let b64 = u64(base), b = b64, e: u32 = 1;\n while (num >= b) {\n num /= b;\n b *= b;\n e <<= 1;\n }\n while (num >= 1) {\n num /= b64;\n e++;\n }\n return e - 1;\n}\n\nfunction utoa32_dec_lut(buffer: usize, num: u32, offset: usize): void {\n while (num >= 10000) {\n // in most VMs i32/u32 div and modulo by constant can be shared and simplificate\n let t = num / 10000;\n let r = num % 10000;\n num = t;\n\n let d1 = r / 100;\n let d2 = r % 100;\n\n let digits1 = <u64>load<u32>(DIGITS + (<usize>d1 << alignof<u32>()));\n let digits2 = <u64>load<u32>(DIGITS + (<usize>d2 << alignof<u32>()));\n\n offset -= 4;\n store<u64>(buffer + (offset << 1), digits1 | (digits2 << 32));\n }\n\n if (num >= 100) {\n let t = num / 100;\n let d1 = num % 100;\n num = t;\n offset -= 2;\n let digits = load<u32>(DIGITS + (<usize>d1 << alignof<u32>()));\n store<u32>(buffer + (offset << 1), digits);\n }\n\n if (num >= 10) {\n offset -= 2;\n let digits = load<u32>(DIGITS + (<usize>num << alignof<u32>()));\n store<u32>(buffer + (offset << 1), digits);\n } else {\n offset -= 1;\n let digit = CharCode._0 + num;\n store<u16>(buffer + (offset << 1), digit);\n }\n}\n\nfunction utoa64_dec_lut(buffer: usize, num: u64, offset: usize): void {\n while (num >= 100000000) {\n let t = num / 100000000;\n let r = <usize>(num - t * 100000000);\n num = t;\n\n let b = r / 10000;\n let c = r % 10000;\n\n let b1 = b / 100;\n let b2 = b % 100;\n let c1 = c / 100;\n let c2 = c % 100;\n\n let digits1 = <u64>load<u32>(DIGITS + (<usize>c1 << alignof<u32>()));\n let digits2 = <u64>load<u32>(DIGITS + (<usize>c2 << alignof<u32>()));\n\n offset -= 4;\n store<u64>(buffer + (offset << 1), digits1 | (digits2 << 32));\n\n digits1 = <u64>load<u32>(DIGITS + (<usize>b1 << alignof<u32>()));\n digits2 = <u64>load<u32>(DIGITS + (<usize>b2 << alignof<u32>()));\n\n offset -= 4;\n store<u64>(buffer + (offset << 1), digits1 | (digits2 << 32));\n }\n\n utoa32_dec_lut(buffer, <u32>num, offset);\n}\n\nfunction utoa_hex_lut(buffer: usize, num: u64, offset: usize): void {\n const lut = changetype<usize>(HEX_DIGITS);\n while (offset >= 2) {\n offset -= 2;\n store<u32>(\n buffer + (offset << 1),\n load<u32>(lut + ((<usize>num & 0xFF) << alignof<u32>()))\n );\n num >>= 8;\n }\n if (offset & 1) {\n store<u16>(buffer, load<u16>(lut + (<usize>num << 6)));\n }\n}\n\nfunction utoa_dec_simple<T extends number>(buffer: usize, num: T, offset: usize): void {\n do {\n let t = num / 10;\n let r = <u32>(num % 10);\n num = changetype<T>(t);\n offset--;\n store<u16>(buffer + (offset << 1), CharCode._0 + r);\n } while (num);\n}\n\nfunction utoa_hex_simple<T extends number>(buffer: usize, num: T, offset: usize): void {\n do {\n let d = num & 0x0F | CharCode._0;\n d += select<T>(<T>0x27, <T>0, d > <T>CharCode._9);\n offset--;\n store<u16>(buffer + (offset << 1), d);\n // @ts-ignore: type\n num >>= 4;\n } while (num);\n}\n\n// @ts-ignore: decorator\n@inline\nexport function utoa32_dec_core(buffer: usize, num: u32, offset: usize): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_dec_simple<u32>(buffer, num, offset);\n } else {\n utoa32_dec_lut(buffer, num, offset);\n }\n}\n\n// @ts-ignore: decorator\n@inline\nfunction utoa32_hex_core(buffer: usize, num: u32, offset: usize): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_hex_simple<u32>(buffer, num, offset);\n } else {\n utoa_hex_lut(buffer, num, offset);\n }\n}\n\n// @ts-ignore: decorator\n@inline\nfunction utoa64_dec_core(buffer: usize, num: u64, offset: usize): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_dec_simple<u64>(buffer, num, offset);\n } else {\n utoa64_dec_lut(buffer, num, offset);\n }\n}\n\n// @ts-ignore: decorator\n@inline\nfunction utoa64_hex_core(buffer: usize, num: u64, offset: usize): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_hex_simple<u64>(buffer, num, offset);\n } else {\n utoa_hex_lut(buffer, num, offset);\n }\n}\n\nfunction utoa64_any_core(buffer: usize, num: u64, offset: usize, radix: i32): void {\n const lut = changetype<usize>(ANY_DIGITS);\n let base = u64(radix);\n if ((radix & (radix - 1)) == 0) { // for radix which pow of two\n let shift = u64(ctz(radix) & 7);\n let mask = base - 1;\n do {\n offset--;\n store<u16>(buffer + (offset << 1), load<u16>(lut + (usize(num & mask) << 1)));\n num >>= shift;\n } while (num);\n } else {\n do {\n offset--;\n let q = num / base;\n store<u16>(buffer + (offset << 1), load<u16>(lut + (usize(num - q * base) << 1)));\n num = q;\n } while (num);\n }\n}\n\nexport function utoa32(value: u32, radix: i32): String {\n if (radix < 2 || radix > 36) {\n throw new RangeError(\"toString() radix argument must be between 2 and 36\");\n }\n if (!value) return \"0\";\n let out: String;\n\n if (radix == 10) {\n let decimals = decimalCount32(value);\n out = changetype<String>(__new(decimals << 1, idof<String>()));\n utoa32_dec_core(changetype<usize>(out), value, decimals);\n } else if (radix == 16) {\n let decimals = (31 - clz(value) >> 2) + 1;\n out = changetype<String>(__new(decimals << 1, idof<String>()));\n utoa32_hex_core(changetype<usize>(out), value, decimals);\n } else {\n let decimals = ulog_base(value, radix);\n out = changetype<String>(__new(decimals << 1, idof<String>()));\n utoa64_any_core(changetype<usize>(out), value, decimals, radix);\n }\n return out;\n}\n\nexport function itoa32(value: i32, radix: i32): String {\n if (radix < 2 || radix > 36) {\n throw new RangeError(\"toString() radix argument must be between 2 and 36\");\n }\n if (!value) return \"0\";\n\n let sign = (value >>> 31) << 1;\n if (sign) value = -value;\n let out: String;\n\n if (radix == 10) {\n let decimals = decimalCount32(value);\n out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));\n utoa32_dec_core(changetype<usize>(out) + sign, value, decimals);\n } else if (radix == 16) {\n let decimals = (31 - clz(value) >> 2) + 1;\n out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));\n utoa32_hex_core(changetype<usize>(out) + sign, value, decimals);\n } else {\n let val32 = u32(value);\n let decimals = ulog_base(val32, radix);\n out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));\n utoa64_any_core(changetype<usize>(out) + sign, val32, decimals, radix);\n }\n if (sign) store<u16>(changetype<usize>(out), CharCode.MINUS);\n return out;\n}\n\nexport function utoa64(value: u64, radix: i32): String {\n if (radix < 2 || radix > 36) {\n throw new RangeError(\"toString() radix argument must be between 2 and 36\");\n }\n if (!value) return \"0\";\n let out: String;\n\n if (radix == 10) {\n if (value <= u32.MAX_VALUE) {\n let val32 = <u32>value;\n let decimals = decimalCount32(val32);\n out = changetype<String>(__new(decimals << 1, idof<String>()));\n utoa32_dec_core(changetype<usize>(out), val32, decimals);\n } else {\n let decimals = decimalCount64High(value);\n out = changetype<String>(__new(decimals << 1, idof<String>()));\n utoa64_dec_core(changetype<usize>(out), value, decimals);\n }\n } else if (radix == 16) {\n let decimals = (63 - u32(clz(value)) >> 2) + 1;\n out = changetype<String>(__new(decimals << 1, idof<String>()));\n utoa64_hex_core(changetype<usize>(out), value, decimals);\n } else {\n let decimals = ulog_base(value, radix);\n out = changetype<String>(__new(decimals << 1, idof<String>()));\n utoa64_any_core(changetype<usize>(out), value, decimals, radix);\n }\n return out;\n}\n\nexport function itoa64(value: i64, radix: i32): String {\n if (radix < 2 || radix > 36) {\n throw new RangeError(\"toString() radix argument must be between 2 and 36\");\n }\n if (!value) return \"0\";\n\n let sign = u32(value >>> 63) << 1;\n if (sign) value = -value;\n let out: String;\n\n if (radix == 10) {\n if (<u64>value <= <u64>u32.MAX_VALUE) {\n let val32 = <u32>value;\n let decimals = decimalCount32(val32);\n out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));\n utoa32_dec_core(changetype<usize>(out) + sign, val32, decimals);\n } else {\n let decimals = decimalCount64High(value);\n out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));\n utoa64_dec_core(changetype<usize>(out) + sign, value, decimals);\n }\n } else if (radix == 16) {\n let decimals = (63 - u32(clz(value)) >> 2) + 1;\n out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));\n utoa64_hex_core(changetype<usize>(out) + sign, value, decimals);\n } else {\n let decimals = ulog_base(value, radix);\n out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));\n utoa64_any_core(changetype<usize>(out) + sign, value, decimals, radix);\n }\n if (sign) store<u16>(changetype<usize>(out), CharCode.MINUS);\n return out;\n}\n\n// @ts-ignore: decorator\n@lazy let _K: i32 = 0;\n\n// // @ts-ignore: decorator\n// @lazy\n// let _frc: u64 = 0;\n\n// @ts-ignore: decorator\n@lazy let _exp: i32 = 0;\n\n// @ts-ignore: decorator\n@lazy let _frc_minus: u64 = 0;\n\n// @ts-ignore: decorator\n@lazy let _frc_plus: u64 = 0;\n\n// @ts-ignore: decorator\n@lazy let _frc_pow: u64 = 0;\n\n// @ts-ignore: decorator\n@lazy let _exp_pow: i32 = 0;\n\n// @ts-ignore: decorator\n@inline\nfunction umul64f(u: u64, v: u64): u64 {\n let u0 = u & 0xFFFFFFFF;\n let v0 = v & 0xFFFFFFFF;\n\n let u1 = u >> 32;\n let v1 = v >> 32;\n\n let l = u0 * v0;\n let t = u1 * v0 + (l >> 32);\n let w = u0 * v1 + (t & 0xFFFFFFFF);\n\n w += 0x7FFFFFFF; // rounding\n\n t >>= 32;\n w >>= 32;\n\n return u1 * v1 + t + w;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction umul64e(e1: i32, e2: i32): i32 {\n return e1 + e2 + 64; // where 64 is significand size\n}\n\n// @ts-ignore: decorator\n@inline\nfunction normalizedBoundaries(f: u64, e: i32, isSingle: bool): void {\n let frc = (f << 1) + 1;\n let exp = e - 1;\n let off = <i32>clz<u64>(frc);\n frc <<= off;\n exp -= off;\n\n let m = 1 + i32(f == (isSingle ? 0x00800000 : 0x0010000000000000));\n\n _frc_plus = frc;\n _frc_minus = ((f << m) - 1) << e - m - exp;\n _exp = exp;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction grisuRound(buffer: usize, len: i32, delta: u64, rest: u64, ten_kappa: u64, wp_w: u64): void {\n let lastp = buffer + ((len - 1) << 1);\n let digit = load<u16>(lastp);\n while (\n rest < wp_w &&\n delta - rest >= ten_kappa && (\n rest + ten_kappa < wp_w ||\n wp_w - rest > rest + ten_kappa - wp_w\n )\n ) {\n --digit;\n rest += ten_kappa;\n }\n store<u16>(lastp, digit);\n}\n\n// @ts-ignore: decorator\n@inline\nfunction getCachedPower(minExp: i32): void {\n const c = reinterpret<f64>(0x3FD34413509F79FE); // 1 / lg(10) = 0.30102999566398114\n let dk = (-61 - minExp) * c + 347;\t // dk must be positive, so can do ceiling in positive\n let k = <i32>dk;\n k += i32(k != dk); // conversion with ceil\n\n let index = (k >> 3) + 1;\n _K = 348 - (index << 3);\t// decimal exponent no need lookup table\n _frc_pow = load<u64>(FRC_POWERS + (<usize>index << alignof<u64>()));\n _exp_pow = load<i16>(EXP_POWERS + (<usize>index << alignof<i16>()));\n}\n\n// @ts-ignore: decorator\n@inline\nfunction grisu2(value: f64, buffer: usize, sign: i32, isSingle: bool): i32 {\n let frc: u64;\n let exp: i32;\n\n // frexp routine\n if (isSingle) {\n let uv = reinterpret<u32>(<f32>value);\n exp = (uv & 0x7F800000) >>> 23;\n let sid = uv & 0x007FFFFF;\n frc = (u64(exp != 0) << 23) + sid;\n exp = (exp || 1) - (0x7F + 23);\n } else {\n let uv = reinterpret<u64>(value);\n exp = i32((uv & 0x7FF0000000000000) >>> 52);\n let sid = uv & 0x000FFFFFFFFFFFFF;\n frc = (u64(exp != 0) << 52) + sid;\n exp = (exp || 1) - (0x3FF + 52);\n }\n\n normalizedBoundaries(frc, exp, isSingle);\n getCachedPower(_exp);\n\n // normalize\n let off = <i32>clz<u64>(frc);\n frc <<= off;\n exp -= off;\n\n let frc_pow = _frc_pow;\n let exp_pow = _exp_pow;\n\n let w_frc = umul64f(frc, frc_pow);\n let w_exp = umul64e(exp, exp_pow);\n\n let wp_frc = umul64f(_frc_plus, frc_pow) - 1;\n let wp_exp = umul64e(_exp, exp_pow);\n\n let wm_frc = umul64f(_frc_minus, frc_pow) + 1;\n let delta = wp_frc - wm_frc;\n\n return genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign);\n}\n\nfunction genDigits(buffer: usize, w_frc: u64, w_exp: i32, mp_frc: u64, mp_exp: i32, delta: u64, sign: i32): i32 {\n let one_exp = -mp_exp;\n let one_frc = (<u64>1) << one_exp;\n let mask = one_frc - 1;\n\n let wp_w_frc = mp_frc - w_frc;\n\n let p1 = u32(mp_frc >> one_exp);\n let p2 = mp_frc & mask;\n\n let kappa = <i32>decimalCount32(p1);\n let len = sign;\n\n while (kappa > 0) {\n let d: u32;\n switch (kappa) {\n case 10: { d = p1 / 1000000000; p1 %= 1000000000; break; }\n case 9: { d = p1 / 100000000; p1 %= 100000000; break; }\n case 8: { d = p1 / 10000000; p1 %= 10000000; break; }\n case 7: { d = p1 / 1000000; p1 %= 1000000; break; }\n case 6: { d = p1 / 100000; p1 %= 100000; break; }\n case 5: { d = p1 / 10000; p1 %= 10000; break; }\n case 4: { d = p1 / 1000; p1 %= 1000; break; }\n case 3: { d = p1 / 100; p1 %= 100; break; }\n case 2: { d = p1 / 10; p1 %= 10; break; }\n case 1: { d = p1; p1 = 0; break; }\n default: { d = 0; break; }\n }\n\n if (d | len) store<u16>(buffer + (len++ << 1), CharCode._0 + <u16>d);\n\n --kappa;\n let tmp = ((<u64>p1) << one_exp) + p2;\n if (tmp <= delta) {\n _K += kappa;\n grisuRound(buffer, len, delta, tmp, <u64>load<u32>(POWERS10 + (<usize>kappa << alignof<u32>())) << one_exp, wp_w_frc);\n return len;\n }\n }\n\n while (true) {\n p2 *= 10;\n delta *= 10;\n\n let d = p2 >> one_exp;\n if (d | len) store<u16>(buffer + (len++ << 1), CharCode._0 + <u16>d);\n\n p2 &= mask;\n --kappa;\n if (p2 < delta) {\n _K += kappa;\n wp_w_frc *= <u64>load<u32>(POWERS10 + (<usize>-kappa << alignof<u32>()));\n grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc);\n return len;\n }\n }\n}\n\n// @ts-ignore: decorator\n@inline\nfunction genExponent(buffer: usize, k: i32): i32 {\n let sign = k < 0;\n if (sign) k = -k;\n let decimals = decimalCount32(k) + 1;\n utoa32_dec_core(buffer, k, decimals);\n store<u16>(buffer, <u16>select<u32>(CharCode.MINUS, CharCode.PLUS, sign));\n return decimals;\n}\n\nfunction prettify(buffer: usize, length: i32, k: i32): i32 {\n if (!k) {\n store<u32>(buffer + (length << 1), CharCode.DOT | (CharCode._0 << 16));\n return length + 2;\n }\n\n let kk = length + k;\n if (length <= kk && kk <= 21) {\n // 1234e7 -> 12340000000\n for (let i = length; i < kk; ++i) {\n store<u16>(buffer + (i << 1), CharCode._0);\n }\n store<u32>(buffer + (kk << 1), CharCode.DOT | (CharCode._0 << 16));\n return kk + 2;\n } else if (kk > 0 && kk <= 21) {\n // 1234e-2 -> 12.34\n let ptr = buffer + (kk << 1);\n memory.copy(\n ptr + 2,\n ptr,\n -k << 1\n );\n store<u16>(buffer + (kk << 1), CharCode.DOT);\n return length + 1;\n } else if (-6 < kk && kk <= 0) {\n // 1234e-6 -> 0.001234\n let offset = 2 - kk;\n memory.copy(\n buffer + (offset << 1),\n buffer,\n length << 1\n );\n store<u32>(buffer, CharCode._0 | (CharCode.DOT << 16));\n for (let i = 2; i < offset; ++i) {\n store<u16>(buffer + (i << 1), CharCode._0);\n }\n return length + offset;\n } else if (length == 1) {\n // 1e30\n store<u16>(buffer, CharCode.e, 2);\n length = genExponent(buffer + 4, kk - 1);\n return length + 2;\n } else {\n let len = length << 1;\n memory.copy(\n buffer + 4,\n buffer + 2,\n len - 2\n );\n store<u16>(buffer, CharCode.DOT, 2);\n store<u16>(buffer + len, CharCode.e, 2);\n length += genExponent(buffer + len + 4, kk - 1);\n return length + 2;\n }\n}\n\nfunction dtoa_core(buffer: usize, value: f64, isSingle: bool): i32 {\n let sign = i32(value < 0);\n if (sign) {\n value = -value;\n store<u16>(buffer, CharCode.MINUS);\n }\n // assert(value > 0 && value <= (isSingle ? f32.MAX_VALUE : f64.MAX_VALUE));\n let len = grisu2(value, buffer, sign, isSingle);\n len = prettify(buffer + (sign << 1), len - sign, _K);\n return len + sign;\n}\n\n// @ts-ignore: decorator\n@lazy @inline const dtoa_buf = memory.data(MAX_DOUBLE_LENGTH << 1);\n\nexport function dtoa<T extends number>(value: T): String {\n const isSingle = isFloat<T>() && sizeof<T>() == 4;\n return dtoa_impl(value, isSingle);\n}\n\n// @ts-ignore: decorator\n@inline\nfunction dtoa_impl(value: f64, isSingle: bool): String {\n if (value == 0) return \"0.0\";\n if (!isFinite(value)) {\n if (isNaN(value)) return \"NaN\";\n return select<String>(\"-Infinity\", \"Infinity\", value < 0);\n }\n let size = dtoa_core(dtoa_buf, value, isSingle) << 1;\n let result = changetype<String>(__new(size, idof<String>()));\n memory.copy(changetype<usize>(result), dtoa_buf, size);\n return result;\n}\n\nexport function itoa_buffered<T extends number>(buffer: usize, value: T): u32 {\n let sign: u32 = 0;\n if (isSigned<T>()) {\n sign = u32(value < 0);\n if (sign) {\n if (sizeof<T>() == 1) {\n if (value == -0x80) {\n // -0x80 -> -128\n store<u64>(buffer,\n <u64>CharCode.MINUS |\n <u64>(CharCode._0 + 1) << 16 |\n <u64>(CharCode._0 + 2) << 32 |\n <u64>(CharCode._0 + 8) << 48\n );\n return 4;\n }\n }\n if (sizeof<T>() == 2) {\n if (value == -0x8000) {\n // -0x8000 -> -32768\n store<u64>(buffer,\n <u64>CharCode.MINUS |\n <u64>(CharCode._0 + 3) << 16 |\n <u64>(CharCode._0 + 2) << 32 |\n <u64>(CharCode._0 + 7) << 48\n ); // -327\n store<u32>(buffer + 8,\n (CharCode._0 + 6) << 0 |\n (CharCode._0 + 8) << 16\n ); // 68\n return 6;\n }\n }\n store<u16>(buffer, CharCode.MINUS);\n // @ts-ignore\n value = -value;\n }\n }\n let dest = buffer + (sign << 1);\n if (ASC_SHRINK_LEVEL <= 1) {\n if (isSigned<T>()) {\n if (sizeof<T>() <= 4) {\n if (<u32>value < 10) {\n store<u16>(dest, value | CharCode._0);\n return 1 + sign;\n }\n } else {\n if (<u64>value < 10) {\n store<u16>(dest, value | CharCode._0);\n return 1 + sign;\n }\n }\n } else {\n if (value < 10) {\n store<u16>(buffer, value | CharCode._0);\n return 1;\n }\n }\n }\n let decimals: u32 = 0;\n if (sizeof<T>() <= 4) {\n let val32 = <u32>value;\n decimals = decimalCount32(val32);\n utoa32_dec_core(dest, val32, decimals);\n } else {\n if (<u64>value <= <u64>u32.MAX_VALUE) {\n let val32 = <u32>value;\n decimals = decimalCount32(val32);\n utoa32_dec_core(dest, val32, decimals);\n } else {\n let val64 = <u64>value;\n decimals = decimalCount64High(val64);\n utoa64_dec_core(dest, val64, decimals);\n }\n }\n return sign + decimals;\n}\n\nexport function dtoa_buffered<T extends number>(buffer: usize, value: T): u32 {\n const isSingle = isFloat<T>() && sizeof<T>() == 4;\n return dtoa_buffered_impl(buffer, value, isSingle);\n}\n\n// @ts-ignore: decorator\n@inline\nfunction dtoa_buffered_impl(buffer: usize, value: f64, isSingle: bool): u32 {\n if (value == 0) {\n store<u16>(buffer, CharCode._0);\n store<u16>(buffer, CharCode.DOT, 2);\n store<u16>(buffer, CharCode._0, 4);\n return 3;\n }\n if (!isFinite(value)) {\n if (isNaN(value)) {\n store<u16>(buffer, CharCode.N);\n store<u16>(buffer, CharCode.a, 2);\n store<u16>(buffer, CharCode.N, 4);\n return 3;\n } else {\n let sign = value < 0;\n if (sign) {\n store<u16>(buffer, CharCode.MINUS); // -\n buffer += 2;\n }\n store<u64>(buffer, 0x690066006E0049, 0); // ifnI\n store<u64>(buffer, 0x7900740069006E, 8); // ytin\n return 8 + u32(sign);\n }\n }\n return dtoa_core(buffer, value, isSingle);\n}\n","import {\n itoa32,\n utoa32,\n itoa64,\n utoa64,\n dtoa,\n itoa_buffered,\n dtoa_buffered,\n MAX_DOUBLE_LENGTH\n} from \"./number\";\n\nimport {\n ipow32\n} from \"../math\";\n\n// All tables are stored as two staged lookup tables (static tries)\n// because the full range of Unicode symbols can't be efficiently\n// represented as-is in memory (see Unicode spec ch 5, p.196):\n// https://www.unicode.org/versions/Unicode12.0.0/ch05.pdf\n// Tables have been generated using these forked musl tools:\n// https://github.com/MaxGraey/musl-chartable-tools/tree/case-ignorable\n\n// Lookup table to check if a character is alphanumeric or not\n// See: https://git.musl-libc.org/cgit/musl/tree/src/ctype/alpha.h\n// size: 3904 bytes\n// @ts-ignore\n@inline @lazy const ALPHA_TABLE = memory.data<u8>([\n 18,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,17,34,35,36,17,37,38,39,40,\n 41,42,43,44,17,45,46,47,16,16,48,16,16,16,16,16,16,16,49,50,51,16,52,53,16,16,\n 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,54,\n 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n 17,17,17,55,17,17,17,17,56,17,57,58,59,60,61,62,17,17,17,17,17,17,17,17,17,17,\n 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,\n 17,17,17,17,17,17,17,63,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,64,65,17,66,67,\n 68,69,70,71,72,73,74,17,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,\n 93,94,16,95,96,97,98,17,17,17,99,100,101,16,16,16,16,16,16,16,16,16,16,17,17,\n 17,17,102,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,103,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,17,17,104,105,16,16,106,107,17,17,17,17,17,17,17,17,17,17,17,17,17,\n 17,17,17,17,17,17,17,17,17,17,108,17,17,17,17,109,110,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 17,111,112,16,16,16,16,16,16,16,16,16,113,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,114,115,116,117,16,16,16,16,16,16,16,16,118,\n 119,120,16,16,16,16,16,121,122,16,16,16,16,123,16,16,124,16,16,16,16,16,16,16,\n 16,16,125,16,16,16,\n 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,254,255,255,7,254,\n 255,255,7,0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,195,255,3,0,31,80,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,223,188,64,215,255,255,\n 251,255,255,255,255,255,255,255,255,255,191,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,3,252,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,127,2,255,255,255,\n 255,255,1,0,0,0,0,255,191,182,0,255,255,255,135,7,0,0,0,255,7,255,255,255,255,\n 255,255,255,254,255,195,255,255,255,255,255,255,255,255,255,255,255,255,239,\n 31,254,225,255,\n 159,0,0,255,255,255,255,255,255,0,224,255,255,255,255,255,255,255,255,255,255,\n 255,255,3,0,255,255,255,255,255,7,48,4,255,255,255,252,255,31,0,0,255,255,255,\n 1,255,7,0,0,0,0,0,0,255,255,223,255,255,0,240,255,248,3,255,255,255,255,255,\n 255,255,255,255,239,255,223,225,255,207,255,254,255,239,159,249,255,255,253,\n 197,227,159,89,128,176,207,255,3,16,238,135,249,255,255,253,109,195,135,25,2,\n 94,192,255,63,0,238,191,251,255,255,253,237,227,191,27,1,0,207,255,0,30,238,\n 159,249,255,255,253,237,227,159,25,192,176,207,255,2,0,236,199,61,214,24,199,\n 255,195,199,29,129,0,192,255,0,0,239,223,253,255,255,253,255,227,223,29,96,7,\n 207,255,0,0,239,223,253,255,255,253,239,227,223,29,96,64,207,255,6,0,255,223,\n 253,255,255,255,255,231,223,93,240,128,207,255,0,252,238,255,127,252,255,255,\n 251,47,127,128,95,255,192,255,12,0,254,255,255,255,255,127,255,7,63,32,255,3,\n 0,0,0,0,214,247,255,255,175,255,255,59,95,32,255,243,0,0,0,\n 0,1,0,0,0,255,3,0,0,255,254,255,255,255,31,254,255,3,255,255,254,255,255,255,\n 31,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,249,255,3,255,255,255,255,255,\n 255,255,255,255,63,255,255,255,255,191,32,255,255,255,255,255,247,255,255,255,\n 255,255,255,255,255,255,61,127,61,255,255,255,255,255,61,255,255,255,255,61,\n 127,61,255,127,255,255,255,255,255,255,255,61,255,255,255,255,255,255,255,255,\n 7,0,0,0,0,255,255,0,0,255,255,255,255,255,255,255,255,255,255,63,63,254,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,159,255,255,254,255,255,7,255,255,255,255,255,255,255,255,\n 255,199,255,1,255,223,15,0,255,255,15,0,255,255,15,0,255,223,13,0,255,255,255,\n 255,255,255,207,255,255,1,128,16,255,3,0,0,0,0,255,3,255,255,255,255,255,255,\n 255,255,255,255,255,1,255,255,255,255,255,7,255,255,255,255,255,255,255,255,\n 63,\n 0,255,255,255,127,255,15,255,1,192,255,255,255,255,63,31,0,255,255,255,255,\n 255,15,255,255,255,3,255,3,0,0,0,0,255,255,255,15,255,255,255,255,255,255,255,\n 127,254,255,31,0,255,3,255,3,128,0,0,128,1,0,0,0,0,0,0,0,255,255,255,255,255,\n 255,239,255,239,15,255,3,0,0,0,0,255,255,255,255,255,243,255,255,255,255,255,\n 255,191,255,3,0,255,255,255,255,255,255,127,0,255,227,255,255,255,255,255,63,\n 255,1,255,255,255,255,255,231,0,0,0,0,0,222,111,4,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,\n 128,255,31,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,\n 255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,132,252,47,62,80,189,255,243,\n 224,67,0,0,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,\n 0,255,255,255,255,255,127,255,255,255,255,255,127,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,31,120,12,0,255,255,255,255,191,32,255,\n 255,255,255,255,255,255,128,0,0,255,255,127,0,127,127,127,127,127,127,127,127,\n 255,255,255,255,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,224,0,0,0,254,3,62,31,254,255,255,255,255,255,255,255,255,255,127,224,254,\n 255,255,255,255,255,255,255,255,255,255,247,224,255,255,255,255,255,254,255,\n 255,255,255,255,255,255,255,255,255,127,0,0,255,255,255,255,0,0,0,0,0,0,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,\n 31,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,\n 0,0,0,0,0,0,255,255,255,255,255,63,255,31,255,255,255,15,0,0,255,255,255,255,\n 255,127,240,143,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,\n 0,128,255,252,255,255,255,255,255,255,255,255,255,255,255,255,249,255,255,255,\n 255,255,255,252,7,0,0,0,0,224,255,191,255,255,255,255,0,0,0,255,255,255,255,\n 255,255,15,0,255,255,255,255,255,255,255,255,47,0,255,3,0,0,252,232,255,255,\n 255,255,255,7,255,255,255,255,7,0,255,255,255,31,255,255,255,255,255,255,247,\n 255,0,128,255,3,255,255,255,127,255,255,255,255,255,255,127,0,255,63,255,3,\n 255,255,127,252,255,255,255,255,255,255,255,127,5,0,0,56,255,255,60,0,126,126,\n 126,0,127,127,255,255,255,255,255,247,255,3,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,7,255,3,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,15,0,255,255,127,248,255,255,255,255,\n 255,\n 15,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,3,0,0,0,0,127,0,248,224,255,253,127,95,219,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,248,255,255,255,\n 255,255,255,255,255,255,255,255,255,63,0,0,255,255,255,255,255,255,255,255,\n 252,255,255,255,255,255,255,0,0,0,0,0,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,255,3,\n 254,255,255,7,254,255,255,7,192,255,255,255,255,255,255,255,255,255,255,127,\n 252,252,252,28,0,0,0,0,255,239,255,255,127,255,255,183,255,63,255,63,0,0,0,0,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,255,255,255,31,255,255,255,255,255,255,1,0,0,0,0,\n 0,255,255,255,255,0,224,255,255,255,7,255,255,255,255,255,7,255,255,255,63,\n 255,255,255,255,15,255,62,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,63,255,3,255,255,255,255,15,255,255,255,\n 255,15,255,255,255,255,255,0,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,0,255,255,63,0,255,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,63,253,255,255,255,255,191,145,255,255,63,0,255,255,\n 127,0,255,255,255,127,0,0,0,0,0,0,0,0,255,255,55,0,255,255,63,0,255,255,255,3,\n 0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,192,0,0,0,0,0,0,0,0,111,240,239,\n 254,255,255,63,0,0,0,0,0,255,255,255,31,255,255,255,31,0,0,0,0,255,254,255,\n 255,31,0,0,0,255,255,255,255,255,255,63,0,255,255,63,0,255,255,7,0,255,255,3,\n 0,0,0,0,0,0,0,0,0,0,0,0,\n 0,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,255,255,255,255,255,255,7,\n 0,255,255,255,255,255,255,7,0,255,255,255,255,255,0,255,3,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,\n 255,27,3,0,0,0,0,0,0,0,0,0,255,255,255,31,128,0,255,255,63,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,255,255,31,0,0,0,255,255,127,0,255,255,255,255,255,255,255,255,63,0,0,\n 0,192,255,0,0,252,255,255,255,255,255,255,1,0,0,255,255,255,1,255,3,255,255,\n 255,255,255,255,199,255,240,0,255,255,255,255,71,0,255,255,255,255,255,255,\n 255,255,30,192,255,23,0,0,0,0,255,255,251,255,255,255,159,64,0,0,0,0,0,0,0,0,\n 127,189,255,191,255,1,255,255,255,255,255,255,255,1,255,3,239,159,249,255,255,\n 253,237,227,159,25,129,224,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,255,255,255,255,255,255,255,255,187,7,255,131,3,0,0,0,255,255,255,255,255,\n 255,255,255,179,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,\n 255,255,255,63,127,0,0,0,63,0,0,0,0,255,255,255,255,255,255,255,127,17,0,255,\n 3,0,0,0,0,255,255,255,255,255,255,63,1,255,3,0,0,0,0,0,0,255,255,255,231,255,\n 7,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,\n 255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,3,0,128,\n 127,242,111,255,255,255,191,153,7,0,255,3,0,0,0,0,0,0,0,0,255,252,255,255,255,\n 255,255,252,26,0,0,0,255,255,255,255,255,255,231,127,0,0,255,255,255,255,255,\n 255,255,255,255,32,0,0,0,0,255,255,255,255,255,255,255,1,255,253,255,255,255,\n 255,127,127,1,0,255,3,0,0,252,255,255,255,252,255,255,254,127,0,0,0,0,0,0,0,0,\n 0,127,251,255,255,255,255,127,180,203,0,255,3,191,253,255,255,255,127,123,1,\n 255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,\n 0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,3,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,127,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,\n 0,255,255,255,255,255,255,255,1,255,255,255,127,255,3,0,0,0,0,0,0,0,0,0,0,0,0,\n 255,255,255,63,0,0,255,255,255,255,255,255,0,0,15,0,255,3,248,255,255,224,255,\n 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,\n 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,135,\n 255,255,255,255,255,255,255,128,255,255,0,0,0,0,0,0,0,0,11,0,3,0,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,\n 255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,\n 127,0,0,0,0,0,0,7,0,240,0,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,15,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,7,255,31,255,1,255,67,0,0,0,0,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,255,255,255,255,223,255,255,255,255,255,255,255,255,\n 223,100,222,255,235,239,255,255,255,255,255,255,255,191,231,223,223,255,255,\n 255,123,95,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,63,255,255,255,253,255,255,247,255,255,255,\n 247,255,255,223,255,255,255,223,255,255,127,255,255,255,127,255,255,255,253,\n 255,255,255,253,255,255,247,207,255,255,255,255,255,255,127,255,255,249,219,7,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,31,\n 128,63,255,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,15,255,\n 3,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,31,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,143,8,\n 255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,255,150,254,247,10,\n 132,234,150,170,150,247,247,94,255,251,255,15,238,251,255,15,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,255,255,255,3,255,255,255,3,255,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,3\n]);\n\n// size: 1568 bytes (compressed to ~1380 bytes after binaryen)\n// @ts-ignore: decorator\n@lazy @inline const CASED = memory.data<u8>([\n 18,19,20,21,22,23,16,16,16,16,16,16,16,16,16,16,\n 24,16,16,25,16,16,16,16,16,16,16,16,26,27,17,28,\n 29,30,16,16,31,16,16,16,16,16,16,16,32,33,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,34,35,16,16,16,36,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,37,16,16,16,38,\n 16,16,16,16,39,16,16,16,16,16,16,16,40,16,16,16,\n 16,16,16,16,16,16,16,16,41,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,42,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,43,44,45,46,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,47,16,16,16,16,16,16,\n 16,48,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 0,0,0,0,0,0,0,0,254,255,255,7,254,255,255,7,0,0,0,0,0,4,32,4,\n 255,255,127,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,247,240,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,239,255,255,255,255,1,3,0,0,0,31,0,0,0,\n 0,0,0,0,0,0,0,0,32,0,0,0,0,0,207,188,64,215,255,255,251,255,255,255,\n 255,255,255,255,255,255,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 3,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,\n 255,255,127,0,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,\n 191,32,255,255,255,255,255,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,255,255,255,255,255,255,255,255,255,255,63,63,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,255,1,255,255,255,255,255,231,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 0,0,0,0,0,0,0,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,\n 255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,\n 132,252,47,62,80,189,31,242,224,67,0,0,255,255,255,255,24,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,0,255,255,255,255,255,127,255,255,\n 255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,120,12,0,\n 255,255,255,255,191,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,63,0,0,\n 255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,\n 255,255,255,255,255,255,255,255,255,120,255,255,255,255,255,255,252,7,0,0,0,0,96,7,\n 0,0,0,0,0,0,255,255,255,255,255,247,255,1,255,255,255,255,255,255,255,255,255,255,\n 0,0,0,0,0,0,0,0,127,0,248,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,7,\n 254,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,\n 255,255,15,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,7,0,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,\n 0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,223,255,255,255,255,255,\n 255,255,255,223,100,222,255,235,239,255,255,255,255,255,255,255,191,231,223,223,255,255,255,123,\n 95,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,\n 253,255,255,247,255,255,255,247,255,255,223,255,255,255,223,255,255,127,255,255,255,127,255,255,\n 255,253,255,255,255,253,255,255,247,15,0,0,0,0,0,0,255,255,255,255,255,255,255,255,\n 15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,255,255,255,3,255,255,255,3,255,255,255,3,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0\n]);\n\n// size: 2976 bytes (compressed to ~2050 bytes after binaryen)\n// @ts-ignore: decorator\n@lazy @inline const CASE_IGNORABLES = memory.data<u8>([\n 18,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,\n 33,16,16,34,16,16,16,35,36,37,38,39,40,41,16,42,\n 43,16,16,16,16,16,16,16,16,16,16,16,44,45,46,16,\n 47,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 48,16,16,16,49,16,50,51,52,53,54,55,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,56,16,16,57,58,\n 16,59,60,61,16,16,16,16,16,16,62,16,16,63,64,65,\n 66,67,68,69,70,71,72,73,74,75,76,16,77,78,79,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,80,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,81,82,16,16,16,83,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,84,16,16,16,\n 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,\n 16,85,86,16,16,16,16,16,16,16,87,16,16,16,16,16,\n 88,89,90,16,16,16,16,16,91,92,16,16,16,16,16,16,\n 16,16,16,93,16,16,16,16,16,16,16,16,16,16,16,16,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 0,0,0,0,128,64,0,4,0,0,0,64,1,0,0,0,0,0,0,0,0,161,144,1,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n 255,255,255,255,255,255,48,4,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,3,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,0,0,0,\n 0,0,254,255,255,255,255,191,182,0,0,0,0,0,16,0,63,0,255,23,0,0,0,0,\n 1,248,255,255,0,0,1,0,0,0,0,0,0,0,0,0,0,0,192,191,255,61,0,0,\n 0,128,2,0,0,0,255,255,255,7,0,0,0,0,0,0,0,0,0,0,192,255,1,0,\n 0,0,0,0,0,248,63,36,0,0,192,255,255,63,0,0,0,0,0,14,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,255,7,0,0,0,0,0,0,20,\n 254,33,254,0,12,0,2,0,2,0,0,0,0,0,0,16,30,32,0,0,12,0,0,64,\n 6,0,0,0,0,0,0,16,134,57,2,0,0,0,35,0,6,0,0,0,0,0,0,16,\n 190,33,0,0,12,0,0,252,2,0,0,0,0,0,0,144,30,32,96,0,12,0,0,0,\n 4,0,0,0,0,0,0,0,1,32,0,0,0,0,0,0,17,0,0,0,0,0,0,192,\n 193,61,96,0,12,0,0,0,2,0,0,0,0,0,0,144,64,48,0,0,12,0,0,0,\n 3,0,0,0,0,0,0,24,30,32,0,0,12,0,0,0,2,0,0,0,0,0,0,0,\n 0,4,92,0,0,0,0,0,0,0,0,0,0,0,242,7,192,127,0,0,0,0,0,0,\n 0,0,0,0,0,0,242,31,64,63,0,0,0,0,0,0,0,0,0,3,0,0,160,2,\n 0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0,0,0,0,0,\n 0,0,0,0,0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,\n 0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,28,0,\n 0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,143,32,0,0,0,0,\n 0,120,0,0,0,0,0,0,8,0,0,0,0,0,0,0,96,0,0,0,0,2,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,135,1,4,14,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,9,0,0,0,0,\n 0,0,64,127,229,31,248,159,0,0,0,0,128,0,255,255,1,0,0,0,0,0,0,0,\n 15,0,0,0,0,0,208,23,4,0,0,0,0,248,15,0,3,0,0,0,60,59,0,0,\n 0,0,0,0,64,163,3,0,0,0,0,0,0,240,207,0,0,0,0,0,0,0,0,63,\n 0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,3,0,0,0,0,0,240,255,255,\n 255,255,255,255,255,7,0,1,0,0,0,248,255,255,255,255,255,255,255,255,255,255,255,251,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,\n 3,224,0,224,0,224,0,96,0,248,0,3,144,124,0,0,0,0,0,0,223,255,2,128,\n 0,0,255,31,0,0,0,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,128,0,0,0,0,0,0,0,0,\n 0,0,0,0,255,255,255,255,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,60,62,8,\n 0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,0,0,0,0,0,112,\n 0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,0,16,0,0,0,0,0,0,\n 0,0,0,0,0,128,247,191,0,0,0,240,0,0,0,0,0,0,0,0,0,0,3,0,\n 255,255,255,255,3,0,0,0,0,0,0,0,0,0,1,0,0,7,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,3,68,8,0,0,96,16,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,48,0,0,0,255,255,3,128,0,0,0,0,192,63,0,0,\n 128,255,3,0,0,0,0,0,7,0,0,0,0,0,200,51,0,128,0,0,96,0,0,0,\n 0,0,0,0,0,126,102,0,8,16,0,0,0,0,1,16,0,0,0,0,0,0,157,193,\n 2,0,0,32,0,48,88,0,0,0,0,0,0,0,0,0,0,0,0,248,0,14,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,64,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,255,3,0,0,0,0,0,0,0,\n 255,255,8,0,255,255,0,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,128,128,64,0,4,0,0,0,64,1,0,0,0,0,0,1,0,\n 0,0,0,192,0,0,0,0,0,0,0,0,8,0,0,14,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,240,0,0,0,0,0,135,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,\n 0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 192,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,128,3,0,0,0,0,0,120,38,\n 0,32,0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,8,0,\n 3,0,0,0,0,0,192,127,0,158,0,0,0,0,0,0,0,0,0,0,0,128,211,64,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,248,7,0,0,\n 3,0,0,0,0,0,0,24,1,0,0,0,192,31,31,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,92,0,0,64,0,0,0,0,\n 0,0,0,0,0,0,248,133,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,176,1,0,0,48,0,0,0,0,\n 0,0,0,0,0,0,248,167,1,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,\n 0,0,0,0,0,0,0,0,0,0,0,224,188,15,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,6,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,88,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,240,12,1,0,0,0,254,7,0,0,0,0,248,121,128,0,126,14,0,0,0,0,\n 0,252,127,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,191,\n 0,0,0,0,0,0,0,0,0,0,252,255,255,252,109,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,126,180,191,0,0,0,0,0,0,0,0,0,163,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,255,1,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,31,0,0,0,0,0,0,0,127,0,15,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,128,0,0,0,0,0,0,0,128,255,255,0,0,0,0,0,0,0,0,27,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,15,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,248,255,\n 231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 255,255,255,255,255,255,127,248,255,255,255,255,255,31,32,0,16,0,0,248,254,255,0,0,\n 0,0,0,0,0,0,0,0,127,255,255,249,219,7,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,63,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 240,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n 0,0,0,0,0,0,0,248\n]);\n\n// @ts-ignore: decorator\n@lazy @inline const LOWER127 = memory.data<u8>([\n 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,\n 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,\n 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,\n 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,\n 64,\n 97,98,99,100,101,102,103,104,105,106,107,108,109,\n 110,111,112,113,114,115,116,117,118,119,120,121,122,\n 91,92,93,94,95,96,\n 97,98,99,100,101,102,103,104,105,106,107,108,109,\n 110,111,112,113,114,115,116,117,118,119,120,121,122,\n 123,124,125,126,127\n]);\n\n// @ts-ignore: decorator\n@lazy @inline const UPPER127 = memory.data<u8>([\n 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,\n 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,\n 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,\n 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,\n 64,\n 65,66,67,68,69,70,71,72,73,74,75,76,77,\n 78,79,80,81,82,83,84,85,86,87,88,89,90,\n 91,92,93,94,95,96,\n 65,66,67,68,69,70,71,72,73,74,75,76,77,\n 78,79,80,81,82,83,84,85,86,87,88,89,90,\n 123,124,125,126,127\n]);\n\n// 23 * 8 = 184 bytes\n// @ts-ignore: decorator\n@lazy @inline const POWERS10 = memory.data<f64>([\n 1e00, 1e01, 1e02, 1e03, 1e04, 1e05, 1e06, 1e07, 1e08, 1e09,\n 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,\n 1e20, 1e21, 1e22\n]);\n\n// @ts-ignore: decorator\n@inline\nexport const enum CharCode {\n PERCENT = 0x25,\n PLUS = 0x2B,\n MINUS = 0x2D,\n DOT = 0x2E,\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n A = 0x41,\n B = 0x42,\n E = 0x45,\n I = 0x49,\n N = 0x4E,\n O = 0x4F,\n X = 0x58,\n Z = 0x5A,\n a = 0x61,\n b = 0x62,\n e = 0x65,\n n = 0x6E,\n o = 0x6F,\n u = 0x75,\n x = 0x78,\n z = 0x7A\n}\n\n// @ts-ignore: decorator\n@inline\nexport function isAscii(c: u32): bool {\n return !(c >> 7);\n}\n\n// @ts-ignore: decorator\n@inline\nexport function isLower8(c: u32): bool {\n return c - CharCode.a < 26;\n}\n\n// @ts-ignore: decorator\n@inline\nexport function isUpper8(c: u32): bool {\n return c - CharCode.A < 26;\n}\n\nexport function isSpace(c: u32): bool {\n if (c < 0x1680) { // < <LS> (1)\n // <SP>, <TAB>, <LF>, <VT>, <FF>, <CR> and <NBSP>\n // (c == 0x20 || c == 0xA0) was optimized to (c | 0x80) == 0xA0\n return ((c | 0x80) == 0xA0) || (c - 0x09 <= 0x0D - 0x09);\n }\n if (c - 0x2000 <= 0x200A - 0x2000) return true;\n switch (c) {\n case 0x1680: // <LS> (1)\n case 0x2028: // <LS> (2)\n case 0x2029: // <PS>\n case 0x202F: // <NNS>\n case 0x205F: // <MMSP>\n case 0x3000: // <IS>\n case 0xFEFF: return true; // <ZWNBSP>\n }\n return false;\n}\n\nexport function isAlpha(c: u32): bool {\n if (isAscii(c)) return (c | 32) - CharCode.a < 26;\n if (c < 0x20000) {\n // @ts-ignore: cast\n return stagedBinaryLookup(ALPHA_TABLE, c);\n }\n return c < 0x2FFFE;\n}\n\n// @ts-ignore: decorator\n@inline\nexport function isCased(c: u32): bool {\n // @ts-ignore: cast\n return c < 0x1F18A && stagedBinaryLookup(CASED, c);\n}\n\n// @ts-ignore: decorator\n@inline\nexport function isCaseIgnorable(c: u32): bool {\n // @ts-ignore: cast\n return c < 0xE01F0 && stagedBinaryLookup(CASE_IGNORABLES, c);\n}\n\n// @ts-ignore: decorator\n@inline\nexport function isFinalSigma(buffer: usize, index: isize, len: isize): bool {\n const lookaheadLimit = 30; // max lookahead limit\n let found = false;\n let pos = index;\n let minPos = max(0, pos - lookaheadLimit);\n while (pos > minPos) {\n let c = codePointBefore(buffer, pos);\n if (!isCaseIgnorable(c)) {\n if (isCased(c)) {\n found = true;\n } else {\n return false;\n }\n }\n pos -= isize(c >= 0x10000) + 1;\n }\n if (!found) return false;\n pos = index + 1;\n let maxPos = min(pos + lookaheadLimit, len);\n while (pos < maxPos) {\n let c = <u32>load<u16>(buffer + (pos << 1));\n if (u32((c & 0xFC00) == 0xD800) & u32(pos + 1 != len)) {\n let c1 = <u32>load<u16>(buffer + (pos << 1), 2);\n if ((c1 & 0xFC00) == 0xDC00) {\n c = (c - 0xD800 << 10) + (c1 - 0xDC00) + 0x10000;\n }\n }\n if (!isCaseIgnorable(c)) {\n return !isCased(c);\n }\n pos += isize(c >= 0x10000) + 1;\n }\n return true;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction codePointBefore(buffer: usize, index: isize): i32 {\n if (index <= 0) return -1;\n let c = <u32>load<u16>(buffer + (index - 1 << 1));\n if (u32((c & 0xFC00) == 0xDC00) & u32(index - 2 >= 0)) {\n let c1 = <u32>load<u16>(buffer + (index - 2 << 1));\n if ((c1 & 0xFC00) == 0xD800) {\n return ((c1 & 0x3FF) << 10) + (c & 0x3FF) + 0x10000;\n }\n }\n return (c & 0xF800) == 0xD800 ? 0xFFFD : c;\n}\n\n// Search routine for two-staged lookup tables\nfunction stagedBinaryLookup(table: usize, c: u32): bool {\n return <bool>((load<u8>(table + (<u32>load<u8>(table + (c >>> 8)) << 5) + ((c & 255) >> 3)) >>> (c & 7)) & 1);\n}\n\nexport function compareImpl(str1: string, index1: usize, str2: string, index2: usize, len: usize): i32 {\n let ptr1 = changetype<usize>(str1) + (index1 << 1);\n let ptr2 = changetype<usize>(str2) + (index2 << 1);\n if (ASC_SHRINK_LEVEL < 2) {\n if (len >= 4 && !((ptr1 & 7) | (ptr2 & 7))) {\n do {\n if (load<u64>(ptr1) != load<u64>(ptr2)) break;\n ptr1 += 8;\n ptr2 += 8;\n len -= 4;\n } while (len >= 4);\n }\n }\n while (len--) {\n let a = <i32>load<u16>(ptr1);\n let b = <i32>load<u16>(ptr2);\n if (a != b) return a - b;\n ptr1 += 2;\n ptr2 += 2;\n }\n return 0;\n}\n\n// @ts-ignore: decorator\n@inline\nexport function toLower8(c: u32): u32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return c | u32(isUpper8(c)) << 5;\n } else {\n return <u32>load<u8>(LOWER127 + c);\n }\n}\n\n// @ts-ignore: decorator\n@inline\nexport function toUpper8(c: u32): u32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return c & ~(u32(isLower8(c)) << 5);\n } else {\n return <u32>load<u8>(UPPER127 + c);\n }\n}\n\n/** Parses a string to an integer (usually), using the specified radix. */\nexport function strtol<T>(str: string, radix: i32 = 0): T {\n let len = str.length;\n if (!len) {\n if (isFloat<T>()) {\n // @ts-ignore: cast\n return <T>NaN;\n } else {\n // @ts-ignore: cast\n return <T>0;\n }\n }\n\n let ptr = changetype<usize>(str) /* + HEAD -> offset */;\n let code = <u32>load<u16>(ptr);\n\n // trim white spaces\n while (isSpace(code)) {\n code = <u32>load<u16>(ptr += 2);\n --len;\n }\n // determine sign\n // @ts-ignore\n let sign: T = 1;\n if (code == CharCode.MINUS || code == CharCode.PLUS) {\n if (!--len) {\n if (isFloat<T>()) {\n // @ts-ignore: cast\n return <T>NaN;\n } else {\n // @ts-ignore: cast\n return <T>0;\n }\n }\n if (code == CharCode.MINUS) {\n // @ts-ignore: type\n sign = -1;\n }\n code = <u32>load<u16>(ptr += 2);\n }\n\n // See https://tc39.es/ecma262/#sec-parseint-string-radix\n if (radix) {\n if (radix < 2 || radix > 36) {\n if (isFloat<T>()) {\n // @ts-ignore: cast\n return <T>NaN;\n } else {\n // @ts-ignore: cast\n return <T>0;\n }\n }\n // handle case as parseInt(\"0xFF\", 16) by spec\n if (radix == 16) {\n if (\n len > 2 &&\n code == CharCode._0 &&\n (<u32>load<u16>(ptr, 2) | 32) == CharCode.x\n ) {\n ptr += 4; len -= 2;\n }\n }\n } else {\n // determine radix by literal prefix\n if (code == CharCode._0 && len > 2) {\n switch (<u32>load<u16>(ptr, 2) | 32) {\n case CharCode.b: {\n ptr += 4; len -= 2;\n radix = 2;\n break;\n }\n case CharCode.o: {\n ptr += 4; len -= 2;\n radix = 8;\n break;\n }\n case CharCode.x: {\n ptr += 4; len -= 2;\n radix = 16;\n break;\n }\n }\n }\n if (!radix) radix = 10;\n }\n\n // calculate value\n // @ts-ignore: type\n let num: T = 0;\n let initial = len - 1;\n while (len--) {\n code = <u32>load<u16>(ptr);\n if (code - CharCode._0 < 10) {\n code -= CharCode._0;\n } else if (code - CharCode.A <= <u32>(CharCode.Z - CharCode.A)) {\n code -= CharCode.A - 10;\n } else if (code - CharCode.a <= <u32>(CharCode.z - CharCode.a)) {\n code -= CharCode.a - 10;\n }\n if (code >= <u32>radix) {\n if (initial == len) {\n if (isFloat<T>()) {\n // @ts-ignore: cast\n return <T>NaN;\n } else {\n // @ts-ignore: cast\n return <T>0;\n }\n }\n break;\n }\n // @ts-ignore: type\n num = num * radix + code;\n ptr += 2;\n }\n // @ts-ignore: type\n return sign * num;\n}\n\nexport function strtod(str: string): f64 {\n let len = str.length;\n if (!len) return NaN;\n\n let ptr = changetype<usize>(str);\n let code = <u32>load<u16>(ptr);\n\n let sign = 1.0;\n // skip white spaces\n while (len && isSpace(code)) {\n code = <u32>load<u16>(ptr += 2);\n --len;\n }\n if (!len) return NaN;\n\n // try parse '-' or '+'\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = <u32>load<u16>(ptr += 2);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = <u32>load<u16>(ptr += 2);\n }\n\n // try parse Infinity\n if (len >= 8 && code == CharCode.I) {\n if (\n load<u64>(ptr, 0) == 0x690066006E0049 && // ifnI\n load<u64>(ptr, 8) == 0x7900740069006E // ytin\n ) {\n return Infinity * sign;\n }\n return NaN;\n }\n // validate next symbol\n if (code != CharCode.DOT && <u32>(code - CharCode._0) >= 10) {\n return NaN;\n }\n let savedPtr = ptr;\n // skip zeros\n while (code == CharCode._0) {\n code = <u32>load<u16>(ptr += 2);\n --len;\n }\n if (len <= 0) return 0.0 * sign;\n const capacity = 19; // int(64 * 0.3010)\n let pointed = false;\n let consumed = 0;\n let position = 0;\n let x: u64 = 0;\n if (code == CharCode.DOT) {\n let noDigits = !(savedPtr - ptr);\n ptr += 2; --len;\n if (!len && noDigits) return NaN;\n for (pointed = true; (code = <u32>load<u16>(ptr)) == CharCode._0; --position, ptr += 2) --len;\n if (len <= 0) return 0.0 * sign;\n if (!position && noDigits && code - CharCode._0 >= 10) return NaN;\n }\n for (let digit = code - CharCode._0; digit < 10 || (code == CharCode.DOT && !pointed); digit = code - CharCode._0) {\n if (digit < 10) {\n x = consumed < capacity ? 10 * x + digit : x | u64(!!digit);\n ++consumed;\n } else {\n position = consumed;\n pointed = true;\n }\n if (!--len) break;\n code = <u32>load<u16>(ptr += 2);\n }\n\n if (!pointed) position = consumed;\n return copysign<f64>(scientific(x, position - min(capacity, consumed) + parseExp(ptr, len)), sign);\n}\n\nexport function strtob(str: string): bool {\n let size: usize = str.length << 1;\n let offset: usize = 0;\n if (size > 8) {\n // try trim end whitespaces first\n while (size && isSpace(load<u16>(changetype<usize>(str) + size - 2))) size -= 2;\n if (size > 8) {\n // trim start whitespaces\n while (offset < size && isSpace(load<u16>(changetype<usize>(str) + offset))) offset += 2;\n size -= offset;\n }\n }\n if (size != 8) return false;\n // \"true\" represents as \\00\\e\\00\\u\\00\\e\\00\\t (00 65 00 75 00 72 00 74)\n return load<u64>(changetype<usize>(str) + offset) == 0x0065_0075_0072_0074;\n}\n\nexport function joinBooleanArray(dataStart: usize, length: i32, separator: string): string {\n let lastIndex = length - 1;\n if (lastIndex < 0) return \"\";\n if (!lastIndex) return select(\"true\", \"false\", load<bool>(dataStart));\n\n let sepLen = separator.length;\n let valueLen = 5; // max possible length of element len(\"false\")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = changetype<string>(__new(estLen << 1, idof<string>()));\n let offset = 0;\n let value: bool;\n for (let i = 0; i < lastIndex; ++i) {\n value = load<bool>(dataStart + i);\n valueLen = 4 + i32(!value);\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(select(\"true\", \"false\", value)),\n <usize>valueLen << 1\n );\n offset += valueLen;\n if (sepLen) {\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(separator),\n <usize>sepLen << 1\n );\n offset += sepLen;\n }\n }\n value = load<bool>(dataStart + <usize>lastIndex);\n valueLen = 4 + i32(!value);\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(select(\"true\", \"false\", value)),\n valueLen << 1\n );\n offset += valueLen;\n\n if (estLen > offset) return result.substring(0, offset);\n return result;\n}\n\nexport function joinIntegerArray<T>(dataStart: usize, length: i32, separator: string): string {\n let lastIndex = length - 1;\n if (lastIndex < 0) return \"\";\n if (!lastIndex) {\n let value = load<T>(dataStart);\n if (isSigned<T>()) {\n if (sizeof<T>() <= 4) {\n // @ts-ignore: type\n return changetype<string>(itoa32(<i32>value, 10));\n } else {\n // @ts-ignore: type\n return changetype<string>(itoa64(<i32>value, 10));\n }\n } else {\n if (sizeof<T>() <= 4) {\n // @ts-ignore: type\n return changetype<string>(utoa32(<u32>value, 10));\n } else {\n // @ts-ignore: type\n return changetype<string>(utoa64(<u64>value, 10));\n }\n }\n }\n\n let sepLen = separator.length;\n const valueLen = (sizeof<T>() <= 4 ? 10 : 20) + i32(isSigned<T>());\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = changetype<string>(__new(estLen << 1, idof<string>()));\n let offset = 0;\n let value: T;\n for (let i = 0; i < lastIndex; ++i) {\n value = load<T>(dataStart + (<usize>i << alignof<T>()));\n // @ts-ignore: type\n offset += itoa_buffered<T>(changetype<usize>(result) + (<usize>offset << 1), value);\n if (sepLen) {\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(separator),\n <usize>sepLen << 1\n );\n offset += sepLen;\n }\n }\n value = load<T>(dataStart + (<usize>lastIndex << alignof<T>()));\n // @ts-ignore: type\n offset += itoa_buffered<T>(changetype<usize>(result) + (<usize>offset << 1), value);\n if (estLen > offset) return result.substring(0, offset);\n return result;\n}\n\nexport function joinFloatArray<T>(dataStart: usize, length: i32, separator: string): string {\n let lastIndex = length - 1;\n if (lastIndex < 0) return \"\";\n if (!lastIndex) {\n return changetype<string>(dtoa(\n // @ts-ignore: type\n load<T>(dataStart))\n );\n }\n\n const valueLen = MAX_DOUBLE_LENGTH;\n let sepLen = separator.length;\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = changetype<string>(__new(estLen << 1, idof<string>()));\n let offset = 0;\n let value: T;\n for (let i = 0; i < lastIndex; ++i) {\n value = load<T>(dataStart + (<usize>i << alignof<T>()));\n // @ts-ignore: type\n offset += dtoa_buffered(changetype<usize>(result) + (<usize>offset << 1), value);\n if (sepLen) {\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(separator),\n <usize>sepLen << 1\n );\n offset += sepLen;\n }\n }\n value = load<T>(dataStart + (<usize>lastIndex << alignof<T>()));\n // @ts-ignore: type\n offset += dtoa_buffered(changetype<usize>(result) + (<usize>offset << 1), value);\n if (estLen > offset) return result.substring(0, offset);\n return result;\n}\n\nexport function joinStringArray(dataStart: usize, length: i32, separator: string): string {\n let lastIndex = length - 1;\n if (lastIndex < 0) return \"\";\n if (!lastIndex) {\n // @ts-ignore: type\n return load<string>(dataStart) || \"\";\n }\n let estLen = 0;\n let value: string;\n for (let i = 0; i < length; ++i) {\n value = load<string>(dataStart + (<usize>i << alignof<string>()));\n if (changetype<usize>(value) != 0) estLen += value.length;\n }\n let offset = 0;\n let sepLen = separator.length;\n let result = changetype<string>(__new((estLen + sepLen * lastIndex) << 1, idof<string>()));\n for (let i = 0; i < lastIndex; ++i) {\n value = load<string>(dataStart + (<usize>i << alignof<string>()));\n if (changetype<usize>(value) != 0) {\n let valueLen = value.length;\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(value),\n <usize>valueLen << 1\n );\n offset += valueLen;\n }\n if (sepLen) {\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(separator),\n <usize>sepLen << 1\n );\n offset += sepLen;\n }\n }\n value = load<string>(dataStart + (<usize>lastIndex << alignof<string>()));\n if (changetype<usize>(value) != 0) {\n memory.copy(\n changetype<usize>(result) + (<usize>offset << 1),\n changetype<usize>(value),\n <usize>value.length << 1\n );\n }\n return result;\n}\n\nexport function joinReferenceArray<T>(dataStart: usize, length: i32, separator: string): string {\n let lastIndex = length - 1;\n if (lastIndex < 0) return \"\";\n let value: T;\n if (!lastIndex) {\n value = load<T>(dataStart);\n // @ts-ignore: type\n return value != null ? value.toString() : \"\";\n }\n let result = \"\";\n let sepLen = separator.length;\n for (let i = 0; i < lastIndex; ++i) {\n value = load<T>(dataStart + (<usize>i << alignof<T>()));\n // @ts-ignore: type\n if (value != null) result += value.toString();\n if (sepLen) result += separator;\n }\n value = load<T>(dataStart + (<usize>lastIndex << alignof<T>()));\n // @ts-ignore: type\n if (value != null) result += value.toString();\n return result;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction scientific(significand: u64, exp: i32): f64 {\n if (!significand || exp < -342) return 0;\n if (exp > 308) return Infinity;\n // Try use fast path\n // Use fast path for string-to-double conversion if possible\n // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion\n // Simple integer\n let significandf = <f64>significand;\n if (!exp) return significandf;\n if (exp > 22 && exp <= 22 + 15) {\n significandf *= pow10(exp - 22);\n exp = 22;\n }\n if (significand <= 9007199254740991 && abs(exp) <= 22) {\n if (exp > 0) return significandf * pow10(exp);\n return significandf / pow10(-exp);\n } else if (exp < 0) {\n return scaledown(significand, exp);\n } else {\n return scaleup(significand, exp);\n }\n}\n\n// Adopted from metallic lib:\n// https://github.com/jdh8/metallic/blob/master/src/stdlib/parse/scientific.h\n// @ts-ignore: decorator\n@inline\nfunction scaledown(significand: u64, exp: i32): f64 {\n const denom: u64 = 6103515625; // 1e14 * 0x1p-14\n const scale = reinterpret<f64>(0x3F06849B86A12B9B); // 1e-14 * 0x1p32\n\n let shift = clz(significand);\n significand <<= shift;\n shift = exp - shift;\n\n for (; exp <= -14; exp += 14) {\n let q = significand / denom;\n let r = significand % denom;\n let s = clz(q);\n significand = (q << s) + <u64>nearest(scale * <f64>(r << (s - 18)));\n shift -= s;\n }\n let b = <u64>ipow32(5, -exp);\n let q = significand / b;\n let r = significand % b;\n let s = clz(q);\n significand = (q << s) + <u64>(reinterpret<f64>(reinterpret<u64>(<f64>r) + (s << 52)) / <f64>b);\n shift -= s;\n\n return NativeMath.scalbn(<f64>significand, <i32>shift);\n}\n\n// Adopted from metallic lib:\n// https://github.com/jdh8/metallic/blob/master/src/stdlib/parse/scientific.h\n// @ts-ignore: decorator\n@inline\nfunction scaleup(significand: u64, exp: i32): f64 {\n const coeff: u32 = 1220703125; // 1e13 * 0x1p-13;\n let shift = ctz(significand);\n significand >>= shift;\n shift += exp;\n\n __fixmulShift = shift;\n for (; exp >= 13; exp -= 13) {\n significand = fixmul(significand, coeff);\n }\n significand = fixmul(significand, <u32>ipow32(5, exp));\n shift = __fixmulShift;\n return NativeMath.scalbn(<f64>significand, <i32>shift);\n}\n\n// Adopted from metallic lib:\n// https://github.com/jdh8/metallic/blob/master/src/stdlib/parse/scientific.h\n// @ts-ignore: decorator\n@inline\nfunction parseExp(ptr: usize, len: i32): i32 {\n let sign = 1, magnitude = 0;\n let code = <u32>load<u16>(ptr);\n // check code is 'e' or 'E'\n if ((code | 32) != CharCode.e) return 0;\n\n if (!--len) return 0;\n code = <u32>load<u16>(ptr += 2);\n if (code == CharCode.MINUS) {\n if (!--len) return 0;\n code = <u32>load<u16>(ptr += 2);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return 0;\n code = <u32>load<u16>(ptr += 2);\n }\n // skip zeros\n while (code == CharCode._0) {\n if (!--len) return 0;\n code = <u32>load<u16>(ptr += 2);\n }\n for (let digit: u32 = code - CharCode._0; len && digit < 10; digit = code - CharCode._0) {\n if (magnitude >= 3200) return sign * 3200;\n magnitude = 10 * magnitude + digit;\n code = <u32>load<u16>(ptr += 2);\n --len;\n }\n return sign * magnitude;\n}\n\n// @ts-ignore: decorator\n@lazy let __fixmulShift: u64 = 0;\n\n// Adopted from metallic lib:\n// https://github.com/jdh8/metallic/blob/master/src/stdlib/parse/scientific.h\n// @ts-ignore: decorator\n@inline\nfunction fixmul(a: u64, b: u32): u64 {\n let low = (a & 0xFFFFFFFF) * b;\n let high = (a >> 32) * b + (low >> 32);\n let overflow = <u32>(high >> 32);\n let space = clz(overflow);\n let revspace: u64 = 32 - space;\n __fixmulShift += revspace;\n return (high << space | (low & 0xFFFFFFFF) >> revspace) + (low << space >> 31 & 1);\n}\n\n// @ts-ignore: decorator\n@inline\nfunction pow10(n: i32): f64 {\n // argument `n` should bounds in [0, 22] range\n return load<f64>(POWERS10 + (n << alignof<f64>()));\n}\n","import { Math as JSMath } from \"./bindings/dom\";\nexport { JSMath };\n\nimport {\n pow_lut, exp_lut, exp2_lut, log_lut, log2_lut,\n powf_lut, expf_lut, exp2f_lut, logf_lut, log2f_lut\n} from \"./util/math\";\n\nimport {\n abs as builtin_abs,\n ceil as builtin_ceil,\n clz as builtin_clz,\n copysign as builtin_copysign,\n floor as builtin_floor,\n max as builtin_max,\n min as builtin_min,\n sqrt as builtin_sqrt,\n trunc as builtin_trunc\n} from \"./builtins\";\n\n// SUN COPYRIGHT NOTICE\n//\n// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n// Developed at SunPro, a Sun Microsystems, Inc. business.\n// Permission to use, copy, modify, and distribute this software\n// is freely granted, provided that this notice is preserved.\n//\n// Applies to all functions marked with a comment referring here.\n\n/** @internal */\n// @ts-ignore: decorator\n@lazy let rempio2_y0: f64, rempio2_y1: f64, res128_hi: u64;\n\n/** @internal */\n// @ts-ignore: decorator\n@lazy @inline const PIO2_TABLE = memory.data<u64>([\n 0x00000000A2F9836E, 0x4E441529FC2757D1, 0xF534DDC0DB629599, 0x3C439041FE5163AB,\n 0xDEBBC561B7246E3A, 0x424DD2E006492EEA, 0x09D1921CFE1DEB1C, 0xB129A73EE88235F5,\n 0x2EBB4484E99C7026, 0xB45F7E413991D639, 0x835339F49C845F8B, 0xBDF9283B1FF897FF,\n 0xDE05980FEF2F118B, 0x5A0A6D1F6D367ECF, 0x27CB09B74F463F66, 0x9E5FEA2D7527BAC7,\n 0xEBE5F17B3D0739F7, 0x8A5292EA6BFB5FB1, 0x1F8D5D0856033046, 0xFC7B6BABF0CFBC20,\n 0x9AF4361DA9E39161, 0x5EE61B086599855F, 0x14A068408DFFD880, 0x4D73273106061557\n]);\n\n/** @internal */\nfunction R(z: f64): f64 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret<f64>(0x3FC5555555555555), // 1.66666666666666657415e-01\n pS1 = reinterpret<f64>(0xBFD4D61203EB6F7D), // -3.25565818622400915405e-01\n pS2 = reinterpret<f64>(0x3FC9C1550E884455), // 2.01212532134862925881e-01\n pS3 = reinterpret<f64>(0xBFA48228B5688F3B), // -4.00555345006794114027e-02\n pS4 = reinterpret<f64>(0x3F49EFE07501B288), // 7.91534994289814532176e-04\n pS5 = reinterpret<f64>(0x3F023DE10DFDF709), // 3.47933107596021167570e-05\n qS1 = reinterpret<f64>(0xC0033A271C8A2D4B), // -2.40339491173441421878e+00\n qS2 = reinterpret<f64>(0x40002AE59C598AC8), // 2.02094576023350569471e+00\n qS3 = reinterpret<f64>(0xBFE6066C1B8D0159), // -6.88283971605453293030e-01\n qS4 = reinterpret<f64>(0x3FB3B8C5B12E9282); // 7.70381505559019352791e-02\n\n let p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));\n let q = 1.0 + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));\n return p / q;\n}\n\n/** @internal */\n// @ts-ignore: decorator\n@inline\nfunction expo2(x: f64, sign: f64): f64 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2.c\n k = <u32>2043,\n kln2 = reinterpret<f64>(0x40962066151ADD8B); // 0x1.62066151add8bp+10\n let scale = reinterpret<f64>(<u64>((<u32>0x3FF + k / 2) << 20) << 32);\n // in directed rounding correct sign before rounding or overflow is important\n return NativeMath.exp(x - kln2) * (sign * scale) * scale;\n}\n\n/** @internal */\n/* Helper function to eventually get bits of π/2 * |x|\n *\n * y = π/4 * (frac << clz(frac) >> 11)\n * return clz(frac)\n *\n * Right shift 11 bits to make upper half fit in `double`\n */\n// @ts-ignore: decorator\n@inline\nfunction pio2_right(q0: u64, q1: u64): u64 { // see: jdh8/metallic/blob/master/src/math/double/rem_pio2.c\n // Bits of π/4\n const p0: u64 = 0xC4C6628B80DC1CD1;\n const p1: u64 = 0xC90FDAA22168C234;\n\n const Ox1p_64 = reinterpret<f64>(0x3BF0000000000000); // 0x1p-64\n const Ox1p_75 = reinterpret<f64>(0x3B40000000000000); // 0x1p-75\n\n let shift = clz(q1);\n\n q1 = q1 << shift | q0 >> (64 - shift);\n q0 <<= shift;\n\n let lo = umuldi(p1, q1);\n let hi = res128_hi;\n\n let ahi = hi >> 11;\n let alo = lo >> 11 | hi << 53;\n let blo = <u64>(Ox1p_75 * <f64>p0 * <f64>q1 + Ox1p_75 * <f64>p1 * <f64>q0);\n\n rempio2_y0 = <f64>(ahi + u64(lo < blo));\n rempio2_y1 = Ox1p_64 * <f64>(alo + blo);\n\n return shift;\n}\n\n/** @internal */\n// @ts-ignore: decorator\n@inline\nfunction umuldi(u: u64, v: u64): u64 {\n let u1: u64 , v1: u64, w0: u64, w1: u64, t: u64;\n\n u1 = u & 0xFFFFFFFF;\n v1 = v & 0xFFFFFFFF;\n\n u >>= 32;\n v >>= 32;\n\n t = u1 * v1;\n w0 = t & 0xFFFFFFFF;\n t = u * v1 + (t >> 32);\n w1 = t >> 32;\n t = u1 * v + (t & 0xFFFFFFFF);\n\n res128_hi = u * v + w1 + (t >> 32);\n return (t << 32) + w0;\n}\n\n/** @internal */\nfunction pio2_large_quot(x: f64, u: i64): i32 { // see: jdh8/metallic/blob/master/src/math/double/rem_pio2.c\n let magnitude = u & 0x7FFFFFFFFFFFFFFF;\n let offset = (magnitude >> 52) - 1045;\n let shift = offset & 63;\n let tblPtr = PIO2_TABLE + (<i32>(offset >> 6) << 3);\n let s0: u64, s1: u64, s2: u64;\n\n let b0 = load<u64>(tblPtr, 0 << 3);\n let b1 = load<u64>(tblPtr, 1 << 3);\n let b2 = load<u64>(tblPtr, 2 << 3);\n\n // Get 192 bits of 0x1p-31 / π with `offset` bits skipped\n if (shift) {\n let rshift = 64 - shift;\n let b3 = load<u64>(tblPtr, 3 << 3);\n s0 = b1 >> rshift | b0 << shift;\n s1 = b2 >> rshift | b1 << shift;\n s2 = b3 >> rshift | b2 << shift;\n } else {\n s0 = b0;\n s1 = b1;\n s2 = b2;\n }\n\n let significand = (u & 0x000FFFFFFFFFFFFF) | 0x0010000000000000;\n\n // First 128 bits of fractional part of x/(2π)\n let blo = umuldi(s1, significand);\n let bhi = res128_hi;\n\n let ahi = s0 * significand;\n let clo = (s2 >> 32) * (significand >> 32);\n let plo = blo + clo;\n let phi = ahi + bhi + u64(plo < clo);\n\n // r: u128 = p << 2\n let rlo = plo << 2;\n let rhi = phi << 2 | plo >> 62;\n\n // s: i128 = r >> 127\n let slo = <i64>rhi >> 63;\n let shi = slo >> 1;\n let q = (<i64>phi >> 62) - slo;\n\n let shifter = 0x3CB0000000000000 - (pio2_right(rlo ^ slo, rhi ^ shi) << 52);\n let signbit = (u ^ rhi) & 0x8000000000000000;\n let coeff = reinterpret<f64>(shifter | signbit);\n\n rempio2_y0 *= coeff;\n rempio2_y1 *= coeff;\n\n return <i32>q;\n}\n\n/** @internal */\n// @ts-ignore: decorator\n@inline\nfunction rempio2(x: f64, u: u64, sign: i32): i32 {\n const\n pio2_1 = reinterpret<f64>(0x3FF921FB54400000), // 1.57079632673412561417e+00\n pio2_1t = reinterpret<f64>(0x3DD0B4611A626331), // 6.07710050650619224932e-11\n pio2_2 = reinterpret<f64>(0x3DD0B4611A600000), // 6.07710050630396597660e-11\n pio2_2t = reinterpret<f64>(0x3BA3198A2E037073), // 2.02226624879595063154e-21\n pio2_3 = reinterpret<f64>(0x3BA3198A2E000000), // 2.02226624871116645580e-21\n pio2_3t = reinterpret<f64>(0x397B839A252049C1), // 8.47842766036889956997e-32\n invpio2 = reinterpret<f64>(0x3FE45F306DC9C883); // 0.63661977236758134308\n\n let ix = <u32>(u >> 32) & 0x7FFFFFFF;\n\n if (ASC_SHRINK_LEVEL < 1) {\n if (ix < 0x4002D97C) { // |x| < 3pi/4, special case with n=+-1\n let q = 1, z: f64, y0: f64, y1: f64;\n if (!sign) {\n z = x - pio2_1;\n if (ix != 0x3FF921FB) { // 33+53 bit pi is good enough\n y0 = z - pio2_1t;\n y1 = (z - y0) - pio2_1t;\n } else { // near pi/2, use 33+33+53 bit pi\n z -= pio2_2;\n y0 = z - pio2_2t;\n y1 = (z - y0) - pio2_2t;\n }\n } else { // negative x\n z = x + pio2_1;\n if (ix != 0x3FF921FB) { // 33+53 bit pi is good enough\n y0 = z + pio2_1t;\n y1 = (z - y0) + pio2_1t;\n } else { // near pi/2, use 33+33+53 bit pi\n z += pio2_2;\n y0 = z + pio2_2t;\n y1 = (z - y0) + pio2_2t;\n }\n q = -1;\n }\n rempio2_y0 = y0;\n rempio2_y1 = y1;\n return q;\n }\n }\n\n if (ix < 0x413921FB) { // |x| ~< 2^20*pi/2 (1647099)\n // Use precise Cody Waite scheme\n let q = nearest(x * invpio2);\n let r = x - q * pio2_1;\n let w = q * pio2_1t; // 1st round good to 85 bit\n let j = ix >> 20;\n let y0 = r - w;\n let hi = <u32>(reinterpret<u64>(y0) >> 32);\n let i = j - ((hi >> 20) & 0x7FF);\n\n if (i > 16) { // 2nd iteration needed, good to 118\n let t = r;\n w = q * pio2_2;\n r = t - w;\n w = q * pio2_2t - ((t - r) - w);\n y0 = r - w;\n hi = <u32>(reinterpret<u64>(y0) >> 32);\n i = j - ((hi >> 20) & 0x7FF);\n if (i > 49) { // 3rd iteration need, 151 bits acc\n let t = r;\n w = q * pio2_3;\n r = t - w;\n w = q * pio2_3t - ((t - r) - w);\n y0 = r - w;\n }\n }\n let y1 = (r - y0) - w;\n rempio2_y0 = y0;\n rempio2_y1 = y1;\n return <i32>q;\n }\n let q = pio2_large_quot(x, u);\n return select(-q, q, sign);\n}\n\n/** @internal */\n// @ts-ignore: decorator\n@inline\nfunction sin_kern(x: f64, y: f64, iy: i32): f64 { // see: musl/tree/src/math/__sin.c\n const\n S1 = reinterpret<f64>(0xBFC5555555555549), // -1.66666666666666324348e-01\n S2 = reinterpret<f64>(0x3F8111111110F8A6), // 8.33333333332248946124e-03\n S3 = reinterpret<f64>(0xBF2A01A019C161D5), // -1.98412698298579493134e-04\n S4 = reinterpret<f64>(0x3EC71DE357B1FE7D), // 2.75573137070700676789e-06\n S5 = reinterpret<f64>(0xBE5AE5E68A2B9CEB), // -2.50507602534068634195e-08\n S6 = reinterpret<f64>(0x3DE5D93A5ACFD57C); // 1.58969099521155010221e-10\n\n let z = x * x;\n let w = z * z;\n let r = S2 + z * (S3 + z * S4) + z * w * (S5 + z * S6);\n let v = z * x;\n if (!iy) {\n return x + v * (S1 + z * r);\n } else {\n return x - ((z * (0.5 * y - v * r) - y) - v * S1);\n }\n}\n\n/** @internal */\n// @ts-ignore: decorator\n@inline\nfunction cos_kern(x: f64, y: f64): f64 { // see: musl/tree/src/math/__cos.c\n const\n C1 = reinterpret<f64>(0x3FA555555555554C), // 4.16666666666666019037e-02\n C2 = reinterpret<f64>(0xBF56C16C16C15177), // -1.38888888888741095749e-03\n C3 = reinterpret<f64>(0x3EFA01A019CB1590), // 2.48015872894767294178e-05\n C4 = reinterpret<f64>(0xBE927E4F809C52AD), // -2.75573143513906633035e-07\n C5 = reinterpret<f64>(0x3E21EE9EBDB4B1C4), // 2.08757232129817482790e-09\n C6 = reinterpret<f64>(0xBDA8FAE9BE8838D4); // -1.13596475577881948265e-11\n\n let z = x * x;\n let w = z * z;\n let r = z * (C1 + z * (C2 + z * C3)) + w * w * (C4 + z * (C5 + z * C6));\n let hz = 0.5 * z;\n w = 1.0 - hz;\n return w + (((1.0 - w) - hz) + (z * r - x * y));\n}\n\n/** @internal */\nfunction tan_kern(x: f64, y: f64, iy: i32): f64 { // see: src/lib/msun/src/k_tan.c\n const\n T0 = reinterpret<f64>(0x3FD5555555555563), // 3.33333333333334091986e-01\n T1 = reinterpret<f64>(0x3FC111111110FE7A), // 1.33333333333201242699e-01\n T2 = reinterpret<f64>(0x3FABA1BA1BB341FE), // 5.39682539762260521377e-02\n T3 = reinterpret<f64>(0x3F9664F48406D637), // 2.18694882948595424599e-02\n T4 = reinterpret<f64>(0x3F8226E3E96E8493), // 8.86323982359930005737e-03\n T5 = reinterpret<f64>(0x3F6D6D22C9560328), // 3.59207910759131235356e-03\n T6 = reinterpret<f64>(0x3F57DBC8FEE08315), // 1.45620945432529025516e-03\n T7 = reinterpret<f64>(0x3F4344D8F2F26501), // 5.88041240820264096874e-04\n T8 = reinterpret<f64>(0x3F3026F71A8D1068), // 2.46463134818469906812e-04\n T9 = reinterpret<f64>(0x3F147E88A03792A6), // 7.81794442939557092300e-05\n T10 = reinterpret<f64>(0x3F12B80F32F0A7E9), // 7.14072491382608190305e-05\n T11 = reinterpret<f64>(0xBEF375CBDB605373), // -1.85586374855275456654e-05\n T12 = reinterpret<f64>(0x3EFB2A7074BF7AD4); // 2.59073051863633712884e-05\n\n const\n one = reinterpret<f64>(0x3FF0000000000000), // 1.00000000000000000000e+00\n pio4 = reinterpret<f64>(0x3FE921FB54442D18), // 7.85398163397448278999e-01\n pio4lo = reinterpret<f64>(0x3C81A62633145C07); // 3.06161699786838301793e-17\n\n let z: f64, r: f64, v: f64, w: f64, s: f64;\n let hx = <i32>(reinterpret<u64>(x) >> 32); // high word of x\n let ix = hx & 0x7FFFFFFF; // high word of |x|\n let big = ix >= 0x3FE59428;\n if (big) { // |x| >= 0.6744\n if (hx < 0) { x = -x, y = -y; }\n z = pio4 - x;\n w = pio4lo - y;\n x = z + w;\n y = 0.0;\n }\n z = x * x;\n w = z * z;\n r = T1 + w * (T3 + w * (T5 + w * (T7 + w * (T9 + w * T11))));\n v = z * (T2 + w * (T4 + w * (T6 + w * (T8 + w * (T10 + w * T12)))));\n s = z * x;\n r = y + z * (s * (r + v) + y);\n r += T0 * s;\n w = x + r;\n if (big) {\n v = iy;\n return (1 - ((hx >> 30) & 2)) * (v - 2.0 * (x - (w * w / (w + v) - r)));\n }\n if (iy == 1) return w;\n let a: f64, t: f64;\n z = w;\n z = reinterpret<f64>(reinterpret<u64>(z) & 0xFFFFFFFF00000000);\n v = r - (z - x); // z + v = r + x\n t = a = -one / w; // a = -1.0 / w\n t = reinterpret<f64>(reinterpret<u64>(t) & 0xFFFFFFFF00000000);\n s = one + t * z;\n return t + a * (s + t * v);\n}\n\n/** @internal */\nfunction dtoi32(x: f64): i32 {\n if (ASC_SHRINK_LEVEL > 0) {\n const inv32 = 1.0 / 4294967296;\n return <i32><i64>(x - 4294967296 * floor(x * inv32));\n } else {\n let result = 0;\n let u = reinterpret<u64>(x);\n let e = (u >> 52) & 0x7FF;\n if (e <= 1023 + 30) {\n result = <i32>x;\n } else if (e <= 1023 + 30 + 53) {\n let v = (u & ((<u64>1 << 52) - 1)) | (<u64>1 << 52);\n v = v << e - 1023 - 52 + 32;\n result = <i32>(v >> 32);\n result = select<i32>(-result, result, <i64>u < 0);\n }\n return result;\n }\n}\n\n// @ts-ignore: decorator\n@lazy let random_seeded = false;\n\n// @ts-ignore: decorator\n@lazy let random_state0_64: u64, random_state1_64: u64;\n\n// @ts-ignore: decorator\n@lazy let random_state0_32: u32, random_state1_32: u32;\n\nfunction murmurHash3(h: u64): u64 { // Force all bits of a hash block to avalanche\n h ^= h >> 33; // see: https://github.com/aappleby/smhasher\n h *= 0xFF51AFD7ED558CCD;\n h ^= h >> 33;\n h *= 0xC4CEB9FE1A85EC53;\n h ^= h >> 33;\n return h;\n}\n\nfunction splitMix32(h: u32): u32 {\n h += 0x6D2B79F5;\n h = (h ^ (h >> 15)) * (h | 1);\n h ^= h + (h ^ (h >> 7)) * (h | 61);\n return h ^ (h >> 14);\n}\n\nexport namespace NativeMath {\n\n // @ts-ignore: decorator\n @lazy\n export const E = reinterpret<f64>(0x4005BF0A8B145769); // 2.7182818284590452354\n\n // @ts-ignore: decorator\n @lazy\n export const LN2 = reinterpret<f64>(0x3FE62E42FEFA39EF); // 0.69314718055994530942\n\n // @ts-ignore: decorator\n @lazy\n export const LN10 = reinterpret<f64>(0x40026BB1BBB55516); // 2.30258509299404568402\n\n // @ts-ignore: decorator\n @lazy\n export const LOG2E = reinterpret<f64>(0x3FF71547652B82FE); // 1.4426950408889634074\n\n // @ts-ignore: decorator\n @lazy\n export const LOG10E = reinterpret<f64>(0x3FDBCB7B1526E50E); // 0.43429448190325182765\n\n // @ts-ignore: decorator\n @lazy\n export const PI = reinterpret<f64>(0x400921FB54442D18); // 3.14159265358979323846\n\n // @ts-ignore: decorator\n @lazy\n export const SQRT1_2 = reinterpret<f64>(0x3FE6A09E667F3BCD); // 0.70710678118654752440\n\n // @ts-ignore: decorator\n @lazy\n export const SQRT2 = reinterpret<f64>(0x3FF6A09E667F3BCD); // 1.41421356237309504880\n\n // @ts-ignore: decorator\n @lazy\n export let sincos_sin: f64 = 0;\n\n // @ts-ignore: decorator\n @lazy\n export let sincos_cos: f64 = 0;\n\n // @ts-ignore: decorator\n @inline export function abs(x: f64): f64 {\n return builtin_abs<f64>(x);\n }\n\n export function acos(x: f64): f64 { // see: musl/src/math/acos.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret<f64>(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret<f64>(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret<f32>(0x03800000);\n\n let hx = <u32>(reinterpret<u64>(x) >> 32);\n let ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = <u32>reinterpret<u64>(x);\n if ((ix - 0x3FF00000 | lx) == 0) {\n if (<i32>hx < 0) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix <= 0x3C600000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * R(x * x)));\n }\n let s: f64, w: f64, z: f64;\n if (<i32>hx < 0) {\n // z = (1.0 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt<f64>(z);\n w = R(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1.0 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt<f64>(z);\n let df = reinterpret<f64>(reinterpret<u64>(s) & 0xFFFFFFFF00000000);\n let c = (z - df * df) / (s + df);\n w = R(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f64): f64 { // see: musl/src/math/acosh.c\n const s = reinterpret<f64>(0x3FE62E42FEFA39EF);\n let u = reinterpret<u64>(x);\n // Prevent propagation for all input values less than 1.0.\n // Note musl lib didn't fix this yet.\n if (<i64>u < 0x3FF0000000000000) return (x - x) / 0.0;\n let e = u >> 52 & 0x7FF;\n if (e < 0x3FF + 1) return log1p(x - 1 + builtin_sqrt<f64>((x - 1) * (x - 1) + 2 * (x - 1)));\n if (e < 0x3FF + 26) return log(2 * x - 1 / (x + builtin_sqrt<f64>(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f64): f64 { // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret<f64>(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret<f64>(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret<f32>(0x03800000);\n\n let hx = <u32>(reinterpret<u64>(x) >> 32);\n let ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = <u32>reinterpret<u64>(x);\n if ((ix - 0x3FF00000 | lx) == 0) return x * pio2_hi + Ox1p_120f;\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix < 0x3E500000 && ix >= 0x00100000) return x;\n return x + x * R(x * x);\n }\n // let z = (1.0 - builtin_abs<f64>(x)) * 0.5;\n let z = 0.5 - builtin_abs<f64>(x) * 0.5;\n let s = builtin_sqrt<f64>(z);\n let r = R(z);\n if (ix >= 0x3FEF3333) x = pio2_hi - (2 * (s + s * r) - pio2_lo);\n else {\n let f = reinterpret<f64>(reinterpret<u64>(s) & 0xFFFFFFFF00000000);\n let c = (z - f * f) / (s + f);\n x = 0.5 * pio2_hi - (2 * s * r - (pio2_lo - 2 * c) - (0.5 * pio2_hi - 2 * f));\n }\n return select(-x, x, <i32>hx < 0);\n }\n\n export function asinh(x: f64): f64 { // see: musl/src/math/asinh.c\n const c = reinterpret<f64>(0x3FE62E42FEFA39EF); // 0.693147180559945309417232121458176568\n let u = reinterpret<u64>(x);\n let e = u >> 52 & 0x7FF;\n let y = reinterpret<f64>(u & 0x7FFFFFFFFFFFFFFF);\n if (e >= 0x3FF + 26) y = log(y) + c;\n else if (e >= 0x3FF + 1) y = log(2 * y + 1 / (builtin_sqrt<f64>(y * y + 1) + y));\n else if (e >= 0x3FF - 26) y = log1p(y + y * y / (builtin_sqrt<f64>(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f64): f64 { // see musl/src/math/atan.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret<f64>(0x3FDDAC670561BB4F), // 4.63647609000806093515e-01\n atanhi1 = reinterpret<f64>(0x3FE921FB54442D18), // 7.85398163397448278999e-01\n atanhi2 = reinterpret<f64>(0x3FEF730BD281F69B), // 9.82793723247329054082e-01\n atanhi3 = reinterpret<f64>(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n atanlo0 = reinterpret<f64>(0x3C7A2B7F222F65E2), // 2.26987774529616870924e-17\n atanlo1 = reinterpret<f64>(0x3C81A62633145C07), // 3.06161699786838301793e-17\n atanlo2 = reinterpret<f64>(0x3C7007887AF0CBBD), // 1.39033110312309984516e-17\n atanlo3 = reinterpret<f64>(0x3C91A62633145C07), // 6.12323399573676603587e-17\n aT0 = reinterpret<f64>(0x3FD555555555550D), // 3.33333333333329318027e-01\n aT1 = reinterpret<f64>(0xBFC999999998EBC4), // -1.99999999998764832476e-01\n aT2 = reinterpret<f64>(0x3FC24924920083FF), // 1.42857142725034663711e-01\n aT3 = reinterpret<f64>(0xBFBC71C6FE231671), // -1.11111104054623557880e-01,\n aT4 = reinterpret<f64>(0x3FB745CDC54C206E), // 9.09088713343650656196e-02\n aT5 = reinterpret<f64>(0xBFB3B0F2AF749A6D), // -7.69187620504482999495e-02\n aT6 = reinterpret<f64>(0x3FB10D66A0D03D51), // 6.66107313738753120669e-02\n aT7 = reinterpret<f64>(0xBFADDE2D52DEFD9A), // -5.83357013379057348645e-02\n aT8 = reinterpret<f64>(0x3FA97B4B24760DEB), // 4.97687799461593236017e-02\n aT9 = reinterpret<f64>(0xBFA2B4442C6A6C2F), // -3.65315727442169155270e-02\n aT10 = reinterpret<f64>(0x3F90AD3AE322DA11), // 1.62858201153657823623e-02\n Ox1p_120f = reinterpret<f32>(0x03800000);\n\n let ix = <u32>(reinterpret<u64>(x) >> 32);\n let sx = x;\n ix &= 0x7FFFFFFF;\n let z: f64;\n if (ix >= 0x44100000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign<f64>(z, sx);\n }\n let id: i32;\n if (ix < 0x3FDC0000) {\n if (ix < 0x3E400000) return x;\n id = -1;\n } else {\n x = builtin_abs<f64>(x);\n if (ix < 0x3FF30000) {\n if (ix < 0x3FE60000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x40038000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n let w = z * z;\n let s1 = z * (aT0 + w * (aT2 + w * (aT4 + w * (aT6 + w * (aT8 + w * aT10)))));\n let s2 = w * (aT1 + w * (aT3 + w * (aT5 + w * (aT7 + w * aT9))));\n let s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign<f64>(z, sx);\n }\n\n export function atanh(x: f64): f64 { // see: musl/src/math/atanh.c\n let u = reinterpret<u64>(x);\n let e = u >> 52 & 0x7FF;\n let y = builtin_abs(x);\n if (e < 0x3FF - 1) {\n if (e >= 0x3FF - 32) y = 0.5 * log1p(2 * y + 2 * y * y / (1 - y));\n } else {\n y = 0.5 * log1p(2 * (y / (1 - y)));\n }\n return builtin_copysign<f64>(y, x);\n }\n\n export function atan2(y: f64, x: f64): f64 { // see: musl/src/math/atan2.c and SUN COPYRIGHT NOTICE above\n const pi_lo = reinterpret<f64>(0x3CA1A62633145C07); // 1.2246467991473531772E-16\n if (isNaN(x) || isNaN(y)) return x + y;\n let u = reinterpret<u64>(x);\n let ix = <u32>(u >> 32);\n let lx = <u32>u;\n u = reinterpret<u64>(y);\n let iy = <u32>(u >> 32);\n let ly = <u32>u;\n if ((ix - 0x3FF00000 | lx) == 0) return atan(y);\n let m = ((iy >> 31) & 1) | ((ix >> 30) & 2);\n ix = ix & 0x7FFFFFFF;\n iy = iy & 0x7FFFFFFF;\n if ((iy | ly) == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n if ((ix | lx) == 0) return m & 1 ? -PI / 2 : PI / 2;\n if (ix == 0x7FF00000) {\n if (iy == 0x7FF00000) {\n let t = m & 2 ? 3 * PI / 4 : PI / 4;\n return m & 1 ? -t : t;\n } else {\n let t = m & 2 ? PI : 0;\n return m & 1 ? -t : t;\n }\n }\n let z: f64;\n if (ix + (64 << 20) < iy || iy == 0x7FF00000) return m & 1 ? -PI / 2 : PI / 2;\n if ((m & 2) && iy + (64 << 20) < ix) z = 0;\n else z = atan(builtin_abs<f64>(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return PI - (z - pi_lo);\n case 3: return (z - pi_lo) - PI;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f64): f64 { // see: musl/src/math/cbrt.c and SUN COPYRIGHT NOTICE above\n const\n B1 = <u32>715094163,\n B2 = <u32>696219795,\n P0 = reinterpret<f64>(0x3FFE03E60F61E692), // 1.87595182427177009643\n P1 = reinterpret<f64>(0xBFFE28E092F02420), // -1.88497979543377169875\n P2 = reinterpret<f64>(0x3FF9F1604A49D6C2), // 1.621429720105354466140\n P3 = reinterpret<f64>(0xBFE844CBBEE751D9), // -0.758397934778766047437\n P4 = reinterpret<f64>(0x3FC2B000D4E4EDD7), // 0.145996192886612446982\n Ox1p54 = reinterpret<f64>(0x4350000000000000); // 0x1p54\n\n let u = reinterpret<u64>(x);\n let hx = <u32>(u >> 32) & 0x7FFFFFFF;\n if (hx >= 0x7FF00000) return x + x;\n if (hx < 0x00100000) {\n u = reinterpret<u64>(x * Ox1p54);\n hx = <u32>(u >> 32) & 0x7FFFFFFF;\n if (hx == 0) return x;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 1 << 63;\n u |= <u64>hx << 32;\n let t = reinterpret<f64>(u);\n let r = (t * t) * (t / x);\n t = t * ((P0 + r * (P1 + r * P2)) + ((r * r) * r) * (P3 + r * P4));\n t = reinterpret<f64>((reinterpret<u64>(t) + 0x80000000) & 0xFFFFFFFFC0000000);\n let s = t * t;\n r = x / s;\n r = (r - t) / (2 * t + r);\n t = t + t * r;\n return t;\n }\n\n // @ts-ignore: decorator\n @inline\n export function ceil(x: f64): f64 {\n return builtin_ceil<f64>(x);\n }\n\n export function clz32(x: f64): f64 {\n if (!isFinite(x)) return 32;\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n return builtin_clz(dtoi32(x));\n }\n\n export function cos(x: f64): f64 { // see: musl/src/math/cos.c\n let u = reinterpret<u64>(x);\n let ux = u32(u >> 32);\n let sign = ux >> 31;\n\n ux &= 0x7FFFFFFF;\n\n // |x| ~< pi/4\n if (ux <= 0x3FE921FB) {\n if (ux < 0x3E46A09E) { // |x| < 2**-27 * sqrt(2)\n return 1.0;\n }\n return cos_kern(x, 0);\n }\n\n // sin(Inf or NaN) is NaN\n if (ux >= 0x7FF00000) return x - x;\n\n // argument reduction needed\n let n = rempio2(x, u, sign);\n let y0 = rempio2_y0;\n let y1 = rempio2_y1;\n\n x = n & 1 ? sin_kern(y0, y1, 1) : cos_kern(y0, y1);\n return (n + 1) & 2 ? -x : x;\n }\n\n export function cosh(x: f64): f64 { // see: musl/src/math/cosh.c\n let u = reinterpret<u64>(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n x = reinterpret<f64>(u);\n let w = <u32>(u >> 32);\n let t: f64;\n if (w < 0x3FE62E42) {\n if (w < 0x3FF00000 - (26 << 20)) return 1;\n t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (w < 0x40862E42) {\n t = exp(x);\n return 0.5 * (t + 1 / t);\n }\n t = expo2(x, 1);\n return t;\n }\n\n export function exp(x: f64): f64 { // see: musl/src/math/exp.c and SUN COPYRIGHT NOTICE above\n if (ASC_SHRINK_LEVEL < 1) {\n return exp_lut(x);\n } else {\n const\n ln2hi = reinterpret<f64>(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2lo = reinterpret<f64>(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret<f64>(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n P1 = reinterpret<f64>(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret<f64>(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret<f64>(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret<f64>(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret<f64>(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n overflow = reinterpret<f64>(0x40862E42FEFA39EF), // 709.782712893383973096\n underflow = reinterpret<f64>(0xC0874910D52D3051), // -745.13321910194110842\n Ox1p1023 = reinterpret<f64>(0x7FE0000000000000); // 0x1p1023\n\n let hx = u32(reinterpret<u64>(x) >> 32);\n let sign = hx >> 31;\n hx &= 0x7FFFFFFF;\n if (hx >= 0x4086232B) {\n if (isNaN(x)) return x;\n if (x > overflow) return x * Ox1p1023;\n if (x < underflow) return 0;\n }\n let hi: f64, lo: f64 = 0;\n let k = 0;\n if (hx > 0x3FD62E42) {\n if (hx >= 0x3FF0A2B2) {\n k = i32(invln2 * x + builtin_copysign<f64>(0.5, x));\n } else {\n k = 1 - (sign << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x3E300000) {\n hi = x;\n } else return 1.0 + x;\n let xs = x * x;\n // let c = x - xp2 * (P1 + xp2 * (P2 + xp2 * (P3 + xp2 * (P4 + xp2 * P5))));\n let xq = xs * xs;\n let c = x - (xs * P1 + xq * ((P2 + xs * P3) + xq * (P4 + xs * P5)));\n let y = 1.0 + (x * c / (2 - c) - lo + hi);\n return k == 0 ? y : scalbn(y, k);\n }\n }\n\n export function exp2(x: f64): f64 {\n return exp2_lut(x);\n }\n\n export function expm1(x: f64): f64 { // see: musl/src/math/expm1.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret<f64>(0x40862E42FEFA39EF), // 7.09782712893383973096e+02\n ln2_hi = reinterpret<f64>(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret<f64>(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret<f64>(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n Q1 = reinterpret<f64>(0xBFA11111111110F4), // -3.33333333333331316428e-02\n Q2 = reinterpret<f64>(0x3F5A01A019FE5585), // 1.58730158725481460165e-03\n Q3 = reinterpret<f64>(0xBF14CE199EAADBB7), // -7.93650757867487942473e-05\n Q4 = reinterpret<f64>(0x3ED0CFCA86E65239), // 4.00821782732936239552e-06\n Q5 = reinterpret<f64>(0xBE8AFDB76E09C32D), // -2.01099218183624371326e-07\n Ox1p1023 = reinterpret<f64>(0x7FE0000000000000); // 0x1p1023\n\n let u = reinterpret<u64>(x);\n let hx = u32(u >> 32) & 0x7FFFFFFF;\n let sign = u32(u >> 63);\n let k = 0;\n if (hx >= 0x4043687A) {\n if (isNaN(x)) return x;\n if (sign) return -1;\n if (x > o_threshold) return x * Ox1p1023;\n }\n let c = 0.0, t: f64;\n if (hx > 0x3FD62E42) {\n k = select<i32>(\n 1 - (sign << 1),\n i32(invln2 * x + builtin_copysign<f64>(0.5, x)),\n hx < 0x3FF0A2B2\n );\n t = <f64>k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x3C900000) return x;\n let hfx = 0.5 * x;\n let hxs = x * hfx;\n // let r1 = 1.0 + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5))));\n let hxq = hxs * hxs;\n let r1 = (1.0 + hxs * Q1) + hxq * ((Q2 + hxs * Q3) + hxq * (Q4 + hxs * Q5));\n t = 3.0 - r1 * hfx;\n let e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x3FF + k) << 52;\n let twopk = reinterpret<f64>(u);\n let y: f64;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 1024) y = y * 2.0 * Ox1p1023;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x3FF - k) << 52;\n y = reinterpret<f64>(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n // @ts-ignore: decorator\n @inline\n export function floor(x: f64): f64 {\n return builtin_floor<f64>(x);\n }\n\n // @ts-ignore: decorator\n @inline\n export function fround(x: f64): f64 {\n return <f32>x;\n }\n\n export function hypot(x: f64, y: f64): f64 { // see: musl/src/math/hypot.c\n const\n SPLIT = reinterpret<f64>(0x41A0000000000000) + 1, // 0x1p27 + 1\n Ox1p700 = reinterpret<f64>(0x6BB0000000000000),\n Ox1p_700 = reinterpret<f64>(0x1430000000000000);\n\n let ux = reinterpret<u64>(x);\n let uy = reinterpret<u64>(y);\n ux &= 0x7FFFFFFFFFFFFFFF;\n uy &= 0x7FFFFFFFFFFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n let ex = i32(ux >> 52);\n let ey = i32(uy >> 52);\n y = reinterpret<f64>(uy);\n if (ey == 0x7FF) return y;\n x = reinterpret<f64>(ux);\n if (ex == 0x7FF || uy == 0) return x;\n if (ex - ey > 64) return x + y;\n let z = 1.0;\n if (ex > 0x3FF + 510) {\n z = Ox1p700;\n x *= Ox1p_700;\n y *= Ox1p_700;\n } else if (ey < 0x3FF - 450) {\n z = Ox1p_700;\n x *= Ox1p700;\n y *= Ox1p700;\n }\n let c = x * SPLIT;\n let h = x - c + c;\n let l = x - h;\n let hx = x * x;\n let lx = h * h - hx + (2 * h + l) * l;\n c = y * SPLIT;\n h = y - c + c;\n l = y - h;\n let hy = y * y;\n let ly = h * h - hy + (2 * h + l) * l;\n return z * builtin_sqrt(ly + lx + hy + hx);\n }\n\n export function imul(x: f64, y: f64): f64 {\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n return dtoi32(x) * dtoi32(y);\n }\n\n export function log(x: f64): f64 { // see: musl/src/math/log.c and SUN COPYRIGHT NOTICE above\n if (ASC_SHRINK_LEVEL < 1) {\n return log_lut(x);\n } else {\n const\n ln2_hi = reinterpret<f64>(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret<f64>(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret<f64>(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret<f64>(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret<f64>(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret<f64>(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret<f64>(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret<f64>(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret<f64>(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret<f64>(0x4350000000000000); // 0x1p54\n\n let u = reinterpret<u64>(x);\n let hx = u32(u >> 32);\n let k = 0;\n let sign = hx >> 31;\n if (sign || hx < 0x00100000) {\n if (u << 1 == 0) return -1 / (x * x);\n if (sign) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret<u64>(x);\n hx = u32(u >> 32);\n } else if (hx >= 0x7FF00000) {\n return x;\n } else if (hx == 0x3FF00000 && u << 32 == 0) {\n return 0;\n }\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (<i32>hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = <u64>hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret<f64>(u);\n let f = x - 1.0;\n let hfsq = 0.5 * f * f;\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n let t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n let r = t2 + t1;\n let dk = <f64>k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n }\n\n export function log10(x: f64): f64 { // see: musl/src/math/log10.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret<f64>(0x3FDBCB7B15200000), // 4.34294481878168880939e-01\n ivln10lo = reinterpret<f64>(0x3DBB9438CA9AADD5), // 2.50829467116452752298e-11\n log10_2hi = reinterpret<f64>(0x3FD34413509F6000), // 3.01029995663611771306e-01\n log10_2lo = reinterpret<f64>(0x3D59FEF311F12B36), // 3.69423907715893078616e-13\n Lg1 = reinterpret<f64>(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret<f64>(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret<f64>(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret<f64>(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret<f64>(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret<f64>(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret<f64>(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret<f64>(0x4350000000000000); // 0x1p54\n\n let u = reinterpret<u64>(x);\n let hx = u32(u >> 32);\n let k = 0;\n let sign = hx >> 31;\n if (sign || hx < 0x00100000) {\n if (u << 1 == 0) return -1 / (x * x);\n if (sign) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret<u64>(x);\n hx = u32(u >> 32);\n } else if (hx >= 0x7FF00000) {\n return x;\n } else if (hx == 0x3FF00000 && u << 32 == 0) {\n return 0;\n }\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += i32(hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = <u64>hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret<f64>(u);\n let f = x - 1.0;\n let hfsq = 0.5 * f * f;\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n let t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n let r = t2 + t1;\n let hi = f - hfsq;\n u = reinterpret<u64>(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret<f64>(u);\n let lo = f - hi - hfsq + s * (hfsq + r);\n let val_hi = hi * ivln10hi;\n let dk = <f64>k;\n let y = dk * log10_2hi;\n let val_lo = dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n return val_lo + w;\n }\n\n export function log1p(x: f64): f64 { // see: musl/src/math/log1p.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret<f64>(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret<f64>(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret<f64>(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret<f64>(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret<f64>(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret<f64>(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret<f64>(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret<f64>(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret<f64>(0x3FC2F112DF3E5244); // 1.479819860511658591e-01\n\n let u = reinterpret<u64>(x);\n let hx = u32(u >> 32);\n let k = 1;\n let c = 0.0, f = 0.0;\n if (hx < 0x3FDA827A || bool(hx >> 31)) {\n if (hx >= 0xBFF00000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (hx << 1 < 0x3CA00000 << 1) return x;\n if (hx <= 0xBFD2BEC4) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (hx >= 0x7FF00000) return x;\n if (k) {\n u = reinterpret<u64>(1 + x);\n let hu = u32(u >> 32);\n hu += 0x3FF00000 - 0x3FE6A09E;\n k = i32(hu >> 20) - 0x3FF;\n if (k < 54) {\n let uf = reinterpret<f64>(u);\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n hu = (hu & 0x000FFFFF) + 0x3FE6A09E;\n u = <u64>hu << 32 | (u & 0xFFFFFFFF);\n f = reinterpret<f64>(u) - 1;\n }\n let hfsq = 0.5 * f * f;\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n let t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n let r = t2 + t1;\n let dk = <f64>k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f64): f64 { // see: musl/src/math/log2.c and SUN COPYRIGHT NOTICE above\n if (ASC_SHRINK_LEVEL < 1) {\n return log2_lut(x);\n } else {\n const\n ivln2hi = reinterpret<f64>(0x3FF7154765200000), // 1.44269504072144627571e+00\n ivln2lo = reinterpret<f64>(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10\n Lg1 = reinterpret<f64>(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret<f64>(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret<f64>(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret<f64>(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret<f64>(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret<f64>(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret<f64>(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret<f64>(0x4350000000000000); // 1p54\n\n let u = reinterpret<u64>(x);\n let hx = u32(u >> 32);\n let k = 0;\n let sign = hx >> 31;\n if (sign || hx < 0x00100000) {\n if (u << 1 == 0) return -1 / (x * x);\n if (sign) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret<u64>(x);\n hx = u32(u >> 32);\n } else if (hx >= 0x7FF00000) {\n return x;\n } else if (hx == 0x3FF00000 && u << 32 == 0) {\n return 0;\n }\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += i32(hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = <u64>hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret<f64>(u);\n let f = x - 1.0;\n let hfsq = 0.5 * f * f;\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n let t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n let r = t2 + t1;\n let hi = f - hfsq;\n u = reinterpret<u64>(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret<f64>(u);\n let lo = f - hi - hfsq + s * (hfsq + r);\n let val_hi = hi * ivln2hi;\n let val_lo = (lo + hi) * ivln2lo + lo * ivln2hi;\n let y = <f64>k;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n val_hi = w;\n return val_lo + val_hi;\n }\n }\n\n // @ts-ignore: decorator\n @inline\n export function max(value1: f64, value2: f64): f64 {\n return builtin_max<f64>(value1, value2);\n }\n\n // @ts-ignore: decorator\n @inline\n export function min(value1: f64, value2: f64): f64 {\n return builtin_min<f64>(value1, value2);\n }\n\n export function pow(x: f64, y: f64): f64 { // see: musl/src/math/pow.c and SUN COPYRIGHT NOTICE above\n // TODO: remove this fast pathes after introduced own mid-end IR with \"stdlib call simplify\" transforms\n if (builtin_abs<f64>(y) <= 2) {\n if (y == 2.0) return x * x;\n if (y == 0.5) {\n return select<f64>(\n builtin_abs<f64>(builtin_sqrt<f64>(x)),\n Infinity,\n x != -Infinity\n );\n }\n if (y == -1.0) return 1 / x;\n if (y == 1.0) return x;\n if (y == 0.0) return 1.0;\n }\n if (ASC_SHRINK_LEVEL < 1) {\n return pow_lut(x, y);\n } else {\n const\n dp_h1 = reinterpret<f64>(0x3FE2B80340000000), // 5.84962487220764160156e-01\n dp_l1 = reinterpret<f64>(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08\n two53 = reinterpret<f64>(0x4340000000000000), // 9007199254740992.0\n huge = reinterpret<f64>(0x7E37E43C8800759C), // 1e+300\n tiny = reinterpret<f64>(0x01A56E1FC2F8F359), // 1e-300\n L1 = reinterpret<f64>(0x3FE3333333333303), // 5.99999999999994648725e-01\n L2 = reinterpret<f64>(0x3FDB6DB6DB6FABFF), // 4.28571428578550184252e-01\n L3 = reinterpret<f64>(0x3FD55555518F264D), // 3.33333329818377432918e-01\n L4 = reinterpret<f64>(0x3FD17460A91D4101), // 2.72728123808534006489e-01\n L5 = reinterpret<f64>(0x3FCD864A93C9DB65), // 2.30660745775561754067e-01\n L6 = reinterpret<f64>(0x3FCA7E284A454EEF), // 2.06975017800338417784e-01\n P1 = reinterpret<f64>(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret<f64>(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret<f64>(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret<f64>(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret<f64>(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n lg2 = reinterpret<f64>(0x3FE62E42FEFA39EF), // 6.93147180559945286227e-01\n lg2_h = reinterpret<f64>(0x3FE62E4300000000), // 6.93147182464599609375e-01\n lg2_l = reinterpret<f64>(0xBE205C610CA86C39), // -1.90465429995776804525e-09\n ovt = reinterpret<f64>(0x3C971547652B82FE), // 8.0085662595372944372e-017\n cp = reinterpret<f64>(0x3FEEC709DC3A03FD), // 9.61796693925975554329e-01\n cp_h = reinterpret<f64>(0x3FEEC709E0000000), // 9.61796700954437255859e-01\n cp_l = reinterpret<f64>(0xBE3E2FE0145B01F5), // -7.02846165095275826516e-09\n ivln2 = reinterpret<f64>(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n ivln2_h = reinterpret<f64>(0x3FF7154760000000), // 1.44269502162933349609e+00\n ivln2_l = reinterpret<f64>(0x3E54AE0BF85DDF44), // 1.92596299112661746887e-08\n inv3 = reinterpret<f64>(0x3FD5555555555555); // 0.3333333333333333333333\n\n let u_ = reinterpret<u64>(x);\n let hx = i32(u_ >> 32);\n let lx = <u32>u_;\n u_ = reinterpret<u64>(y);\n let hy = i32(u_ >> 32);\n let ly = <u32>u_;\n let ix = hx & 0x7FFFFFFF;\n let iy = hy & 0x7FFFFFFF;\n if ((iy | ly) == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3FF00000 && lx == 0) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if ( // NaN if either arg is NaN\n ix > 0x7FF00000 || (ix == 0x7FF00000 && lx != 0) ||\n iy > 0x7FF00000 || (iy == 0x7FF00000 && ly != 0)\n ) return x + y;\n let yisint = 0, k: i32;\n if (hx < 0) {\n if (iy >= 0x43400000) yisint = 2;\n else if (iy >= 0x3FF00000) {\n k = (iy >> 20) - 0x3FF;\n let offset = select<u32>(52, 20, k > 20) - k;\n let Ly = select<u32>(ly, iy, k > 20);\n let jj = Ly >> offset;\n if ((jj << offset) == Ly) yisint = 2 - (jj & 1);\n }\n }\n if (ly == 0) {\n if (iy == 0x7FF00000) { // y is +-inf\n if (((ix - 0x3FF00000) | lx) == 0) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix >= 0x3FF00000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3FF00000) {\n if (hy >= 0) return x;\n return 1 / x;\n }\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3FE00000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n }\n let ax = builtin_abs<f64>(x), z: f64;\n if (lx == 0) {\n if (ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3FF00000) | yisint) == 0) {\n let d = z - z;\n z = d / d;\n } else if (yisint == 1) z = -z;\n }\n return z;\n }\n }\n let s = 1.0;\n if (hx < 0) {\n if (yisint == 0) {\n let d = x - x;\n return d / d;\n }\n if (yisint == 1) s = -1.0;\n }\n let t1: f64, t2: f64, p_h: f64, p_l: f64, r: f64, t: f64, u: f64, v: f64, w: f64;\n let j: i32, n: i32;\n if (iy > 0x41E00000) {\n if (iy > 0x43F00000) {\n if (ix <= 0x3FEFFFFF) return hy < 0 ? huge * huge : tiny * tiny;\n if (ix >= 0x3FF00000) return hy > 0 ? huge * huge : tiny * tiny;\n }\n if (ix < 0x3FEFFFFF) return hy < 0 ? s * huge * huge : s * tiny * tiny;\n if (ix > 0x3FF00000) return hy > 0 ? s * huge * huge : s * tiny * tiny;\n t = ax - 1.0;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n t1 = reinterpret<f64>(reinterpret<u64>(t1) & 0xFFFFFFFF00000000);\n t2 = v - (t1 - u);\n } else {\n let ss: f64, s2: f64, s_h: f64, s_l: f64, t_h: f64, t_l: f64;\n n = 0;\n if (ix < 0x00100000) {\n ax *= two53;\n n -= 53;\n ix = <u32>(reinterpret<u64>(ax) >> 32);\n }\n n += (ix >> 20) - 0x3FF;\n j = ix & 0x000FFFFF;\n ix = j | 0x3FF00000;\n if (j <= 0x3988E) k = 0;\n else if (j < 0xBB67A) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00100000;\n }\n ax = reinterpret<f64>(reinterpret<u64>(ax) & 0xFFFFFFFF | (<u64>ix << 32));\n let bp = select<f64>(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n ss = u * v;\n s_h = ss;\n s_h = reinterpret<f64>(reinterpret<u64>(s_h) & 0xFFFFFFFF00000000);\n t_h = reinterpret<f64>(u64(((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18)) << 32);\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = ss * ss;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + ss);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n t_h = reinterpret<f64>(reinterpret<u64>(t_h) & 0xFFFFFFFF00000000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * ss;\n p_h = u + v;\n p_h = reinterpret<f64>(reinterpret<u64>(p_h) & 0xFFFFFFFF00000000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select<f64>(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = <f64>n;\n let dp_h = select<f64>(dp_h1, 0.0, k);\n t1 = ((z_h + z_l) + dp_h) + t;\n t1 = reinterpret<f64>(reinterpret<u64>(t1) & 0xFFFFFFFF00000000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n let y1 = y;\n y1 = reinterpret<f64>(reinterpret<u64>(y1) & 0xFFFFFFFF00000000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n u_ = reinterpret<u64>(z);\n j = u32(u_ >> 32);\n let i = <i32>u_;\n if (j >= 0x40900000) {\n if (((j - 0x40900000) | i) != 0) return s * huge * huge;\n if (p_l + ovt > z - p_h) return s * huge * huge;\n } else if ((j & 0x7FFFFFFF) >= 0x4090CC00) {\n if (((j - 0xC090CC00) | i) != 0) return s * tiny * tiny;\n if (p_l <= z - p_h) return s * tiny * tiny;\n }\n i = j & 0x7FFFFFFF;\n k = (i >> 20) - 0x3FF;\n n = 0;\n if (i > 0x3FE00000) {\n n = j + (0x00100000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 20) - 0x3FF;\n t = 0.0;\n t = reinterpret<f64>(u64(n & ~(0x000FFFFF >> k)) << 32);\n n = ((n & 0x000FFFFF) | 0x00100000) >> (20 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n t = reinterpret<f64>(reinterpret<u64>(t) & 0xFFFFFFFF00000000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = u32(reinterpret<u64>(z) >> 32);\n j += n << 20;\n if ((j >> 20) <= 0) z = scalbn(z, n);\n else z = reinterpret<f64>(reinterpret<u64>(z) & 0xFFFFFFFF | (<u64>j << 32));\n return s * z;\n }\n }\n\n export function seedRandom(value: i64): void {\n // Instead zero seed use golden ratio:\n // phi = (1 + sqrt(5)) / 2\n // trunc(2^64 / phi) = 0x9e3779b97f4a7c15\n if (value == 0) value = 0x9e3779b97f4a7c15;\n random_state0_64 = murmurHash3(value);\n random_state1_64 = murmurHash3(~random_state0_64);\n random_state0_32 = splitMix32(<u32>value);\n random_state1_32 = splitMix32(random_state0_32);\n random_seeded = true;\n }\n\n export function random(): f64 { // see: v8/src/base/utils/random-number-generator.cc\n if (!random_seeded) seedRandom(reinterpret<i64>(seed()));\n let s1 = random_state0_64;\n let s0 = random_state1_64;\n random_state0_64 = s0;\n s1 ^= s1 << 23;\n s1 ^= s1 >> 17;\n s1 ^= s0;\n s1 ^= s0 >> 26;\n random_state1_64 = s1;\n let r = (s0 >> 12) | 0x3FF0000000000000;\n return reinterpret<f64>(r) - 1;\n }\n\n export function round(x: f64): f64 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_ceil<f64>(x) - f64(builtin_ceil<f64>(x) - 0.5 > x);\n } else {\n let roundUp = builtin_ceil<f64>(x);\n return select<f64>(roundUp, roundUp - 1.0, roundUp - 0.5 <= x);\n }\n }\n\n export function sign(x: f64): f64 {\n if (ASC_SHRINK_LEVEL > 0) {\n return select<f64>(builtin_copysign<f64>(1, x), x, builtin_abs(x) > 0);\n } else {\n return select<f64>(1, select<f64>(-1, x, x < 0), x > 0);\n }\n }\n\n // @ts-ignore: decorator\n @inline\n export function signbit(x: f64): bool {\n return bool(reinterpret<u64>(x) >>> 63);\n }\n\n export function sin(x: f64): f64 { // see: musl/src/math/sin.c\n let u = reinterpret<u64>(x);\n let ux = u32(u >> 32);\n let sign = ux >> 31;\n\n ux &= 0x7FFFFFFF;\n\n // |x| ~< pi/4\n if (ux <= 0x3FE921FB) {\n if (ux < 0x3E500000) { // |x| < 2**-26\n return x;\n }\n return sin_kern(x, 0.0, 0);\n }\n\n // sin(Inf or NaN) is NaN\n if (ux >= 0x7FF00000) return x - x;\n\n // argument reduction needed\n let n = rempio2(x, u, sign);\n let y0 = rempio2_y0;\n let y1 = rempio2_y1;\n\n x = n & 1 ? cos_kern(y0, y1) : sin_kern(y0, y1, 1);\n return n & 2 ? -x : x;\n }\n\n export function sinh(x: f64): f64 { // see: musl/src/math/sinh.c\n let u = reinterpret<u64>(x) & 0x7FFFFFFFFFFFFFFF;\n let a = reinterpret<f64>(u);\n let w = u32(u >> 32);\n let h = builtin_copysign(0.5, x);\n if (w < 0x40862E42) {\n let t = expm1(a);\n if (w < 0x3FF00000) {\n if (w < 0x3FF00000 - (26 << 20)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n return expo2(a, 2 * h);\n }\n\n // @ts-ignore: decorator\n @inline\n export function sqrt(x: f64): f64 {\n return builtin_sqrt<f64>(x);\n }\n\n export function tan(x: f64): f64 { // see: musl/src/math/tan.c\n let u = reinterpret<u64>(x);\n let ux = u32(u >> 32);\n let sign = ux >>> 31;\n\n ux &= 0x7FFFFFFF;\n\n // |x| ~< pi/4\n if (ux <= 0x3FE921FB) {\n if (ux < 0x3E400000) { // |x| < 2**-27\n return x;\n }\n return tan_kern(x, 0.0, 1);\n }\n\n // tan(Inf or NaN) is NaN\n if (ux >= 0x7FF00000) return x - x;\n\n let n = rempio2(x, u, sign);\n return tan_kern(rempio2_y0, rempio2_y1, 1 - ((n & 1) << 1));\n }\n\n export function tanh(x: f64): f64 { // see: musl/src/math/tanh.c\n let u = reinterpret<u64>(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n let y = reinterpret<f64>(u);\n let w = u32(u >> 32);\n let t: f64;\n if (w > 0x3FE193EA) {\n if (w > 0x40340000) {\n t = 1 - 0 / y;\n } else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (w > 0x3FD058AE) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (w >= 0x00100000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign<f64>(t, x);\n }\n\n // @ts-ignore: decorator\n @inline\n export function trunc(x: f64): f64 {\n return builtin_trunc<f64>(x);\n }\n\n export function scalbn(x: f64, n: i32): f64 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbn.c\n const\n Ox1p53 = reinterpret<f64>(0x4340000000000000),\n Ox1p1023 = reinterpret<f64>(0x7FE0000000000000),\n Ox1p_1022 = reinterpret<f64>(0x0010000000000000);\n\n let y = x;\n if (n > 1023) {\n y *= Ox1p1023;\n n -= 1023;\n if (n > 1023) {\n y *= Ox1p1023;\n n = builtin_min<i32>(n - 1023, 1023);\n }\n } else if (n < -1022) {\n // make sure final n < -53 to avoid double\n // rounding in the subnormal range\n y *= Ox1p_1022 * Ox1p53;\n n += 1022 - 53;\n if (n < -1022) {\n y *= Ox1p_1022 * Ox1p53;\n n = builtin_max<i32>(n + 1022 - 53, -1022);\n }\n }\n return y * reinterpret<f64>(<u64>(0x3FF + n) << 52);\n }\n\n export function mod(x: f64, y: f64): f64 { // see: musl/src/math/fmod.c\n if (builtin_abs<f64>(y) == 1.0) {\n // x % 1, x % -1 ==> sign(x) * abs(x - 1.0 * trunc(x / 1.0))\n // TODO: move this rule to compiler's optimization pass.\n // It could be apply for any x % C_pot, where \"C_pot\" is pow of two const.\n return builtin_copysign<f64>(x - builtin_trunc<f64>(x), x);\n }\n let ux = reinterpret<u64>(x);\n let uy = reinterpret<u64>(y);\n let ex = i64(ux >> 52 & 0x7FF);\n let ey = i64(uy >> 52 & 0x7FF);\n let sx = ux >> 63;\n let uy1 = uy << 1;\n if (uy1 == 0 || ex == 0x7FF || isNaN<f64>(y)) {\n let m = x * y;\n return m / m;\n }\n let ux1 = ux << 1;\n if (ux1 <= uy1) {\n return x * f64(ux1 != uy1);\n }\n if (!ex) {\n ex -= builtin_clz<i64>(ux << 12);\n ux <<= 1 - ex;\n } else {\n ux &= u64(-1) >> 12;\n ux |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz<i64>(uy << 12);\n uy <<= 1 - ey;\n } else {\n uy &= u64(-1) >> 12;\n uy |= 1 << 52;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 52); ux <<= 1) --ex;\n let shift = builtin_clz<i64>(ux << 11);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 52;\n ux |= ex << 52;\n } else {\n ux >>= -ex + 1;\n }\n return reinterpret<f64>(ux | (sx << 63));\n }\n\n export function rem(x: f64, y: f64): f64 { // see: musl/src/math/remquo.c\n let ux = reinterpret<u64>(x);\n let uy = reinterpret<u64>(y);\n let ex = i64(ux >> 52 & 0x7FF);\n let ey = i64(uy >> 52 & 0x7FF);\n if (uy << 1 == 0 || ex == 0x7FF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n if (ux << 1 == 0) return x;\n let uxi = ux;\n if (!ex) {\n ex -= builtin_clz<i64>(uxi << 12);\n uxi <<= 1 - ex;\n } else {\n uxi &= u64(-1) >> 12;\n uxi |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz<i64>(uy << 12);\n uy <<= 1 - ey;\n } else {\n uy &= u64(-1) >> 12;\n uy |= 1 << 52;\n }\n let q: u32 = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -60;\n else {\n let shift = builtin_clz<i64>(uxi << 11);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end:\n if (ex > 0) {\n uxi -= 1 << 52;\n uxi |= ex << 52;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret<f64>(uxi);\n y = builtin_abs<f64>(y);\n let x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && <bool>(q & 1))))) {\n x -= y;\n // ++q;\n }\n return <i64>ux < 0 ? -x : x;\n }\n\n export function sincos(x: f64): void { // see: musl/tree/src/math/sincos.c\n let u = reinterpret<u64>(x);\n let ux = u32(u >> 32);\n let sign = ux >> 31;\n ux &= 0x7FFFFFFF;\n\n if (ux <= 0x3FE921FB) { // |x| ~<= π/4\n if (ux < 0x3E46A09E) { // if |x| < 2**-27 * sqrt(2)\n sincos_sin = x;\n sincos_cos = 1;\n return;\n }\n sincos_sin = sin_kern(x, 0, 0);\n sincos_cos = cos_kern(x, 0);\n return;\n }\n // sin(Inf or NaN) is NaN\n if (ux >= 0x7F800000) {\n let xx = x - x;\n sincos_sin = xx;\n sincos_cos = xx;\n return;\n }\n // general argument reduction needed\n let n = rempio2(x, u, sign);\n let y0 = rempio2_y0;\n let y1 = rempio2_y1;\n let s = sin_kern(y0, y1, 1);\n let c = cos_kern(y0, y1);\n let sin = s, cos = c;\n if (n & 1) {\n sin = c;\n cos = -s;\n }\n if (n & 2) {\n sin = -sin;\n cos = -cos;\n }\n sincos_sin = sin;\n sincos_cos = cos;\n }\n}\n\n// @ts-ignore: decorator\n@lazy let rempio2f_y: f64;\n\n// @ts-ignore: decorator\n@lazy @inline const PIO2F_TABLE = memory.data<u64>([\n 0xA2F9836E4E441529,\n 0xFC2757D1F534DDC0,\n 0xDB6295993C439041,\n 0xFE5163ABDEBBC561\n]);\n\nfunction Rf(z: f32): f32 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret<f32>(0x3E2AAA75), // 1.6666586697e-01f\n pS1 = reinterpret<f32>(0xBD2F13BA), // -4.2743422091e-02f\n pS2 = reinterpret<f32>(0xBC0DD36B), // -8.6563630030e-03f\n qS1 = reinterpret<f32>(0xBF34E5AE); // -7.0662963390e-01f\n\n let p = z * (pS0 + z * (pS1 + z * pS2));\n let q: f32 = 1 + z * qS1;\n return p / q;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction expo2f(x: f32, sign: f32): f32 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2f.c\n k = <u32>235,\n kln2 = reinterpret<f32>(0x4322E3BC); // 0x1.45c778p+7f\n let scale = reinterpret<f32>(u32(0x7F + (k >> 1)) << 23);\n // in directed rounding correct sign before rounding or overflow is important\n return NativeMathf.exp(x - kln2) * (sign * scale) * scale;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction pio2f_large_quot(x: f32, u: i32): i32 { // see: jdh8/metallic/blob/master/src/math/float/rem_pio2f.c\n const coeff = reinterpret<f64>(0x3BF921FB54442D18); // π * 0x1p-65 = 8.51530395021638647334e-20\n\n let offset = (u >> 23) - 152;\n let shift = u64(offset & 63);\n let tblPtr = PIO2F_TABLE + (offset >> 6 << 3);\n\n let b0 = load<u64>(tblPtr, 0 << 3);\n let b1 = load<u64>(tblPtr, 1 << 3);\n let lo: u64;\n\n if (shift > 32) {\n let b2 = load<u64>(tblPtr, 2 << 3);\n lo = b2 >> (96 - shift);\n lo |= b1 << (shift - 32);\n } else {\n lo = b1 >> (32 - shift);\n }\n\n let hi = (b1 >> (64 - shift)) | (b0 << shift);\n let mantissa: u64 = (u & 0x007FFFFF) | 0x00800000;\n let product = mantissa * hi + (mantissa * lo >> 32);\n let r: i64 = product << 2;\n let q = i32((product >> 62) + (r >>> 63));\n rempio2f_y = copysign<f64>(coeff, x) * <f64>r;\n return q;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction rempio2f(x: f32, u: u32, sign: i32): i32 { // see: jdh8/metallic/blob/master/src/math/float/rem_pio2f.c\n const\n pi2hi = reinterpret<f64>(0x3FF921FB50000000), // 1.57079631090164184570\n pi2lo = reinterpret<f64>(0x3E5110B4611A6263), // 1.58932547735281966916e-8\n _2_pi = reinterpret<f64>(0x3FE45F306DC9C883); // 0.63661977236758134308\n\n if (u < 0x4DC90FDB) { // π * 0x1p28\n let q = nearest(x * _2_pi);\n rempio2f_y = x - q * pi2hi - q * pi2lo;\n return <i32>q;\n }\n\n let q = pio2f_large_quot(x, u);\n return select(-q, q, sign);\n}\n\n// |sin(x)/x - s(x)| < 2**-37.5 (~[-4.89e-12, 4.824e-12]).\n// @ts-ignore: decorator\n@inline\nfunction sin_kernf(x: f64): f32 { // see: musl/tree/src/math/__sindf.c\n const\n S1 = reinterpret<f64>(0xBFC5555554CBAC77), // -0x15555554cbac77.0p-55\n S2 = reinterpret<f64>(0x3F811110896EFBB2), // 0x111110896efbb2.0p-59\n S3 = reinterpret<f64>(0xBF2A00F9E2CAE774), // -0x1a00f9e2cae774.0p-65\n S4 = reinterpret<f64>(0x3EC6CD878C3B46A7); // 0x16cd878c3b46a7.0p-71\n\n let z = x * x;\n let w = z * z;\n let r = S3 + z * S4;\n let s = z * x;\n return f32((x + s * (S1 + z * S2)) + s * w * r);\n}\n\n// |cos(x) - c(x)| < 2**-34.1 (~[-5.37e-11, 5.295e-11]).\n// @ts-ignore: decorator\n@inline\nfunction cos_kernf(x: f64): f32 { // see: musl/tree/src/math/__cosdf.c\n const\n C0 = reinterpret<f64>(0xBFDFFFFFFD0C5E81), // -0x1ffffffd0c5e81.0p-54\n C1 = reinterpret<f64>(0x3FA55553E1053A42), // 0x155553e1053a42.0p-57\n C2 = reinterpret<f64>(0xBF56C087E80F1E27), // -0x16c087e80f1e27.0p-62\n C3 = reinterpret<f64>(0x3EF99342E0EE5069); // 0x199342e0ee5069.0p-68\n\n let z = x * x;\n let w = z * z;\n let r = C2 + z * C3;\n return f32(((1 + z * C0) + w * C1) + (w * z) * r);\n}\n\n// |tan(x)/x - t(x)| < 2**-25.5 (~[-2e-08, 2e-08]).\n// @ts-ignore: decorator\n@inline\nfunction tan_kernf(x: f64, odd: i32): f32 { // see: musl/tree/src/math/__tandf.c\n const\n T0 = reinterpret<f64>(0x3FD5554D3418C99F), // 0x15554d3418c99f.0p-54\n T1 = reinterpret<f64>(0x3FC112FD38999F72), // 0x1112fd38999f72.0p-55\n T2 = reinterpret<f64>(0x3FAB54C91D865AFE), // 0x1b54c91d865afe.0p-57\n T3 = reinterpret<f64>(0x3F991DF3908C33CE), // 0x191df3908c33ce.0p-58\n T4 = reinterpret<f64>(0x3F685DADFCECF44E), // 0x185dadfcecf44e.0p-61\n T5 = reinterpret<f64>(0x3F8362B9BF971BCD); // 0x1362b9bf971bcd.0p-59\n\n let z = x * x;\n let r = T4 + z * T5;\n let t = T2 + z * T3;\n let w = z * z;\n let s = z * x;\n let u = T0 + z * T1;\n\n r = (x + s * u) + (s * w) * (t + w * r);\n return f32(odd ? -1 / r : r);\n}\n\n// See: jdh8/metallic/src/math/float/log2f.c and jdh8/metallic/src/math/float/kernel/atanh.h\n// @ts-ignore: decorator\n@inline\nfunction log2f(x: f64): f64 {\n const\n log2e = reinterpret<f64>(0x3FF71547652B82FE), // 1.44269504088896340736\n c0 = reinterpret<f64>(0x3FD555554FD9CAEF), // 0.33333332822728226129\n c1 = reinterpret<f64>(0x3FC999A7A8AF4132), // 0.20000167595436263505\n c2 = reinterpret<f64>(0x3FC2438D79437030), // 0.14268654271188685375\n c3 = reinterpret<f64>(0x3FBE2F663B001C97); // 0.11791075649681414150\n\n let i = reinterpret<i64>(x);\n let exponent = (i - 0x3FE6A09E667F3BCD) >> 52;\n x = reinterpret<f64>(i - (exponent << 52));\n x = (x - 1) / (x + 1);\n let xx = x * x;\n let y = x + x * xx * (c0 + c1 * xx + (c2 + c3 * xx) * (xx * xx));\n return (2 * log2e) * y + <f64>exponent;\n}\n\n// See: jdh8/metallic/src/math/float/exp2f.h and jdh8/metallic/blob/master/src/math/float/kernel/exp2f.h\n// @ts-ignore: decorator\n@inline\nfunction exp2f(x: f64): f64 {\n const\n c0 = reinterpret<f64>(0x3FE62E4302FCC24A), // 6.931471880289532425e-1\n c1 = reinterpret<f64>(0x3FCEBFBE07D97B91), // 2.402265108421173406e-1\n c2 = reinterpret<f64>(0x3FAC6AF6CCFC1A65), // 5.550357105498874537e-2\n c3 = reinterpret<f64>(0x3F83B29E3CE9AEF6), // 9.618030771171497658e-3\n c4 = reinterpret<f64>(0x3F55F0896145A89F), // 1.339086685300950937e-3\n c5 = reinterpret<f64>(0x3F2446C81E384864); // 1.546973499989028719e-4\n\n if (x < -1022) return 0;\n if (x >= 1024) return Infinity;\n\n let n = nearest(x);\n x -= n;\n let xx = x * x;\n let y = 1 + x * (c0 + c1 * x + (c2 + c3 * x) * xx + (c4 + c5 * x) * (xx * xx));\n return reinterpret<f64>(reinterpret<i64>(y) + (<i64>n << 52));\n}\n\nexport namespace NativeMathf {\n\n // @ts-ignore: decorator\n @lazy\n export const E = <f32>NativeMath.E;\n\n // @ts-ignore: decorator\n @lazy\n export const LN2 = <f32>NativeMath.LN2;\n\n // @ts-ignore: decorator\n @lazy\n export const LN10 = <f32>NativeMath.LN10;\n\n // @ts-ignore: decorator\n @lazy\n export const LOG2E = <f32>NativeMath.LOG2E;\n\n // @ts-ignore: decorator\n @lazy\n export const LOG10E = <f32>NativeMath.LOG10E;\n\n // @ts-ignore: decorator\n @lazy\n export const PI = <f32>NativeMath.PI;\n\n // @ts-ignore: decorator\n @lazy\n export const SQRT1_2 = <f32>NativeMath.SQRT1_2;\n\n // @ts-ignore: decorator\n @lazy\n export const SQRT2 = <f32>NativeMath.SQRT2;\n\n // @ts-ignore: decorator\n @lazy\n export let sincos_sin: f32 = 0;\n\n // @ts-ignore: decorator\n @lazy\n export let sincos_cos: f32 = 0;\n\n // @ts-ignore: decorator\n @inline\n export function abs(x: f32): f32 {\n return builtin_abs<f32>(x);\n }\n\n export function acos(x: f32): f32 { // see: musl/src/math/acosf.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret<f32>(0x3FC90FDA), // 1.5707962513e+00f\n pio2_lo = reinterpret<f32>(0x33A22168), // 7.5497894159e-08f\n Ox1p_120f = reinterpret<f32>(0x03800000); // 0x1p-120f\n\n let hx = reinterpret<u32>(x);\n let ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3F800000) {\n if (ix == 0x3F800000) {\n return select<f32>(2 * pio2_hi + Ox1p_120f, 0, <i32>hx < 0);\n }\n return 0 / (x - x);\n }\n if (ix < 0x3F000000) {\n if (ix <= 0x32800000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * Rf(x * x)));\n }\n let z: f32, w: f32, s: f32;\n if (<i32>hx < 0) {\n // z = (1 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt<f32>(z);\n w = Rf(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt<f32>(z);\n hx = reinterpret<u32>(s);\n let df = reinterpret<f32>(hx & 0xFFFFF000);\n let c = (z - df * df) / (s + df);\n w = Rf(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f32): f32 { // see: musl/src/math/acoshf.c\n const s = reinterpret<f32>(0x3F317218); // 0.693147180559945309417232121458176568f\n let u = reinterpret<u32>(x);\n let a = u & 0x7FFFFFFF;\n if (a < 0x3F800000 + (1 << 23)) { // |x| < 2, invalid if x < 1\n let xm1 = x - 1;\n return log1p(xm1 + builtin_sqrt(xm1 * (xm1 + 2)));\n }\n if (u < 0x3F800000 + (12 << 23)) { // 2 <= x < 0x1p12\n return log(2 * x - 1 / (x + builtin_sqrt<f32>(x * x - 1)));\n }\n // x >= 0x1p12 or x <= -2 or NaN\n return log(x) + s;\n }\n\n export function asin(x: f32): f32 { // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n const\n pio2 = reinterpret<f32>(0x3FC90FDB), // 1.570796326794896558e+00f\n Ox1p_120f = reinterpret<f32>(0x03800000); // 0x1p-120f\n\n let sx = x;\n let hx = reinterpret<u32>(x) & 0x7FFFFFFF;\n if (hx >= 0x3F800000) {\n if (hx == 0x3F800000) return x * pio2 + Ox1p_120f;\n return 0 / (x - x);\n }\n if (hx < 0x3F000000) {\n if (hx < 0x39800000 && hx >= 0x00800000) return x;\n return x + x * Rf(x * x);\n }\n // let z: f32 = (1 - builtin_abs<f32>(x)) * 0.5;\n let z: f32 = 0.5 - builtin_abs<f32>(x) * 0.5;\n let s = builtin_sqrt<f64>(z); // sic\n x = f32(pio2 - 2 * (s + s * Rf(z)));\n return builtin_copysign(x, sx);\n }\n\n export function asinh(x: f32): f32 { // see: musl/src/math/asinhf.c\n const c = reinterpret<f32>(0x3F317218); // 0.693147180559945309417232121458176568f\n let u = reinterpret<u32>(x) & 0x7FFFFFFF;\n let y = reinterpret<f32>(u);\n if (u >= 0x3F800000 + (12 << 23)) y = log(y) + c;\n else if (u >= 0x3F800000 + (1 << 23)) y = log(2 * y + 1 / (builtin_sqrt<f32>(y * y + 1) + y));\n else if (u >= 0x3F800000 - (12 << 23)) y = log1p(y + y * y / (builtin_sqrt<f32>(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f32): f32 { // see: musl/src/math/atanf.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret<f32>(0x3EED6338), // 4.6364760399e-01f\n atanhi1 = reinterpret<f32>(0x3F490FDA), // 7.8539812565e-01f\n atanhi2 = reinterpret<f32>(0x3F7B985E), // 9.8279368877e-01f\n atanhi3 = reinterpret<f32>(0x3FC90FDA), // 1.5707962513e+00f\n atanlo0 = reinterpret<f32>(0x31AC3769), // 5.0121582440e-09f\n atanlo1 = reinterpret<f32>(0x33222168), // 3.7748947079e-08f\n atanlo2 = reinterpret<f32>(0x33140FB4), // 3.4473217170e-08f\n atanlo3 = reinterpret<f32>(0x33A22168), // 7.5497894159e-08f\n aT0 = reinterpret<f32>(0x3EAAAAA9), // 3.3333328366e-01f\n aT1 = reinterpret<f32>(0xBE4CCA98), // -1.9999158382e-01f\n aT2 = reinterpret<f32>(0x3E11F50D), // 1.4253635705e-01f\n aT3 = reinterpret<f32>(0xBDDA1247), // -1.0648017377e-01f\n aT4 = reinterpret<f32>(0x3D7CAC25), // 6.1687607318e-02f\n Ox1p_120f = reinterpret<f32>(0x03800000); // 0x1p-120f\n\n let ix = reinterpret<u32>(x);\n let sx = x;\n ix &= 0x7FFFFFFF;\n let z: f32;\n if (ix >= 0x4C800000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n let id: i32;\n if (ix < 0x3EE00000) {\n if (ix < 0x39800000) return x;\n id = -1;\n } else {\n x = builtin_abs<f32>(x);\n if (ix < 0x3F980000) {\n if (ix < 0x3F300000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x401C0000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n let w = z * z;\n let s1 = z * (aT0 + w * (aT2 + w * aT4));\n let s2 = w * (aT1 + w * aT3);\n let s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f32): f32 { // see: musl/src/math/atanhf.c\n let u = reinterpret<u32>(x);\n let y = builtin_abs(x);\n if (u < 0x3F800000 - (1 << 23)) {\n if (u >= 0x3F800000 - (32 << 23)) y = 0.5 * log1p(2 * y * (1.0 + y / (1 - y)));\n } else y = 0.5 * log1p(2 * (y / (1 - y)));\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f32, x: f32): f32 { // see: musl/src/math/atan2f.c and SUN COPYRIGHT NOTICE above\n const\n pi = reinterpret<f32>(0x40490FDB), // 3.1415927410e+00f\n pi_lo = reinterpret<f32>(0xB3BBBD2E); // -8.7422776573e-08f\n\n if (isNaN(x) || isNaN(y)) return x + y;\n let ix = reinterpret<u32>(x);\n let iy = reinterpret<u32>(y);\n if (ix == 0x3F800000) return atan(y);\n let m = u32(((iy >> 31) & 1) | ((ix >> 30) & 2));\n ix &= 0x7FFFFFFF;\n iy &= 0x7FFFFFFF;\n if (iy == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n if (ix == 0) return m & 1 ? -pi / 2 : pi / 2;\n if (ix == 0x7F800000) {\n if (iy == 0x7F800000) {\n let t: f32 = m & 2 ? 3 * pi / 4 : pi / 4;\n return m & 1 ? -t : t;\n } else {\n let t: f32 = m & 2 ? pi : 0.0;\n return m & 1 ? -t : t;\n }\n }\n if (ix + (26 << 23) < iy || iy == 0x7F800000) return m & 1 ? -pi / 2 : pi / 2;\n let z: f32;\n if ((m & 2) && iy + (26 << 23) < ix) z = 0.0;\n else z = atan(builtin_abs<f32>(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return pi - (z - pi_lo);\n case 3: return (z - pi_lo) - pi;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f32): f32 { // see: musl/src/math/cbrtf.c and SUN COPYRIGHT NOTICE above\n const\n B1 = <u32>709958130,\n B2 = <u32>642849266,\n Ox1p24f = reinterpret<f32>(0x4B800000);\n\n let u = reinterpret<u32>(x);\n let hx = u & 0x7FFFFFFF;\n if (hx >= 0x7F800000) return x + x;\n if (hx < 0x00800000) {\n if (hx == 0) return x;\n u = reinterpret<u32>(x * Ox1p24f);\n hx = u & 0x7FFFFFFF;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 0x80000000;\n u |= hx;\n let t = <f64>reinterpret<f32>(u);\n let r = t * t * t;\n t = t * (<f64>x + x + r) / (x + r + r);\n r = t * t * t;\n t = t * (<f64>x + x + r) / (x + r + r);\n return <f32>t;\n }\n\n // @ts-ignore: decorator\n @inline\n export function ceil(x: f32): f32 {\n return builtin_ceil<f32>(x);\n }\n\n export function clz32(x: f32): f32 {\n if (!isFinite(x)) return 32;\n return <f32>builtin_clz(dtoi32(x));\n }\n\n export function cos(x: f32): f32 { // see: musl/src/math/cosf.c\n const\n c1pio2 = reinterpret<f64>(0x3FF921FB54442D18), // M_PI_2 * 1\n c2pio2 = reinterpret<f64>(0x400921FB54442D18), // M_PI_2 * 2\n c3pio2 = reinterpret<f64>(0x4012D97C7F3321D2), // M_PI_2 * 3\n c4pio2 = reinterpret<f64>(0x401921FB54442D18); // M_PI_2 * 4\n\n let ux = reinterpret<u32>(x);\n let sign = ux >> 31;\n ux &= 0x7FFFFFFF;\n\n if (ux <= 0x3F490FDA) { // |x| ~<= π/4\n if (ux < 0x39800000) { // |x| < 2**-12\n // raise inexact if x != 0\n return 1;\n }\n return cos_kernf(x);\n }\n\n if (ASC_SHRINK_LEVEL < 1) {\n if (ux <= 0x407B53D1) { // |x| ~<= 5π/4\n if (ux > 0x4016CBE3) { // |x| ~> 3π/4\n return -cos_kernf(sign ? x + c2pio2 : x - c2pio2);\n } else {\n return sign ? sin_kernf(x + c1pio2) : sin_kernf(c1pio2 - x);\n }\n }\n if (ux <= 0x40E231D5) { // |x| ~<= 9π/4\n if (ux > 0x40AFEDDF) { // |x| ~> 7π/4\n return cos_kernf(sign ? x + c4pio2 : x - c4pio2);\n } else {\n return sign ? sin_kernf(-x - c3pio2) : sin_kernf(x - c3pio2);\n }\n }\n }\n\n // cos(Inf or NaN) is NaN\n if (ux >= 0x7F800000) return x - x;\n\n // general argument reduction needed\n let n = rempio2f(x, ux, sign);\n let y = rempio2f_y;\n\n let t = n & 1 ? sin_kernf(y) : cos_kernf(y);\n return (n + 1) & 2 ? -t : t;\n }\n\n export function cosh(x: f32): f32 { // see: musl/src/math/coshf.c\n let u = reinterpret<u32>(x);\n u &= 0x7FFFFFFF;\n x = reinterpret<f32>(u);\n if (u < 0x3F317217) {\n if (u < 0x3F800000 - (12 << 23)) return 1;\n let t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (u < 0x42B17217) {\n let t = exp(x);\n // return 0.5 * (t + 1 / t);\n return 0.5 * t + 0.5 / t;\n }\n return expo2f(x, 1);\n }\n\n // @ts-ignore: decorator\n @inline\n export function floor(x: f32): f32 {\n return builtin_floor<f32>(x);\n }\n\n export function exp(x: f32): f32 { // see: musl/src/math/expf.c and SUN COPYRIGHT NOTICE above\n if (ASC_SHRINK_LEVEL < 1) {\n return expf_lut(x);\n } else {\n const\n ln2hi = reinterpret<f32>(0x3F317200), // 6.9314575195e-1f\n ln2lo = reinterpret<f32>(0x35BFBE8E), // 1.4286067653e-6f\n invln2 = reinterpret<f32>(0x3FB8AA3B), // 1.4426950216e+0f\n P1 = reinterpret<f32>(0x3E2AAA8F), // 1.6666625440e-1f\n P2 = reinterpret<f32>(0xBB355215), // -2.7667332906e-3f\n Ox1p127f = reinterpret<f32>(0x7F000000); // 0x1p+127f\n\n let hx = reinterpret<u32>(x);\n let sign = hx >> 31;\n hx &= 0x7FFFFFFF;\n if (hx >= 0x42AEAC50) {\n if (hx > 0x7F800000) return x; // NaN\n if (hx >= 0x42B17218) {\n if (!sign) return x * Ox1p127f;\n else if (hx >= 0x42CFF1B5) return 0;\n }\n }\n let hi: f32, lo: f32;\n let k: i32;\n if (hx > 0x3EB17218) {\n if (hx > 0x3F851592) {\n k = i32(invln2 * x + builtin_copysign<f32>(0.5, x));\n } else {\n k = 1 - (sign << 1);\n }\n hi = x - <f32>k * ln2hi;\n lo = <f32>k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x39000000) {\n k = 0;\n hi = x;\n lo = 0;\n } else {\n return 1 + x;\n }\n let xx = x * x;\n let c = x - xx * (P1 + xx * P2);\n let y: f32 = 1 + (x * c / (2 - c) - lo + hi);\n return k == 0 ? y : scalbn(y, k);\n }\n }\n\n export function exp2(x: f32): f32 {\n return exp2f_lut(x);\n }\n\n export function expm1(x: f32): f32 { // see: musl/src/math/expm1f.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret<f32>(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret<f32>(0x3717F7D1), // 9.0580006145e-06f\n invln2 = reinterpret<f32>(0x3FB8AA3B), // 1.4426950216e+00f\n Q1 = reinterpret<f32>(0xBD088868), // -3.3333212137e-02f\n Q2 = reinterpret<f32>(0x3ACF3010), // 1.5807170421e-03f\n Ox1p127f = reinterpret<f32>(0x7F000000); // 0x1p+127f\n\n let u = reinterpret<u32>(x);\n let hx = u & 0x7FFFFFFF;\n let sign = u >> 31;\n if (hx >= 0x4195B844) {\n if (hx > 0x7F800000) return x;\n if (sign) return -1;\n if (hx > 0x42B17217) { // x > log(FLT_MAX)\n x *= Ox1p127f;\n return x;\n }\n }\n let c: f32 = 0.0, t: f32, k: i32;\n if (hx > 0x3EB17218) {\n k = select<i32>(\n 1 - (sign << 1),\n i32(invln2 * x + builtin_copysign<f32>(0.5, x)),\n hx < 0x3F851592\n );\n t = <f32>k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x33000000) {\n return x;\n } else k = 0;\n let hfx: f32 = 0.5 * x;\n let hxs: f32 = x * hfx;\n let r1: f32 = 1.0 + hxs * (Q1 + hxs * Q2);\n t = 3.0 - r1 * hfx;\n let e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x7F + k) << 23;\n let twopk = reinterpret<f32>(u);\n let y: f32;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 128) y = y * 2.0 * Ox1p127f;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x7F - k) << 23;\n y = reinterpret<f32>(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n // @ts-ignore: decorator\n @inline\n export function fround(x: f32): f32 {\n return x;\n }\n\n export function hypot(x: f32, y: f32): f32 { // see: musl/src/math/hypotf.c\n const\n Ox1p90f = reinterpret<f32>(0x6C800000),\n Ox1p_90f = reinterpret<f32>(0x12800000);\n\n let ux = reinterpret<u32>(x);\n let uy = reinterpret<u32>(y);\n ux &= 0x7FFFFFFF;\n uy &= 0x7FFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n x = reinterpret<f32>(ux);\n y = reinterpret<f32>(uy);\n if (uy == 0xFF << 23) return y;\n if (ux >= 0xFF << 23 || uy == 0 || ux - uy >= 25 << 23) return x + y;\n let z: f32 = 1;\n if (ux >= (0x7F + 60) << 23) {\n z = Ox1p90f;\n x *= Ox1p_90f;\n y *= Ox1p_90f;\n } else if (uy < (0x7F - 60) << 23) {\n z = Ox1p_90f;\n x *= Ox1p90f;\n y *= Ox1p90f;\n }\n return z * builtin_sqrt<f32>(f32(<f64>x * x + <f64>y * y));\n }\n\n // @ts-ignore: decorator\n @inline\n export function imul(x: f32, y: f32): f32 {\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n return <f32>(dtoi32(x) * dtoi32(y));\n }\n\n export function log(x: f32): f32 { // see: musl/src/math/logf.c and SUN COPYRIGHT NOTICE above\n if (ASC_SHRINK_LEVEL < 1) {\n return logf_lut(x);\n } else {\n const\n ln2_hi = reinterpret<f32>(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret<f32>(0x3717F7D1), // 9.0580006145e-06f\n Lg1 = reinterpret<f32>(0x3F2AAAAA), // 0xaaaaaa.0p-24f\n Lg2 = reinterpret<f32>(0x3ECCCE13), // 0xccce13.0p-25f\n Lg3 = reinterpret<f32>(0x3E91E9EE), // 0x91e9ee.0p-25f\n Lg4 = reinterpret<f32>(0x3E789E26), // 0xf89e26.0p-26f\n Ox1p25f = reinterpret<f32>(0x4C000000);\n\n let u = reinterpret<u32>(x);\n let k = 0;\n let sign = u >> 31;\n if (sign || u < 0x00800000) {\n if (u << 1 == 0) return -1 / (x * x);\n if (sign) return (x - x) / 0;\n k -= 25;\n x *= Ox1p25f;\n u = reinterpret<u32>(x);\n } else if (u >= 0x7F800000) {\n return x;\n } else if (u == 0x3F800000) {\n return 0;\n }\n u += 0x3F800000 - 0x3F3504F3;\n k += i32(u >> 23) - 0x7F;\n u = (u & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret<f32>(u);\n let f = x - 1.0;\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * Lg4);\n let t2 = z * (Lg1 + w * Lg3);\n let r = t2 + t1;\n let hfsq = <f32>0.5 * f * f;\n let dk = <f32>k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n }\n\n export function log10(x: f32): f32 { // see: musl/src/math/log10f.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret<f32>(0x3EDE6000), // 4.3432617188e-01f\n ivln10lo = reinterpret<f32>(0xB804EAD9), // -3.1689971365e-05f\n log10_2hi = reinterpret<f32>(0x3E9A2080), // 3.0102920532e-01f\n log10_2lo = reinterpret<f32>(0x355427DB), // 7.9034151668e-07f\n Lg1 = reinterpret<f32>(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret<f32>(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret<f32>(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret<f32>(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret<f32>(0x4C000000); // 0x1p25f\n\n let ux = reinterpret<u32>(x);\n let k = 0;\n let sign = ux >> 31;\n if (sign || ux < 0x00800000) {\n if (ux << 1 == 0) return -1 / (x * x);\n if (sign) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ux = reinterpret<u32>(x);\n } else if (ux >= 0x7F800000) {\n return x;\n } else if (ux == 0x3F800000) {\n return 0;\n }\n ux += 0x3F800000 - 0x3F3504F3;\n k += i32(ux >> 23) - 0x7F;\n ux = (ux & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret<f32>(ux);\n let f = x - 1.0;\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * Lg4);\n let t2 = z * (Lg1 + w * Lg3);\n let r = t2 + t1;\n let hfsq: f32 = 0.5 * f * f;\n let hi = f - hfsq;\n ux = reinterpret<u32>(hi);\n ux &= 0xFFFFF000;\n hi = reinterpret<f32>(ux);\n let lo = f - hi - hfsq + s * (hfsq + r);\n let dk = <f32>k;\n return dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi + hi * ivln10hi + dk * log10_2hi;\n }\n\n export function log1p(x: f32): f32 { // see: musl/src/math/log1pf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret<f32>(0x3F317180), // 6.9313812256e-01\n ln2_lo = reinterpret<f32>(0x3717F7D1), // 9.0580006145e-06\n Lg1 = reinterpret<f32>(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret<f32>(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret<f32>(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret<f32>(0x3E789E26); // 0xf89e26.0p-26f, 0.24279078841f\n\n let ix = reinterpret<u32>(x);\n let c: f32 = 0;\n let f: f32 = 0;\n let k = 1;\n if (ix < 0x3ED413D0 || bool(ix >> 31)) {\n if (ix >= 0xBF800000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (ix << 1 < 0x33800000 << 1) return x;\n if (ix <= 0xBE95F619) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (ix >= 0x7F800000) return x;\n if (k) {\n let uf: f32 = 1 + x;\n let iu = reinterpret<u32>(uf);\n iu += 0x3F800000 - 0x3F3504F3;\n k = i32(iu >> 23) - 0x7F;\n if (k < 25) {\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n iu = (iu & 0x007FFFFF) + 0x3F3504F3;\n f = reinterpret<f32>(iu) - 1;\n }\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * Lg4);\n let t2 = z * (Lg1 + w * Lg3);\n let r = t2 + t1;\n let hfsq: f32 = 0.5 * f * f;\n let dk = <f32>k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f32): f32 { // see: musl/src/math/log2f.c and SUN COPYRIGHT NOTICE above\n if (ASC_SHRINK_LEVEL < 1) {\n return log2f_lut(x);\n } else {\n const\n ivln2hi = reinterpret<f32>(0x3FB8B000), // 1.4428710938e+00f\n ivln2lo = reinterpret<f32>(0xB9389AD4), // -1.7605285393e-04\n Lg1 = reinterpret<f32>(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret<f32>(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret<f32>(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret<f32>(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret<f32>(0x4C000000); // 0x1p25f\n\n let ux = reinterpret<u32>(x);\n let k = 0;\n let sign = ux >> 31;\n if (sign || ux < 0x00800000) {\n if (ux << 1 == 0) return -1 / (x * x);\n if (sign) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ux = reinterpret<u32>(x);\n } else if (ux >= 0x7F800000) {\n return x;\n } else if (ux == 0x3F800000) {\n return 0;\n }\n ux += 0x3F800000 - 0x3F3504F3;\n k += i32(ux >> 23) - 0x7F;\n ux = (ux & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret<f32>(ux);\n let f = x - 1.0;\n let s = f / (2.0 + f);\n let z = s * s;\n let w = z * z;\n let t1 = w * (Lg2 + w * Lg4);\n let t2 = z * (Lg1 + w * Lg3);\n let r = t2 + t1;\n let hfsq: f32 = 0.5 * f * f;\n let hi = f - hfsq;\n let u = reinterpret<u32>(hi);\n u &= 0xFFFFF000;\n hi = reinterpret<f32>(u);\n let lo: f32 = f - hi - hfsq + s * (hfsq + r);\n let dk = <f32>k;\n return (lo + hi) * ivln2lo + lo * ivln2hi + hi * ivln2hi + dk;\n }\n }\n\n // @ts-ignore: decorator\n @inline\n export function max(value1: f32, value2: f32): f32 {\n return builtin_max<f32>(value1, value2);\n }\n\n // @ts-ignore: decorator\n @inline\n export function min(value1: f32, value2: f32): f32 {\n return builtin_min<f32>(value1, value2);\n }\n\n export function pow(x: f32, y: f32): f32 {\n // TODO: remove this fast pathes after introduced own mid-end IR with \"stdlib call simplify\" transforms\n if (builtin_abs<f32>(y) <= 2) {\n if (y == 2.0) return x * x;\n if (y == 0.5) {\n return select<f32>(\n builtin_abs<f32>(builtin_sqrt<f32>(x)),\n Infinity,\n x != -Infinity\n );\n }\n if (y == -1.0) return 1 / x;\n if (y == 1.0) return x;\n if (y == 0.0) return 1.0;\n }\n if (ASC_SHRINK_LEVEL < 1) {\n // see: musl/src/math/powf.c\n return powf_lut(x, y);\n } else {\n // based on: jdh8/metallic/src/math/float/powf.c\n if (y == 0) return 1;\n // @ts-ignore: cast\n if (isNaN(x) | isNaN(y)) {\n return NaN;\n }\n let sign: u32 = 0;\n let uy = reinterpret<u32>(y);\n let ux = reinterpret<u32>(x);\n let sx = ux >> 31;\n ux &= 0x7FFFFFFF;\n if (sx && nearest(y) == y) {\n x = -x;\n sx = 0;\n sign = u32(nearest(y * 0.5) != y * 0.5) << 31;\n }\n let m: u32;\n if (ux == 0x3F800000) { // x == 1\n m = sx | u32((uy & 0x7FFFFFFF) == 0x7F800000) ? 0x7FC00000 : 0x3F800000;\n } else if (ux == 0) {\n m = <i32>uy < 0 ? 0x7F800000 : 0;\n } else if (ux == 0x7F800000) {\n m = <i32>uy < 0 ? 0 : 0x7F800000;\n } else if (sx) {\n m = 0x7FC00000;\n } else {\n m = reinterpret<u32>(<f32>exp2f(<f64>y * log2f(x)));\n }\n return reinterpret<f32>(m | sign);\n }\n }\n\n // @ts-ignore: decorator\n @inline\n export function seedRandom(value: i64): void {\n NativeMath.seedRandom(value);\n }\n\n // Using xoroshiro64starstar from http://xoshiro.di.unimi.it/xoroshiro64starstar.c\n export function random(): f32 {\n if (!random_seeded) seedRandom(reinterpret<i64>(seed()));\n\n let s0 = random_state0_32;\n let s1 = random_state1_32;\n let r = rotl<u32>(s0 * 0x9E3779BB, 5) * 5;\n\n s1 ^= s0;\n random_state0_32 = rotl<u32>(s0, 26) ^ s1 ^ (s1 << 9);\n random_state1_32 = rotl<u32>(s1, 13);\n\n return reinterpret<f32>((r >> 9) | (127 << 23)) - 1.0;\n }\n\n export function round(x: f32): f32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_ceil<f32>(x) - f32(builtin_ceil<f32>(x) - 0.5 > x);\n } else {\n let roundUp = builtin_ceil<f32>(x);\n return select<f32>(roundUp, roundUp - 1.0, roundUp - 0.5 <= x);\n }\n }\n\n export function sign(x: f32): f32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return select<f32>(builtin_copysign<f32>(1, x), x, builtin_abs(x) > 0);\n } else {\n return select<f32>(1, select<f32>(-1, x, x < 0), x > 0);\n }\n }\n\n // @ts-ignore: decorator\n @inline\n export function signbit(x: f32): bool {\n return <bool>(reinterpret<u32>(x) >>> 31);\n }\n\n export function sin(x: f32): f32 { // see: musl/src/math/sinf.c\n const\n s1pio2 = reinterpret<f64>(0x3FF921FB54442D18), // M_PI_2 * 1\n s2pio2 = reinterpret<f64>(0x400921FB54442D18), // M_PI_2 * 2\n s3pio2 = reinterpret<f64>(0x4012D97C7F3321D2), // M_PI_2 * 3\n s4pio2 = reinterpret<f64>(0x401921FB54442D18); // M_PI_2 * 4\n\n let ux = reinterpret<u32>(x);\n let sign = ux >> 31;\n ux &= 0x7FFFFFFF;\n\n if (ux <= 0x3F490FDA) { // |x| ~<= π/4\n if (ux < 0x39800000) { // |x| < 2**-12\n return x;\n }\n return sin_kernf(x);\n }\n\n if (ASC_SHRINK_LEVEL < 1) {\n if (ux <= 0x407B53D1) { // |x| ~<= 5π/4\n if (ux <= 0x4016CBE3) { // |x| ~<= 3π/4\n return sign ? -cos_kernf(x + s1pio2) : cos_kernf(x - s1pio2);\n }\n return sin_kernf(-(sign ? x + s2pio2 : x - s2pio2));\n }\n\n if (ux <= 0x40E231D5) { // |x| ~<= 9π/4\n if (ux <= 0x40AFEDDF) { // |x| ~<= 7π/4\n return sign ? cos_kernf(x + s3pio2) : -cos_kernf(x - s3pio2);\n }\n return sin_kernf(sign ? x + s4pio2 : x - s4pio2);\n }\n }\n\n // sin(Inf or NaN) is NaN\n if (ux >= 0x7F800000) return x - x;\n\n let n = rempio2f(x, ux, sign);\n let y = rempio2f_y;\n\n let t = n & 1 ? cos_kernf(y) : sin_kernf(y);\n return n & 2 ? -t : t;\n }\n\n export function sinh(x: f32): f32 { // see: musl/src/math/sinhf.c\n let u = reinterpret<u32>(x) & 0x7FFFFFFF;\n let a = reinterpret<f32>(u);\n let h = builtin_copysign<f32>(0.5, x);\n if (u < 0x42B17217) {\n let t = expm1(a);\n if (u < 0x3F800000) {\n if (u < 0x3F800000 - (12 << 23)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n return expo2f(a, 2 * h);\n }\n\n // @ts-ignore: decorator\n @inline\n export function sqrt(x: f32): f32 {\n return builtin_sqrt<f32>(x);\n }\n\n export function tan(x: f32): f32 { // see: musl/src/math/tanf.c\n const\n t1pio2 = reinterpret<f64>(0x3FF921FB54442D18), // 1 * M_PI_2\n t2pio2 = reinterpret<f64>(0x400921FB54442D18), // 2 * M_PI_2\n t3pio2 = reinterpret<f64>(0x4012D97C7F3321D2), // 3 * M_PI_2\n t4pio2 = reinterpret<f64>(0x401921FB54442D18); // 4 * M_PI_2\n\n let ux = reinterpret<u32>(x);\n let sign = ux >> 31;\n ux &= 0x7FFFFFFF;\n\n if (ux <= 0x3F490FDA) { // |x| ~<= π/4\n if (ux < 0x39800000) { // |x| < 2**-12\n return x;\n }\n return tan_kernf(x, 0);\n }\n\n if (ASC_SHRINK_LEVEL < 1) {\n if (ux <= 0x407B53D1) { // |x| ~<= 5π/4\n if (ux <= 0x4016CBE3) { // |x| ~<= 3π/4\n return tan_kernf((sign ? x + t1pio2 : x - t1pio2), 1);\n } else {\n return tan_kernf((sign ? x + t2pio2 : x - t2pio2), 0);\n }\n }\n if (ux <= 0x40E231D5) { // |x| ~<= 9π/4\n if (ux <= 0x40AFEDDF) { // |x| ~<= 7π/4\n return tan_kernf((sign ? x + t3pio2 : x - t3pio2), 1);\n } else {\n return tan_kernf((sign ? x + t4pio2 : x - t4pio2), 0);\n }\n }\n }\n\n // tan(Inf or NaN) is NaN\n if (ux >= 0x7F800000) return x - x;\n\n // argument reduction\n let n = rempio2f(x, ux, sign);\n let y = rempio2f_y;\n return tan_kernf(y, n & 1);\n }\n\n export function tanh(x: f32): f32 { // see: musl/src/math/tanhf.c\n let u = reinterpret<u32>(x);\n u &= 0x7FFFFFFF;\n let y = reinterpret<f32>(u);\n let t: f32;\n if (u > 0x3F0C9F54) {\n if (u > 0x41200000) t = 1 + 0 / y;\n else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (u > 0x3E82C578) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (u >= 0x00800000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign<f32>(t, x);\n }\n\n // @ts-ignore: decorator\n @inline\n export function trunc(x: f32): f32 {\n return builtin_trunc<f32>(x);\n }\n\n export function scalbn(x: f32, n: i32): f32 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbnf.c\n const\n Ox1p24f = reinterpret<f32>(0x4B800000),\n Ox1p127f = reinterpret<f32>(0x7F000000),\n Ox1p_126f = reinterpret<f32>(0x00800000);\n\n let y = x;\n if (n > 127) {\n y *= Ox1p127f;\n n -= 127;\n if (n > 127) {\n y *= Ox1p127f;\n n = builtin_min<i32>(n - 127, 127);\n }\n } else if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n += 126 - 24;\n if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n = builtin_max<i32>(n + 126 - 24, -126);\n }\n }\n return y * reinterpret<f32>(<u32>(0x7F + n) << 23);\n }\n\n export function mod(x: f32, y: f32): f32 { // see: musl/src/math/fmodf.c\n if (builtin_abs<f32>(y) == 1.0) {\n // x % 1, x % -1 ==> sign(x) * abs(x - 1.0 * trunc(x / 1.0))\n // TODO: move this rule to compiler's optimization pass.\n // It could be apply for any x % C_pot, where \"C_pot\" is pow of two const.\n return builtin_copysign<f32>(x - builtin_trunc<f32>(x), x);\n }\n let ux = reinterpret<u32>(x);\n let uy = reinterpret<u32>(y);\n let ex = i32(ux >> 23 & 0xFF);\n let ey = i32(uy >> 23 & 0xFF);\n let sm = ux & 0x80000000;\n let uy1 = uy << 1;\n if (uy1 == 0 || ex == 0xFF || isNaN<f32>(y)) {\n let m = x * y;\n return m / m;\n }\n let ux1 = ux << 1;\n if (ux1 <= uy1) {\n return x * f32(ux1 != uy1);\n }\n if (!ex) {\n ex -= builtin_clz<u32>(ux << 9);\n ux <<= 1 - ex;\n } else {\n ux &= <u32>-1 >> 9;\n ux |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz<u32>(uy << 9);\n uy <<= 1 - ey;\n } else {\n uy &= u32(-1) >> 9;\n uy |= 1 << 23;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 23); ux <<= 1) --ex;\n let shift = <i32>builtin_clz<u32>(ux << 8);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 23;\n ux |= <u32>ex << 23;\n } else {\n ux >>= -ex + 1;\n }\n return reinterpret<f32>(ux | sm);\n }\n\n export function rem(x: f32, y: f32): f32 { // see: musl/src/math/remquof.c\n let ux = reinterpret<u32>(x);\n let uy = reinterpret<u32>(y);\n let ex = i32(ux >> 23 & 0xFF);\n let ey = i32(uy >> 23 & 0xFF);\n let uxi = ux;\n if (uy << 1 == 0 || ex == 0xFF || isNaN(y)) return (x * y) / (x * y);\n if (ux << 1 == 0) return x;\n if (!ex) {\n ex -= builtin_clz<u32>(uxi << 9);\n uxi <<= 1 - ex;\n } else {\n uxi &= u32(-1) >> 9;\n uxi |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz<u32>(uy << 9);\n uy <<= 1 - ey;\n } else {\n uy &= u32(-1) >> 9;\n uy |= 1 << 23;\n }\n let q = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -30;\n else {\n let shift = builtin_clz<i32>(uxi << 8);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end:\n if (ex > 0) {\n uxi -= 1 << 23;\n uxi |= <u32>ex << 23;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret<f32>(uxi);\n y = builtin_abs<f32>(y);\n let x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (<f32>x2 > y || (<f32>x2 == y && bool(q & 1))))) {\n x -= y;\n // q++;\n }\n return <i32>ux < 0 ? -x : x;\n }\n\n export function sincos(x: f32): void { // see: musl/tree/src/math/sincosf.c\n const\n s1pio2 = reinterpret<f64>(0x3FF921FB54442D18), // 1 * M_PI_2\n s2pio2 = reinterpret<f64>(0x400921FB54442D18), // 2 * M_PI_2\n s3pio2 = reinterpret<f64>(0x4012D97C7F3321D2), // 3 * M_PI_2\n s4pio2 = reinterpret<f64>(0x401921FB54442D18); // 4 * M_PI_2\n\n let ux = reinterpret<u32>(x);\n let sign = ux >> 31;\n ux &= 0x7FFFFFFF;\n\n if (ux <= 0x3F490FDA) { // |x| ~<= π/4\n if (ux < 0x39800000) { // |x| < 2**-12\n sincos_sin = x;\n sincos_cos = 1;\n return;\n }\n sincos_sin = sin_kernf(x);\n sincos_cos = cos_kernf(x);\n return;\n }\n if (ASC_SHRINK_LEVEL < 1) {\n if (ux <= 0x407B53D1) { // |x| ~<= 5π/4\n if (ux <= 0x4016CBE3) { // |x| ~<= 3π/4\n if (sign) {\n sincos_sin = -cos_kernf(x + s1pio2);\n sincos_cos = sin_kernf(x + s1pio2);\n } else {\n sincos_sin = cos_kernf(s1pio2 - x);\n sincos_cos = sin_kernf(s1pio2 - x);\n }\n return;\n }\n // -sin(x + c) is not correct if x+c could be 0: -0 vs +0\n sincos_sin = -sin_kernf(sign ? x + s2pio2 : x - s2pio2);\n sincos_cos = -cos_kernf(sign ? x + s2pio2 : x - s2pio2);\n return;\n }\n if (ux <= 0x40E231D5) { // |x| ~<= 9π/4\n if (ux <= 0x40AFEDDF) { // |x| ~<= 7π/4\n if (sign) {\n sincos_sin = cos_kernf(x + s3pio2);\n sincos_cos = -sin_kernf(x + s3pio2);\n } else {\n sincos_sin = -cos_kernf(x - s3pio2);\n sincos_cos = sin_kernf(x - s3pio2);\n }\n return;\n }\n sincos_sin = sin_kernf(sign ? x + s4pio2 : x - s4pio2);\n sincos_cos = cos_kernf(sign ? x + s4pio2 : x - s4pio2);\n return;\n }\n }\n // sin(Inf or NaN) is NaN\n if (ux >= 0x7F800000) {\n let xx = x - x;\n sincos_sin = xx;\n sincos_cos = xx;\n return;\n }\n // general argument reduction needed\n let n = rempio2f(x, ux, sign);\n let y = rempio2f_y;\n let s = sin_kernf(y);\n let c = cos_kernf(y);\n let sin = s, cos = c;\n if (n & 1) {\n sin = c;\n cos = -s;\n }\n if (n & 2) {\n sin = -sin;\n cos = -cos;\n }\n sincos_sin = sin;\n sincos_cos = cos;\n }\n}\n\nexport function ipow32(x: i32, e: i32): i32 {\n let out = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (x == 2) {\n return select<i32>(1 << e, 0, <u32>e < 32);\n }\n if (e <= 0) {\n if (x == -1) return select<i32>(-1, 1, e & 1);\n return i32(e == 0) | i32(x == 1);\n }\n else if (e == 1) return x;\n else if (e == 2) return x * x;\n else if (e < 32) {\n let log = 32 - clz(e);\n // 32 = 2 ^ 5, so need only five cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 5: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n while (e) {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow64(x: i64, e: i64): i64 {\n let out: i64 = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (x == 2) {\n return select<i64>(1 << e, 0, <u64>e < 64);\n }\n if (e <= 0) {\n if (x == -1) return select<i64>(-1, 1, e & 1);\n return i64(e == 0) | i64(x == 1);\n }\n else if (e == 1) return x;\n else if (e == 2) return x * x;\n else if (e < 64) {\n let log = 64 - <i32>clz(e);\n // 64 = 2 ^ 6, so need only six cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 6: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 5: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n while (e) {\n if (e & 1) out *= x;\n e >>>= 1;\n x *= x;\n }\n return out;\n}\n\n/*\nTODO:\nIn compile time if only exponent is constant we could replace ipow32/ipow64 by shortest addition chains\nwhich usually faster than exponentiation by squaring\n\nfor ipow32 and e < 32:\n\nlet b: i32, c: i32, d: i32, h: i32, k: i32, g: i32;\nswitch (e) {\n case 1: return x;\n case 2: return x * x;\n case 3: return x * x * x;\n case 4: return (b = x * x) * b;\n case 5: return (b = x * x) * b * x;\n case 6: return (b = x * x) * b * b;\n case 7: return (b = x * x) * b * b * x;\n case 8: return (d = (b = x * x) * b) * d;\n case 9: return (c = x * x * x) * c * c;\n case 10: return (d = (b = x * x) * b) * d * b;\n case 11: return (d = (b = x * x) * b) * d * b * x;\n case 12: return (d = (b = x * x) * b) * d * d;\n case 13: return (d = (b = x * x) * b) * d * d * x;\n case 14: return (d = (b = x * x) * b) * d * d * b;\n case 15: return (k = (b = x * x) * b * x) * k * k;\n case 16: return (h = (d = (b = x * x) * b) * d) * h;\n case 17: return (h = (d = (b = x * x) * b) * d) * h * x;\n case 18: return (h = (d = (b = x * x) * b) * d * x) * h;\n case 19: return (h = (d = (b = x * x) * b) * d * x) * h * x;\n case 20: return (h = (k = (b = x * x) * b * x) * k) * h;\n case 21: return (h = (k = (b = x * x) * b * x) * k) * h * x;\n case 22: return (g = (h = (k = (b = x * x) * b * x) * k) * x) * g;\n case 23: return (h = (d = (c = (b = x * x) * x) * b) * d) * h * c;\n case 24: return (h = (d = (c = x * x * x) * c) * d) * h;\n case 25: return (h = (d = (c = x * x * x) * c) * d) * h * x;\n case 26: return (g = (h = (d = (c = x * x * x) * c) * d) * x) * g;\n case 27: return (h = (d = (c = x * x * x) * c) * d) * h * c;\n case 28: return (h = (d = (c = x * x * x) * c * x) * d) * h;\n case 29: return (h = (d = (c = x * x * x) * c * x) * d) * h * x;\n case 30: return (h = (d = (c = x * x * x) * c) * d * c) * h;\n case 31: return (h = (d = (c = x * x * x) * c) * d * c) * h * x;\n}\n\nfor ipow64: TODO\nswitch (e) {\n case 32:\n ...\n case 63:\n}\n*/\n","import { strtol, strtod, strtob } from \"./util/string\";\n\ntype auto = i32;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isBoolean<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isInteger<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isSigned<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isFloat<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isVector<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isReference<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isString<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isArray<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isArrayLike<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isFunction<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isNullable<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isDefined(expression: auto): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isConstant(expression: auto): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isManaged<T>(value?: T): bool;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isVoid<T>(): bool;\n\n// @ts-ignore\n@builtin\nexport declare function lengthof<T>(func?: T): i32;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function clz<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function ctz<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function popcnt<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function rotl<T>(value: T, shift: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function rotr<T>(value: T, shift: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function abs<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function max<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function min<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function ceil<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function floor<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function copysign<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function nearest<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function reinterpret<T>(value: number): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function sqrt<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function trunc<T>(value: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function add<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function sub<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function mul<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function div<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function eq<T>(left: T, right: T): i32;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function ne<T>(left: T, right: T): i32;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function rem<T>(left: T, right: T): T;\n\n// @ts-ignore: decorator\n@unsafe @builtin\nexport declare function load<T>(ptr: usize, immOffset?: usize, immAlign?: usize): T;\n\n// @ts-ignore: decorator\n@unsafe @builtin\nexport declare function store<T>(ptr: usize, value: auto, immOffset?: usize, immAlign?: usize): void;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function sizeof<T>(): usize; // | u32 / u64\n\n// @ts-ignore: decorator\n@builtin\nexport declare function alignof<T>(): usize; // | u32 / u64\n\n// @ts-ignore: decorator\n@builtin\nexport declare function offsetof<T>(fieldName?: string): usize; // | u32 / u64\n\n// @ts-ignore: decorator\n@builtin\nexport declare function idof<T>(): u32;\n\n// @ts-ignore\n@builtin\nexport declare function nameof<T>(): string;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function select<T>(ifTrue: T, ifFalse: T, condition: bool): T;\n\n// @ts-ignore: decorator\n@unsafe @builtin\nexport declare function unreachable(): auto;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function changetype<T>(value: auto): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function assert<T>(isTrueish: T, message?: string): T;\n\n// @ts-ignore: decorator\n@unsafe @builtin\nexport declare function unchecked<T>(expr: T): T;\n\nexport namespace inline {\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function always<T>(expr: T): T;\n}\n\n// @ts-ignore: decorator\n@unsafe @builtin\nexport declare function call_indirect<T>(index: u32, ...args: auto[]): T;\n\n// @ts-ignore: decorator\n@builtin\nexport declare function instantiate<T>(...args: auto[]): T;\n\nexport namespace atomic {\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load<T>(ptr: usize, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store<T>(ptr: usize, value: T, immOffset?: usize): void;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add<T>(ptr: usize, value: T, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub<T>(ptr: usize, value: T, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and<T>(ptr: usize, value: T, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or<T>(ptr: usize, value: T, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor<T>(ptr: usize, value: T, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg<T>(ptr: usize, value: T, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg<T>(ptr: usize, expected: T, replacement: T, immOffset?: usize): T;\n\n // @ts-ignore: decorator\n @builtin\n export declare function wait<T>(ptr: usize, expected: T, timeout: i64): AtomicWaitResult;\n\n // @ts-ignore: decorator\n @builtin\n export declare function notify(ptr: usize, count: i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function fence(): void;\n}\n\n// @ts-ignore: decorator\n@lazy\nexport const enum AtomicWaitResult {\n OK = 0,\n NOT_EQUAL = 1,\n TIMED_OUT = 2\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i8(value: auto): i8;\n\nexport namespace i8 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: i8 = -128;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: i8 = 127;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): i8 {\n return <i8>strtol<i32>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i16(value: auto): i16;\n\nexport namespace i16 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: i16 = -32768;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: i16 = 32767;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): i16 {\n return <i16>strtol<i32>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i32(value: auto): i32;\n\nexport namespace i32 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: i32 = -2147483648;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: i32 = 2147483647;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): i32 {\n return strtol<i32>(value, radix);\n }\n\n // @ts-ignore: decorator\n @builtin\n export declare function clz(value: i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ctz(value: i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function popcnt(value: i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(left: i32, right:i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(left: i32, right:i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(left: i32, right:i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div_s(left: i32, right:i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div_u(left: i32, right:i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rotl(value: i32, shift: i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rotr(value: i32, shift: i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(left: i32, right:i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(left: i32, right:i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rem_s(left: i32, right: i32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rem_u(left: u32, right: u32): u32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function reinterpret_f32(value: f32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8_s(ptr: usize, immOffset?: usize, immAlign?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8_u(ptr: usize, immOffset?: usize, immAlign?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16_s(ptr: usize, immOffset?: usize, immAlign?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16_u(ptr: usize, immOffset?: usize, immAlign?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store8(ptr: usize, value: i32, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store16(ptr: usize, value: i32, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store(ptr: usize, value: i32, immOffset?: usize, immAlign?: usize): void;\n\n export namespace atomic {\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8_u(ptr: usize, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16_u(ptr: usize, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load(ptr: usize, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store8(ptr: usize, value: i32, immOffset?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store16(ptr: usize, value: i32, immOffset?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store(ptr: usize, value: i32, immOffset?: usize): void;\n\n export namespace rmw8 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg_u(ptr: usize, expected: i32, replacement: i32, immOffset?: usize): i32;\n }\n\n export namespace rmw16 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg_u(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg_u(ptr: usize, expected: i32, replacement: i32, immOffset?: usize): i32;\n }\n\n export namespace rmw {\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg(ptr: usize, value: i32, immOffset?: usize): i32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg(ptr: usize, expected: i32, replacement: i32, immOffset?: usize): i32;\n }\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i64(value: auto): i64;\n\nexport namespace i64 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: i64 = -9223372036854775808;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: i64 = 9223372036854775807;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): i64 {\n return strtol<i64>(value, radix);\n }\n\n // @ts-ignore: decorator\n @builtin\n export declare function clz(value: i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ctz(value: i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(left: i64, right:i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(left: i64, right:i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(left: i64, right:i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div_s(left: i64, right:i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div_u(left: i64, right:i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8_s(ptr: usize, immOffset?: usize, immAlign?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8_u(ptr: usize, immOffset?: usize, immAlign?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16_s(ptr: usize, immOffset?: usize, immAlign?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16_u(ptr: usize, immOffset?: usize, immAlign?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load32_s(ptr: usize, immOffset?: usize, immAlign?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load32_u(ptr: usize, immOffset?: usize, immAlign?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load(ptr: usize, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function popcnt(value: i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rotl(value: i64, shift: i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rotr(value: i64, shift: i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(left: i64, right:i64): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(left: i64, right:i64): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rem_s(left: i64, right: i64): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function rem_u(left: u64, right: u64): u64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function reinterpret_f64(value: f64): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store8(ptr: usize, value: i64, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store16(ptr: usize, value: i64, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store32(ptr: usize, value: i64, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store(ptr: usize, value: i64, immOffset?: usize, immAlign?: usize): void;\n\n export namespace atomic {\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8_u(ptr: usize, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16_u(ptr: usize, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load32_u(ptr: usize, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load(ptr: usize, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store8(ptr: usize, value: i64, immOffset?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store16(ptr: usize, value: i64, immOffset?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store32(ptr: usize, value: i64, immOffset?: usize): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store(ptr: usize, value: i64, immOffset?: usize): void;\n\n export namespace rmw8 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg_u(ptr: usize, expected: i64, replacement: i64, immOffset?: usize): i64;\n }\n\n export namespace rmw16 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg_u(ptr: usize, expected: i64, replacement: i64, immOffset?: usize): i64;\n }\n\n export namespace rmw32 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg_u(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg_u(ptr: usize, expected: i64, replacement: i64, immOffset?: usize): i64;\n }\n\n export namespace rmw {\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function xchg(ptr: usize, value: i64, immOffset?: usize): i64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function cmpxchg(ptr: usize, expected: i64, replacement: i64, immOffset?: usize): i64;\n }\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function isize(value: auto): isize;\n\nexport namespace isize {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: isize = sizeof<i32>() == sizeof<isize>()\n ? -2147483648\n : <isize>-9223372036854775808;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: isize = sizeof<i32>() == sizeof<isize>()\n ? 2147483647\n : <isize>9223372036854775807;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): isize {\n return <isize>strtol<i64>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function u8(value: auto): u8;\n\nexport namespace u8 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: u8 = 0;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: u8 = 255;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): u8 {\n return <u8>strtol<i32>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function u16(value: auto): u16;\n\nexport namespace u16 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: u16 = 0;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: u16 = 65535;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): u16 {\n return <u16>strtol<i32>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function u32(value: auto): u32;\n\nexport namespace u32 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: u32 = 0;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: u32 = 4294967295;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): u32 {\n return <u32>strtol<i32>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function u64(value: auto): u64;\n\nexport namespace u64 {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: u64 = 0;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: u64 = 18446744073709551615;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): u64 {\n return <u64>strtol<i64>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function usize(value: auto): usize;\n\nexport namespace usize {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: usize = 0;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: usize = sizeof<u32>() == sizeof<usize>()\n ? 4294967295\n : <usize>18446744073709551615;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string, radix: i32 = 0): usize {\n return <usize>strtol<i64>(value, radix);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function bool(value: auto): bool;\n\nexport namespace bool {\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE: bool = false;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE: bool = true;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string): bool {\n return strtob(value);\n }\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function f32(value: auto): f32;\n\nexport namespace f32 {\n\n // @ts-ignore: decorator\n @lazy\n export const EPSILON = reinterpret<f32>(0x34000000); // 0x1p-23f\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE = reinterpret<f32>(0x00000001); // 0x0.000001p+0f\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE = reinterpret<f32>(0x7F7FFFFF); // 0x1.fffffep+127f\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_NORMAL_VALUE = reinterpret<f32>(0x00800000); // 0x1p-126f\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_SAFE_INTEGER: f32 = -16777215;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_SAFE_INTEGER: f32 = 16777215;\n\n // @ts-ignore: decorator\n @lazy\n export const POSITIVE_INFINITY: f32 = Infinity;\n\n // @ts-ignore: decorator\n @lazy\n export const NEGATIVE_INFINITY: f32 = -Infinity;\n\n // @ts-ignore: decorator\n @lazy\n export const NaN: f32 = 0.0 / 0.0;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string): f32 {\n return <f32>strtod(value);\n }\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(value: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ceil(value: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function copysign(x: f32, y: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function floor(value: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max(left: f32, right: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min(left: f32, right: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function nearest(value: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function reinterpret_i32(value: i32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sqrt(value: f32): f32;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store(ptr: usize, value: f32, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc(value: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(left: f32, right: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(left: f32, right: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(left: f32, right: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div(left: f32, right: f32): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(left: f32, right: f32): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(left: f32, right: f32): i32;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function f64(value: auto): f64;\n\nexport namespace f64 {\n\n // @ts-ignore: decorator\n @lazy\n export const EPSILON = reinterpret<f64>(0x3CB0000000000000); // 0x1p-52\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_VALUE = reinterpret<f64>(0x0000000000000001); // 0x0.0000000000001p+0\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_VALUE = reinterpret<f64>(0x7FEFFFFFFFFFFFFF); // 0x1.fffffffffffffp+1023\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_NORMAL_VALUE = reinterpret<f64>(0x0010000000000000); // 0x1p-1022\n\n // @ts-ignore: decorator\n @lazy\n export const MIN_SAFE_INTEGER: f64 = -9007199254740991;\n\n // @ts-ignore: decorator\n @lazy\n export const MAX_SAFE_INTEGER: f64 = 9007199254740991;\n\n // @ts-ignore: decorator\n @lazy\n export const POSITIVE_INFINITY: f64 = Infinity;\n\n // @ts-ignore: decorator\n @lazy\n export const NEGATIVE_INFINITY: f64 = -Infinity;\n\n // @ts-ignore: decorator\n @lazy\n export const NaN: f64 = 0.0 / 0.0;\n\n // @ts-ignore: decorator\n @inline\n export function parse(value: string): f64 {\n return strtod(value);\n }\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(value: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ceil(value: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function copysign(x: f64, y: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function floor(value: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max(left: f64, right: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min(left: f64, right: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function nearest(value: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function reinterpret_i64(value: i64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sqrt(value: f64): f64;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store(ptr: usize, value: f64, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc(value: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(left: f64, right: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(left: f64, right: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(left: f64, right: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div(left: f64, right: f64): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(left: f64, right: f64): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(left: f64, right: f64): i32;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function v128(\n a: i8, b: i8, c: i8, d: i8, e: i8, f: i8, g: i8, h: i8,\n i: i8, j: i8, k: i8, l: i8, m: i8, n: i8, o: i8, p: i8\n): v128;\n\nexport namespace v128 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function splat<T>(x: T): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane<T>(x: v128, idx: u8): T;\n\n // @ts-ignore: decorator\n @builtin\n export declare function replace_lane<T>(x: v128, idx: u8, value: T): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shuffle<T>(a: v128, b: v128, ...lanes: u8[]): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function swizzle(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load(ptr: usize, immOffset?: usize, immAlign?: usize): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load_ext<TFrom>(ptr: usize, immOffset?: usize, immAlign?: usize): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load_zero<TFrom>(ptr: usize, immOffset?: usize, immAlign?: usize): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load_lane<TFrom>(ptr: usize, vec: v128, idx: u8, immOffset?: usize, immAlign?: usize): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store_lane<TFrom>(ptr: usize, vec: v128, idx: u8, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8x8_s(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load8x8_u(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16x4_s(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load16x4_u(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load32x2_s(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function load32x2_u(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load_splat<T>(ptr: usize, immOffset?: usize, immAlign?: usize): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load8_splat(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load16_splat(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load32_splat(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load64_splat(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load32_zero(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load64_zero(ptr: usize, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load8_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load16_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load32_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function load64_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): v128;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store8_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store16_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store32_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store64_lane(ptr: usize, vec: v128, idx: u8, immOffset?: u32, immAlign?: u32): void;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function store(ptr: usize, value: v128, immOffset?: usize, immAlign?: usize): void;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div<T>(a: v128, b: v128): v128; // f32, f64 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function neg<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_sat<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_sat<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shl<T>(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr<T>(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function and(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function or(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function xor(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function andnot(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function not(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function bitselect(v1: v128, v2: v128, c: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function any_true(a: v128): bool;\n\n // @ts-ignore: decorator\n @builtin\n export declare function all_true<T>(a: v128): bool;\n\n // @ts-ignore: decorator\n @builtin\n export declare function bitmask<T>(a: v128): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function popcnt<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function pmin<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function pmax<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function dot<T>(a: v128, b: v128): v128; // i16 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function avgr<T>(a: v128, b: v128): v128; // u8, u16 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs<T>(a: v128): v128; // f32, f64 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function sqrt<T>(a: v128): v128; // f32, f64 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function ceil<T>(a: v128): v128; // f32, f64 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function floor<T>(a: v128): v128; // f32, f64 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc<T>(a: v128): v128; // f32, f64 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function nearest<T>(a: v128): v128; // f32, f64 only\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function convert<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function convert_low<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc_sat<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc_sat_zero<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function narrow<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_low<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_high<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extadd_pairwise<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function demote_zero<T = f64>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function promote_low<T = f32>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function q15mulr_sat<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_low<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_high<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_swizzle(a: v128, s: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_trunc<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_trunc_zero<T>(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_madd<T>(a: v128, b: v128, c: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_nmadd<T>(a: v128, b: v128, c: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_laneselect<T>(a: v128, b: v128, m: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_min<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_max<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_q15mulr<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_dot<T>(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_dot_add<T>(a: v128, b: v128, c: v128): v128;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i8x16(\n a: i8, b: i8, c: i8, d: i8, e: i8, f: i8, g: i8, h: i8,\n i: i8, j: i8, k: i8, l: i8, m: i8, n: i8, o: i8, p: i8\n): v128;\n\nexport namespace i8x16 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function splat(x: i8): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane_s(x: v128, idx: u8): i8;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane_u(x: v128, idx: u8): u8;\n\n // @ts-ignore: decorator\n @builtin\n export declare function replace_lane(x: v128, idx: u8, value: i8): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function avgr_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function neg(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_sat_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_sat_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_sat_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_sat_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shl(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_s(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_u(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function all_true(a: v128): bool;\n\n // @ts-ignore: decorator\n @builtin\n export declare function bitmask(a: v128): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function popcnt(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function narrow_i16x8_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function narrow_i16x8_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shuffle(\n a: v128, b: v128,\n l0: u8, l1: u8, l2: u8, l3: u8, l4: u8, l5: u8, l6: u8, l7: u8,\n l8: u8, l9: u8, l10: u8, l11: u8, l12: u8, l13: u8, l14: u8, l15: u8\n ): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function swizzle(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_swizzle(a: v128, s: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i16x8(a: i16, b: i16, c: i16, d: i16, e: i16, f: i16, g: i16, h: i16): v128;\n\nexport namespace i16x8 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function splat(x: i16): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane_s(x: v128, idx: u8): i16;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane_u(x: v128, idx: u8): u16;\n\n // @ts-ignore: decorator\n @builtin\n export declare function replace_lane(x: v128, idx: u8, value: i16): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function avgr_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function neg(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_sat_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add_sat_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_sat_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub_sat_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shl(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_s(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_u(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function all_true(a: v128): bool;\n\n // @ts-ignore: decorator\n @builtin\n export declare function bitmask(a: v128): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function narrow_i32x4_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function narrow_i32x4_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_low_i8x16_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_low_i8x16_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_high_i8x16_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_high_i8x16_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extadd_pairwise_i8x16_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extadd_pairwise_i8x16_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function q15mulr_sat_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_low_i8x16_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_low_i8x16_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_high_i8x16_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_high_i8x16_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shuffle(\n a: v128, b: v128,\n l0: u8, l1: u8, l2: u8, l3: u8, l4: u8, l5: u8, l6: u8, l7: u8\n ): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_q15mulr_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_dot_i8x16_i7x16_s(a: v128, b: v128, c: v128): v128;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i32x4(a: i32, b: i32, c: i32, d: i32): v128;\n\nexport namespace i32x4 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function splat(x: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane(x: v128, idx: u8): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function replace_lane(x: v128, idx: u8, value: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function dot_i16x8_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function neg(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shl(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_s(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_u(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function all_true(a: v128): bool;\n\n // @ts-ignore: decorator\n @builtin\n export declare function bitmask(a: v128): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc_sat_f32x4_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc_sat_f32x4_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc_sat_f64x2_s_zero(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc_sat_f64x2_u_zero(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_low_i16x8_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_low_i16x8_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_high_i16x8_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_high_i16x8_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extadd_pairwise_i16x8_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extadd_pairwise_i16x8_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_low_i16x8_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_low_i16x8_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_high_i16x8_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_high_i16x8_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8, l2: u8, l3: u8): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_trunc_f32x4_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_trunc_f32x4_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_trunc_f64x2_s_zero(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_trunc_f64x2_u_zero(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_dot_i8x16_i7x16_add_s(a: v128, b: v128, c: v128): v128;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function i64x2(a: i64, b: i64): v128;\n\nexport namespace i64x2 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function splat(x: i64): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane(x: v128, idx: u8): i64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function replace_lane(x: v128, idx: u8, value: i64): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function neg(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shl(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_s(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shr_u(a: v128, b: i32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function all_true(a: v128): bool;\n\n // @ts-ignore: decorator\n @builtin\n export declare function bitmask(a: v128): i32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_low_i32x4_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_low_i32x4_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_high_i32x4_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extend_high_i32x4_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_low_i32x4_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_low_i32x4_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_high_i32x4_s(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extmul_high_i32x4_u(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_laneselect(a: v128, b: v128, m: v128): v128;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function f32x4(a: f32, b: f32, c: f32, d: f32): v128;\n\nexport namespace f32x4 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function splat(x: f32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane(x: v128, idx: u8): f32;\n\n // @ts-ignore: decorator\n @builtin\n export declare function replace_lane(x: v128, idx: u8, value: f32): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function neg(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function pmin(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function pmax(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sqrt(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ceil(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function floor(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function nearest(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function convert_i32x4_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function convert_i32x4_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function demote_f64x2_zero(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8, l2: u8, l3: u8): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_madd(a: v128, b: v128, c: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_nmadd(a: v128, b: v128, c: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_min(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_max(a: v128, b: v128): v128;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare function f64x2(a: f64, b: f64): v128;\n\nexport namespace f64x2 {\n\n // @ts-ignore: decorator\n @builtin\n export declare function splat(x: f64): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function extract_lane(x: v128, idx: u8): f64;\n\n // @ts-ignore: decorator\n @builtin\n export declare function replace_lane(x: v128, idx: u8, value: f64): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function add(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sub(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function mul(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function div(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function neg(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function min(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function max(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function pmin(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function pmax(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function abs(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function sqrt(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ceil(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function floor(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function trunc(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function nearest(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function eq(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ne(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function lt(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function le(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function gt(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function ge(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function convert_low_i32x4_s(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function convert_low_i32x4_u(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function promote_low_f32x4(a: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function shuffle(a: v128, b: v128, l0: u8, l1: u8): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_madd(a: v128, b: v128, c: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_nmadd(a: v128, b: v128, c: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_min(a: v128, b: v128): v128;\n\n // @ts-ignore: decorator\n @builtin\n export declare function relaxed_max(a: v128, b: v128): v128;\n}\n\n@final\nexport abstract class i31 { // FIXME: usage of 'new' requires a class :(\n\n // @ts-ignore: decorator\n @builtin\n static new(value: i32): i31ref { return changetype<i31ref>(unreachable()); }\n\n // @ts-ignore: decorator\n @builtin\n static get(i31expr: i31ref): i32 { return unreachable(); }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @ts-ignore: decorator\n@external(\"env\", \"abort\")\n@external.js(\"throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);\")\ndeclare function abort(\n message?: string | null,\n fileName?: string | null,\n lineNumber?: u32,\n columnNumber?: u32\n): void;\n\n// @ts-ignore: decorator\n@external(\"env\", \"trace\")\n@external.js(\"console.log(message, ...[a0, a1, a2, a3, a4].slice(0, n));\")\ndeclare function trace(\n message: string,\n n?: i32,\n a0?: f64,\n a1?: f64,\n a2?: f64,\n a3?: f64,\n a4?: f64\n): void;\n\n// @ts-ignore: decorator\n@external(\"env\", \"seed\")\n@external.js(\"return Date.now() * Math.random();\")\ndeclare function seed(): f64;\n\n/* eslint-enable @typescript-eslint/no-unused-vars */\n","/**\r\n * Array Operations for AssemblyScript\r\n *\r\n * High-performance array operations using typed arrays.\r\n * These operations work directly on Float64Array data.\r\n */\r\n\r\n// =============================================================================\r\n// Reduction Operations\r\n// =============================================================================\r\n\r\n/**\r\n * Sum all elements in the array\r\n */\r\nexport function array_sum(data: Float64Array): f64 {\r\n let total: f64 = 0.0;\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n total += unchecked(data[i]);\r\n }\r\n return total;\r\n}\r\n\r\n/**\r\n * Product of all elements\r\n */\r\nexport function array_product(data: Float64Array): f64 {\r\n let product: f64 = 1.0;\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n product *= unchecked(data[i]);\r\n }\r\n return product;\r\n}\r\n\r\n/**\r\n * Mean (average) of all elements\r\n */\r\nexport function array_mean(data: Float64Array): f64 {\r\n const len = data.length;\r\n if (len == 0) return f64.NaN;\r\n return array_sum(data) / f64(len);\r\n}\r\n\r\n/**\r\n * Variance (population variance)\r\n */\r\nexport function array_variance(data: Float64Array): f64 {\r\n const len = data.length;\r\n if (len == 0) return f64.NaN;\r\n\r\n const mean = array_mean(data);\r\n let sumSqDiff: f64 = 0.0;\r\n\r\n for (let i = 0; i < len; i++) {\r\n const diff = unchecked(data[i]) - mean;\r\n sumSqDiff += diff * diff;\r\n }\r\n\r\n return sumSqDiff / f64(len);\r\n}\r\n\r\n/**\r\n * Standard deviation (population)\r\n */\r\nexport function array_stddev(data: Float64Array): f64 {\r\n return sqrt(array_variance(data));\r\n}\r\n\r\n/**\r\n * Minimum value\r\n */\r\nexport function array_min(data: Float64Array): f64 {\r\n const len = data.length;\r\n if (len == 0) return f64.NaN;\r\n\r\n let minVal = unchecked(data[0]);\r\n for (let i = 1; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n if (val < minVal) minVal = val;\r\n }\r\n return minVal;\r\n}\r\n\r\n/**\r\n * Maximum value\r\n */\r\nexport function array_max(data: Float64Array): f64 {\r\n const len = data.length;\r\n if (len == 0) return f64.NaN;\r\n\r\n let maxVal = unchecked(data[0]);\r\n for (let i = 1; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n if (val > maxVal) maxVal = val;\r\n }\r\n return maxVal;\r\n}\r\n\r\n/**\r\n * Index of minimum value\r\n */\r\nexport function array_argmin(data: Float64Array): i32 {\r\n const len = data.length;\r\n if (len == 0) return -1;\r\n\r\n let minIdx: i32 = 0;\r\n let minVal = unchecked(data[0]);\r\n\r\n for (let i: i32 = 1; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n if (val < minVal) {\r\n minVal = val;\r\n minIdx = i;\r\n }\r\n }\r\n return minIdx;\r\n}\r\n\r\n/**\r\n * Index of maximum value\r\n */\r\nexport function array_argmax(data: Float64Array): i32 {\r\n const len = data.length;\r\n if (len == 0) return -1;\r\n\r\n let maxIdx: i32 = 0;\r\n let maxVal = unchecked(data[0]);\r\n\r\n for (let i: i32 = 1; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n if (val > maxVal) {\r\n maxVal = val;\r\n maxIdx = i;\r\n }\r\n }\r\n return maxIdx;\r\n}\r\n\r\n/**\r\n * L2 norm (Euclidean norm)\r\n */\r\nexport function array_norm(data: Float64Array): f64 {\r\n let sumSq: f64 = 0.0;\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n sumSq += val * val;\r\n }\r\n return sqrt(sumSq);\r\n}\r\n\r\n/**\r\n * L1 norm (sum of absolute values)\r\n */\r\nexport function array_norm_l1(data: Float64Array): f64 {\r\n let sum: f64 = 0.0;\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n sum += abs(unchecked(data[i]));\r\n }\r\n return sum;\r\n}\r\n\r\n/**\r\n * L-infinity norm (max absolute value)\r\n */\r\nexport function array_norm_linf(data: Float64Array): f64 {\r\n let maxAbs: f64 = 0.0;\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n const absVal = abs(unchecked(data[i]));\r\n if (absVal > maxAbs) maxAbs = absVal;\r\n }\r\n return maxAbs;\r\n}\r\n\r\n// =============================================================================\r\n// Vector Operations\r\n// =============================================================================\r\n\r\n/**\r\n * Dot product of two arrays\r\n */\r\nexport function array_dot(a: Float64Array, b: Float64Array): f64 {\r\n const len = min(a.length, b.length);\r\n let result: f64 = 0.0;\r\n for (let i = 0; i < len; i++) {\r\n result += unchecked(a[i]) * unchecked(b[i]);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Element-wise addition: result = a + b\r\n */\r\nexport function array_add(a: Float64Array, b: Float64Array, result: Float64Array): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) + unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Element-wise subtraction: result = a - b\r\n */\r\nexport function array_sub(a: Float64Array, b: Float64Array, result: Float64Array): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) - unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Element-wise multiplication: result = a * b\r\n */\r\nexport function array_mul(a: Float64Array, b: Float64Array, result: Float64Array): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) * unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Element-wise division: result = a / b\r\n */\r\nexport function array_div(a: Float64Array, b: Float64Array, result: Float64Array): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) / unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Scale array by scalar: result = a * scalar\r\n */\r\nexport function array_scale(a: Float64Array, scalar: f64, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) * scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Add scalar to array: result = a + scalar\r\n */\r\nexport function array_add_scalar(a: Float64Array, scalar: f64, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) + scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Negate array: result = -a\r\n */\r\nexport function array_neg(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = -unchecked(a[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Absolute value: result = |a|\r\n */\r\nexport function array_abs(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = abs(unchecked(a[i])));\r\n }\r\n}\r\n\r\n/**\r\n * Square root: result = sqrt(a)\r\n */\r\nexport function array_sqrt(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = sqrt(unchecked(a[i])));\r\n }\r\n}\r\n\r\n/**\r\n * Square: result = a^2\r\n */\r\nexport function array_square(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n const val = unchecked(a[i]);\r\n unchecked(result[i] = val * val);\r\n }\r\n}\r\n\r\n/**\r\n * Exponential: result = Math.exp(a)\r\n */\r\nexport function array_exp(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = Math.exp(unchecked(a[i])));\r\n }\r\n}\r\n\r\n/**\r\n * Natural log: result = Math.log(a)\r\n */\r\nexport function array_log(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = Math.log(unchecked(a[i])));\r\n }\r\n}\r\n\r\n/**\r\n * Sine: result = Math.sin(a)\r\n */\r\nexport function array_sin(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = Math.sin(unchecked(a[i])));\r\n }\r\n}\r\n\r\n/**\r\n * Cosine: result = Math.cos(a)\r\n */\r\nexport function array_cos(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = Math.cos(unchecked(a[i])));\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Linear Algebra Helpers\r\n// =============================================================================\r\n\r\n/**\r\n * Linear combination: result = alpha*a + beta*b (AXPBY)\r\n */\r\nexport function array_axpby(\r\n alpha: f64, a: Float64Array,\r\n beta: f64, b: Float64Array,\r\n result: Float64Array\r\n): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = alpha * unchecked(a[i]) + beta * unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Euclidean distance between two vectors\r\n */\r\nexport function array_distance(a: Float64Array, b: Float64Array): f64 {\r\n const len = min(a.length, b.length);\r\n let sumSq: f64 = 0.0;\r\n for (let i = 0; i < len; i++) {\r\n const diff = unchecked(a[i]) - unchecked(b[i]);\r\n sumSq += diff * diff;\r\n }\r\n return sqrt(sumSq);\r\n}\r\n\r\n/**\r\n * Cosine similarity between two vectors\r\n */\r\nexport function array_cosine_similarity(a: Float64Array, b: Float64Array): f64 {\r\n const dot = array_dot(a, b);\r\n const normA = array_norm(a);\r\n const normB = array_norm(b);\r\n if (normA == 0.0 || normB == 0.0) return 0.0;\r\n return dot / (normA * normB);\r\n}\r\n\r\n// =============================================================================\r\n// In-place Operations (modify input array)\r\n// =============================================================================\r\n\r\n/**\r\n * Scale array in place: a *= scalar\r\n */\r\nexport function array_scale_inplace(a: Float64Array, scalar: f64): void {\r\n const len = a.length;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(a[i] = unchecked(a[i]) * scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Add scalar in place: a += scalar\r\n */\r\nexport function array_add_scalar_inplace(a: Float64Array, scalar: f64): void {\r\n const len = a.length;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(a[i] = unchecked(a[i]) + scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Add arrays in place: a += b\r\n */\r\nexport function array_add_inplace(a: Float64Array, b: Float64Array): void {\r\n const len = min(a.length, b.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(a[i] = unchecked(a[i]) + unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Clamp all values in place to [lo, hi]\r\n */\r\nexport function array_clamp_inplace(a: Float64Array, lo: f64, hi: f64): void {\r\n const len = a.length;\r\n for (let i = 0; i < len; i++) {\r\n const val = unchecked(a[i]);\r\n unchecked(a[i] = max(lo, min(hi, val)));\r\n }\r\n}\r\n\r\n/**\r\n * Fill array with value\r\n */\r\nexport function array_fill(a: Float64Array, value: f64): void {\r\n const len = a.length;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(a[i] = value);\r\n }\r\n}\r\n\r\n/**\r\n * Copy array: dst = src\r\n */\r\nexport function array_copy(src: Float64Array, dst: Float64Array): void {\r\n const len = min(src.length, dst.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(dst[i] = unchecked(src[i]));\r\n }\r\n}\r\n","import { compareImpl } from \"./string\";\n\ntype Comparator<T> = (a: T, b: T) => i32;\n\n// @ts-ignore: decorator\n@lazy @inline const EMPTY = u32.MAX_VALUE;\n// @ts-ignore: decorator\n@inline const INSERTION_SORT_THRESHOLD = 48;\n// @ts-ignore: decorator\n@inline const MIN_RUN_LENGTH = 32;\n\n// @ts-ignore: decorator\n@inline\nfunction log2u(n: u32): u32 {\n return 31 - clz(n);\n}\n\n// @ts-ignore: decorator\n@inline\nexport function COMPARATOR<T>(): Comparator<T> {\n if (isInteger<T>()) {\n if (isSigned<T>() && sizeof<T>() <= 4) {\n return (a, b) => i32(a) - i32(b);\n } else {\n return (a, b) => i32(a > b) - i32(a < b);\n }\n } else if (isFloat<T>()) {\n if (sizeof<T>() == 4) {\n return (a, b) => {\n let ia = reinterpret<i32>(f32(a));\n let ib = reinterpret<i32>(f32(b));\n ia ^= ia >> 31 >>> 1;\n ib ^= ib >> 31 >>> 1;\n return i32(ia > ib) - i32(ia < ib);\n };\n } else {\n return (a, b) => {\n let ia = reinterpret<i64>(f64(a));\n let ib = reinterpret<i64>(f64(b));\n ia ^= ia >> 63 >>> 1;\n ib ^= ib >> 63 >>> 1;\n return i32(ia > ib) - i32(ia < ib);\n };\n }\n } else if (isString<T>()) {\n return (a, b) => {\n if (\n changetype<usize>(a) == changetype<usize>(b) ||\n changetype<usize>(a) == 0 ||\n changetype<usize>(b) == 0\n ) return 0;\n let alen = changetype<string>(a).length;\n let blen = changetype<string>(b).length;\n if (!(alen | blen)) return 0;\n if (!alen) return -1;\n if (!blen) return 1;\n let res = compareImpl(\n changetype<string>(a), 0,\n changetype<string>(b), 0,\n <usize>min(alen, blen)\n );\n return res ? res : alen - blen;\n };\n } else {\n return (a, b) => i32(a > b) - i32(a < b);\n }\n}\n\n// Power Sort implementation (stable) from paper \"Nearly-Optimal Mergesorts\"\n// https://arxiv.org/pdf/1805.04154.pdf\n// This method usually outperform TimSort.\n// TODO: refactor c >>> 31 to c < 0 when binaryen will support this opt\nexport function SORT<T>(\n ptr: usize,\n len: i32,\n comparator: Comparator<T>\n): void {\n if (len <= INSERTION_SORT_THRESHOLD) {\n if (len <= 1) return;\n if (ASC_SHRINK_LEVEL < 1) {\n switch (len) {\n case 3: {\n let a = load<T>(ptr, 0);\n let b = load<T>(ptr, 1 << alignof<T>());\n let c = comparator(a, b) > 0;\n store<T>(ptr, select<T>(b, a, c), 0);\n a = select<T>(a, b, c);\n b = load<T>(ptr, 2 << alignof<T>());\n c = comparator(a, b) > 0;\n store<T>(ptr, select<T>(b, a, c), 1 << alignof<T>());\n store<T>(ptr, select<T>(a, b, c), 2 << alignof<T>());\n }\n case 2: {\n let a = load<T>(ptr, 0);\n let b = load<T>(ptr, 1 << alignof<T>());\n let c = comparator(a, b) > 0;\n store<T>(ptr, select<T>(b, a, c), 0);\n store<T>(ptr, select<T>(a, b, c), 1 << alignof<T>());\n return;\n }\n }\n }\n insertionSort<T>(ptr, 0, len - 1, 0, comparator);\n return;\n }\n\n let lgPlus2 = log2u(len) + 2;\n let lgPlus2Size = lgPlus2 << alignof<u32>();\n let leftRunStartBuf = __alloc(lgPlus2Size << 1);\n let leftRunEndBuf = leftRunStartBuf + lgPlus2Size;\n\n for (let i: u32 = 0; i < lgPlus2; ++i) {\n store<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()), EMPTY);\n }\n\n let buffer = __alloc(len << alignof<T>());\n\n let hi = len - 1;\n let endA = extendRunRight<T>(ptr, 0, hi, comparator);\n let lenA = endA + 1;\n\n if (lenA < MIN_RUN_LENGTH) {\n endA = min(hi, MIN_RUN_LENGTH - 1);\n insertionSort<T>(ptr, 0, endA, lenA, comparator);\n }\n\n let top: u32 = 0, startA = 0;\n while (endA < hi) {\n let startB = endA + 1;\n let endB = extendRunRight<T>(ptr, startB, hi, comparator);\n let lenB = endB - startB + 1;\n\n if (lenB < MIN_RUN_LENGTH) {\n endB = min(hi, startB + MIN_RUN_LENGTH - 1);\n insertionSort<T>(ptr, startB, endB, lenB, comparator);\n }\n\n let k = nodePower(0, hi, startA, startB, endB);\n\n for (let i = top; i > k; --i) {\n let start = load<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()));\n if (start != EMPTY) {\n mergeRuns<T>(\n ptr,\n start,\n load<u32>(leftRunEndBuf + (<usize>i << alignof<u32>())) + 1,\n endA,\n buffer,\n comparator\n );\n startA = start;\n store<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()), EMPTY);\n }\n }\n\n store<u32>(leftRunStartBuf + (<usize>k << alignof<u32>()), startA);\n store<u32>(leftRunEndBuf + (<usize>k << alignof<u32>()), endA);\n startA = startB;\n endA = endB;\n top = k;\n }\n\n for (let i = top; i != 0; --i) {\n let start = load<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()));\n if (start != EMPTY) {\n mergeRuns<T>(\n ptr,\n start,\n load<u32>(leftRunEndBuf + (<usize>i << alignof<u32>())) + 1,\n hi,\n buffer,\n comparator\n );\n }\n }\n // dealloc aux buffers\n __free(buffer);\n __free(leftRunStartBuf);\n}\n\nfunction insertionSort<T>(\n ptr: usize,\n left: i32,\n right: i32,\n presorted: i32,\n comparator: Comparator<T>\n): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n // slightly improved original insertion sort\n for (let i = left + presorted; i <= right; ++i) {\n let j = i - 1;\n let a = load<T>(ptr + (<usize>i << alignof<T>()));\n while (j >= left) {\n let b = load<T>(ptr + (<usize>j << alignof<T>()));\n if (comparator(a, b) < 0) {\n store<T>(ptr + (<usize>j << alignof<T>()), b, 1 << alignof<T>()); --j;\n } else break;\n }\n store<T>(ptr + (<usize>j << alignof<T>()), a, 1 << alignof<T>());\n }\n } else {\n // even-odd two-way insertion sort which allow increase minRunLen\n let range = right - left + 1;\n let i = left + select(range & 1, presorted - ((range - presorted) & 1), presorted == 0);\n for (; i <= right; i += 2) {\n let a = load<T>(ptr + (<usize>i << alignof<T>()), 0);\n let b = load<T>(ptr + (<usize>i << alignof<T>()), 1 << alignof<T>());\n let min = b, max = a;\n if (comparator(a, b) <= 0) {\n min = a, max = b;\n }\n let j = i - 1;\n while (j >= left) {\n a = load<T>(ptr + (<usize>j << alignof<T>()));\n if (comparator(a, max) > 0) {\n store<T>(ptr + (<usize>j << alignof<T>()), a, 2 << alignof<T>()); --j;\n } else break;\n }\n store<T>(ptr + (<usize>j << alignof<T>()), max, 2 << alignof<T>());\n while (j >= left) {\n a = load<T>(ptr + (<usize>j << alignof<T>()));\n if (comparator(a, min) > 0) {\n store<T>(ptr + (<usize>j << alignof<T>()), a, 1 << alignof<T>()); --j;\n } else break;\n }\n store<T>(ptr + (<usize>j << alignof<T>()), min, 1 << alignof<T>());\n }\n }\n}\n\nfunction nodePower(left: u32, right: u32, startA: u32, startB: u32, endB: u32): u32 {\n let n: u64 = right - left + 1;\n let s = startB - (left << 1);\n let l = startA + s;\n let r = endB + s + 1;\n let a = (<u64>l << 30) / n;\n let b = (<u64>r << 30) / n;\n return clz(<u32>(a ^ b));\n}\n\nfunction extendRunRight<T>(\n ptr: usize,\n i: i32,\n right: i32,\n comparator: Comparator<T>\n): i32 {\n if (i == right) return i;\n let j = i;\n if (comparator(\n load<T>(ptr + (<usize> j << alignof<T>())),\n load<T>(ptr + (<usize>++j << alignof<T>()))\n ) > 0) {\n while (\n j < right &&\n (comparator(\n load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>()),\n load<T>(ptr + (<usize>j << alignof<T>()))\n ) >>> 31) // < 0\n ) ++j;\n // reverse\n let k = j;\n while (i < k) {\n let tmp = load<T>(ptr + (<usize>i << alignof<T>()));\n store<T>(ptr + (<usize>i << alignof<T>()), load<T>(ptr + (<usize>k << alignof<T>()))); ++i;\n store<T>(ptr + (<usize>k << alignof<T>()), tmp); --k;\n }\n } else {\n while (\n j < right &&\n comparator(\n load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>()),\n load<T>(ptr + (<usize>j << alignof<T>()))\n ) >= 0\n ) ++j;\n }\n return j;\n}\n\n// Merges arr[l..m - 1] and arr[m..r]\nfunction mergeRuns<T>(\n ptr: usize,\n l: i32,\n m: i32,\n r: i32,\n buffer: usize,\n comparator: Comparator<T>\n): void {\n --m;\n let i: i32, j: i32, t = r + m;\n for (i = m + 1; i > l; --i) {\n store<T>(\n buffer + (<usize>(i - 1) << alignof<T>()),\n load<T>(ptr + (<usize>(i - 1) << alignof<T>()))\n );\n }\n for (j = m; j < r; ++j) {\n store<T>(\n buffer + (<usize>(t - j) << alignof<T>()),\n load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>())\n );\n }\n for (let k = l; k <= r; ++k) {\n let a = load<T>(buffer + (<usize>j << alignof<T>()));\n let b = load<T>(buffer + (<usize>i << alignof<T>()));\n if (comparator(a, b) < 0) {\n store<T>(ptr + (<usize>k << alignof<T>()), a);\n --j;\n } else {\n store<T>(ptr + (<usize>k << alignof<T>()), b);\n ++i;\n }\n }\n}\n","// This file is shared with the compiler and must remain portable\n\n/** Runtime types. */\nexport enum Runtime {\n /** Simple bump allocator without GC. */\n Stub = 0,\n /** Stop the world semi-automatic GC. */\n Minimal = 1,\n /** incremental GC. */\n Incremental = 2,\n}\n","import { COMPARATOR, SORT } from \"./util/sort\";\nimport { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_NOTIMPLEMENTED } from \"./util/error\";\nimport { joinIntegerArray, joinFloatArray } from \"./util/string\";\nimport { REVERSE, FILL } from \"./util/bytes\";\nimport { idof } from \"./builtins\";\nimport { ArrayBufferView } from \"./arraybuffer\";\n\nexport class Int8Array extends ArrayBufferView {\n [key: number]: i8;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<i8>();\n\n constructor(length: i32) {\n super(length, alignof<i8>());\n }\n\n get length(): i32 {\n return this.byteLength;\n }\n\n @operator(\"[]\")\n private __get(index: i32): i8 {\n if (<u32>index >= <u32>this.byteLength) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i8>(this.dataStart + <usize>index);\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): i8 {\n return load<i8>(this.dataStart + <usize>index);\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: native<i8>): void {\n if (<u32>index >= <u32>this.byteLength) throw new RangeError(E_INDEXOUTOFRANGE);\n store<i8>(this.dataStart + <usize>index, value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: native<i8>): void {\n store<i8>(this.dataStart + <usize>index, value);\n }\n\n at(index: i32): i8 {\n let len = this.byteLength;\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i8>(this.dataStart + <usize>index);\n }\n\n includes(searchElement: i8, fromIndex: i32 = 0): bool {\n return INCLUDES<Int8Array, i8>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: i8, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Int8Array, i8>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: i8, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Int8Array, i8>(this, searchElement, fromIndex);\n }\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {\n FILL<u8>(this.dataStart, this.length, u8(value), start, end);\n return this;\n }\n\n sort(comparator: (a: i8, b: i8) => i32 = COMPARATOR<i8>()): Int8Array {\n SORT<i8>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {\n return SLICE<Int8Array, i8>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {\n return SUBARRAY<Int8Array, i8>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Int8Array {\n return COPY_WITHIN<Int8Array, i8>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Int8Array, i8, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Int8Array, i8, T>(this, fn, initialValue);\n }\n\n map(fn: (value: i8, index: i32, self: Int8Array) => i8): Int8Array {\n return MAP<Int8Array, i8>(this, fn);\n }\n\n filter(fn: (value: i8, index: i32, self: Int8Array) => bool): Int8Array {\n return FILTER<Int8Array, i8>(this, fn);\n }\n\n findIndex(fn: (value: i8, index: i32, self: Int8Array) => bool): i32 {\n return FIND_INDEX<Int8Array, i8>(this, fn);\n }\n\n findLastIndex(fn: (value: i8, index: i32, self: Int8Array) => bool): i32 {\n return FIND_LAST_INDEX<Int8Array, i8>(this, fn);\n }\n\n some(fn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return SOME<Int8Array, i8>(this, fn);\n }\n\n every(fn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return EVERY<Int8Array, i8>(this, fn);\n }\n\n forEach(fn: (value: i8, index: i32, self: Int8Array) => void): void {\n FOREACH<Int8Array, i8>(this, fn);\n }\n\n reverse(): Int8Array {\n REVERSE<u8>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<i8>(this.dataStart, this.length, separator);\n }\n\n toString(): string {\n return this.join();\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Int8Array {\n return WRAP<Int8Array, i8>(buffer, byteOffset, length);\n }\n}\n\nexport class Uint8Array extends ArrayBufferView {\n [key: number]: u8;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<u8>();\n\n constructor(length: i32) {\n super(length, alignof<u8>());\n }\n\n get length(): i32 {\n return this.byteLength;\n }\n\n @operator(\"[]\")\n private __get(index: i32): u8 {\n if (<u32>index >= <u32>this.byteLength) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u8>(this.dataStart + <usize>index);\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): u8 {\n return load<u8>(this.dataStart + <usize>index);\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: native<u8>): void {\n if (<u32>index >= <u32>this.byteLength) throw new RangeError(E_INDEXOUTOFRANGE);\n store<u8>(this.dataStart + <usize>index, value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: native<u8>): void {\n store<u8>(this.dataStart + <usize>index, value);\n }\n\n at(index: i32): u8 {\n let len = this.byteLength;\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u8>(this.dataStart + <usize>index);\n }\n\n includes(searchElement: u8, fromIndex: i32 = 0): bool {\n return INCLUDES<Uint8Array, u8>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: u8, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Uint8Array, u8>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: u8, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Uint8Array, u8>(this, searchElement, fromIndex);\n }\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {\n FILL<u8>(this.dataStart, this.length, u8(value), start, end);\n return this;\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR<u8>()): Uint8Array {\n SORT<u8>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {\n return SLICE<Uint8Array, u8>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {\n return SUBARRAY<Uint8Array, u8>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Uint8Array {\n return COPY_WITHIN<Uint8Array, u8>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Uint8Array, u8, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Uint8Array, u8, T>(this, fn, initialValue);\n }\n\n map(fn: (value: u8, index: i32, self: Uint8Array) => u8): Uint8Array {\n return MAP<Uint8Array, u8>(this, fn);\n }\n\n filter(fn: (value: u8, index: i32, self: Uint8Array) => bool): Uint8Array {\n return FILTER<Uint8Array, u8>(this, fn);\n }\n\n findIndex(fn: (value: u8, index: i32, self: Uint8Array) => bool): i32 {\n return FIND_INDEX<Uint8Array, u8>(this, fn);\n }\n\n findLastIndex(fn: (value: u8, index: i32, self: Uint8Array) => bool): i32 {\n return FIND_LAST_INDEX<Uint8Array, u8>(this, fn);\n }\n\n some(fn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return SOME<Uint8Array, u8>(this, fn);\n }\n\n every(fn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return EVERY<Uint8Array, u8>(this, fn);\n }\n\n forEach(fn: (value: u8, index: i32, self: Uint8Array) => void): void {\n FOREACH<Uint8Array, u8>(this, fn);\n }\n\n reverse(): Uint8Array {\n REVERSE<u8>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<u8>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Uint8Array {\n return WRAP<Uint8Array, u8>(buffer, byteOffset, length);\n }\n}\n\nexport class Uint8ClampedArray extends ArrayBufferView {\n [key: number]: u8;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<u8>();\n\n constructor(length: i32) {\n super(length, alignof<u8>());\n }\n\n get length(): i32 {\n return this.byteLength;\n }\n\n @operator(\"[]\")\n private __get(index: i32): u8 {\n if (<u32>index >= <u32>this.byteLength) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u8>(this.dataStart + <usize>index);\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): u8 {\n return load<u8>(this.dataStart + <usize>index);\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: native<u8>): void {\n if (<u32>index >= <u32>this.byteLength) throw new RangeError(E_INDEXOUTOFRANGE);\n store<u8>(this.dataStart + <usize>index, ~(<i32>value >> 31) & (((255 - value) >> 31) | value));\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: native<u8>): void {\n store<u8>(this.dataStart + <usize>index, ~(<i32>value >> 31) & (((255 - value) >> 31) | value));\n }\n\n at(index: i32): u8 {\n let len = this.byteLength;\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u8>(this.dataStart + <usize>index);\n }\n\n includes(searchElement: u8, fromIndex: i32 = 0): bool {\n return INCLUDES<Uint8ClampedArray, u8>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: u8, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Uint8ClampedArray, u8>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: u8, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Uint8ClampedArray, u8>(this, searchElement, fromIndex);\n }\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n value = ~(value >> 31) & (((255 - value) >> 31) | value);\n FILL<u8>(this.dataStart, this.length, u8(value), start, end);\n return this;\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR<u8>()): Uint8ClampedArray {\n SORT<u8>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n return SLICE<Uint8ClampedArray, u8>(this, begin, end);\n }\n\n subarray(start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n return SUBARRAY<Uint8ClampedArray, u8>(this, start, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n return COPY_WITHIN<Uint8ClampedArray, u8>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: u8, index: i32, array: Uint8ClampedArray) => T,\n initialValue: T,\n ): T {\n return REDUCE<Uint8ClampedArray, u8, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: u8, index: i32, array: Uint8ClampedArray) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Uint8ClampedArray, u8, T>(this, fn, initialValue);\n }\n\n map(fn: (value: u8, index: i32, self: Uint8ClampedArray) => u8): Uint8ClampedArray {\n return MAP<Uint8ClampedArray, u8>(this, fn);\n }\n\n filter(fn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): Uint8ClampedArray {\n return FILTER<Uint8ClampedArray, u8>(this, fn);\n }\n\n findIndex(fn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): i32 {\n return FIND_INDEX<Uint8ClampedArray, u8>(this, fn);\n }\n\n findLastIndex(fn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): i32 {\n return FIND_LAST_INDEX<Uint8ClampedArray, u8>(this, fn);\n }\n\n some(fn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return SOME<Uint8ClampedArray, u8>(this, fn);\n }\n\n every(fn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return EVERY<Uint8ClampedArray, u8>(this, fn);\n }\n\n forEach(fn: (value: u8, index: i32, self: Uint8ClampedArray) => void): void {\n FOREACH<Uint8ClampedArray, u8>(this, fn);\n }\n\n reverse(): Uint8ClampedArray {\n REVERSE<u8>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<u8>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Uint8ClampedArray {\n return WRAP<Uint8ClampedArray, u8>(buffer, byteOffset, length);\n }\n}\n\nexport class Int16Array extends ArrayBufferView {\n [key: number]: i16;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<i16>();\n\n constructor(length: i32) {\n super(length, alignof<i16>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<i16>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): i16 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<i16>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i16>(this.dataStart + (<usize>index << alignof<i16>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): i16 {\n return load<i16>(this.dataStart + (<usize>index << alignof<i16>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: native<i16>): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<i16>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<i16>(this.dataStart + (<usize>index << alignof<i16>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: native<i16>): void {\n store<i16>(this.dataStart + (<usize>index << alignof<i16>()), value);\n }\n\n at(index: i32): i16 {\n let len = this.byteLength >>> alignof<i16>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i16>(this.dataStart + (<usize>index << alignof<i16>()));\n }\n\n includes(searchElement: i16, fromIndex: i32 = 0): bool {\n return INCLUDES<Int16Array, i16>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: i16, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Int16Array, i16>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: i16, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Int16Array, i16>(this, searchElement, fromIndex);\n }\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {\n FILL<u16>(this.dataStart, this.length, u16(value), start, end);\n return this;\n }\n\n sort(comparator: (a: i16, b: i16) => i32 = COMPARATOR<i16>()): Int16Array {\n SORT<i16>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {\n return SLICE<Int16Array, i16>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {\n return SUBARRAY<Int16Array, i16>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Int16Array {\n return COPY_WITHIN<Int16Array, i16>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Int16Array, i16, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Int16Array, i16, T>(this, fn, initialValue);\n }\n\n map(fn: (value: i16, index: i32, self: Int16Array) => i16): Int16Array {\n return MAP<Int16Array, i16>(this, fn);\n }\n\n filter(fn: (value: i16, index: i32, self: Int16Array) => bool): Int16Array {\n return FILTER<Int16Array, i16>(this, fn);\n }\n\n findIndex(fn: (value: i16, index: i32, self: Int16Array) => bool): i32 {\n return FIND_INDEX<Int16Array, i16>(this, fn);\n }\n\n findLastIndex(fn: (value: i16, index: i32, self: Int16Array) => bool): i32 {\n return FIND_LAST_INDEX<Int16Array, i16>(this, fn);\n }\n\n some(fn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return SOME<Int16Array, i16>(this, fn);\n }\n\n every(fn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return EVERY<Int16Array, i16>(this, fn);\n }\n\n forEach(fn: (value: i16, index: i32, self: Int16Array) => void): void {\n FOREACH<Int16Array, i16>(this, fn);\n }\n\n reverse(): Int16Array {\n REVERSE<u16>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<i16>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Int16Array {\n return WRAP<Int16Array, i16>(buffer, byteOffset, length);\n }\n}\n\nexport class Uint16Array extends ArrayBufferView {\n [key: number]: u16;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<u16>();\n\n constructor(length: i32) {\n super(length, alignof<u16>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<u16>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): u16 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<u16>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u16>(this.dataStart + (<usize>index << alignof<u16>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): u16 {\n return load<u16>(this.dataStart + (<usize>index << alignof<u16>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: native<u16>): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<u16>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<u16>(this.dataStart + (<usize>index << alignof<u16>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: native<u16>): void {\n store<u16>(this.dataStart + (<usize>index << alignof<u16>()), value);\n }\n\n at(index: i32): u16 {\n let len = this.byteLength >>> alignof<u16>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u16>(this.dataStart + (<usize>index << alignof<u16>()));\n }\n\n includes(searchElement: u16, fromIndex: i32 = 0): bool {\n return INCLUDES<Uint16Array, u16>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: u16, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Uint16Array, u16>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: u16, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Uint16Array, u16>(this, searchElement, fromIndex);\n }\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {\n FILL<u16>(this.dataStart, this.length, u16(value), start, end);\n return this;\n }\n\n sort(comparator: (a: u16, b: u16) => i32 = COMPARATOR<u16>()): Uint16Array {\n SORT<u16>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {\n return SLICE<Uint16Array, u16>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {\n return SUBARRAY<Uint16Array, u16>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Uint16Array {\n return COPY_WITHIN<Uint16Array, u16>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Uint16Array, u16, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Uint16Array, u16, T>(this, fn, initialValue);\n }\n\n map(fn: (value: u16, index: i32, self: Uint16Array) => u16): Uint16Array {\n return MAP<Uint16Array, u16>(this, fn);\n }\n\n filter(fn: (value: u16, index: i32, self: Uint16Array) => bool): Uint16Array {\n return FILTER<Uint16Array, u16>(this, fn);\n }\n\n findIndex(fn: (value: u16, index: i32, self: Uint16Array) => bool): i32 {\n return FIND_INDEX<Uint16Array, u16>(this, fn);\n }\n\n findLastIndex(fn: (value: u16, index: i32, self: Uint16Array) => bool): i32 {\n return FIND_LAST_INDEX<Uint16Array, u16>(this, fn);\n }\n\n some(fn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return SOME<Uint16Array, u16>(this, fn);\n }\n\n every(fn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return EVERY<Uint16Array, u16>(this, fn);\n }\n\n forEach(fn: (value: u16, index: i32, self: Uint16Array) => void): void {\n FOREACH<Uint16Array, u16>(this, fn);\n }\n\n reverse(): Uint16Array {\n REVERSE<u16>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<u16>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Uint16Array {\n return WRAP<Uint16Array, u16>(buffer, byteOffset, length);\n }\n}\n\nexport class Int32Array extends ArrayBufferView {\n [key: number]: i32;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<i32>();\n\n constructor(length: i32) {\n super(length, alignof<i32>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<i32>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): i32 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<i32>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i32>(this.dataStart + (<usize>index << alignof<i32>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): i32 {\n return load<i32>(this.dataStart + (<usize>index << alignof<i32>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: i32): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<i32>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<i32>(this.dataStart + (<usize>index << alignof<i32>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: i32): void {\n store<i32>(this.dataStart + (<usize>index << alignof<i32>()), value);\n }\n\n at(index: i32): i32 {\n let len = this.byteLength >>> alignof<i32>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i32>(this.dataStart + (<usize>index << alignof<i32>()));\n }\n\n includes(searchElement: i32, fromIndex: i32 = 0): bool {\n return INCLUDES<Int32Array, i32>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: i32, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Int32Array, i32>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: i32, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Int32Array, i32>(this, searchElement, fromIndex);\n }\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {\n FILL<u32>(this.dataStart, this.length, u32(value), start, end);\n return this;\n }\n\n sort(comparator: (a: i32, b: i32) => i32 = COMPARATOR<i32>()): Int32Array {\n SORT<i32>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {\n return SLICE<Int32Array, i32>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {\n return SUBARRAY<Int32Array, i32>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Int32Array {\n return COPY_WITHIN<Int32Array, i32>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Int32Array, i32, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Int32Array, i32, T>(this, fn, initialValue);\n }\n\n map(fn: (value: i32, index: i32, self: Int32Array) => i32): Int32Array {\n return MAP<Int32Array, i32>(this, fn);\n }\n\n filter(fn: (value: i32, index: i32, self: Int32Array) => bool): Int32Array {\n return FILTER<Int32Array, i32>(this, fn);\n }\n\n findIndex(fn: (value: i32, index: i32, self: Int32Array) => bool): i32 {\n return FIND_INDEX<Int32Array, i32>(this, fn);\n }\n\n findLastIndex(fn: (value: i32, index: i32, self: Int32Array) => bool): i32 {\n return FIND_LAST_INDEX<Int32Array, i32>(this, fn);\n }\n\n some(fn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return SOME<Int32Array, i32>(this, fn);\n }\n\n every(fn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return EVERY<Int32Array, i32>(this, fn);\n }\n\n forEach(fn: (value: i32, index: i32, self: Int32Array) => void): void {\n FOREACH<Int32Array, i32>(this, fn);\n }\n\n reverse(): Int32Array {\n REVERSE<u32>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<i32>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Int32Array {\n return WRAP<Int32Array, i32>(buffer, byteOffset, length);\n }\n}\n\nexport class Uint32Array extends ArrayBufferView {\n [key: number]: u32;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<u32>();\n\n constructor(length: i32) {\n super(length, alignof<u32>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<u32>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): u32 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<u32>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u32>(this.dataStart + (<usize>index << alignof<u32>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): u32 {\n return load<u32>(this.dataStart + (<usize>index << alignof<u32>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: u32): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<u32>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<u32>(this.dataStart + (<usize>index << alignof<u32>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: u32): void {\n store<u32>(this.dataStart + (<usize>index << alignof<u32>()), value);\n }\n\n at(index: i32): u32 {\n let len = this.byteLength >>> alignof<u32>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u32>(this.dataStart + (<usize>index << alignof<u32>()));\n }\n\n includes(searchElement: u32, fromIndex: i32 = 0): bool {\n return INCLUDES<Uint32Array, u32>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: u32, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Uint32Array, u32>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: u32, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Uint32Array, u32>(this, searchElement, fromIndex);\n }\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {\n FILL<u32>(this.dataStart, this.length, value, start, end);\n return this;\n }\n\n sort(comparator: (a: u32, b: u32) => i32 = COMPARATOR<u32>()): Uint32Array {\n SORT<u32>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {\n return SLICE<Uint32Array, u32>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {\n return SUBARRAY<Uint32Array, u32>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Uint32Array {\n return COPY_WITHIN<Uint32Array, u32>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Uint32Array, u32, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Uint32Array, u32, T>(this, fn, initialValue);\n }\n\n map(fn: (value: u32, index: i32, self: Uint32Array) => u32): Uint32Array {\n return MAP<Uint32Array, u32>(this, fn);\n }\n\n filter(fn: (value: u32, index: i32, self: Uint32Array) => bool): Uint32Array {\n return FILTER<Uint32Array, u32>(this, fn);\n }\n\n findIndex(fn: (value: u32, index: i32, self: Uint32Array) => bool): i32 {\n return FIND_INDEX<Uint32Array, u32>(this, fn);\n }\n\n findLastIndex(fn: (value: u32, index: i32, self: Uint32Array) => bool): i32 {\n return FIND_LAST_INDEX<Uint32Array, u32>(this, fn);\n }\n\n some(fn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return SOME<Uint32Array, u32>(this, fn);\n }\n\n every(fn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return EVERY<Uint32Array, u32>(this, fn);\n }\n\n forEach(fn: (value: u32, index: i32, self: Uint32Array) => void): void {\n FOREACH<Uint32Array, u32>(this, fn);\n }\n\n reverse(): Uint32Array {\n REVERSE<u32>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<u32>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Uint32Array {\n return WRAP<Uint32Array, u32>(buffer, byteOffset, length);\n }\n}\n\nexport class Int64Array extends ArrayBufferView {\n [key: number]: i64;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<i64>();\n\n constructor(length: i32) {\n super(length, alignof<i64>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<i64>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): i64 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<i64>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i64>(this.dataStart + (<usize>index << alignof<i64>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): i64 {\n return load<i64>(this.dataStart + (<usize>index << alignof<i64>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: i64): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<i64>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<i64>(this.dataStart + (<usize>index << alignof<i64>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: i64): void {\n store<i64>(this.dataStart + (<usize>index << alignof<i64>()), value);\n }\n\n at(index: i32): i64 {\n let len = this.byteLength >>> alignof<i64>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<i64>(this.dataStart + (<usize>index << alignof<i64>()));\n }\n\n includes(searchElement: i64, fromIndex: i32 = 0): bool {\n return INCLUDES<Int64Array, i64>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: i64, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Int64Array, i64>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: i64, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Int64Array, i64>(this, searchElement, fromIndex);\n }\n\n fill(value: i64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {\n FILL<u64>(this.dataStart, this.length, u64(value), start, end);\n return this;\n }\n\n sort(comparator: (a: i64, b: i64) => i32 = COMPARATOR<i64>()): Int64Array {\n SORT<i64>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {\n return SLICE<Int64Array, i64>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {\n return SUBARRAY<Int64Array, i64>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Int64Array {\n return COPY_WITHIN<Int64Array, i64>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Int64Array, i64, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Int64Array, i64, T>(this, fn, initialValue);\n }\n\n map(fn: (value: i64, index: i32, self: Int64Array) => i64): Int64Array {\n return MAP<Int64Array, i64>(this, fn);\n }\n\n filter(fn: (value: i64, index: i32, self: Int64Array) => bool): Int64Array {\n return FILTER<Int64Array, i64>(this, fn);\n }\n\n findIndex(fn: (value: i64, index: i32, self: Int64Array) => bool): i32 {\n return FIND_INDEX<Int64Array, i64>(this, fn);\n }\n\n findLastIndex(fn: (value: i64, index: i32, self: Int64Array) => bool): i32 {\n return FIND_LAST_INDEX<Int64Array, i64>(this, fn);\n }\n\n some(fn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return SOME<Int64Array, i64>(this, fn);\n }\n\n every(fn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return EVERY<Int64Array, i64>(this, fn);\n }\n\n forEach(fn: (value: i64, index: i32, self: Int64Array) => void): void {\n FOREACH<Int64Array, i64>(this, fn);\n }\n\n reverse(): Int64Array {\n REVERSE<u64>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<i64>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Int64Array {\n return WRAP<Int64Array, i64>(buffer, byteOffset, length);\n }\n}\n\nexport class Uint64Array extends ArrayBufferView {\n [key: number]: u64;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<u64>();\n\n constructor(length: i32) {\n super(length, alignof<u64>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<u64>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): u64 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<u64>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u64>(this.dataStart + (<usize>index << alignof<u64>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): u64 {\n return load<u64>(this.dataStart + (<usize>index << alignof<u64>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: u64): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<u64>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<u64>(this.dataStart + (<usize>index << alignof<u64>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: u64): void {\n store<u64>(this.dataStart + (<usize>index << alignof<u64>()), value);\n }\n\n at(index: i32): u64 {\n let len = this.byteLength >>> alignof<u64>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<u64>(this.dataStart + (<usize>index << alignof<u64>()));\n }\n\n includes(searchElement: u64, fromIndex: i32 = 0): bool {\n return INCLUDES<Uint64Array, u64>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: u64, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Uint64Array, u64>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: u64, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Uint64Array, u64>(this, searchElement, fromIndex);\n }\n\n fill(value: u64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {\n FILL<u64>(this.dataStart, this.length, value, start, end);\n return this;\n }\n\n sort(comparator: (a: u64, b: u64) => i32 = COMPARATOR<u64>()): Uint64Array {\n SORT<u64>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {\n return SLICE<Uint64Array, u64>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {\n return SUBARRAY<Uint64Array, u64>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Uint64Array {\n return COPY_WITHIN<Uint64Array, u64>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Uint64Array, u64, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Uint64Array, u64, T>(this, fn, initialValue);\n }\n\n map(fn: (value: u64, index: i32, self: Uint64Array) => u64): Uint64Array {\n return MAP<Uint64Array, u64>(this, fn);\n }\n\n filter(fn: (value: u64, index: i32, self: Uint64Array) => bool): Uint64Array {\n return FILTER<Uint64Array, u64>(this, fn);\n }\n\n findIndex(fn: (value: u64, index: i32, self: Uint64Array) => bool): i32 {\n return FIND_INDEX<Uint64Array, u64>(this, fn);\n }\n\n findLastIndex(fn: (value: u64, index: i32, self: Uint64Array) => bool): i32 {\n return FIND_LAST_INDEX<Uint64Array, u64>(this, fn);\n }\n\n some(fn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return SOME<Uint64Array, u64>(this, fn);\n }\n\n every(fn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return EVERY<Uint64Array, u64>(this, fn);\n }\n\n forEach(fn: (value: u64, index: i32, self: Uint64Array) => void): void {\n FOREACH<Uint64Array, u64>(this, fn);\n }\n\n reverse(): Uint64Array {\n REVERSE<u64>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinIntegerArray<u64>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Uint64Array {\n return WRAP<Uint64Array, u64>(buffer, byteOffset, length);\n }\n}\n\nexport class Float32Array extends ArrayBufferView {\n [key: number]: f32;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<f32>();\n\n constructor(length: i32) {\n super(length, alignof<f32>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<f32>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): f32 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<f32>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<f32>(this.dataStart + (<usize>index << alignof<f32>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): f32 {\n return load<f32>(this.dataStart + (<usize>index << alignof<f32>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: f32): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<f32>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<f32>(this.dataStart + (<usize>index << alignof<f32>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: f32): void {\n store<f32>(this.dataStart + (<usize>index << alignof<f32>()), value);\n }\n\n at(index: i32): f32 {\n let len = this.byteLength >>> alignof<f32>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<f32>(this.dataStart + (<usize>index << alignof<f32>()));\n }\n\n includes(searchElement: f32, fromIndex: i32 = 0): bool {\n return INCLUDES<Float32Array, f32>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: f32, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Float32Array, f32>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: f32, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Float32Array, f32>(this, searchElement, fromIndex);\n }\n\n fill(value: f32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {\n FILL<f32>(this.dataStart, this.length, value, start, end);\n return this;\n }\n\n sort(comparator: (a: f32, b: f32) => i32 = COMPARATOR<f32>()): Float32Array {\n SORT<f32>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {\n return SLICE<Float32Array, f32>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {\n return SUBARRAY<Float32Array, f32>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Float32Array {\n return COPY_WITHIN<Float32Array, f32>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Float32Array, f32, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Float32Array, f32, T>(this, fn, initialValue);\n }\n\n map(fn: (value: f32, index: i32, self: Float32Array) => f32): Float32Array {\n return MAP<Float32Array, f32>(this, fn);\n }\n\n filter(fn: (value: f32, index: i32, self: Float32Array) => bool): Float32Array {\n return FILTER<Float32Array, f32>(this, fn);\n }\n\n findIndex(fn: (value: f32, index: i32, self: Float32Array) => bool): i32 {\n return FIND_INDEX<Float32Array, f32>(this, fn);\n }\n\n findLastIndex(fn: (value: f32, index: i32, self: Float32Array) => bool): i32 {\n return FIND_LAST_INDEX<Float32Array, f32>(this, fn);\n }\n\n some(fn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return SOME<Float32Array, f32>(this, fn);\n }\n\n every(fn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return EVERY<Float32Array, f32>(this, fn);\n }\n\n forEach(fn: (value: f32, index: i32, self: Float32Array) => void): void {\n FOREACH<Float32Array, f32>(this, fn);\n }\n\n reverse(): Float32Array {\n REVERSE<f32>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinFloatArray<f32>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Float32Array {\n return WRAP<Float32Array, f32>(buffer, byteOffset, length);\n }\n}\n\nexport class Float64Array extends ArrayBufferView {\n [key: number]: f64;\n\n // @ts-ignore: decorator\n @lazy\n static readonly BYTES_PER_ELEMENT: i32 = sizeof<f64>();\n\n constructor(length: i32) {\n super(length, alignof<f64>());\n }\n\n get length(): i32 {\n return this.byteLength >>> alignof<f64>();\n }\n\n @operator(\"[]\")\n private __get(index: i32): f64 {\n if (<u32>index >= <u32>this.byteLength >>> alignof<f64>()) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<f64>(this.dataStart + (<usize>index << alignof<f64>()));\n }\n\n @unsafe @operator(\"{}\")\n private __uget(index: i32): f64 {\n return load<f64>(this.dataStart + (<usize>index << alignof<f64>()));\n }\n\n @operator(\"[]=\")\n private __set(index: i32, value: f64): void {\n if (<u32>index >= <u32>this.byteLength >>> alignof<f64>()) throw new RangeError(E_INDEXOUTOFRANGE);\n store<f64>(this.dataStart + (<usize>index << alignof<f64>()), value);\n }\n\n @unsafe @operator(\"{}=\")\n private __uset(index: i32, value: f64): void {\n store<f64>(this.dataStart + (<usize>index << alignof<f64>()), value);\n }\n\n at(index: i32): f64 {\n let len = this.byteLength >>> alignof<f64>();\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n return load<f64>(this.dataStart + (<usize>index << alignof<f64>()));\n }\n\n includes(searchElement: f64, fromIndex: i32 = 0): bool {\n return INCLUDES<Float64Array, f64>(this, searchElement, fromIndex);\n }\n\n indexOf(searchElement: f64, fromIndex: i32 = 0): i32 {\n return INDEX_OF<Float64Array, f64>(this, searchElement, fromIndex);\n }\n\n lastIndexOf(searchElement: f64, fromIndex: i32 = this.length): i32 {\n return LAST_INDEX_OF<Float64Array, f64>(this, searchElement, fromIndex);\n }\n\n fill(value: f64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {\n FILL<f64>(this.dataStart, this.length, value, start, end);\n return this;\n }\n\n sort(comparator: (a: f64, b: f64) => i32 = COMPARATOR<f64>()): Float64Array {\n SORT<f64>(this.dataStart, this.length, comparator);\n return this;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {\n return SLICE<Float64Array, f64>(this, begin, end);\n }\n\n subarray(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {\n return SUBARRAY<Float64Array, f64>(this, begin, end);\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Float64Array {\n return COPY_WITHIN<Float64Array, f64>(this, target, start, end);\n }\n\n reduce<T extends number>(\n fn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE<Float64Array, f64, T>(this, fn, initialValue);\n }\n\n reduceRight<T extends number>(\n fn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT<Float64Array, f64, T>(this, fn, initialValue);\n }\n\n map(fn: (value: f64, index: i32, self: Float64Array) => f64): Float64Array {\n return MAP<Float64Array, f64>(this, fn);\n }\n\n filter(fn: (value: f64, index: i32, self: Float64Array) => bool): Float64Array {\n return FILTER<Float64Array, f64>(this, fn);\n }\n\n findIndex(fn: (value: f64, index: i32, self: Float64Array) => bool): i32 {\n return FIND_INDEX<Float64Array, f64>(this, fn);\n }\n\n findLastIndex(fn: (value: f64, index: i32, self: Float64Array) => bool): i32 {\n return FIND_LAST_INDEX<Float64Array, f64>(this, fn);\n }\n\n some(fn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return SOME<Float64Array, f64>(this, fn);\n }\n\n every(fn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return EVERY<Float64Array, f64>(this, fn);\n }\n\n forEach(fn: (value: f64, index: i32, self: Float64Array) => void): void {\n FOREACH<Float64Array, f64>(this, fn);\n }\n\n reverse(): Float64Array {\n REVERSE<f64>(this.dataStart, this.length);\n return this;\n }\n\n join(separator: string = \",\"): string {\n return joinFloatArray<f64>(this.dataStart, this.length, separator);\n }\n\n set<U extends ArrayLike<number>>(source: U, offset: i32 = 0): void {\n SET(this, source, offset);\n }\n\n toString(): string {\n return this.join();\n }\n\n static wrap(buffer: ArrayBuffer, byteOffset: i32 = 0, length: i32 = -1): Float64Array {\n return WRAP<Float64Array, f64>(buffer, byteOffset, length);\n }\n}\n\n// @ts-ignore: decorator\n@inline\nfunction SLICE<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n start: i32,\n end: i32\n): TArray {\n let len = array.length;\n start = start < 0 ? max(start + len, 0) : min(start, len);\n end = end < 0 ? max(end + len, 0) : min(end , len);\n len = max(end - start, 0);\n let slice = instantiate<TArray>(len);\n memory.copy(\n slice.dataStart,\n array.dataStart + (<usize>start << alignof<T>()),\n <usize>len << alignof<T>()\n );\n return slice;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction SUBARRAY<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n begin: i32,\n end: i32\n): TArray {\n let len = array.length;\n begin = begin < 0 ? max(len + begin, 0) : min(begin, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n end = max(end, begin);\n\n let out = changetype<TArray>(__new(offsetof<TArray>(), idof<TArray>()));\n let buf = changetype<usize>(array.buffer);\n store<usize>(changetype<usize>(out), buf, offsetof<TArray>(\"buffer\"));\n __link(changetype<usize>(out), buf, false);\n store<usize>(changetype<usize>(out), array.dataStart + (<usize>begin << alignof<T>()), offsetof<TArray>(\"dataStart\"));\n store<u32>(changetype<usize>(out), (end - begin) << alignof<T>(), offsetof<TArray>(\"byteLength\"));\n return out;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction COPY_WITHIN<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n target: i32,\n start: i32,\n end: i32\n): TArray {\n let len = array.length;\n let ptr = array.dataStart;\n\n end = min<i32>(end, len);\n let to = target < 0 ? max(len + target, 0) : min(target, len);\n let from = start < 0 ? max(len + start, 0) : min(start, len);\n let last = end < 0 ? max(len + end, 0) : min(end, len);\n let count = min(last - from, len - to);\n\n memory.copy(\n ptr + (<usize>to << alignof<T>()),\n ptr + (<usize>from << alignof<T>()),\n <usize>count << alignof<T>()\n );\n return array;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction REDUCE<TArray extends ArrayBufferView, T extends number, TRet extends number>(\n array: TArray,\n fn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n let ptr = array.dataStart;\n for (let i = 0, k = array.length; i < k; i++) {\n initialValue = fn(initialValue, load<T>(ptr + (<usize>i << alignof<T>())), i, array);\n }\n return initialValue;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction REDUCE_RIGHT<TArray extends ArrayBufferView, T extends number, TRet extends number>(\n array: TArray,\n fn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n let ptr = array.dataStart;\n for (let i = array.length - 1; i >= 0; i--) {\n initialValue = fn(initialValue, load<T>(ptr + (<usize>i << alignof<T>())), i, array);\n }\n return initialValue;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction MAP<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n fn: (value: T, index: i32, self: TArray) => T,\n): TArray {\n let len = array.length;\n let ptr = array.dataStart;\n\n let byteLength = len << alignof<T>();\n let out = changetype<TArray>(__new(offsetof<TArray>(), idof<TArray>()));\n let buf = changetype<ArrayBuffer>(__new(byteLength, idof<ArrayBuffer>()));\n for (let i = 0; i < len; i++) {\n store<T>(\n changetype<usize>(buf) + (<usize>i << alignof<T>()),\n fn(load<T>(ptr + (<usize>i << alignof<T>())), i, array)\n );\n }\n store<usize>(changetype<usize>(out), changetype<usize>(buf), offsetof<TArray>(\"buffer\"));\n __link(changetype<usize>(out), changetype<usize>(buf), false);\n store<usize>(changetype<usize>(out), changetype<usize>(buf), offsetof<TArray>(\"dataStart\"));\n store<u32>(changetype<usize>(out), byteLength, offsetof<TArray>(\"byteLength\"));\n return out;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction FILTER<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n fn: (value: T, index: i32, self: TArray) => bool,\n): TArray {\n let len = array.length;\n let out = changetype<TArray>(__new(offsetof<TArray>(), idof<TArray>()));\n let buf = changetype<ArrayBuffer>(__new(len << alignof<T>(), idof<ArrayBuffer>()));\n let dataStart = array.dataStart;\n let j: usize = 0;\n for (let i = 0; i < len; i++) {\n let value = load<T>(dataStart + (<usize>i << alignof<T>()));\n if (fn(value, i, array)) {\n store<T>(\n changetype<usize>(buf) + (j++ << alignof<T>()),\n value\n );\n }\n }\n // shrink output buffer\n let byteLength = j << alignof<T>();\n let data = __renew(changetype<usize>(buf), byteLength);\n store<usize>(changetype<usize>(out), data, offsetof<TArray>(\"buffer\"));\n __link(changetype<usize>(out), data, false);\n store<u32>(changetype<usize>(out), byteLength, offsetof<TArray>(\"byteLength\"));\n store<usize>(changetype<usize>(out), data, offsetof<TArray>(\"dataStart\"));\n return out;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction FIND_INDEX<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n fn: (value: T, index: i32, array: TArray) => bool,\n): i32 {\n let ptr = array.dataStart;\n for (let i = 0, k = array.length; i < k; i++) {\n if (fn(load<T>(ptr + (<usize>i << alignof<T>())), i, array)) return i;\n }\n return -1;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction FIND_LAST_INDEX<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n fn: (value: T, index: i32, array: TArray) => bool,\n): i32 {\n let ptr = array.dataStart;\n for (let i = array.length - 1; i >= 0; --i) {\n if (fn(load<T>(ptr + (<usize>i << alignof<T>())), i, array)) return i;\n }\n return -1;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction INCLUDES<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n searchElement: T,\n fromIndex: i32,\n): bool {\n if (isFloat<T>()) {\n let index: isize = fromIndex;\n let len: isize = array.length;\n if (len == 0 || index >= len) return false;\n if (index < 0) index = max(len + index, 0);\n let dataStart = array.dataStart;\n while (index < len) {\n let elem = load<T>(dataStart + (index << alignof<T>()));\n // @ts-ignore\n if (elem == searchElement || isNaN(elem) & isNaN(searchElement)) return true;\n ++index;\n }\n return false;\n } else {\n return INDEX_OF<TArray, T>(array, searchElement, fromIndex) >= 0;\n }\n}\n\n// @ts-ignore: decorator\n@inline\nfunction INDEX_OF<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n searchElement: T,\n fromIndex: i32,\n): i32 {\n let index: isize = fromIndex;\n let len: isize = array.length;\n if (len == 0 || index >= len) return -1;\n if (index < 0) index = max(len + index, 0);\n let dataStart = array.dataStart;\n while (index < len) {\n if (load<T>(dataStart + (index << alignof<T>())) == searchElement) return <i32>index;\n ++index;\n }\n return -1;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction LAST_INDEX_OF<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n searchElement: T,\n fromIndex: i32,\n): i32 {\n let index: isize = fromIndex;\n let len: isize = array.length;\n if (len == 0) return -1;\n if (index < 0) index = len + index; // no need to clamp\n else if (index >= len) index = len - 1;\n let dataStart = array.dataStart;\n while (index >= 0) {\n if (load<T>(dataStart + (index << alignof<T>())) == searchElement) return <i32>index;\n --index;\n }\n return -1;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction SOME<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n fn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n let ptr = array.dataStart;\n for (let i = 0, k = array.length; i < k; i++) {\n if (fn(load<T>(ptr + (<usize>i << alignof<T>())), i, array)) return true;\n }\n return false;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction EVERY<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n fn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n let ptr = array.dataStart;\n for (let i = 0, k = array.length; i < k; i++) {\n if (fn(load<T>(ptr + (<usize>i << alignof<T>())), i, array)) continue;\n return false;\n }\n return true;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction FOREACH<TArray extends ArrayBufferView, T extends number>(\n array: TArray,\n fn: (value: T, index: i32, array: TArray) => void,\n): void {\n let ptr = array.dataStart;\n for (let i = 0, k = array.length; i < k; i++) {\n fn(load<T>(ptr + (<usize>i << alignof<T>())), i, array);\n }\n}\n\n// @ts-ignore: decorator\n@inline\nfunction WRAP<TArray extends ArrayBufferView, T>(\n buffer: ArrayBuffer,\n byteOffset: i32 = 0,\n len: i32 = -1\n): TArray {\n let byteLength: i32;\n let bufferByteLength = buffer.byteLength;\n const mask: u32 = sizeof<T>() - 1;\n if (i32(<u32>byteOffset > <u32>bufferByteLength) | (byteOffset & mask)) {\n throw new RangeError(E_INDEXOUTOFRANGE);\n }\n if (len < 0) {\n if (len == -1) {\n if (bufferByteLength & mask) {\n throw new RangeError(E_INVALIDLENGTH);\n }\n byteLength = bufferByteLength - byteOffset;\n } else {\n throw new RangeError(E_INVALIDLENGTH);\n }\n } else {\n byteLength = len << alignof<T>();\n if (byteOffset + byteLength > bufferByteLength) {\n throw new RangeError(E_INVALIDLENGTH);\n }\n }\n let out = changetype<TArray>(__new(offsetof<TArray>(), idof<TArray>()));\n store<usize>(changetype<usize>(out), changetype<usize>(buffer), offsetof<TArray>(\"buffer\"));\n __link(changetype<usize>(out), changetype<usize>(buffer), false);\n store<u32>(changetype<usize>(out), byteLength, offsetof<TArray>(\"byteLength\"));\n store<usize>(changetype<usize>(out), changetype<usize>(buffer) + <usize>byteOffset, offsetof<TArray>(\"dataStart\"));\n return out;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction SET<\n TArray extends ArrayLike<number>,\n UArray extends ArrayLike<number>\n>(\n target: TArray,\n source: UArray,\n offset: i32 = 0\n): void {\n // need to assert at compile time that U is not a reference or a function\n if (isReference<valueof<UArray>>()) {\n ERROR(E_NOTIMPLEMENTED);\n }\n let sourceLen = source.length;\n if (offset < 0 || sourceLen + offset > target.length) {\n // offset is out of bounds\n throw new RangeError(E_INDEXOUTOFRANGE);\n }\n // @ts-ignore: dataStart\n let targetStart = target.dataStart + (<usize>offset << (alignof<valueof<TArray>>()));\n // @ts-ignore: dataStart\n let sourceStart = source.dataStart;\n // if the types align and match, use memory.copy() instead of manual loop\n if (\n isInteger<valueof<TArray>>() == isInteger<valueof<UArray>>() &&\n alignof<valueof<TArray>>() == alignof<valueof<UArray>>() &&\n !(isSigned<valueof<UArray>>() && target instanceof Uint8ClampedArray)\n ) {\n memory.copy(targetStart, sourceStart, <usize>sourceLen << (alignof<valueof<UArray>>()));\n } else {\n for (let i = 0; i < sourceLen; i++) {\n let ptr = targetStart + (<usize>i << (alignof<valueof<TArray>>()));\n let value = load<valueof<UArray>>(sourceStart + (<usize>i << (alignof<valueof<UArray>>())));\n // if TArray is Uint8ClampedArray, then values must be clamped\n if (target instanceof Uint8ClampedArray) {\n if (isFloat<valueof<UArray>>()) {\n store<valueof<TArray>>(ptr,\n isFinite<valueof<UArray>>(value)\n ? <valueof<TArray>>max<valueof<UArray>>(0, min<valueof<UArray>>(255, value))\n : 0\n );\n } else {\n if (!isSigned<valueof<UArray>>()) {\n store<valueof<TArray>>(ptr, min<valueof<UArray>>(255, value));\n } else if (sizeof<valueof<TArray>>() <= 4) {\n store<valueof<TArray>>(ptr, ~(<i32>value >> 31) & (((255 - <i32>value) >> 31) | value));\n } else {\n store<valueof<TArray>>(ptr, ~(<i64>value >> 63) & (((255 - <i64>value) >> 63) | value));\n }\n }\n } else {\n if (isFloat<valueof<UArray>>() && !isFloat<valueof<TArray>>()) {\n store<valueof<TArray>>(ptr, isFinite<valueof<UArray>>(value) ? <valueof<TArray>>value : 0);\n } else {\n store<valueof<TArray>>(ptr, <valueof<TArray>>value);\n }\n }\n }\n }\n}\n","/// <reference path=\"./rt/index.d.ts\" />\n\nimport { OBJECT, BLOCK_MAXSIZE, TOTAL_OVERHEAD } from \"./rt/common\";\nimport { Runtime } from \"shared/runtime\";\nimport { idof } from \"./builtins\";\nimport { E_INVALIDLENGTH } from \"./util/error\";\n\nexport abstract class ArrayBufferView {\n\n readonly buffer: ArrayBuffer;\n @unsafe readonly dataStart: usize;\n readonly byteLength: i32;\n\n get byteOffset(): i32 {\n return <i32>(this.dataStart - changetype<usize>(this.buffer));\n }\n\n protected constructor(length: i32, alignLog2: i32) {\n if (<u32>length > <u32>BLOCK_MAXSIZE >>> alignLog2) throw new RangeError(E_INVALIDLENGTH);\n let buffer = changetype<ArrayBuffer>(__new(length = length << alignLog2, idof<ArrayBuffer>()));\n if (ASC_RUNTIME != Runtime.Incremental) {\n memory.fill(changetype<usize>(buffer), 0, <usize>length);\n }\n this.buffer = buffer; // links\n this.dataStart = changetype<usize>(buffer);\n this.byteLength = length;\n }\n}\n\n@final export class ArrayBuffer {\n\n static isView<T>(value: T): bool {\n if (isNullable<T>()) {\n if (changetype<usize>(value) == 0) return false;\n }\n if (value instanceof Int8Array) return true;\n if (value instanceof Uint8Array) return true;\n if (value instanceof Uint8ClampedArray) return true;\n if (value instanceof Int16Array) return true;\n if (value instanceof Uint16Array) return true;\n if (value instanceof Int32Array) return true;\n if (value instanceof Uint32Array) return true;\n if (value instanceof Int64Array) return true;\n if (value instanceof Uint64Array) return true;\n if (value instanceof Float32Array) return true;\n if (value instanceof Float64Array) return true;\n if (value instanceof DataView) return true;\n return false;\n }\n\n constructor(length: i32) {\n if (<u32>length > <u32>BLOCK_MAXSIZE) throw new RangeError(E_INVALIDLENGTH);\n let buffer = changetype<ArrayBuffer>(__new(<usize>length, idof<ArrayBuffer>()));\n if (ASC_RUNTIME != Runtime.Incremental) {\n memory.fill(changetype<usize>(buffer), 0, <usize>length);\n }\n return buffer;\n }\n\n get byteLength(): i32 {\n return changetype<OBJECT>(changetype<usize>(this) - TOTAL_OVERHEAD).rtSize;\n }\n\n slice(begin: i32 = 0, end: i32 = BLOCK_MAXSIZE): ArrayBuffer {\n let length = this.byteLength;\n begin = begin < 0 ? max(length + begin, 0) : min(begin, length);\n end = end < 0 ? max(length + end , 0) : min(end , length);\n let outSize = <usize>max(end - begin, 0);\n let out = changetype<ArrayBuffer>(__new(outSize, idof<ArrayBuffer>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + <usize>begin, outSize);\n return out;\n }\n\n toString(): string {\n return \"[object ArrayBuffer]\";\n }\n}\n","/**\r\n * Matrix Operations for AssemblyScript\r\n *\r\n * Dense matrix operations using flat Float64Array storage.\r\n * Row-major order: element at (i,j) is at index i*cols + j\r\n *\r\n * Note: AssemblyScript doesn't support classes with complex patterns,\r\n * so we use pure functions with explicit dimensions.\r\n */\r\n\r\n// =============================================================================\r\n// Matrix Creation\r\n// =============================================================================\r\n\r\n/**\r\n * Create a matrix filled with zeros\r\n */\r\nexport function matrix_zeros(rows: i32, cols: i32): Float64Array {\r\n return new Float64Array(rows * cols);\r\n}\r\n\r\n/**\r\n * Create a matrix filled with ones\r\n */\r\nexport function matrix_ones(rows: i32, cols: i32): Float64Array {\r\n const data = new Float64Array(rows * cols);\r\n const len = rows * cols;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(data[i] = 1.0);\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Create a matrix filled with a specific value\r\n */\r\nexport function matrix_fill(rows: i32, cols: i32, value: f64): Float64Array {\r\n const data = new Float64Array(rows * cols);\r\n const len = rows * cols;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(data[i] = value);\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Create an identity matrix\r\n */\r\nexport function matrix_identity(n: i32): Float64Array {\r\n const data = new Float64Array(n * n);\r\n for (let i = 0; i < n; i++) {\r\n unchecked(data[i * n + i] = 1.0);\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Create a diagonal matrix from array of values\r\n */\r\nexport function matrix_diag(values: Float64Array): Float64Array {\r\n const n = values.length;\r\n const data = new Float64Array(n * n);\r\n for (let i = 0; i < n; i++) {\r\n unchecked(data[i * n + i] = unchecked(values[i]));\r\n }\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Element Access\r\n// =============================================================================\r\n\r\n/**\r\n * Get element at (row, col)\r\n */\r\nexport function matrix_get(data: Float64Array, cols: i32, row: i32, col: i32): f64 {\r\n return unchecked(data[row * cols + col]);\r\n}\r\n\r\n/**\r\n * Set element at (row, col)\r\n */\r\nexport function matrix_set(data: Float64Array, cols: i32, row: i32, col: i32, value: f64): void {\r\n unchecked(data[row * cols + col] = value);\r\n}\r\n\r\n/**\r\n * Get a row as a new array\r\n */\r\nexport function matrix_get_row(data: Float64Array, cols: i32, row: i32): Float64Array {\r\n const result = new Float64Array(cols);\r\n const offset = row * cols;\r\n for (let j = 0; j < cols; j++) {\r\n unchecked(result[j] = unchecked(data[offset + j]));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get a column as a new array\r\n */\r\nexport function matrix_get_col(data: Float64Array, rows: i32, cols: i32, col: i32): Float64Array {\r\n const result = new Float64Array(rows);\r\n for (let i = 0; i < rows; i++) {\r\n unchecked(result[i] = unchecked(data[i * cols + col]));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get diagonal elements\r\n */\r\nexport function matrix_get_diag(data: Float64Array, rows: i32, cols: i32): Float64Array {\r\n const n = min(rows, cols);\r\n const result = new Float64Array(n);\r\n for (let i = 0; i < n; i++) {\r\n unchecked(result[i] = unchecked(data[i * cols + i]));\r\n }\r\n return result;\r\n}\r\n\r\n// =============================================================================\r\n// Matrix Arithmetic\r\n// =============================================================================\r\n\r\n/**\r\n * Matrix addition: C = A + B\r\n */\r\nexport function matrix_add(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) + unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Matrix subtraction: C = A - B\r\n */\r\nexport function matrix_sub(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) - unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Element-wise multiplication (Hadamard product): C = A .* B\r\n */\r\nexport function matrix_mul_elementwise(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) * unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Element-wise division: C = A ./ B\r\n */\r\nexport function matrix_div_elementwise(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) / unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Scalar multiplication: C = A * scalar\r\n */\r\nexport function matrix_scale(\r\n a: Float64Array, scalar: f64, result: Float64Array\r\n): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) * scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Scalar addition: C = A + scalar\r\n */\r\nexport function matrix_add_scalar(\r\n a: Float64Array, scalar: f64, result: Float64Array\r\n): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) + scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Negate matrix: C = -A\r\n */\r\nexport function matrix_neg(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = -unchecked(a[i]));\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Matrix Multiplication\r\n// =============================================================================\r\n\r\n/**\r\n * Matrix multiplication: C = A * B\r\n * A is (aRows x aCols), B is (aCols x bCols), C is (aRows x bCols)\r\n *\r\n * Uses naive O(n^3) algorithm - suitable for SIMD optimization\r\n */\r\nexport function matrix_multiply(\r\n a: Float64Array, aRows: i32, aCols: i32,\r\n b: Float64Array, bCols: i32,\r\n result: Float64Array\r\n): void {\r\n // Clear result\r\n const resultLen = aRows * bCols;\r\n for (let i = 0; i < resultLen; i++) {\r\n unchecked(result[i] = 0.0);\r\n }\r\n\r\n // Naive matmul with good cache access pattern\r\n for (let i = 0; i < aRows; i++) {\r\n for (let k = 0; k < aCols; k++) {\r\n const aik = unchecked(a[i * aCols + k]);\r\n for (let j = 0; j < bCols; j++) {\r\n unchecked(result[i * bCols + j] += aik * unchecked(b[k * bCols + j]));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Matrix-vector multiplication: y = A * x\r\n * A is (rows x cols), x is (cols), y is (rows)\r\n */\r\nexport function matrix_vector_multiply(\r\n a: Float64Array, rows: i32, cols: i32,\r\n x: Float64Array,\r\n result: Float64Array\r\n): void {\r\n for (let i = 0; i < rows; i++) {\r\n let sum: f64 = 0.0;\r\n const offset = i * cols;\r\n for (let j = 0; j < cols; j++) {\r\n sum += unchecked(a[offset + j]) * unchecked(x[j]);\r\n }\r\n unchecked(result[i] = sum);\r\n }\r\n}\r\n\r\n/**\r\n * Vector-matrix multiplication: y = x^T * A\r\n * x is (rows), A is (rows x cols), y is (cols)\r\n */\r\nexport function vector_matrix_multiply(\r\n x: Float64Array,\r\n a: Float64Array, rows: i32, cols: i32,\r\n result: Float64Array\r\n): void {\r\n // Clear result\r\n for (let j = 0; j < cols; j++) {\r\n unchecked(result[j] = 0.0);\r\n }\r\n\r\n for (let i = 0; i < rows; i++) {\r\n const xi = unchecked(x[i]);\r\n const offset = i * cols;\r\n for (let j = 0; j < cols; j++) {\r\n unchecked(result[j] += xi * unchecked(a[offset + j]));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Outer product: C = x * y^T\r\n * x is (m), y is (n), C is (m x n)\r\n */\r\nexport function matrix_outer(\r\n x: Float64Array, y: Float64Array, result: Float64Array\r\n): void {\r\n const m = x.length;\r\n const n = y.length;\r\n for (let i = 0; i < m; i++) {\r\n const xi = unchecked(x[i]);\r\n const offset = i * n;\r\n for (let j = 0; j < n; j++) {\r\n unchecked(result[offset + j] = xi * unchecked(y[j]));\r\n }\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Matrix Transpose\r\n// =============================================================================\r\n\r\n/**\r\n * Transpose matrix: B = A^T\r\n * A is (rows x cols), B is (cols x rows)\r\n */\r\nexport function matrix_transpose(\r\n a: Float64Array, rows: i32, cols: i32, result: Float64Array\r\n): void {\r\n for (let i = 0; i < rows; i++) {\r\n for (let j = 0; j < cols; j++) {\r\n unchecked(result[j * rows + i] = unchecked(a[i * cols + j]));\r\n }\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Matrix Reductions\r\n// =============================================================================\r\n\r\n/**\r\n * Sum of all elements\r\n */\r\nexport function matrix_sum(data: Float64Array): f64 {\r\n let sum: f64 = 0.0;\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n sum += unchecked(data[i]);\r\n }\r\n return sum;\r\n}\r\n\r\n/**\r\n * Mean of all elements\r\n */\r\nexport function matrix_mean(data: Float64Array): f64 {\r\n const len = data.length;\r\n if (len == 0) return f64.NaN;\r\n return matrix_sum(data) / f64(len);\r\n}\r\n\r\n/**\r\n * Minimum element\r\n */\r\nexport function matrix_min(data: Float64Array): f64 {\r\n const len = data.length;\r\n if (len == 0) return f64.NaN;\r\n\r\n let minVal = unchecked(data[0]);\r\n for (let i = 1; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n if (val < minVal) minVal = val;\r\n }\r\n return minVal;\r\n}\r\n\r\n/**\r\n * Maximum element\r\n */\r\nexport function matrix_max(data: Float64Array): f64 {\r\n const len = data.length;\r\n if (len == 0) return f64.NaN;\r\n\r\n let maxVal = unchecked(data[0]);\r\n for (let i = 1; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n if (val > maxVal) maxVal = val;\r\n }\r\n return maxVal;\r\n}\r\n\r\n/**\r\n * Frobenius norm (sqrt of sum of squares)\r\n */\r\nexport function matrix_norm_frobenius(data: Float64Array): f64 {\r\n let sumSq: f64 = 0.0;\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n const val = unchecked(data[i]);\r\n sumSq += val * val;\r\n }\r\n return sqrt(sumSq);\r\n}\r\n\r\n/**\r\n * Trace (sum of diagonal elements)\r\n */\r\nexport function matrix_trace(data: Float64Array, rows: i32, cols: i32): f64 {\r\n const n = min(rows, cols);\r\n let sum: f64 = 0.0;\r\n for (let i = 0; i < n; i++) {\r\n sum += unchecked(data[i * cols + i]);\r\n }\r\n return sum;\r\n}\r\n\r\n/**\r\n * Sum along rows (result is column vector)\r\n */\r\nexport function matrix_sum_rows(\r\n data: Float64Array, rows: i32, cols: i32, result: Float64Array\r\n): void {\r\n for (let i = 0; i < rows; i++) {\r\n let sum: f64 = 0.0;\r\n const offset = i * cols;\r\n for (let j = 0; j < cols; j++) {\r\n sum += unchecked(data[offset + j]);\r\n }\r\n unchecked(result[i] = sum);\r\n }\r\n}\r\n\r\n/**\r\n * Sum along columns (result is row vector)\r\n */\r\nexport function matrix_sum_cols(\r\n data: Float64Array, rows: i32, cols: i32, result: Float64Array\r\n): void {\r\n // Clear result\r\n for (let j = 0; j < cols; j++) {\r\n unchecked(result[j] = 0.0);\r\n }\r\n\r\n for (let i = 0; i < rows; i++) {\r\n const offset = i * cols;\r\n for (let j = 0; j < cols; j++) {\r\n unchecked(result[j] += unchecked(data[offset + j]));\r\n }\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Matrix Queries\r\n// =============================================================================\r\n\r\n/**\r\n * Check if matrix is square\r\n */\r\nexport function matrix_is_square(rows: i32, cols: i32): bool {\r\n return rows == cols;\r\n}\r\n\r\n/**\r\n * Check if matrix is symmetric (within tolerance)\r\n */\r\nexport function matrix_is_symmetric(\r\n data: Float64Array, rows: i32, cols: i32, tolerance: f64\r\n): bool {\r\n if (rows != cols) return false;\r\n\r\n for (let i = 0; i < rows; i++) {\r\n for (let j = i + 1; j < cols; j++) {\r\n const aij = unchecked(data[i * cols + j]);\r\n const aji = unchecked(data[j * cols + i]);\r\n if (abs(aij - aji) > tolerance) return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if matrix is diagonal (within tolerance)\r\n */\r\nexport function matrix_is_diagonal(\r\n data: Float64Array, rows: i32, cols: i32, tolerance: f64\r\n): bool {\r\n for (let i = 0; i < rows; i++) {\r\n for (let j = 0; j < cols; j++) {\r\n if (i != j) {\r\n if (abs(unchecked(data[i * cols + j])) > tolerance) return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if matrix equals identity (within tolerance)\r\n */\r\nexport function matrix_is_identity(\r\n data: Float64Array, rows: i32, cols: i32, tolerance: f64\r\n): bool {\r\n if (rows != cols) return false;\r\n\r\n for (let i = 0; i < rows; i++) {\r\n for (let j = 0; j < cols; j++) {\r\n const expected: f64 = i == j ? 1.0 : 0.0;\r\n if (abs(unchecked(data[i * cols + j]) - expected) > tolerance) return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n// =============================================================================\r\n// In-place Operations\r\n// =============================================================================\r\n\r\n/**\r\n * Scale matrix in place: A *= scalar\r\n */\r\nexport function matrix_scale_inplace(data: Float64Array, scalar: f64): void {\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(data[i] = unchecked(data[i]) * scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Add scalar in place: A += scalar\r\n */\r\nexport function matrix_add_scalar_inplace(data: Float64Array, scalar: f64): void {\r\n const len = data.length;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(data[i] = unchecked(data[i]) + scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Add matrix in place: A += B\r\n */\r\nexport function matrix_add_inplace(a: Float64Array, b: Float64Array): void {\r\n const len = min(a.length, b.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(a[i] = unchecked(a[i]) + unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Copy matrix: dst = src\r\n */\r\nexport function matrix_copy(src: Float64Array, dst: Float64Array): void {\r\n const len = min(src.length, dst.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(dst[i] = unchecked(src[i]));\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Linear Algebra Basics\r\n// =============================================================================\r\n\r\n/**\r\n * AXPY operation: Y = alpha*X + Y (BLAS Level 1)\r\n */\r\nexport function matrix_axpy(\r\n alpha: f64, x: Float64Array, y: Float64Array\r\n): void {\r\n const len = min(x.length, y.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(y[i] = alpha * unchecked(x[i]) + unchecked(y[i]));\r\n }\r\n}\r\n\r\n/**\r\n * GEMM: C = alpha*A*B + beta*C (General Matrix Multiply)\r\n * A is (m x k), B is (k x n), C is (m x n)\r\n */\r\nexport function matrix_gemm(\r\n alpha: f64, a: Float64Array, m: i32, k: i32,\r\n b: Float64Array, n: i32,\r\n beta: f64, c: Float64Array\r\n): void {\r\n // Scale C by beta\r\n const cLen = m * n;\r\n for (let i = 0; i < cLen; i++) {\r\n unchecked(c[i] = beta * unchecked(c[i]));\r\n }\r\n\r\n // Add alpha * A * B\r\n for (let i = 0; i < m; i++) {\r\n for (let p = 0; p < k; p++) {\r\n const aip = alpha * unchecked(a[i * k + p]);\r\n for (let j = 0; j < n; j++) {\r\n unchecked(c[i * n + j] += aip * unchecked(b[p * n + j]));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * GEMV: y = alpha*A*x + beta*y (General Matrix-Vector Multiply)\r\n * A is (m x n), x is (n), y is (m)\r\n */\r\nexport function matrix_gemv(\r\n alpha: f64, a: Float64Array, m: i32, n: i32,\r\n x: Float64Array,\r\n beta: f64, y: Float64Array\r\n): void {\r\n for (let i = 0; i < m; i++) {\r\n let dot: f64 = 0.0;\r\n const offset = i * n;\r\n for (let j = 0; j < n; j++) {\r\n dot += unchecked(a[offset + j]) * unchecked(x[j]);\r\n }\r\n unchecked(y[i] = alpha * dot + beta * unchecked(y[i]));\r\n }\r\n}\r\n","/**\r\n * Complex Number Operations for AssemblyScript\r\n *\r\n * Standalone functions for complex number arithmetic.\r\n * These complement the Complex class methods for use cases\r\n * where functional style is preferred.\r\n */\r\n\r\nimport { Complex, complexFromPolar } from '../types/complex';\r\n\r\n// =============================================================================\r\n// Basic Arithmetic\r\n// =============================================================================\r\n\r\n/**\r\n * Add two complex numbers\r\n */\r\nexport function complex_add(a: Complex, b: Complex): Complex {\r\n return a.add(b);\r\n}\r\n\r\n/**\r\n * Subtract two complex numbers\r\n */\r\nexport function complex_sub(a: Complex, b: Complex): Complex {\r\n return a.sub(b);\r\n}\r\n\r\n/**\r\n * Multiply two complex numbers\r\n */\r\nexport function complex_mul(a: Complex, b: Complex): Complex {\r\n return a.mul(b);\r\n}\r\n\r\n/**\r\n * Divide two complex numbers\r\n */\r\nexport function complex_div(a: Complex, b: Complex): Complex {\r\n return a.div(b);\r\n}\r\n\r\n/**\r\n * Negate a complex number\r\n */\r\nexport function complex_neg(a: Complex): Complex {\r\n return a.neg();\r\n}\r\n\r\n/**\r\n * Complex conjugate\r\n */\r\nexport function complex_conj(a: Complex): Complex {\r\n return a.conj();\r\n}\r\n\r\n/**\r\n * Reciprocal (1/z)\r\n */\r\nexport function complex_reciprocal(a: Complex): Complex {\r\n return a.reciprocal();\r\n}\r\n\r\n// =============================================================================\r\n// Magnitude and Phase\r\n// =============================================================================\r\n\r\n/**\r\n * Absolute value (magnitude)\r\n */\r\nexport function complex_abs(a: Complex): f64 {\r\n return a.abs();\r\n}\r\n\r\n/**\r\n * Argument (phase angle)\r\n */\r\nexport function complex_arg(a: Complex): f64 {\r\n return a.arg();\r\n}\r\n\r\n/**\r\n * Squared magnitude (faster than abs^2)\r\n */\r\nexport function complex_abs_squared(a: Complex): f64 {\r\n return a.re * a.re + a.im * a.im;\r\n}\r\n\r\n// =============================================================================\r\n// Power and Root Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Square root of complex number\r\n */\r\nexport function complex_sqrt(a: Complex): Complex {\r\n return a.sqrt();\r\n}\r\n\r\n/**\r\n * Complex power: a^n where n is real\r\n */\r\nexport function complex_pow(a: Complex, n: f64): Complex {\r\n return a.powReal(n);\r\n}\r\n\r\n/**\r\n * Complex to complex power: a^b\r\n */\r\nexport function complex_cpow(a: Complex, b: Complex): Complex {\r\n // a^b = Math.exp(b * Math.log(a))\r\n const logA = a.log();\r\n const product = new Complex(\r\n b.re * logA.re - b.im * logA.im,\r\n b.re * logA.im + b.im * logA.re\r\n );\r\n return product.exp();\r\n}\r\n\r\n/**\r\n * Square\r\n */\r\nexport function complex_square(a: Complex): Complex {\r\n return new Complex(\r\n a.re * a.re - a.im * a.im,\r\n 2.0 * a.re * a.im\r\n );\r\n}\r\n\r\n/**\r\n * Cube\r\n */\r\nexport function complex_cube(a: Complex): Complex {\r\n const re2 = a.re * a.re;\r\n const im2 = a.im * a.im;\r\n return new Complex(\r\n a.re * (re2 - 3.0 * im2),\r\n a.im * (3.0 * re2 - im2)\r\n );\r\n}\r\n\r\n// =============================================================================\r\n// Exponential and Logarithmic\r\n// =============================================================================\r\n\r\n/**\r\n * Complex exponential\r\n */\r\nexport function complex_exp(a: Complex): Complex {\r\n return a.exp();\r\n}\r\n\r\n/**\r\n * Complex natural logarithm\r\n */\r\nexport function complex_log(a: Complex): Complex {\r\n return a.log();\r\n}\r\n\r\n/**\r\n * Complex base-10 logarithm\r\n */\r\nexport function complex_log10(a: Complex): Complex {\r\n const ln = a.log();\r\n const ln10 = 2.302585092994046;\r\n return new Complex(ln.re / ln10, ln.im / ln10);\r\n}\r\n\r\n/**\r\n * Complex base-2 logarithm\r\n */\r\nexport function complex_log2(a: Complex): Complex {\r\n const ln = a.log();\r\n const ln2 = 0.6931471805599453;\r\n return new Complex(ln.re / ln2, ln.im / ln2);\r\n}\r\n\r\n// =============================================================================\r\n// Trigonometric Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Complex sine\r\n */\r\nexport function complex_sin(a: Complex): Complex {\r\n return a.sin();\r\n}\r\n\r\n/**\r\n * Complex cosine\r\n */\r\nexport function complex_cos(a: Complex): Complex {\r\n return a.cos();\r\n}\r\n\r\n/**\r\n * Complex tangent\r\n */\r\nexport function complex_tan(a: Complex): Complex {\r\n return a.tan();\r\n}\r\n\r\n/**\r\n * Complex arc sine\r\n */\r\nexport function complex_asin(a: Complex): Complex {\r\n return a.asin();\r\n}\r\n\r\n/**\r\n * Complex arc cosine\r\n */\r\nexport function complex_acos(a: Complex): Complex {\r\n return a.acos();\r\n}\r\n\r\n/**\r\n * Complex arc tangent\r\n */\r\nexport function complex_atan(a: Complex): Complex {\r\n return a.atan();\r\n}\r\n\r\n// =============================================================================\r\n// Hyperbolic Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Complex hyperbolic sine\r\n */\r\nexport function complex_sinh(a: Complex): Complex {\r\n return a.sinh();\r\n}\r\n\r\n/**\r\n * Complex hyperbolic cosine\r\n */\r\nexport function complex_cosh(a: Complex): Complex {\r\n return a.cosh();\r\n}\r\n\r\n/**\r\n * Complex hyperbolic tangent\r\n */\r\nexport function complex_tanh(a: Complex): Complex {\r\n return a.tanh();\r\n}\r\n\r\n/**\r\n * Complex inverse hyperbolic sine\r\n */\r\nexport function complex_asinh(a: Complex): Complex {\r\n return a.asinh();\r\n}\r\n\r\n/**\r\n * Complex inverse hyperbolic cosine\r\n */\r\nexport function complex_acosh(a: Complex): Complex {\r\n return a.acosh();\r\n}\r\n\r\n/**\r\n * Complex inverse hyperbolic tangent\r\n */\r\nexport function complex_atanh(a: Complex): Complex {\r\n return a.atanh();\r\n}\r\n\r\n// =============================================================================\r\n// Utility Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Check equality (exact)\r\n */\r\nexport function complex_equals(a: Complex, b: Complex): bool {\r\n return a.equals(b);\r\n}\r\n\r\n/**\r\n * Check approximate equality\r\n */\r\nexport function complex_approx_equals(a: Complex, b: Complex, tolerance: f64): bool {\r\n return a.approxEquals(b, tolerance);\r\n}\r\n\r\n/**\r\n * Check if complex number is zero\r\n */\r\nexport function complex_is_zero(a: Complex): bool {\r\n return a.isZero();\r\n}\r\n\r\n/**\r\n * Check if complex number is real (imaginary part is zero)\r\n */\r\nexport function complex_is_real(a: Complex): bool {\r\n return a.isReal();\r\n}\r\n\r\n/**\r\n * Check if complex number is purely imaginary\r\n */\r\nexport function complex_is_imaginary(a: Complex): bool {\r\n return a.isImaginary();\r\n}\r\n\r\n/**\r\n * Check if complex number is NaN\r\n */\r\nexport function complex_is_nan(a: Complex): bool {\r\n return isNaN(a.re) || isNaN(a.im);\r\n}\r\n\r\n/**\r\n * Check if complex number is finite\r\n */\r\nexport function complex_is_finite(a: Complex): bool {\r\n return isFinite(a.re) && isFinite(a.im);\r\n}\r\n\r\n// =============================================================================\r\n// Construction Helpers\r\n// =============================================================================\r\n\r\n/**\r\n * Create complex from real part only\r\n */\r\nexport function complex_from_real(re: f64): Complex {\r\n return new Complex(re, 0.0);\r\n}\r\n\r\n/**\r\n * Create complex from imaginary part only\r\n */\r\nexport function complex_from_imag(im: f64): Complex {\r\n return new Complex(0.0, im);\r\n}\r\n\r\n/**\r\n * Create complex from polar coordinates\r\n */\r\nexport function complex_from_polar(r: f64, theta: f64): Complex {\r\n return complexFromPolar(r, theta);\r\n}\r\n\r\n/**\r\n * Convert to polar: returns [r, theta]\r\n */\r\nexport function complex_to_polar(a: Complex): Float64Array {\r\n const result = new Float64Array(2);\r\n unchecked(result[0] = a.abs());\r\n unchecked(result[1] = a.arg());\r\n return result;\r\n}\r\n\r\n// =============================================================================\r\n// Linear Algebra Operations\r\n// =============================================================================\r\n\r\n/**\r\n * Linear combination: alpha*a + beta*b\r\n */\r\nexport function complex_axpby(\r\n alpha: Complex, a: Complex,\r\n beta: Complex, b: Complex\r\n): Complex {\r\n return alpha.mul(a).add(beta.mul(b));\r\n}\r\n\r\n/**\r\n * Euclidean distance between two complex numbers\r\n */\r\nexport function complex_distance(a: Complex, b: Complex): f64 {\r\n const diff = a.sub(b);\r\n return diff.abs();\r\n}\r\n","/**\r\n * Complex Array Operations for AssemblyScript\r\n *\r\n * Operations on arrays of complex numbers.\r\n * Complex arrays use interleaved storage: [re0, im0, re1, im1, ...]\r\n * A Float64Array of length 2n represents n complex numbers.\r\n */\r\n\r\nimport { Complex } from '../types/complex';\r\n\r\n// =============================================================================\r\n// Array Creation\r\n// =============================================================================\r\n\r\n/**\r\n * Create complex array of zeros\r\n * Returns array of length 2*n (interleaved)\r\n */\r\nexport function complex_array_zeros(n: i32): Float64Array {\r\n return new Float64Array(n * 2);\r\n}\r\n\r\n/**\r\n * Create complex array of ones (1 + 0i)\r\n */\r\nexport function complex_array_ones(n: i32): Float64Array {\r\n const data = new Float64Array(n * 2);\r\n for (let i = 0; i < n; i++) {\r\n unchecked(data[i * 2] = 1.0); // real part\r\n // imaginary part is already 0\r\n }\r\n return data;\r\n}\r\n\r\n/**\r\n * Create complex array with value (re + im*i)\r\n */\r\nexport function complex_array_fill(n: i32, re: f64, im: f64): Float64Array {\r\n const data = new Float64Array(n * 2);\r\n for (let i = 0; i < n; i++) {\r\n unchecked(data[i * 2] = re);\r\n unchecked(data[i * 2 + 1] = im);\r\n }\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Element Access\r\n// =============================================================================\r\n\r\n/**\r\n * Get complex number at index (returns new Complex)\r\n */\r\nexport function complex_array_get(data: Float64Array, index: i32): Complex {\r\n const re = unchecked(data[index * 2]);\r\n const im = unchecked(data[index * 2 + 1]);\r\n return new Complex(re, im);\r\n}\r\n\r\n/**\r\n * Set complex number at index\r\n */\r\nexport function complex_array_set(data: Float64Array, index: i32, value: Complex): void {\r\n unchecked(data[index * 2] = value.re);\r\n unchecked(data[index * 2 + 1] = value.im);\r\n}\r\n\r\n/**\r\n * Set complex number at index from components\r\n */\r\nexport function complex_array_set_parts(data: Float64Array, index: i32, re: f64, im: f64): void {\r\n unchecked(data[index * 2] = re);\r\n unchecked(data[index * 2 + 1] = im);\r\n}\r\n\r\n/**\r\n * Get real part at index\r\n */\r\nexport function complex_array_get_re(data: Float64Array, index: i32): f64 {\r\n return unchecked(data[index * 2]);\r\n}\r\n\r\n/**\r\n * Get imaginary part at index\r\n */\r\nexport function complex_array_get_im(data: Float64Array, index: i32): f64 {\r\n return unchecked(data[index * 2 + 1]);\r\n}\r\n\r\n/**\r\n * Get number of complex elements (array length / 2)\r\n */\r\nexport function complex_array_length(data: Float64Array): i32 {\r\n return data.length / 2;\r\n}\r\n\r\n// =============================================================================\r\n// Element-wise Arithmetic\r\n// =============================================================================\r\n\r\n/**\r\n * Complex array addition: result = a + b\r\n */\r\nexport function complex_array_add(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) + unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Complex array subtraction: result = a - b\r\n */\r\nexport function complex_array_sub(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const len = min(min(a.length, b.length), result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) - unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Complex array multiplication: result = a * b (element-wise)\r\n * (a + bi)(c + di) = (ac - bd) + (ad + bc)i\r\n */\r\nexport function complex_array_mul(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const n = min(min(a.length, b.length), result.length) / 2;\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n const aRe = unchecked(a[idx]);\r\n const aIm = unchecked(a[idx + 1]);\r\n const bRe = unchecked(b[idx]);\r\n const bIm = unchecked(b[idx + 1]);\r\n\r\n unchecked(result[idx] = aRe * bRe - aIm * bIm);\r\n unchecked(result[idx + 1] = aRe * bIm + aIm * bRe);\r\n }\r\n}\r\n\r\n/**\r\n * Complex array division: result = a / b (element-wise)\r\n */\r\nexport function complex_array_div(\r\n a: Float64Array, b: Float64Array, result: Float64Array\r\n): void {\r\n const n = min(min(a.length, b.length), result.length) / 2;\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n const aRe = unchecked(a[idx]);\r\n const aIm = unchecked(a[idx + 1]);\r\n const bRe = unchecked(b[idx]);\r\n const bIm = unchecked(b[idx + 1]);\r\n\r\n const denom = bRe * bRe + bIm * bIm;\r\n unchecked(result[idx] = (aRe * bRe + aIm * bIm) / denom);\r\n unchecked(result[idx + 1] = (aIm * bRe - aRe * bIm) / denom);\r\n }\r\n}\r\n\r\n/**\r\n * Scale complex array by real scalar: result = a * scalar\r\n */\r\nexport function complex_array_scale_real(\r\n a: Float64Array, scalar: f64, result: Float64Array\r\n): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = unchecked(a[i]) * scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Scale complex array by complex scalar: result = a * (re + im*i)\r\n */\r\nexport function complex_array_scale_complex(\r\n a: Float64Array, re: f64, im: f64, result: Float64Array\r\n): void {\r\n const n = min(a.length, result.length) / 2;\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n const aRe = unchecked(a[idx]);\r\n const aIm = unchecked(a[idx + 1]);\r\n\r\n unchecked(result[idx] = aRe * re - aIm * im);\r\n unchecked(result[idx + 1] = aRe * im + aIm * re);\r\n }\r\n}\r\n\r\n/**\r\n * Negate complex array: result = -a\r\n */\r\nexport function complex_array_neg(a: Float64Array, result: Float64Array): void {\r\n const len = min(a.length, result.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(result[i] = -unchecked(a[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Complex conjugate array: result = conj(a)\r\n */\r\nexport function complex_array_conj(a: Float64Array, result: Float64Array): void {\r\n const n = min(a.length, result.length) / 2;\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n unchecked(result[idx] = unchecked(a[idx])); // real unchanged\r\n unchecked(result[idx + 1] = -unchecked(a[idx + 1])); // negate imaginary\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Element-wise Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Magnitude (absolute value) of each element: result[i] = |a[i]|\r\n */\r\nexport function complex_array_abs(a: Float64Array, result: Float64Array): void {\r\n const n = a.length / 2;\r\n for (let i = 0; i < n; i++) {\r\n const re = unchecked(a[i * 2]);\r\n const im = unchecked(a[i * 2 + 1]);\r\n unchecked(result[i] = sqrt(re * re + im * im));\r\n }\r\n}\r\n\r\n/**\r\n * Phase (argument) of each element: result[i] = arg(a[i])\r\n */\r\nexport function complex_array_arg(a: Float64Array, result: Float64Array): void {\r\n const n = a.length / 2;\r\n for (let i = 0; i < n; i++) {\r\n const re = unchecked(a[i * 2]);\r\n const im = unchecked(a[i * 2 + 1]);\r\n unchecked(result[i] = Math.atan2(im, re));\r\n }\r\n}\r\n\r\n/**\r\n * Square of magnitude: result[i] = |a[i]|^2\r\n */\r\nexport function complex_array_abs_squared(a: Float64Array, result: Float64Array): void {\r\n const n = a.length / 2;\r\n for (let i = 0; i < n; i++) {\r\n const re = unchecked(a[i * 2]);\r\n const im = unchecked(a[i * 2 + 1]);\r\n unchecked(result[i] = re * re + im * im);\r\n }\r\n}\r\n\r\n/**\r\n * Extract real parts\r\n */\r\nexport function complex_array_real(a: Float64Array, result: Float64Array): void {\r\n const n = min(a.length / 2, result.length);\r\n for (let i = 0; i < n; i++) {\r\n unchecked(result[i] = unchecked(a[i * 2]));\r\n }\r\n}\r\n\r\n/**\r\n * Extract imaginary parts\r\n */\r\nexport function complex_array_imag(a: Float64Array, result: Float64Array): void {\r\n const n = min(a.length / 2, result.length);\r\n for (let i = 0; i < n; i++) {\r\n unchecked(result[i] = unchecked(a[i * 2 + 1]));\r\n }\r\n}\r\n\r\n/**\r\n * Complex exponential: result = Math.exp(a)\r\n */\r\nexport function complex_array_exp(a: Float64Array, result: Float64Array): void {\r\n const n = min(a.length, result.length) / 2;\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n const re = unchecked(a[idx]);\r\n const im = unchecked(a[idx + 1]);\r\n\r\n const expRe = Math.exp(re);\r\n unchecked(result[idx] = expRe * Math.cos(im));\r\n unchecked(result[idx + 1] = expRe * Math.sin(im));\r\n }\r\n}\r\n\r\n/**\r\n * Complex natural log: result = Math.log(a)\r\n */\r\nexport function complex_array_log(a: Float64Array, result: Float64Array): void {\r\n const n = min(a.length, result.length) / 2;\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n const re = unchecked(a[idx]);\r\n const im = unchecked(a[idx + 1]);\r\n\r\n unchecked(result[idx] = Math.log(sqrt(re * re + im * im)));\r\n unchecked(result[idx + 1] = Math.atan2(im, re));\r\n }\r\n}\r\n\r\n/**\r\n * Complex square root: result = sqrt(a)\r\n */\r\nexport function complex_array_sqrt(a: Float64Array, result: Float64Array): void {\r\n const n = min(a.length, result.length) / 2;\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n const re = unchecked(a[idx]);\r\n const im = unchecked(a[idx + 1]);\r\n\r\n const r = sqrt(re * re + im * im);\r\n const sqrtR = sqrt(r);\r\n const halfTheta = Math.atan2(im, re) / 2.0;\r\n\r\n unchecked(result[idx] = sqrtR * Math.cos(halfTheta));\r\n unchecked(result[idx + 1] = sqrtR * Math.sin(halfTheta));\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Reductions\r\n// =============================================================================\r\n\r\n/**\r\n * Sum of complex array\r\n */\r\nexport function complex_array_sum(a: Float64Array): Complex {\r\n let sumRe: f64 = 0.0;\r\n let sumIm: f64 = 0.0;\r\n const n = a.length / 2;\r\n\r\n for (let i = 0; i < n; i++) {\r\n sumRe += unchecked(a[i * 2]);\r\n sumIm += unchecked(a[i * 2 + 1]);\r\n }\r\n\r\n return new Complex(sumRe, sumIm);\r\n}\r\n\r\n/**\r\n * Mean of complex array\r\n */\r\nexport function complex_array_mean(a: Float64Array): Complex {\r\n const n = a.length / 2;\r\n if (n == 0) return new Complex(f64.NaN, f64.NaN);\r\n\r\n const sum = complex_array_sum(a);\r\n return new Complex(sum.re / f64(n), sum.im / f64(n));\r\n}\r\n\r\n/**\r\n * Dot product of two complex arrays: sum(a[i] * conj(b[i]))\r\n */\r\nexport function complex_array_dot(a: Float64Array, b: Float64Array): Complex {\r\n let sumRe: f64 = 0.0;\r\n let sumIm: f64 = 0.0;\r\n const n = min(a.length, b.length) / 2;\r\n\r\n for (let i = 0; i < n; i++) {\r\n const idx = i * 2;\r\n const aRe = unchecked(a[idx]);\r\n const aIm = unchecked(a[idx + 1]);\r\n const bRe = unchecked(b[idx]);\r\n const bIm = -unchecked(b[idx + 1]); // conjugate of b\r\n\r\n sumRe += aRe * bRe - aIm * bIm;\r\n sumIm += aRe * bIm + aIm * bRe;\r\n }\r\n\r\n return new Complex(sumRe, sumIm);\r\n}\r\n\r\n/**\r\n * L2 norm of complex array: sqrt(sum(|a[i]|^2))\r\n */\r\nexport function complex_array_norm(a: Float64Array): f64 {\r\n let sumSq: f64 = 0.0;\r\n const n = a.length / 2;\r\n\r\n for (let i = 0; i < n; i++) {\r\n const re = unchecked(a[i * 2]);\r\n const im = unchecked(a[i * 2 + 1]);\r\n sumSq += re * re + im * im;\r\n }\r\n\r\n return sqrt(sumSq);\r\n}\r\n\r\n// =============================================================================\r\n// In-place Operations\r\n// =============================================================================\r\n\r\n/**\r\n * Scale in place: a *= scalar (real)\r\n */\r\nexport function complex_array_scale_inplace(a: Float64Array, scalar: f64): void {\r\n const len = a.length;\r\n for (let i = 0; i < len; i++) {\r\n unchecked(a[i] = unchecked(a[i]) * scalar);\r\n }\r\n}\r\n\r\n/**\r\n * Conjugate in place\r\n */\r\nexport function complex_array_conj_inplace(a: Float64Array): void {\r\n const n = a.length / 2;\r\n for (let i = 0; i < n; i++) {\r\n unchecked(a[i * 2 + 1] = -unchecked(a[i * 2 + 1]));\r\n }\r\n}\r\n\r\n/**\r\n * Add in place: a += b\r\n */\r\nexport function complex_array_add_inplace(a: Float64Array, b: Float64Array): void {\r\n const len = min(a.length, b.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(a[i] = unchecked(a[i]) + unchecked(b[i]));\r\n }\r\n}\r\n\r\n/**\r\n * Copy complex array\r\n */\r\nexport function complex_array_copy(src: Float64Array, dst: Float64Array): void {\r\n const len = min(src.length, dst.length);\r\n for (let i = 0; i < len; i++) {\r\n unchecked(dst[i] = unchecked(src[i]));\r\n }\r\n}\r\n"]}