# **Architecting Minimalist Neural Inference in WebAssembly: Design Patterns for Constrained Environments**

## **The Frontier of Edge-Native Browser Inference**

The paradigm of deploying large language models (LLMs) and deep neural architectures has traditionally relied on robust, server-side infrastructure equipped with high-bandwidth memory and discrete hardware accelerators. However, the drive toward privacy-preserving, zero-latency, and offline-capable artificial intelligence has catalyzed a profound shift toward edge-native inference executed directly within the web browser. Executing complex neural architectures in a client-side environment utilizing WebAssembly (WASM) and Rust presents a unique confluence of strict operational constraints and high-performance requirements1.  
WebAssembly operates as a 32-bit (wasm32), sandboxed, stack-based virtual machine3. When engineered for a pure, zero-dependency environment utilizing Rust’s no\_std attribute, the developer is deliberately stripped of the standard library, the host operating system's memory allocator, dynamic threading models, and fundamental floating-point mathematical libraries conventionally provided by libm5. Building a neural inference engine under these draconian conditions demands rigorous adherence to static memory planning, zero-copy data structures, explicit SIMD (Single Instruction, Multiple Data) vectorization, and deterministic execution paths.  
The architecture required to support such a framework must completely eschew standard dynamic allocations during the hot path of the forward pass. Instead, it relies on pre-calculated heap arenas, heavily quantized matrix-vector operations executed via WASM's v128 extensions, and custom polynomial approximations for transcendental mathematical functions5. This report details the exhaustive design patterns required to architect a robust, production-grade neural inference engine strictly confined to a WebAssembly environment with zero external dependencies, proving that edge-native AI can match the reliability of server-side deployments.

## **WASM Heap Planning and Static Memory Layout**

In a standard Rust application, memory allocation is abstracted by the operating system and the global allocator, which dynamically requests memory pages as needed. In a no\_std WebAssembly environment, memory is a linear, contiguous byte array (WebAssembly.Memory) that begins at a fixed size and must be manually grown using the memory.grow instruction9. Because dynamic allocations (such as instantiating a Vec or String during a matrix multiplication) introduce severe latency penalties, fragmentation, and potential out-of-memory (OOM) panics within the 4GB wasm32 limit, inference engines must adopt an arena-based, static memory layout4.

### **The Bump Allocation Paradigm**

To avoid the overhead of traditional allocators, the preferred pattern is bump allocation (or arena allocation) implemented via custom global allocators designed specifically for resource-constrained environments. While early WASM projects heavily relied on wee\_alloc, it is no longer recommended for production code targeting WebAssembly due to maintenance and performance issues13. Instead, modern implementations favor high-performance, no\_std compatible alternatives such as talc or bumpalo12.  
At initialization, the engine calculates the maximum theoretical memory footprint required for the model weights, the Key-Value (KV) cache, and the activation buffers for the largest allowable context window. The total required memory footprint can be deterministically calculated prior to the first forward pass. Once the linear memory is grown to accommodate this total footprint, the arena allocator simply advances a pointer for each requested buffer. During the model's forward pass, no dynamic memory is requested. Instead, intermediate tensors are represented as zero-copy strided views—lightweight structs containing a raw pointer, shape, and stride information14.

### **Zero-Copy Weight Loading and Tensor Layout**

Loading gigabytes of model weights into WASM memory requires zero-copy deserialization. Using formats like GGUF or custom .apr binaries, the weights are mapped directly into the pre-allocated linear memory17. The inference engine defines tensor layouts strictly as multi-dimensional arrays with explicit row-major or column-major strides, enabling instantaneous reshaping, permutation, and broadcasting without moving a single byte of underlying data14.  
Table 1 delineates the memory characteristics of standard tensor operations executed under a zero-copy paradigm compared to traditional dynamic implementations.

| Tensor Operation | Standard Implementation | Zero-Copy WASM Implementation | Runtime Memory Overhead |
| :---- | :---- | :---- | :---- |
| **Transpose** | Allocates new buffer, copies data sequentially | Swaps dimensions and strides in metadata | ![][image1] |
| **Slice / Narrow** | Allocates new buffer, copies subset of elements | Modifies shape and starting pointer offset | ![][image1] |
| **Broadcasting** | Allocates expanded buffer, duplicates values | Sets specific dimension strides to 0 | ![][image1] |
| **Sliding Window** | Materializes overlapped chunks in memory | Alters strides for localized neighborhood views | ![][image1] |

By maintaining a static heap and aggressively relying on zero-copy tensor views, the engine guarantees that the memory footprint remains constant throughout the inference lifecycle. This entirely eliminates garbage collection pauses or allocator bottlenecks, which is particularly vital in browser environments where memory exhaustion leads to silent tab crashes19.

## **Zero-Allocation Tokenizer Design**

Before an inference engine can process human-readable text, the string must be converted into numerical tokens via Byte Pair Encoding (BPE)22. Traditional BPE tokenizers, such as OpenAI's tiktoken, rely heavily on regular expressions for text segmentation and dynamic hash maps for vocabulary lookups. In a no\_std WASM environment, bringing in standard regular expression engines incurs massive binary bloat, and dynamic heap allocations during the tokenization loop destroy performance and memory stability5.

### **Pre-compiled Deterministic Finite Automata (DFA)**

To bypass the overhead of standard regular expression engines, the tokenizer utilizes a fully materialized, pre-compiled Deterministic Finite Automaton (DFA) generated at build time. By mapping the required regex patterns (which split input text into manageable words and symbols before BPE merging) into a static byte-array representing state transitions, the engine achieves zero-allocation pattern matching23.  
Using libraries like regex-automata, all states are computed upfront and embedded directly into the Rust binary. This eliminates the lazy building at search time that characterizes standard regex engines, bypassing the severe cold-start penalties that would otherwise degrade the initial time-to-first-token metric in a browser23. Because this dense DFA has no mutable state, a single instance can be shared across all execution threads without requiring mutex locks or per-thread clones.

### **Trie Structures and Flat Array Vocabularies**

The BPE merging process requires continuous querying of a vocabulary (often containing up to 128,000 or 152,000 tokens) to find the rank of byte-pair combinations6. Because std::collections::HashMap requires an underlying random number generator to prevent HashDoS attacks (which is inherently unavailable in a deterministic no\_std environment), the vocabulary must be structured differently21.  
Two dominant patterns exist for zero-allocation lookups in this ecosystem. The first utilizes a BTreeMap, which provides ![][image2] lookups without requiring an external random state, functioning perfectly within the boundaries of the alloc or core crates5. The second, more performant approach involves a deterministic FxHashMap constructed over a flat array. By storing the vocabulary as a map from a byte slice (&\[u8\]) to a rank integer, the tokenizer performs zero-allocation hash lookups directly from the input buffer23.  
To prevent the classic ![][image3] memory-shifting performance cliff that occurs when merging tokens in a standard vector, the state vector is implemented as an intrusive doubly-linked list inside a flat array. When two adjacent tokens are merged, their metadata is updated in place and surrounding links are adjusted, rather than calling a dynamic remove function that forces the entire underlying array to shift leftwards23. This cache-aware merge update ensures that the cells remain hot in the CPU cache, drastically accelerating the tokenization of large context windows. Furthermore, by implementing a whole-piece fast path, the tokenizer checks if a regex-split piece is already a full vocabulary entry before running the BPE loop, skipping the process entirely for over 99% of common English text23.

## **Quantized Matrix-Vector Operations and WASM SIMD**

The computational core of any transformer-based neural network is the dense matrix multiplication (MatMul) and matrix-vector multiplication (MatVec) executed in the linear layers and attention mechanisms. Given that standard WebAssembly lacks access to dedicated GPU hardware, performance is entirely bottlenecked by CPU throughput and memory bandwidth1. To circumvent these physical limits, models are compressed using post-training quantization, reducing 32-bit floating-point (FP32) weights to 8-bit (Q8\_0), 6-bit (Q6\_K), or 4-bit (Q4\_0) integers5.

### **Quantization Schemas and Block Architecture**

Quantization in heavily constrained environments is rarely applied uniformly across the entire tensor, as varying activation distributions and outlier features would cause catastrophic precision loss. Instead, weights are grouped into localized blocks, commonly containing 32 elements5.  
For a Q4\_0 format, each block contains a single 16-bit float (f16) scaling factor and 32 elements quantized to 4 bits each. Because 4-bit integers are packed two-per-byte (nibbles), the 32 elements consume exactly 16 bytes. Combined with the 2-byte scaling factor, a Q4\_0 block consumes 18 bytes5. This achieves a compression ratio of approximately 4.5x compared to FP32, drastically reducing memory bandwidth constraints during the memory-bound MatVec operations27. Other formats, such as Q6\_K, utilize a more complex structure with per-superblock scales and per-block sub-scales, requiring careful bit unpacking across multiple byte segments5.  
Table 2 highlights the structural differences and memory footprints of common block quantization formats utilized in WebAssembly environments.

