databonk 0.0.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +491 -96
- package/dist/dataframe-BggBYXYm.d.cts +886 -0
- package/dist/dataframe-BggBYXYm.d.ts +886 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +366 -0
- package/dist/index.d.ts +354 -31
- package/dist/index.js +4 -40
- package/dist/index.js.map +1 -1
- package/dist/parallel-fv5h4BkA.d.cts +152 -0
- package/dist/parallel-fv5h4BkA.d.ts +152 -0
- package/dist/parquet.cjs +3 -0
- package/dist/parquet.cjs.map +1 -0
- package/dist/parquet.d.cts +57 -0
- package/dist/parquet.d.ts +57 -0
- package/dist/parquet.js +3 -0
- package/dist/parquet.js.map +1 -0
- package/dist/scalar.wasm +0 -0
- package/dist/simd-threads.wasm +0 -0
- package/dist/simd.wasm +0 -0
- package/dist/workers.cjs +102 -0
- package/dist/workers.cjs.map +1 -0
- package/dist/workers.d.cts +74 -0
- package/dist/workers.d.ts +74 -0
- package/dist/workers.js +102 -0
- package/dist/workers.js.map +1 -0
- package/package.json +93 -32
- package/build/release.d.ts +0 -719
- package/build/release.js +0 -774
- package/build/release.wasm +0 -0
- package/build/release.wasm.map +0 -1
- package/build/release.wat +0 -22633
- package/dist/dataframe.d.ts +0 -82
- package/dist/dataframe.d.ts.map +0 -1
- package/dist/dataframe.js +0 -318
- package/dist/dataframe.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/loader.d.ts +0 -86
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -147
- package/dist/loader.js.map +0 -1
- package/dist/shared-memory.d.ts +0 -64
- package/dist/shared-memory.d.ts.map +0 -1
- package/dist/shared-memory.js +0 -113
- package/dist/shared-memory.js.map +0 -1
package/build/release.wasm.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["~lib/rt/common.ts","~lib/rt/tlsf.ts","~lib/shared/typeinfo.ts","~lib/rt/itcms.ts","assembly/core/validity-bitmap.ts","assembly/core/numeric-column.ts","assembly/core/string-column.ts","assembly/core/schema.ts","assembly/ops/groupby.ts","assembly/ops/join.ts","assembly/memory/allocator.ts","assembly/index.ts","~lib/util/error.ts","~lib/shared/runtime.ts","~lib/util/number.ts","~lib/util/math.ts","~lib/util/string.ts","~lib/rt.ts","~lib/arraybuffer.ts","~lib/util/hash.ts","~lib/map.ts","assembly/dataframe/dataframe.ts","assembly/dataframe/builder.ts","~lib/util/sort.ts","~lib/array.ts","~lib/memory.ts","~lib/string.ts","~lib/staticarray.ts","~lib/builtins.ts","assembly/ops/aggregations.ts","assembly/simd/simd-aggregations.ts","assembly/simd/simd-utils.ts","~lib/math.ts","assembly/ops/arithmetic.ts","assembly/simd/simd-arithmetic.ts","assembly/memory/shared.ts","~lib/function.ts"],"names":[],"mappings":"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","sourceRoot":"./release","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","import { AL_BITS, AL_SIZE, AL_MASK, DEBUG, BLOCK, BLOCK_OVERHEAD, BLOCK_MAXSIZE } from \"./common\";\nimport { oninit, onalloc, onresize, onmove, onfree } from \"./rtrace\";\nimport { E_ALLOCATION_TOO_LARGE } from \"../util/error\";\n\n// === The TLSF (Two-Level Segregate Fit) memory allocator ===\n// see: http://www.gii.upv.es/tlsf/\n\n// - `ffs(x)` is equivalent to `ctz(x)` with x != 0\n// - `fls(x)` is equivalent to `sizeof(x) * 8 - clz(x) - 1`\n\n// ╒══════════════ Block size interpretation (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// │ | FL │ SB = SL + AL │ ◄─ usize\n// └───────────────────────────────────────────────┴───────╨───────┘\n// FL: first level, SL: second level, AL: alignment, SB: small block\n\n// @ts-ignore: decorator\n@inline const SL_BITS: u32 = 4;\n// @ts-ignore: decorator\n@inline const SL_SIZE: u32 = 1 << SL_BITS;\n\n// @ts-ignore: decorator\n@inline const SB_BITS: u32 = SL_BITS + AL_BITS;\n// @ts-ignore: decorator\n@inline const SB_SIZE: u32 = 1 << SB_BITS;\n\n// @ts-ignore: decorator\n@inline const FL_BITS: u32 = 31 - SB_BITS;\n\n// [00]: < 256B (SB) [12]: < 1M\n// [01]: < 512B [13]: < 2M\n// [02]: < 1K [14]: < 4M\n// [03]: < 2K [15]: < 8M\n// [04]: < 4K [16]: < 16M\n// [05]: < 8K [17]: < 32M\n// [06]: < 16K [18]: < 64M\n// [07]: < 32K [19]: < 128M\n// [08]: < 64K [20]: < 256M\n// [09]: < 128K [21]: < 512M\n// [10]: < 256K [22]: <= 1G - OVERHEAD\n// [11]: < 512K\n// VMs limit to 2GB total (currently), making one 1G block max (or three 512M etc.) due to block overhead\n\n// Tags stored in otherwise unused alignment bits\n\n// @ts-ignore: decorator\n@inline const FREE: usize = 1 << 0;\n// @ts-ignore: decorator\n@inline const LEFTFREE: usize = 1 << 1;\n// @ts-ignore: decorator\n@inline const TAGS_MASK: usize = FREE | LEFTFREE; // <= AL_MASK\n\n// ╒════════════════════ 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// │ size │L│F│ ◄─┐ info overhead\n// ╞>ptr═══════════════════════════════════════════════════════╧═╧═╡ │ ┘\n// │ if free: ◄ prev │ ◄─┤ usize\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ if free: next ► │ ◄─┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... │ │ >= 0\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ if free: back ▲ │ ◄─┘\n// └───────────────────────────────────────────────────────────────┘ >= MIN SIZE\n// F: FREE, L: LEFTFREE\n@unmanaged export class Block extends BLOCK {\n\n /** Previous free block, if any. Only valid if free, otherwise part of payload. */\n prev: Block | null;\n /** Next free block, if any. Only valid if free, otherwise part of payload. */\n next: Block | null;\n\n // If the block is free, there is a 'back'reference at its end pointing at its start.\n}\n\n// Block constants. A block must have a minimum size of three pointers so it can hold `prev`,\n// `next` and `back` if free.\n\n// @ts-ignore: decorator\n@inline const BLOCK_MINSIZE: usize = ((3 * sizeof<usize>() + BLOCK_OVERHEAD + AL_MASK) & ~AL_MASK) - BLOCK_OVERHEAD; // prev + next + back\n// @ts-ignore: decorator\n// @inline const BLOCK_MAXSIZE: usize = 1 << (FL_BITS + SB_BITS - 1); // exclusive, lives in common.ts\n\n/** Gets the left block of a block. Only valid if the left block is free. */\n// @ts-ignore: decorator\n@inline function GETFREELEFT(block: Block): Block {\n return load<Block>(changetype<usize>(block) - sizeof<usize>());\n}\n\n/** Gets the right block of a block by advancing to the right by its size. */\n// @ts-ignore: decorator\n@inline function GETRIGHT(block: Block): Block {\n return changetype<Block>(changetype<usize>(block) + BLOCK_OVERHEAD + (block.mmInfo & ~TAGS_MASK));\n}\n\n// ╒═════════════════════ Root 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// │ 0 | flMap S│ ◄────┐\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ slMap[0] S │ ◄─┐ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[1] │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ u32 │\n// │ slMap[22] │ ◄─┘ │\n// ╞═══════════════════════════════════════════════════════════════╡ usize\n// │ head[0] │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ head[367] │ ◄────┤\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ tail │ ◄────┘\n// └───────────────────────────────────────────────────────────────┘ SIZE ┘\n// S: Small blocks map\n@unmanaged class Root {\n /** First level bitmap. */\n flMap: usize;\n}\n\n// Root constants. Where stuff is stored inside of the root structure.\n\n// @ts-ignore: decorator\n@inline const SL_START: usize = sizeof<usize>();\n// @ts-ignore: decorator\n@inline const SL_END: usize = SL_START + (FL_BITS << alignof<u32>());\n// @ts-ignore: decorator\n@inline const HL_START: usize = (SL_END + AL_MASK) & ~AL_MASK;\n// @ts-ignore: decorator\n@inline const HL_END: usize = HL_START + FL_BITS * SL_SIZE * sizeof<usize>();\n// @ts-ignore: decorator\n@inline const ROOT_SIZE: usize = HL_END + sizeof<usize>();\n\n// @ts-ignore: decorator\n@lazy export let ROOT: Root = changetype<Root>(0); // unsafe initializion below\n\n/** Gets the second level map of the specified first level. */\n// @ts-ignore: decorator\n@inline function GETSL(root: Root, fl: usize): u32 {\n return load<u32>(\n changetype<usize>(root) + (fl << alignof<u32>()),\n SL_START\n );\n}\n\n/** Sets the second level map of the specified first level. */\n// @ts-ignore: decorator\n@inline function SETSL(root: Root, fl: usize, slMap: u32): void {\n store<u32>(\n changetype<usize>(root) + (fl << alignof<u32>()),\n slMap,\n SL_START\n );\n}\n\n/** Gets the head of the free list for the specified combination of first and second level. */\n// @ts-ignore: decorator\n@inline function GETHEAD(root: Root, fl: usize, sl: u32): Block | null {\n return load<Block>(\n changetype<usize>(root) + (((fl << SL_BITS) + <usize>sl) << alignof<usize>()),\n HL_START\n );\n}\n\n/** Sets the head of the free list for the specified combination of first and second level. */\n// @ts-ignore: decorator\n@inline function SETHEAD(root: Root, fl: usize, sl: u32, head: Block | null): void {\n store<Block | null>(\n changetype<usize>(root) + (((fl << SL_BITS) + <usize>sl) << alignof<usize>()),\n head,\n HL_START\n );\n}\n\n/** Gets the tail block.. */\n// @ts-ignore: decorator\n@inline function GETTAIL(root: Root): Block {\n return load<Block>(\n changetype<usize>(root),\n HL_END\n );\n}\n\n/** Sets the tail block. */\n// @ts-ignore: decorator\n@inline function SETTAIL(root: Root, tail: Block): void {\n store<Block>(\n changetype<usize>(root),\n tail,\n HL_END\n );\n}\n\n/** Inserts a previously used block back into the free list. */\nfunction insertBlock(root: Root, block: Block): void {\n if (DEBUG) assert(block); // cannot be null\n let blockInfo = block.mmInfo;\n if (DEBUG) assert(blockInfo & FREE); // must be free\n\n let right = GETRIGHT(block);\n let rightInfo = right.mmInfo;\n\n // merge with right block if also free\n if (rightInfo & FREE) {\n removeBlock(root, right);\n block.mmInfo = blockInfo = blockInfo + BLOCK_OVERHEAD + (rightInfo & ~TAGS_MASK); // keep block tags\n right = GETRIGHT(block);\n rightInfo = right.mmInfo;\n // 'back' is set below\n }\n\n // merge with left block if also free\n if (blockInfo & LEFTFREE) {\n let left = GETFREELEFT(block);\n let leftInfo = left.mmInfo;\n if (DEBUG) assert(leftInfo & FREE); // must be free according to right tags\n removeBlock(root, left);\n block = left;\n block.mmInfo = blockInfo = leftInfo + BLOCK_OVERHEAD + (blockInfo & ~TAGS_MASK); // keep left tags\n // 'back' is set below\n }\n\n right.mmInfo = rightInfo | LEFTFREE;\n // reference to right is no longer used now, hence rightInfo is not synced\n\n // we now know the size of the block\n let size = blockInfo & ~TAGS_MASK;\n if (DEBUG) assert(size >= BLOCK_MINSIZE); // must be a valid size\n if (DEBUG) assert(changetype<usize>(block) + BLOCK_OVERHEAD + size == changetype<usize>(right)); // must match\n\n // set 'back' to itself at the end of block\n store<Block>(changetype<usize>(right) - sizeof<usize>(), block);\n\n // mapping_insert\n let fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = <u32>(size >> AL_BITS);\n } else {\n const inv: usize = sizeof<usize>() * 8 - 1;\n let boundedSize = min(size, BLOCK_MAXSIZE);\n fl = inv - clz<usize>(boundedSize);\n sl = <u32>((boundedSize >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n if (DEBUG) assert(fl < FL_BITS && sl < SL_SIZE); // fl/sl out of range\n\n // perform insertion\n let head = GETHEAD(root, fl, sl);\n block.prev = null;\n block.next = head;\n if (head) head.prev = block;\n SETHEAD(root, fl, sl, block);\n\n // update first and second level maps\n root.flMap |= (1 << fl);\n SETSL(root, fl, GETSL(root, fl) | (1 << sl));\n}\n\n/** Removes a free block from internal lists. */\nfunction removeBlock(root: Root, block: Block): void {\n let blockInfo = block.mmInfo;\n if (DEBUG) assert(blockInfo & FREE); // must be free\n let size = blockInfo & ~TAGS_MASK;\n if (DEBUG) assert(size >= BLOCK_MINSIZE); // must be valid\n\n // mapping_insert\n let fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = <u32>(size >> AL_BITS);\n } else {\n const inv: usize = sizeof<usize>() * 8 - 1;\n let boundedSize = min(size, BLOCK_MAXSIZE);\n fl = inv - clz<usize>(boundedSize);\n sl = <u32>((boundedSize >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n if (DEBUG) assert(fl < FL_BITS && sl < SL_SIZE); // fl/sl out of range\n\n // link previous and next free block\n let prev = block.prev;\n let next = block.next;\n if (prev) prev.next = next;\n if (next) next.prev = prev;\n\n // update head if we are removing it\n if (block == GETHEAD(root, fl, sl)) {\n SETHEAD(root, fl, sl, next);\n\n // clear second level map if head is empty now\n if (!next) {\n let slMap = GETSL(root, fl);\n SETSL(root, fl, slMap &= ~(1 << sl));\n\n // clear first level map if second level is empty now\n if (!slMap) root.flMap &= ~(1 << fl);\n }\n }\n // note: does not alter left/back because it is likely that splitting\n // is performed afterwards, invalidating those changes. so, the caller\n // must perform those updates.\n}\n\nfunction roundSize(size: usize): usize {\n const halfMaxSize = BLOCK_MAXSIZE >> 1; // don't round last fl\n const inv: usize = sizeof<usize>() * 8 - 1;\n const invRound = inv - SL_BITS;\n return size < halfMaxSize\n ? size + (1 << (invRound - clz<usize>(size))) - 1\n : size;\n}\n\n/** Searches for a free block of at least the specified size. */\nfunction searchBlock(root: Root, size: usize): Block | null {\n // size was already asserted by caller\n\n // mapping_search\n let fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = <u32>(size >> AL_BITS);\n } else {\n const requestSize = roundSize(size);\n fl = sizeof<usize>() * 8 - 1 - clz<usize>(requestSize);\n sl = <u32>((requestSize >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n if (DEBUG) assert(fl < FL_BITS && sl < SL_SIZE); // fl/sl out of range\n\n // search second level\n let slMap = GETSL(root, fl) & (~0 << sl);\n let head: Block | null = null;\n if (!slMap) {\n // search next larger first level\n let flMap = root.flMap & (~0 << (fl + 1));\n if (!flMap) {\n head = null;\n } else {\n fl = ctz<usize>(flMap);\n slMap = GETSL(root, fl);\n if (DEBUG) assert(slMap); // can't be zero if fl points here\n head = GETHEAD(root, fl, ctz<u32>(slMap));\n }\n } else {\n head = GETHEAD(root, fl, ctz<u32>(slMap));\n }\n return head;\n}\n\n/** Prepares the specified block before (re-)use, possibly splitting it. */\nfunction prepareBlock(root: Root, block: Block, size: usize): void {\n // size was already asserted by caller\n\n let blockInfo = block.mmInfo;\n if (DEBUG) assert(!((size + BLOCK_OVERHEAD) & AL_MASK)); // size must be aligned so the new block is\n\n // split if the block can hold another MINSIZE block incl. overhead\n let remaining = (blockInfo & ~TAGS_MASK) - size;\n if (remaining >= BLOCK_OVERHEAD + BLOCK_MINSIZE) {\n block.mmInfo = size | (blockInfo & LEFTFREE); // also discards FREE\n\n let spare = changetype<Block>(changetype<usize>(block) + BLOCK_OVERHEAD + size);\n spare.mmInfo = (remaining - BLOCK_OVERHEAD) | FREE; // not LEFTFREE\n insertBlock(root, spare); // also sets 'back'\n\n // otherwise tag block as no longer FREE and right as no longer LEFTFREE\n } else {\n block.mmInfo = blockInfo & ~FREE;\n GETRIGHT(block).mmInfo &= ~LEFTFREE;\n }\n}\n\n/** Adds more memory to the pool. */\nfunction addMemory(root: Root, start: usize, endU64: u64): bool {\n let end = <usize>endU64;\n if (DEBUG) assert(<u64>start <= endU64); // must be valid\n start = ((start + BLOCK_OVERHEAD + AL_MASK) & ~AL_MASK) - BLOCK_OVERHEAD;\n end &= ~AL_MASK;\n\n let tail = GETTAIL(root);\n let tailInfo: usize = 0;\n if (tail) { // more memory\n if (DEBUG) assert(start >= changetype<usize>(tail) + BLOCK_OVERHEAD);\n\n // merge with current tail if adjacent\n const offsetToTail = AL_SIZE;\n if (start - offsetToTail == changetype<usize>(tail)) {\n start -= offsetToTail;\n tailInfo = tail.mmInfo;\n } else {\n // We don't do this, but a user might `memory.grow` manually\n // leading to non-adjacent pages managed by TLSF.\n }\n\n } else if (DEBUG) { // first memory\n assert(start >= changetype<usize>(root) + ROOT_SIZE); // starts after root\n }\n\n // check if size is large enough for a free block and the tail block\n let size = end - start;\n if (size < BLOCK_OVERHEAD + BLOCK_MINSIZE + BLOCK_OVERHEAD) {\n return false;\n }\n\n // left size is total minus its own and the zero-length tail's header\n let leftSize = size - 2 * BLOCK_OVERHEAD;\n let left = changetype<Block>(start);\n left.mmInfo = leftSize | FREE | (tailInfo & LEFTFREE);\n left.prev = null;\n left.next = null;\n\n // tail is a zero-length used block\n tail = changetype<Block>(start + BLOCK_OVERHEAD + leftSize);\n tail.mmInfo = 0 | LEFTFREE;\n SETTAIL(root, tail);\n\n insertBlock(root, left); // also merges with free left before tail / sets 'back'\n\n return true;\n}\n\n/** Grows memory to fit at least another block of the specified size. */\nfunction growMemory(root: Root, size: usize): void {\n if (ASC_LOW_MEMORY_LIMIT) {\n unreachable();\n return;\n }\n // Here, both rounding performed in searchBlock ...\n if (size >= SB_SIZE) {\n size = roundSize(size);\n }\n // and additional BLOCK_OVERHEAD must be taken into account. If we are going\n // to merge with the tail block, that's one time, otherwise it's two times.\n let pagesBefore = memory.size();\n size += BLOCK_OVERHEAD << usize((<usize>pagesBefore << 16) - BLOCK_OVERHEAD != changetype<usize>(GETTAIL(root)));\n let pagesNeeded = <i32>(((size + 0xffff) & ~0xffff) >>> 16);\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) unreachable();\n }\n let pagesAfter = memory.size();\n addMemory(root, <usize>pagesBefore << 16, <u64>pagesAfter << 16);\n}\n\n/** Computes the size (excl. header) of a block. */\nfunction computeSize(size: usize): usize {\n // Size must be large enough and aligned minus preceeding overhead\n return size <= BLOCK_MINSIZE\n ? BLOCK_MINSIZE\n : ((size + BLOCK_OVERHEAD + AL_MASK) & ~AL_MASK) - BLOCK_OVERHEAD;\n}\n\n/** Prepares and checks an allocation size. */\nfunction prepareSize(size: usize): usize {\n if (size > BLOCK_MAXSIZE) throw new Error(E_ALLOCATION_TOO_LARGE);\n return computeSize(size);\n}\n\n/** Initializes the root structure. */\nfunction initialize(): void {\n if (isDefined(ASC_RTRACE)) oninit(__heap_base);\n let rootOffset = (__heap_base + AL_MASK) & ~AL_MASK;\n let pagesBefore = memory.size();\n let pagesNeeded = <i32>((((rootOffset + ROOT_SIZE) + 0xffff) & ~0xffff) >>> 16);\n if (pagesNeeded > pagesBefore && memory.grow(pagesNeeded - pagesBefore) < 0) unreachable();\n let root = changetype<Root>(rootOffset);\n root.flMap = 0;\n SETTAIL(root, changetype<Block>(0));\n for (let fl: usize = 0; fl < FL_BITS; ++fl) {\n SETSL(root, fl, 0);\n for (let sl: u32 = 0; sl < SL_SIZE; ++sl) {\n SETHEAD(root, fl, sl, null);\n }\n }\n let memStart = rootOffset + ROOT_SIZE;\n if (ASC_LOW_MEMORY_LIMIT) {\n const memEnd = <u64>ASC_LOW_MEMORY_LIMIT & ~AL_MASK;\n if (memStart <= memEnd) addMemory(root, memStart, memEnd);\n else unreachable(); // low memory limit already exceeded\n } else {\n addMemory(root, memStart, <u64>memory.size() << 16);\n }\n ROOT = root;\n}\n\n/** Allocates a block of the specified size. */\nexport function allocateBlock(root: Root, size: usize): Block {\n let payloadSize = prepareSize(size);\n let block = searchBlock(root, payloadSize);\n if (!block) {\n growMemory(root, payloadSize);\n block = changetype<Block>(searchBlock(root, payloadSize));\n if (DEBUG) assert(block); // must be found now\n }\n if (DEBUG) assert((block.mmInfo & ~TAGS_MASK) >= payloadSize); // must fit\n removeBlock(root, block);\n prepareBlock(root, block, payloadSize);\n if (isDefined(ASC_RTRACE)) onalloc(block);\n return block;\n}\n\n/** Reallocates a block to the specified size. */\nexport function reallocateBlock(root: Root, block: Block, size: usize): Block {\n let payloadSize = prepareSize(size);\n let blockInfo = block.mmInfo;\n let blockSize = blockInfo & ~TAGS_MASK;\n\n // possibly split and update runtime size if it still fits\n if (payloadSize <= blockSize) {\n prepareBlock(root, block, payloadSize);\n if (isDefined(ASC_RTRACE)) {\n if (payloadSize != blockSize) onresize(block, BLOCK_OVERHEAD + blockSize);\n }\n return block;\n }\n\n // merge with right free block if merger is large enough\n let right = GETRIGHT(block);\n let rightInfo = right.mmInfo;\n if (rightInfo & FREE) {\n let mergeSize = blockSize + BLOCK_OVERHEAD + (rightInfo & ~TAGS_MASK);\n if (mergeSize >= payloadSize) {\n removeBlock(root, right);\n block.mmInfo = (blockInfo & TAGS_MASK) | mergeSize;\n prepareBlock(root, block, payloadSize);\n if (isDefined(ASC_RTRACE)) onresize(block, BLOCK_OVERHEAD + blockSize);\n return block;\n }\n }\n\n // otherwise move the block\n return moveBlock(root, block, size);\n}\n\n/** Moves a block to a new one of the specified size. */\nfunction moveBlock(root: Root, block: Block, newSize: usize): Block {\n let newBlock = allocateBlock(root, newSize);\n memory.copy(changetype<usize>(newBlock) + BLOCK_OVERHEAD, changetype<usize>(block) + BLOCK_OVERHEAD, block.mmInfo & ~TAGS_MASK);\n if (changetype<usize>(block) >= __heap_base) {\n if (isDefined(ASC_RTRACE)) onmove(block, newBlock);\n freeBlock(root, block);\n }\n return newBlock;\n}\n\n/** Frees a block. */\nexport function freeBlock(root: Root, block: Block): void {\n if (isDefined(ASC_RTRACE)) onfree(block);\n block.mmInfo = block.mmInfo | FREE;\n insertBlock(root, block);\n}\n\n/** Checks that a used block is valid to be freed or reallocated. */\nfunction checkUsedBlock(ptr: usize): Block {\n let block = changetype<Block>(ptr - BLOCK_OVERHEAD);\n assert(\n ptr != 0 && !(ptr & AL_MASK) && // must exist and be aligned\n !(block.mmInfo & FREE) // must be used\n );\n return block;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __alloc(size: usize): usize {\n if (!ROOT) initialize();\n return changetype<usize>(allocateBlock(ROOT, size)) + BLOCK_OVERHEAD;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __realloc(ptr: usize, size: usize): usize {\n if (!ROOT) initialize();\n return (ptr < __heap_base\n ? changetype<usize>(moveBlock(ROOT, checkUsedBlock(ptr), size))\n : changetype<usize>(reallocateBlock(ROOT, checkUsedBlock(ptr), size))\n ) + BLOCK_OVERHEAD;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __free(ptr: usize): void {\n if (ptr < __heap_base) return;\n if (!ROOT) initialize();\n freeBlock(ROOT, checkUsedBlock(ptr));\n}\n","// This file is shared with the compiler and must remain portable\n\n// ╒═══════════════════ Typeinfo interpretation ═══════════════════╕\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// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤ ◄─ __rtti_base\n// │ count │\n// ╞═══════════════════════════════════════════════════════════════╡ ┐\n// │ Typeinfo#flags [id=0] │ id < count\n// ├───────────────────────────────────────────────────────────────┤\n// │ ... │\n\n/** Runtime type information data structure. */\n@unmanaged\nexport class Typeinfo {\n /** Flags describing the shape of this class type. */\n flags: TypeinfoFlags = TypeinfoFlags.NONE;\n}\n\n/** Runtime type information flags. */\nexport const enum TypeinfoFlags {\n /** No specific flags. */\n NONE = 0,\n /** Type is an `ArrayBufferView`. */\n ARRAYBUFFERVIEW = 1 << 0,\n /** Type is an `Array`. */\n ARRAY = 1 << 1,\n /** Type is a `StaticArray`. */\n STATICARRAY = 1 << 2,\n /** Type is a `Set`. */\n SET = 1 << 3,\n /** Type is a `Map`. */\n MAP = 1 << 4,\n /** Type has no outgoing pointers. */\n POINTERFREE = 1 << 5,\n /** Value alignment of 1 byte. */\n VALUE_ALIGN_0 = 1 << 6,\n /** Value alignment of 2 bytes. */\n VALUE_ALIGN_1 = 1 << 7,\n /** Value alignment of 4 bytes. */\n VALUE_ALIGN_2 = 1 << 8,\n /** Value alignment of 8 bytes. */\n VALUE_ALIGN_3 = 1 << 9,\n /** Value alignment of 16 bytes. */\n VALUE_ALIGN_4 = 1 << 10,\n /** Value is a signed type. */\n VALUE_SIGNED = 1 << 11,\n /** Value is a float type. */\n VALUE_FLOAT = 1 << 12,\n /** Value type is nullable. */\n VALUE_NULLABLE = 1 << 13,\n /** Value type is managed. */\n VALUE_MANAGED = 1 << 14,\n /** Key alignment of 1 byte. */\n KEY_ALIGN_0 = 1 << 15,\n /** Key alignment of 2 bytes. */\n KEY_ALIGN_1 = 1 << 16,\n /** Key alignment of 4 bytes. */\n KEY_ALIGN_2 = 1 << 17,\n /** Key alignment of 8 bytes. */\n KEY_ALIGN_3 = 1 << 18,\n /** Key alignment of 16 bytes. */\n KEY_ALIGN_4 = 1 << 19,\n /** Key is a signed type. */\n KEY_SIGNED = 1 << 20,\n /** Key is a float type. */\n KEY_FLOAT = 1 << 21,\n /** Key type is nullable. */\n KEY_NULLABLE = 1 << 22,\n /** Key type is managed. */\n KEY_MANAGED = 1 << 23\n}\n","import { BLOCK, BLOCK_OVERHEAD, OBJECT_OVERHEAD, OBJECT_MAXSIZE, TOTAL_OVERHEAD, DEBUG, TRACE, RTRACE, PROFILE } from \"./common\";\nimport { onvisit, oncollect, oninterrupt, onyield } from \"./rtrace\";\nimport { TypeinfoFlags } from \"../shared/typeinfo\";\nimport { E_ALLOCATION_TOO_LARGE, E_ALREADY_PINNED, E_NOT_PINNED } from \"../util/error\";\n\n// === ITCMS: An incremental Tri-Color Mark & Sweep garbage collector ===\n// Adapted from Bach Le's μgc, see: https://github.com/bullno1/ugc\n\n// ╒═════════════╤══════════════ Colors ═══════════════════════════╕\n// │ Color │ Meaning │\n// ├─────────────┼─────────────────────────────────────────────────┤\n// │ WHITE* │ Unprocessed │\n// │ BLACK* │ Processed │\n// │ GRAY │ Processed with unprocessed children │\n// │ TRANSPARENT │ Manually pinned (always reachable) │\n// └─────────────┴─────────────────────────────────────────────────┘\n// * flipped between cycles\n\n// @ts-ignore: decorator\n@lazy let white = 0;\n// @ts-ignore: decorator\n@inline const gray = 2;\n// @ts-ignore: decorator\n@inline const transparent = 3;\n// @ts-ignore: decorator\n@inline const COLOR_MASK = 3;\n\n/** Size in memory of all objects currently managed by the GC. */\n// @ts-ignore: decorator\n@lazy let total: usize = 0;\n\n/** Currently transitioning from SWEEP to MARK state. */\n// @ts-ignore: decorator\n@inline const STATE_IDLE = 0;\n/** Currently marking reachable objects. */\n// @ts-ignore: decorator\n@inline const STATE_MARK = 1;\n/** Currently sweeping unreachable objects. */\n// @ts-ignore: decorator\n@inline const STATE_SWEEP = 2;\n/** Current collector state. */\n// @ts-ignore: decorator\n@lazy let state = STATE_IDLE;\n\n// @ts-ignore: decorator\n@lazy let fromSpace = initLazy(changetype<Object>(memory.data(offsetof<Object>())));\n// @ts-ignore: decorator\n@lazy let toSpace = initLazy(changetype<Object>(memory.data(offsetof<Object>())));\n// @ts-ignore: decorator\n@lazy let pinSpace = initLazy(changetype<Object>(memory.data(offsetof<Object>())));\n// @ts-ignore: decorator\n@lazy let iter: Object = changetype<Object>(0); // unsafe initializion below\n\nfunction initLazy(space: Object): Object {\n space.nextWithColor = changetype<usize>(space);\n space.prev = space;\n return space;\n}\n\n/** Visit cookie indicating scanning of an object. */\n// @ts-ignore: decorator\n@inline const VISIT_SCAN = 0;\n\n// ╒═══════════════ Managed 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 │\n// ╞═══════════════════════════════════════════════════════════╤═══╡\n// │ next │ C │ = nextWithColor\n// ├───────────────────────────────────────────────────────────┴───┤\n// │ prev │\n// ├───────────────────────────────────────────────────────────────┤\n// │ rtId │\n// ├───────────────────────────────────────────────────────────────┤\n// │ rtSize │\n// ╞>ptr═══════════════════════════════════════════════════════════╡\n// │ ... │\n// C: color\n\n/** Represents a managed object in memory, consisting of a header followed by the object's data. */\n@unmanaged class Object extends BLOCK {\n /** Pointer to the next object with color flags stored in the alignment bits. */\n nextWithColor: usize; // *u32\n /** Pointer to the previous object. */\n prev: Object; // *u32\n /** Runtime id. */\n rtId: u32;\n /** Runtime size. */\n rtSize: u32;\n\n /** Gets the pointer to the next object. */\n get next(): Object {\n return changetype<Object>(this.nextWithColor & ~COLOR_MASK);\n }\n\n /** Sets the pointer to the next object. */\n set next(obj: Object) {\n this.nextWithColor = changetype<usize>(obj) | (this.nextWithColor & COLOR_MASK);\n }\n\n /** Gets this object's color. */\n get color(): i32 {\n return i32(this.nextWithColor & COLOR_MASK);\n }\n\n /** Sets this object's color. */\n set color(color: i32) {\n this.nextWithColor = (this.nextWithColor & ~COLOR_MASK) | color;\n }\n\n /** Gets the size of this object in memory. */\n get size(): usize {\n return BLOCK_OVERHEAD + (this.mmInfo & ~3);\n }\n\n /** Tests if this object is pointerfree. */\n get isPointerfree(): bool {\n let rtId = this.rtId;\n // 0: Object, 1: ArrayBuffer, 2: String\n return rtId <= idof<string>() || (__typeinfo(rtId) & TypeinfoFlags.POINTERFREE) != 0;\n }\n\n /** Unlinks this object from its list. */\n unlink(): void {\n let next = this.next;\n if (next == null) {\n if (DEBUG) assert(this.prev == null && changetype<usize>(this) < __heap_base);\n return; // static data not yet linked\n }\n let prev = this.prev;\n if (DEBUG) assert(prev);\n next.prev = prev;\n prev.next = next;\n }\n\n /** Links this object to the specified list, with the given color. */\n linkTo(list: Object, withColor: i32): void {\n let prev = list.prev;\n this.nextWithColor = changetype<usize>(list) | withColor;\n this.prev = prev;\n prev.next = this;\n list.prev = this;\n }\n\n /** Marks this object as gray, that is reachable with unscanned children. */\n makeGray(): void {\n if (this == iter) iter = assert(this.prev);\n this.unlink();\n this.linkTo(toSpace, this.isPointerfree ? i32(!white) : gray);\n }\n}\n\n/** Visits all objects considered to be program roots. */\nfunction visitRoots(cookie: u32): void {\n __visit_globals(cookie);\n let pn = pinSpace;\n let iter = pn.next;\n while (iter != pn) {\n if (DEBUG) assert(iter.color == transparent);\n __visit_members(changetype<usize>(iter) + TOTAL_OVERHEAD, cookie);\n iter = iter.next;\n }\n}\n\n/** Visits all objects on the stack. */\nfunction visitStack(cookie: u32): void {\n let ptr = __stack_pointer;\n while (ptr < __heap_base) {\n __visit(load<usize>(ptr), cookie);\n ptr += sizeof<usize>();\n }\n}\n\n/** Performs a single step according to the current state. */\nfunction step(): usize {\n // Magic constants responsible for pause times. Obtained experimentally\n // using the compiler compiling itself. 2048 budget pro run by default.\n const MARKCOST = isDefined(ASC_GC_MARKCOST) ? ASC_GC_MARKCOST : 1;\n const SWEEPCOST = isDefined(ASC_GC_SWEEPCOST) ? ASC_GC_SWEEPCOST : 10;\n let obj: Object;\n switch (state) {\n case STATE_IDLE: {\n state = STATE_MARK;\n visitCount = 0;\n visitRoots(VISIT_SCAN);\n iter = toSpace;\n return visitCount * MARKCOST;\n }\n case STATE_MARK: {\n let black = i32(!white);\n obj = iter.next;\n while (obj != toSpace) {\n iter = obj;\n if (obj.color != black) { // skip already-blacks (pointerfree)\n obj.color = black;\n visitCount = 0;\n __visit_members(changetype<usize>(obj) + TOTAL_OVERHEAD, VISIT_SCAN);\n return visitCount * MARKCOST;\n }\n obj = obj.next;\n }\n visitCount = 0;\n visitRoots(VISIT_SCAN);\n obj = iter.next;\n if (obj == toSpace) {\n visitStack(VISIT_SCAN);\n obj = iter.next;\n while (obj != toSpace) {\n if (obj.color != black) {\n obj.color = black;\n __visit_members(changetype<usize>(obj) + TOTAL_OVERHEAD, VISIT_SCAN);\n }\n obj = obj.next;\n }\n let from = fromSpace;\n fromSpace = toSpace;\n toSpace = from;\n white = black;\n iter = from.next;\n state = STATE_SWEEP;\n }\n return visitCount * MARKCOST;\n }\n case STATE_SWEEP: {\n obj = iter;\n if (obj != toSpace) {\n iter = obj.next;\n if (DEBUG) assert(obj.color == i32(!white)); // old white\n free(obj);\n return SWEEPCOST;\n }\n toSpace.nextWithColor = changetype<usize>(toSpace);\n toSpace.prev = toSpace;\n state = STATE_IDLE;\n break;\n }\n }\n return 0;\n}\n\n/** Frees an object. */\nfunction free(obj: Object): void {\n if (changetype<usize>(obj) < __heap_base) {\n obj.nextWithColor = 0; // may become linked again\n obj.prev = changetype<Object>(0);\n } else {\n total -= obj.size;\n if (isDefined(__finalize)) {\n __finalize(changetype<usize>(obj) + TOTAL_OVERHEAD);\n }\n __free(changetype<usize>(obj) + BLOCK_OVERHEAD);\n }\n}\n\n// Garbage collector interface\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __new(size: usize, id: i32): usize {\n if (size >= OBJECT_MAXSIZE) throw new Error(E_ALLOCATION_TOO_LARGE);\n if (total >= threshold) interrupt();\n let obj = changetype<Object>(__alloc(OBJECT_OVERHEAD + size) - BLOCK_OVERHEAD);\n obj.rtId = id;\n obj.rtSize = <u32>size;\n obj.linkTo(fromSpace, white); // inits next/prev\n total += obj.size;\n let ptr = changetype<usize>(obj) + TOTAL_OVERHEAD;\n // may be visited before being fully initialized, so must fill\n memory.fill(ptr, 0, size);\n return ptr;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __renew(oldPtr: usize, size: usize): usize {\n let oldObj = changetype<Object>(oldPtr - TOTAL_OVERHEAD);\n // Update object size if its block is large enough\n if (size <= (oldObj.mmInfo & ~3) - OBJECT_OVERHEAD) {\n oldObj.rtSize = <u32>size;\n return oldPtr;\n }\n // If not the same object anymore, we have to move it move it due to the\n // shadow stack potentially still referencing the old object\n let newPtr = __new(size, oldObj.rtId);\n memory.copy(newPtr, oldPtr, min(size, oldObj.rtSize));\n return newPtr;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __link(parentPtr: usize, childPtr: usize, expectMultiple: bool): void {\n // Write barrier is unnecessary if non-incremental\n if (!childPtr) return;\n if (DEBUG) assert(parentPtr);\n let child = changetype<Object>(childPtr - TOTAL_OVERHEAD);\n if (child.color == white) {\n let parent = changetype<Object>(parentPtr - TOTAL_OVERHEAD);\n let parentColor = parent.color;\n if (parentColor == i32(!white)) {\n // Maintain the invariant that no black object may point to a white object.\n if (expectMultiple) {\n // Move the barrier \"backward\". Suitable for containers receiving multiple stores.\n // Avoids a barrier for subsequent objects stored into the same container.\n parent.makeGray();\n } else {\n // Move the barrier \"forward\". Suitable for objects receiving isolated stores.\n child.makeGray();\n }\n } else if (parentColor == transparent && state == STATE_MARK) {\n // Pinned objects are considered 'black' during the mark phase.\n child.makeGray();\n }\n }\n}\n\n// @ts-ignore: decorator\n@lazy let visitCount = 0;\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __visit(ptr: usize, cookie: i32): void {\n if (!ptr) return;\n let obj = changetype<Object>(ptr - TOTAL_OVERHEAD);\n if (RTRACE) if (!onvisit(obj)) return;\n if (obj.color == white) {\n obj.makeGray();\n ++visitCount;\n }\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __pin(ptr: usize): usize {\n if (ptr) {\n let obj = changetype<Object>(ptr - TOTAL_OVERHEAD);\n if (obj.color == transparent) {\n throw new Error(E_ALREADY_PINNED);\n }\n obj.unlink(); // from fromSpace\n obj.linkTo(pinSpace, transparent);\n }\n return ptr;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __unpin(ptr: usize): void {\n if (!ptr) return;\n let obj = changetype<Object>(ptr - TOTAL_OVERHEAD);\n if (obj.color != transparent) {\n throw new Error(E_NOT_PINNED);\n }\n if (state == STATE_MARK) {\n // We may be right at the point after marking roots for the second time and\n // entering the sweep phase, in which case the object would be missed if it\n // is not only pinned but also a root. Make sure it isn't missed.\n obj.makeGray();\n } else {\n obj.unlink();\n obj.linkTo(fromSpace, white);\n }\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nexport function __collect(): void {\n if (TRACE) trace(\"GC (full) at\", 1, total);\n if (state > STATE_IDLE) {\n // finish current cycle\n while (state != STATE_IDLE) step();\n }\n // perform a full cycle\n step();\n while (state != STATE_IDLE) step();\n threshold = <usize>(<u64>total * IDLEFACTOR / 100) + GRANULARITY;\n if (TRACE) trace(\"GC (full) done at cur/max\", 2, total, memory.size() << 16);\n if (RTRACE || PROFILE) oncollect(total);\n}\n\n// Garbage collector automation\n\n/** How often to interrupt. The default of 1024 means \"interrupt each 1024 bytes allocated\". */\n// @ts-ignore: decorator\n@inline const GRANULARITY: usize = isDefined(ASC_GC_GRANULARITY) ? ASC_GC_GRANULARITY : 1024;\n/** How long to interrupt. The default of 200% means \"run at double the speed of allocations\". */\n// @ts-ignore: decorator\n@inline const STEPFACTOR: usize = isDefined(ASC_GC_SWEEPFACTOR) ? ASC_GC_SWEEPFACTOR : 200;\n/** How long to idle. The default of 200% means \"wait for memory to double before kicking in again\". */\n// @ts-ignore: decorator\n@inline const IDLEFACTOR: usize = isDefined(ASC_GC_IDLEFACTOR) ? ASC_GC_IDLEFACTOR : 200;\n\n/** Threshold of memory used by objects to exceed before interrupting again. */\n// @ts-ignore: decorator\n@lazy let threshold: usize = ((<usize>memory.size() << 16) - __heap_base) >> 1;\n\n/** Performs a reasonable amount of incremental GC steps. */\nfunction interrupt(): void {\n if (PROFILE) oninterrupt(total);\n if (TRACE) trace(\"GC (auto) at\", 1, total);\n let budget: isize = GRANULARITY * STEPFACTOR / 100;\n do {\n budget -= step();\n if (state == STATE_IDLE) {\n if (TRACE) trace(\"└ GC (auto) done at cur/max\", 2, total, memory.size() << 16);\n threshold = <usize>(<u64>total * IDLEFACTOR / 100) + GRANULARITY;\n if (PROFILE) onyield(total);\n return;\n }\n } while (budget > 0);\n if (TRACE) trace(\"└ GC (auto) ongoing at\", 1, total);\n threshold = total + GRANULARITY * usize(total - threshold < GRANULARITY);\n if (PROFILE) onyield(total);\n}\n","/**\n * ValidityBitmap - Bit-packed null tracking for columnar data\n * Uses 1 bit per value, 64-byte aligned for SIMD operations\n */\n\n// 64-byte alignment for SIMD\nconst ALIGNMENT: i32 = 64;\n\n@final\nexport class ValidityBitmap {\n /** Pointer to bit-packed validity data */\n private data: usize;\n /** Number of values tracked */\n private _length: i32;\n /** Size of the buffer in bytes */\n private _byteLength: i32;\n\n constructor(length: i32) {\n this._length = length;\n // Calculate bytes needed (8 values per byte, rounded up)\n const bytesNeeded = (length + 7) >> 3;\n // Align to 64 bytes\n this._byteLength = ((bytesNeeded + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;\n // Allocate aligned memory\n this.data = heap.alloc(this._byteLength);\n // Initialize all bits to 1 (all valid)\n memory.fill(this.data, 0xFF, this._byteLength);\n }\n\n /** Get the number of values tracked */\n get length(): i32 {\n return this._length;\n }\n\n /** Get the pointer to the underlying data for zero-copy access */\n get dataPtr(): usize {\n return this.data;\n }\n\n /** Get the byte length of the buffer */\n get byteLength(): i32 {\n return this._byteLength;\n }\n\n /** Check if value at index is valid (not null) */\n @inline\n isValid(index: i32): bool {\n if (index < 0 || index >= this._length) return false;\n const byteIndex = index >> 3;\n const bitIndex = index & 7;\n return (load<u8>(this.data + byteIndex) & (1 << bitIndex)) !== 0;\n }\n\n /** Mark value at index as null */\n @inline\n setNull(index: i32): void {\n if (index < 0 || index >= this._length) return;\n const byteIndex = index >> 3;\n const bitIndex: u8 = <u8>(index & 7);\n const currentByte = load<u8>(this.data + byteIndex);\n const mask: u8 = <u8>(1 << bitIndex);\n store<u8>(this.data + byteIndex, currentByte & ~mask);\n }\n\n /** Mark value at index as valid (not null) */\n @inline\n setValid(index: i32): void {\n if (index < 0 || index >= this._length) return;\n const byteIndex = index >> 3;\n const bitIndex: u8 = <u8>(index & 7);\n const currentByte = load<u8>(this.data + byteIndex);\n const mask: u8 = <u8>(1 << bitIndex);\n store<u8>(this.data + byteIndex, currentByte | mask);\n }\n\n /** Count the number of valid (non-null) values using popcount */\n countValid(): i32 {\n let count: i32 = 0;\n const fullBytes = this._length >> 3;\n const remainingBits = this._length & 7;\n\n // Process full bytes using 64-bit popcount for efficiency\n const fullU64s = fullBytes >> 3;\n let ptr = this.data;\n\n for (let i: i32 = 0; i < fullU64s; i++) {\n count += <i32>popcnt(load<u64>(ptr));\n ptr += 8;\n }\n\n // Process remaining full bytes\n const remainingBytes = fullBytes & 7;\n for (let i: i32 = 0; i < remainingBytes; i++) {\n count += <i32>popcnt(load<u8>(ptr));\n ptr += 1;\n }\n\n // Process remaining bits in the last partial byte\n if (remainingBits > 0) {\n const lastByte = load<u8>(this.data + fullBytes);\n const mask = (1 << remainingBits) - 1;\n count += <i32>popcnt(<u32>(lastByte & mask));\n }\n\n return count;\n }\n\n /** Count the number of null values */\n countNull(): i32 {\n return this._length - this.countValid();\n }\n\n /** Set all values as valid */\n setAllValid(): void {\n memory.fill(this.data, 0xFF, this._byteLength);\n }\n\n /** Set all values as null */\n setAllNull(): void {\n memory.fill(this.data, 0x00, this._byteLength);\n }\n\n /** Copy validity from another bitmap */\n copyFrom(other: ValidityBitmap): void {\n const copyBytes = min(this._byteLength, other._byteLength);\n memory.copy(this.data, other.data, copyBytes);\n }\n\n /** Clone this bitmap */\n clone(): ValidityBitmap {\n const newBitmap = new ValidityBitmap(this._length);\n memory.copy(newBitmap.data, this.data, this._byteLength);\n return newBitmap;\n }\n\n /** Free the underlying memory */\n free(): void {\n if (this.data !== 0) {\n heap.free(this.data);\n this.data = 0;\n }\n }\n}\n","/**\n * NumericColumn - Columnar storage for numeric types (i32, i64, f32, f64)\n * 64-byte aligned for SIMD operations\n */\n\nimport { ValidityBitmap } from './validity-bitmap';\n\n// 64-byte alignment for SIMD\nconst ALIGNMENT: i32 = 64;\n\n/** Column data types */\nexport const enum DataType {\n Int32 = 0,\n Int64 = 1,\n Float32 = 2,\n Float64 = 3,\n}\n\n/** Get byte size for data type */\n@inline\nfunction getTypeSize(dtype: DataType): i32 {\n switch (dtype) {\n case DataType.Int32:\n case DataType.Float32:\n return 4;\n case DataType.Int64:\n case DataType.Float64:\n return 8;\n default:\n return 4;\n }\n}\n\n@final\nexport class NumericColumn {\n /** Pointer to the data buffer */\n private data: usize = 0;\n /** Number of elements */\n private _length: i32 = 0;\n /** Byte size of the buffer */\n private _byteLength: i32 = 0;\n /** Data type */\n private _dtype: DataType = DataType.Float32;\n /** Validity bitmap for null handling */\n private _validity: ValidityBitmap = new ValidityBitmap(0);\n /** Whether this column owns its memory */\n private _ownsMemory: bool = true;\n\n constructor(length: i32, dtype: DataType) {\n this._length = length;\n this._dtype = dtype;\n this._ownsMemory = true;\n\n const elementSize = getTypeSize(dtype);\n const bytesNeeded = length * elementSize;\n // Align to 64 bytes\n this._byteLength = ((bytesNeeded + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;\n\n // Allocate aligned memory\n this.data = heap.alloc(this._byteLength);\n // Initialize to zero\n memory.fill(this.data, 0, this._byteLength);\n\n // Create validity bitmap (all valid by default)\n // Free the initial empty one and create proper one\n this._validity.free();\n this._validity = new ValidityBitmap(length);\n }\n\n /** Create a column from an existing pointer (for zero-copy) */\n static fromPointer(ptr: usize, length: i32, dtype: DataType): NumericColumn {\n const col = new NumericColumn(0, dtype);\n // Free the auto-allocated memory\n heap.free(col.data);\n\n col.data = ptr;\n col._length = length;\n col._byteLength = length * getTypeSize(dtype);\n col._ownsMemory = false;\n col._validity = new ValidityBitmap(length);\n return col;\n }\n\n /** Get the number of elements */\n get length(): i32 {\n return this._length;\n }\n\n /** Get the data type */\n get dtype(): DataType {\n return this._dtype;\n }\n\n /** Get the pointer to the underlying data for zero-copy access */\n get dataPtr(): usize {\n return this.data;\n }\n\n /** Get the byte length of the buffer */\n get byteLength(): i32 {\n return this._byteLength;\n }\n\n /** Get the validity bitmap */\n get validity(): ValidityBitmap {\n return this._validity;\n }\n\n /** Check if value at index is null */\n @inline\n isNull(index: i32): bool {\n return !this._validity.isValid(index);\n }\n\n /** Set value at index as null */\n @inline\n setNull(index: i32): void {\n this._validity.setNull(index);\n }\n\n // ============ Int32 accessors ============\n\n @inline\n getI32(index: i32): i32 {\n return load<i32>(this.data + (index << 2));\n }\n\n @inline\n setI32(index: i32, value: i32): void {\n store<i32>(this.data + (index << 2), value);\n this._validity.setValid(index);\n }\n\n @inline\n getI32Unchecked(index: i32): i32 {\n return load<i32>(this.data + (index << 2));\n }\n\n // ============ Int64 accessors ============\n\n @inline\n getI64(index: i32): i64 {\n return load<i64>(this.data + (index << 3));\n }\n\n @inline\n setI64(index: i32, value: i64): void {\n store<i64>(this.data + (index << 3), value);\n this._validity.setValid(index);\n }\n\n // ============ Float32 accessors ============\n\n @inline\n getF32(index: i32): f32 {\n return load<f32>(this.data + (index << 2));\n }\n\n @inline\n setF32(index: i32, value: f32): void {\n store<f32>(this.data + (index << 2), value);\n this._validity.setValid(index);\n }\n\n @inline\n getF32Unchecked(index: i32): f32 {\n return load<f32>(this.data + (index << 2));\n }\n\n // ============ Float64 accessors ============\n\n @inline\n getF64(index: i32): f64 {\n return load<f64>(this.data + (index << 3));\n }\n\n @inline\n setF64(index: i32, value: f64): void {\n store<f64>(this.data + (index << 3), value);\n this._validity.setValid(index);\n }\n\n @inline\n getF64Unchecked(index: i32): f64 {\n return load<f64>(this.data + (index << 3));\n }\n\n /** Copy data from a typed array (via pointer) */\n copyFromBuffer(srcPtr: usize, srcLength: i32): void {\n const elementSize = getTypeSize(this._dtype);\n const copyBytes = min(srcLength, this._length) * elementSize;\n memory.copy(this.data, srcPtr, copyBytes);\n }\n\n /** Clone this column */\n clone(): NumericColumn {\n const newCol = new NumericColumn(this._length, this._dtype);\n memory.copy(newCol.data, this.data, this._byteLength);\n newCol._validity.copyFrom(this._validity);\n return newCol;\n }\n\n /** Slice column to create a new column with subset of data */\n slice(start: i32, end: i32): NumericColumn {\n const sliceLength = end - start;\n const newCol = new NumericColumn(sliceLength, this._dtype);\n const elementSize = getTypeSize(this._dtype);\n memory.copy(newCol.data, this.data + start * elementSize, sliceLength * elementSize);\n // Copy validity\n for (let i: i32 = 0; i < sliceLength; i++) {\n if (!this._validity.isValid(start + i)) {\n newCol._validity.setNull(i);\n }\n }\n return newCol;\n }\n\n /** Free the underlying memory */\n free(): void {\n if (this._ownsMemory && this.data !== 0) {\n heap.free(this.data);\n }\n this.data = 0;\n this._validity.free();\n }\n}\n\n/** Factory functions for creating typed columns */\n\nexport function createInt32Column(length: i32): NumericColumn {\n return new NumericColumn(length, DataType.Int32);\n}\n\nexport function createInt64Column(length: i32): NumericColumn {\n return new NumericColumn(length, DataType.Int64);\n}\n\nexport function createFloat32Column(length: i32): NumericColumn {\n return new NumericColumn(length, DataType.Float32);\n}\n\nexport function createFloat64Column(length: i32): NumericColumn {\n return new NumericColumn(length, DataType.Float64);\n}\n","/**\n * StringColumn - Arrow-style variable-length string storage\n * Uses offsets buffer + data buffer with UTF-16 encoding (AssemblyScript native)\n */\n\nimport { ValidityBitmap } from './validity-bitmap';\n\n// 64-byte alignment for SIMD\nconst ALIGNMENT: usize = 64;\n\n@final\nexport class StringColumn {\n /** Offsets buffer (i32 array, length + 1 elements) */\n private offsets: usize;\n /** Data buffer (UTF-16 characters) */\n private data: usize;\n /** Number of strings */\n private _length: i32;\n /** Size of offsets buffer in bytes */\n private _offsetsByteLength: i32;\n /** Size of data buffer in bytes */\n private _dataByteLength: i32;\n /** Current write position in data buffer */\n private _dataPosition: i32;\n /** Data buffer capacity */\n private _dataCapacity: i32;\n /** Validity bitmap for null handling */\n private _validity: ValidityBitmap;\n\n constructor(length: i32, initialDataCapacity: i32 = 0) {\n this._length = length;\n\n // Offsets: (length + 1) i32 values, aligned\n const offsetsBytes = (length + 1) << 2;\n this._offsetsByteLength = ((offsetsBytes + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;\n this.offsets = heap.alloc(this._offsetsByteLength);\n memory.fill(this.offsets, 0, this._offsetsByteLength);\n\n // Data: estimate or use provided capacity (UTF-16, so 2 bytes per char)\n const estimatedChars = initialDataCapacity > 0 ? initialDataCapacity : length * 16;\n const dataBytes = estimatedChars << 1;\n this._dataCapacity = estimatedChars;\n this._dataByteLength = ((dataBytes + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;\n this.data = heap.alloc(this._dataByteLength);\n memory.fill(this.data, 0, this._dataByteLength);\n\n this._dataPosition = 0;\n\n // Create validity bitmap\n this._validity = new ValidityBitmap(length);\n }\n\n /** Get the number of strings */\n get length(): i32 {\n return this._length;\n }\n\n /** Get the offsets pointer for zero-copy access */\n get offsetsPtr(): usize {\n return this.offsets;\n }\n\n /** Get the data pointer for zero-copy access */\n get dataPtr(): usize {\n return this.data;\n }\n\n /** Get the validity bitmap */\n get validity(): ValidityBitmap {\n return this._validity;\n }\n\n /** Get the offset for a string at index */\n @inline\n private getOffset(index: i32): i32 {\n return load<i32>(this.offsets + (index << 2));\n }\n\n /** Set the offset for a string at index */\n @inline\n private setOffset(index: i32, offset: i32): void {\n store<i32>(this.offsets + (index << 2), offset);\n }\n\n /** Ensure data buffer has enough capacity */\n private ensureCapacity(needed: i32): void {\n if (this._dataPosition + needed > this._dataCapacity) {\n // Double capacity or grow to fit\n const newCapacity = max(this._dataCapacity << 1, this._dataPosition + needed);\n const newDataBytes = newCapacity << 1;\n const newDataByteLength = ((newDataBytes + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;\n const newData = heap.alloc(newDataByteLength);\n\n // Copy existing data\n memory.copy(newData, this.data, this._dataPosition << 1);\n\n // Free old buffer and update\n heap.free(this.data);\n this.data = newData;\n this._dataCapacity = newCapacity;\n this._dataByteLength = newDataByteLength;\n }\n }\n\n /** Check if value at index is null */\n @inline\n isNull(index: i32): bool {\n return !this._validity.isValid(index);\n }\n\n /** Set value at index as null */\n @inline\n setNull(index: i32): void {\n this._validity.setNull(index);\n }\n\n /** Get string at index */\n getString(index: i32): string {\n if (index < 0 || index >= this._length) return '';\n if (!this._validity.isValid(index)) return '';\n\n const startOffset = this.getOffset(index);\n const endOffset = this.getOffset(index + 1);\n const charLength = endOffset - startOffset;\n\n if (charLength <= 0) return '';\n\n // Create string from UTF-16 data\n const result = String.UTF16.decodeUnsafe(\n this.data + (startOffset << 1),\n charLength << 1\n );\n return result;\n }\n\n /** Set string at index (for sequential building) */\n setString(index: i32, value: string): void {\n if (index < 0 || index >= this._length) return;\n\n const charLength = value.length;\n\n // Ensure capacity\n this.ensureCapacity(charLength);\n\n // Set start offset\n this.setOffset(index, this._dataPosition);\n\n // Copy string data\n const strPtr = changetype<usize>(value);\n memory.copy(this.data + (this._dataPosition << 1), strPtr, charLength << 1);\n\n // Update position\n this._dataPosition += charLength;\n\n // Set end offset\n this.setOffset(index + 1, this._dataPosition);\n\n // Mark as valid\n this._validity.setValid(index);\n }\n\n /** Get the byte length of a string at index */\n getStringByteLength(index: i32): i32 {\n if (index < 0 || index >= this._length) return 0;\n const startOffset = this.getOffset(index);\n const endOffset = this.getOffset(index + 1);\n return (endOffset - startOffset) << 1;\n }\n\n /** Get total data size used */\n getTotalDataSize(): i32 {\n return this._dataPosition << 1;\n }\n\n /** Clone this column */\n clone(): StringColumn {\n const newCol = new StringColumn(this._length, this._dataCapacity);\n\n // Copy offsets\n memory.copy(newCol.offsets, this.offsets, this._offsetsByteLength);\n\n // Copy data\n memory.copy(newCol.data, this.data, this._dataPosition << 1);\n newCol._dataPosition = this._dataPosition;\n\n // Copy validity\n newCol._validity.copyFrom(this._validity);\n\n return newCol;\n }\n\n /** Free the underlying memory */\n free(): void {\n if (this.offsets !== 0) {\n heap.free(this.offsets);\n this.offsets = 0;\n }\n if (this.data !== 0) {\n heap.free(this.data);\n this.data = 0;\n }\n this._validity.free();\n }\n}\n","/**\n * Schema - Column metadata and type definitions\n */\n\nimport { DataType } from './numeric-column';\n\n/** Column types including strings */\nexport const enum ColumnType {\n Int32 = 0,\n Int64 = 1,\n Float32 = 2,\n Float64 = 3,\n String = 4,\n}\n\n/** Convert ColumnType to numeric DataType */\nexport function columnTypeToDataType(colType: ColumnType): DataType {\n switch (colType) {\n case ColumnType.Int32:\n return DataType.Int32;\n case ColumnType.Int64:\n return DataType.Int64;\n case ColumnType.Float32:\n return DataType.Float32;\n case ColumnType.Float64:\n return DataType.Float64;\n default:\n return DataType.Float64;\n }\n}\n\n/** Check if column type is numeric */\nexport function isNumericType(colType: ColumnType): bool {\n return colType !== ColumnType.String;\n}\n\n/** Get byte size for column type */\nexport function getColumnTypeSize(colType: ColumnType): i32 {\n switch (colType) {\n case ColumnType.Int32:\n case ColumnType.Float32:\n return 4;\n case ColumnType.Int64:\n case ColumnType.Float64:\n return 8;\n case ColumnType.String:\n return 0; // Variable length\n default:\n return 4;\n }\n}\n\n/** Column field definition */\n@final\nexport class Field {\n name: string;\n type: ColumnType;\n nullable: bool;\n\n constructor(name: string, type: ColumnType, nullable: bool = true) {\n this.name = name;\n this.type = type;\n this.nullable = nullable;\n }\n}\n\n/** Schema - collection of fields */\n@final\nexport class Schema {\n private fields: Field[];\n private fieldMap: Map<string, i32>;\n\n constructor() {\n this.fields = [];\n this.fieldMap = new Map<string, i32>();\n }\n\n /** Add a field to the schema */\n addField(name: string, type: ColumnType, nullable: bool = true): void {\n const index = this.fields.length;\n this.fields.push(new Field(name, type, nullable));\n this.fieldMap.set(name, index);\n }\n\n /** Get field by index */\n getField(index: i32): Field | null {\n if (index < 0 || index >= this.fields.length) return null;\n return this.fields[index];\n }\n\n /** Get field by name */\n getFieldByName(name: string): Field | null {\n if (!this.fieldMap.has(name)) return null;\n return this.fields[this.fieldMap.get(name)];\n }\n\n /** Get field index by name */\n getFieldIndex(name: string): i32 {\n if (!this.fieldMap.has(name)) return -1;\n return this.fieldMap.get(name);\n }\n\n /** Check if field exists */\n hasField(name: string): bool {\n return this.fieldMap.has(name);\n }\n\n /** Get number of fields */\n get numFields(): i32 {\n return this.fields.length;\n }\n\n /** Get all field names */\n getFieldNames(): string[] {\n const names: string[] = [];\n for (let i = 0; i < this.fields.length; i++) {\n names.push(this.fields[i].name);\n }\n return names;\n }\n\n /** Clone the schema */\n clone(): Schema {\n const newSchema = new Schema();\n for (let i = 0; i < this.fields.length; i++) {\n const f = this.fields[i];\n newSchema.addField(f.name, f.type, f.nullable);\n }\n return newSchema;\n }\n}\n","/**\n * GroupBy operations for DataFrames\n * Optimized for integer keys (zone representation)\n */\n\nimport { DataFrame } from '../dataframe/dataframe';\nimport { NumericColumn, DataType } from '../core/numeric-column';\nimport { ColumnType } from '../core/schema';\nimport { simdSumF32, simdSumF64 } from '../simd/simd-aggregations';\n\n// FNV-1a hash constants\nconst FNV_OFFSET: u32 = 2166136261;\nconst FNV_PRIME: u32 = 16777619;\n\n/**\n * Hash function for i32 keys (FNV-1a)\n */\n@inline\nfunction hashI32(value: i32): u32 {\n let hash = FNV_OFFSET;\n hash ^= value & 0xFF;\n hash = hash * FNV_PRIME;\n hash ^= (value >> 8) & 0xFF;\n hash = hash * FNV_PRIME;\n hash ^= (value >> 16) & 0xFF;\n hash = hash * FNV_PRIME;\n hash ^= (value >> 24) & 0xFF;\n hash = hash * FNV_PRIME;\n return hash;\n}\n\n/**\n * Hash function for i64 keys\n */\n@inline\nfunction hashI64(value: i64): u32 {\n let hash = FNV_OFFSET;\n for (let i: i32 = 0; i < 8; i++) {\n hash ^= <u32>((value >> (i * 8)) & 0xFF);\n hash = hash * FNV_PRIME;\n }\n return hash;\n}\n\n/**\n * GroupBy result structure\n */\n@final\nexport class GroupByResult {\n /** Unique group keys */\n keys: NumericColumn;\n /** Number of groups */\n numGroups: i32;\n /** Map from group key to group index */\n private groupMap: Map<i32, i32>;\n /** Aggregated columns */\n aggregatedColumns: Map<string, NumericColumn>;\n\n constructor(keyColumn: NumericColumn, numGroups: i32, groupMap: Map<i32, i32>) {\n this.keys = keyColumn;\n this.numGroups = numGroups;\n this.groupMap = groupMap;\n this.aggregatedColumns = new Map<string, NumericColumn>();\n }\n\n /** Get the group index for a key */\n getGroupIndex(key: i32): i32 {\n if (this.groupMap.has(key)) {\n return this.groupMap.get(key);\n }\n return -1;\n }\n\n /** Convert to DataFrame */\n toDataFrame(keyColumnName: string): DataFrame {\n const df = new DataFrame();\n df.addInt32Column(keyColumnName, this.keys);\n\n const colNames = this.aggregatedColumns.keys();\n for (let i = 0; i < colNames.length; i++) {\n const name = colNames[i];\n const col = this.aggregatedColumns.get(name);\n // Determine type based on column's dtype\n if (col.dtype === DataType.Float32) {\n df.addFloat32Column(name, col);\n } else {\n df.addFloat64Column(name, col);\n }\n }\n\n return df;\n }\n\n /** Free resources */\n free(): void {\n this.keys.free();\n const colNames = this.aggregatedColumns.keys();\n for (let i = 0; i < colNames.length; i++) {\n this.aggregatedColumns.get(colNames[i]).free();\n }\n }\n}\n\n/**\n * Optimized GroupBy for small integer keys (like zone 0-4)\n * Uses direct array indexing instead of hash table\n */\nexport function groupByIntegerKey(\n df: DataFrame,\n keyColumnName: string,\n maxKey: i32 = 256\n): GroupByResult {\n const keyColumn = df.getNumericColumn(keyColumnName);\n if (keyColumn === null) {\n throw new Error('Key column not found: ' + keyColumnName);\n }\n\n const rowCount = df.rowCount;\n const keyPtr = keyColumn!.dataPtr;\n\n // Count occurrences of each key\n const counts = new StaticArray<i32>(maxKey + 1);\n for (let i: i32 = 0; i <= maxKey; i++) {\n counts[i] = 0;\n }\n\n // First pass: count keys and find unique values\n const uniqueKeys: i32[] = [];\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n if (key >= 0 && key <= maxKey) {\n if (counts[key] === 0) {\n uniqueKeys.push(key);\n }\n counts[key]++;\n }\n }\n\n // Sort unique keys for consistent ordering\n uniqueKeys.sort((a, b) => a - b);\n\n const numGroups = uniqueKeys.length;\n\n // Create group map and result key column\n const groupMap = new Map<i32, i32>();\n const resultKeys = new NumericColumn(numGroups, DataType.Int32);\n\n for (let i: i32 = 0; i < numGroups; i++) {\n const key = uniqueKeys[i];\n groupMap.set(key, i);\n resultKeys.setI32(i, key);\n }\n\n return new GroupByResult(resultKeys, numGroups, groupMap);\n}\n\n/**\n * GroupBy with sum aggregation for Float32 columns\n * Optimized for small integer keys\n */\nexport function groupBySumF32(\n df: DataFrame,\n keyColumnName: string,\n valueColumnNames: string[],\n maxKey: i32 = 256\n): GroupByResult {\n // Get initial grouping\n const result = groupByIntegerKey(df, keyColumnName, maxKey);\n const numGroups = result.numGroups;\n const rowCount = df.rowCount;\n\n // Get key column\n const keyColumn = df.getNumericColumn(keyColumnName)!;\n const keyPtr = keyColumn.dataPtr;\n\n // Process each value column\n for (let c: i32 = 0; c < valueColumnNames.length; c++) {\n const colName = valueColumnNames[c];\n const valueColumn = df.getNumericColumn(colName);\n if (valueColumn === null) continue;\n\n const valuePtr = valueColumn!.dataPtr;\n const isFloat32 = valueColumn!.dtype === DataType.Float32;\n\n // Allocate sum accumulators\n const sums = new StaticArray<f64>(numGroups);\n for (let i: i32 = 0; i < numGroups; i++) {\n sums[i] = 0;\n }\n\n // Accumulate sums\n if (isFloat32) {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n sums[groupIdx] += <f64>load<f32>(valuePtr + (i << 2));\n }\n }\n } else {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n sums[groupIdx] += load<f64>(valuePtr + (i << 3));\n }\n }\n }\n\n // Create result column (use Float32 if input was Float32)\n const resultColumn = new NumericColumn(numGroups, isFloat32 ? DataType.Float32 : DataType.Float64);\n if (isFloat32) {\n for (let i: i32 = 0; i < numGroups; i++) {\n resultColumn.setF32(i, <f32>sums[i]);\n }\n } else {\n for (let i: i32 = 0; i < numGroups; i++) {\n resultColumn.setF64(i, sums[i]);\n }\n }\n\n result.aggregatedColumns.set(colName, resultColumn);\n }\n\n return result;\n}\n\n/**\n * GroupBy with mean aggregation\n */\nexport function groupByMean(\n df: DataFrame,\n keyColumnName: string,\n valueColumnNames: string[],\n maxKey: i32 = 256\n): GroupByResult {\n // Get initial grouping\n const result = groupByIntegerKey(df, keyColumnName, maxKey);\n const numGroups = result.numGroups;\n const rowCount = df.rowCount;\n\n // Get key column\n const keyColumn = df.getNumericColumn(keyColumnName)!;\n const keyPtr = keyColumn.dataPtr;\n\n // Count per group\n const counts = new StaticArray<i32>(numGroups);\n for (let i: i32 = 0; i < numGroups; i++) {\n counts[i] = 0;\n }\n\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n counts[groupIdx]++;\n }\n }\n\n // Process each value column\n for (let c: i32 = 0; c < valueColumnNames.length; c++) {\n const colName = valueColumnNames[c];\n const valueColumn = df.getNumericColumn(colName);\n if (valueColumn === null) continue;\n\n const valuePtr = valueColumn!.dataPtr;\n const isFloat32 = valueColumn!.dtype === DataType.Float32;\n\n // Allocate sum accumulators\n const sums = new StaticArray<f64>(numGroups);\n for (let i: i32 = 0; i < numGroups; i++) {\n sums[i] = 0;\n }\n\n // Accumulate sums\n if (isFloat32) {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n sums[groupIdx] += <f64>load<f32>(valuePtr + (i << 2));\n }\n }\n } else {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n sums[groupIdx] += load<f64>(valuePtr + (i << 3));\n }\n }\n }\n\n // Create result column with means\n const resultColumn = new NumericColumn(numGroups, DataType.Float64);\n for (let i: i32 = 0; i < numGroups; i++) {\n if (counts[i] > 0) {\n resultColumn.setF64(i, sums[i] / <f64>counts[i]);\n } else {\n resultColumn.setF64(i, 0);\n }\n }\n\n result.aggregatedColumns.set(colName, resultColumn);\n }\n\n return result;\n}\n\n/**\n * GroupBy with min aggregation\n */\nexport function groupByMin(\n df: DataFrame,\n keyColumnName: string,\n valueColumnNames: string[],\n maxKey: i32 = 256\n): GroupByResult {\n const result = groupByIntegerKey(df, keyColumnName, maxKey);\n const numGroups = result.numGroups;\n const rowCount = df.rowCount;\n\n const keyColumn = df.getNumericColumn(keyColumnName)!;\n const keyPtr = keyColumn.dataPtr;\n\n for (let c: i32 = 0; c < valueColumnNames.length; c++) {\n const colName = valueColumnNames[c];\n const valueColumn = df.getNumericColumn(colName);\n if (valueColumn === null) continue;\n\n const valuePtr = valueColumn!.dataPtr;\n const isFloat32 = valueColumn!.dtype === DataType.Float32;\n\n const mins = new StaticArray<f64>(numGroups);\n for (let i: i32 = 0; i < numGroups; i++) {\n mins[i] = Infinity;\n }\n\n if (isFloat32) {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n const val = <f64>load<f32>(valuePtr + (i << 2));\n if (val < mins[groupIdx]) mins[groupIdx] = val;\n }\n }\n } else {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n const val = load<f64>(valuePtr + (i << 3));\n if (val < mins[groupIdx]) mins[groupIdx] = val;\n }\n }\n }\n\n const resultColumn = new NumericColumn(numGroups, isFloat32 ? DataType.Float32 : DataType.Float64);\n if (isFloat32) {\n for (let i: i32 = 0; i < numGroups; i++) {\n resultColumn.setF32(i, <f32>mins[i]);\n }\n } else {\n for (let i: i32 = 0; i < numGroups; i++) {\n resultColumn.setF64(i, mins[i]);\n }\n }\n\n result.aggregatedColumns.set(colName, resultColumn);\n }\n\n return result;\n}\n\n/**\n * GroupBy with max aggregation\n */\nexport function groupByMax(\n df: DataFrame,\n keyColumnName: string,\n valueColumnNames: string[],\n maxKey: i32 = 256\n): GroupByResult {\n const result = groupByIntegerKey(df, keyColumnName, maxKey);\n const numGroups = result.numGroups;\n const rowCount = df.rowCount;\n\n const keyColumn = df.getNumericColumn(keyColumnName)!;\n const keyPtr = keyColumn.dataPtr;\n\n for (let c: i32 = 0; c < valueColumnNames.length; c++) {\n const colName = valueColumnNames[c];\n const valueColumn = df.getNumericColumn(colName);\n if (valueColumn === null) continue;\n\n const valuePtr = valueColumn!.dataPtr;\n const isFloat32 = valueColumn!.dtype === DataType.Float32;\n\n const maxs = new StaticArray<f64>(numGroups);\n for (let i: i32 = 0; i < numGroups; i++) {\n maxs[i] = -Infinity;\n }\n\n if (isFloat32) {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n const val = <f64>load<f32>(valuePtr + (i << 2));\n if (val > maxs[groupIdx]) maxs[groupIdx] = val;\n }\n }\n } else {\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n const val = load<f64>(valuePtr + (i << 3));\n if (val > maxs[groupIdx]) maxs[groupIdx] = val;\n }\n }\n }\n\n const resultColumn = new NumericColumn(numGroups, isFloat32 ? DataType.Float32 : DataType.Float64);\n if (isFloat32) {\n for (let i: i32 = 0; i < numGroups; i++) {\n resultColumn.setF32(i, <f32>maxs[i]);\n }\n } else {\n for (let i: i32 = 0; i < numGroups; i++) {\n resultColumn.setF64(i, maxs[i]);\n }\n }\n\n result.aggregatedColumns.set(colName, resultColumn);\n }\n\n return result;\n}\n\n/**\n * GroupBy with count aggregation\n */\nexport function groupByCount(\n df: DataFrame,\n keyColumnName: string,\n maxKey: i32 = 256\n): GroupByResult {\n const result = groupByIntegerKey(df, keyColumnName, maxKey);\n const numGroups = result.numGroups;\n const rowCount = df.rowCount;\n\n const keyColumn = df.getNumericColumn(keyColumnName)!;\n const keyPtr = keyColumn.dataPtr;\n\n const counts = new StaticArray<i32>(numGroups);\n for (let i: i32 = 0; i < numGroups; i++) {\n counts[i] = 0;\n }\n\n for (let i: i32 = 0; i < rowCount; i++) {\n const key = load<i32>(keyPtr + (i << 2));\n const groupIdx = result.getGroupIndex(key);\n if (groupIdx >= 0) {\n counts[groupIdx]++;\n }\n }\n\n const countColumn = new NumericColumn(numGroups, DataType.Int32);\n for (let i: i32 = 0; i < numGroups; i++) {\n countColumn.setI32(i, counts[i]);\n }\n\n result.aggregatedColumns.set('count', countColumn);\n\n return result;\n}\n","/**\n * Hash Join implementation for DataFrames\n */\n\nimport { DataFrame } from '../dataframe/dataframe';\nimport { NumericColumn, DataType } from '../core/numeric-column';\nimport { StringColumn } from '../core/string-column';\nimport { ColumnType } from '../core/schema';\n\n// FNV-1a hash constants\nconst FNV_OFFSET: u32 = 2166136261;\nconst FNV_PRIME: u32 = 16777619;\n\n/**\n * Hash table entry for join\n */\n@final\nclass HashEntry {\n key: i32;\n rowIndex: i32;\n next: HashEntry | null;\n\n constructor(key: i32, rowIndex: i32) {\n this.key = key;\n this.rowIndex = rowIndex;\n this.next = null;\n }\n}\n\n/**\n * Hash table for join operations\n */\n@final\nclass JoinHashTable {\n private buckets: StaticArray<HashEntry | null> = new StaticArray<HashEntry | null>(1);\n private numBuckets: i32 = 1;\n private size: i32 = 0;\n\n constructor(expectedSize: i32) {\n // Use power of 2 for fast modulo\n let numBuckets: i32 = 1;\n while (numBuckets < expectedSize * 2) {\n numBuckets <<= 1;\n }\n this.numBuckets = numBuckets;\n this.buckets = new StaticArray<HashEntry | null>(numBuckets);\n for (let i: i32 = 0; i < numBuckets; i++) {\n this.buckets[i] = null;\n }\n this.size = 0;\n }\n\n @inline\n private hash(key: i32): i32 {\n let hash = FNV_OFFSET;\n hash ^= key & 0xFF;\n hash = hash * FNV_PRIME;\n hash ^= (key >> 8) & 0xFF;\n hash = hash * FNV_PRIME;\n hash ^= (key >> 16) & 0xFF;\n hash = hash * FNV_PRIME;\n hash ^= (key >> 24) & 0xFF;\n hash = hash * FNV_PRIME;\n return <i32>(hash & (this.numBuckets - 1));\n }\n\n insert(key: i32, rowIndex: i32): void {\n const bucketIdx = this.hash(key);\n const entry = new HashEntry(key, rowIndex);\n entry.next = this.buckets[bucketIdx];\n this.buckets[bucketIdx] = entry;\n this.size++;\n }\n\n /** Find all matching row indices for a key */\n find(key: i32, results: i32[]): void {\n const bucketIdx = this.hash(key);\n let entry = this.buckets[bucketIdx];\n while (entry !== null) {\n if (entry.key === key) {\n results.push(entry.rowIndex);\n }\n entry = entry.next;\n }\n }\n\n /** Check if key exists */\n has(key: i32): bool {\n const bucketIdx = this.hash(key);\n let entry = this.buckets[bucketIdx];\n while (entry !== null) {\n if (entry.key === key) return true;\n entry = entry.next;\n }\n return false;\n }\n}\n\n/**\n * Inner join two DataFrames on integer key columns\n * Returns a new DataFrame with matched rows\n */\nexport function innerJoinI32(\n left: DataFrame,\n right: DataFrame,\n leftKeyColumn: string,\n rightKeyColumn: string\n): DataFrame {\n const leftKey = left.getNumericColumn(leftKeyColumn);\n const rightKey = right.getNumericColumn(rightKeyColumn);\n\n if (leftKey === null || rightKey === null) {\n throw new Error('Key column not found');\n }\n\n const leftLen = left.rowCount;\n const rightLen = right.rowCount;\n const leftKeyPtr = leftKey!.dataPtr;\n const rightKeyPtr = rightKey!.dataPtr;\n\n // Build hash table on smaller table\n const buildOnLeft = leftLen <= rightLen;\n const buildLen = buildOnLeft ? leftLen : rightLen;\n const probeLen = buildOnLeft ? rightLen : leftLen;\n const buildKeyPtr = buildOnLeft ? leftKeyPtr : rightKeyPtr;\n const probeKeyPtr = buildOnLeft ? rightKeyPtr : leftKeyPtr;\n\n // Build phase\n const hashTable = new JoinHashTable(buildLen);\n for (let i: i32 = 0; i < buildLen; i++) {\n const key = load<i32>(buildKeyPtr + (i << 2));\n hashTable.insert(key, i);\n }\n\n // Probe phase - collect matching pairs\n const leftIndices: i32[] = [];\n const rightIndices: i32[] = [];\n const matchBuffer: i32[] = [];\n\n for (let i: i32 = 0; i < probeLen; i++) {\n const key = load<i32>(probeKeyPtr + (i << 2));\n matchBuffer.length = 0;\n hashTable.find(key, matchBuffer);\n\n for (let j: i32 = 0; j < matchBuffer.length; j++) {\n if (buildOnLeft) {\n leftIndices.push(matchBuffer[j]);\n rightIndices.push(i);\n } else {\n leftIndices.push(i);\n rightIndices.push(matchBuffer[j]);\n }\n }\n }\n\n // Build result DataFrame\n return buildJoinResult(left, right, leftIndices, rightIndices, leftKeyColumn, rightKeyColumn);\n}\n\n/**\n * Left join two DataFrames on integer key columns\n */\nexport function leftJoinI32(\n left: DataFrame,\n right: DataFrame,\n leftKeyColumn: string,\n rightKeyColumn: string\n): DataFrame {\n const leftKey = left.getNumericColumn(leftKeyColumn);\n const rightKey = right.getNumericColumn(rightKeyColumn);\n\n if (leftKey === null || rightKey === null) {\n throw new Error('Key column not found');\n }\n\n const leftLen = left.rowCount;\n const rightLen = right.rowCount;\n const leftKeyPtr = leftKey!.dataPtr;\n const rightKeyPtr = rightKey!.dataPtr;\n\n // Build hash table on right table\n const hashTable = new JoinHashTable(rightLen);\n for (let i: i32 = 0; i < rightLen; i++) {\n const key = load<i32>(rightKeyPtr + (i << 2));\n hashTable.insert(key, i);\n }\n\n // Probe with left table\n const leftIndices: i32[] = [];\n const rightIndices: i32[] = [];\n const matchBuffer: i32[] = [];\n\n for (let i: i32 = 0; i < leftLen; i++) {\n const key = load<i32>(leftKeyPtr + (i << 2));\n matchBuffer.length = 0;\n hashTable.find(key, matchBuffer);\n\n if (matchBuffer.length === 0) {\n // No match - include left row with null right\n leftIndices.push(i);\n rightIndices.push(-1); // -1 indicates null\n } else {\n for (let j: i32 = 0; j < matchBuffer.length; j++) {\n leftIndices.push(i);\n rightIndices.push(matchBuffer[j]);\n }\n }\n }\n\n return buildJoinResult(left, right, leftIndices, rightIndices, leftKeyColumn, rightKeyColumn);\n}\n\n/**\n * Right join two DataFrames on integer key columns\n */\nexport function rightJoinI32(\n left: DataFrame,\n right: DataFrame,\n leftKeyColumn: string,\n rightKeyColumn: string\n): DataFrame {\n // Right join is left join with swapped tables\n const result = leftJoinI32(right, left, rightKeyColumn, leftKeyColumn);\n // Columns will be in different order, but that's acceptable\n return result;\n}\n\n/**\n * Build the result DataFrame from matched indices\n */\nfunction buildJoinResult(\n left: DataFrame,\n right: DataFrame,\n leftIndices: i32[],\n rightIndices: i32[],\n leftKeyColumn: string,\n rightKeyColumn: string\n): DataFrame {\n const resultLen = leftIndices.length;\n const result = new DataFrame();\n\n // Copy columns from left table\n const leftColNames = left.getColumnNames();\n for (let c: i32 = 0; c < leftColNames.length; c++) {\n const colName = leftColNames[c];\n const colType = left.getColumnType(colName);\n\n if (colType !== ColumnType.String) {\n const srcCol = left.getNumericColumn(colName)!;\n const dstCol = new NumericColumn(resultLen, srcCol.dtype);\n\n copyColumnByIndices(srcCol, dstCol, leftIndices);\n\n switch (colType) {\n case ColumnType.Int32:\n result.addInt32Column(colName, dstCol);\n break;\n case ColumnType.Int64:\n result.addInt64Column(colName, dstCol);\n break;\n case ColumnType.Float32:\n result.addFloat32Column(colName, dstCol);\n break;\n case ColumnType.Float64:\n result.addFloat64Column(colName, dstCol);\n break;\n }\n }\n }\n\n // Copy columns from right table (excluding key column if same name)\n const rightColNames = right.getColumnNames();\n for (let c: i32 = 0; c < rightColNames.length; c++) {\n const colName = rightColNames[c];\n\n // Skip if it's the key column and left already has it\n if (colName === rightKeyColumn && left.hasColumn(leftKeyColumn)) {\n continue;\n }\n\n // Add suffix if name conflicts\n let resultColName = colName;\n if (result.hasColumn(colName)) {\n resultColName = colName + '_right';\n }\n\n const colType = right.getColumnType(colName);\n\n if (colType !== ColumnType.String) {\n const srcCol = right.getNumericColumn(colName)!;\n const dstCol = new NumericColumn(resultLen, srcCol.dtype);\n\n copyColumnByIndicesNullable(srcCol, dstCol, rightIndices);\n\n switch (colType) {\n case ColumnType.Int32:\n result.addInt32Column(resultColName, dstCol);\n break;\n case ColumnType.Int64:\n result.addInt64Column(resultColName, dstCol);\n break;\n case ColumnType.Float32:\n result.addFloat32Column(resultColName, dstCol);\n break;\n case ColumnType.Float64:\n result.addFloat64Column(resultColName, dstCol);\n break;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Copy column values by index array\n */\nfunction copyColumnByIndices(\n src: NumericColumn,\n dst: NumericColumn,\n indices: i32[]\n): void {\n const srcPtr = src.dataPtr;\n const dstPtr = dst.dataPtr;\n const len = indices.length;\n\n switch (src.dtype) {\n case DataType.Int32:\n case DataType.Float32:\n for (let i: i32 = 0; i < len; i++) {\n const srcIdx = indices[i];\n store<i32>(dstPtr + (i << 2), load<i32>(srcPtr + (srcIdx << 2)));\n }\n break;\n case DataType.Int64:\n case DataType.Float64:\n for (let i: i32 = 0; i < len; i++) {\n const srcIdx = indices[i];\n store<i64>(dstPtr + (i << 3), load<i64>(srcPtr + (srcIdx << 3)));\n }\n break;\n }\n}\n\n/**\n * Copy column values by index array, handling -1 as null\n */\nfunction copyColumnByIndicesNullable(\n src: NumericColumn,\n dst: NumericColumn,\n indices: i32[]\n): void {\n const srcPtr = src.dataPtr;\n const dstPtr = dst.dataPtr;\n const len = indices.length;\n\n switch (src.dtype) {\n case DataType.Int32:\n case DataType.Float32:\n for (let i: i32 = 0; i < len; i++) {\n const srcIdx = indices[i];\n if (srcIdx >= 0) {\n store<i32>(dstPtr + (i << 2), load<i32>(srcPtr + (srcIdx << 2)));\n } else {\n store<i32>(dstPtr + (i << 2), 0);\n dst.setNull(i);\n }\n }\n break;\n case DataType.Int64:\n case DataType.Float64:\n for (let i: i32 = 0; i < len; i++) {\n const srcIdx = indices[i];\n if (srcIdx >= 0) {\n store<i64>(dstPtr + (i << 3), load<i64>(srcPtr + (srcIdx << 3)));\n } else {\n store<i64>(dstPtr + (i << 3), 0);\n dst.setNull(i);\n }\n }\n break;\n }\n}\n","/**\n * Memory allocator utilities for aligned buffer allocation\n */\n\n// Standard alignment for SIMD operations\nexport const SIMD_ALIGNMENT: usize = 64;\n\n/**\n * Allocate aligned memory buffer\n * @param size Size in bytes\n * @param alignment Alignment requirement (default 64 bytes for SIMD)\n * @returns Pointer to allocated memory\n */\nexport function allocAligned(size: usize, alignment: usize = SIMD_ALIGNMENT): usize {\n // AssemblyScript's heap.alloc already provides some alignment\n // but we ensure it meets our requirements\n const alignedSize = ((size + alignment - 1) / alignment) * alignment;\n return heap.alloc(alignedSize);\n}\n\n/**\n * Free allocated memory\n * @param ptr Pointer to free\n */\nexport function freeAligned(ptr: usize): void {\n if (ptr !== 0) {\n heap.free(ptr);\n }\n}\n\n/**\n * Reallocate memory buffer with new size\n * @param ptr Existing pointer\n * @param oldSize Old size in bytes\n * @param newSize New size in bytes\n * @param alignment Alignment requirement\n * @returns Pointer to reallocated memory\n */\nexport function reallocAligned(\n ptr: usize,\n oldSize: usize,\n newSize: usize,\n alignment: usize = SIMD_ALIGNMENT\n): usize {\n const alignedNewSize = ((newSize + alignment - 1) / alignment) * alignment;\n const newPtr = heap.alloc(alignedNewSize);\n\n // Copy old data\n const copySize = min(oldSize, newSize);\n memory.copy(newPtr, ptr, copySize);\n\n // Free old memory\n if (ptr !== 0) {\n heap.free(ptr);\n }\n\n return newPtr;\n}\n\n/**\n * Zero out a memory region\n * @param ptr Pointer to memory\n * @param size Size in bytes\n */\nexport function zeroMemory(ptr: usize, size: usize): void {\n memory.fill(ptr, 0, size);\n}\n\n/**\n * Copy memory region\n * @param dest Destination pointer\n * @param src Source pointer\n * @param size Size in bytes\n */\nexport function copyMemory(dest: usize, src: usize, size: usize): void {\n memory.copy(dest, src, size);\n}\n\n/**\n * Get current memory size in pages (64KB per page)\n */\nexport function getMemoryPages(): i32 {\n return <i32>memory.size();\n}\n\n/**\n * Grow memory by specified number of pages\n * @param pages Number of pages to grow\n * @returns Previous size in pages, or -1 on failure\n */\nexport function growMemory(pages: i32): i32 {\n return <i32>memory.grow(pages);\n}\n","/**\n * Databonk - AssemblyScript DataFrame Library\n * Main exports for WASM module\n */\n\n// Import for internal use\nimport { DataFrame as DataFrameClass, createEmptyDataFrame as createEmptyDF } from './dataframe/dataframe';\nimport { buildDataFrameFromArrays as buildDF } from './dataframe/builder';\nimport { groupBySumF32 as gbSumF32, groupByMean as gbMean } from './ops/groupby';\nimport { innerJoinI32 as ijI32 } from './ops/join';\nimport { NumericColumn, DataType } from './core/numeric-column';\n\n// Re-export core types\nexport { ValidityBitmap } from './core/validity-bitmap';\nexport { NumericColumn, DataType, createInt32Column, createInt64Column, createFloat32Column, createFloat64Column } from './core/numeric-column';\nexport { StringColumn } from './core/string-column';\nexport { Schema, Field, ColumnType, isNumericType, getColumnTypeSize, columnTypeToDataType } from './core/schema';\n\n// Re-export DataFrame\nexport { DataFrame, createEmptyDataFrame } from './dataframe/dataframe';\nexport { DataFrameBuilder, createDataFrameBuilder, buildDataFrameFromArrays } from './dataframe/builder';\n\n// Re-export operations\nexport {\n columnSum, columnMean, columnMin, columnMax, columnCount, columnVariance, columnStdDev,\n dfSum, dfMean, dfMin, dfMax, dfCount, dfVariance, dfStdDev\n} from './ops/aggregations';\nexport { columnAdd, columnSub, columnMul, columnDiv, columnScalarMul, columnScalarAdd, dfAdd, dfSub, dfScalarMul } from './ops/arithmetic';\nexport { GroupByResult, groupByIntegerKey, groupBySumF32, groupByMean, groupByMin, groupByMax, groupByCount } from './ops/groupby';\nexport { innerJoinI32, leftJoinI32, rightJoinI32 } from './ops/join';\n\n// Re-export SIMD operations (for advanced users)\nexport { simdSumF32, simdSumF64, simdMinF32, simdMinF64, simdMaxF32, simdMaxF64 } from './simd/simd-aggregations';\nexport { simdAddF32, simdSubF32, simdMulF32, simdDivF32, simdScalarMulF32 } from './simd/simd-arithmetic';\nexport { simdAddF64, simdSubF64, simdMulF64, simdDivF64, simdScalarMulF64 } from './simd/simd-arithmetic';\n\n// Re-export memory utilities\nexport { allocAligned, freeAligned, reallocAligned, zeroMemory, copyMemory, getMemoryPages, growMemory, SIMD_ALIGNMENT } from './memory/allocator';\nexport { getMemoryBase, getMemorySize, BufferView, createInt32View, createFloat32View, createFloat64View, createUint8View, atomicLoadI32, atomicStoreI32, atomicAddI32, memoryFence } from './memory/shared';\n\n// =============================================================================\n// High-level API functions exported for JavaScript\n// =============================================================================\n\n/**\n * Create a DataFrame from column data pointers\n * This is the main entry point for JavaScript\n */\nexport function createDataFrame(\n rowCount: i32,\n columnNames: string[],\n columnTypes: i32[],\n dataPtrs: usize[]\n): DataFrameClass {\n return buildDF(rowCount, columnNames, columnTypes, dataPtrs);\n}\n\n/**\n * Get column data pointer from DataFrame\n */\nexport function getColumnPtr(df: DataFrameClass, columnName: string): usize {\n return df.getColumnDataPtr(columnName);\n}\n\n/**\n * Get column length from DataFrame\n */\nexport function getColumnLength(df: DataFrameClass, columnName: string): i32 {\n const col = df.getNumericColumn(columnName);\n return col !== null ? col!.length : 0;\n}\n\n/**\n * Get row count from DataFrame\n */\nexport function getRowCount(df: DataFrameClass): i32 {\n return df.rowCount;\n}\n\n/**\n * Get column count from DataFrame\n */\nexport function getColumnCount(df: DataFrameClass): i32 {\n return df.columnCount;\n}\n\n/**\n * Perform inner join on two DataFrames\n */\nexport function innerJoin(\n left: DataFrameClass,\n right: DataFrameClass,\n leftKey: string,\n rightKey: string\n): DataFrameClass {\n return ijI32(left, right, leftKey, rightKey);\n}\n\n/**\n * Perform groupBy sum aggregation\n */\nexport function groupBySum(\n df: DataFrameClass,\n keyColumn: string,\n valueColumns: string[],\n maxKey: i32 = 256\n): DataFrameClass {\n const result = gbSumF32(df, keyColumn, valueColumns, maxKey);\n return result.toDataFrame(keyColumn);\n}\n\n/**\n * Perform groupBy mean aggregation\n */\nexport function groupByMeanAgg(\n df: DataFrameClass,\n keyColumn: string,\n valueColumns: string[],\n maxKey: i32 = 256\n): DataFrameClass {\n const result = gbMean(df, keyColumn, valueColumns, maxKey);\n return result.toDataFrame(keyColumn);\n}\n\n/**\n * Allocate memory and return pointer\n * Used by JS to get a buffer for writing data\n */\nexport function allocateBuffer(byteLength: i32): usize {\n return heap.alloc(byteLength);\n}\n\n/**\n * Free allocated memory\n */\nexport function freeBuffer(ptr: usize): void {\n heap.free(ptr);\n}\n\n/**\n * Free a DataFrame and its resources\n */\nexport function freeDataFrame(df: DataFrameClass): void {\n df.free();\n}\n\n/**\n * Get the column type\n */\nexport function getColumnType(df: DataFrameClass, columnName: string): i32 {\n return <i32>df.getColumnType(columnName);\n}\n\n/**\n * Check if column exists\n */\nexport function hasColumn(df: DataFrameClass, columnName: string): bool {\n return df.hasColumn(columnName);\n}\n\n// =============================================================================\n// Simpler DataFrame building API for JavaScript\n// These functions avoid passing arrays which is complex with AssemblyScript\n// =============================================================================\n\n/**\n * Create an empty DataFrame with a specified row count\n * Use this followed by addColumnToDataFrame calls\n */\nexport function createEmptyDataFrameWithRows(rowCount: i32): DataFrameClass {\n return createEmptyDF(rowCount);\n}\n\n/**\n * Add an Int32 column to a DataFrame\n * @param df DataFrame pointer\n * @param name Column name\n * @param dataPtr Pointer to Int32 data\n * @param length Number of elements\n */\nexport function addInt32ColumnToDataFrame(\n df: DataFrameClass,\n name: string,\n dataPtr: usize,\n length: i32\n): void {\n const col = new NumericColumn(length, DataType.Int32);\n col.copyFromBuffer(dataPtr, length);\n df.addInt32Column(name, col);\n}\n\n/**\n * Add a Float32 column to a DataFrame\n * @param df DataFrame pointer\n * @param name Column name\n * @param dataPtr Pointer to Float32 data\n * @param length Number of elements\n */\nexport function addFloat32ColumnToDataFrame(\n df: DataFrameClass,\n name: string,\n dataPtr: usize,\n length: i32\n): void {\n const col = new NumericColumn(length, DataType.Float32);\n col.copyFromBuffer(dataPtr, length);\n df.addFloat32Column(name, col);\n}\n\n/**\n * Add a Float64 column to a DataFrame\n * @param df DataFrame pointer\n * @param name Column name\n * @param dataPtr Pointer to Float64 data\n * @param length Number of elements\n */\nexport function addFloat64ColumnToDataFrame(\n df: DataFrameClass,\n name: string,\n dataPtr: usize,\n length: i32\n): void {\n const col = new NumericColumn(length, DataType.Float64);\n col.copyFromBuffer(dataPtr, length);\n df.addFloat64Column(name, col);\n}\n\n/**\n * Add an Int64 column to a DataFrame\n * @param df DataFrame pointer\n * @param name Column name\n * @param dataPtr Pointer to Int64 data\n * @param length Number of elements\n */\nexport function addInt64ColumnToDataFrame(\n df: DataFrameClass,\n name: string,\n dataPtr: usize,\n length: i32\n): void {\n const col = new NumericColumn(length, DataType.Int64);\n col.copyFromBuffer(dataPtr, length);\n df.addInt64Column(name, col);\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","// 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","/// <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","//\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","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 { Typeinfo, TypeinfoFlags } from \"./shared/typeinfo\";\nimport { E_INDEXOUTOFRANGE } from \"./util/error\";\nimport { ArrayBufferView } from \"./arraybuffer\";\n\n// @ts-ignore: decorator\n@builtin\nexport declare const __rtti_base: usize;\n\n// @ts-ignore: decorator\n@builtin @unsafe\nexport declare function __visit_globals(cookie: u32): void;\n\n// @ts-ignore: decorator\n@builtin @unsafe\nexport declare function __visit_members(ref: usize, cookie: u32): void;\n\n// @ts-ignore: decorator\n@unsafe\nexport function __typeinfo(id: u32): TypeinfoFlags {\n let ptr = __rtti_base;\n if (id > load<u32>(ptr)) throw new Error(E_INDEXOUTOFRANGE);\n return changetype<Typeinfo>(ptr + sizeof<u32>() + id * offsetof<Typeinfo>()).flags;\n}\n\n// @ts-ignore: decorator\n@unsafe\nexport function __newBuffer(size: usize, id: u32, data: usize = 0): usize {\n let buffer = __new(size, id);\n if (data) memory.copy(buffer, data, size);\n return buffer;\n}\n\n// @ts-ignore: decorator\n@unsafe\nexport function __newArray(length: i32, alignLog2: usize, id: u32, data: usize = 0): usize {\n let bufferSize = <usize>length << alignLog2;\n // make sure `buffer` is tracked by the shadow stack\n let buffer = changetype<ArrayBuffer>(__newBuffer(bufferSize, idof<ArrayBuffer>(), data));\n // ...since allocating the array may trigger GC steps\n let array = __new(offsetof<i32[]>(), id);\n store<usize>(array, changetype<usize>(buffer), offsetof<ArrayBufferView>(\"buffer\"));\n __link(array, changetype<usize>(buffer), false);\n store<usize>(array, changetype<usize>(buffer), offsetof<ArrayBufferView>(\"dataStart\"));\n store<i32>(array, bufferSize, offsetof<ArrayBufferView>(\"byteLength\"));\n store<i32>(array, length, offsetof<i32[]>(\"length_\"));\n return array;\n}\n\n// @ts-ignore: decorator\n@global @unsafe\nfunction __tostack(ptr: usize): usize { // eslint-disable-line\n return ptr;\n}\n\n// These are provided by the respective implementation, included as another entry file by asc:\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __alloc(size: usize): usize;\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __realloc(ptr: usize, size: usize): usize;\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __free(ptr: usize): void;\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __new(size: usize, id: u32): usize;\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __renew(ptr: usize, size: usize): usize;\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __link(parentPtr: usize, childPtr: usize, expectMultiple: bool): void;\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __collect(): void;\n\n// // @ts-ignore: decorator\n// @builtin @unsafe\n// export declare function __visit(ptr: usize, cookie: u32): void;\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","export function HASH<T>(key: T): u32 {\n if (isString<T>()) {\n return hashStr(changetype<string>(key));\n } else if (isReference<T>()) {\n if (sizeof<T>() == 4) return hash32(changetype<u32>(key));\n if (sizeof<T>() == 8) return hash64(changetype<u64>(key));\n } else if (isFloat<T>()) {\n if (sizeof<T>() == 4) return hash32(reinterpret<u32>(f32(key)));\n if (sizeof<T>() == 8) return hash64(reinterpret<u64>(f64(key)));\n } else {\n if (sizeof<T>() <= 4) return hash32(u32(key), sizeof<T>());\n if (sizeof<T>() == 8) return hash64(u64(key));\n }\n return unreachable();\n}\n\n// XXHash 32-bit as a starting point, see: https://cyan4973.github.io/xxHash\n\n// primes\n// @ts-ignore: decorator\n@inline const XXH32_P1: u32 = 2654435761;\n// @ts-ignore: decorator\n@inline const XXH32_P2: u32 = 2246822519;\n// @ts-ignore: decorator\n@inline const XXH32_P3: u32 = 3266489917;\n// @ts-ignore: decorator\n@inline const XXH32_P4: u32 = 668265263;\n// @ts-ignore: decorator\n@inline const XXH32_P5: u32 = 374761393;\n// @ts-ignore: decorator\n@inline const XXH32_SEED: u32 = 0;\n\n// @ts-ignore: decorator\n@inline\nfunction hash32(key: u32, len: u32 = 4): u32 {\n let h: u32 = XXH32_SEED + XXH32_P5 + len;\n h += key * XXH32_P3;\n h = rotl(h, 17) * XXH32_P4;\n h ^= h >> 15;\n h *= XXH32_P2;\n h ^= h >> 13;\n h *= XXH32_P3;\n h ^= h >> 16;\n return h;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction hash64(key: u64): u32 {\n let h: u32 = XXH32_SEED + XXH32_P5 + 8;\n h += <u32>key * XXH32_P3;\n h = rotl(h, 17) * XXH32_P4;\n h += <u32>(key >> 32) * XXH32_P3;\n h = rotl(h, 17) * XXH32_P4;\n h ^= h >> 15;\n h *= XXH32_P2;\n h ^= h >> 13;\n h *= XXH32_P3;\n h ^= h >> 16;\n return h;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction mix(h: u32, key: u32): u32 {\n return rotl(h + key * XXH32_P2, 13) * XXH32_P1;\n}\n\n// @ts-ignore: decorator\n@inline\nfunction hashStr(key: string): u32 {\n if (changetype<usize>(key) == 0) return XXH32_SEED;\n\n let h: u32 = key.length << 1;\n let len: usize = h;\n let pos = changetype<usize>(key);\n\n if (len >= 16) {\n let s1 = XXH32_SEED + XXH32_P1 + XXH32_P2;\n let s2 = XXH32_SEED + XXH32_P2;\n let s3 = XXH32_SEED;\n let s4 = XXH32_SEED - XXH32_P1;\n\n let end = len + pos - 16;\n while (pos <= end) {\n s1 = mix(s1, load<u32>(pos ));\n s2 = mix(s2, load<u32>(pos, 4));\n s3 = mix(s3, load<u32>(pos, 8));\n s4 = mix(s4, load<u32>(pos, 12));\n pos += 16;\n }\n h += rotl(s1, 1) + rotl(s2, 7) + rotl(s3, 12) + rotl(s4, 18);\n } else {\n h += XXH32_SEED + XXH32_P5;\n }\n\n let end = changetype<usize>(key) + len - 4;\n while (pos <= end) {\n h += load<u32>(pos) * XXH32_P3;\n h = rotl(h, 17) * XXH32_P4;\n pos += 4;\n }\n\n end = changetype<usize>(key) + len;\n while (pos < end) {\n h += <u32>load<u8>(pos) * XXH32_P5;\n h = rotl(h, 11) * XXH32_P1;\n pos++;\n }\n\n h ^= h >> 15;\n h *= XXH32_P2;\n h ^= h >> 13;\n h *= XXH32_P3;\n h ^= h >> 16;\n return h;\n}\n","/// <reference path=\"./rt/index.d.ts\" />\n\nimport { HASH } from \"./util/hash\";\nimport { E_KEYNOTFOUND } from \"./util/error\";\n\n// A deterministic hash map based on CloseTable from https://github.com/jorendorff/dht\n\n// @ts-ignore: decorator\n@inline const INITIAL_CAPACITY = 4;\n\n// @ts-ignore: decorator\n@inline const FILL_FACTOR_N = 8;\n\n// @ts-ignore: decorator\n@inline const FILL_FACTOR_D = 3;\n\n// @ts-ignore: decorator\n@inline const FREE_FACTOR_N = 3;\n\n// @ts-ignore: decorator\n@inline const FREE_FACTOR_D = 4;\n\n/** Structure of a map entry. */\n@unmanaged class MapEntry<K,V> {\n key: K;\n value: V;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\n// @ts-ignore: decorator\n@inline const EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\n// @ts-ignore: decorator\n@inline const BUCKET_SIZE = sizeof<usize>();\n\n/** Computes the alignment of an entry. */\n// @ts-ignore: decorator\n@inline\nfunction ENTRY_ALIGN<K,V>(): usize {\n // can align to 4 instead of 8 if 32-bit and K/V is <= 32-bits\n const maxkv = sizeof<K>() > sizeof<V>() ? sizeof<K>() : sizeof<V>();\n const align = (maxkv > sizeof<usize>() ? maxkv : sizeof<usize>()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n// @ts-ignore: decorator\n@inline\nfunction ENTRY_SIZE<K,V>(): usize {\n const align = ENTRY_ALIGN<K,V>();\n const size = (offsetof<MapEntry<K,V>>() + align) & ~align;\n return size;\n}\n\nexport class Map<K,V> {\n\n // buckets referencing their respective first entry, usize[bucketsMask + 1]\n private buckets: ArrayBuffer = new ArrayBuffer(INITIAL_CAPACITY * <i32>BUCKET_SIZE);\n private bucketsMask: u32 = INITIAL_CAPACITY - 1;\n\n // entries in insertion order, MapEntry<K,V>[entriesCapacity]\n private entries: ArrayBuffer = new ArrayBuffer(INITIAL_CAPACITY * <i32>ENTRY_SIZE<K,V>());\n private entriesCapacity: i32 = INITIAL_CAPACITY;\n private entriesOffset: i32 = 0;\n private entriesCount: i32 = 0;\n\n constructor() {\n /* nop */\n }\n\n get size(): i32 {\n return this.entriesCount;\n }\n\n clear(): void {\n this.buckets = new ArrayBuffer(INITIAL_CAPACITY * <i32>BUCKET_SIZE);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n this.entries = new ArrayBuffer(INITIAL_CAPACITY * <i32>ENTRY_SIZE<K,V>());\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): MapEntry<K,V> | null {\n let entry = load<MapEntry<K,V>>( // unmanaged!\n changetype<usize>(this.buckets) + <usize>(hashCode & this.bucketsMask) * BUCKET_SIZE\n );\n while (entry) {\n let taggedNext = entry.taggedNext;\n if (!(taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype<MapEntry<K,V>>(taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH<K>(key)) != null;\n }\n\n @operator(\"[]\")\n get(key: K): V {\n let entry = this.find(key, HASH<K>(key));\n if (!entry) throw new Error(E_KEYNOTFOUND); // cannot represent `undefined`\n return entry.value;\n }\n\n @operator(\"[]=\")\n set(key: K, value: V): this {\n let hashCode = HASH<K>(key);\n let entry = this.find(key, hashCode); // unmanaged!\n if (entry) {\n entry.value = value;\n if (isManaged<V>()) {\n __link(changetype<usize>(this), changetype<usize>(value), true);\n }\n } else {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < this.entriesCapacity * FREE_FACTOR_N / FREE_FACTOR_D\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype<MapEntry<K,V>>(changetype<usize>(entries) + <usize>(this.entriesOffset++) * ENTRY_SIZE<K,V>());\n // link with the map\n entry.key = key;\n if (isManaged<K>()) {\n __link(changetype<usize>(this), changetype<usize>(key), true);\n }\n entry.value = value;\n if (isManaged<V>()) {\n __link(changetype<usize>(this), changetype<usize>(value), true);\n }\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype<usize>(this.buckets) + <usize>(hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load<usize>(bucketPtrBase);\n store<usize>(bucketPtrBase, changetype<usize>(entry));\n }\n return this;\n }\n\n delete(key: K): bool {\n let entry = this.find(key, HASH<K>(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n let halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max<u32>(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < this.entriesCapacity * FREE_FACTOR_N / FREE_FACTOR_D\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n let newBucketsCapacity = <i32>(newBucketsMask + 1);\n let newBuckets = new ArrayBuffer(newBucketsCapacity * <i32>BUCKET_SIZE);\n let newEntriesCapacity = newBucketsCapacity * FILL_FACTOR_N / FILL_FACTOR_D;\n let newEntries = new ArrayBuffer(newEntriesCapacity * <i32>ENTRY_SIZE<K,V>());\n\n // copy old entries to new entries\n let oldPtr = changetype<usize>(this.entries);\n let oldEnd = oldPtr + <usize>this.entriesOffset * ENTRY_SIZE<K,V>();\n let newPtr = changetype<usize>(newEntries);\n while (oldPtr != oldEnd) {\n let oldEntry = changetype<MapEntry<K,V>>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype<MapEntry<K,V>>(newPtr);\n let oldEntryKey = oldEntry.key;\n newEntry.key = oldEntryKey;\n newEntry.value = oldEntry.value;\n let newBucketIndex = HASH<K>(oldEntryKey) & newBucketsMask;\n let newBucketPtrBase = changetype<usize>(newBuckets) + <usize>newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load<usize>(newBucketPtrBase);\n store<usize>(newBucketPtrBase, newPtr);\n newPtr += ENTRY_SIZE<K,V>();\n }\n oldPtr += ENTRY_SIZE<K,V>();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n keys(): K[] {\n // FIXME: this is preliminary, needs iterators/closures\n let start = changetype<usize>(this.entries);\n let size = this.entriesOffset;\n let keys = new Array<K>(size);\n let length = 0;\n for (let i = 0; i < size; ++i) {\n let entry = changetype<MapEntry<K,V>>(start + <usize>i * ENTRY_SIZE<K,V>());\n if (!(entry.taggedNext & EMPTY)) {\n unchecked(keys[length++] = entry.key);\n }\n }\n keys.length = length;\n return keys;\n }\n\n values(): V[] {\n // FIXME: this is preliminary, needs iterators/closures\n let start = changetype<usize>(this.entries);\n let size = this.entriesOffset;\n let values = new Array<V>(size);\n let length = 0;\n for (let i = 0; i < size; ++i) {\n let entry = changetype<MapEntry<K,V>>(start + <usize>i * ENTRY_SIZE<K,V>());\n if (!(entry.taggedNext & EMPTY)) {\n unchecked(values[length++] = entry.value);\n }\n }\n values.length = length;\n return values;\n }\n\n toString(): string {\n return \"[object Map]\";\n }\n\n // RT integration\n\n @unsafe private __visit(cookie: u32): void {\n __visit(changetype<usize>(this.buckets), cookie);\n let entries = changetype<usize>(this.entries);\n if (isManaged<K>() || isManaged<V>()) {\n let cur = entries;\n let end = cur + <usize>this.entriesOffset * ENTRY_SIZE<K,V>();\n while (cur < end) {\n let entry = changetype<MapEntry<K,V>>(cur);\n if (!(entry.taggedNext & EMPTY)) {\n if (isManaged<K>()) {\n let val = changetype<usize>(entry.key);\n if (isNullable<K>()) {\n if (val) __visit(val, cookie);\n } else __visit(val, cookie);\n }\n if (isManaged<V>()) {\n let val = changetype<usize>(entry.value);\n if (isNullable<V>()) {\n if (val) __visit(val, cookie);\n } else __visit(val, cookie);\n }\n }\n cur += ENTRY_SIZE<K,V>();\n }\n }\n __visit(entries, cookie);\n }\n}\n","/**\n * DataFrame - Main tabular data structure with columnar storage\n */\n\nimport { NumericColumn, DataType } from '../core/numeric-column';\nimport { StringColumn } from '../core/string-column';\nimport { Schema, ColumnType, isNumericType, columnTypeToDataType } from '../core/schema';\n\n/** Union type for column storage */\n@final\nclass ColumnEntry {\n numericColumn: NumericColumn | null;\n stringColumn: StringColumn | null;\n columnType: ColumnType;\n\n constructor(colType: ColumnType) {\n this.numericColumn = null;\n this.stringColumn = null;\n this.columnType = colType;\n }\n}\n\n@final\nexport class DataFrame {\n /** Column storage map: name -> ColumnEntry */\n private columns: Map<string, ColumnEntry>;\n /** Column order */\n private columnOrder: string[];\n /** Schema */\n private _schema: Schema;\n /** Number of rows */\n private _rowCount: i32;\n\n constructor() {\n this.columns = new Map<string, ColumnEntry>();\n this.columnOrder = [];\n this._schema = new Schema();\n this._rowCount = 0;\n }\n\n /** Get the number of rows */\n get rowCount(): i32 {\n return this._rowCount;\n }\n\n /** Get the number of columns */\n get columnCount(): i32 {\n return this.columnOrder.length;\n }\n\n /** Get the schema */\n get schema(): Schema {\n return this._schema;\n }\n\n /** Get column names */\n getColumnNames(): string[] {\n return this.columnOrder.slice(0);\n }\n\n /** Check if column exists */\n hasColumn(name: string): bool {\n return this.columns.has(name);\n }\n\n /** Get column type */\n getColumnType(name: string): ColumnType {\n if (!this.columns.has(name)) return ColumnType.Float64;\n return this.columns.get(name).columnType;\n }\n\n /** Add an Int32 column */\n addInt32Column(name: string, column: NumericColumn): void {\n this.addNumericColumn(name, column, ColumnType.Int32);\n }\n\n /** Add an Int64 column */\n addInt64Column(name: string, column: NumericColumn): void {\n this.addNumericColumn(name, column, ColumnType.Int64);\n }\n\n /** Add a Float32 column */\n addFloat32Column(name: string, column: NumericColumn): void {\n this.addNumericColumn(name, column, ColumnType.Float32);\n }\n\n /** Add a Float64 column */\n addFloat64Column(name: string, column: NumericColumn): void {\n this.addNumericColumn(name, column, ColumnType.Float64);\n }\n\n /** Internal: add a numeric column */\n private addNumericColumn(name: string, column: NumericColumn, colType: ColumnType): void {\n // Validate row count\n if (this._rowCount === 0) {\n this._rowCount = column.length;\n } else if (column.length !== this._rowCount) {\n throw new Error('Column length mismatch');\n }\n\n // Create entry\n const entry = new ColumnEntry(colType);\n entry.numericColumn = column;\n\n // Store\n this.columns.set(name, entry);\n this.columnOrder.push(name);\n this._schema.addField(name, colType, true);\n }\n\n /** Add a String column */\n addStringColumn(name: string, column: StringColumn): void {\n // Validate row count\n if (this._rowCount === 0) {\n this._rowCount = column.length;\n } else if (column.length !== this._rowCount) {\n throw new Error('Column length mismatch');\n }\n\n // Create entry\n const entry = new ColumnEntry(ColumnType.String);\n entry.stringColumn = column;\n\n // Store\n this.columns.set(name, entry);\n this.columnOrder.push(name);\n this._schema.addField(name, ColumnType.String, true);\n }\n\n /** Get a numeric column by name */\n getNumericColumn(name: string): NumericColumn | null {\n if (!this.columns.has(name)) return null;\n const entry = this.columns.get(name);\n return entry.numericColumn;\n }\n\n /** Get a string column by name */\n getStringColumn(name: string): StringColumn | null {\n if (!this.columns.has(name)) return null;\n const entry = this.columns.get(name);\n return entry.stringColumn;\n }\n\n /** Get column data pointer (for zero-copy access from JS) */\n getColumnDataPtr(name: string): usize {\n if (!this.columns.has(name)) return 0;\n const entry = this.columns.get(name);\n if (entry.numericColumn !== null) {\n return entry.numericColumn!.dataPtr;\n } else if (entry.stringColumn !== null) {\n return entry.stringColumn!.dataPtr;\n }\n return 0;\n }\n\n /** Get column validity bitmap pointer */\n getColumnValidityPtr(name: string): usize {\n if (!this.columns.has(name)) return 0;\n const entry = this.columns.get(name);\n if (entry.numericColumn !== null) {\n return entry.numericColumn!.validity.dataPtr;\n } else if (entry.stringColumn !== null) {\n return entry.stringColumn!.validity.dataPtr;\n }\n return 0;\n }\n\n /** Remove a column */\n removeColumn(name: string): bool {\n if (!this.columns.has(name)) return false;\n\n const entry = this.columns.get(name);\n if (entry.numericColumn !== null) {\n entry.numericColumn!.free();\n }\n if (entry.stringColumn !== null) {\n entry.stringColumn!.free();\n }\n\n this.columns.delete(name);\n\n // Remove from order\n const idx = this.columnOrder.indexOf(name);\n if (idx >= 0) {\n this.columnOrder.splice(idx, 1);\n }\n\n return true;\n }\n\n /** Select specific columns into a new DataFrame */\n select(columnNames: string[]): DataFrame {\n const result = new DataFrame();\n\n for (let i = 0; i < columnNames.length; i++) {\n const name = columnNames[i];\n if (!this.columns.has(name)) continue;\n\n const entry = this.columns.get(name);\n if (entry.numericColumn !== null) {\n const cloned = entry.numericColumn!.clone();\n result.addNumericColumn(name, cloned, entry.columnType);\n } else if (entry.stringColumn !== null) {\n const cloned = entry.stringColumn!.clone();\n result.addStringColumn(name, cloned);\n }\n }\n\n return result;\n }\n\n /** Slice rows into a new DataFrame */\n slice(start: i32, end: i32): DataFrame {\n const result = new DataFrame();\n\n for (let i = 0; i < this.columnOrder.length; i++) {\n const name = this.columnOrder[i];\n const entry = this.columns.get(name);\n\n if (entry.numericColumn !== null) {\n const sliced = entry.numericColumn!.slice(start, end);\n result.addNumericColumn(name, sliced, entry.columnType);\n }\n // String slicing would need separate implementation\n }\n\n return result;\n }\n\n /** Clone the entire DataFrame */\n clone(): DataFrame {\n const result = new DataFrame();\n\n for (let i = 0; i < this.columnOrder.length; i++) {\n const name = this.columnOrder[i];\n const entry = this.columns.get(name);\n\n if (entry.numericColumn !== null) {\n const cloned = entry.numericColumn!.clone();\n result.addNumericColumn(name, cloned, entry.columnType);\n } else if (entry.stringColumn !== null) {\n const cloned = entry.stringColumn!.clone();\n result.addStringColumn(name, cloned);\n }\n }\n\n return result;\n }\n\n /** Free all column memory */\n free(): void {\n const names = this.columnOrder.slice(0);\n for (let i = 0; i < names.length; i++) {\n this.removeColumn(names[i]);\n }\n }\n}\n\n/** Create an empty DataFrame with a specified row count */\nexport function createEmptyDataFrame(rowCount: i32): DataFrame {\n const df = new DataFrame();\n // Set row count directly - this is a bit of a hack but needed for building\n // We use a workaround by adding and removing a dummy column\n if (rowCount > 0) {\n const dummy = new NumericColumn(rowCount, DataType.Int32);\n df.addInt32Column('__dummy__', dummy);\n df.removeColumn('__dummy__');\n }\n return df;\n}\n","/**\n * DataFrame Builder - Fluent API for constructing DataFrames\n */\n\nimport { DataFrame } from './dataframe';\nimport { NumericColumn, DataType } from '../core/numeric-column';\nimport { StringColumn } from '../core/string-column';\nimport { ColumnType } from '../core/schema';\n\n@final\nexport class DataFrameBuilder {\n private df: DataFrame;\n private _rowCount: i32;\n private currentRowIndex: i32;\n\n constructor(rowCount: i32) {\n this.df = new DataFrame();\n this._rowCount = rowCount;\n this.currentRowIndex = 0;\n }\n\n /** Add an Int32 column with initial values from a pointer */\n addInt32ColumnFromPtr(name: string, dataPtr: usize, length: i32): DataFrameBuilder {\n if (length !== this._rowCount) {\n throw new Error('Column length mismatch');\n }\n const col = new NumericColumn(length, DataType.Int32);\n col.copyFromBuffer(dataPtr, length);\n this.df.addInt32Column(name, col);\n return this;\n }\n\n /** Add an Int64 column with initial values from a pointer */\n addInt64ColumnFromPtr(name: string, dataPtr: usize, length: i32): DataFrameBuilder {\n if (length !== this._rowCount) {\n throw new Error('Column length mismatch');\n }\n const col = new NumericColumn(length, DataType.Int64);\n col.copyFromBuffer(dataPtr, length);\n this.df.addInt64Column(name, col);\n return this;\n }\n\n /** Add a Float32 column with initial values from a pointer */\n addFloat32ColumnFromPtr(name: string, dataPtr: usize, length: i32): DataFrameBuilder {\n if (length !== this._rowCount) {\n throw new Error('Column length mismatch');\n }\n const col = new NumericColumn(length, DataType.Float32);\n col.copyFromBuffer(dataPtr, length);\n this.df.addFloat32Column(name, col);\n return this;\n }\n\n /** Add a Float64 column with initial values from a pointer */\n addFloat64ColumnFromPtr(name: string, dataPtr: usize, length: i32): DataFrameBuilder {\n if (length !== this._rowCount) {\n throw new Error('Column length mismatch');\n }\n const col = new NumericColumn(length, DataType.Float64);\n col.copyFromBuffer(dataPtr, length);\n this.df.addFloat64Column(name, col);\n return this;\n }\n\n /** Add an empty Int32 column */\n addInt32Column(name: string): DataFrameBuilder {\n const col = new NumericColumn(this._rowCount, DataType.Int32);\n this.df.addInt32Column(name, col);\n return this;\n }\n\n /** Add an empty Int64 column */\n addInt64Column(name: string): DataFrameBuilder {\n const col = new NumericColumn(this._rowCount, DataType.Int64);\n this.df.addInt64Column(name, col);\n return this;\n }\n\n /** Add an empty Float32 column */\n addFloat32Column(name: string): DataFrameBuilder {\n const col = new NumericColumn(this._rowCount, DataType.Float32);\n this.df.addFloat32Column(name, col);\n return this;\n }\n\n /** Add an empty Float64 column */\n addFloat64Column(name: string): DataFrameBuilder {\n const col = new NumericColumn(this._rowCount, DataType.Float64);\n this.df.addFloat64Column(name, col);\n return this;\n }\n\n /** Add an empty String column */\n addStringColumn(name: string, estimatedCharCapacity: i32 = 0): DataFrameBuilder {\n const col = new StringColumn(this._rowCount, estimatedCharCapacity);\n this.df.addStringColumn(name, col);\n return this;\n }\n\n /** Build and return the DataFrame */\n build(): DataFrame {\n return this.df;\n }\n\n /** Get the row count */\n get rowCount(): i32 {\n return this._rowCount;\n }\n}\n\n/** Create a new DataFrame builder */\nexport function createDataFrameBuilder(rowCount: i32): DataFrameBuilder {\n return new DataFrameBuilder(rowCount);\n}\n\n/**\n * Build a DataFrame from column arrays passed from JS\n * This is the main entry point for creating DataFrames from JavaScript\n */\nexport function buildDataFrameFromArrays(\n rowCount: i32,\n columnNames: string[],\n columnTypes: i32[],\n dataPtrs: usize[]\n): DataFrame {\n const builder = new DataFrameBuilder(rowCount);\n\n for (let i = 0; i < columnNames.length; i++) {\n const name = columnNames[i];\n const colType = columnTypes[i] as ColumnType;\n const dataPtr = dataPtrs[i];\n\n switch (colType) {\n case ColumnType.Int32:\n builder.addInt32ColumnFromPtr(name, dataPtr, rowCount);\n break;\n case ColumnType.Int64:\n builder.addInt64ColumnFromPtr(name, dataPtr, rowCount);\n break;\n case ColumnType.Float32:\n builder.addFloat32ColumnFromPtr(name, dataPtr, rowCount);\n break;\n case ColumnType.Float64:\n builder.addFloat64ColumnFromPtr(name, dataPtr, rowCount);\n break;\n // String columns need special handling\n default:\n break;\n }\n }\n\n return builder.build();\n}\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","/// <reference path=\"./rt/index.d.ts\" />\n\nimport { BLOCK_MAXSIZE } from \"./rt/common\";\nimport { Runtime } from \"shared/runtime\";\nimport { COMPARATOR, SORT } from \"./util/sort\";\nimport { REVERSE, FILL } from \"./util/bytes\";\nimport { joinBooleanArray, joinIntegerArray, joinFloatArray, joinStringArray, joinReferenceArray } from \"./util/string\";\nimport { idof, isArray as builtin_isArray } from \"./builtins\";\nimport { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_EMPTYARRAY, E_HOLEYARRAY } from \"./util/error\";\n\n// @ts-ignore: decorator\n@inline @lazy const MIN_SIZE: usize = 8;\n\n/** Ensures that the given array has _at least_ the specified backing size. */\nfunction ensureCapacity(array: usize, newSize: usize, alignLog2: u32, canGrow: bool = true): void {\n // Depends on the fact that Arrays mimic ArrayBufferView\n let oldCapacity = <usize>changetype<ArrayBufferView>(array).byteLength;\n if (newSize > oldCapacity >>> alignLog2) {\n if (newSize > BLOCK_MAXSIZE >>> alignLog2) throw new RangeError(E_INVALIDLENGTH);\n let oldData = changetype<usize>(changetype<ArrayBufferView>(array).buffer);\n // Grows old capacity by factor of two.\n // Make sure we don't reach BLOCK_MAXSIZE for new growed capacity.\n let newCapacity = max(newSize, MIN_SIZE) << alignLog2;\n if (canGrow) newCapacity = max(min(oldCapacity << 1, BLOCK_MAXSIZE), newCapacity);\n let newData = __renew(oldData, newCapacity);\n // __new / __renew already init memory range as zeros in Incremental runtime.\n // So try to avoid this.\n if (ASC_RUNTIME != Runtime.Incremental) {\n memory.fill(newData + oldCapacity, 0, newCapacity - oldCapacity);\n }\n if (newData != oldData) { // oldData has been free'd\n store<usize>(array, newData, offsetof<ArrayBufferView>(\"buffer\"));\n store<usize>(array, newData, offsetof<ArrayBufferView>(\"dataStart\"));\n __link(array, changetype<usize>(newData), false);\n }\n store<u32>(array, <u32>newCapacity, offsetof<ArrayBufferView>(\"byteLength\"));\n }\n}\n\nexport class Array<T> {\n [key: number]: T;\n\n // Mimicking ArrayBufferView isn't strictly necessary here but is done to allow glue code\n // to work with typed and normal arrays interchangeably. Technically, normal arrays do not need\n // `dataStart` (equals `buffer`) and `byteLength` (equals computed `buffer.byteLength`), but the\n // block is 16 bytes anyway so it's fine to have a couple extra fields in there.\n\n private buffer: ArrayBuffer;\n @unsafe readonly dataStart: usize;\n private byteLength: i32; // Uses here as capacity\n\n // Also note that Array<T> with non-nullable T must guard against uninitialized null values\n // whenever an element is accessed. Otherwise, the compiler wouldn't be able to guarantee\n // type-safety anymore. For lack of a better word, such an array is \"holey\".\n\n private length_: i32;\n\n static isArray<U>(value: U): bool {\n return isReference<U>() ? changetype<usize>(value) != 0 && builtin_isArray(value) : false;\n }\n\n static create<T>(capacity: i32 = 0): Array<T> {\n WARNING(\"'Array.create' is deprecated. Use 'new Array' instead, making sure initial elements are initialized.\");\n let array = new Array<T>(capacity);\n array.length = 0;\n return array;\n }\n\n constructor(length: i32 = 0) {\n if (<u32>length > <u32>BLOCK_MAXSIZE >>> alignof<T>()) throw new RangeError(E_INVALIDLENGTH);\n // reserve capacity for at least MIN_SIZE elements\n let bufferSize = max(<usize>length, MIN_SIZE) << alignof<T>();\n let buffer = changetype<ArrayBuffer>(__new(bufferSize, idof<ArrayBuffer>()));\n if (ASC_RUNTIME != Runtime.Incremental) {\n memory.fill(changetype<usize>(buffer), 0, bufferSize);\n }\n this.buffer = buffer; // links\n this.dataStart = changetype<usize>(buffer);\n this.byteLength = <i32>bufferSize;\n this.length_ = length;\n }\n\n get length(): i32 {\n return this.length_;\n }\n\n set length(newLength: i32) {\n ensureCapacity(changetype<usize>(this), newLength, alignof<T>(), false);\n this.length_ = newLength;\n }\n\n every(fn: (value: T, index: i32, array: Array<T>) => bool): bool {\n for (let i = 0, len = this.length_; i < min(len, this.length_); ++i) {\n if (!fn(load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this)) return false;\n }\n return true;\n }\n\n findIndex(fn: (value: T, index: i32, array: Array<T>) => bool): i32 {\n for (let i = 0, len = this.length_; i < min(len, this.length_); ++i) {\n if (fn(load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this)) return i;\n }\n return -1;\n }\n\n findLastIndex(fn: (value: T, index: i32, array: Array<T>) => bool): i32 {\n for (let i = this.length_ - 1; i >= 0; --i) {\n if (fn(load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this)) return i;\n }\n return -1;\n }\n\n @operator(\"[]\") private __get(index: i32): T {\n if (<u32>index >= <u32>this.length_) throw new RangeError(E_INDEXOUTOFRANGE);\n let value = load<T>(this.dataStart + (<usize>index << alignof<T>()));\n if (isReference<T>()) {\n if (!isNullable<T>()) {\n if (!changetype<usize>(value)) throw new Error(E_HOLEYARRAY);\n }\n }\n return value;\n }\n\n @unsafe @operator(\"{}\") private __uget(index: i32): T {\n return load<T>(this.dataStart + (<usize>index << alignof<T>()));\n }\n\n @operator(\"[]=\") private __set(index: i32, value: T): void {\n if (<u32>index >= <u32>this.length_) {\n if (index < 0) throw new RangeError(E_INDEXOUTOFRANGE);\n ensureCapacity(changetype<usize>(this), index + 1, alignof<T>());\n this.length_ = index + 1;\n }\n store<T>(this.dataStart + (<usize>index << alignof<T>()), value);\n if (isManaged<T>()) {\n __link(changetype<usize>(this), changetype<usize>(value), true);\n }\n }\n\n at(index: i32): T {\n let len = this.length_;\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n let value = load<T>(this.dataStart + (<usize>index << alignof<T>()));\n if (isReference<T>()) {\n if (!isNullable<T>()) {\n if (!changetype<usize>(value)) throw new Error(E_HOLEYARRAY);\n }\n }\n return value;\n }\n\n fill(value: T, start: i32 = 0, end: i32 = i32.MAX_VALUE): Array<T> {\n if (isManaged<T>()) {\n FILL<usize>(this.dataStart, this.length_, changetype<usize>(value), start, end);\n __link(changetype<usize>(this), changetype<usize>(value), false);\n } else {\n FILL<T>(this.dataStart, this.length_, value, start, end);\n }\n return this;\n }\n\n includes(value: T, fromIndex: i32 = 0): bool {\n if (isFloat<T>()) {\n let len = this.length_;\n if (len == 0 || fromIndex >= len) return false;\n if (fromIndex < 0) fromIndex = max(len + fromIndex, 0);\n let ptr = this.dataStart;\n while (fromIndex < len) {\n let elem = load<T>(ptr + (<usize>fromIndex << alignof<T>()));\n // @ts-ignore\n if (elem == value || isNaN(elem) & isNaN(value)) return true;\n ++fromIndex;\n }\n return false;\n } else {\n return this.indexOf(value, fromIndex) >= 0;\n }\n }\n\n indexOf(value: T, fromIndex: i32 = 0): i32 {\n let len = this.length_;\n if (len == 0 || fromIndex >= len) return -1;\n if (fromIndex < 0) fromIndex = max(len + fromIndex, 0);\n let ptr = this.dataStart;\n while (fromIndex < len) {\n if (load<T>(ptr + (<usize>fromIndex << alignof<T>())) == value) return fromIndex;\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(value: T, fromIndex: i32 = this.length_): i32 {\n let len = this.length_;\n if (len == 0) return -1;\n if (fromIndex < 0) fromIndex = len + fromIndex;\n else if (fromIndex >= len) fromIndex = len - 1;\n let ptr = this.dataStart;\n while (fromIndex >= 0) {\n if (load<T>(ptr + (<usize>fromIndex << alignof<T>())) == value) return fromIndex;\n --fromIndex;\n }\n return -1;\n }\n\n push(value: T): i32 {\n let oldLen = this.length_;\n let len = oldLen + 1;\n ensureCapacity(changetype<usize>(this), len, alignof<T>());\n if (isManaged<T>()) {\n store<usize>(this.dataStart + (<usize>oldLen << alignof<T>()), changetype<usize>(value));\n __link(changetype<usize>(this), changetype<usize>(value), true);\n } else {\n store<T>(this.dataStart + (<usize>oldLen << alignof<T>()), value);\n }\n this.length_ = len;\n return len;\n }\n\n concat(other: Array<T>): Array<T> {\n let thisLen = this.length_;\n let otherLen = other.length_;\n let outLen = thisLen + otherLen;\n if (<u32>outLen > <u32>BLOCK_MAXSIZE >>> alignof<T>()) throw new Error(E_INVALIDLENGTH);\n let out = changetype<Array<T>>(__newArray(outLen, alignof<T>(), idof<Array<T>>()));\n let outStart = out.dataStart;\n let thisSize = <usize>thisLen << alignof<T>();\n if (isManaged<T>()) {\n let thisStart = this.dataStart;\n for (let offset: usize = 0; offset < thisSize; offset += sizeof<T>()) {\n let ref = load<usize>(thisStart + offset);\n store<usize>(outStart + offset, ref);\n __link(changetype<usize>(out), ref, true);\n }\n outStart += thisSize;\n let otherStart = other.dataStart;\n let otherSize = <usize>otherLen << alignof<T>();\n for (let offset: usize = 0; offset < otherSize; offset += sizeof<T>()) {\n let ref = load<usize>(otherStart + offset);\n store<usize>(outStart + offset, ref);\n __link(changetype<usize>(out), ref, true);\n }\n } else {\n memory.copy(outStart, this.dataStart, thisSize);\n memory.copy(outStart + thisSize, other.dataStart, <usize>otherLen << alignof<T>());\n }\n return out;\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): Array<T> {\n let ptr = this.dataStart;\n let len = this.length_;\n\n end = min<i32>(end, len);\n\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( // is memmove\n ptr + (<usize>to << alignof<T>()),\n ptr + (<usize>from << alignof<T>()),\n <usize>count << alignof<T>()\n );\n return this;\n }\n\n pop(): T {\n let len = this.length_;\n if (len < 1) throw new RangeError(E_EMPTYARRAY);\n let val = load<T>(this.dataStart + (<usize>(--len) << alignof<T>()));\n this.length_ = len;\n return val;\n }\n\n forEach(fn: (value: T, index: i32, array: Array<T>) => void): void {\n for (let i = 0, len = this.length_; i < min(len, this.length_); ++i) {\n fn(load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this);\n }\n }\n\n map<U>(fn: (value: T, index: i32, array: Array<T>) => U): Array<U> {\n let len = this.length_;\n let out = changetype<Array<U>>(__newArray(len, alignof<U>(), idof<Array<U>>()));\n let outStart = out.dataStart;\n for (let i = 0; i < min(len, this.length_); ++i) {\n let result = fn(load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this);\n store<U>(outStart + (<usize>i << alignof<U>()), result);\n if (isManaged<U>()) {\n __link(changetype<usize>(out), changetype<usize>(result), true);\n }\n }\n return out;\n }\n\n filter(fn: (value: T, index: i32, array: Array<T>) => bool): Array<T> {\n let result = changetype<Array<T>>(__newArray(0, alignof<T>(), idof<Array<T>>()));\n for (let i = 0, len = this.length_; i < min(len, this.length_); ++i) {\n let value = load<T>(this.dataStart + (<usize>i << alignof<T>()));\n if (fn(value, i, this)) result.push(value);\n }\n return result;\n }\n\n reduce<U>(\n fn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array<T>) => U,\n initialValue: U\n ): U {\n let acc = initialValue;\n for (let i = 0, len = this.length_; i < min(len, this.length_); ++i) {\n acc = fn(acc, load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this);\n }\n return acc;\n }\n\n reduceRight<U>(\n fn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array<T>) => U,\n initialValue: U\n ): U {\n let acc = initialValue;\n for (let i = this.length_ - 1; i >= 0; --i) {\n acc = fn(acc, load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this);\n }\n return acc;\n }\n\n shift(): T {\n let len = this.length_;\n if (len < 1) throw new RangeError(E_EMPTYARRAY);\n let base = this.dataStart;\n let element = load<T>(base);\n let lastIndex = len - 1;\n memory.copy(\n base,\n base + sizeof<T>(),\n <usize>lastIndex << alignof<T>()\n );\n if (isReference<T>()) {\n store<usize>(base + (<usize>lastIndex << alignof<T>()), 0);\n } else {\n // @ts-ignore\n store<T>(base + (<usize>lastIndex << alignof<T>()), <T>0);\n }\n this.length_ = lastIndex;\n return element;\n }\n\n some(fn: (value: T, index: i32, array: Array<T>) => bool): bool {\n for (let i = 0, len = this.length_; i < min(len, this.length_); ++i) {\n if (fn(load<T>(this.dataStart + (<usize>i << alignof<T>())), i, this)) return true;\n }\n return false;\n }\n\n unshift(value: T): i32 {\n let len = this.length_ + 1;\n ensureCapacity(changetype<usize>(this), len, alignof<T>());\n let ptr = this.dataStart;\n memory.copy(\n ptr + sizeof<T>(),\n ptr,\n <usize>(len - 1) << alignof<T>()\n );\n store<T>(ptr, value);\n if (isManaged<T>()) {\n __link(changetype<usize>(this), changetype<usize>(value), true);\n }\n this.length_ = len;\n return len;\n }\n\n slice(start: i32 = 0, end: i32 = i32.MAX_VALUE): Array<T> {\n let len = this.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 = changetype<Array<T>>(__newArray(len, alignof<T>(), idof<Array<T>>()));\n let sliceBase = slice.dataStart;\n let thisBase = this.dataStart + (<usize>start << alignof<T>());\n if (isManaged<T>()) {\n let off = <usize>0;\n let end = <usize>len << alignof<usize>();\n while (off < end) {\n let ref = load<usize>(thisBase + off);\n store<usize>(sliceBase + off, ref);\n __link(changetype<usize>(slice), ref, true);\n off += sizeof<usize>();\n }\n } else {\n memory.copy(sliceBase, thisBase, len << alignof<T>());\n }\n return slice;\n }\n\n splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): Array<T> {\n let len = this.length_;\n start = start < 0 ? max<i32>(len + start, 0) : min<i32>(start, len);\n deleteCount = max<i32>(min<i32>(deleteCount, len - start), 0);\n let result = changetype<Array<T>>(__newArray(deleteCount, alignof<T>(), idof<Array<T>>()));\n let resultStart = result.dataStart;\n let thisStart = this.dataStart;\n let thisBase = thisStart + (<usize>start << alignof<T>());\n memory.copy(\n resultStart,\n thisBase,\n <usize>deleteCount << alignof<T>()\n );\n let offset = start + deleteCount;\n if (len != offset) {\n memory.copy(\n thisBase,\n thisStart + (<usize>offset << alignof<T>()),\n <usize>(len - offset) << alignof<T>()\n );\n }\n this.length_ = len - deleteCount;\n return result;\n }\n\n reverse(): Array<T> {\n REVERSE<T>(this.dataStart, this.length_);\n return this;\n }\n\n sort(comparator: (a: T, b: T) => i32 = COMPARATOR<T>()): Array<T> {\n SORT<T>(this.dataStart, this.length_, comparator);\n return this;\n }\n\n join(separator: string = \",\"): string {\n let ptr = this.dataStart;\n let len = this.length_;\n if (isBoolean<T>()) return joinBooleanArray(ptr, len, separator);\n if (isInteger<T>()) return joinIntegerArray<T>(ptr, len, separator);\n if (isFloat<T>()) return joinFloatArray<T>(ptr, len, separator);\n\n if (ASC_SHRINK_LEVEL < 1) {\n if (isString<T>()) return joinStringArray(ptr, len, separator);\n }\n // For rest objects and arrays use general join routine\n if (isReference<T>()) return joinReferenceArray<T>(ptr, len, separator);\n ERROR(\"unspported element type\");\n return <string>unreachable();\n }\n\n flat(): T {\n if (!isArray<T>()) {\n ERROR(\"Cannot call flat() on Array<T> where T is not an Array.\");\n }\n // Get the length and data start values\n let ptr = this.dataStart;\n let len = this.length_;\n\n // calculate the end size with an initial pass\n let size = 0;\n for (let i = 0; i < len; ++i) {\n let child = load<usize>(ptr + (i << alignof<T>()));\n size += child == 0 ? 0 : load<i32>(child, offsetof<T>(\"length_\"));\n }\n\n // calculate the byteLength of the resulting backing ArrayBuffer\n const align = alignof<valueof<T>>();\n let byteLength = <usize>size << align;\n let outBuffer = changetype<ArrayBuffer>(__new(byteLength, idof<ArrayBuffer>()));\n\n // create the return value and initialize it\n let outArray = changetype<T>(__new(offsetof<T>(), idof<T>()));\n store<i32>(changetype<usize>(outArray), size, offsetof<T>(\"length_\"));\n\n // byteLength, dataStart, and buffer are all readonly\n store<i32>(changetype<usize>(outArray), byteLength, offsetof<T>(\"byteLength\"));\n store<usize>(changetype<usize>(outArray), changetype<usize>(outBuffer), offsetof<T>(\"dataStart\"));\n store<usize>(changetype<usize>(outArray), changetype<usize>(outBuffer), offsetof<T>(\"buffer\"));\n __link(changetype<usize>(outArray), changetype<usize>(outBuffer), false);\n\n // set the elements\n let resultOffset: usize = 0;\n for (let i = 0; i < len; ++i) { // for each child\n let child = load<usize>(ptr + (<usize>i << alignof<T>()));\n\n // ignore null arrays\n if (!child) continue;\n\n // copy the underlying buffer data to the result buffer\n let childDataLength = <usize>load<i32>(child, offsetof<T>(\"length_\")) << align;\n memory.copy(\n changetype<usize>(outBuffer) + resultOffset,\n load<usize>(child, offsetof<T>(\"dataStart\")),\n childDataLength\n );\n\n // advance the result length\n resultOffset += childDataLength;\n }\n\n // if the `valueof<T>` type is managed, we must link each reference\n if (isManaged<valueof<T>>()) {\n for (let i = 0; i < size; ++i) {\n let ref = load<usize>(changetype<usize>(outBuffer) + (<usize>i << usize(alignof<valueof<T>>())));\n __link(changetype<usize>(outBuffer), ref, true);\n }\n }\n\n return outArray;\n }\n\n toString(): string {\n return this.join();\n }\n\n // RT integration\n\n @unsafe private __visit(cookie: u32): void {\n if (isManaged<T>()) {\n let cur = this.dataStart;\n let end = cur + (<usize>this.length_ << alignof<T>());\n while (cur < end) {\n let val = load<usize>(cur);\n if (val) __visit(val, cookie);\n cur += sizeof<usize>();\n }\n }\n __visit(changetype<usize>(this.buffer), cookie);\n }\n}\n","import { memcmp, memmove, memset } from \"./util/memory\";\nimport { E_NOTIMPLEMENTED } from \"./util/error\";\n\n/** Memory manager interface. */\nexport namespace memory {\n\n /** Gets the size of the memory in pages. */\n // @ts-ignore: decorator\n @builtin\n export declare function size(): i32;\n\n /** Grows the memory by the given size in pages and returns the previous size in pages. */\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function grow(pages: i32): i32;\n\n /** Fills a section in memory with the specified byte value. */\n // @ts-ignore: decorator\n @unsafe @builtin\n export function fill(dst: usize, c: u8, n: usize): void {\n memset(dst, c, n); // fallback if \"bulk-memory\" isn't enabled\n }\n\n /** Copies a section of memory to another. Has move semantics. */\n // @ts-ignore: decorator\n @unsafe @builtin\n export function copy(dst: usize, src: usize, n: usize): void {\n memmove(dst, src, n); // fallback if \"bulk-memory\" isn't enabled\n }\n\n export namespace atomic {\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function wait32(ptr: usize, expected: i32, timeout: i64): AtomicWaitResult;\n\n // @ts-ignore: decorator\n @unsafe @builtin\n export declare function wait64(ptr: usize, expected: i64, timeout: i64): AtomicWaitResult;\n }\n\n /** Initializes a memory segment. */\n // @ts-ignore: decorator\n @unsafe\n export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void {\n throw new Error(E_NOTIMPLEMENTED);\n }\n\n /** Drops a memory segment. */\n // @ts-ignore: decorator\n @unsafe\n export function drop(segmentIndex: u32): void {\n throw new Error(E_NOTIMPLEMENTED);\n }\n\n /** Repeats a section of memory at a specific address. */\n // @ts-ignore: decorator\n @unsafe\n export function repeat(dst: usize, src: usize, srcLength: usize, count: usize): void {\n let index: usize = 0;\n let total = srcLength * count;\n while (index < total) {\n memory.copy(dst + index, src, srcLength);\n index += srcLength;\n }\n }\n\n /** Compares a section of memory to another. */\n // @ts-ignore: decorator\n @inline\n export function compare(vl: usize, vr: usize, n: usize): i32 {\n return memcmp(vl, vr, n);\n }\n\n /** Gets a pointer to a static chunk of memory of the given size. */\n // @ts-ignore: decorator\n @builtin\n export declare function data<T>(size: T, align?: i32): usize;\n}\n\n// @ts-ignore: decorator\n@builtin\nexport declare const __data_end: usize;\n\n// @ts-ignore: decorator\n@builtin\nexport declare let __stack_pointer: usize;\n\n// @ts-ignore: decorator\n@builtin\nexport declare const __heap_base: usize;\n\n/** Heap memory interface. */\nexport namespace heap {\n\n /** Allocates a chunk of memory of at least the specified size. */\n // @ts-ignore: decorator\n @unsafe export function alloc(size: usize): usize {\n return __alloc(size);\n }\n\n /** Reallocates a chunk of memory to have at least the specified size. */\n // @ts-ignore: decorator\n @unsafe export function realloc(ptr: usize, size: usize): usize {\n return __realloc(ptr, size);\n }\n\n /** Frees a chunk of memory. Does hardly anything (most recent block only) with the stub runtime. */\n // @ts-ignore: decorator\n @unsafe export function free(ptr: usize): void {\n __free(ptr);\n }\n\n /** Dangerously resets the entire heap. Specific to the stub runtime. */\n // @ts-ignore: decorator\n @unsafe export function reset(): void {\n if (isDefined(__reset)) {\n __reset();\n } else {\n throw new Error(E_NOTIMPLEMENTED);\n }\n }\n}\n","/// <reference path=\"./rt/index.d.ts\" />\n\nimport { OBJECT, BLOCK_MAXSIZE, TOTAL_OVERHEAD } from \"./rt/common\";\nimport { compareImpl, strtol, strtod, isSpace, isAscii, isFinalSigma, toLower8, toUpper8 } from \"./util/string\";\nimport { SPECIALS_UPPER, casemap, bsearch } from \"./util/casemap\";\nimport { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_UNPAIRED_SURROGATE } from \"./util/error\";\nimport { idof } from \"./builtins\";\nimport { Array } from \"./array\";\n\n@final export abstract class String {\n\n @lazy static readonly MAX_LENGTH: i32 = <i32>(BLOCK_MAXSIZE >>> alignof<u16>());\n\n static fromCharCode(unit: i32, surr: i32 = -1): String {\n let hasSur = surr > 0;\n let out = changetype<String>(__new(2 << i32(hasSur), idof<String>()));\n store<u16>(changetype<usize>(out), <u16>unit);\n if (hasSur) store<u16>(changetype<usize>(out), <u16>surr, 2);\n return out;\n }\n\n static fromCharCodes(units: Array<i32>): String {\n let length = units.length;\n let out = changetype<String>(__new(<usize>length << 1, idof<String>()));\n let ptr = units.dataStart;\n for (let i = 0; i < length; ++i) {\n store<u16>(changetype<usize>(out) + (<usize>i << 1), load<i32>(ptr + (<usize>i << 2)));\n }\n return out;\n }\n\n static fromCodePoint(code: i32): String {\n let hasSur = <u32>code > 0xFFFF;\n let out = changetype<String>(__new(2 << i32(hasSur), idof<String>()));\n if (!hasSur) {\n store<u16>(changetype<usize>(out), <u16>code);\n } else {\n // Checks valid code point range\n assert(<u32>code <= 0x10FFFF);\n code -= 0x10000;\n let hi = (code & 0x03FF) | 0xDC00;\n let lo = code >>> 10 | 0xD800;\n store<u32>(changetype<usize>(out), lo | hi << 16);\n }\n return out;\n }\n\n @builtin static raw(parts: TemplateStringsArray, ...args: unknown[]): string { return unreachable(); }\n\n get length(): i32 {\n return changetype<OBJECT>(changetype<usize>(this) - TOTAL_OVERHEAD).rtSize >> 1;\n }\n\n at(pos: i32): String {\n let len = this.length;\n pos += select(0, len, pos >= 0);\n if (<u32>pos >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n let out = __new(2, idof<String>());\n store<u16>(out, load<u16>(changetype<usize>(this) + (<usize>pos << 1)));\n return changetype<String>(out); // retains\n }\n\n @operator(\"[]\") charAt(pos: i32): String {\n if (<u32>pos >= <u32>this.length) return changetype<String>(\"\");\n let out = changetype<String>(__new(2, idof<String>()));\n store<u16>(changetype<usize>(out), load<u16>(changetype<usize>(this) + (<usize>pos << 1)));\n return out;\n }\n\n charCodeAt(pos: i32): i32 {\n if (<u32>pos >= <u32>this.length) return -1; // (NaN)\n return load<u16>(changetype<usize>(this) + (<usize>pos << 1));\n }\n\n codePointAt(pos: i32): i32 {\n let len = this.length;\n if (<u32>pos >= <u32>len) return -1; // (undefined)\n let first = <i32>load<u16>(changetype<usize>(this) + (<usize>pos << 1));\n if ((first & 0xFC00) != 0xD800 || pos + 1 == len) return first;\n let second = <i32>load<u16>(changetype<usize>(this) + (<usize>pos << 1), 2);\n if ((second & 0xFC00) != 0xDC00) return first;\n return (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n }\n\n @operator(\"+\") private static __concat(left: String, right: String): String {\n return left.concat(right);\n }\n\n concat(other: String): String {\n let thisSize: isize = this.length << 1;\n let otherSize: isize = other.length << 1;\n let outSize: usize = thisSize + otherSize;\n if (outSize == 0) return changetype<String>(\"\");\n let out = changetype<String>(__new(outSize, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this), thisSize);\n memory.copy(changetype<usize>(out) + thisSize, changetype<usize>(other), otherSize);\n return out;\n }\n\n endsWith(search: String, end: i32 = String.MAX_LENGTH): bool {\n end = min(max(end, 0), this.length);\n let searchLength = <isize>search.length;\n let searchStart = <isize>end - searchLength;\n if (searchStart < 0) return false;\n // @ts-ignore: string <-> String\n return !compareImpl(this, searchStart, search, 0, searchLength);\n }\n\n @operator(\"==\") private static __eq(left: String | null, right: String | null): bool {\n if (changetype<usize>(left) == changetype<usize>(right)) return true;\n if (changetype<usize>(left) == 0 || changetype<usize>(right) == 0) return false;\n let leftLength = changetype<string>(left).length;\n if (leftLength != changetype<string>(right).length) return false;\n // @ts-ignore: string <-> String\n return !compareImpl(left, 0, right, 0, leftLength);\n }\n\n @operator.prefix(\"!\")\n private static __not(str: String | null): bool {\n return changetype<usize>(str) == 0 || !changetype<string>(str).length;\n }\n\n @operator(\"!=\")\n private static __ne(left: String | null, right: String | null): bool {\n return !this.__eq(left, right);\n }\n\n @operator(\">\") private static __gt(left: String, right: String): bool {\n if (changetype<usize>(left) == changetype<usize>(right)) return false;\n let leftLength = left.length;\n if (!leftLength) return false;\n let rightLength = right.length;\n if (!rightLength) return true;\n // @ts-ignore: string <-> String\n let res = compareImpl(left, 0, right, 0, min(leftLength, rightLength));\n return res ? res > 0 : leftLength > rightLength;\n }\n\n @operator(\">=\") private static __gte(left: String, right: String): bool {\n return !this.__lt(left, right);\n }\n\n @operator(\"<\") private static __lt(left: String, right: String): bool {\n if (changetype<usize>(left) == changetype<usize>(right)) return false;\n let rightLength = right.length;\n if (!rightLength) return false;\n let leftLength = left.length;\n if (!leftLength) return true;\n // @ts-ignore: string <-> String\n let res = compareImpl(left, 0, right, 0, min(leftLength, rightLength));\n return res ? res < 0 : leftLength < rightLength;\n }\n\n @operator(\"<=\") private static __lte(left: String, right: String): bool {\n return !this.__gt(left, right);\n }\n\n includes(search: String, start: i32 = 0): bool {\n return this.indexOf(search, start) != -1;\n }\n\n indexOf(search: String, start: i32 = 0): i32 {\n let searchLen = <isize>search.length;\n if (!searchLen) return 0;\n let len = <isize>this.length;\n if (!len) return -1;\n let searchStart = min(max(<isize>start, 0), len);\n for (len -= searchLen; searchStart <= len; ++searchStart) {\n // @ts-ignore: string <-> String\n if (!compareImpl(this, searchStart, search, 0, searchLen)) return <i32>searchStart;\n }\n return -1;\n }\n\n lastIndexOf(search: String, start: i32 = i32.MAX_VALUE): i32 {\n let searchLen = <isize>search.length;\n if (!searchLen) return this.length;\n let len = this.length;\n if (!len) return -1;\n let searchStart = min(max(<isize>start, 0), <isize>len - searchLen);\n for (; searchStart >= 0; --searchStart) {\n // @ts-ignore: string <-> String\n if (!compareImpl(this, searchStart, search, 0, searchLen)) return <i32>searchStart;\n }\n return -1;\n }\n\n // TODO: implement full locale comparison with locales and Collator options\n localeCompare(other: String): i32 {\n if (changetype<usize>(other) == changetype<usize>(this)) return 0;\n let alen = this.length;\n let blen = other.length;\n // @ts-ignore: string <-> String\n let res = compareImpl(this, 0, other, 0, <usize>min(alen, blen));\n res = res ? res : alen - blen;\n // normalize to [-1, 1] range\n return i32(res > 0) - i32(res < 0);\n }\n\n startsWith(search: String, start: i32 = 0): bool {\n let len = <isize>this.length;\n let searchStart = min(max(<isize>start, 0), len);\n let searchLength = <isize>search.length;\n if (searchLength + searchStart > len) return false;\n // @ts-ignore: string <-> String\n return !compareImpl(this, searchStart, search, 0, searchLength);\n }\n\n substr(start: i32, length: i32 = i32.MAX_VALUE): String { // legacy\n let intStart: isize = start;\n let end: isize = length;\n let len: isize = this.length;\n if (intStart < 0) intStart = max(len + intStart, 0);\n let size = min(max(end, 0), len - intStart) << 1;\n if (size <= 0) return changetype<String>(\"\");\n let out = changetype<String>(__new(size, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + (intStart << 1), size);\n return out;\n }\n\n substring(start: i32, end: i32 = i32.MAX_VALUE): String {\n let len: isize = this.length;\n let finalStart = min<isize>(max(start, 0), len);\n let finalEnd = min<isize>(max(end, 0), len);\n let fromPos = min<isize>(finalStart, finalEnd) << 1;\n let toPos = max<isize>(finalStart, finalEnd) << 1;\n let size = toPos - fromPos;\n if (!size) return changetype<String>(\"\");\n if (!fromPos && toPos == len << 1) return this;\n let out = changetype<String>(__new(size, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + fromPos, size);\n return out;\n }\n\n trim(): String {\n let len = this.length;\n let size: usize = len << 1;\n while (size && isSpace(load<u16>(changetype<usize>(this) + size - 2))) {\n size -= 2;\n }\n let offset: usize = 0;\n while (offset < size && isSpace(load<u16>(changetype<usize>(this) + offset))) {\n offset += 2; size -= 2;\n }\n if (!size) return changetype<String>(\"\");\n if (!offset && size == len << 1) return this;\n let out = changetype<String>(__new(size, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + offset, size);\n return out;\n }\n\n @inline\n trimLeft(): String {\n return this.trimStart();\n }\n\n @inline\n trimRight(): String {\n return this.trimEnd();\n }\n\n trimStart(): String {\n let size = <usize>this.length << 1;\n let offset: usize = 0;\n while (offset < size && isSpace(load<u16>(changetype<usize>(this) + offset))) {\n offset += 2;\n }\n if (!offset) return this;\n size -= offset;\n if (!size) return changetype<String>(\"\");\n let out = changetype<String>(__new(size, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + offset, size);\n return out;\n }\n\n trimEnd(): String {\n let originalSize = <usize>this.length << 1;\n let size = originalSize;\n while (size && isSpace(load<u16>(changetype<usize>(this) + size - 2))) {\n size -= 2;\n }\n if (!size) return changetype<String>(\"\");\n if (size == originalSize) return this;\n let out = changetype<String>(__new(size, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this), size);\n return out;\n }\n\n padStart(length: i32, pad: string = \" \"): String {\n let thisSize = <usize>this.length << 1;\n let targetSize = <usize>length << 1;\n let padSize = <usize>pad.length << 1;\n if (targetSize < thisSize || !padSize) return this;\n let prependSize = targetSize - thisSize;\n let out = changetype<String>(__new(targetSize, idof<String>()));\n if (prependSize > padSize) {\n let repeatCount = (prependSize - 2) / padSize;\n let restBase = repeatCount * padSize;\n let restSize = prependSize - restBase;\n memory.repeat(changetype<usize>(out), changetype<usize>(pad), padSize, repeatCount);\n memory.copy(changetype<usize>(out) + restBase, changetype<usize>(pad), restSize);\n } else {\n memory.copy(changetype<usize>(out), changetype<usize>(pad), prependSize);\n }\n memory.copy(changetype<usize>(out) + prependSize, changetype<usize>(this), thisSize);\n return out;\n }\n\n padEnd(length: i32, pad: string = \" \"): String {\n let thisSize = <usize>this.length << 1;\n let targetSize = <usize>length << 1;\n let padSize = <usize>pad.length << 1;\n if (targetSize < thisSize || !padSize) return this;\n let appendSize = targetSize - thisSize;\n let out = changetype<String>(__new(targetSize, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this), thisSize);\n if (appendSize > padSize) {\n let repeatCount = (appendSize - 2) / padSize;\n let restBase = repeatCount * padSize;\n let restSize = appendSize - restBase;\n memory.repeat(changetype<usize>(out) + thisSize, changetype<usize>(pad), padSize, repeatCount);\n memory.copy(changetype<usize>(out) + thisSize + restBase, changetype<usize>(pad), restSize);\n } else {\n memory.copy(changetype<usize>(out) + thisSize, changetype<usize>(pad), appendSize);\n }\n return out;\n }\n\n repeat(count: i32 = 0): String {\n let length = this.length;\n\n // Most browsers can't handle strings 1 << 28 chars or longer\n if (count < 0 || <u64>length * count > (1 << 28)) {\n throw new RangeError(E_INVALIDLENGTH);\n }\n\n if (count == 0 || !length) return changetype<String>(\"\");\n if (count == 1) return this;\n let out = changetype<String>(__new((length * count) << 1, idof<String>()));\n memory.repeat(changetype<usize>(out), changetype<usize>(this), <usize>length << 1, count);\n return out;\n }\n\n replace(search: String, replacement: String): String {\n let len: usize = this.length;\n let slen: usize = search.length;\n if (len <= slen) {\n return len < slen ? this : select<String>(replacement, this, search == this);\n }\n let index: isize = this.indexOf(search);\n if (~index) {\n let rlen: usize = replacement.length;\n len -= slen;\n let olen = len + rlen;\n if (olen) {\n let out = changetype<String>(__new(olen << 1, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this), index << 1);\n memory.copy(\n changetype<usize>(out) + (index << 1),\n changetype<usize>(replacement),\n rlen << 1\n );\n memory.copy(\n changetype<usize>(out) + ((index + rlen) << 1),\n changetype<usize>(this) + ((index + slen) << 1),\n (len - index) << 1\n );\n return out;\n }\n }\n return this;\n }\n\n replaceAll(search: String, replacement: String): String {\n let thisLen: usize = this.length;\n let searchLen: usize = search.length;\n if (thisLen <= searchLen) {\n return thisLen < searchLen\n ? this\n : select<String>(replacement, this, search == this);\n }\n let replaceLen: usize = replacement.length;\n if (!searchLen) {\n if (!replaceLen) return this;\n // Special case: 'abc'.replaceAll('', '-') -> '-a-b-c-'\n let out = changetype<String>(__new((thisLen + (thisLen + 1) * replaceLen) << 1, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(replacement), replaceLen << 1);\n let offset = replaceLen;\n for (let i: usize = 0; i < thisLen; ++i) {\n store<u16>(\n changetype<usize>(out) + (offset++ << 1),\n load<u16>(changetype<usize>(this) + (i << 1))\n );\n memory.copy(\n changetype<usize>(out) + (offset << 1),\n changetype<usize>(replacement),\n replaceLen << 1\n );\n offset += replaceLen;\n }\n return out;\n }\n let prev: isize = 0, next: isize = 0;\n if (searchLen == replaceLen) {\n // Fast path when search and replacement have same length\n let outSize = thisLen << 1;\n let out = changetype<String>(__new(outSize, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this), outSize);\n while (~(next = <isize>this.indexOf(search, <i32>prev))) {\n memory.copy(changetype<usize>(out) + (next << 1), changetype<usize>(replacement), replaceLen << 1);\n prev = next + searchLen;\n }\n return out;\n }\n let out: String | null = null, offset: usize = 0, outSize = thisLen;\n while (~(next = <isize>this.indexOf(search, <i32>prev))) {\n if (!out) out = changetype<String>(__new(thisLen << 1, idof<String>()));\n let chunk = next - prev;\n if (offset + chunk + replaceLen > outSize) {\n outSize <<= 1;\n out = changetype<String>(__renew(changetype<usize>(out), outSize << 1));\n }\n memory.copy(\n changetype<usize>(out) + (offset << 1),\n changetype<usize>(this) + (prev << 1),\n chunk << 1\n );\n offset += chunk;\n memory.copy(\n changetype<usize>(out) + (offset << 1),\n changetype<usize>(replacement),\n replaceLen << 1\n );\n offset += replaceLen;\n prev = next + searchLen;\n }\n if (out) {\n let rest = thisLen - prev;\n if (offset + rest > outSize) {\n outSize <<= 1;\n out = changetype<String>(__renew(changetype<usize>(out), outSize << 1));\n }\n if (rest) {\n memory.copy(\n changetype<usize>(out) + (offset << 1),\n changetype<usize>(this) + (prev << 1),\n rest << 1\n );\n }\n rest += offset;\n if (outSize > rest) {\n out = changetype<String>(__renew(changetype<usize>(out), rest << 1));\n }\n return out;\n }\n return this;\n }\n\n slice(start: i32, end: i32 = i32.MAX_VALUE): String {\n let len = this.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 = end - start;\n if (len <= 0) return changetype<String>(\"\");\n let out = changetype<String>(__new(len << 1, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + (<usize>start << 1), <usize>len << 1);\n return out;\n }\n\n split(separator: String | null = null, limit: i32 = i32.MAX_VALUE): String[] {\n if (!limit) return changetype<String[]>(__newArray(0, alignof<String>(), idof<Array<String>>()));\n if (changetype<usize>(separator) == 0) return [ this ];\n let length: isize = this.length;\n let sepLen = changetype<string>(separator).length;\n if (limit < 0) limit = i32.MAX_VALUE;\n if (!sepLen) {\n if (!length) return changetype<String[]>(__newArray(0, alignof<String>(), idof<Array<String>>()));\n // split by chars\n length = min<isize>(length, <isize>limit);\n let result = changetype<String[]>(__newArray(<i32>length, alignof<String>(), idof<Array<String>>()));\n // @ts-ignore: cast\n let resultStart = result.dataStart as usize;\n for (let i: isize = 0; i < length; ++i) {\n let charStr = changetype<String>(__new(2, idof<String>()));\n store<u16>(changetype<usize>(charStr), load<u16>(changetype<usize>(this) + (<usize>i << 1)));\n store<usize>(resultStart + (<usize>i << alignof<usize>()), changetype<usize>(charStr)); // result[i] = charStr\n __link(changetype<usize>(result), changetype<usize>(charStr), true);\n }\n return result;\n } else if (!length) {\n let result = changetype<String[]>(__newArray(1, alignof<String>(), idof<Array<String>>()));\n // @ts-ignore: cast\n store<usize>(result.dataStart as usize, changetype<usize>(\"\")); // static \"\"\n return result;\n }\n let result = changetype<String[]>(__newArray(0, alignof<String>(), idof<Array<String>>()));\n let end = 0, start = 0, i = 0;\n while (~(end = this.indexOf(changetype<string>(separator), start))) {\n let len = end - start;\n if (len > 0) {\n let out = changetype<String>(__new(<usize>len << 1, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + (<usize>start << 1), <usize>len << 1);\n result.push(out);\n } else {\n result.push(changetype<String>(\"\"));\n }\n if (++i == limit) return result;\n start = end + sepLen;\n }\n if (!start) { // also means: loop above didn't do anything\n result.push(this);\n return result;\n }\n let len = length - start;\n if (len > 0) {\n let out = changetype<String>(__new(<usize>len << 1, idof<String>()));\n memory.copy(changetype<usize>(out), changetype<usize>(this) + (<usize>start << 1), <usize>len << 1);\n result.push(out);\n } else {\n result.push(changetype<String>(\"\")); // static \"\"\n }\n return result;\n }\n\n toLowerCase(): String {\n let len = <usize>this.length;\n if (!len) return this;\n let codes = changetype<String>(__new(len * 2 * 2, idof<String>()));\n let j: usize = 0;\n for (let i: usize = 0; i < len; ++i, ++j) {\n let c = <u32>load<u16>(changetype<usize>(this) + (i << 1));\n if (isAscii(c)) {\n store<u16>(changetype<usize>(codes) + (j << 1), toLower8(c));\n } else {\n // check and read surrogate pair\n if ((c - 0xD7FF < 0xDC00 - 0xD7FF) && i < len - 1) {\n let c1 = <u32>load<u16>(changetype<usize>(this) + (i << 1), 2);\n if (c1 - 0xDBFF < 0xE000 - 0xDBFF) {\n let c0 = c;\n c = (((c & 0x03FF) << 10) | (c1 & 0x03FF)) + 0x10000;\n ++i;\n if (c >= 0x20000) {\n store<u32>(changetype<usize>(codes) + (j << 1), c0 | (c1 << 16));\n ++j;\n continue;\n }\n }\n }\n // check special casing for lower table. It has one ently so instead lookup we just inline this.\n if (c == 0x0130) {\n // 0x0130 -> [0x0069, 0x0307]\n store<u32>(changetype<usize>(codes) + (j << 1), (0x0307 << 16) | 0x0069);\n ++j;\n } else if (c == 0x03A3) { // 'Σ'\n // Σ maps to σ but except at the end of a word where it maps to ς\n let sigma = 0x03C3; // σ\n if (len > 1 && isFinalSigma(changetype<usize>(this), i, len)) {\n sigma = 0x03C2; // ς\n }\n store<u16>(changetype<usize>(codes) + (j << 1), sigma);\n } else if (c - 0x24B6 <= 0x24CF - 0x24B6) {\n // Range 0x24B6 <= c <= 0x24CF not covered by casemap and require special early handling\n store<u16>(changetype<usize>(codes) + (j << 1), c + 26);\n } else {\n let code = casemap(c, 0) & 0x1FFFFF;\n if (code < 0x10000) {\n store<u16>(changetype<usize>(codes) + (j << 1), code);\n } else {\n // store as surrogare pair\n code -= 0x10000;\n let lo = (code >>> 10) | 0xD800;\n let hi = (code & 0x03FF) | 0xDC00;\n store<u32>(changetype<usize>(codes) + (j << 1), lo | (hi << 16));\n ++j;\n }\n }\n }\n }\n return changetype<String>(__renew(changetype<usize>(codes), j << 1));\n }\n\n toUpperCase(): String {\n let len = <usize>this.length;\n if (!len) return this;\n let codes = changetype<String>(__new(len * 3 * 2, idof<String>()));\n let specialsPtr = changetype<usize>(SPECIALS_UPPER);\n let specialsLen = SPECIALS_UPPER.length;\n let j: usize = 0;\n for (let i: usize = 0; i < len; ++i, ++j) {\n let c = <u32>load<u16>(changetype<usize>(this) + (i << 1));\n if (isAscii(c)) {\n store<u16>(changetype<usize>(codes) + (j << 1), toUpper8(c));\n } else {\n // check and read surrogate pair\n if ((c - 0xD7FF < 0xDC00 - 0xD7FF) && i < len - 1) {\n let c1 = <u32>load<u16>(changetype<usize>(this) + (i << 1), 2);\n if (c1 - 0xDBFF < 0xE000 - 0xDBFF) {\n let c0 = c;\n c = (((c & 0x03FF) << 10) | (c1 & 0x03FF)) + 0x10000;\n ++i;\n if (c >= 0x20000) {\n store<u32>(changetype<usize>(codes) + (j << 1), c0 | (c1 << 16));\n ++j;\n continue;\n }\n }\n }\n // Range 0x24D0 <= c <= 0x24E9 not covered by casemap and require special early handling\n if (c - 0x24D0 <= 0x24E9 - 0x24D0) {\n // monkey patch\n store<u16>(changetype<usize>(codes) + (j << 1), c - 26);\n } else {\n let index: usize = -1;\n // Fast range check. See first and last rows in specialsUpper table\n if (c - 0x00DF <= 0xFB17 - 0x00DF) {\n index = <usize>bsearch(c, specialsPtr, specialsLen);\n }\n if (~index) {\n // load next 3 code points from row with `index` offset for specialsUpper table\n let ab = load<u32>(specialsPtr + (index << 1), 2);\n let cc = load<u16>(specialsPtr + (index << 1), 6);\n store<u32>(changetype<usize>(codes) + (j << 1), ab, 0);\n store<u16>(changetype<usize>(codes) + (j << 1), cc, 4);\n j += 1 + usize(cc != 0);\n } else {\n let code = casemap(c, 1) & 0x1FFFFF;\n if (code < 0x10000) {\n store<u16>(changetype<usize>(codes) + (j << 1), code);\n } else {\n // store as surrogare pair\n code -= 0x10000;\n let lo = (code >>> 10) | 0xD800;\n let hi = (code & 0x03FF) | 0xDC00;\n store<u32>(changetype<usize>(codes) + (j << 1), lo | (hi << 16));\n ++j;\n }\n }\n }\n }\n }\n return changetype<String>(__renew(changetype<usize>(codes), j << 1));\n }\n\n toString(): String {\n return this;\n }\n}\n\n// @ts-ignore: nolib\nexport type string = String;\n\nexport function parseInt(str: string, radix: i32 = 0): f64 {\n return strtol<f64>(str, radix);\n}\n\nexport function parseFloat(str: string): f64 {\n return strtod(str);\n}\n\n// Encoding helpers\nexport namespace String {\n\n export namespace UTF8 {\n\n export const enum ErrorMode {\n WTF8,\n REPLACE,\n ERROR\n }\n\n export function byteLength(str: string, nullTerminated: bool = false): i32 {\n let strOff = changetype<usize>(str);\n let strEnd = strOff + <usize>changetype<OBJECT>(changetype<usize>(str) - TOTAL_OVERHEAD).rtSize;\n let bufLen = i32(nullTerminated);\n while (strOff < strEnd) {\n let c1 = <u32>load<u16>(strOff);\n if (c1 < 128) {\n // @ts-ignore: cast\n if (nullTerminated & !c1) break;\n bufLen += 1;\n } else if (c1 < 2048) {\n bufLen += 2;\n } else {\n if ((c1 & 0xFC00) == 0xD800 && strOff + 2 < strEnd) {\n if ((<u32>load<u16>(strOff, 2) & 0xFC00) == 0xDC00) {\n bufLen += 4; strOff += 4;\n continue;\n }\n }\n bufLen += 3;\n }\n strOff += 2;\n }\n return bufLen;\n }\n\n export function encode(str: string, nullTerminated: bool = false, errorMode: ErrorMode = ErrorMode.WTF8): ArrayBuffer {\n let buf = changetype<ArrayBuffer>(__new(<usize>byteLength(str, nullTerminated), idof<ArrayBuffer>()));\n encodeUnsafe(changetype<usize>(str), str.length, changetype<usize>(buf), nullTerminated, errorMode);\n return buf;\n }\n\n // @ts-ignore: decorator\n @unsafe\n export function encodeUnsafe(str: usize, len: i32, buf: usize, nullTerminated: bool = false, errorMode: ErrorMode = ErrorMode.WTF8): usize {\n let strEnd = str + (<usize>len << 1);\n let bufOff = buf;\n while (str < strEnd) {\n let c1 = <u32>load<u16>(str);\n if (c1 < 128) {\n store<u8>(bufOff, c1);\n bufOff++;\n // @ts-ignore: cast\n if (nullTerminated & !c1) return bufOff - buf;\n } else if (c1 < 2048) {\n let b0 = c1 >> 6 | 192;\n let b1 = c1 & 63 | 128;\n store<u16>(bufOff, b1 << 8 | b0);\n bufOff += 2;\n } else {\n // D800: 11011 0 0000000000 Lead\n // DBFF: 11011 0 1111111111\n // DC00: 11011 1 0000000000 Trail\n // DFFF: 11011 1 1111111111\n // F800: 11111 0 0000000000 Mask\n // FC00: 11111 1 0000000000\n if ((c1 & 0xF800) == 0xD800) {\n if (c1 < 0xDC00 && str + 2 < strEnd) {\n let c2 = <u32>load<u16>(str, 2);\n if ((c2 & 0xFC00) == 0xDC00) {\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) | (c2 & 0x03FF);\n let b0 = c1 >> 18 | 240;\n let b1 = c1 >> 12 & 63 | 128;\n let b2 = c1 >> 6 & 63 | 128;\n let b3 = c1 & 63 | 128;\n store<u32>(bufOff, b3 << 24 | b2 << 16 | b1 << 8 | b0);\n bufOff += 4; str += 4;\n continue;\n }\n }\n if (errorMode != ErrorMode.WTF8) { // unlikely\n if (errorMode == ErrorMode.ERROR) throw new Error(E_UNPAIRED_SURROGATE);\n c1 = 0xFFFD;\n }\n }\n let b0 = c1 >> 12 | 224;\n let b1 = c1 >> 6 & 63 | 128;\n let b2 = c1 & 63 | 128;\n store<u16>(bufOff, b1 << 8 | b0);\n store<u8>(bufOff, b2, 2);\n bufOff += 3;\n }\n str += 2;\n }\n if (nullTerminated) {\n store<u8>(bufOff++, 0);\n }\n return bufOff - buf;\n }\n\n export function decode(buf: ArrayBuffer, nullTerminated: bool = false): String {\n return decodeUnsafe(changetype<usize>(buf), buf.byteLength, nullTerminated);\n }\n\n // @ts-ignore: decorator\n @unsafe\n export function decodeUnsafe(buf: usize, len: usize, nullTerminated: bool = false): String {\n let bufOff = buf;\n let bufEnd = buf + len;\n assert(bufEnd >= bufOff); // guard wraparound\n let str = changetype<String>(__new(len << 1, idof<String>())); // max is one u16 char per u8 byte\n let strOff = changetype<usize>(str);\n while (bufOff < bufEnd) {\n let u0 = <u32>load<u8>(bufOff); ++bufOff;\n if (!(u0 & 128)) {\n // @ts-ignore: cast\n if (nullTerminated & !u0) break;\n store<u16>(strOff, u0);\n } else {\n if (bufEnd == bufOff) break;\n let u1 = <u32>load<u8>(bufOff) & 63; ++bufOff;\n if ((u0 & 224) == 192) {\n store<u16>(strOff, (u0 & 31) << 6 | u1);\n } else {\n if (bufEnd == bufOff) break;\n let u2 = <u32>load<u8>(bufOff) & 63; ++bufOff;\n if ((u0 & 240) == 224) {\n u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n } else {\n if (bufEnd == bufOff) break;\n u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | <u32>load<u8>(bufOff) & 63;\n ++bufOff;\n }\n if (u0 < 0x10000) {\n store<u16>(strOff, u0);\n } else {\n u0 -= 0x10000;\n let lo = u0 >> 10 | 0xD800;\n let hi = (u0 & 0x03FF) | 0xDC00;\n store<u32>(strOff, lo | (hi << 16));\n strOff += 2;\n }\n }\n }\n strOff += 2;\n }\n return changetype<String>(__renew(changetype<usize>(str), strOff - changetype<usize>(str)));\n }\n }\n\n export namespace UTF16 {\n\n export function byteLength(str: string): i32 {\n return changetype<OBJECT>(changetype<usize>(str) - TOTAL_OVERHEAD).rtSize;\n }\n\n export function encode(str: string): ArrayBuffer {\n let buf = changetype<ArrayBuffer>(__new(<usize>byteLength(str), idof<ArrayBuffer>()));\n encodeUnsafe(changetype<usize>(str), str.length, changetype<usize>(buf));\n return buf;\n }\n\n // @ts-ignore: decorator\n @unsafe\n export function encodeUnsafe(str: usize, len: i32, buf: usize): usize {\n let size = <usize>len << 1;\n memory.copy(buf, changetype<usize>(str), size);\n return size;\n }\n\n export function decode(buf: ArrayBuffer): String {\n return decodeUnsafe(changetype<usize>(buf), buf.byteLength);\n }\n\n // @ts-ignore: decorator\n @unsafe\n export function decodeUnsafe(buf: usize, len: usize): String {\n let str = changetype<String>(__new(len &= ~1, idof<String>()));\n memory.copy(changetype<usize>(str), buf, len);\n return str;\n }\n }\n}\n\nexport class TemplateStringsArray extends Array<string> {\n readonly raw: string[];\n}\n","/// <reference path=\"./rt/index.d.ts\" />\n\nimport { OBJECT, BLOCK_MAXSIZE, TOTAL_OVERHEAD } from \"./rt/common\";\nimport { Runtime } from \"shared/runtime\";\nimport { COMPARATOR, SORT } from \"./util/sort\";\nimport { REVERSE, FILL } from \"./util/bytes\";\nimport { idof } from \"./builtins\";\nimport { Array } from \"./array\";\nimport { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_HOLEYARRAY } from \"./util/error\";\nimport { joinBooleanArray, joinIntegerArray, joinFloatArray, joinStringArray, joinReferenceArray } from \"./util/string\";\n\n@final\nexport class StaticArray<T> {\n [key: number]: T;\n\n // Note that the interface of StaticArray instances must be a semantically\n // compatible subset of Array<T> in order for syntax highlighting to work\n // properly, for instance when creating static arrays from array literals.\n // The additionally provided static methods take care of dealing with static\n // arrays exclusively, without having to convert to Array<T> first.\n\n static fromArray<T>(source: Array<T>): StaticArray<T> {\n let length = source.length;\n let outSize = <usize>length << alignof<T>();\n let out = changetype<StaticArray<T>>(__new(outSize, idof<StaticArray<T>>()));\n if (isManaged<T>()) {\n let sourcePtr = source.dataStart;\n for (let i = 0; i < length; ++i) {\n let off = <usize>i << alignof<T>();\n let ref = load<usize>(sourcePtr + off);\n store<usize>(changetype<usize>(out) + off, ref);\n __link(changetype<usize>(out), ref, true);\n }\n } else {\n memory.copy(changetype<usize>(out), source.dataStart, outSize);\n }\n return out;\n }\n\n /** @deprecated Please use source.concat<StaticArray<T>> instead. */\n static concat<T>(source: StaticArray<T>, other: StaticArray<T>): StaticArray<T> {\n return source.concat<StaticArray<T>>(other);\n }\n\n /** @deprecated Please use source.slice<StaticArray<T>> instead. */\n static slice<T>(source: StaticArray<T>, start: i32 = 0, end: i32 = i32.MAX_VALUE): StaticArray<T> {\n return source.slice<StaticArray<T>>(start, end);\n }\n\n constructor(length: i32) {\n if (<u32>length > <u32>BLOCK_MAXSIZE >>> alignof<T>()) throw new RangeError(E_INVALIDLENGTH);\n let outSize = <usize>length << alignof<T>();\n let out = changetype<StaticArray<T>>(__new(outSize, idof<StaticArray<T>>()));\n if (ASC_RUNTIME != Runtime.Incremental) {\n memory.fill(changetype<usize>(out), 0, outSize);\n }\n return out;\n }\n\n get length(): i32 {\n return changetype<OBJECT>(changetype<usize>(this) - TOTAL_OVERHEAD).rtSize >>> alignof<T>();\n }\n\n at(index: i32): T {\n let len = this.length;\n index += select(0, len, index >= 0);\n if (<u32>index >= <u32>len) throw new RangeError(E_INDEXOUTOFRANGE);\n let value = load<T>(changetype<usize>(this) + (<usize>index << alignof<T>()));\n if (isReference<T>()) {\n if (!isNullable<T>()) {\n if (!changetype<usize>(value)) throw new Error(E_HOLEYARRAY);\n }\n }\n return value;\n }\n\n @operator(\"[]\") private __get(index: i32): T {\n if (<u32>index >= <u32>this.length) throw new RangeError(E_INDEXOUTOFRANGE);\n let value = load<T>(changetype<usize>(this) + (<usize>index << alignof<T>()));\n if (isReference<T>()) {\n if (!isNullable<T>()) {\n if (!changetype<usize>(value)) throw new Error(E_HOLEYARRAY);\n }\n }\n return value;\n }\n\n @unsafe @operator(\"{}\") private __uget(index: i32): T {\n return load<T>(changetype<usize>(this) + (<usize>index << alignof<T>()));\n }\n\n @operator(\"[]=\") private __set(index: i32, value: T): void {\n if (<u32>index >= <u32>this.length) throw new RangeError(E_INDEXOUTOFRANGE);\n this.__uset(index, value);\n }\n\n @unsafe @operator(\"{}=\") private __uset(index: i32, value: T): void {\n store<T>(changetype<usize>(this) + (<usize>index << alignof<T>()), value);\n if (isManaged<T>()) {\n __link(changetype<usize>(this), changetype<usize>(value), true);\n }\n }\n\n fill(value: T, start: i32 = 0, end: i32 = i32.MAX_VALUE): StaticArray<T> {\n if (isManaged<T>()) {\n FILL<usize>(changetype<usize>(this), this.length, changetype<usize>(value), start, end);\n __link(changetype<usize>(this), changetype<usize>(value), false);\n } else {\n FILL<T>(changetype<usize>(this), this.length, value, start, end);\n }\n return this;\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): StaticArray<T> {\n let ptr = changetype<usize>(this);\n let len = this.length;\n\n end = min<i32>(end, len);\n\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( // is memmove\n ptr + (<usize>to << alignof<T>()),\n ptr + (<usize>from << alignof<T>()),\n <usize>count << alignof<T>()\n );\n return this;\n }\n\n includes(value: T, fromIndex: i32 = 0): bool {\n if (isFloat<T>()) {\n let length = this.length;\n if (length == 0 || fromIndex >= length) return false;\n if (fromIndex < 0) fromIndex = max(length + fromIndex, 0);\n while (fromIndex < length) {\n let elem = load<T>(changetype<usize>(this) + (<usize>fromIndex << alignof<T>()));\n // @ts-ignore\n if (elem == value || isNaN(elem) & isNaN(value)) return true;\n ++fromIndex;\n }\n return false;\n } else {\n return this.indexOf(value, fromIndex) >= 0;\n }\n }\n\n indexOf(value: T, fromIndex: i32 = 0): i32 {\n let length = this.length;\n if (length == 0 || fromIndex >= length) return -1;\n if (fromIndex < 0) fromIndex = max(length + fromIndex, 0);\n while (fromIndex < length) {\n if (load<T>(changetype<usize>(this) + (<usize>fromIndex << alignof<T>())) == value) return fromIndex;\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(value: T, fromIndex: i32 = this.length): i32 {\n let length = this.length;\n if (length == 0) return -1;\n if (fromIndex < 0) fromIndex = length + fromIndex;\n else if (fromIndex >= length) fromIndex = length - 1;\n while (fromIndex >= 0) {\n if (load<T>(changetype<usize>(this) + (<usize>fromIndex << alignof<T>())) == value) return fromIndex;\n --fromIndex;\n }\n return -1;\n }\n\n concat<U extends ArrayLike<T> = Array<T>>(other: U): U {\n let sourceLen = this.length;\n let otherLen = other.length;\n let outLen = sourceLen + otherLen;\n if (<u32>outLen > <u32>BLOCK_MAXSIZE >>> alignof<T>()) {\n throw new Error(E_INVALIDLENGTH);\n }\n let sourceSize = <usize>sourceLen << alignof<T>();\n let out = changetype<U>(this); // FIXME: instanceof needs *some* value\n\n if (out instanceof Array<T>) {\n out = changetype<U>(__newArray(outLen, alignof<T>(), idof<Array<T>>()));\n // ^ FIXME: Function returns type U, but can't __newArray(U extends Array<T>)\n let outStart = changetype<Array<T>>(out).dataStart;\n let otherStart = changetype<Array<T>>(other).dataStart;\n let thisStart = changetype<usize>(this);\n\n if (isManaged<T>()) {\n for (let offset: usize = 0; offset < sourceSize; offset += sizeof<T>()) {\n let ref = load<usize>(thisStart + offset);\n store<usize>(outStart + offset, ref);\n __link(changetype<usize>(out), ref, true);\n }\n outStart += sourceSize;\n let otherSize = <usize>otherLen << alignof<T>();\n for (let offset: usize = 0; offset < otherSize; offset += sizeof<T>()) {\n let ref = load<usize>(otherStart + offset);\n store<usize>(outStart + offset, ref);\n __link(changetype<usize>(out), ref, true);\n }\n } else {\n memory.copy(outStart, thisStart, sourceSize);\n memory.copy(outStart + sourceSize, otherStart, <usize>otherLen << alignof<T>());\n }\n } else if (out instanceof StaticArray<T>) {\n out = changetype<U>(__new(<usize>outLen << alignof<T>(), idof<StaticArray<T>>()));\n let outStart = changetype<usize>(out);\n let otherStart = changetype<usize>(other);\n let thisStart = changetype<usize>(this);\n\n if (isManaged<T>()) {\n for (let offset: usize = 0; offset < sourceSize; offset += sizeof<T>()) {\n let ref = load<usize>(thisStart + offset);\n store<usize>(outStart + offset, ref);\n __link(changetype<usize>(out), ref, true);\n }\n outStart += sourceSize;\n let otherSize = <usize>otherLen << alignof<T>();\n for (let offset: usize = 0; offset < otherSize; offset += sizeof<T>()) {\n let ref = load<usize>(otherStart + offset);\n store<usize>(outStart + offset, ref);\n __link(changetype<usize>(out), ref, true);\n }\n } else {\n memory.copy(outStart, thisStart, sourceSize);\n memory.copy(outStart + sourceSize, otherStart, <usize>otherLen << alignof<T>());\n }\n } else {\n ERROR(\"Only Array<T> and StaticArray<T> accept for 'U' parameter\");\n }\n return out;\n }\n\n slice<U extends ArrayLike<T> = Array<T>>(start: i32 = 0, end: i32 = i32.MAX_VALUE): U {\n let length = this.length;\n start = start < 0 ? max(start + length, 0) : min(start, length);\n end = end < 0 ? max(end + length, 0) : min(end, length);\n length = max(end - start, 0);\n\n let sourceStart = changetype<usize>(this) + (<usize>start << alignof<T>());\n let size = <usize>length << alignof<T>();\n let out = changetype<U>(this); // FIXME: instanceof needs *some* value\n\n if (out instanceof Array<T>) {\n // return Array\n out = changetype<U>(__newArray(length, alignof<T>(), idof<Array<T>>()));\n // ^ FIXME: Function returns type U, but can't __newArray(U extends Array<T>)\n let outStart = changetype<Array<T>>(out).dataStart;\n if (isManaged<T>()) {\n let off: usize = 0;\n while (off < size) {\n let ref = load<usize>(sourceStart + off);\n store<usize>(outStart + off, ref);\n __link(changetype<usize>(out), ref, true);\n off += sizeof<usize>();\n }\n } else {\n memory.copy(outStart, sourceStart, size);\n }\n } else if (out instanceof StaticArray<T>) {\n // return StaticArray\n out = changetype<U>(__new(size, idof<StaticArray<T>>()));\n let outStart = changetype<usize>(out);\n if (isManaged<T>()) {\n let off: usize = 0;\n while (off < size) {\n let ref = load<usize>(sourceStart + off);\n store<usize>(outStart + off, ref);\n __link(outStart, ref, true);\n off += sizeof<usize>();\n }\n } else {\n memory.copy(outStart, sourceStart, size);\n }\n } else {\n ERROR(\"Only Array<T> and StaticArray<T> accept for 'U' parameter\");\n }\n return out;\n }\n\n findIndex(fn: (value: T, index: i32, array: StaticArray<T>) => bool): i32 {\n for (let i = 0, len = this.length; i < len; ++i) {\n if (fn(load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this)) return i;\n }\n return -1;\n }\n\n findLastIndex(fn: (value: T, index: i32, array: StaticArray<T>) => bool): i32 {\n for (let i = this.length - 1; i >= 0; --i) {\n if (fn(load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this)) return i;\n }\n return -1;\n }\n\n forEach(fn: (value: T, index: i32, array: StaticArray<T>) => void): void {\n for (let i = 0, len = this.length; i < len; ++i) {\n fn(load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this);\n }\n }\n\n map<U>(fn: (value: T, index: i32, array: StaticArray<T>) => U): Array<U> {\n let len = this.length;\n let out = changetype<Array<U>>(__newArray(len, alignof<U>(), idof<Array<U>>()));\n let outStart = out.dataStart;\n for (let i = 0; i < len; ++i) {\n let result = fn(load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this);\n store<U>(outStart + (<usize>i << alignof<U>()), result);\n if (isManaged<U>()) {\n __link(changetype<usize>(out), changetype<usize>(result), true);\n }\n }\n return out;\n }\n\n filter(fn: (value: T, index: i32, array: StaticArray<T>) => bool): Array<T> {\n let result = changetype<Array<T>>(__newArray(0, alignof<T>(), idof<Array<T>>()));\n for (let i = 0, len = this.length; i < len; ++i) {\n let value = load<T>(changetype<usize>(this) + (<usize>i << alignof<T>()));\n if (fn(value, i, this)) result.push(value);\n }\n return result;\n }\n\n reduce<U>(\n fn: (previousValue: U, currentValue: T, currentIndex: i32, array: StaticArray<T>) => U,\n initialValue: U\n ): U {\n let acc = initialValue;\n for (let i = 0, len = this.length; i < len; ++i) {\n acc = fn(acc, load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this);\n }\n return acc;\n }\n\n reduceRight<U>(\n fn: (previousValue: U, currentValue: T, currentIndex: i32, array: StaticArray<T>) => U,\n initialValue: U\n ): U {\n let acc = initialValue;\n for (let i = this.length - 1; i >= 0; --i) {\n acc = fn(acc, load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this);\n }\n return acc;\n }\n\n every(fn: (value: T, index: i32, array: StaticArray<T>) => bool): bool {\n for (let i = 0, len = this.length; i < len; ++i) {\n if (!fn(load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this)) return false;\n }\n return true;\n }\n\n some(fn: (value: T, index: i32, array: StaticArray<T>) => bool): bool {\n for (let i = 0, len = this.length; i < len; ++i) {\n if (fn(load<T>(changetype<usize>(this) + (<usize>i << alignof<T>())), i, this)) return true;\n }\n return false;\n }\n\n sort(comparator: (a: T, b: T) => i32 = COMPARATOR<T>()): StaticArray<T> {\n SORT<T>(changetype<usize>(this), this.length, comparator);\n return this;\n }\n\n join(separator: string = \",\"): string {\n if (isBoolean<T>()) return joinBooleanArray(changetype<usize>(this), this.length, separator);\n if (isInteger<T>()) return joinIntegerArray<T>(changetype<usize>(this), this.length, separator);\n if (isFloat<T>()) return joinFloatArray<T>(changetype<usize>(this), this.length, separator);\n if (ASC_SHRINK_LEVEL < 1) {\n if (isString<T>()) return joinStringArray(changetype<usize>(this), this.length, separator);\n }\n if (isReference<T>()) return joinReferenceArray<T>(changetype<usize>(this), this.length, separator);\n ERROR(\"unspported element type\");\n return <string>unreachable();\n }\n\n reverse(): StaticArray<T> {\n REVERSE<T>(changetype<usize>(this), this.length);\n return this;\n }\n\n toString(): string {\n return this.join();\n }\n\n // RT integration\n\n @unsafe private __visit(cookie: u32): void {\n if (isManaged<T>()) {\n let cur = changetype<usize>(this);\n let end = cur + changetype<OBJECT>(changetype<usize>(this) - TOTAL_OVERHEAD).rtSize;\n while (cur < end) {\n let val = load<usize>(cur);\n if (val) __visit(val, cookie);\n cur += sizeof<usize>();\n }\n }\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","/**\n * Aggregation operations for columns and DataFrames\n */\n\nimport { NumericColumn, DataType } from '../core/numeric-column';\nimport { DataFrame } from '../dataframe/dataframe';\nimport { ColumnType } from '../core/schema';\nimport {\n simdSumF32,\n simdSumF64,\n simdSumI32,\n simdMinF32,\n simdMinF64,\n simdMinI32,\n simdMaxF32,\n simdMaxF64,\n simdMaxI32,\n} from '../simd/simd-aggregations';\n\n// =============================================================================\n// Column-level aggregations\n// =============================================================================\n\n/**\n * Sum a numeric column (returns f64 for precision)\n */\nexport function columnSum(column: NumericColumn): f64 {\n const ptr = column.dataPtr;\n const len = column.length;\n\n switch (column.dtype) {\n case DataType.Float32:\n return <f64>simdSumF32(ptr, len);\n case DataType.Float64:\n return simdSumF64(ptr, len);\n case DataType.Int32:\n return <f64>simdSumI32(ptr, len);\n case DataType.Int64:\n // Fall back to scalar for i64\n let sum64: i64 = 0;\n for (let i: i32 = 0; i < len; i++) {\n sum64 += column.getI64(i);\n }\n return <f64>sum64;\n default:\n return 0;\n }\n}\n\n/**\n * Mean of a numeric column\n */\nexport function columnMean(column: NumericColumn): f64 {\n if (column.length === 0) return 0;\n return columnSum(column) / <f64>column.length;\n}\n\n/**\n * Minimum of a numeric column\n */\nexport function columnMin(column: NumericColumn): f64 {\n const ptr = column.dataPtr;\n const len = column.length;\n\n switch (column.dtype) {\n case DataType.Float32:\n return <f64>simdMinF32(ptr, len);\n case DataType.Float64:\n return simdMinF64(ptr, len);\n case DataType.Int32:\n return <f64>simdMinI32(ptr, len);\n case DataType.Int64:\n let min64: i64 = i64.MAX_VALUE;\n for (let i: i32 = 0; i < len; i++) {\n const val = column.getI64(i);\n if (val < min64) min64 = val;\n }\n return <f64>min64;\n default:\n return Infinity;\n }\n}\n\n/**\n * Maximum of a numeric column\n */\nexport function columnMax(column: NumericColumn): f64 {\n const ptr = column.dataPtr;\n const len = column.length;\n\n switch (column.dtype) {\n case DataType.Float32:\n return <f64>simdMaxF32(ptr, len);\n case DataType.Float64:\n return simdMaxF64(ptr, len);\n case DataType.Int32:\n return <f64>simdMaxI32(ptr, len);\n case DataType.Int64:\n let max64: i64 = i64.MIN_VALUE;\n for (let i: i32 = 0; i < len; i++) {\n const val = column.getI64(i);\n if (val > max64) max64 = val;\n }\n return <f64>max64;\n default:\n return -Infinity;\n }\n}\n\n/**\n * Count non-null values in a column\n */\nexport function columnCount(column: NumericColumn): i32 {\n return column.validity.countValid();\n}\n\n/**\n * Variance of a numeric column (sample variance)\n */\nexport function columnVariance(column: NumericColumn): f64 {\n const len = column.length;\n if (len < 2) return 0;\n\n const mean = columnMean(column);\n let sumSq: f64 = 0;\n\n const ptr = column.dataPtr;\n\n switch (column.dtype) {\n case DataType.Float32:\n for (let i: i32 = 0; i < len; i++) {\n const diff = <f64>load<f32>(ptr + (i << 2)) - mean;\n sumSq += diff * diff;\n }\n break;\n case DataType.Float64:\n for (let i: i32 = 0; i < len; i++) {\n const diff = load<f64>(ptr + (i << 3)) - mean;\n sumSq += diff * diff;\n }\n break;\n case DataType.Int32:\n for (let i: i32 = 0; i < len; i++) {\n const diff = <f64>load<i32>(ptr + (i << 2)) - mean;\n sumSq += diff * diff;\n }\n break;\n case DataType.Int64:\n for (let i: i32 = 0; i < len; i++) {\n const diff = <f64>column.getI64(i) - mean;\n sumSq += diff * diff;\n }\n break;\n }\n\n return sumSq / <f64>(len - 1);\n}\n\n/**\n * Standard deviation of a numeric column\n */\nexport function columnStdDev(column: NumericColumn): f64 {\n return Math.sqrt(columnVariance(column));\n}\n\n// =============================================================================\n// DataFrame-level aggregations\n// =============================================================================\n\n/**\n * Sum a column in a DataFrame by name\n */\nexport function dfSum(df: DataFrame, columnName: string): f64 {\n const col = df.getNumericColumn(columnName);\n if (col === null) return 0;\n return columnSum(col!);\n}\n\n/**\n * Mean of a column in a DataFrame by name\n */\nexport function dfMean(df: DataFrame, columnName: string): f64 {\n const col = df.getNumericColumn(columnName);\n if (col === null) return 0;\n return columnMean(col!);\n}\n\n/**\n * Min of a column in a DataFrame by name\n */\nexport function dfMin(df: DataFrame, columnName: string): f64 {\n const col = df.getNumericColumn(columnName);\n if (col === null) return Infinity;\n return columnMin(col!);\n}\n\n/**\n * Max of a column in a DataFrame by name\n */\nexport function dfMax(df: DataFrame, columnName: string): f64 {\n const col = df.getNumericColumn(columnName);\n if (col === null) return -Infinity;\n return columnMax(col!);\n}\n\n/**\n * Count non-null values in a column by name\n */\nexport function dfCount(df: DataFrame, columnName: string): i32 {\n const col = df.getNumericColumn(columnName);\n if (col === null) return 0;\n return columnCount(col!);\n}\n\n/**\n * Variance of a column in a DataFrame by name\n */\nexport function dfVariance(df: DataFrame, columnName: string): f64 {\n const col = df.getNumericColumn(columnName);\n if (col === null) return 0;\n return columnVariance(col!);\n}\n\n/**\n * Standard deviation of a column in a DataFrame by name\n */\nexport function dfStdDev(df: DataFrame, columnName: string): f64 {\n const col = df.getNumericColumn(columnName);\n if (col === null) return 0;\n return columnStdDev(col!);\n}\n","/**\n * SIMD-accelerated aggregation operations\n * Uses multiple accumulators to hide latency and maximize throughput\n */\n\nimport {\n f32x4Splat,\n f64x2Splat,\n f32x4HorizontalSum,\n f64x2HorizontalSum,\n f32x4HorizontalMin,\n f64x2HorizontalMin,\n f32x4HorizontalMax,\n f64x2HorizontalMax,\n} from './simd-utils';\n\n// =============================================================================\n// Float32 SIMD Aggregations (4 values per v128)\n// =============================================================================\n\n/**\n * SIMD sum for Float32 array\n * Uses 4 accumulators to hide latency, processing 16 values per iteration\n */\nexport function simdSumF32(ptr: usize, length: i32): f32 {\n let sum: f32 = 0;\n let i: i32 = 0;\n\n // Process 16 values per iteration with 4 accumulators\n const unrollLength = length & ~15; // length - (length % 16)\n\n if (unrollLength > 0) {\n let acc0 = f32x4Splat(0);\n let acc1 = f32x4Splat(0);\n let acc2 = f32x4Splat(0);\n let acc3 = f32x4Splat(0);\n\n while (i < unrollLength) {\n acc0 = f32x4.add(acc0, v128.load(ptr + (i << 2)));\n acc1 = f32x4.add(acc1, v128.load(ptr + ((i + 4) << 2)));\n acc2 = f32x4.add(acc2, v128.load(ptr + ((i + 8) << 2)));\n acc3 = f32x4.add(acc3, v128.load(ptr + ((i + 12) << 2)));\n i += 16;\n }\n\n // Combine accumulators\n acc0 = f32x4.add(acc0, acc1);\n acc2 = f32x4.add(acc2, acc3);\n acc0 = f32x4.add(acc0, acc2);\n\n // Horizontal sum\n sum = f32x4HorizontalSum(acc0);\n }\n\n // Handle remaining elements\n while (i < length) {\n sum += load<f32>(ptr + (i << 2));\n i++;\n }\n\n return sum;\n}\n\n/**\n * SIMD minimum for Float32 array\n */\nexport function simdMinF32(ptr: usize, length: i32): f32 {\n if (length === 0) return Infinity;\n\n let minVal: f32 = Infinity;\n let i: i32 = 0;\n\n // Process 16 values per iteration with 4 accumulators\n const unrollLength = length & ~15;\n\n if (unrollLength > 0) {\n let acc0 = f32x4Splat(Infinity);\n let acc1 = f32x4Splat(Infinity);\n let acc2 = f32x4Splat(Infinity);\n let acc3 = f32x4Splat(Infinity);\n\n while (i < unrollLength) {\n acc0 = f32x4.min(acc0, v128.load(ptr + (i << 2)));\n acc1 = f32x4.min(acc1, v128.load(ptr + ((i + 4) << 2)));\n acc2 = f32x4.min(acc2, v128.load(ptr + ((i + 8) << 2)));\n acc3 = f32x4.min(acc3, v128.load(ptr + ((i + 12) << 2)));\n i += 16;\n }\n\n // Combine accumulators\n acc0 = f32x4.min(acc0, acc1);\n acc2 = f32x4.min(acc2, acc3);\n acc0 = f32x4.min(acc0, acc2);\n\n minVal = f32x4HorizontalMin(acc0);\n }\n\n // Handle remaining elements\n while (i < length) {\n const val = load<f32>(ptr + (i << 2));\n if (val < minVal) minVal = val;\n i++;\n }\n\n return minVal;\n}\n\n/**\n * SIMD maximum for Float32 array\n */\nexport function simdMaxF32(ptr: usize, length: i32): f32 {\n if (length === 0) return -Infinity;\n\n let maxVal: f32 = -Infinity;\n let i: i32 = 0;\n\n // Process 16 values per iteration with 4 accumulators\n const unrollLength = length & ~15;\n\n if (unrollLength > 0) {\n let acc0 = f32x4Splat(-Infinity);\n let acc1 = f32x4Splat(-Infinity);\n let acc2 = f32x4Splat(-Infinity);\n let acc3 = f32x4Splat(-Infinity);\n\n while (i < unrollLength) {\n acc0 = f32x4.max(acc0, v128.load(ptr + (i << 2)));\n acc1 = f32x4.max(acc1, v128.load(ptr + ((i + 4) << 2)));\n acc2 = f32x4.max(acc2, v128.load(ptr + ((i + 8) << 2)));\n acc3 = f32x4.max(acc3, v128.load(ptr + ((i + 12) << 2)));\n i += 16;\n }\n\n // Combine accumulators\n acc0 = f32x4.max(acc0, acc1);\n acc2 = f32x4.max(acc2, acc3);\n acc0 = f32x4.max(acc0, acc2);\n\n maxVal = f32x4HorizontalMax(acc0);\n }\n\n // Handle remaining elements\n while (i < length) {\n const val = load<f32>(ptr + (i << 2));\n if (val > maxVal) maxVal = val;\n i++;\n }\n\n return maxVal;\n}\n\n// =============================================================================\n// Float64 SIMD Aggregations (2 values per v128)\n// =============================================================================\n\n/**\n * SIMD sum for Float64 array\n * Uses 4 accumulators to hide latency, processing 8 values per iteration\n */\nexport function simdSumF64(ptr: usize, length: i32): f64 {\n let sum: f64 = 0;\n let i: i32 = 0;\n\n // Process 8 values per iteration with 4 accumulators\n const unrollLength = length & ~7; // length - (length % 8)\n\n if (unrollLength > 0) {\n let acc0 = f64x2Splat(0);\n let acc1 = f64x2Splat(0);\n let acc2 = f64x2Splat(0);\n let acc3 = f64x2Splat(0);\n\n while (i < unrollLength) {\n acc0 = f64x2.add(acc0, v128.load(ptr + (i << 3)));\n acc1 = f64x2.add(acc1, v128.load(ptr + ((i + 2) << 3)));\n acc2 = f64x2.add(acc2, v128.load(ptr + ((i + 4) << 3)));\n acc3 = f64x2.add(acc3, v128.load(ptr + ((i + 6) << 3)));\n i += 8;\n }\n\n // Combine accumulators\n acc0 = f64x2.add(acc0, acc1);\n acc2 = f64x2.add(acc2, acc3);\n acc0 = f64x2.add(acc0, acc2);\n\n // Horizontal sum\n sum = f64x2HorizontalSum(acc0);\n }\n\n // Handle remaining elements\n while (i < length) {\n sum += load<f64>(ptr + (i << 3));\n i++;\n }\n\n return sum;\n}\n\n/**\n * SIMD minimum for Float64 array\n */\nexport function simdMinF64(ptr: usize, length: i32): f64 {\n if (length === 0) return Infinity;\n\n let minVal: f64 = Infinity;\n let i: i32 = 0;\n\n // Process 8 values per iteration with 4 accumulators\n const unrollLength = length & ~7;\n\n if (unrollLength > 0) {\n let acc0 = f64x2Splat(Infinity);\n let acc1 = f64x2Splat(Infinity);\n let acc2 = f64x2Splat(Infinity);\n let acc3 = f64x2Splat(Infinity);\n\n while (i < unrollLength) {\n acc0 = f64x2.min(acc0, v128.load(ptr + (i << 3)));\n acc1 = f64x2.min(acc1, v128.load(ptr + ((i + 2) << 3)));\n acc2 = f64x2.min(acc2, v128.load(ptr + ((i + 4) << 3)));\n acc3 = f64x2.min(acc3, v128.load(ptr + ((i + 6) << 3)));\n i += 8;\n }\n\n // Combine accumulators\n acc0 = f64x2.min(acc0, acc1);\n acc2 = f64x2.min(acc2, acc3);\n acc0 = f64x2.min(acc0, acc2);\n\n minVal = f64x2HorizontalMin(acc0);\n }\n\n // Handle remaining elements\n while (i < length) {\n const val = load<f64>(ptr + (i << 3));\n if (val < minVal) minVal = val;\n i++;\n }\n\n return minVal;\n}\n\n/**\n * SIMD maximum for Float64 array\n */\nexport function simdMaxF64(ptr: usize, length: i32): f64 {\n if (length === 0) return -Infinity;\n\n let maxVal: f64 = -Infinity;\n let i: i32 = 0;\n\n // Process 8 values per iteration with 4 accumulators\n const unrollLength = length & ~7;\n\n if (unrollLength > 0) {\n let acc0 = f64x2Splat(-Infinity);\n let acc1 = f64x2Splat(-Infinity);\n let acc2 = f64x2Splat(-Infinity);\n let acc3 = f64x2Splat(-Infinity);\n\n while (i < unrollLength) {\n acc0 = f64x2.max(acc0, v128.load(ptr + (i << 3)));\n acc1 = f64x2.max(acc1, v128.load(ptr + ((i + 2) << 3)));\n acc2 = f64x2.max(acc2, v128.load(ptr + ((i + 4) << 3)));\n acc3 = f64x2.max(acc3, v128.load(ptr + ((i + 6) << 3)));\n i += 8;\n }\n\n // Combine accumulators\n acc0 = f64x2.max(acc0, acc1);\n acc2 = f64x2.max(acc2, acc3);\n acc0 = f64x2.max(acc0, acc2);\n\n maxVal = f64x2HorizontalMax(acc0);\n }\n\n // Handle remaining elements\n while (i < length) {\n const val = load<f64>(ptr + (i << 3));\n if (val > maxVal) maxVal = val;\n i++;\n }\n\n return maxVal;\n}\n\n// =============================================================================\n// Int32 SIMD Aggregations\n// =============================================================================\n\n/**\n * SIMD sum for Int32 array (returns i64 to avoid overflow)\n */\nexport function simdSumI32(ptr: usize, length: i32): i64 {\n let sum: i64 = 0;\n let i: i32 = 0;\n\n // For i32, we accumulate into i64 to prevent overflow\n // Process 4 values at a time using scalar since i32x4 doesn't have a direct i64 accumulator\n const unrollLength = length & ~3;\n\n while (i < unrollLength) {\n sum += load<i32>(ptr + (i << 2));\n sum += load<i32>(ptr + ((i + 1) << 2));\n sum += load<i32>(ptr + ((i + 2) << 2));\n sum += load<i32>(ptr + ((i + 3) << 2));\n i += 4;\n }\n\n // Handle remaining elements\n while (i < length) {\n sum += load<i32>(ptr + (i << 2));\n i++;\n }\n\n return sum;\n}\n\n/**\n * SIMD minimum for Int32 array\n */\nexport function simdMinI32(ptr: usize, length: i32): i32 {\n if (length === 0) return i32.MAX_VALUE;\n\n let minVal: i32 = i32.MAX_VALUE;\n let i: i32 = 0;\n\n // Process 16 values per iteration with 4 accumulators\n const unrollLength = length & ~15;\n\n if (unrollLength > 0) {\n let acc0 = i32x4.splat(i32.MAX_VALUE);\n let acc1 = i32x4.splat(i32.MAX_VALUE);\n let acc2 = i32x4.splat(i32.MAX_VALUE);\n let acc3 = i32x4.splat(i32.MAX_VALUE);\n\n while (i < unrollLength) {\n acc0 = i32x4.min_s(acc0, v128.load(ptr + (i << 2)));\n acc1 = i32x4.min_s(acc1, v128.load(ptr + ((i + 4) << 2)));\n acc2 = i32x4.min_s(acc2, v128.load(ptr + ((i + 8) << 2)));\n acc3 = i32x4.min_s(acc3, v128.load(ptr + ((i + 12) << 2)));\n i += 16;\n }\n\n // Combine accumulators\n acc0 = i32x4.min_s(acc0, acc1);\n acc2 = i32x4.min_s(acc2, acc3);\n acc0 = i32x4.min_s(acc0, acc2);\n\n // Horizontal min\n minVal = min(\n min(i32x4.extract_lane(acc0, 0), i32x4.extract_lane(acc0, 1)),\n min(i32x4.extract_lane(acc0, 2), i32x4.extract_lane(acc0, 3))\n );\n }\n\n // Handle remaining elements\n while (i < length) {\n const val = load<i32>(ptr + (i << 2));\n if (val < minVal) minVal = val;\n i++;\n }\n\n return minVal;\n}\n\n/**\n * SIMD maximum for Int32 array\n */\nexport function simdMaxI32(ptr: usize, length: i32): i32 {\n if (length === 0) return i32.MIN_VALUE;\n\n let maxVal: i32 = i32.MIN_VALUE;\n let i: i32 = 0;\n\n // Process 16 values per iteration with 4 accumulators\n const unrollLength = length & ~15;\n\n if (unrollLength > 0) {\n let acc0 = i32x4.splat(i32.MIN_VALUE);\n let acc1 = i32x4.splat(i32.MIN_VALUE);\n let acc2 = i32x4.splat(i32.MIN_VALUE);\n let acc3 = i32x4.splat(i32.MIN_VALUE);\n\n while (i < unrollLength) {\n acc0 = i32x4.max_s(acc0, v128.load(ptr + (i << 2)));\n acc1 = i32x4.max_s(acc1, v128.load(ptr + ((i + 4) << 2)));\n acc2 = i32x4.max_s(acc2, v128.load(ptr + ((i + 8) << 2)));\n acc3 = i32x4.max_s(acc3, v128.load(ptr + ((i + 12) << 2)));\n i += 16;\n }\n\n // Combine accumulators\n acc0 = i32x4.max_s(acc0, acc1);\n acc2 = i32x4.max_s(acc2, acc3);\n acc0 = i32x4.max_s(acc0, acc2);\n\n // Horizontal max\n maxVal = max(\n max(i32x4.extract_lane(acc0, 0), i32x4.extract_lane(acc0, 1)),\n max(i32x4.extract_lane(acc0, 2), i32x4.extract_lane(acc0, 3))\n );\n }\n\n // Handle remaining elements\n while (i < length) {\n const val = load<i32>(ptr + (i << 2));\n if (val > maxVal) maxVal = val;\n i++;\n }\n\n return maxVal;\n}\n","/**\n * SIMD utilities and helper functions\n */\n\n/** Create a v128 with all f32 lanes set to the same value */\n@inline\nexport function f32x4Splat(value: f32): v128 {\n return f32x4.splat(value);\n}\n\n/** Create a v128 with all f64 lanes set to the same value */\n@inline\nexport function f64x2Splat(value: f64): v128 {\n return f64x2.splat(value);\n}\n\n/** Create a v128 with all i32 lanes set to the same value */\n@inline\nexport function i32x4Splat(value: i32): v128 {\n return i32x4.splat(value);\n}\n\n/** Create a v128 with all i64 lanes set to the same value */\n@inline\nexport function i64x2Splat(value: i64): v128 {\n return i64x2.splat(value);\n}\n\n/** Horizontal sum of f32x4 vector */\n@inline\nexport function f32x4HorizontalSum(v: v128): f32 {\n return (\n f32x4.extract_lane(v, 0) +\n f32x4.extract_lane(v, 1) +\n f32x4.extract_lane(v, 2) +\n f32x4.extract_lane(v, 3)\n );\n}\n\n/** Horizontal sum of f64x2 vector */\n@inline\nexport function f64x2HorizontalSum(v: v128): f64 {\n return f64x2.extract_lane(v, 0) + f64x2.extract_lane(v, 1);\n}\n\n/** Horizontal minimum of f32x4 vector */\n@inline\nexport function f32x4HorizontalMin(v: v128): f32 {\n const a = min(f32x4.extract_lane(v, 0), f32x4.extract_lane(v, 1));\n const b = min(f32x4.extract_lane(v, 2), f32x4.extract_lane(v, 3));\n return min(a, b);\n}\n\n/** Horizontal minimum of f64x2 vector */\n@inline\nexport function f64x2HorizontalMin(v: v128): f64 {\n return min(f64x2.extract_lane(v, 0), f64x2.extract_lane(v, 1));\n}\n\n/** Horizontal maximum of f32x4 vector */\n@inline\nexport function f32x4HorizontalMax(v: v128): f32 {\n const a = max(f32x4.extract_lane(v, 0), f32x4.extract_lane(v, 1));\n const b = max(f32x4.extract_lane(v, 2), f32x4.extract_lane(v, 3));\n return max(a, b);\n}\n\n/** Horizontal maximum of f64x2 vector */\n@inline\nexport function f64x2HorizontalMax(v: v128): f64 {\n return max(f64x2.extract_lane(v, 0), f64x2.extract_lane(v, 1));\n}\n\n/** Check if SIMD is supported (always true in WASM SIMD) */\nexport function simdSupported(): bool {\n return true;\n}\n\n/** Get optimal alignment for SIMD (16 bytes for v128) */\nexport function simdAlignment(): i32 {\n return 16;\n}\n\n/** Prefetch memory for upcoming SIMD operations */\n@inline\nexport function prefetch(ptr: usize): void {\n // WASM doesn't have explicit prefetch, but the compiler may optimize memory access patterns\n // This is a placeholder for potential future optimization\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","/**\n * Column arithmetic operations\n */\n\nimport { DataFrame } from '../dataframe/dataframe';\nimport { NumericColumn, DataType } from '../core/numeric-column';\nimport {\n simdAddF32,\n simdSubF32,\n simdMulF32,\n simdDivF32,\n simdScalarMulF32,\n simdScalarAddF32,\n simdAddF64,\n simdSubF64,\n simdMulF64,\n simdDivF64,\n simdScalarMulF64,\n simdScalarAddF64,\n simdAddI32,\n simdSubI32,\n simdMulI32,\n simdScalarMulI32,\n} from '../simd/simd-arithmetic';\n\n// =============================================================================\n// Column-to-column operations\n// =============================================================================\n\n/**\n * Add two columns, returning a new column\n */\nexport function columnAdd(a: NumericColumn, b: NumericColumn): NumericColumn {\n if (a.length !== b.length) {\n throw new Error('Column length mismatch');\n }\n\n const len = a.length;\n const dtype = a.dtype; // Use same dtype as first column\n const result = new NumericColumn(len, dtype);\n\n const aPtr = a.dataPtr;\n const bPtr = b.dataPtr;\n const dstPtr = result.dataPtr;\n\n switch (dtype) {\n case DataType.Float32:\n simdAddF32(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Float64:\n simdAddF64(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Int32:\n simdAddI32(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Int64:\n for (let i: i32 = 0; i < len; i++) {\n result.setI64(i, a.getI64(i) + b.getI64(i));\n }\n break;\n }\n\n return result;\n}\n\n/**\n * Subtract two columns (a - b), returning a new column\n */\nexport function columnSub(a: NumericColumn, b: NumericColumn): NumericColumn {\n if (a.length !== b.length) {\n throw new Error('Column length mismatch');\n }\n\n const len = a.length;\n const dtype = a.dtype;\n const result = new NumericColumn(len, dtype);\n\n const aPtr = a.dataPtr;\n const bPtr = b.dataPtr;\n const dstPtr = result.dataPtr;\n\n switch (dtype) {\n case DataType.Float32:\n simdSubF32(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Float64:\n simdSubF64(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Int32:\n simdSubI32(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Int64:\n for (let i: i32 = 0; i < len; i++) {\n result.setI64(i, a.getI64(i) - b.getI64(i));\n }\n break;\n }\n\n return result;\n}\n\n/**\n * Multiply two columns element-wise, returning a new column\n */\nexport function columnMul(a: NumericColumn, b: NumericColumn): NumericColumn {\n if (a.length !== b.length) {\n throw new Error('Column length mismatch');\n }\n\n const len = a.length;\n const dtype = a.dtype;\n const result = new NumericColumn(len, dtype);\n\n const aPtr = a.dataPtr;\n const bPtr = b.dataPtr;\n const dstPtr = result.dataPtr;\n\n switch (dtype) {\n case DataType.Float32:\n simdMulF32(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Float64:\n simdMulF64(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Int32:\n simdMulI32(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Int64:\n for (let i: i32 = 0; i < len; i++) {\n result.setI64(i, a.getI64(i) * b.getI64(i));\n }\n break;\n }\n\n return result;\n}\n\n/**\n * Divide two columns element-wise (a / b), returning a new column\n */\nexport function columnDiv(a: NumericColumn, b: NumericColumn): NumericColumn {\n if (a.length !== b.length) {\n throw new Error('Column length mismatch');\n }\n\n const len = a.length;\n const dtype = a.dtype;\n const result = new NumericColumn(len, dtype);\n\n const aPtr = a.dataPtr;\n const bPtr = b.dataPtr;\n const dstPtr = result.dataPtr;\n\n switch (dtype) {\n case DataType.Float32:\n simdDivF32(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Float64:\n simdDivF64(aPtr, bPtr, dstPtr, len);\n break;\n case DataType.Int32:\n // Integer division (no SIMD)\n for (let i: i32 = 0; i < len; i++) {\n const bVal = load<i32>(bPtr + (i << 2));\n if (bVal !== 0) {\n store<i32>(dstPtr + (i << 2), load<i32>(aPtr + (i << 2)) / bVal);\n } else {\n store<i32>(dstPtr + (i << 2), 0);\n }\n }\n break;\n case DataType.Int64:\n for (let i: i32 = 0; i < len; i++) {\n const bVal = b.getI64(i);\n if (bVal !== 0) {\n result.setI64(i, a.getI64(i) / bVal);\n } else {\n result.setI64(i, 0);\n }\n }\n break;\n }\n\n return result;\n}\n\n// =============================================================================\n// Scalar operations\n// =============================================================================\n\n/**\n * Multiply column by scalar, returning a new column\n */\nexport function columnScalarMul(col: NumericColumn, scalar: f64): NumericColumn {\n const len = col.length;\n const dtype = col.dtype;\n const result = new NumericColumn(len, dtype);\n\n const srcPtr = col.dataPtr;\n const dstPtr = result.dataPtr;\n\n switch (dtype) {\n case DataType.Float32:\n simdScalarMulF32(srcPtr, <f32>scalar, dstPtr, len);\n break;\n case DataType.Float64:\n simdScalarMulF64(srcPtr, scalar, dstPtr, len);\n break;\n case DataType.Int32:\n simdScalarMulI32(srcPtr, <i32>scalar, dstPtr, len);\n break;\n case DataType.Int64:\n const scalarI64 = <i64>scalar;\n for (let i: i32 = 0; i < len; i++) {\n result.setI64(i, col.getI64(i) * scalarI64);\n }\n break;\n }\n\n return result;\n}\n\n/**\n * Add scalar to column, returning a new column\n */\nexport function columnScalarAdd(col: NumericColumn, scalar: f64): NumericColumn {\n const len = col.length;\n const dtype = col.dtype;\n const result = new NumericColumn(len, dtype);\n\n const srcPtr = col.dataPtr;\n const dstPtr = result.dataPtr;\n\n switch (dtype) {\n case DataType.Float32:\n simdScalarAddF32(srcPtr, <f32>scalar, dstPtr, len);\n break;\n case DataType.Float64:\n simdScalarAddF64(srcPtr, scalar, dstPtr, len);\n break;\n case DataType.Int32:\n const scalarI32 = <i32>scalar;\n for (let i: i32 = 0; i < len; i++) {\n store<i32>(dstPtr + (i << 2), load<i32>(srcPtr + (i << 2)) + scalarI32);\n }\n break;\n case DataType.Int64:\n const scalarI64 = <i64>scalar;\n for (let i: i32 = 0; i < len; i++) {\n result.setI64(i, col.getI64(i) + scalarI64);\n }\n break;\n }\n\n return result;\n}\n\n// =============================================================================\n// DataFrame-level operations\n// =============================================================================\n\n/**\n * Add two columns in a DataFrame, storing result in new column\n */\nexport function dfAdd(\n df: DataFrame,\n colA: string,\n colB: string,\n resultName: string\n): void {\n const a = df.getNumericColumn(colA);\n const b = df.getNumericColumn(colB);\n if (a === null || b === null) {\n throw new Error('Column not found');\n }\n\n const result = columnAdd(a!, b!);\n\n switch (a!.dtype) {\n case DataType.Float32:\n df.addFloat32Column(resultName, result);\n break;\n case DataType.Float64:\n df.addFloat64Column(resultName, result);\n break;\n case DataType.Int32:\n df.addInt32Column(resultName, result);\n break;\n case DataType.Int64:\n df.addInt64Column(resultName, result);\n break;\n }\n}\n\n/**\n * Subtract columns in a DataFrame (colA - colB), storing result in new column\n */\nexport function dfSub(\n df: DataFrame,\n colA: string,\n colB: string,\n resultName: string\n): void {\n const a = df.getNumericColumn(colA);\n const b = df.getNumericColumn(colB);\n if (a === null || b === null) {\n throw new Error('Column not found');\n }\n\n const result = columnSub(a!, b!);\n\n switch (a!.dtype) {\n case DataType.Float32:\n df.addFloat32Column(resultName, result);\n break;\n case DataType.Float64:\n df.addFloat64Column(resultName, result);\n break;\n case DataType.Int32:\n df.addInt32Column(resultName, result);\n break;\n case DataType.Int64:\n df.addInt64Column(resultName, result);\n break;\n }\n}\n\n/**\n * Multiply column by scalar in a DataFrame, storing result in new column\n */\nexport function dfScalarMul(\n df: DataFrame,\n colName: string,\n scalar: f64,\n resultName: string\n): void {\n const col = df.getNumericColumn(colName);\n if (col === null) {\n throw new Error('Column not found');\n }\n\n const result = columnScalarMul(col!, scalar);\n\n switch (col!.dtype) {\n case DataType.Float32:\n df.addFloat32Column(resultName, result);\n break;\n case DataType.Float64:\n df.addFloat64Column(resultName, result);\n break;\n case DataType.Int32:\n df.addInt32Column(resultName, result);\n break;\n case DataType.Int64:\n df.addInt64Column(resultName, result);\n break;\n }\n}\n","/**\n * SIMD-accelerated arithmetic operations on columns\n */\n\nimport { f32x4Splat, f64x2Splat } from './simd-utils';\n\n// =============================================================================\n// Float32 SIMD Arithmetic (4 values per v128)\n// =============================================================================\n\n/**\n * Add two Float32 arrays element-wise, storing result in destination\n */\nexport function simdAddF32(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3; // Process 4 at a time\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f32x4.add(a, b));\n i += 4;\n }\n\n // Handle remaining elements\n while (i < length) {\n const offset = i << 2;\n store<f32>(dstPtr + offset, load<f32>(aPtr + offset) + load<f32>(bPtr + offset));\n i++;\n }\n}\n\n/**\n * Subtract two Float32 arrays element-wise (a - b)\n */\nexport function simdSubF32(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f32x4.sub(a, b));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<f32>(dstPtr + offset, load<f32>(aPtr + offset) - load<f32>(bPtr + offset));\n i++;\n }\n}\n\n/**\n * Multiply two Float32 arrays element-wise\n */\nexport function simdMulF32(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f32x4.mul(a, b));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<f32>(dstPtr + offset, load<f32>(aPtr + offset) * load<f32>(bPtr + offset));\n i++;\n }\n}\n\n/**\n * Divide two Float32 arrays element-wise (a / b)\n */\nexport function simdDivF32(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f32x4.div(a, b));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<f32>(dstPtr + offset, load<f32>(aPtr + offset) / load<f32>(bPtr + offset));\n i++;\n }\n}\n\n/**\n * Multiply Float32 array by scalar\n */\nexport function simdScalarMulF32(srcPtr: usize, scalar: f32, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n const scalarVec = f32x4Splat(scalar);\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(srcPtr + offset);\n v128.store(dstPtr + offset, f32x4.mul(a, scalarVec));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<f32>(dstPtr + offset, load<f32>(srcPtr + offset) * scalar);\n i++;\n }\n}\n\n/**\n * Add scalar to Float32 array\n */\nexport function simdScalarAddF32(srcPtr: usize, scalar: f32, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n const scalarVec = f32x4Splat(scalar);\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(srcPtr + offset);\n v128.store(dstPtr + offset, f32x4.add(a, scalarVec));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<f32>(dstPtr + offset, load<f32>(srcPtr + offset) + scalar);\n i++;\n }\n}\n\n// =============================================================================\n// Float64 SIMD Arithmetic (2 values per v128)\n// =============================================================================\n\n/**\n * Add two Float64 arrays element-wise\n */\nexport function simdAddF64(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~1; // Process 2 at a time\n\n while (i < simdLength) {\n const offset = i << 3;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f64x2.add(a, b));\n i += 2;\n }\n\n // Handle remaining element\n if (i < length) {\n const offset = i << 3;\n store<f64>(dstPtr + offset, load<f64>(aPtr + offset) + load<f64>(bPtr + offset));\n }\n}\n\n/**\n * Subtract two Float64 arrays element-wise (a - b)\n */\nexport function simdSubF64(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~1;\n\n while (i < simdLength) {\n const offset = i << 3;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f64x2.sub(a, b));\n i += 2;\n }\n\n if (i < length) {\n const offset = i << 3;\n store<f64>(dstPtr + offset, load<f64>(aPtr + offset) - load<f64>(bPtr + offset));\n }\n}\n\n/**\n * Multiply two Float64 arrays element-wise\n */\nexport function simdMulF64(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~1;\n\n while (i < simdLength) {\n const offset = i << 3;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f64x2.mul(a, b));\n i += 2;\n }\n\n if (i < length) {\n const offset = i << 3;\n store<f64>(dstPtr + offset, load<f64>(aPtr + offset) * load<f64>(bPtr + offset));\n }\n}\n\n/**\n * Divide two Float64 arrays element-wise (a / b)\n */\nexport function simdDivF64(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~1;\n\n while (i < simdLength) {\n const offset = i << 3;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, f64x2.div(a, b));\n i += 2;\n }\n\n if (i < length) {\n const offset = i << 3;\n store<f64>(dstPtr + offset, load<f64>(aPtr + offset) / load<f64>(bPtr + offset));\n }\n}\n\n/**\n * Multiply Float64 array by scalar\n */\nexport function simdScalarMulF64(srcPtr: usize, scalar: f64, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~1;\n const scalarVec = f64x2Splat(scalar);\n\n while (i < simdLength) {\n const offset = i << 3;\n const a = v128.load(srcPtr + offset);\n v128.store(dstPtr + offset, f64x2.mul(a, scalarVec));\n i += 2;\n }\n\n if (i < length) {\n const offset = i << 3;\n store<f64>(dstPtr + offset, load<f64>(srcPtr + offset) * scalar);\n }\n}\n\n/**\n * Add scalar to Float64 array\n */\nexport function simdScalarAddF64(srcPtr: usize, scalar: f64, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~1;\n const scalarVec = f64x2Splat(scalar);\n\n while (i < simdLength) {\n const offset = i << 3;\n const a = v128.load(srcPtr + offset);\n v128.store(dstPtr + offset, f64x2.add(a, scalarVec));\n i += 2;\n }\n\n if (i < length) {\n const offset = i << 3;\n store<f64>(dstPtr + offset, load<f64>(srcPtr + offset) + scalar);\n }\n}\n\n// =============================================================================\n// Int32 SIMD Arithmetic (4 values per v128)\n// =============================================================================\n\n/**\n * Add two Int32 arrays element-wise\n */\nexport function simdAddI32(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, i32x4.add(a, b));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<i32>(dstPtr + offset, load<i32>(aPtr + offset) + load<i32>(bPtr + offset));\n i++;\n }\n}\n\n/**\n * Subtract two Int32 arrays element-wise (a - b)\n */\nexport function simdSubI32(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, i32x4.sub(a, b));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<i32>(dstPtr + offset, load<i32>(aPtr + offset) - load<i32>(bPtr + offset));\n i++;\n }\n}\n\n/**\n * Multiply two Int32 arrays element-wise\n */\nexport function simdMulI32(aPtr: usize, bPtr: usize, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(aPtr + offset);\n const b = v128.load(bPtr + offset);\n v128.store(dstPtr + offset, i32x4.mul(a, b));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<i32>(dstPtr + offset, load<i32>(aPtr + offset) * load<i32>(bPtr + offset));\n i++;\n }\n}\n\n/**\n * Multiply Int32 array by scalar\n */\nexport function simdScalarMulI32(srcPtr: usize, scalar: i32, dstPtr: usize, length: i32): void {\n let i: i32 = 0;\n const simdLength = length & ~3;\n const scalarVec = i32x4.splat(scalar);\n\n while (i < simdLength) {\n const offset = i << 2;\n const a = v128.load(srcPtr + offset);\n v128.store(dstPtr + offset, i32x4.mul(a, scalarVec));\n i += 4;\n }\n\n while (i < length) {\n const offset = i << 2;\n store<i32>(dstPtr + offset, load<i32>(srcPtr + offset) * scalar);\n i++;\n }\n}\n","/**\n * SharedArrayBuffer support for zero-copy JS access\n * Memory is imported from JS to enable SharedArrayBuffer usage\n */\n\n/**\n * Get the base address of WASM linear memory\n * This is always 0 in WASM but exported for clarity\n */\nexport function getMemoryBase(): usize {\n return 0;\n}\n\n/**\n * Get the current memory size in bytes\n */\nexport function getMemorySize(): usize {\n return <usize>memory.size() << 16; // pages * 64KB\n}\n\n/**\n * Create a view descriptor for a buffer\n * Returns offset and length for JS to create TypedArray view\n */\n@final\nexport class BufferView {\n /** Byte offset into WASM memory */\n offset: usize;\n /** Length in elements (not bytes) */\n length: i32;\n /** Element size in bytes */\n elementSize: i32;\n\n constructor(offset: usize, length: i32, elementSize: i32) {\n this.offset = offset;\n this.length = length;\n this.elementSize = elementSize;\n }\n\n /** Get byte length */\n get byteLength(): i32 {\n return this.length * this.elementSize;\n }\n}\n\n/**\n * Create a buffer view for Int32Array\n */\nexport function createInt32View(ptr: usize, length: i32): BufferView {\n return new BufferView(ptr, length, 4);\n}\n\n/**\n * Create a buffer view for Int64Array (BigInt64Array in JS)\n */\nexport function createInt64View(ptr: usize, length: i32): BufferView {\n return new BufferView(ptr, length, 8);\n}\n\n/**\n * Create a buffer view for Float32Array\n */\nexport function createFloat32View(ptr: usize, length: i32): BufferView {\n return new BufferView(ptr, length, 4);\n}\n\n/**\n * Create a buffer view for Float64Array\n */\nexport function createFloat64View(ptr: usize, length: i32): BufferView {\n return new BufferView(ptr, length, 8);\n}\n\n/**\n * Create a buffer view for Uint8Array\n */\nexport function createUint8View(ptr: usize, length: i32): BufferView {\n return new BufferView(ptr, length, 1);\n}\n\n/**\n * Atomic operations for thread synchronization\n * These use WASM atomics when compiled with --enable threads\n */\n\n/**\n * Atomic load of i32\n */\nexport function atomicLoadI32(ptr: usize): i32 {\n return atomic.load<i32>(ptr);\n}\n\n/**\n * Atomic store of i32\n */\nexport function atomicStoreI32(ptr: usize, value: i32): void {\n atomic.store<i32>(ptr, value);\n}\n\n/**\n * Atomic add of i32\n */\nexport function atomicAddI32(ptr: usize, value: i32): i32 {\n return atomic.add<i32>(ptr, value);\n}\n\n/**\n * Atomic compare-and-swap of i32\n */\nexport function atomicCasI32(ptr: usize, expected: i32, replacement: i32): i32 {\n return atomic.cmpxchg<i32>(ptr, expected, replacement);\n}\n\n/**\n * Memory fence (full barrier)\n */\nexport function memoryFence(): void {\n atomic.fence();\n}\n","type auto = i32;\n\n@final export abstract class Function<T> {\n private _index: u32;\n private _env: usize;\n\n // @ts-ignore: this on getter\n get index(this: T): u32 {\n return load<u32>(changetype<usize>(this), offsetof<Function<T>>(\"_index\"));\n }\n\n // @ts-ignore: this on getter\n get name(this: T): string {\n return \"\";\n }\n\n // @ts-ignore: this on getter\n get length(this: T): i32 {\n // @ts-ignore: T is function\n return lengthof<T>();\n }\n\n // @ts-ignore: T is function\n @builtin call(thisArg: thisof<T> | null, ...args: auto[]): returnof<T> {\n return unreachable();\n }\n\n toString(this: T): string {\n return \"function() { [native code] }\";\n }\n\n // RT integration\n\n @unsafe private __visit(cookie: u32): void {\n // Env is either `null` (nop) or compiler-generated\n __visit(this._env, cookie);\n }\n}\n"]}
|