# EPB2 compatibility specification This remains the decoder for saved EPB2 records. New searches use EPB3. Your complete private address, rather than its short ID, is needed for reconstruction. The character alphabet is `abcdefghijklmnopqrstuvwxyz ,.` (digits0..28). A volume has410 pages of3200 characters, in40 rows of80. EPB2 reading volumes reject adjacent spaces. The public reference does not need your submitted passage. The address is `epb2/H/wW/sS/vV` with optional `/pP`. H is canonical base29 using `0123456789abcdefghijklmnopqrs`, without leading zeros except zero itself. W ranges0..3, S0..4, V0..31; P is a one-based page1..410. Recover the scrambled volume integer as H×640 + W×160 + S×32 + V; decode to exactly1,312,000 base29 digits with leading zeros retained. Overflow and noncanonical spellings fail. Invert eight additive Feistel rounds on two656,000-digit halves. Forward round i maps (L,R) to (R,(L+F_i(R)) mod29); inverse maps (L,R) to ((R-F_i(L)) mod29,L), processing rounds7 down to0. F_i uses domain `EPB/v2/feistel/i`: BLAKE3(UTF8(domain)||zeroByte||halfDigits) supplies a seed. For unsigned64 little-endian counters starting at0, BLAKE3 XOF of seed||counter produces65,536 bytes per block. Reject bytes>=232, map remaining bytes modulo29, and continue until656,000 digits. Concatenate the recovered halves and select the requested3200-digit page. The reference provides exact executable byte framing. `reconstruct.mjs`, fixed full-volume synthetic vectors and unchanged primitive vectors accompany this document. The canonical address, volume, scrambledvolume and page hashes are independently checked by that reference. Its BLAKE3 dependency is pinned in package-lock.json. No private customer data or online API is needed. Normalization/masks, purchase state and signed package authenticity are separate from mathematical page reconstruction. Keep the downloaded original submission as the authoritative source; a normalized mathematical page is not lossless.