| Quantization Format | Elements per Block | Scale Data Type | Bits per Weight | Block Size (Bytes) | Compression vs FP32 |
| :---- | :---- | :---- | :---- | :---- | :---- |
| **FP32 (Baseline)** | 1 | N/A | 32 | 4 | 1.0x |
| **Q8\_0** | 32 | f16 (2 bytes) | 8 | 34 | \~3.76x |
| **Q6\_K** | 256 | Super/Sub scales | 6 | 210 | \~4.87x |
| **Q4\_0** | 32 | f16 (2 bytes) | 4 | 18 | \~7.11x |

### **SIMD128 Vectorization Intrinsics**

Modern WebAssembly provides the simd128 extension, exposing 128-bit vector registers (v128) capable of operating on multiple data points simultaneously2. The Rust core library exposes these intrinsics via the core::arch::wasm32 module7. To perform a highly optimized MatVec operation on a Q4\_0 quantized matrix and an FP32 activation vector, the algorithm relies on specific SIMD intrinsics to dequantize and multiply on the fly. The engine explicitly avoids materializing the dequantized weights in memory, performing the operation directly within the CPU registers30.  
The process follows a strict, unrolled microkernel design:

1. **Vectorized Load:** The FP32 activation vector is loaded into v128 registers.  
2. **Unpacking:** The 4-bit nibbles from the weight block are loaded as v128 types. The engine uses bitwise shifts (e.g., u8x16\_shl) and bitwise masks to separate the upper and lower nibbles into distinct 8-bit integers5.  
3. **Dot Product Accumulation:** The unpacked 8-bit weights are multiplied by the activations. WebAssembly's relaxed SIMD proposals introduce specialized instructions such as i16x8\_relaxed\_dot\_i8x16\_i7x16 or i32x4\_dot\_i16x8, which allow for highly efficient dot-product accumulation directly in the registers31.  
4. **Scale Application:** The accumulated integer dot product is converted to a 32-bit float (f32x4\_convert\_i32x4) and multiplied by the block's f16 scaling factor. In native environments, hardware instructions like vcvtph2ps handle this f16 to f32 conversion, but in pure WASM, this may require manual bit-manipulation unless specifically supported by the host runtime's translation layer5.

By leveraging automatic loop unrolling and processing 64 elements (two complete Q4\_0 blocks) per iteration, the SIMD-accelerated WASM runtime can achieve up to a 4x speedup over scalar execution, achieving latencies suitable for real-time text generation directly in the browser2.

## **Transcending the Float Runtime: Polynomial Approximations**

A major architectural hurdle in a pure no\_std WASM environment is the absolute absence of a mathematical standard library (libm). Functions like the natural exponential (![][image4]), required for the Softmax operation in the attention mechanism and cross-entropy loss calculations, are not natively available as CPU instructions5. Relying on external crates for standard expf introduces massive computational overhead and severely compromises the zero-dependency directive.  
To resolve this, architectural patterns dictate the use of high-performance polynomial approximations (such as the Maclaurin series or Remez algorithm variants) specifically tuned for the valid domain of Softmax inputs5. The approximation algorithm transforms the complex computation of ![][image4] into the computation of a power of 2, leveraging the properties of floating-point bit representation:  
![][image5]  
The pre-scaled value ![][image6] is analytically split into an integer component ![][image7] and a fractional component ![][image8], such that ![][image9]36. The fractional term ![][image10] is then computed using a low-order polynomial approximation, which evaluates entirely via basic arithmetic (multiplication and addition). This algebraic approach is perfectly suited for f32x4 SIMD vectorization, allowing multiple exponentials to be calculated simultaneously across the vector lanes.  
Finally, the result is scaled by ![][image11]. Rather than performing an expensive multiplication, the algorithm directly injects the integer ![][image12] into the exponent bit-field of the IEEE-754 single-precision float36. Because standard floor functions are unavailable, the engine utilizes a rounding trick involving the "magic" conversion constant ![][image13] to force rounding in the correct bit position, effectively extracting the integer portion in round-to-nearest mode36.  
Furthermore, to ensure numerical stability and prevent floating-point overflow during the attention mechanism, the implementation relies heavily on the log-sum-exp trick. Because low-order polynomial approximations become wildly inaccurate outside a limited range, the engine implements a clamped polynomial softmax. This algorithm-hardware co-optimization suppresses extreme attention scores that contribute negligibly to final probabilities before normalization, ensuring the low-order polynomial remains highly accurate within the constrained evaluation range5. The uniform fallback mechanism activates when the sum of the exponentials drops below ![][image14], preventing division by zero errors5.

## **KV-Cache Budgeting and Storage Layouts**

In autoregressive transformer models, the Key-Value (KV) cache stores the intermediate key and value vectors for all previous tokens in the sequence. Without the KV cache, the model would need to recompute the entire sequence for every newly generated token, resulting in an unsustainable ![][image3] computational complexity. However, the KV cache footprint grows linearly with every token, rapidly threatening to breach the WASM memory envelope37.  
The memory required for a standard KV cache in bytes can be explicitly modeled as:  
![][image15]  
Where ![][image16] is the number of transformer layers, ![][image17] is the number of KV attention heads, ![][image18] is the head dimension, ![][image19] is the sequence length, and ![][image20] is the byte-size of the parameter (e.g., 2 bytes for f16).

### **Ring Buffers and Sliding Windows**

To enforce strict, unyielding bounds on memory utilization, the inference engine implements a sliding-window KV cache using a ring buffer architecture37. Instead of shifting massive blocks of memory when the maximum context length is reached—which would devastate performance—the engine utilizes modulo arithmetic to overwrite the oldest token vectors in-place:  
![][image21]  
This single-kernel approach avoids costly CPU-side index math and memory reallocation, maintaining a highly predictable memory access pattern37.

### **Fixed-Block Storage and Quantized Caching**

For more advanced agentic workflows requiring multi-turn conversations and massive document processing, the KV cache can be treated as granular, fixed-size memory blocks, highly analogous to operating system memory pages5. By aligning block sizes to exact head-dimension multiples (e.g., configuring blocks to hold exactly 32 or 64 tokens per attention head), the engine guarantees perfectly aligned SIMD memory access, minimizing cross-block reads during the prefill and decode stages42.  
Table 3 illustrates the alignment strategy for block-based KV caches, optimized for SIMD traversal.

| Alignment Metric | Dimension | Memory Calculation (f16) | Architectural Benefit |
| :---- | :---- | :---- | :---- |
| **Head Dimension (![][image18])** | 128 elements | 256 bytes per token | Contiguous cache-line read, avoiding strided penalties |
| **Block Size (![][image22])** | 32 tokens | 8,192 bytes per block | Single memory page alignment, predictable bounds |
| **Stride across Layers** | Constant offset | ![][image1] pointer arithmetic | Zero memory fragmentation during multi-turn chats |

To further extend the context window without expanding the memory footprint, the KV cache itself can be subjected to extreme 2-bit or 4-bit quantization, leveraging techniques like TurboQuant37. By compressing the past token states in real-time using Lloyd-Max codebooks, the engine trades a marginal amount of computational overhead (fused dequantization during the attention dot-product) for up to an 8x reduction in KV cache memory usage37. This paradigm shift allows models to process thousands of tokens entirely within a browser's strict memory limitations38.

### **The KV Cache as Process State**

A profound architectural pattern emerges when the KV cache is treated identically to an operating system's CPU register state. By abstracting the KV cache behind kernel-level operations (kv\_checkpoint(), kv\_restore(), kv\_fork()), the inference engine can pause generation, snapshot the exact state of the attention blocks, and seamlessly branch execution5.  
This allows a single browser tab to evaluate multiple probabilistic reasoning paths (such as speculative decoding or tree-of-thought prompting) simultaneously by forking the cache without needing to clone the underlying gigabytes of static model weights5. The snapshot operation uses checked multiplication to prevent integer overflow and enforces a strict byte cap to prevent adversarial memory exhaustion5.

## **Deterministic Sampling in Stochastic Ecosystems**

Large Language Models are inherently stochastic. The raw output of the forward pass is a vector of logits, which is passed through a Softmax function to produce a probability distribution over the entire vocabulary. The generation of a word involves sampling from this distribution, modulated by parameters like Temperature, Top-K, and Top-P (Nucleus Sampling)44.  
Temperature flattens or sharpens the probability distribution prior to sampling. Top-K restricts the sampling pool to the ![][image23] most probable tokens, truncating the long tail of the distribution. Top-P dynamically restricts the pool to the smallest set of tokens whose cumulative probability exceeds the threshold ![][image20], adapting to the sharpness of the distribution45. However, in production-grade systems—particularly in client-side applications requiring replayability, offline consensus, or strictly verifiable outputs—the inference process must be completely deterministic. If a model is fed the same prompt, with the same configuration, and the same random seed, it must produce the exact same sequence of tokens every single time47.

### **The Threat of Floating-Point Non-Determinism**

Achieving mathematical determinism across heterogeneous hardware architectures (e.g., x86\_64 vs. ARM64) executing the exact same WebAssembly binary is notoriously difficult due to edge cases in the IEEE-754 floating-point specification11.  
The primary sources of non-determinism include:

1. **Associativity in Parallel Reductions:** Floating-point addition is fundamentally non-associative (![][image24]). If a Dot-Product or a Softmax sum is computed in parallel (using Rayon or SharedArrayBuffer threading), the order of accumulation may change depending on unpredictable thread scheduling. This leads to micro-variations in the least significant bits, which cascade into entirely divergent token generations47.  
2. **Fused Multiply-Add (FMA):** Operations computing ![][image25] can be executed as a single instruction with one rounding step (FMA), or two distinct instructions with two rounding steps. If the WASM runtime decides to utilize FMA on compatible hardware but emulates it sequentially on others, the logits will silently diverge across devices32.  
3. **Relaxed SIMD Extensions:** To maximize performance, WebAssembly introduced the Relaxed SIMD proposal, which explicitly permits the underlying hardware to choose between differing microarchitectural implementations for instructions like min/max or dot-products. While this boosts performance by up to 30%, it deliberately sacrifices cross-platform determinism in favor of speed10.  
4. **NaN Canonicalization:** Operations resulting in Not-a-Number (NaN) can produce completely different bit-patterns depending on the host CPU architecture. If the inference engine attempts to cast, bitmask, or compare these bit patterns, behavior becomes wholly unpredictable10.

### **Engineering Determinism**

To engineer a purely deterministic engine, the architecture must actively defend against floating-point divergence. First, the runtime must be compiled to explicitly avoid Relaxed SIMD unless deterministic variants are strictly enforced by the WASM host engine configuration10. Second, operations aggregating massively parallel floats (like the attention score normalization) must use strictly ordered sequential reductions or utilize compensatory techniques like Kahan summation51. In absolute zero-tolerance environments where cross-architecture replayability is paramount, vectors can be mapped to fixed-point integer arithmetic (e.g., Q16.16) for all critical accumulation paths, bypassing the IEEE-754 variations entirely47.  
For the sampling mechanism itself, the pseudo-random number generator (PRNG) must be meticulously seeded and isolated from external entropy. A standard, highly performant algorithm like ChaCha8 or Xoshiro256 is implemented in pure Rust, generating deterministic sequences that select the identical token from the Top-P/Top-K truncated distribution regardless of the underlying host hardware53.

## **Local-Only Fetch Manifests and Checksum Verification**

Loading multi-gigabyte models into a web browser introduces complex network and storage synchronization problems. Browsers enforce stringent Cross-Origin Embedder Policies (COEP) and Cross-Origin Resource Sharing (CORS) rules. To utilize high-performance features like SharedArrayBuffer for multithreaded WASM, the server hosting the model must return specific COEP/CORP headers, or the browser will block the resource entirely1.  
Because large neural networks cannot be loaded as monolithic files without crashing browser memory limits and angering users with indefinite loading spinners, they are sharded into smaller chunks (typically 50MB to 100MB pieces). The coordination of these shards necessitates a rigorous Local Fetch Manifest5.

### **The Artifact Manifest System**

The inference engine relies on an artifact\_manifest.json that acts as the cryptographic source of truth for the model deployment. This file explicitly specifies:

1. The total expected file size across all shards.  
2. The metadata configuration (layer count, attention heads, context window limits, quantization formats).  
3. An array of model shards, complete with exact byte offsets.  
4. Cryptographic checksums (SHA-256 or hardware-accelerated CRC32c) for every individual shard42.

When the web application initializes, it queries the browser's IndexedDB or Cache Storage APIs to determine if the model is locally available1. If not, it executes precise range-requests to download the missing shards, updating a local progress state to ensure the user is informed of the background fetch.

### **Inline Corruption Defenses**

Before a shard is deserialized and copied into the WASM arena heap, the engine calculates its CRC32 checksum and compares it against the manifest24. This step is not merely good practice; it is critical for system stability. A single bit-flip occurring during a network transfer or disk read of a quantized weight block can lead to catastrophic numerical explosions.  
Because quantized formats rely heavily on shared FP16 scaling factors, a corrupted exponent bit in a scale will multiply an entire block of weights by astronomical values. This floods the network with NaNs, destroying the generated output and potentially crashing the rendering pipeline42. If a mismatch is detected, the engine logs a CHECKSUM\_MISMATCH telemetry event, deletes the corrupted chunk from IndexedDB, and automatically re-fetches the specific byte-range. This ensures a pristine execution state without requiring the user to refresh the page or re-download the entire model42.

## **Comprehensive Testing and Artifact Validation**

In a highly constrained ecosystem, the cost of a runtime panic is catastrophic. Because no\_std environments are typically compiled with panic=abort (to save binary size and avoid the bloat of stack unwinding machinery), an out-of-bounds array access or an unhandled exception will instantly terminate the WebAssembly instance, permanently crashing the web worker or browser tab56. Therefore, proving artifact validity and logical correctness prior to deployment is paramount.

### **Shadow-Run Validation and Deterministic Harnesses**

Testing an LLM framework requires moving beyond standard unit tests and employing a methodology known as "Shadow-Run Validation." In this pattern, the inference engine is executed via a headless harness (e.g., wasmtime or Deno) configured to guarantee absolute mathematical determinism55.  
The test harness forces the model to ingest a specific prompt, utilizing a fixed PRNG seed and a frozen KV cache state. The harness then asserts that the emitted logit distribution and the final generated string match the "Golden Value" artifact identically, down to the exact floating-point precision55. This tests the entirety of the pipeline in a single pass: the tokenizer's byte-pair logic, the SIMD matvec accumulation, the Softmax polynomial approximation, and the deterministic sampler. If the output diverges by a single bit, the continuous integration pipeline triggers a coverage gate failure55.

### **Matrix Testing for Bound Limits**

To ensure robust WASM heap planning, tests must aggressively probe the physical boundaries of the linear memory. Test strategies involve:

1. **Context Saturation Tests:** Feeding the model inputs that perfectly fill the KV cache sliding window up to token\_index \= MAX\_CONTEXT \- 1, ensuring that the modulo ring-wrap logic correctly evicts oldest tokens without corrupting the active attention computation37.  
2. **Vocabulary Edge Cases:** Passing complex Unicode arrays, emojis, and unprintable control characters to the tokenizer to ensure the pre-compiled DFA gracefully falls back without triggering out-of-bounds indexing in the flat array vocabulary22.  
3. **Sanity Bounds Checking:** Relying on Rust’s strict ownership and type system to execute compile-time assertions. The matrix dimensions for Key, Query, and Value tensors are validated against the attention head counts during the model load phase, ensuring that all dynamic shapes perfectly align with the SIMD unrolling multiples. Verifying relationships like assert\_eq\!(a.len(), b.len()) outside the hot loop allows the compiler to completely elide bounds checks during the vector math, preserving speed without sacrificing safety28.

By strictly defining the test matrices to account for the unique edge cases of the WebAssembly virtual machine, the framework guarantees that if a model successfully parses the initial manifest, it will execute flawlessly through its generation cycle without crashing.

## **Conclusion**

Executing neural models within the heavily constrained sandbox of the web browser represents one of the most complex frontiers in modern systems engineering. By eliminating external dependencies through Rust’s no\_std ecosystem, architects are forced to discard the conveniences of dynamic allocation, expansive standard math libraries, and operating-system-level threading.  
However, this constraint breeds exceptional efficiency. The design patterns outlined in this report—arena-based static WASM heap planning, unrolled SIMD128 quantized dot products, clamped polynomial approximations for transcendental functions, zero-allocation pre-compiled DFA tokenizers, and modulo-wrapped KV cache ring buffers—provide a comprehensive, battle-tested blueprint for overcoming these limitations.  
Furthermore, by explicitly acknowledging and engineering around the inherent floating-point non-determinism of WebAssembly execution, and actively policing model integrity via local fetch manifests and CRC32 checksums, it becomes possible to treat client-side inference not as a fragile experiment, but as a deeply robust, mathematically stable, and privacy-preserving production environment. The convergence of these meticulously orchestrated low-level optimizations ensures that artificial intelligence can operate safely, deterministically, and with near-native speed directly at the absolute edge of the network.

#### **Works cited**

1. Run AI Models in the Browser with WebGPU & WASM \- Mad Devs, [https://maddevs.io/writeups/running-ai-models-locally-in-the-browser/](https://maddevs.io/writeups/running-ai-models-locally-in-the-browser/)  
2. WASM \+ SIMD for On-Device AI: Private, Fast, Offline | by Thinking Loop | Medium, [https://medium.com/@ThinkingLoop/wasm-simd-for-on-device-ai-private-fast-offline-3ef82c47172d](https://medium.com/@ThinkingLoop/wasm-simd-for-on-device-ai-private-fast-offline-3ef82c47172d)  
3. Securing the Stack: How to Build Zero-Trust Applications with WebAssembly | by Alain Airom (Ayrom) | May, 2026, [https://alain-airom.medium.com/securing-the-stack-how-to-build-zero-trust-applications-with-webassembly-1492f35284de](https://alain-airom.medium.com/securing-the-stack-how-to-build-zero-trust-applications-with-webassembly-1492f35284de)  
4. Share memory across heterogenous WASM modules \- help \- Rust Users Forum, [https://users.rust-lang.org/t/share-memory-across-heterogenous-wasm-modules/77909](https://users.rust-lang.org/t/share-memory-across-heterogenous-wasm-modules/77909)  
5. ProbeLogits: Kernel-Level LLM Inference Primitives for AI-Native Operating Systems \- arXiv, [https://arxiv.org/html/2604.11943v1](https://arxiv.org/html/2604.11943v1)  
6. ProbeLogits: Kernel-Level LLM Inference Primitives for AI-Native Operating Systems \- arXiv, [https://arxiv.org/pdf/2604.11943](https://arxiv.org/pdf/2604.11943)  
7. core::arch::wasm32 \- Rust, [https://doc.rust-lang.org/beta/core/arch/wasm32/index.html](https://doc.rust-lang.org/beta/core/arch/wasm32/index.html)  
8. A Generalizable Low-Precision Softmax Approximation for Small-FPGA Deployment of Vision Transformers \- MDPI, [https://www.mdpi.com/2079-9292/15/9/1774](https://www.mdpi.com/2079-9292/15/9/1774)  
9. Allocating/Deallocating Memory in Rust compiled to Webassembly \- Stack Overflow, [https://stackoverflow.com/questions/78000437/allocating-deallocating-memory-in-rust-compiled-to-webassembly](https://stackoverflow.com/questions/78000437/allocating-deallocating-memory-in-rust-compiled-to-webassembly)  
10. Deterministic Execution \- Wasmtime, [https://docs.wasmtime.dev/examples-deterministic-wasm-execution.html](https://docs.wasmtime.dev/examples-deterministic-wasm-execution.html)  
11. Fuzzing \- Wasmtime, [https://docs.wasmtime.dev/contributing-fuzzing.html](https://docs.wasmtime.dev/contributing-fuzzing.html)  
12. Memory management \- Lib.rs, [https://lib.rs/memory-management](https://lib.rs/memory-management)  
13. How does wasm-bindgen manage memory allocation? : r/rust \- Reddit, [https://www.reddit.com/r/rust/comments/qvq5c9/how\_does\_wasmbindgen\_manage\_memory\_allocation/](https://www.reddit.com/r/rust/comments/qvq5c9/how_does_wasmbindgen_manage_memory_allocation/)  
14. choksi2212/ghost-flow \- GitHub, [https://github.com/choksi2212/ghost-flow](https://github.com/choksi2212/ghost-flow)  
15. burn-flex — ML/AI/statistics in Rust // Lib.rs, [https://lib.rs/crates/burn-flex](https://lib.rs/crates/burn-flex)  
16. antimora/burn-flex: Portable, efficient CPU backend for Burn with SIMD, gemm, and no\_std \- GitHub, [https://github.com/antimora/burn-flex](https://github.com/antimora/burn-flex)  
17. whisper-apr \- Lib.rs, [https://lib.rs/crates/whisper-apr](https://lib.rs/crates/whisper-apr)  
18. GitHub \- paiml/whisper.apr: Make Whisper work with APR model format and run in WASM, [https://github.com/paiml/whisper.apr](https://github.com/paiml/whisper.apr)  
19. ghostflow-core \- crates.io: Rust Package Registry, [https://crates.io/crates/ghostflow-core](https://crates.io/crates/ghostflow-core)  
20. Zero-copy Protobuf and ConnectRPC for Rust | by Iain McGinniss \- Medium, [https://medium.com/@iainmcgin/zero-copy-protobuf-and-connectrpc-for-rust-69bda8ac0f02](https://medium.com/@iainmcgin/zero-copy-protobuf-and-connectrpc-for-rust-69bda8ac0f02)  
21. What do I replace Vec and HashSet with in a no\_std environmement? \- Stack Overflow, [https://stackoverflow.com/questions/65469712/what-do-i-replace-vec-and-hashset-with-in-a-no-std-environmement](https://stackoverflow.com/questions/65469712/what-do-i-replace-vec-and-hashset-with-in-a-no-std-environmement)  
22. bpe\_tokenizer \- Rust \- Docs.rs, [https://docs.rs/bpe-tokenizer/](https://docs.rs/bpe-tokenizer/)  
23. daechoi/riptoken: Fast BPE tokenizer for LLMs \- GitHub, [https://github.com/daechoi/riptoken](https://github.com/daechoi/riptoken)  
24. Algorithms — list of Rust libraries/crates // Lib.rs, [https://lib.rs/algorithms](https://lib.rs/algorithms)  
25. Semantic search powered by WASM and WebGPU | by Amine Dirhoussi | Medium, [https://medium.com/@aminedirhoussi1/semantic-search-powered-by-wasm-and-wgpu-492e900b8796](https://medium.com/@aminedirhoussi1/semantic-search-powered-by-wasm-and-wgpu-492e900b8796)  
26. aprender-compute \- crates.io: Rust Package Registry, [https://crates.io/crates/aprender-compute/](https://crates.io/crates/aprender-compute/)  
27. The Complete Guide to Running Local LLMs at Blazing Speed, for Free, and Without Limits Using llama.cpp. \[Update\] Can llama.cpp be rewritten in a lightweight language? I also looked into attn-rot.｜ゆいまる \- note, [https://note.com/humble\_bobcat51/n/n92380aae83eb?hl=en](https://note.com/humble_bobcat51/n/n92380aae83eb?hl=en)  
28. ADR-001-ruvector-core-architecture.md \- GitHub, [https://github.com/ruvnet/ruvector/blob/main/docs/adr/ADR-001-ruvector-core-architecture.md](https://github.com/ruvnet/ruvector/blob/main/docs/adr/ADR-001-ruvector-core-architecture.md)  
29. v128 in core::arch::wasm32 \- Rust, [https://public-docs.ferrocene.dev/main//core/arch/wasm32/struct.v128.html](https://public-docs.ferrocene.dev/main//core/arch/wasm32/struct.v128.html)  
30. GitHub \- Geekgineer/needle-rs: 258 KB WASM runtime for Needle a 26M-parameter tool-calling transformer. Runs in browser, Cloudflare Workers, and Node.js. No backend required., [https://github.com/geekgineer/needle-rs](https://github.com/geekgineer/needle-rs)  
31. i16x8\_relaxed\_dot\_i8x16\_i7x16 in core::arch::wasm32 \- Rust, [https://doc.rust-lang.org/stable/core/arch/wasm32/fn.i16x8\_relaxed\_dot\_i8x16\_i7x16.html](https://doc.rust-lang.org/stable/core/arch/wasm32/fn.i16x8_relaxed_dot_i8x16_i7x16.html)  
32. Relaxed SIMD · Issue \#1401 · WebAssembly/design \- GitHub, [https://github.com/WebAssembly/design/issues/1401](https://github.com/WebAssembly/design/issues/1401)  
33. i16x8\_relaxed\_laneselect in core::arch::wasm32 \- Rust, [https://doc.rust-lang.org/beta/core/arch/wasm32/fn.i16x8\_relaxed\_laneselect.html](https://doc.rust-lang.org/beta/core/arch/wasm32/fn.i16x8_relaxed_laneselect.html)  
34. ruv-swarm-wasm \- crates.io: Rust Package Registry, [https://crates.io/crates/ruv-swarm-wasm](https://crates.io/crates/ruv-swarm-wasm)  
35. From ex(p) to poly: Gaussian Splatting with Polynomial Kernels \- arXiv, [https://arxiv.org/html/2603.18707v1](https://arxiv.org/html/2603.18707v1)  
36. Fastest Implementation of the Natural Exponential Function Using SSE \- Stack Overflow, [https://stackoverflow.com/questions/47025373/fastest-implementation-of-the-natural-exponential-function-using-sse](https://stackoverflow.com/questions/47025373/fastest-implementation-of-the-natural-exponential-function-using-sse)  
37. mlx-native \- crates.io: Rust Package Registry, [https://crates.io/crates/mlx-native](https://crates.io/crates/mlx-native)  
38. Daily Papers \- Hugging Face, [https://huggingface.co/papers?q=VRAM%20envelope](https://huggingface.co/papers?q=VRAM+envelope)  
39. RuVector is a High Performance, Real-Time, Self-Learning Ai, Vector GNN, Memory DB built in Rust. \- GitHub, [https://github.com/ruvnet/ruvector](https://github.com/ruvnet/ruvector)  
40. Mooncake: A KVCache-centric Disaggregated Architecture for LLM Serving \- MADSys, [https://madsys.cs.tsinghua.edu.cn/publication/mooncake-a-kvcache-centric-disaggregated-architecture-for-llm-serving/ToS2025-Qin.pdf](https://madsys.cs.tsinghua.edu.cn/publication/mooncake-a-kvcache-centric-disaggregated-architecture-for-llm-serving/ToS2025-Qin.pdf)  
41. The $100 ChatGPT: A Code-Level Tour of Andrej Karpathy's nanochat | by Saurav | Medium, [https://medium.com/@writeronepagecode/the-100-chatgpt-a-code-level-tour-of-andrej-karpathys-nanochat-729490982bcc](https://medium.com/@writeronepagecode/the-100-chatgpt-a-code-level-tour-of-andrej-karpathys-nanochat-729490982bcc)  
42. RuVector/docs/adr/temporal-tensor-store/ADR-018-block-based-storage-engine.md at main, [https://github.com/ruvnet/ruvector/blob/main/docs/adr/temporal-tensor-store/ADR-018-block-based-storage-engine.md](https://github.com/ruvnet/ruvector/blob/main/docs/adr/temporal-tensor-store/ADR-018-block-based-storage-engine.md)  
43. ProbeLogits: Kernel-Level LLM Inference Primitives for AI-Native Operating Systems, [https://www.researchgate.net/publication/403823396\_ProbeLogits\_Kernel-Level\_LLM\_Inference\_Primitives\_for\_AI-Native\_Operating\_Systems](https://www.researchgate.net/publication/403823396_ProbeLogits_Kernel-Level_LLM_Inference_Primitives_for_AI-Native_Operating_Systems)  
44. Sampling Parameters \- vLLM Documentation, [https://docs.vllm.ai/en/v0.6.2/dev/sampling\_params.html](https://docs.vllm.ai/en/v0.6.2/dev/sampling_params.html)  
45. Foundation model parameters: decoding and stopping criteria \- IBM, [https://www.ibm.com/docs/en/watsonx/saas?topic=prompts-model-parameters-prompting](https://www.ibm.com/docs/en/watsonx/saas?topic=prompts-model-parameters-prompting)  
46. The top\_k and top\_p Parameters Explained | by Mikhail Berkov | Thinking Sand | Medium, [https://medium.com/thinking-sand/the-top-k-and-top-p-parameters-explained-bfaecc8cd342](https://medium.com/thinking-sand/the-top-k-and-top-p-parameters-explained-bfaecc8cd342)  
47. Valori: A Deterministic Memory Substrate for AI Systems \- arXiv, [https://arxiv.org/html/2512.22280v1](https://arxiv.org/html/2512.22280v1)  
48. Engineering Certainty: Architecting Deterministic Systems for Stochastic AI, [https://dev.to/\_aparna\_pradhan\_/engineering-certainty-architecting-deterministic-systems-for-stochastic-ai-1jam](https://dev.to/_aparna_pradhan_/engineering-certainty-architecting-deterministic-systems-for-stochastic-ai-1jam)  
49. Frequently Asked Questions | Documentation \- ink\!, [https://use.ink/docs/v4/faq/](https://use.ink/docs/v4/faq/)  
50. 3514-float-semantics \- The Rust RFC Book, [https://rust-lang.github.io/rfcs/3514-float-semantics.html](https://rust-lang.github.io/rfcs/3514-float-semantics.html)  
51. Mathematical functions in the standard library are non-deterministic? : r/rust \- Reddit, [https://www.reddit.com/r/rust/comments/1gek2bb/mathematical\_functions\_in\_the\_standard\_library/](https://www.reddit.com/r/rust/comments/1gek2bb/mathematical_functions_in_the_standard_library/)  
52. Multiplayer game devs, how much are you doing to make your game deterministic? \- Reddit, [https://www.reddit.com/r/MultiplayerGameDevs/comments/1p97kqx/multiplayer\_game\_devs\_how\_much\_are\_you\_doing\_to/](https://www.reddit.com/r/MultiplayerGameDevs/comments/1p97kqx/multiplayer_game_devs_how_much_are_you_doing_to/)  
53. deterministic\_rand \- Rust \- Docs.rs, [https://docs.rs/deterministic\_rand](https://docs.rs/deterministic_rand)  
54. Tracking Issue for deterministic random number generation · Issue \#131606 · rust-lang/rust, [https://github.com/rust-lang/rust/issues/131606](https://github.com/rust-lang/rust/issues/131606)  
55. ftui-web \- crates.io: Rust Package Registry, [https://crates.io/crates/ftui-web](https://crates.io/crates/ftui-web)  
56. RuView/CHANGELOG.md at main \- GitHub, [https://github.com/ruvnet/RuView/blob/main/CHANGELOG.md](https://github.com/ruvnet/RuView/blob/main/CHANGELOG.md)  
57. TurboQuant WASM SIMD vector compression \- GitHub, [https://github.com/teamchong/turboquant-wasm](https://github.com/teamchong/turboquant-wasm)

[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAaCAYAAAAue6XIAAACIUlEQVR4Xu2WTUhVQRiGP0mjMElIsLRQE4IgMahNUDsFRQIRF0nt3bToh/4WLkSEdpILiZQiQYRqm4i2kFy2zlYtAltGK0FX9b7MO/eeM96xUUy4eB94QGfm3nnnnJlvrtkhpgrWSf6dQg2sDRt3Aye6IB/DKTgIj8tS8DN3Yb9MhWFH4OWwI5WyCdsKl+BTeRIegw/gF9niB2e4AV/AaunhIlrlK9iX6fOcg3PwlEziKlyDXWGHuQDzGX0g/7Q52SW1eerh84y/4c3ciCJPzL0ZuiNn5Tf4zOKHg19Iv8NGtV2THyy+Rc7IHxYPewUuSr7NkjDYmFyHbfnuHD4sn1CH2rg96LgfVIKUsA1wVXYGfQXKKixfJ18/5b6LbQG2v5GclJOTt3JY/5ciJSxrLQ827Q36CnCvbEg+oRhc+Vf50VyF4CHjXqWxECQlLPELj47h4diS0UFgAG7KbrXxaXySO31238JehL/k7aDPw9P52VydpCzknn9OYGlhuc24DWlsTHmF5cTvMmaDENbOGfjeXOiwBk5KVokYKWFPwAV5PejLcVouw9fmBt+RbBuCRwqj89ySs7a9kvAQPrLiNf0H/oQvrXgFe3gprcjmTHsUTtZkrnS0y1hIT5vkzeNvtb3QAydkuOh9g19MR8094b3ArTdtrozS/0ZZhfXw4PF3r/9RtBtYw+9ZceEHAkM+lEeDvhjn4X3bXoUqVKhwkPwFRE1713DPkaIAAAAASUVORK5CYII=>

[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAaCAYAAAA38EtuAAAD7UlEQVR4Xu2ZTYhWVRjHnymLQqV0og8/MHMU+hCVlEEwUVFJxAxpkegi3NRCUITMkXShCIpEIWJoorUowQgLi0RFJEHBdlINCC4Et9FK0U36/DjP8X3mzDn3fWcc31G4P/gx75z3zr3n/O/5undEah5bRqtPmu3mKfPp9IsHZKTaYZ+fcT4wnHSauVk9oH6gPmuWeF9drz5hvqguVbv9QQ+Rt80F9jvt6DRfcaZBjUq+5/gYLHxix8Bz5l51wv0jBkkddBuCflU9rW4xOSmV2qT+aU6KBzu61O8lVGiEuVK9qn7njnuYpEFTh8XmRfWO+qk63ozMV6+YtP1dCX8b8UFHuM43EqaqATNb/UdCxVK48DFnrAh3Hr+UUMEUQh6uoD2fqTck3wsnqrvNXHC5oGnzIcm3uQgXx161R/oOGw+VxWvqS1Y22TzlyjyPStAr1JsSvvfQ1u3qLDNHLmh4T/1BGiO4Ei600+SOE1qJGPR/6nQrW2Yel/zFckEzz69WvzVZA95w30eYL7ep+0x6Dz9/kcbc66kKep6EqYO6et5RN0hjZOYoBf26eklCB8t1sj7UQbcpaA5gykAWs9LFKD9qXpcQAsTwCSBHGjQV5joEHRs3Vv1NQhgRpjIa0S2Nlf6cuk792JV5qoKmnKljjSujLl9I/xuWUgqa7C6rM8xKYgWQnUWJF9S/TUKJ26NdJmHnSIP+UP1Lwvk8/P15CQ1C5lR/QyE9V0pV0JyH8/l6ctNyC39KKWjKfpbGdSuZK2FIIY0rsUq9bS5x5YfNVoP2gXooj8EiCxM3dao0nvh+ktDoElVBj5GwNaUuXSbTUm66SxmSoJln/jX9sPIwRP+QsJ1BvwWKU0erQTNqCDDXo+NuBnnY+Vr9Vb1gfi757VekKmgeo8+qZyRsRZGwW6EUNK8bqF8dtGPYg6bi7BiiaUPYITA1/Cj5BYiFCUtzZxr0mxKCfsuVdaj71a/sM1Jxygg8ljWjKmigHv9Lo86tUgqaKY4nztfMprxscrePSFj915qUsUMovY1jjsffJdxhYKHEHeotk89I+SIJPZTejexkDkrodRFuKLuOu4m96kx3nKdZ0FvVk9L8nU1KKeg5Es4XF/CWodeMk7DXnGKWAo7EXs4Q8r20GVyr04w7GA/brh7p25MZbTT6hPR/MQTNgmbLmE5ZrVAKer3ZVuj9PMoOFUxXH6WFykIJvYje70cANAt6sOSCpoPwPMB7krZSB90mGNZ7pPxiZqCwZrDDYe8cdzu8NeTlFe/Jc7Qj6Lgwb5TwbDEsMFfzj4LnzXYT15Wmj8MDZLk01gNeJeM6aW0nVFNTU1NTUwP3AOzc5AIjm+aBAAAAAElFTkSuQmCC>

[image3]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADsAAAAaCAYAAAAJ1SQgAAAC2UlEQVR4Xu2XS8hNURSAl1AUEfKWt1IkYUCGhAFJytvAhPQnGXgl/YUiRUkUIgOERCFiZoCYekwYKIZSiphgffZa7Lvv2de9fvem7vnqq3vOPvfsvfZZZ+19REq6RF+1u/kvmKjuMXeqgyqbpZf513RTJ5nb1RPqcrW3mWOp2iHh/+j0VIeYw9SBSTv0sTaXawnsoIQJxIXqNakcQz/1sDoyOtcQbRPsGPWehJRBbkaabFOfmqP94ogJ6gUJg04Zoa4zX6kf1CkVV4jMUa+oz8zV6mB1n4RAcJz6QMJExMxQT0uYVKyLmeoLdV7aoPRQL0VyDP4Uj0qY+RyTzZPqW7WzojWwQULfRf3DWvWIVGcFx6ck9F9rDD/xmXup7pLqmzk7zNfye3bHmnejc0UsNpeoxyX05akN9NkpIQswhoeAuyX/5LjvRdMfRBV0QqogM87Ac3iwpOFUO7fIJAWznUgYKJKKs9XP6koTeD8ZA/eI7zNKXWFS4ReoA6J2h6x5ZGYnva2CpYGUQgpMLoU5f858I6Figk/AMTsugqK13+Q31ZS0dzmmyGzyPxhcS7H8HnlbitdV4nhiTkvafkEnn0wqbg5m/rkZd3jAJOAcPM0tprNM/WjypNerc6P2RmFibpjEVAgdfTUpIDkY3BdzfnT+jFkrWC9O8f1Z0h6blyVMWFqYGqGuYMn19+aapM1hYKxvlHeMK6Knca1g/V3FGDYg+E09L7Xf+T/BpuOWWQYLDJxK6qbrGMWDNL0qIWiM2Wgy2CJIr3jLF+NrNKtArXpRDxTMh2Y6qRUMNe+rZyUUCnYryLlVkv+K4Z3HO1IdzGb1nYQqet2MlwUqPLK37UpxglnqTbNoy1oFHQ+XsG6ON3NBOv60SZ90v9tK/JXApkMW7E1Ptgi+otgjsAHBptNWwVLYDqnT04Ymw6u3VcI+oKXw7vKx399sBXwN8WmY2+aWlJSU/P/8AIqBoSJMlEgdAAAAAElFTkSuQmCC>

[image4]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAaCAYAAABVX2cEAAAA20lEQVR4Xu3SPwtBURgG8CMxsFBSSlmYKItBJv8Wg7Koq0w2pQw+AIOdxcIoWX0KnwCfxeh5u085uOXe2zWo89Svbu99z7m99xylTH6ZPLQoB3WI6A1uU4Eq9GgFOyjrTW4TgzAsqA1xCD1bPiMNQ9jCgGQUGasEe8pCARL2MucEspn8E3GDGmtT6sAS5nCiLvSVw5hpuNBEqx2pyJpEFouoVnuJfPlOB2WPOIMMecoIrpR6e+c5gW4md+ZMSa3eoKZW+xo5+g2tweLzmOSy+orcGzlJ3xuYmPxVHtVsJBcsjikqAAAAAElFTkSuQmCC>

[image5]: <data:image/png;base64,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>

[image6]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKoAAAAaCAYAAAAnvMf3AAAFn0lEQVR4Xu2ZfchfYxjHL5m8v8toXh7S0BTyMgx/SKF5yxQieck2mTCvedmesFLybsj7knmJUqKM7IeaDSV/kCahbP/4Y6X8sT+w6+O6rs69+znn9zvn19qzx+5vfdqec+5zzn2u+3tf132fn0hRUVFRUdFE0XbKzvnBGu2qbJsf/B+pbRyKxkltB6gYtYO40bHKNvmJrVCTlYXOzdm5NiKG8IByZ3Yu1WHOF8r+2bmpyofK78qvziUydnx2VBYoHyhLndlStdvPeVl5U1mpnOOEjlZWOS8pzyvvKfc7Ie7zqvOGskw5V6r3rVObOHTS5UpP2SU7vjVpB+V25WHlR2eYAJ/mrJfm68kybzu/SWXUfR2MtY8fm+X8pZzvx7genlPuEDPEvc5PYpONscRMcNV/V9nx5c40P3acstb5R2xSzJPqGWiS2CS4wkF7K58qJzt1GhSH1orZ8IryZHZuoojgUxGaygvvN+L/thED3HO6BpjBe8z5RpqvJzs+66RGjUFncOf7sT2dr5Ulfuxs5zux90fTnavFDHamss45wdsQo0+cUT+GUec6TTpSbALQFkL0B9/k3iEOEYt+cWglXipmCNnjUeUsZXtncwkD0Zd4YbLHFGWRcp0TM7tOB0t17e7J8ZiElO+LkuODNKxRedatyulOT+qvp9zfJ9YnSI0aE+4WsfKPcqNGYgFK/lHKxWIlHGJCnieWhSE3F7wjlilTo+4h1heqSyruFf1MlymMURg/EkXEIWLRk/o4tFYxar2KUbcwo9IpjAm/iK0nSNcxwHWiBDwjtuBuw6V2WV9Rwi6TaoK8q3ykzFR+dhiAfoqNCaUUs4ZBu5oUDWvUU5Xrxa6Pe+TXM+EeVA4QG/zUAE2KNS8lnDVq2r/VYhua3ZQXnFiz1pX+9Frgb4zKJguuUU5RVihnOCidUGlfeb+ew71QxCFiwbk8Dp3FJmo8N1I7KTeK7V6ZxUCWmCMW3Nh9t+0bZmWDMSpVxuqqYYzK5BiVyqRNA3ShVDvuNkblvkxaIENhwLR/ZFmyLcKYsFYsodAuNlPzvM2JUpm35232Uo5wQsSf9S+QvPi7jVHbxqGT0hJC2RxvHer8IBuXqi7ieyRllcEhaOlSoK2GMeoNYgZkECO7fyn2aYaBPsh5SDnQ213prBGrGHm5Jfs+JbZjh6hyaf9eT44TM6DUMwEQJoTFYu3vVt534lqeG6YK5cuGptLP/XoO16dxiFikcYiK3UnMxK8cSgo34ONzv9I/VXlaxpb4Jlg7DRJrm9ilwrdSfZqJNVtTf0IYFMg6ZFHWrSwDYinQRcMY9Vqp3jkm/x9iO14+eR3uPJG0W+asFzPNMVKJ9yULkoFDvMds//+LTp1R/5Qqa7O8g5gEjC/fbYEsScxeU753Iu65UaluGJUJBaElYn2IfqRxiFikcYB8Qg5UMWq9ilG3MKPywNUOa5ppyk3S36ibWoeI/frCOpXlB8RLjyj3OJO8fZ3CoGHSEGYNw3Yx6yCjMlmXKzPyE662a7O6NWrEfr5YQmCiB7dJ9UsZG1BYIdUaNdbkfO9keTFZqs3oI96GTRmlGPhhAS0S+64LMe70OzZYsYT6XKpkgthX8OsZG+amTXObOAwUHY3ZdZdYh7sM6KYQu9+PxX6qe9xh40DmwGCch36apVzg1Amz8n79zB4iI/Bry9/OOuUt2TjbnSSWJeJXolS04/q4B9fzbrFRRPzL5Fvj/Cu2KeLayIpkMo7nxESkAsFisZjFhhhmehuMtNRZIBbTz8Sek74P8SGrAvdhwpMB83Z8Heo508ViyrOjL6ni2jwOEYvOioew4N5cWTQXz08nyHj3ZyIpKg+fhNLJEIolERXzeBlrqFD4gDZU1qZ2US143oiUMSoqKioqKioqKioqKioqKioqKioqKioqaqMN2nyafuZM2KoAAAAASUVORK5CYII=>

[image7]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAaCAYAAADrCT9ZAAABnUlEQVR4Xu2Xu0rEQBSGj3hBUFFRC0EbC8FLJ3ZeDmhjLygIgoXY2ApiZWNjYSUWNpaiTyBoERBcH0DUF/A9/A85gclkdjO7wmQX54OvyUkWvk0ySYgildIHe9VWyI6V3+kIGC6prZAdy9b2toUpcPAUfIPr9iAQTOXB43De3qg0HTwJT+GEPQgEU3nwBbyDXapJ08FVw9Q4eBAm8MjanuEVLP/SmnoFZ/PjoDAVg3t0u3gIf+AZXFW7sx0pBrtZgcfqAXyg/I+42IW3nt7AufSwUpiKwXJCxtR9+A0X4Ihq4hUs98O0eg/Pc9OwMBWDTcwFy4VXsCBnQPyCi9YsJEzuYFmsyhYswTs4u6Sf4DAcyI8LbFPx0q3nNfmvC0zu4Bn1U2dyyw2pJjHYhcS9qHtwQ60CJnfwlvpB6ZvWJtxRTbyC++Gjeknpkt/q18pfYXIHy6osvsMTSt8GXV9VXsGCXCLiKNVfAUPA5A7OkJNjP4pMvIPbBabGwWXE4HaH6Z8Fy9OhpibwGS6bOziQueyXwFdVXpcjkUik8/kFMxhY4XVZ7TQAAAAASUVORK5CYII=>

[image8]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE8AAAAaCAYAAAD2dwHCAAAB1UlEQVR4Xu2XzSsFYRSHj1AK+YyU8rHzEQtJKWUhZSFSwsZGUhJRSrKTElmwtJGFnbIQS1lJbCyELMX/4ffrPde9M+6dO+5tPsr71LN6z9yZe97znjMjYrHEjVJ1Gc7AYueyxQubvBxhos7ULfgB+x0R4VEL29UwKYJH6q5rzZM2+KQOw1UxVRgFO/BELXCtBQmTt6j2udY8mYCPapVrLUzK4C1cUGNNNRwTc1zv1EkxlRgW3HE6COfhF9xUB2DhT2RwNIqp+HHVV8Xb5BlySh4HBS+8httqAyxJDXKR+LOcysc+PRDzu+ngg9IaOAvfYIdamRIXFLzvHuyVZOtqckR4wB7HC0bVKEkMi0RCw4BvFUNwWpKnr8IR4QGP6DvsVqMidVhkgydjXX5XeDoPYbOaCf7eFVxSfcOsv8J6NRvsQZQj3f2gmdyHdbzYg1b4AnskeY9yR0RwdIppF10q7+ur8m3y8kjempiSZel6DYqgGYHPYr4wuKF0yhERHMzBuZjhSVfEZ/JOxTTqqOF0vRfTyzbUsL6v5+CFmM8y6mvasjxvxOxyHGDlh/F6kg5OWG6W54a1wE+Vk+hS/jCa/zs2eXnAhvig8siyUVssFovFYrHEgG8R0mZ907EqFAAAAABJRU5ErkJggg==>

[image9]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAaCAYAAAAzBZtTAAACaklEQVR4Xu2Yz4tOURzGv0KI/MiIKQtKxAKlScpCUWOKjQ3J4i2JlaRESpokC4lIis1rYcZspiwoTNObDWVrIVYW1v4C5Xk6z+ne9/bOe+8595qZt86nPptzpjv3PPd7z/fc1yyRSPx/lsjj8CYckomGGPiAt8g2nIQf4AnJhdVlKTwqtxbmqnBOvoQzcFzON5vlbXilMDcny+CE5CLIRjgrD2kshlWwBafhQRn6wFbCt/KCuYXtlPMF7+EavC+/w+tdf9GH3fCnPJAbZ7XQx7mxKqyGl+VruNfCQ83DiueC6OHCXB2G4UN4y1yR0TLWyI4FBHwS/pL8p567kq8kQytjrbn9sQ13yTpwwUfMLeS3vKSxqoEU4T21Je+Vb2oIKeASFiTgU9Y7YF6AdsxdtBcr4B35Am7vnq4FtxUGwK3ms9wB1+f/qAReg3Kb4nbFa7FYqhRML6ICvmjxARNfrW1zVcFKbhK+Rb4fVIWhsqGyudKWuYZbl6iA59oiGBbtWP+A87CCn1hW1aGvYBF/grgqq8ITxnt4Vi7vno4mKuARywLelxv3VfPKwk8BDJbeg08tfuvgx8Q3OCZD8FXsK7ll9as4BZxj0QS8Dn6SxzTGG3knz2gsFn+6YBOkm7qn+8IH/sPcWZ3GwrD3WNYnYntFVMBkVHbMPfEb8JFsav/yR6uQ4xX7w1e4QTYB3ybqe0XVPnHesq/bv/APnIL7ZSX4dPi1tM2yI85CwkoL/ZIMgeGeNtdM6aKD1eg/i5+X+EDmTypFeL1J+RG+sXq/hQw8KeABgwE/k1/M/STZVA9IJBKJRCKRGCD+ARuRlXuOiL8gAAAAAElFTkSuQmCC>

[image10]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAABAElEQVR4Xu3TsWrCUBjF8esgFFSkWnQUOrgJFScHN4dORVrB1alToa111ydw0XYRtH2Jos/gS3Rwd3LopOeQE3MdQm9JBgf/8Ftubj6TmBhzImXhHRaQl0g1YQA3kJBIxTawIp8wgtLRUasyfMsafqAj9q/nZG68q7ywjh0qwAyuhD3AVu60xjLyBUVr/ajYB9bhF3rCLmElPNnvWqYm5HZZCl6N9xyJhQ3kc6OhteZUAzbCW+YfU4VnuQ22/h2/giW8CYfxS+Dah6QPux2KbWBSxtA1Eb8AnvgkLa3xSunR3+Qah/F1mUhb+vISbHWrZrwXeBfiPtjqVuwDz537Z3siyjxNOre9pgAAAABJRU5ErkJggg==>

[image11]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAbCAYAAAB1NA+iAAAA5UlEQVR4Xu3SvwsBYRzH8UciIhbFalHKQBhEoSxW2WS0GowmZVOSrMrfogz+ANnMRpPRj8/XfS7nujg9ZfKuV3ie7nuXe5T6cVHoQoC+TntACHLgIdcFqQ4x296jKq3hCBtKcb9FPRhw7SWtAUmYkTymFxa0gziEaQoZ47JnTbiSfJcqdIaGMm4illCECD2SV9OnBNfMASd+lmgCHWV7C9oDnBrRVhk3MPOrDxdKclD2VLDtuUprgDzuCrLkOh8NIW1ZL0Pe8tsx+VPkdIkxtC3m6nWgY9oDanChm81BGUf537+33QFlMzNkXFKmDAAAAABJRU5ErkJggg==>

[image12]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAeCAYAAADgiwSAAAAAeklEQVR4Xu3QoQ5AUBjFcYZNIAm6IgqSLNoEkU0z2Vt4B0HXNU3wWs79doIJVxAU/+1X7tm+cA3j+zqYyLpt+jG/eJm63dIADkkFVLRCRlINMe0Q0fOoKmkBmyQTZmrAJ/kE7RjCQSn0JKcD2GiEhCTtqHLJuz7+PXUCtzUXGK8Ep3gAAAAASUVORK5CYII=>

[image13]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAZCAYAAAB0FqNRAAACiklEQVR4Xu2XTYhOURzG/0IpND4mQ5nMQiLKZDQRi1GzYGGSjwVKEyuUhGFDFtiwUDa+ZmMxi5lEUz5SQtnIxlaysWAzYWNJPE/nOb3nvt175573nXkX5vzqV2/n3vfec59zzv/eY5ZIlDAfnpRX4Ga1z5a71D4AZ8kZTwqtAU7DTbIDvobrYb8cge3wBeyTM56jcKecA8fMzS7OQLoWLoVPzIVJK8ERuGxuVKrAmz2So/AefGDuxpSdaAXsx3X5Gf6ANyWP1bMaPofLgjaG9BQetArLcx4ckjfgR3ghc0YxC8xNZ/ob/oL34XLZCvhwV+EOSVbBT/K2uZlF2iSfc6XaQngelynrGi0khVajcmghDOGNxYXGDlP+jmFJYBGdcK4sgiG8gy+lX47X5Be4wtw1BiXvyRq2EZ6SDJKwvPD5q2bQVGh887BzizJnFONH/Za5mVHPXnO1dbL6wmN7Av259aGdhX8Dv8N1cLc8D3vgQ3P9yetTLo2E9liy6G4wN1IXZdkM8XDU71i2k2FgjcAX0HsZLs8yWKb4IqzS5wyxobEz3dLfjKP3VfapbTJ8cOdkM4Hxf5w1zyRn87SSQmuA2NC4/Vgs/UOyfrCO0KrX4X8PwQ+yK3M0jn1w2GofrdNObGj74R/JrQiJDY2BHTA3u/wAsA5VLsSCe0nK4h/WpSOW/YidcspCW2Nuv0a3qY1B8QVA/ajyDfRNblVbHgwrDCxcjlxSMcH1wnHJL3oOJmcuvQsX1k6dOo7JV+ZmzU9z2yLKekW2wAnpP/w4on77cgYehm/hCVlWl3g9etzyz2Nwl8w9cNlD+4EOPydCRyz/+k2TQmsxfpl1we0WvzNIJBKJRCLx3/MP+w2nnaoQgFcAAAAASUVORK5CYII=>

[image14]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAaCAYAAAAnkAWyAAABkklEQVR4Xu2WQSsFURiGP6EsSCESG6zsCElZWrCwYIMoCwsrZSOR8gPYYKVsKKQslI0sdOMP2ChlpWTrFyjv13m/5pjuuaa7cGdu89RTd75v7tx3Zs4954jklEUznYENXr0eLsMdOERTR2bDd8F5eg4bvZ7WFmAdPKA9Xj8VdNJT+R3+SKKnvU2no3aYDrgL1+MNUAPn6D28hCe0xTsvKfHw5o1E4TfpKo9Lkrnw+mfZoHvwVdwX4ozBB9rK2hK9EDdGdSxf00IRj2GTOOLhNYeq14qHn+VxSfQiBSke/lDcD6mGzQZvsN+rJyEe3tiHE/ys418dj9phQuH9ut/rpZ9wyqv/hb6hNfoMF8UNPXVQ3A3oQ7HZxr+5IKHw+qqfWPd79vTeJeGMkBAdPu2wliaiKsO3wRfW/yN8WYTCh8Z8N/2QFIfXOV6XcZvXDZttNPyIV68IVRle0Q3TLbVd4CR9FLdDrAgrVFfPb/gFr+gAz9EbO6NbcBTe0WGek2ps6uoTt+rZkp4JMh0+Jycnpzx+AObbYUKVpQcLAAAAAElFTkSuQmCC>

[image15]: <data:image/png;base64,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>

[image16]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAbCAYAAABMU775AAAApklEQVR4Xu3QMQ4BQQCF4RE6EkEiUXIFlU4nep1ewzWcQ+0AOoVWtnAHjU6h0An/2Icxq5idTrJ/8lU7k9k8Y/62MtroeFooOecyNTHBAUeZYYjK59jvGkiwlOD6uGAswUVfnOKEngRll1thi6oE5Q6Tq+iL7jB+XcwlkzuM3wIDeWdHeQ2zQ837NsIGdXlmf2svN1yxNumy1hl3k774VfTFoqL8PQDVWCcCWGF0EgAAAABJRU5ErkJggg==>

[image17]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAaCAYAAADSbo4CAAABgElEQVR4Xu3VTytEURgG8Ff+JCOFiTQLURaSLGTHnpIoO6VE2VmQfAFWFkpKKZGdla9gpWThA8hSFhbKUonn6X1fczrKZs7lTt2nfk1z7qk599xn7hEp8nsaoQf6Iu3QDL0mvNZqkiY3C+mCRbiHR7MM/VCBFfMENza3bJKnE+5gz4QZNM+wFF1LnnF4gzkTxsd4nfMyDe+Ud+x3H+bQcMe4c5kmFwtpgDN4sU86MaeiCySOc25mCYsax0v650WN4yWNizpgrmA+GK8pYT/icJe4W3E/mswxDAfjNeXfF8LieVGvRV/pYfid417gsKj+2r+EbpgUfRMT543BqOgRQXys/PyRGbg1H/AO51L9gVXRXfiEV7MPJdHwh+lAtEdbsGG4iAXRxfOIoAvRMyp5Ns0DzEKL6OFJbaIL2f6erYVOfkh6N2gEjmBK9FEQswsTUt3haRtPmtwshMe/L4SF3oF1GDIMu7Im+kiow8aThv8KdoL8O7sRh9f9n1mkSH3nC0V1UUI5jn4SAAAAAElFTkSuQmCC>

[image18]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAaCAYAAAC6nQw6AAAA30lEQVR4Xu3TMQ4BQRTG8REKKiRCtDqXUJFQSlTcwAWcQC8aOiWJWicKSpWEUkFB4QIikfhe9lvG7Ow2FCL7T37VbF42b2eV+vWikIV8gNTz6YC+NigJdVjDlprQgDZtYMJnA0srZ1CXzGTAEnoQIWtFuECNbHVgBxmy1oIzFMiWDDqo196sfW1QH2YQJzPZyQj2kCNP+qL9kp3IfsYQI0+y6BOUzQOtKlyhYh7o6fsxk88u5jBQPm/i9vEg92LJEt1F68lvM6UhJN6PneTSLegONzgaVlAi35scFvZ/PQDUQy6F+vBFcQAAAABJRU5ErkJggg==>

[image19]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAAA4klEQVR4Xu3SMQtBURQH8GMQpZBETLIpWRhlUjJY5BsY5AuwyG4x2JRvYGCSQfkKPoLZYmLE/3TPreteb7mT4f3rV+/e+86pd+4j+pckYShW0IYEtERgvAobcISaiJFqcIWRcJKDM1St/ThsoSmcdEl1Llj7EZhBVjjhwhcsoSS4iMPfyM96/RXvwhSc4G14wpgCCsxESU12IW7wgLr5kg5Pk2XsA1ITvkPPPuBMxa+uZbhAxT7geBXy5e5E39jXE5yQmrIzHO64FweYwwDWYkPqKpzwD50W3LUIHciLMGHcfAC5HScfFWS1aQAAAABJRU5ErkJggg==>

[image20]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAcCAYAAABoMT8aAAAAw0lEQVR4Xu3RoQrCUBTG8SuoCCIGByKarEaxi806DIJZ7DaLZfgCgm9h1SA2k5h9AEEULT6Cfod9G3K9C9e1sT/8yu7hsLsplbhyUIVahApkwmlDdRjDi1YwgBHtYAtlMtaGK3W0swafT8hY7AXyqmdytLMm3GFKxpawpqx2NoQHtOinEhzAo+Dru3SEXjhtKPYCueMF5iS/UHSpEAxG1Yeb8hcJ6xawhyJZ9/cCuZvYKH+JVXLvE73hCTPKf82lpSW5D5HEKqHUgE2KAAAAAElFTkSuQmCC>

[image21]: <data:image/png;base64,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>

[image22]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAbCAYAAACa9mScAAAA60lEQVR4Xu3SvwqBURzG8SMUURaRDOQGDFY3YGZQZrkCid0NKIsyGGQ2yGKws1AmBouUxSXw/Hqfw8F5t3ch3/os51/vezpK/XRBSELKIkH+x2qX0lCHK/WhAlWY0AYyeoNbeThSwRiP0w5axri1mnIWCtmky9EZGsa4NU8O6cGYfByTCx/QHGIctxaFJaxJNg1hC00K68VuyeceoEi6rHr+YtkYt+bJISXYK+fBCbMRLSDyNvdSF2YQIp2+KyEPLmDMPdKb5IDO25w88zZcSB7jR/ILK7rBST0/XcgdTZVzL8KaJ4f8+/c93QFfhzt045suEAAAAABJRU5ErkJggg==>

[image23]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAaCAYAAABVX2cEAAAA80lEQVR4Xu3SLYsCURTG8SOLoKzFBZVFxJe22WQ0icWiQdiyZb+EX8EgiFX0QxgMBpMgBqPFIggmy4YNyuI+h/tcZlDBGZgizB9+OMyVy8y5I/IsvUAa3q8kuB6ljGstRjcFutkbtGANO/qCPNdTtIAtdCBLd0vCCvpki0CbvsW8xcPK8AMN0l6hC1Xy3Ccc4YMKMOSv7wLbTOcygrk4r6mHsBFzgr6ywz+IM+wanHntKzv8puteHKak18pTOi99qtLVfX2qX6iQpwLZTAdvhz8T8125K8IeBqT/vVsdlvQHJxiLOT2lM+px7UITyElYWJirf+7gMGi5BSbPAAAAAElFTkSuQmCC>

[image24]: <data:image/png;base64,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>

[image25]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE8AAAAaCAYAAAD2dwHCAAACUklEQVR4Xu2XvWsUQRjGX4mCEE3UiMEQySlGSSpBxBAsTTCFFoKN2idqUBE/gmAj2AiiiGAQQRRsJGBlYbC4QixMkUbU1toi/0Keh3mG/XB3bvcOQ+DmB79mZm5n9tl3Z/bMIpFuZwvcB6flyWx3JEQMrwO2wjPwt7yf7Y60YhD+kqdzfXU4B4/kGzcje1KWcQBukyFOWVJ5w7m+OszB4/nG/00fvAEfwaOSNx6iXz6HI7k+ch7eNLen0RC3YFNyHbzmeKq/Kp2Gx/t+bG7+ymuI4TlqhXdMfoaH4ZAlr8/r1LgQfG0XLRtgOrhW8MBYgiuyAUfhd3hQVqWd8HrkXfjWXCHNy2W4IxmaMGBugZQDSS/8ImfVVgUf4G1ZNTjiDwseFP6w2A//wLOyKu2Ex0OG/rDkbbsjr1jJffAHf+WY2g7Bn7LOIjjBRbgqG5neMP6w4EHhD4sTcM2ygXoYLH0CX+X8Bj8WtF83V+F5tsNP8oWVBFXEPUteld1qmzH3BCgrYqfaQ3DCC+aqjdehL614HyyClcVKZ9VTwqpnNXINtCp1K89XOL2U6wsSw+sgPA5uSm6K/BZ7A9/LSXhZY4tgaOng0iXPU7hqgHxg7yy5Hn/btPDcZdQNj/fdlDzkPP5BXrOSAuIifVD8PHgGH8Kv8qmFP1gnZNmmyus/MDd54QKEXwfXQD/Aq1Z8zVbUDY9MSVY/C2rB3OFHG8mwf/FPm6el/xewS3Iz3Sj4qbBXtvo3EqKd8Dycl1vERt73poKvWifhdzUxvEgkEolEIt3OOuwKdptxuKBZAAAAAElFTkSuQmCC>