PROOF.bend

bend-osdev-legacy-ciphers@0.1.0.0 · 8,799 lines · 237 definitions

1import Base
2import bend-osdev-bytes@0.1.0.0/bytes.bend as B
3import bend-osdev-bytes@0.1.0.0/LAWS.bend as BL
4import bend-osdev-bytes@0.1.0.0/PROOF.bend as BP
5import bend-osdev-cipher-modes@0.1.0.0/cipher_modes.bend as M
6import bend-osdev-legacy-ciphers@0.1.0.0/legacy_ciphers.bend as L
7import bend-osdev-legacy-ciphers@0.1.0.0/des.bend as D
8import bend-osdev-legacy-ciphers@0.1.0.0/tdes.bend as T
9import bend-osdev-legacy-ciphers@0.1.0.0/sm4.bend as S
10import bend-osdev-legacy-ciphers@0.1.0.0/camellia.bend as C
11import bend-osdev-legacy-ciphers@0.1.0.0/serpent.bend as P
12import bend-osdev-legacy-ciphers@0.1.0.0/twofish.bend as F
13import bend-osdev-legacy-ciphers@0.1.0.0/rc4.bend as R
14import bend-osdev-legacy-ciphers@0.1.0.0/modes64.bend as X
15import bend-osdev-legacy-ciphers@0.1.0.0/aria.bend as A
16import bend-osdev-legacy-ciphers@0.1.0.0/cast6.bend as C6
17import bend-osdev-legacy-ciphers@0.1.0.0/blowfish.bend as BF
18import bend-osdev-legacy-ciphers@0.1.0.0/cast5.bend as C5
19import bend-osdev-legacy-ciphers@0.1.0.0/tea.bend as TE
20import bend-osdev-legacy-ciphers@0.1.0.0/xtea.bend as XT
21import bend-osdev-legacy-ciphers@0.1.0.0/fcrypt.bend as FC
22import bend-osdev-legacy-ciphers@0.1.0.0/LAWS.bend as Laws
23
24# XOR undone: a == (a xor b) xor b, for every bit, word and block. Each lemma
25# is stated simple side first, the form a rewrite (%e : P) takes.
26
27def bool_xx(a: Bool, b: Bool) -> {a == Bool.xor(Bool.xor(a, b), b) : Bool}:
28  match a b:
29    case True{} True{}:
30      {==}
31    case True{} False{}:
32      {==}
33    case False{} True{}:
34      {==}
35    case False{} False{}:
36      {==}
37
38def word_xx(n: Nat, a: Word(n), b: Word(n)) -> {a == Word.xor(n, Word.xor(n, a, b), b) : Word(n)}:
39  match n:
40    case 0n:
41      match a b:
42        case WNil{} WNil{}:
43          {==}
44    case 1n+p:
45      match a b:
46        case WCon{ah, at} WCon{bh, bt}:
47          %bool_xx(ah, bh) : {WCon{ah, at} == WCon{_, Word.xor(p, Word.xor(p, at, bt), bt)} : Word(1n+p)}
48          %word_xx(p, at, bt) : {WCon{ah, at} == WCon{ah, _} : Word(1n+p)}
49          {==}
50
51def u32_xx(a: U32, b: U32) -> {a == U32.xor(U32.xor(a, b), b) : U32}:
52  match a b:
53    case U32{x} U32{y}:
54      %word_xx(32n, x, y) : {U32{x} == U32{_} : U32}
55      {==}
56
57def block_xx(s: M.CmBlock, k: M.CmBlock) -> {s == M.CmBlock.xor(M.CmBlock.xor(s, k), k) : M.CmBlock}:
58  match s k:
59    case M.CmBlock{+a0, +a1, +a2, +a3} M.CmBlock{+b0, +b1, +b2, +b3}:
60      %u32_xx(a0, b0) : {M.CmBlock{a0, a1, a2, a3} == M.CmBlock{_, U32.xor(U32.xor(a1, b1), b1), U32.xor(U32.xor(a2, b2), b2), U32.xor(U32.xor(a3, b3), b3)} : M.CmBlock}
61      %u32_xx(a1, b1) : {M.CmBlock{a0, a1, a2, a3} == M.CmBlock{a0, _, U32.xor(U32.xor(a2, b2), b2), U32.xor(U32.xor(a3, b3), b3)} : M.CmBlock}
62      %u32_xx(a2, b2) : {M.CmBlock{a0, a1, a2, a3} == M.CmBlock{a0, a1, _, U32.xor(U32.xor(a3, b3), b3)} : M.CmBlock}
63      %u32_xx(a3, b3) : {M.CmBlock{a0, a1, a2, a3} == M.CmBlock{a0, a1, a2, _} : M.CmBlock}
64      {==}
65
66# BEGIN GENERATED by gen/proof.py: bits
67# Rotations and byte swaps undone, for every word: computed on its 32 bits
68
69def rot_1_31(x: U32) -> {x == L.lc.rotl1.bits(L.lc.rotl31.bits(x)) : U32}:
70  match x:
71    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
72      {==}
73
74def rot_31_1(x: U32) -> {x == L.lc.rotl31.bits(L.lc.rotl1.bits(x)) : U32}:
75  match x:
76    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
77      {==}
78
79def rot_19_13(x: U32) -> {x == L.lc.rotl19.bits(L.lc.rotl13.bits(x)) : U32}:
80  match x:
81    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
82      {==}
83
84def rot_13_19(x: U32) -> {x == L.lc.rotl13.bits(L.lc.rotl19.bits(x)) : U32}:
85  match x:
86    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
87      {==}
88
89def rot_29_3(x: U32) -> {x == L.lc.rotl29.bits(L.lc.rotl3.bits(x)) : U32}:
90  match x:
91    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
92      {==}
93
94def rot_3_29(x: U32) -> {x == L.lc.rotl3.bits(L.lc.rotl29.bits(x)) : U32}:
95  match x:
96    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
97      {==}
98
99def rot_25_7(x: U32) -> {x == L.lc.rotl25.bits(L.lc.rotl7.bits(x)) : U32}:
100  match x:
101    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
102      {==}
103
104def rot_7_25(x: U32) -> {x == L.lc.rotl7.bits(L.lc.rotl25.bits(x)) : U32}:
105  match x:
106    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
107      {==}
108
109def rot_27_5(x: U32) -> {x == L.lc.rotl27.bits(L.lc.rotl5.bits(x)) : U32}:
110  match x:
111    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
112      {==}
113
114def rot_5_27(x: U32) -> {x == L.lc.rotl5.bits(L.lc.rotl27.bits(x)) : U32}:
115  match x:
116    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
117      {==}
118
119def rot_10_22(x: U32) -> {x == L.lc.rotl10.bits(L.lc.rotl22.bits(x)) : U32}:
120  match x:
121    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
122      {==}
123
124def rot_22_10(x: U32) -> {x == L.lc.rotl22.bits(L.lc.rotl10.bits(x)) : U32}:
125  match x:
126    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
127      {==}
128
129def bswap2(x: U32) -> {x == L.lc.bswap.bits(L.lc.bswap.bits(x)) : U32}:
130  match x:
131    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
132      {==}
133
134# DES's IP and IP^-1 undo each other, computed on the block's 64 bits
135def des_ip_fp(h: D.LcDesHalves) -> {h == D.des.ip(D.des.fp(h)) : D.LcDesHalves}:
136  match h:
137    case D.LcDesHalves{U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, U32{WCon{b0, WCon{b1, WCon{b2, WCon{b3, WCon{b4, WCon{b5, WCon{b6, WCon{b7, WCon{b8, WCon{b9, WCon{b10, WCon{b11, WCon{b12, WCon{b13, WCon{b14, WCon{b15, WCon{b16, WCon{b17, WCon{b18, WCon{b19, WCon{b20, WCon{b21, WCon{b22, WCon{b23, WCon{b24, WCon{b25, WCon{b26, WCon{b27, WCon{b28, WCon{b29, WCon{b30, WCon{b31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
138      {==}
139
140def des_fp_ip(b: L.LcBlock64) -> {b == D.des.fp(D.des.ip(b)) : L.LcBlock64}:
141  match b:
142    case L.LcBlock64{U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, U32{WCon{b0, WCon{b1, WCon{b2, WCon{b3, WCon{b4, WCon{b5, WCon{b6, WCon{b7, WCon{b8, WCon{b9, WCon{b10, WCon{b11, WCon{b12, WCon{b13, WCon{b14, WCon{b15, WCon{b16, WCon{b17, WCon{b18, WCon{b19, WCon{b20, WCon{b21, WCon{b22, WCon{b23, WCon{b24, WCon{b25, WCon{b26, WCon{b27, WCon{b28, WCon{b29, WCon{b30, WCon{b31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
143      {==}
144
145# the low byte of a XOR depends only on the low bytes
146def byte_xor_byte(z: U32, k: U32) -> {B.byte(U32.xor(z, k)) == B.byte(U32.xor(B.byte(z), k)) : U32}:
147  match z k:
148    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} U32{WCon{b0, WCon{b1, WCon{b2, WCon{b3, WCon{b4, WCon{b5, WCon{b6, WCon{b7, WCon{b8, WCon{b9, WCon{b10, WCon{b11, WCon{b12, WCon{b13, WCon{b14, WCon{b15, WCon{b16, WCon{b17, WCon{b18, WCon{b19, WCon{b20, WCon{b21, WCon{b22, WCon{b23, WCon{b24, WCon{b25, WCon{b26, WCon{b27, WCon{b28, WCon{b29, WCon{b30, WCon{b31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
149      {==}
150
151# a 64-bit block's bytes, masked and read back
152def blk_bytes(b: L.LcBlock64) -> {L.lc.block_of(B.mask(L.lc.block_bytes(b, Nil{}))) == Some{b} : Maybe<&2, L.LcBlock64>}:
153  match b:
154    case L.LcBlock64{U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, U32{WCon{c0, WCon{c1, WCon{c2, WCon{c3, WCon{c4, WCon{c5, WCon{c6, WCon{c7, WCon{c8, WCon{c9, WCon{c10, WCon{c11, WCon{c12, WCon{c13, WCon{c14, WCon{c15, WCon{c16, WCon{c17, WCon{c18, WCon{c19, WCon{c20, WCon{c21, WCon{c22, WCon{c23, WCon{c24, WCon{c25, WCon{c26, WCon{c27, WCon{c28, WCon{c29, WCon{c30, WCon{c31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
155      {==}
156
157def blk8(hi: U32, lo: U32) -> {L.LcBlock64{hi, lo} == L.lc.block8(B.byte(L.lc.b0.bits(hi)), B.byte(L.lc.b1.bits(hi)), B.byte(L.lc.b2.bits(hi)), B.byte(L.lc.b3.bits(hi)), B.byte(L.lc.b0.bits(lo)), B.byte(L.lc.b1.bits(lo)), B.byte(L.lc.b2.bits(lo)), B.byte(L.lc.b3.bits(lo))) : L.LcBlock64}:
158  match hi lo:
159    case U32{WCon{a0, WCon{a1, WCon{a2, WCon{a3, WCon{a4, WCon{a5, WCon{a6, WCon{a7, WCon{a8, WCon{a9, WCon{a10, WCon{a11, WCon{a12, WCon{a13, WCon{a14, WCon{a15, WCon{a16, WCon{a17, WCon{a18, WCon{a19, WCon{a20, WCon{a21, WCon{a22, WCon{a23, WCon{a24, WCon{a25, WCon{a26, WCon{a27, WCon{a28, WCon{a29, WCon{a30, WCon{a31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} U32{WCon{c0, WCon{c1, WCon{c2, WCon{c3, WCon{c4, WCon{c5, WCon{c6, WCon{c7, WCon{c8, WCon{c9, WCon{c10, WCon{c11, WCon{c12, WCon{c13, WCon{c14, WCon{c15, WCon{c16, WCon{c17, WCon{c18, WCon{c19, WCon{c20, WCon{c21, WCon{c22, WCon{c23, WCon{c24, WCon{c25, WCon{c26, WCon{c27, WCon{c28, WCon{c29, WCon{c30, WCon{c31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
160      {==}
161# END GENERATED: bits
162
163# DES: the swap is its own inverse, and a Feistel round is undone whatever f
164# is (IP and IP^-1 above)
165
166def des_swap2(h: D.LcDesHalves) -> {h == D.des.swap(D.des.swap(h)) : D.LcDesHalves}:
167  match h:
168    case D.LcDesHalves{l, r}:
169      {==}
170
171def des_unstep_step(+k: D.LcDesRk, h: D.LcDesHalves) -> {h == D.des.unstep(k, D.des.step(k, h)) : D.LcDesHalves}:
172  match h:
173    case D.LcDesHalves{l, +r}:
174      %u32_xx(l, D.des.f(k, r)) : {D.LcDesHalves{l, r} == D.LcDesHalves{_, r} : D.LcDesHalves}
175      {==}
176
177def des_step_unstep(+k: D.LcDesRk, h: D.LcDesHalves) -> {h == D.des.step(k, D.des.unstep(k, h)) : D.LcDesHalves}:
178  match h:
179    case D.LcDesHalves{+a, b}:
180      %u32_xx(b, D.des.f(k, a)) : {D.LcDesHalves{a, b} == D.LcDesHalves{a, _} : D.LcDesHalves}
181      {==}
182
183def des_unrounds_rounds(ks: List<&2, D.LcDesRk>, +h: D.LcDesHalves) -> {h == D.des.unrounds(ks, D.des.rounds(ks, h)) : D.LcDesHalves}:
184  match ks:
185    case Nil{}:
186      {==}
187    case Con{+k, +t}:
188      %des_unrounds_rounds(t, D.des.step(k, h)) : {h == D.des.unstep(k, _) : D.LcDesHalves}
189      des_unstep_step(k, h)
190
191def des_rounds_unrounds(ks: List<&2, D.LcDesRk>, +h: D.LcDesHalves) -> {h == D.des.rounds(ks, D.des.unrounds(ks, h)) : D.LcDesHalves}:
192  match ks:
193    case Nil{}:
194      {==}
195    case Con{+k, +t}:
196      %des_step_unstep(k, D.des.unrounds(t, h)) : {h == D.des.rounds(t, _) : D.LcDesHalves}
197      des_rounds_unrounds(t, h)
198
199def Laws.des_round_trip(k, b):
200  match k:
201    case D.LcDesKey{+ks}:
202      %des_ip_fp(D.des.swap(D.des.rounds(ks, D.des.ip(b)))) : {D.des.fp(D.des.unrounds(ks, D.des.swap(_))) == b : L.LcBlock64}
203      %des_swap2(D.des.rounds(ks, D.des.ip(b))) : {D.des.fp(D.des.unrounds(ks, _)) == b : L.LcBlock64}
204      %des_unrounds_rounds(ks, D.des.ip(b)) : {D.des.fp(_) == b : L.LcBlock64}
205      Equal.sym(L.LcBlock64, b, D.des.fp(D.des.ip(b)), des_fp_ip(b))
206
207def Laws.des_round_trip_dual(k, b):
208  match k:
209    case D.LcDesKey{+ks}:
210      %des_ip_fp(D.des.unrounds(ks, D.des.swap(D.des.ip(b)))) : {D.des.fp(D.des.swap(D.des.rounds(ks, _))) == b : L.LcBlock64}
211      %des_rounds_unrounds(ks, D.des.swap(D.des.ip(b))) : {D.des.fp(D.des.swap(_)) == b : L.LcBlock64}
212      %des_swap2(D.des.ip(b)) : {D.des.fp(_) == b : L.LcBlock64}
213      Equal.sym(L.LcBlock64, b, D.des.fp(D.des.ip(b)), des_fp_ip(b))
214
215# Triple DES: from DES's two laws
216
217def des_rt(k: D.LcDesKey, +b: L.LcBlock64) -> {b == D.LcDes.decrypt(k, D.LcDes.encrypt(k, b)) : L.LcBlock64}:
218  Equal.sym(L.LcBlock64, D.LcDes.decrypt(k, D.LcDes.encrypt(k, b)), b, Laws.des_round_trip(k, b))
219
220def des_rt_dual(k: D.LcDesKey, +b: L.LcBlock64) -> {b == D.LcDes.encrypt(k, D.LcDes.decrypt(k, b)) : L.LcBlock64}:
221  Equal.sym(L.LcBlock64, D.LcDes.encrypt(k, D.LcDes.decrypt(k, b)), b, Laws.des_round_trip_dual(k, b))
222
223def Laws.tdes_round_trip(k, b):
224  match k:
225    case T.LcTdesKey{+k1, +k2, +k3}:
226      %des_rt(k3, D.LcDes.decrypt(k2, D.LcDes.encrypt(k1, b))) : {D.LcDes.decrypt(k1, D.LcDes.encrypt(k2, _)) == b : L.LcBlock64}
227      %des_rt_dual(k2, D.LcDes.encrypt(k1, b)) : {D.LcDes.decrypt(k1, _) == b : L.LcBlock64}
228      Laws.des_round_trip(k1, b)
229
230def Laws.tdes_round_trip_dual(k, b):
231  match k:
232    case T.LcTdesKey{+k1, +k2, +k3}:
233      %des_rt_dual(k1, D.LcDes.encrypt(k2, D.LcDes.decrypt(k3, b))) : {D.LcDes.encrypt(k3, D.LcDes.decrypt(k2, _)) == b : L.LcBlock64}
234      %des_rt(k2, D.LcDes.decrypt(k3, b)) : {D.LcDes.encrypt(k3, _) == b : L.LcBlock64}
235      Laws.des_round_trip_dual(k3, b)
236
237# SM4: a round is undone whatever T is; R is its own inverse
238
239def sm4_unstep_step(+tab: L.LcTab, +rk: U32, s: M.CmBlock) -> {s == S.sm4.unstep(tab, rk, S.sm4.step(tab, rk, s)) : M.CmBlock}:
240  match s:
241    case M.CmBlock{x0, +x1, +x2, +x3}:
242      %u32_xx(x0, S.sm4.t(tab, U32.xor(U32.xor(U32.xor(x1, x2), x3), rk))) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{_, x1, x2, x3} : M.CmBlock}
243      {==}
244
245def sm4_step_unstep(+tab: L.LcTab, +rk: U32, s: M.CmBlock) -> {s == S.sm4.step(tab, rk, S.sm4.unstep(tab, rk, s)) : M.CmBlock}:
246  match s:
247    case M.CmBlock{+y0, +y1, +y2, y3}:
248      %u32_xx(y3, S.sm4.t(tab, U32.xor(U32.xor(U32.xor(y0, y1), y2), rk))) : {M.CmBlock{y0, y1, y2, y3} == M.CmBlock{y0, y1, y2, _} : M.CmBlock}
249      {==}
250
251def sm4_unrounds_rounds(+tab: L.LcTab, ks: List<&2, U32>, +s: M.CmBlock) -> {s == S.sm4.unrounds(tab, ks, S.sm4.rounds(tab, ks, s)) : M.CmBlock}:
252  match ks:
253    case Nil{}:
254      {==}
255    case Con{+k, +t}:
256      %sm4_unrounds_rounds(tab, t, S.sm4.step(tab, k, s)) : {s == S.sm4.unstep(tab, k, _) : M.CmBlock}
257      sm4_unstep_step(tab, k, s)
258
259def sm4_rounds_unrounds(+tab: L.LcTab, ks: List<&2, U32>, +s: M.CmBlock) -> {s == S.sm4.rounds(tab, ks, S.sm4.unrounds(tab, ks, s)) : M.CmBlock}:
260  match ks:
261    case Nil{}:
262      {==}
263    case Con{+k, +t}:
264      %sm4_step_unstep(tab, k, S.sm4.unrounds(tab, t, s)) : {s == S.sm4.rounds(tab, t, _) : M.CmBlock}
265      sm4_rounds_unrounds(tab, t, s)
266
267def sm4_rev2(s: M.CmBlock) -> {s == S.sm4.rev(S.sm4.rev(s)) : M.CmBlock}:
268  match s:
269    case M.CmBlock{a, b, c, d}:
270      {==}
271
272def Laws.sm4_round_trip(k, b):
273  match k:
274    case S.LcSm4Key{+tab, +ks}:
275      %sm4_rev2(S.sm4.rounds(tab, ks, b)) : {S.sm4.unrounds(tab, ks, _) == b : M.CmBlock}
276      Equal.sym(M.CmBlock, b, S.sm4.unrounds(tab, ks, S.sm4.rounds(tab, ks, b)), sm4_unrounds_rounds(tab, ks, b))
277
278def Laws.sm4_round_trip_dual(k, b):
279  match k:
280    case S.LcSm4Key{+tab, +ks}:
281      %sm4_rounds_unrounds(tab, ks, S.sm4.rev(b)) : {S.sm4.rev(_) == b : M.CmBlock}
282      Equal.sym(M.CmBlock, b, S.sm4.rev(S.sm4.rev(b)), sm4_rev2(b))
283
284# Camellia: each step of the cipher is undone (FL by FL^-1 and back, the
285# rounds and whitening by XOR, whatever F is), so the list of steps is
286
287def cam_fl_inv(x: L.LcBlock64, k: L.LcBlock64) -> {x == C.cam.flinv(C.cam.fl(x, k), k) : L.LcBlock64}:
288  match x k:
289    case L.LcBlock64{+x1, +x2} L.LcBlock64{+k1, +k2}:
290      %u32_xx(x1, U32.or(U32.xor(x2, L.lc.rotl(U32.and(x1, k1), 1n)), k2)) : {L.LcBlock64{x1, x2} == L.LcBlock64{_, U32.xor(U32.xor(x2, L.lc.rotl(U32.and(x1, k1), 1n)), L.lc.rotl(U32.and(_, k1), 1n))} : L.LcBlock64}
291      %u32_xx(x2, L.lc.rotl(U32.and(x1, k1), 1n)) : {L.LcBlock64{x1, x2} == L.LcBlock64{x1, _} : L.LcBlock64}
292      {==}
293
294def cam_flinv_inv(y: L.LcBlock64, k: L.LcBlock64) -> {y == C.cam.fl(C.cam.flinv(y, k), k) : L.LcBlock64}:
295  match y k:
296    case L.LcBlock64{+y1, +y2} L.LcBlock64{+k1, +k2}:
297      %u32_xx(y2, L.lc.rotl(U32.and(U32.xor(y1, U32.or(y2, k2)), k1), 1n)) : {L.LcBlock64{y1, y2} == L.LcBlock64{U32.xor(U32.xor(y1, U32.or(y2, k2)), U32.or(_, k2)), _} : L.LcBlock64}
298      %u32_xx(y1, U32.or(y2, k2)) : {L.LcBlock64{y1, y2} == L.LcBlock64{_, y2} : L.LcBlock64}
299      {==}
300
301def cam_white(a: L.LcBlock64, b: L.LcBlock64, +s: M.CmBlock) -> {s == C.cam.white(a, b, C.cam.white(a, b, s)) : M.CmBlock}:
302  match a b:
303    case L.LcBlock64{+a0, +a1} L.LcBlock64{+b0, +b1}:
304      block_xx(s, M.CmBlock{a0, a1, b0, b1})
305
306def cam_f1(+t: C.LcCamTabs, +k: L.LcBlock64, s: M.CmBlock) -> {s == C.cam.unop(C.LcCamF1{t, k}, C.cam.op(C.LcCamF1{t, k}, s)) : M.CmBlock}:
307  match s:
308    case M.CmBlock{+s0, +s1, +s2, +s3}:
309      %u32_xx(s2, C.cam.hi(C.cam.f(t, L.LcBlock64{s0, s1}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, s1, _, U32.xor(U32.xor(s3, C.cam.lo(C.cam.f(t, L.LcBlock64{s0, s1}, k))), C.cam.lo(C.cam.f(t, L.LcBlock64{s0, s1}, k)))} : M.CmBlock}
310      %u32_xx(s3, C.cam.lo(C.cam.f(t, L.LcBlock64{s0, s1}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, s1, s2, _} : M.CmBlock}
311      {==}
312
313def cam_f1d(+t: C.LcCamTabs, +k: L.LcBlock64, s: M.CmBlock) -> {s == C.cam.op(C.LcCamF1{t, k}, C.cam.unop(C.LcCamF1{t, k}, s)) : M.CmBlock}:
314  match s:
315    case M.CmBlock{+s0, +s1, +s2, +s3}:
316      %u32_xx(s2, C.cam.hi(C.cam.f(t, L.LcBlock64{s0, s1}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, s1, _, U32.xor(U32.xor(s3, C.cam.lo(C.cam.f(t, L.LcBlock64{s0, s1}, k))), C.cam.lo(C.cam.f(t, L.LcBlock64{s0, s1}, k)))} : M.CmBlock}
317      %u32_xx(s3, C.cam.lo(C.cam.f(t, L.LcBlock64{s0, s1}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, s1, s2, _} : M.CmBlock}
318      {==}
319
320def cam_f2(+t: C.LcCamTabs, +k: L.LcBlock64, s: M.CmBlock) -> {s == C.cam.unop(C.LcCamF2{t, k}, C.cam.op(C.LcCamF2{t, k}, s)) : M.CmBlock}:
321  match s:
322    case M.CmBlock{+s0, +s1, +s2, +s3}:
323      %u32_xx(s0, C.cam.hi(C.cam.f(t, L.LcBlock64{s2, s3}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{_, U32.xor(U32.xor(s1, C.cam.lo(C.cam.f(t, L.LcBlock64{s2, s3}, k))), C.cam.lo(C.cam.f(t, L.LcBlock64{s2, s3}, k))), s2, s3} : M.CmBlock}
324      %u32_xx(s1, C.cam.lo(C.cam.f(t, L.LcBlock64{s2, s3}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, _, s2, s3} : M.CmBlock}
325      {==}
326
327def cam_f2d(+t: C.LcCamTabs, +k: L.LcBlock64, s: M.CmBlock) -> {s == C.cam.op(C.LcCamF2{t, k}, C.cam.unop(C.LcCamF2{t, k}, s)) : M.CmBlock}:
328  match s:
329    case M.CmBlock{+s0, +s1, +s2, +s3}:
330      %u32_xx(s0, C.cam.hi(C.cam.f(t, L.LcBlock64{s2, s3}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{_, U32.xor(U32.xor(s1, C.cam.lo(C.cam.f(t, L.LcBlock64{s2, s3}, k))), C.cam.lo(C.cam.f(t, L.LcBlock64{s2, s3}, k))), s2, s3} : M.CmBlock}
331      %u32_xx(s1, C.cam.lo(C.cam.f(t, L.LcBlock64{s2, s3}, k))) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, _, s2, s3} : M.CmBlock}
332      {==}
333
334def cam_fl_step(a: L.LcBlock64, b: L.LcBlock64, s: M.CmBlock) -> {s == C.cam.unop(C.LcCamFl{a, b}, C.cam.op(C.LcCamFl{a, b}, s)) : M.CmBlock}:
335  match a b s:
336    case L.LcBlock64{+a0, +a1} L.LcBlock64{+b0, +b1} M.CmBlock{+s0, +s1, +s2, +s3}:
337      %cam_fl_inv(L.LcBlock64{s0, s1}, L.LcBlock64{a0, a1}) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{C.cam.hi(_), C.cam.lo(_), C.cam.hi(C.cam.fl(C.cam.flinv(L.LcBlock64{s2, s3}, L.LcBlock64{b0, b1}), L.LcBlock64{b0, b1})), C.cam.lo(C.cam.fl(C.cam.flinv(L.LcBlock64{s2, s3}, L.LcBlock64{b0, b1}), L.LcBlock64{b0, b1}))} : M.CmBlock}
338      %cam_flinv_inv(L.LcBlock64{s2, s3}, L.LcBlock64{b0, b1}) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, s1, C.cam.hi(_), C.cam.lo(_)} : M.CmBlock}
339      {==}
340
341def cam_fl_step_dual(a: L.LcBlock64, b: L.LcBlock64, s: M.CmBlock) -> {s == C.cam.op(C.LcCamFl{a, b}, C.cam.unop(C.LcCamFl{a, b}, s)) : M.CmBlock}:
342  match a b s:
343    case L.LcBlock64{+a0, +a1} L.LcBlock64{+b0, +b1} M.CmBlock{+s0, +s1, +s2, +s3}:
344      %cam_flinv_inv(L.LcBlock64{s0, s1}, L.LcBlock64{a0, a1}) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{C.cam.hi(_), C.cam.lo(_), C.cam.hi(C.cam.flinv(C.cam.fl(L.LcBlock64{s2, s3}, L.LcBlock64{b0, b1}), L.LcBlock64{b0, b1})), C.cam.lo(C.cam.flinv(C.cam.fl(L.LcBlock64{s2, s3}, L.LcBlock64{b0, b1}), L.LcBlock64{b0, b1}))} : M.CmBlock}
345      %cam_fl_inv(L.LcBlock64{s2, s3}, L.LcBlock64{b0, b1}) : {M.CmBlock{s0, s1, s2, s3} == M.CmBlock{s0, s1, C.cam.hi(_), C.cam.lo(_)} : M.CmBlock}
346      {==}
347
348def cam_unop_op(o: C.LcCamOp, +s: M.CmBlock) -> {s == C.cam.unop(o, C.cam.op(o, s)) : M.CmBlock}:
349  match o:
350    case C.LcCamWhite{a, b}:
351      cam_white(a, b, s)
352    case C.LcCamF1{t, k}:
353      cam_f1(t, k, s)
354    case C.LcCamF2{t, k}:
355      cam_f2(t, k, s)
356    case C.LcCamFl{a, b}:
357      cam_fl_step(a, b, s)
358    case C.LcCamSwap{}:
359      match s:
360        case M.CmBlock{s0, s1, s2, s3}:
361          {==}
362
363def cam_op_unop(o: C.LcCamOp, +s: M.CmBlock) -> {s == C.cam.op(o, C.cam.unop(o, s)) : M.CmBlock}:
364  match o:
365    case C.LcCamWhite{a, b}:
366      cam_white(a, b, s)
367    case C.LcCamF1{t, k}:
368      cam_f1d(t, k, s)
369    case C.LcCamF2{t, k}:
370      cam_f2d(t, k, s)
371    case C.LcCamFl{a, b}:
372      cam_fl_step_dual(a, b, s)
373    case C.LcCamSwap{}:
374      match s:
375        case M.CmBlock{s0, s1, s2, s3}:
376          {==}
377
378def cam_unrun_run(os: List<&2, C.LcCamOp>, +s: M.CmBlock) -> {s == C.cam.unrun(os, C.cam.run(os, s)) : M.CmBlock}:
379  match os:
380    case Nil{}:
381      {==}
382    case Con{+o, +t}:
383      %cam_unrun_run(t, C.cam.op(o, s)) : {s == C.cam.unop(o, _) : M.CmBlock}
384      cam_unop_op(o, s)
385
386def cam_run_unrun(os: List<&2, C.LcCamOp>, +s: M.CmBlock) -> {s == C.cam.run(os, C.cam.unrun(os, s)) : M.CmBlock}:
387  match os:
388    case Nil{}:
389      {==}
390    case Con{+o, +t}:
391      %cam_op_unop(o, C.cam.unrun(t, s)) : {s == C.cam.run(t, _) : M.CmBlock}
392      cam_run_unrun(t, s)
393
394def Laws.camellia_round_trip(k, b):
395  match k:
396    case C.LcCamelliaKey{ops}:
397      Equal.sym(M.CmBlock, b, C.cam.unrun(ops, C.cam.run(ops, b)), cam_unrun_run(ops, b))
398
399def Laws.camellia_round_trip_dual(k, b):
400  match k:
401    case C.LcCamelliaKey{ops}:
402      Equal.sym(M.CmBlock, b, C.cam.run(ops, C.cam.unrun(ops, b)), cam_run_unrun(ops, b))
403
404# Twofish: each step of the cipher is undone (a round whatever F is, by the
405# XORs and the 1-bit rotations undone), so the list of steps is
406
407def tf_bswap(s: M.CmBlock) -> {s == F.tf.unop(F.LcTfBswap{}, F.tf.op(F.LcTfBswap{}, s)) : M.CmBlock}:
408  match s:
409    case M.CmBlock{+a, +b, +c, +d}:
410      %bswap2(a) : {M.CmBlock{a, b, c, d} == M.CmBlock{_, L.lc.bswap.bits(L.lc.bswap.bits(b)), L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
411      %bswap2(b) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, _, L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
412      %bswap2(c) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, _, L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
413      %bswap2(d) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, c, _} : M.CmBlock}
414      {==}
415
416def tf_bswapd(s: M.CmBlock) -> {s == F.tf.op(F.LcTfBswap{}, F.tf.unop(F.LcTfBswap{}, s)) : M.CmBlock}:
417  match s:
418    case M.CmBlock{+a, +b, +c, +d}:
419      %bswap2(a) : {M.CmBlock{a, b, c, d} == M.CmBlock{_, L.lc.bswap.bits(L.lc.bswap.bits(b)), L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
420      %bswap2(b) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, _, L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
421      %bswap2(c) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, _, L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
422      %bswap2(d) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, c, _} : M.CmBlock}
423      {==}
424
425def tf_round(+tb: F.LcTfTabs, +sk: List<&2, U32>, +ka: U32, +kb: U32, s: M.CmBlock) -> {s == F.tf.unop(F.LcTfRound{tb, sk, ka, kb}, F.tf.op(F.LcTfRound{tb, sk, ka, kb}, s)) : M.CmBlock}:
426  match s:
427    case M.CmBlock{+r0, +r1, +r2, +r3}:
428      %rot_1_31(U32.xor(r2, F.tf.f0(F.tf.f(tb, sk, r0, r1, ka, kb)))) : {M.CmBlock{r0, r1, r2, r3} == M.CmBlock{r0, r1, U32.xor(_, F.tf.f0(F.tf.f(tb, sk, r0, r1, ka, kb))), L.lc.rotl31.bits(U32.xor(U32.xor(L.lc.rotl1.bits(r3), F.tf.f1(F.tf.f(tb, sk, r0, r1, ka, kb))), F.tf.f1(F.tf.f(tb, sk, r0, r1, ka, kb))))} : M.CmBlock}
429      %u32_xx(r2, F.tf.f0(F.tf.f(tb, sk, r0, r1, ka, kb))) : {M.CmBlock{r0, r1, r2, r3} == M.CmBlock{r0, r1, _, L.lc.rotl31.bits(U32.xor(U32.xor(L.lc.rotl1.bits(r3), F.tf.f1(F.tf.f(tb, sk, r0, r1, ka, kb))), F.tf.f1(F.tf.f(tb, sk, r0, r1, ka, kb))))} : M.CmBlock}
430      %u32_xx(L.lc.rotl1.bits(r3), F.tf.f1(F.tf.f(tb, sk, r0, r1, ka, kb))) : {M.CmBlock{r0, r1, r2, r3} == M.CmBlock{r0, r1, r2, L.lc.rotl31.bits(_)} : M.CmBlock}
431      %rot_31_1(r3) : {M.CmBlock{r0, r1, r2, r3} == M.CmBlock{r0, r1, r2, _} : M.CmBlock}
432      {==}
433
434def tf_roundd(+tb: F.LcTfTabs, +sk: List<&2, U32>, +ka: U32, +kb: U32, s: M.CmBlock) -> {s == F.tf.op(F.LcTfRound{tb, sk, ka, kb}, F.tf.unop(F.LcTfRound{tb, sk, ka, kb}, s)) : M.CmBlock}:
435  match s:
436    case M.CmBlock{+a, +b, +c, +d}:
437      %u32_xx(L.lc.rotl1.bits(a), F.tf.f0(F.tf.f(tb, sk, c, d, ka, kb))) : {M.CmBlock{a, b, c, d} == M.CmBlock{L.lc.rotl31.bits(_), U32.xor(L.lc.rotl1.bits(L.lc.rotl31.bits(U32.xor(b, F.tf.f1(F.tf.f(tb, sk, c, d, ka, kb))))), F.tf.f1(F.tf.f(tb, sk, c, d, ka, kb))), c, d} : M.CmBlock}
438      %rot_31_1(a) : {M.CmBlock{a, b, c, d} == M.CmBlock{_, U32.xor(L.lc.rotl1.bits(L.lc.rotl31.bits(U32.xor(b, F.tf.f1(F.tf.f(tb, sk, c, d, ka, kb))))), F.tf.f1(F.tf.f(tb, sk, c, d, ka, kb))), c, d} : M.CmBlock}
439      %rot_1_31(U32.xor(b, F.tf.f1(F.tf.f(tb, sk, c, d, ka, kb)))) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, U32.xor(_, F.tf.f1(F.tf.f(tb, sk, c, d, ka, kb))), c, d} : M.CmBlock}
440      %u32_xx(b, F.tf.f1(F.tf.f(tb, sk, c, d, ka, kb))) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, _, c, d} : M.CmBlock}
441      {==}
442
443def tf_unop_op(o: F.LcTfOp, +s: M.CmBlock) -> {s == F.tf.unop(o, F.tf.op(o, s)) : M.CmBlock}:
444  match o:
445    case F.LcTfBswap{}:
446      tf_bswap(s)
447    case F.LcTfWhite{k}:
448      block_xx(s, k)
449    case F.LcTfRound{tb, sk, ka, kb}:
450      tf_round(tb, sk, ka, kb, s)
451    case F.LcTfSwap{}:
452      match s:
453        case M.CmBlock{a, b, c, d}:
454          {==}
455
456def tf_op_unop(o: F.LcTfOp, +s: M.CmBlock) -> {s == F.tf.op(o, F.tf.unop(o, s)) : M.CmBlock}:
457  match o:
458    case F.LcTfBswap{}:
459      tf_bswapd(s)
460    case F.LcTfWhite{k}:
461      block_xx(s, k)
462    case F.LcTfRound{tb, sk, ka, kb}:
463      tf_roundd(tb, sk, ka, kb, s)
464    case F.LcTfSwap{}:
465      match s:
466        case M.CmBlock{a, b, c, d}:
467          {==}
468
469def tf_unrun_run(os: List<&2, F.LcTfOp>, +s: M.CmBlock) -> {s == F.tf.unrun(os, F.tf.run(os, s)) : M.CmBlock}:
470  match os:
471    case Nil{}:
472      {==}
473    case Con{+o, +t}:
474      %tf_unrun_run(t, F.tf.op(o, s)) : {s == F.tf.unop(o, _) : M.CmBlock}
475      tf_unop_op(o, s)
476
477def tf_run_unrun(os: List<&2, F.LcTfOp>, +s: M.CmBlock) -> {s == F.tf.run(os, F.tf.unrun(os, s)) : M.CmBlock}:
478  match os:
479    case Nil{}:
480      {==}
481    case Con{+o, +t}:
482      %tf_op_unop(o, F.tf.unrun(t, s)) : {s == F.tf.run(t, _) : M.CmBlock}
483      tf_run_unrun(t, s)
484
485def Laws.twofish_round_trip(k, b):
486  match k:
487    case F.LcTwofishKey{ops}:
488      Equal.sym(M.CmBlock, b, F.tf.unrun(ops, F.tf.run(ops, b)), tf_unrun_run(ops, b))
489
490def Laws.twofish_round_trip_dual(k, b):
491  match k:
492    case F.LcTwofishKey{ops}:
493      Equal.sym(M.CmBlock, b, F.tf.run(ops, F.tf.unrun(ops, b)), tf_run_unrun(ops, b))
494
495# Serpent: each step of the cipher is undone: an S-box layer one bit position
496# at a time (each S-box's inverse checked on all 16 inputs), the linear
497# transformation step by step (XORs and rotations undone), the key XORs and
498# the byte swaps; so the list of steps is
499
500# BEGIN GENERATED by gen/proof.py: serpent
501# the S-box and its inverse undo each other on every 4-bit input
502
503def sp_nib_0_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp0{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp0{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp0{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp0{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp0{}, True{}, n))}) : P.LcSpNib}:
504  match n:
505    case P.LcSpNib{a, b, c, d}:
506      match a b c d:
507        case True{} True{} True{} True{}:
508          {==}
509        case True{} True{} True{} False{}:
510          {==}
511        case True{} True{} False{} True{}:
512          {==}
513        case True{} True{} False{} False{}:
514          {==}
515        case True{} False{} True{} True{}:
516          {==}
517        case True{} False{} True{} False{}:
518          {==}
519        case True{} False{} False{} True{}:
520          {==}
521        case True{} False{} False{} False{}:
522          {==}
523        case False{} True{} True{} True{}:
524          {==}
525        case False{} True{} True{} False{}:
526          {==}
527        case False{} True{} False{} True{}:
528          {==}
529        case False{} True{} False{} False{}:
530          {==}
531        case False{} False{} True{} True{}:
532          {==}
533        case False{} False{} True{} False{}:
534          {==}
535        case False{} False{} False{} True{}:
536          {==}
537        case False{} False{} False{} False{}:
538          {==}
539
540def sp_nib_0_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp0{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp0{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp0{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp0{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp0{}, False{}, n))}) : P.LcSpNib}:
541  match n:
542    case P.LcSpNib{a, b, c, d}:
543      match a b c d:
544        case True{} True{} True{} True{}:
545          {==}
546        case True{} True{} True{} False{}:
547          {==}
548        case True{} True{} False{} True{}:
549          {==}
550        case True{} True{} False{} False{}:
551          {==}
552        case True{} False{} True{} True{}:
553          {==}
554        case True{} False{} True{} False{}:
555          {==}
556        case True{} False{} False{} True{}:
557          {==}
558        case True{} False{} False{} False{}:
559          {==}
560        case False{} True{} True{} True{}:
561          {==}
562        case False{} True{} True{} False{}:
563          {==}
564        case False{} True{} False{} True{}:
565          {==}
566        case False{} True{} False{} False{}:
567          {==}
568        case False{} False{} True{} True{}:
569          {==}
570        case False{} False{} True{} False{}:
571          {==}
572        case False{} False{} False{} True{}:
573          {==}
574        case False{} False{} False{} False{}:
575          {==}
576
577def sp_nib_1_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp1{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp1{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp1{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp1{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp1{}, True{}, n))}) : P.LcSpNib}:
578  match n:
579    case P.LcSpNib{a, b, c, d}:
580      match a b c d:
581        case True{} True{} True{} True{}:
582          {==}
583        case True{} True{} True{} False{}:
584          {==}
585        case True{} True{} False{} True{}:
586          {==}
587        case True{} True{} False{} False{}:
588          {==}
589        case True{} False{} True{} True{}:
590          {==}
591        case True{} False{} True{} False{}:
592          {==}
593        case True{} False{} False{} True{}:
594          {==}
595        case True{} False{} False{} False{}:
596          {==}
597        case False{} True{} True{} True{}:
598          {==}
599        case False{} True{} True{} False{}:
600          {==}
601        case False{} True{} False{} True{}:
602          {==}
603        case False{} True{} False{} False{}:
604          {==}
605        case False{} False{} True{} True{}:
606          {==}
607        case False{} False{} True{} False{}:
608          {==}
609        case False{} False{} False{} True{}:
610          {==}
611        case False{} False{} False{} False{}:
612          {==}
613
614def sp_nib_1_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp1{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp1{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp1{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp1{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp1{}, False{}, n))}) : P.LcSpNib}:
615  match n:
616    case P.LcSpNib{a, b, c, d}:
617      match a b c d:
618        case True{} True{} True{} True{}:
619          {==}
620        case True{} True{} True{} False{}:
621          {==}
622        case True{} True{} False{} True{}:
623          {==}
624        case True{} True{} False{} False{}:
625          {==}
626        case True{} False{} True{} True{}:
627          {==}
628        case True{} False{} True{} False{}:
629          {==}
630        case True{} False{} False{} True{}:
631          {==}
632        case True{} False{} False{} False{}:
633          {==}
634        case False{} True{} True{} True{}:
635          {==}
636        case False{} True{} True{} False{}:
637          {==}
638        case False{} True{} False{} True{}:
639          {==}
640        case False{} True{} False{} False{}:
641          {==}
642        case False{} False{} True{} True{}:
643          {==}
644        case False{} False{} True{} False{}:
645          {==}
646        case False{} False{} False{} True{}:
647          {==}
648        case False{} False{} False{} False{}:
649          {==}
650
651def sp_nib_2_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp2{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp2{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp2{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp2{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp2{}, True{}, n))}) : P.LcSpNib}:
652  match n:
653    case P.LcSpNib{a, b, c, d}:
654      match a b c d:
655        case True{} True{} True{} True{}:
656          {==}
657        case True{} True{} True{} False{}:
658          {==}
659        case True{} True{} False{} True{}:
660          {==}
661        case True{} True{} False{} False{}:
662          {==}
663        case True{} False{} True{} True{}:
664          {==}
665        case True{} False{} True{} False{}:
666          {==}
667        case True{} False{} False{} True{}:
668          {==}
669        case True{} False{} False{} False{}:
670          {==}
671        case False{} True{} True{} True{}:
672          {==}
673        case False{} True{} True{} False{}:
674          {==}
675        case False{} True{} False{} True{}:
676          {==}
677        case False{} True{} False{} False{}:
678          {==}
679        case False{} False{} True{} True{}:
680          {==}
681        case False{} False{} True{} False{}:
682          {==}
683        case False{} False{} False{} True{}:
684          {==}
685        case False{} False{} False{} False{}:
686          {==}
687
688def sp_nib_2_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp2{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp2{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp2{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp2{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp2{}, False{}, n))}) : P.LcSpNib}:
689  match n:
690    case P.LcSpNib{a, b, c, d}:
691      match a b c d:
692        case True{} True{} True{} True{}:
693          {==}
694        case True{} True{} True{} False{}:
695          {==}
696        case True{} True{} False{} True{}:
697          {==}
698        case True{} True{} False{} False{}:
699          {==}
700        case True{} False{} True{} True{}:
701          {==}
702        case True{} False{} True{} False{}:
703          {==}
704        case True{} False{} False{} True{}:
705          {==}
706        case True{} False{} False{} False{}:
707          {==}
708        case False{} True{} True{} True{}:
709          {==}
710        case False{} True{} True{} False{}:
711          {==}
712        case False{} True{} False{} True{}:
713          {==}
714        case False{} True{} False{} False{}:
715          {==}
716        case False{} False{} True{} True{}:
717          {==}
718        case False{} False{} True{} False{}:
719          {==}
720        case False{} False{} False{} True{}:
721          {==}
722        case False{} False{} False{} False{}:
723          {==}
724
725def sp_nib_3_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp3{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp3{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp3{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp3{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp3{}, True{}, n))}) : P.LcSpNib}:
726  match n:
727    case P.LcSpNib{a, b, c, d}:
728      match a b c d:
729        case True{} True{} True{} True{}:
730          {==}
731        case True{} True{} True{} False{}:
732          {==}
733        case True{} True{} False{} True{}:
734          {==}
735        case True{} True{} False{} False{}:
736          {==}
737        case True{} False{} True{} True{}:
738          {==}
739        case True{} False{} True{} False{}:
740          {==}
741        case True{} False{} False{} True{}:
742          {==}
743        case True{} False{} False{} False{}:
744          {==}
745        case False{} True{} True{} True{}:
746          {==}
747        case False{} True{} True{} False{}:
748          {==}
749        case False{} True{} False{} True{}:
750          {==}
751        case False{} True{} False{} False{}:
752          {==}
753        case False{} False{} True{} True{}:
754          {==}
755        case False{} False{} True{} False{}:
756          {==}
757        case False{} False{} False{} True{}:
758          {==}
759        case False{} False{} False{} False{}:
760          {==}
761
762def sp_nib_3_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp3{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp3{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp3{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp3{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp3{}, False{}, n))}) : P.LcSpNib}:
763  match n:
764    case P.LcSpNib{a, b, c, d}:
765      match a b c d:
766        case True{} True{} True{} True{}:
767          {==}
768        case True{} True{} True{} False{}:
769          {==}
770        case True{} True{} False{} True{}:
771          {==}
772        case True{} True{} False{} False{}:
773          {==}
774        case True{} False{} True{} True{}:
775          {==}
776        case True{} False{} True{} False{}:
777          {==}
778        case True{} False{} False{} True{}:
779          {==}
780        case True{} False{} False{} False{}:
781          {==}
782        case False{} True{} True{} True{}:
783          {==}
784        case False{} True{} True{} False{}:
785          {==}
786        case False{} True{} False{} True{}:
787          {==}
788        case False{} True{} False{} False{}:
789          {==}
790        case False{} False{} True{} True{}:
791          {==}
792        case False{} False{} True{} False{}:
793          {==}
794        case False{} False{} False{} True{}:
795          {==}
796        case False{} False{} False{} False{}:
797          {==}
798
799def sp_nib_4_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp4{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp4{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp4{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp4{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp4{}, True{}, n))}) : P.LcSpNib}:
800  match n:
801    case P.LcSpNib{a, b, c, d}:
802      match a b c d:
803        case True{} True{} True{} True{}:
804          {==}
805        case True{} True{} True{} False{}:
806          {==}
807        case True{} True{} False{} True{}:
808          {==}
809        case True{} True{} False{} False{}:
810          {==}
811        case True{} False{} True{} True{}:
812          {==}
813        case True{} False{} True{} False{}:
814          {==}
815        case True{} False{} False{} True{}:
816          {==}
817        case True{} False{} False{} False{}:
818          {==}
819        case False{} True{} True{} True{}:
820          {==}
821        case False{} True{} True{} False{}:
822          {==}
823        case False{} True{} False{} True{}:
824          {==}
825        case False{} True{} False{} False{}:
826          {==}
827        case False{} False{} True{} True{}:
828          {==}
829        case False{} False{} True{} False{}:
830          {==}
831        case False{} False{} False{} True{}:
832          {==}
833        case False{} False{} False{} False{}:
834          {==}
835
836def sp_nib_4_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp4{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp4{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp4{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp4{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp4{}, False{}, n))}) : P.LcSpNib}:
837  match n:
838    case P.LcSpNib{a, b, c, d}:
839      match a b c d:
840        case True{} True{} True{} True{}:
841          {==}
842        case True{} True{} True{} False{}:
843          {==}
844        case True{} True{} False{} True{}:
845          {==}
846        case True{} True{} False{} False{}:
847          {==}
848        case True{} False{} True{} True{}:
849          {==}
850        case True{} False{} True{} False{}:
851          {==}
852        case True{} False{} False{} True{}:
853          {==}
854        case True{} False{} False{} False{}:
855          {==}
856        case False{} True{} True{} True{}:
857          {==}
858        case False{} True{} True{} False{}:
859          {==}
860        case False{} True{} False{} True{}:
861          {==}
862        case False{} True{} False{} False{}:
863          {==}
864        case False{} False{} True{} True{}:
865          {==}
866        case False{} False{} True{} False{}:
867          {==}
868        case False{} False{} False{} True{}:
869          {==}
870        case False{} False{} False{} False{}:
871          {==}
872
873def sp_nib_5_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp5{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp5{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp5{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp5{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp5{}, True{}, n))}) : P.LcSpNib}:
874  match n:
875    case P.LcSpNib{a, b, c, d}:
876      match a b c d:
877        case True{} True{} True{} True{}:
878          {==}
879        case True{} True{} True{} False{}:
880          {==}
881        case True{} True{} False{} True{}:
882          {==}
883        case True{} True{} False{} False{}:
884          {==}
885        case True{} False{} True{} True{}:
886          {==}
887        case True{} False{} True{} False{}:
888          {==}
889        case True{} False{} False{} True{}:
890          {==}
891        case True{} False{} False{} False{}:
892          {==}
893        case False{} True{} True{} True{}:
894          {==}
895        case False{} True{} True{} False{}:
896          {==}
897        case False{} True{} False{} True{}:
898          {==}
899        case False{} True{} False{} False{}:
900          {==}
901        case False{} False{} True{} True{}:
902          {==}
903        case False{} False{} True{} False{}:
904          {==}
905        case False{} False{} False{} True{}:
906          {==}
907        case False{} False{} False{} False{}:
908          {==}
909
910def sp_nib_5_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp5{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp5{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp5{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp5{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp5{}, False{}, n))}) : P.LcSpNib}:
911  match n:
912    case P.LcSpNib{a, b, c, d}:
913      match a b c d:
914        case True{} True{} True{} True{}:
915          {==}
916        case True{} True{} True{} False{}:
917          {==}
918        case True{} True{} False{} True{}:
919          {==}
920        case True{} True{} False{} False{}:
921          {==}
922        case True{} False{} True{} True{}:
923          {==}
924        case True{} False{} True{} False{}:
925          {==}
926        case True{} False{} False{} True{}:
927          {==}
928        case True{} False{} False{} False{}:
929          {==}
930        case False{} True{} True{} True{}:
931          {==}
932        case False{} True{} True{} False{}:
933          {==}
934        case False{} True{} False{} True{}:
935          {==}
936        case False{} True{} False{} False{}:
937          {==}
938        case False{} False{} True{} True{}:
939          {==}
940        case False{} False{} True{} False{}:
941          {==}
942        case False{} False{} False{} True{}:
943          {==}
944        case False{} False{} False{} False{}:
945          {==}
946
947def sp_nib_6_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp6{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp6{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp6{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp6{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp6{}, True{}, n))}) : P.LcSpNib}:
948  match n:
949    case P.LcSpNib{a, b, c, d}:
950      match a b c d:
951        case True{} True{} True{} True{}:
952          {==}
953        case True{} True{} True{} False{}:
954          {==}
955        case True{} True{} False{} True{}:
956          {==}
957        case True{} True{} False{} False{}:
958          {==}
959        case True{} False{} True{} True{}:
960          {==}
961        case True{} False{} True{} False{}:
962          {==}
963        case True{} False{} False{} True{}:
964          {==}
965        case True{} False{} False{} False{}:
966          {==}
967        case False{} True{} True{} True{}:
968          {==}
969        case False{} True{} True{} False{}:
970          {==}
971        case False{} True{} False{} True{}:
972          {==}
973        case False{} True{} False{} False{}:
974          {==}
975        case False{} False{} True{} True{}:
976          {==}
977        case False{} False{} True{} False{}:
978          {==}
979        case False{} False{} False{} True{}:
980          {==}
981        case False{} False{} False{} False{}:
982          {==}
983
984def sp_nib_6_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp6{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp6{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp6{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp6{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp6{}, False{}, n))}) : P.LcSpNib}:
985  match n:
986    case P.LcSpNib{a, b, c, d}:
987      match a b c d:
988        case True{} True{} True{} True{}:
989          {==}
990        case True{} True{} True{} False{}:
991          {==}
992        case True{} True{} False{} True{}:
993          {==}
994        case True{} True{} False{} False{}:
995          {==}
996        case True{} False{} True{} True{}:
997          {==}
998        case True{} False{} True{} False{}:
999          {==}
1000        case True{} False{} False{} True{}:
1001          {==}
1002        case True{} False{} False{} False{}:
1003          {==}
1004        case False{} True{} True{} True{}:
1005          {==}
1006        case False{} True{} True{} False{}:
1007          {==}
1008        case False{} True{} False{} True{}:
1009          {==}
1010        case False{} True{} False{} False{}:
1011          {==}
1012        case False{} False{} True{} True{}:
1013          {==}
1014        case False{} False{} True{} False{}:
1015          {==}
1016        case False{} False{} False{} True{}:
1017          {==}
1018        case False{} False{} False{} False{}:
1019          {==}
1020
1021def sp_nib_7_t(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp7{}, False{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp7{}, True{}, n)), P.sp.nb(P.sp.nib(P.LcSp7{}, True{}, n)), P.sp.nc(P.sp.nib(P.LcSp7{}, True{}, n)), P.sp.nd(P.sp.nib(P.LcSp7{}, True{}, n))}) : P.LcSpNib}:
1022  match n:
1023    case P.LcSpNib{a, b, c, d}:
1024      match a b c d:
1025        case True{} True{} True{} True{}:
1026          {==}
1027        case True{} True{} True{} False{}:
1028          {==}
1029        case True{} True{} False{} True{}:
1030          {==}
1031        case True{} True{} False{} False{}:
1032          {==}
1033        case True{} False{} True{} True{}:
1034          {==}
1035        case True{} False{} True{} False{}:
1036          {==}
1037        case True{} False{} False{} True{}:
1038          {==}
1039        case True{} False{} False{} False{}:
1040          {==}
1041        case False{} True{} True{} True{}:
1042          {==}
1043        case False{} True{} True{} False{}:
1044          {==}
1045        case False{} True{} False{} True{}:
1046          {==}
1047        case False{} True{} False{} False{}:
1048          {==}
1049        case False{} False{} True{} True{}:
1050          {==}
1051        case False{} False{} True{} False{}:
1052          {==}
1053        case False{} False{} False{} True{}:
1054          {==}
1055        case False{} False{} False{} False{}:
1056          {==}
1057
1058def sp_nib_7_f(+n: P.LcSpNib) -> {n == P.sp.nib(P.LcSp7{}, True{}, P.LcSpNib{P.sp.na(P.sp.nib(P.LcSp7{}, False{}, n)), P.sp.nb(P.sp.nib(P.LcSp7{}, False{}, n)), P.sp.nc(P.sp.nib(P.LcSp7{}, False{}, n)), P.sp.nd(P.sp.nib(P.LcSp7{}, False{}, n))}) : P.LcSpNib}:
1059  match n:
1060    case P.LcSpNib{a, b, c, d}:
1061      match a b c d:
1062        case True{} True{} True{} True{}:
1063          {==}
1064        case True{} True{} True{} False{}:
1065          {==}
1066        case True{} True{} False{} True{}:
1067          {==}
1068        case True{} True{} False{} False{}:
1069          {==}
1070        case True{} False{} True{} True{}:
1071          {==}
1072        case True{} False{} True{} False{}:
1073          {==}
1074        case True{} False{} False{} True{}:
1075          {==}
1076        case True{} False{} False{} False{}:
1077          {==}
1078        case False{} True{} True{} True{}:
1079          {==}
1080        case False{} True{} True{} False{}:
1081          {==}
1082        case False{} True{} False{} True{}:
1083          {==}
1084        case False{} True{} False{} False{}:
1085          {==}
1086        case False{} False{} True{} True{}:
1087          {==}
1088        case False{} False{} True{} False{}:
1089          {==}
1090        case False{} False{} False{} True{}:
1091          {==}
1092        case False{} False{} False{} False{}:
1093          {==}
1094
1095def sp_nib_inv(bx: P.LcSpBox, inv: Bool, +n: P.LcSpNib) -> {n == P.sp.nib(bx, Bool.not(inv), P.LcSpNib{P.sp.na(P.sp.nib(bx, inv, n)), P.sp.nb(P.sp.nib(bx, inv, n)), P.sp.nc(P.sp.nib(bx, inv, n)), P.sp.nd(P.sp.nib(bx, inv, n))}) : P.LcSpNib}:
1096  match bx:
1097    case P.LcSp0{}:
1098      match inv:
1099        case True{}:
1100          sp_nib_0_t(n)
1101        case False{}:
1102          sp_nib_0_f(n)
1103    case P.LcSp1{}:
1104      match inv:
1105        case True{}:
1106          sp_nib_1_t(n)
1107        case False{}:
1108          sp_nib_1_f(n)
1109    case P.LcSp2{}:
1110      match inv:
1111        case True{}:
1112          sp_nib_2_t(n)
1113        case False{}:
1114          sp_nib_2_f(n)
1115    case P.LcSp3{}:
1116      match inv:
1117        case True{}:
1118          sp_nib_3_t(n)
1119        case False{}:
1120          sp_nib_3_f(n)
1121    case P.LcSp4{}:
1122      match inv:
1123        case True{}:
1124          sp_nib_4_t(n)
1125        case False{}:
1126          sp_nib_4_f(n)
1127    case P.LcSp5{}:
1128      match inv:
1129        case True{}:
1130          sp_nib_5_t(n)
1131        case False{}:
1132          sp_nib_5_f(n)
1133    case P.LcSp6{}:
1134      match inv:
1135        case True{}:
1136          sp_nib_6_t(n)
1137        case False{}:
1138          sp_nib_6_f(n)
1139    case P.LcSp7{}:
1140      match inv:
1141        case True{}:
1142          sp_nib_7_t(n)
1143        case False{}:
1144          sp_nib_7_f(n)
1145
1146# a layer's input rebuilt from its fields gives the same layer
1147def sp_eta(+bx: P.LcSpBox, +inv: Bool, -p: Nat, z: P.LcSpQ<p>) -> {P.sp.layer(bx, inv, p, z) == P.sp.layer(bx, inv, p, P.LcSpQ{P.sp.qa(p, z), P.sp.qb(p, z), P.sp.qc(p, z), P.sp.qd(p, z)}) : P.LcSpQ<p>}:
1148  match z:
1149    case P.LcSpQ{a, b, c, d}:
1150      {==}
1151
1152# an S-box layer and its inverse undo each other on four m-bit words
1153def sp_layer_inv(+bx: P.LcSpBox, +inv: Bool, m: Nat, +q: P.LcSpQ<m>) -> {q == P.sp.layer(bx, Bool.not(inv), m, P.sp.layer(bx, inv, m, q)) : P.LcSpQ<m>}:
1154  match m:
1155    case 0n:
1156      {==}
1157    case 1n+(+p):
1158      match q:
1159        case P.LcSpQ{WCon{+x0, +t0}, WCon{+x1, +t1}, WCon{+x2, +t2}, WCon{+x3, +t3}}:
1160          %sp_nib_inv(bx, inv, P.LcSpNib{x0, x1, x2, x3}) : {P.LcSpQ{WCon{x0, t0}, WCon{x1, t1}, WCon{x2, t2}, WCon{x3, t3}} == P.LcSpQ{WCon{P.sp.na(_), P.sp.qa(p, P.sp.layer(bx, Bool.not(inv), p, P.LcSpQ{P.sp.qa(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qb(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qc(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qd(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3}))}))}, WCon{P.sp.nb(_), P.sp.qb(p, P.sp.layer(bx, Bool.not(inv), p, P.LcSpQ{P.sp.qa(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qb(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qc(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qd(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3}))}))}, WCon{P.sp.nc(_), P.sp.qc(p, P.sp.layer(bx, Bool.not(inv), p, P.LcSpQ{P.sp.qa(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qb(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qc(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qd(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3}))}))}, WCon{P.sp.nd(_), P.sp.qd(p, P.sp.layer(bx, Bool.not(inv), p, P.LcSpQ{P.sp.qa(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qb(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qc(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qd(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3}))}))}} : P.LcSpQ<1n+p>}
1161          %Equal.trans(P.LcSpQ<p>, P.LcSpQ{t0, t1, t2, t3}, P.sp.layer(bx, Bool.not(inv), p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.layer(bx, Bool.not(inv), p, P.LcSpQ{P.sp.qa(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qb(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qc(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3})), P.sp.qd(p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3}))}), sp_layer_inv(bx, inv, p, P.LcSpQ{t0, t1, t2, t3}), sp_eta(bx, Bool.not(inv), p, P.sp.layer(bx, inv, p, P.LcSpQ{t0, t1, t2, t3}))) : {P.LcSpQ{WCon{x0, t0}, WCon{x1, t1}, WCon{x2, t2}, WCon{x3, t3}} == P.LcSpQ{WCon{x0, P.sp.qa(p, _)}, WCon{x1, P.sp.qb(p, _)}, WCon{x2, P.sp.qc(p, _)}, WCon{x3, P.sp.qd(p, _)}} : P.LcSpQ<1n+p>}
1162          {==}
1163
1164# an S-box step and its inverse undo each other on the state
1165def sp_sop_inv(+bx: P.LcSpBox, +inv: Bool, s: M.CmBlock) -> {s == P.sp.sop(bx, Bool.not(inv), P.sp.sop(bx, inv, s)) : M.CmBlock}:
1166  match s:
1167    case M.CmBlock{U32{+w0}, U32{+w1}, U32{+w2}, U32{+w3}}:
1168      %Equal.trans(P.LcSpQ<32n>, P.LcSpQ{w0, w1, w2, w3}, P.sp.layer(bx, Bool.not(inv), 32n, P.sp.layer(bx, inv, 32n, P.LcSpQ{w0, w1, w2, w3})), P.sp.layer(bx, Bool.not(inv), 32n, P.LcSpQ{P.sp.qa(32n, P.sp.layer(bx, inv, 32n, P.LcSpQ{w0, w1, w2, w3})), P.sp.qb(32n, P.sp.layer(bx, inv, 32n, P.LcSpQ{w0, w1, w2, w3})), P.sp.qc(32n, P.sp.layer(bx, inv, 32n, P.LcSpQ{w0, w1, w2, w3})), P.sp.qd(32n, P.sp.layer(bx, inv, 32n, P.LcSpQ{w0, w1, w2, w3}))}), sp_layer_inv(bx, inv, 32n, P.LcSpQ{w0, w1, w2, w3}), sp_eta(bx, Bool.not(inv), 32n, P.sp.layer(bx, inv, 32n, P.LcSpQ{w0, w1, w2, w3}))) : {M.CmBlock{U32{w0}, U32{w1}, U32{w2}, U32{w3}} == M.CmBlock{U32{P.sp.qa(32n, _)}, U32{P.sp.qb(32n, _)}, U32{P.sp.qc(32n, _)}, U32{P.sp.qd(32n, _)}} : M.CmBlock}
1169      {==}
1170
1171# the linear transformation's steps, each undone
1172def sp_lt1(s: M.CmBlock) -> {s == P.sp.ilt1(P.sp.lt1(s)) : M.CmBlock}:
1173  match s:
1174    case M.CmBlock{+x0, +x1, +x2, +x3}:
1175      %rot_19_13(x0) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{_, x1, x2, x3} : M.CmBlock}
1176      {==}
1177
1178def sp_lt1d(s: M.CmBlock) -> {s == P.sp.lt1(P.sp.ilt1(s)) : M.CmBlock}:
1179  match s:
1180    case M.CmBlock{+x0, +x1, +x2, +x3}:
1181      %rot_13_19(x0) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{_, x1, x2, x3} : M.CmBlock}
1182      {==}
1183
1184def sp_lt2(s: M.CmBlock) -> {s == P.sp.ilt2(P.sp.lt2(s)) : M.CmBlock}:
1185  match s:
1186    case M.CmBlock{+x0, +x1, +x2, +x3}:
1187      %rot_29_3(x2) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, _, x3} : M.CmBlock}
1188      {==}
1189
1190def sp_lt2d(s: M.CmBlock) -> {s == P.sp.lt2(P.sp.ilt2(s)) : M.CmBlock}:
1191  match s:
1192    case M.CmBlock{+x0, +x1, +x2, +x3}:
1193      %rot_3_29(x2) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, _, x3} : M.CmBlock}
1194      {==}
1195
1196def sp_lt3(s: M.CmBlock) -> {s == P.sp.lt3(P.sp.lt3(s)) : M.CmBlock}:
1197  match s:
1198    case M.CmBlock{+x0, +x1, +x2, +x3}:
1199      %u32_xx(x1, U32.xor(x0, x2)) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, _, x2, x3} : M.CmBlock}
1200      {==}
1201
1202def sp_lt4(s: M.CmBlock) -> {s == P.sp.lt4(P.sp.lt4(s)) : M.CmBlock}:
1203  match s:
1204    case M.CmBlock{+x0, +x1, +x2, +x3}:
1205      %u32_xx(x3, U32.xor(x2, U32.shln(x0, 3n))) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, x2, _} : M.CmBlock}
1206      {==}
1207
1208def sp_lt5(s: M.CmBlock) -> {s == P.sp.ilt5(P.sp.lt5(s)) : M.CmBlock}:
1209  match s:
1210    case M.CmBlock{+x0, +x1, +x2, +x3}:
1211      %rot_31_1(x1) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, _, x2, L.lc.rotl25.bits(L.lc.rotl7.bits(x3))} : M.CmBlock}
1212      %rot_25_7(x3) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, x2, _} : M.CmBlock}
1213      {==}
1214
1215def sp_lt5d(s: M.CmBlock) -> {s == P.sp.lt5(P.sp.ilt5(s)) : M.CmBlock}:
1216  match s:
1217    case M.CmBlock{+x0, +x1, +x2, +x3}:
1218      %rot_1_31(x1) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, _, x2, L.lc.rotl7.bits(L.lc.rotl25.bits(x3))} : M.CmBlock}
1219      %rot_7_25(x3) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, x2, _} : M.CmBlock}
1220      {==}
1221
1222def sp_lt6(s: M.CmBlock) -> {s == P.sp.lt6(P.sp.lt6(s)) : M.CmBlock}:
1223  match s:
1224    case M.CmBlock{+x0, +x1, +x2, +x3}:
1225      %u32_xx(x0, U32.xor(x1, x3)) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{_, x1, x2, x3} : M.CmBlock}
1226      {==}
1227
1228def sp_lt7(s: M.CmBlock) -> {s == P.sp.lt7(P.sp.lt7(s)) : M.CmBlock}:
1229  match s:
1230    case M.CmBlock{+x0, +x1, +x2, +x3}:
1231      %u32_xx(x2, U32.xor(x3, U32.shln(x1, 7n))) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, _, x3} : M.CmBlock}
1232      {==}
1233
1234def sp_lt8(s: M.CmBlock) -> {s == P.sp.ilt8(P.sp.lt8(s)) : M.CmBlock}:
1235  match s:
1236    case M.CmBlock{+x0, +x1, +x2, +x3}:
1237      %rot_27_5(x0) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{_, x1, L.lc.rotl10.bits(L.lc.rotl22.bits(x2)), x3} : M.CmBlock}
1238      %rot_10_22(x2) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, _, x3} : M.CmBlock}
1239      {==}
1240
1241def sp_lt8d(s: M.CmBlock) -> {s == P.sp.lt8(P.sp.ilt8(s)) : M.CmBlock}:
1242  match s:
1243    case M.CmBlock{+x0, +x1, +x2, +x3}:
1244      %rot_5_27(x0) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{_, x1, L.lc.rotl22.bits(L.lc.rotl10.bits(x2)), x3} : M.CmBlock}
1245      %rot_22_10(x2) : {M.CmBlock{x0, x1, x2, x3} == M.CmBlock{x0, x1, _, x3} : M.CmBlock}
1246      {==}
1247
1248def sp_lt_inv(+s: M.CmBlock) -> {s == P.sp.ilt(P.sp.lt(s)) : M.CmBlock}:
1249  %sp_lt8(P.sp.lt7(P.sp.lt6(P.sp.lt5(P.sp.lt4(P.sp.lt3(P.sp.lt2(P.sp.lt1(s)))))))) : {s == P.sp.ilt1(P.sp.ilt2(P.sp.lt3(P.sp.lt4(P.sp.ilt5(P.sp.lt6(P.sp.lt7(_))))))) : M.CmBlock}
1250  %sp_lt7(P.sp.lt6(P.sp.lt5(P.sp.lt4(P.sp.lt3(P.sp.lt2(P.sp.lt1(s))))))) : {s == P.sp.ilt1(P.sp.ilt2(P.sp.lt3(P.sp.lt4(P.sp.ilt5(P.sp.lt6(_)))))) : M.CmBlock}
1251  %sp_lt6(P.sp.lt5(P.sp.lt4(P.sp.lt3(P.sp.lt2(P.sp.lt1(s)))))) : {s == P.sp.ilt1(P.sp.ilt2(P.sp.lt3(P.sp.lt4(P.sp.ilt5(_))))) : M.CmBlock}
1252  %sp_lt5(P.sp.lt4(P.sp.lt3(P.sp.lt2(P.sp.lt1(s))))) : {s == P.sp.ilt1(P.sp.ilt2(P.sp.lt3(P.sp.lt4(_)))) : M.CmBlock}
1253  %sp_lt4(P.sp.lt3(P.sp.lt2(P.sp.lt1(s)))) : {s == P.sp.ilt1(P.sp.ilt2(P.sp.lt3(_))) : M.CmBlock}
1254  %sp_lt3(P.sp.lt2(P.sp.lt1(s))) : {s == P.sp.ilt1(P.sp.ilt2(_)) : M.CmBlock}
1255  %sp_lt2(P.sp.lt1(s)) : {s == P.sp.ilt1(_) : M.CmBlock}
1256  sp_lt1(s)
1257
1258def sp_lt_invd(+s: M.CmBlock) -> {s == P.sp.lt(P.sp.ilt(s)) : M.CmBlock}:
1259  %sp_lt1d(P.sp.ilt2(P.sp.lt3(P.sp.lt4(P.sp.ilt5(P.sp.lt6(P.sp.lt7(P.sp.ilt8(s)))))))) : {s == P.sp.lt8(P.sp.lt7(P.sp.lt6(P.sp.lt5(P.sp.lt4(P.sp.lt3(P.sp.lt2(_))))))) : M.CmBlock}
1260  %sp_lt2d(P.sp.lt3(P.sp.lt4(P.sp.ilt5(P.sp.lt6(P.sp.lt7(P.sp.ilt8(s))))))) : {s == P.sp.lt8(P.sp.lt7(P.sp.lt6(P.sp.lt5(P.sp.lt4(P.sp.lt3(_)))))) : M.CmBlock}
1261  %sp_lt3(P.sp.lt4(P.sp.ilt5(P.sp.lt6(P.sp.lt7(P.sp.ilt8(s)))))) : {s == P.sp.lt8(P.sp.lt7(P.sp.lt6(P.sp.lt5(P.sp.lt4(_))))) : M.CmBlock}
1262  %sp_lt4(P.sp.ilt5(P.sp.lt6(P.sp.lt7(P.sp.ilt8(s))))) : {s == P.sp.lt8(P.sp.lt7(P.sp.lt6(P.sp.lt5(_)))) : M.CmBlock}
1263  %sp_lt5d(P.sp.lt6(P.sp.lt7(P.sp.ilt8(s)))) : {s == P.sp.lt8(P.sp.lt7(P.sp.lt6(_))) : M.CmBlock}
1264  %sp_lt6(P.sp.lt7(P.sp.ilt8(s))) : {s == P.sp.lt8(P.sp.lt7(_)) : M.CmBlock}
1265  %sp_lt7(P.sp.ilt8(s)) : {s == P.sp.lt8(_) : M.CmBlock}
1266  sp_lt8d(s)
1267# END GENERATED: serpent
1268
1269def sp_bswap(s: M.CmBlock) -> {s == P.sp.unop(P.LcSpBswap{}, P.sp.op(P.LcSpBswap{}, s)) : M.CmBlock}:
1270  match s:
1271    case M.CmBlock{+a, +b, +c, +d}:
1272      %bswap2(a) : {M.CmBlock{a, b, c, d} == M.CmBlock{_, L.lc.bswap.bits(L.lc.bswap.bits(b)), L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
1273      %bswap2(b) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, _, L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
1274      %bswap2(c) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, _, L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
1275      %bswap2(d) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, c, _} : M.CmBlock}
1276      {==}
1277
1278def sp_bswapd(s: M.CmBlock) -> {s == P.sp.op(P.LcSpBswap{}, P.sp.unop(P.LcSpBswap{}, s)) : M.CmBlock}:
1279  match s:
1280    case M.CmBlock{+a, +b, +c, +d}:
1281      %bswap2(a) : {M.CmBlock{a, b, c, d} == M.CmBlock{_, L.lc.bswap.bits(L.lc.bswap.bits(b)), L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
1282      %bswap2(b) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, _, L.lc.bswap.bits(L.lc.bswap.bits(c)), L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
1283      %bswap2(c) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, _, L.lc.bswap.bits(L.lc.bswap.bits(d))} : M.CmBlock}
1284      %bswap2(d) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, c, _} : M.CmBlock}
1285      {==}
1286
1287def sp_unop_op(o: P.LcSpOp, +s: M.CmBlock) -> {s == P.sp.unop(o, P.sp.op(o, s)) : M.CmBlock}:
1288  match o:
1289    case P.LcSpBswap{}:
1290      sp_bswap(s)
1291    case P.LcSpKey{k}:
1292      block_xx(s, k)
1293    case P.LcSpS{bx}:
1294      sp_sop_inv(bx, False{}, s)
1295    case P.LcSpLt{}:
1296      sp_lt_inv(s)
1297
1298def sp_op_unop(o: P.LcSpOp, +s: M.CmBlock) -> {s == P.sp.op(o, P.sp.unop(o, s)) : M.CmBlock}:
1299  match o:
1300    case P.LcSpBswap{}:
1301      sp_bswapd(s)
1302    case P.LcSpKey{k}:
1303      block_xx(s, k)
1304    case P.LcSpS{bx}:
1305      sp_sop_inv(bx, True{}, s)
1306    case P.LcSpLt{}:
1307      sp_lt_invd(s)
1308
1309def sp_unrun_run(os: List<&2, P.LcSpOp>, +s: M.CmBlock) -> {s == P.sp.unrun(os, P.sp.run(os, s)) : M.CmBlock}:
1310  match os:
1311    case Nil{}:
1312      {==}
1313    case Con{+o, +t}:
1314      %sp_unrun_run(t, P.sp.op(o, s)) : {s == P.sp.unop(o, _) : M.CmBlock}
1315      sp_unop_op(o, s)
1316
1317def sp_run_unrun(os: List<&2, P.LcSpOp>, +s: M.CmBlock) -> {s == P.sp.run(os, P.sp.unrun(os, s)) : M.CmBlock}:
1318  match os:
1319    case Nil{}:
1320      {==}
1321    case Con{+o, +t}:
1322      %sp_op_unop(o, P.sp.unrun(t, s)) : {s == P.sp.run(t, _) : M.CmBlock}
1323      sp_run_unrun(t, s)
1324
1325def Laws.serpent_round_trip(k, b):
1326  match k:
1327    case P.LcSerpentKey{ops}:
1328      Equal.sym(M.CmBlock, b, P.sp.unrun(ops, P.sp.run(ops, b)), sp_unrun_run(ops, b))
1329
1330def Laws.serpent_round_trip_dual(k, b):
1331  match k:
1332    case P.LcSerpentKey{ops}:
1333      Equal.sym(M.CmBlock, b, P.sp.run(ops, P.sp.unrun(ops, b)), sp_run_unrun(ops, b))
1334
1335# A subtraction undoes an addition, for every word (TEA and XTEA)
1336
1337# BEGIN GENERATED by gen/proof.py: adc
1338def adc_add_sub(n: Nat, a: Word(n), b: Word(n), c: Bool) -> {a == Word.adc(n, Word.adc(n, a, b, False{}, c), b, True{}, Bool.not(c)) : Word(n)}:
1339  match n:
1340    case 0n:
1341      match a:
1342        case WNil{}:
1343          {==}
1344    case 1n+p:
1345      match a b c:
1346        case WCon{True{}, at} WCon{True{}, bt} True{}:
1347          %adc_add_sub(p, at, bt, True{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1348          {==}
1349        case WCon{True{}, at} WCon{True{}, bt} False{}:
1350          %adc_add_sub(p, at, bt, True{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1351          {==}
1352        case WCon{True{}, at} WCon{False{}, bt} True{}:
1353          %adc_add_sub(p, at, bt, True{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1354          {==}
1355        case WCon{True{}, at} WCon{False{}, bt} False{}:
1356          %adc_add_sub(p, at, bt, False{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1357          {==}
1358        case WCon{False{}, at} WCon{True{}, bt} True{}:
1359          %adc_add_sub(p, at, bt, True{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1360          {==}
1361        case WCon{False{}, at} WCon{True{}, bt} False{}:
1362          %adc_add_sub(p, at, bt, False{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1363          {==}
1364        case WCon{False{}, at} WCon{False{}, bt} True{}:
1365          %adc_add_sub(p, at, bt, False{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1366          {==}
1367        case WCon{False{}, at} WCon{False{}, bt} False{}:
1368          %adc_add_sub(p, at, bt, False{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1369          {==}
1370
1371def adc_sub_add(n: Nat, a: Word(n), b: Word(n), c: Bool) -> {a == Word.adc(n, Word.adc(n, a, b, True{}, c), b, False{}, Bool.not(c)) : Word(n)}:
1372  match n:
1373    case 0n:
1374      match a:
1375        case WNil{}:
1376          {==}
1377    case 1n+p:
1378      match a b c:
1379        case WCon{True{}, at} WCon{True{}, bt} True{}:
1380          %adc_sub_add(p, at, bt, True{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1381          {==}
1382        case WCon{True{}, at} WCon{True{}, bt} False{}:
1383          %adc_sub_add(p, at, bt, False{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1384          {==}
1385        case WCon{True{}, at} WCon{False{}, bt} True{}:
1386          %adc_sub_add(p, at, bt, True{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1387          {==}
1388        case WCon{True{}, at} WCon{False{}, bt} False{}:
1389          %adc_sub_add(p, at, bt, True{}) : {WCon{True{}, at} == WCon{True{}, _} : Word(1n+p)}
1390          {==}
1391        case WCon{False{}, at} WCon{True{}, bt} True{}:
1392          %adc_sub_add(p, at, bt, False{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1393          {==}
1394        case WCon{False{}, at} WCon{True{}, bt} False{}:
1395          %adc_sub_add(p, at, bt, False{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1396          {==}
1397        case WCon{False{}, at} WCon{False{}, bt} True{}:
1398          %adc_sub_add(p, at, bt, True{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1399          {==}
1400        case WCon{False{}, at} WCon{False{}, bt} False{}:
1401          %adc_sub_add(p, at, bt, False{}) : {WCon{False{}, at} == WCon{False{}, _} : Word(1n+p)}
1402          {==}
1403
1404def u32_add_sub(a: U32, b: U32) -> {a == U32.sub(U32.add(a, b), b) : U32}:
1405  match a b:
1406    case U32{x} U32{y}:
1407      %adc_add_sub(32n, x, y, False{}) : {U32{x} == U32{_} : U32}
1408      {==}
1409
1410def u32_sub_add(a: U32, b: U32) -> {a == U32.add(U32.sub(a, b), b) : U32}:
1411  match a b:
1412    case U32{x} U32{y}:
1413      %adc_sub_add(32n, x, y, True{}) : {U32{x} == U32{_} : U32}
1414      {==}
1415# END GENERATED: adc
1416
1417# Feistel rounds over any round function (legacy-ciphers.bend's lc.fe, for
1418# CAST-128 and FCrypt): a round is undone whatever f is, so a list of rounds
1419# is undone by its rounds undone in reverse order
1420
1421def fe_unstep_step(~RK: Data, ~f: RK -> U32 -> U32, +k: RK, b: L.LcBlock64) -> {b == L.lc.fe.unstep(~RK, ~f, k, L.lc.fe.step(~RK, ~f, k, b)) : L.LcBlock64}:
1422  match b:
1423    case L.LcBlock64{l, +r}:
1424      %u32_xx(l, f(k, r)) : {L.LcBlock64{l, r} == L.LcBlock64{_, r} : L.LcBlock64}
1425      {==}
1426
1427def fe_step_unstep(~RK: Data, ~f: RK -> U32 -> U32, +k: RK, b: L.LcBlock64) -> {b == L.lc.fe.step(~RK, ~f, k, L.lc.fe.unstep(~RK, ~f, k, b)) : L.LcBlock64}:
1428  match b:
1429    case L.LcBlock64{+l, r}:
1430      %u32_xx(r, f(k, l)) : {L.LcBlock64{l, r} == L.LcBlock64{l, _} : L.LcBlock64}
1431      {==}
1432
1433def fe_unrun_run(~RK: Data, ~f: RK -> U32 -> U32, ks: List<&2, RK>, +b: L.LcBlock64) -> {b == L.lc.fe.unrun(~RK, ~f, ks, L.lc.fe.run(~RK, ~f, ks, b)) : L.LcBlock64}:
1434  match ks:
1435    case Nil{}:
1436      {==}
1437    case Con{+k, +t}:
1438      %fe_unrun_run(~RK, ~f, t, L.lc.fe.step(~RK, ~f, k, b)) : {b == L.lc.fe.unstep(~RK, ~f, k, _) : L.LcBlock64}
1439      fe_unstep_step(~RK, ~f, k, b)
1440
1441def fe_run_unrun(~RK: Data, ~f: RK -> U32 -> U32, ks: List<&2, RK>, +b: L.LcBlock64) -> {b == L.lc.fe.run(~RK, ~f, ks, L.lc.fe.unrun(~RK, ~f, ks, b)) : L.LcBlock64}:
1442  match ks:
1443    case Nil{}:
1444      {==}
1445    case Con{+k, +t}:
1446      %fe_step_unstep(~RK, ~f, k, L.lc.fe.unrun(~RK, ~f, t, b)) : {b == L.lc.fe.run(~RK, ~f, t, _) : L.LcBlock64}
1447      fe_run_unrun(~RK, ~f, t, b)
1448
1449def swap2(b: L.LcBlock64) -> {b == L.lc.swap(L.lc.swap(b)) : L.LcBlock64}:
1450  match b:
1451    case L.LcBlock64{h, l}:
1452      {==}
1453
1454# FCrypt: its rounds, undone
1455
1456def Laws.fcrypt_round_trip(k, b):
1457  match k:
1458    case FC.LcFcryptKey{+rks}:
1459      Equal.sym(L.LcBlock64, b, L.lc.fe.unrun(~FC.LcFcRk, ~FC.fc.f, rks, L.lc.fe.run(~FC.LcFcRk, ~FC.fc.f, rks, b)), fe_unrun_run(~FC.LcFcRk, ~FC.fc.f, rks, b))
1460
1461def Laws.fcrypt_round_trip_dual(k, b):
1462  match k:
1463    case FC.LcFcryptKey{+rks}:
1464      Equal.sym(L.LcBlock64, b, L.lc.fe.run(~FC.LcFcRk, ~FC.fc.f, rks, L.lc.fe.unrun(~FC.LcFcRk, ~FC.fc.f, rks, b)), fe_run_unrun(~FC.LcFcRk, ~FC.fc.f, rks, b))
1465
1466# CAST-128: its rounds, then the exchange of the halves, undone
1467
1468def Laws.cast5_round_trip(k, b):
1469  match k:
1470    case C5.LcCast5Key{+rks}:
1471      %swap2(L.lc.fe.run(~C5.LcCast5Rk, ~C5.cast5.f, rks, b)) : {L.lc.fe.unrun(~C5.LcCast5Rk, ~C5.cast5.f, rks, _) == b : L.LcBlock64}
1472      Equal.sym(L.LcBlock64, b, L.lc.fe.unrun(~C5.LcCast5Rk, ~C5.cast5.f, rks, L.lc.fe.run(~C5.LcCast5Rk, ~C5.cast5.f, rks, b)), fe_unrun_run(~C5.LcCast5Rk, ~C5.cast5.f, rks, b))
1473
1474def Laws.cast5_round_trip_dual(k, b):
1475  match k:
1476    case C5.LcCast5Key{+rks}:
1477      %fe_run_unrun(~C5.LcCast5Rk, ~C5.cast5.f, rks, L.lc.swap(b)) : {L.lc.swap(_) == b : L.LcBlock64}
1478      Equal.sym(L.LcBlock64, b, L.lc.swap(L.lc.swap(b)), swap2(b))
1479
1480# TEA and XTEA: each step adds a function of one half to the other, undone
1481# by subtracting it (the "adc" lemmas below); the byte swaps undone by
1482# themselves
1483
1484def tea_unop_op(o: TE.LcTeaOp, b: L.LcBlock64) -> {b == TE.tea.unop(o, TE.tea.op(o, b)) : L.LcBlock64}:
1485  match o:
1486    case TE.LcTeaY{+s, +ka, +kb}:
1487      match b:
1488        case L.LcBlock64{y, +z}:
1489          %u32_add_sub(y, TE.tea.g(z, s, ka, kb)) : {L.LcBlock64{y, z} == L.LcBlock64{_, z} : L.LcBlock64}
1490          {==}
1491    case TE.LcTeaZ{+s, +ka, +kb}:
1492      match b:
1493        case L.LcBlock64{+y, z}:
1494          %u32_add_sub(z, TE.tea.g(y, s, ka, kb)) : {L.LcBlock64{y, z} == L.LcBlock64{y, _} : L.LcBlock64}
1495          {==}
1496    case TE.LcXteaY{+c}:
1497      match b:
1498        case L.LcBlock64{y, +z}:
1499          %u32_add_sub(y, TE.xtea.g(z, c)) : {L.LcBlock64{y, z} == L.LcBlock64{_, z} : L.LcBlock64}
1500          {==}
1501    case TE.LcXteaZ{+c}:
1502      match b:
1503        case L.LcBlock64{+y, z}:
1504          %u32_add_sub(z, TE.xtea.g(y, c)) : {L.LcBlock64{y, z} == L.LcBlock64{y, _} : L.LcBlock64}
1505          {==}
1506    case TE.LcTeaBswap{}:
1507      match b:
1508        case L.LcBlock64{+y, +z}:
1509          %bswap2(y) : {L.LcBlock64{y, z} == L.LcBlock64{_, L.lc.bswap.bits(L.lc.bswap.bits(z))} : L.LcBlock64}
1510          %bswap2(z) : {L.LcBlock64{y, z} == L.LcBlock64{y, _} : L.LcBlock64}
1511          {==}
1512
1513def tea_op_unop(o: TE.LcTeaOp, b: L.LcBlock64) -> {b == TE.tea.op(o, TE.tea.unop(o, b)) : L.LcBlock64}:
1514  match o:
1515    case TE.LcTeaY{+s, +ka, +kb}:
1516      match b:
1517        case L.LcBlock64{y, +z}:
1518          %u32_sub_add(y, TE.tea.g(z, s, ka, kb)) : {L.LcBlock64{y, z} == L.LcBlock64{_, z} : L.LcBlock64}
1519          {==}
1520    case TE.LcTeaZ{+s, +ka, +kb}:
1521      match b:
1522        case L.LcBlock64{+y, z}:
1523          %u32_sub_add(z, TE.tea.g(y, s, ka, kb)) : {L.LcBlock64{y, z} == L.LcBlock64{y, _} : L.LcBlock64}
1524          {==}
1525    case TE.LcXteaY{+c}:
1526      match b:
1527        case L.LcBlock64{y, +z}:
1528          %u32_sub_add(y, TE.xtea.g(z, c)) : {L.LcBlock64{y, z} == L.LcBlock64{_, z} : L.LcBlock64}
1529          {==}
1530    case TE.LcXteaZ{+c}:
1531      match b:
1532        case L.LcBlock64{+y, z}:
1533          %u32_sub_add(z, TE.xtea.g(y, c)) : {L.LcBlock64{y, z} == L.LcBlock64{y, _} : L.LcBlock64}
1534          {==}
1535    case TE.LcTeaBswap{}:
1536      match b:
1537        case L.LcBlock64{+y, +z}:
1538          %bswap2(y) : {L.LcBlock64{y, z} == L.LcBlock64{_, L.lc.bswap.bits(L.lc.bswap.bits(z))} : L.LcBlock64}
1539          %bswap2(z) : {L.LcBlock64{y, z} == L.LcBlock64{y, _} : L.LcBlock64}
1540          {==}
1541
1542def tea_unrun_run(os: List<&2, TE.LcTeaOp>, +b: L.LcBlock64) -> {b == TE.tea.unrun(os, TE.tea.run(os, b)) : L.LcBlock64}:
1543  match os:
1544    case Nil{}:
1545      {==}
1546    case Con{+o, +t}:
1547      %tea_unrun_run(t, TE.tea.op(o, b)) : {b == TE.tea.unop(o, _) : L.LcBlock64}
1548      tea_unop_op(o, b)
1549
1550def tea_run_unrun(os: List<&2, TE.LcTeaOp>, +b: L.LcBlock64) -> {b == TE.tea.run(os, TE.tea.unrun(os, b)) : L.LcBlock64}:
1551  match os:
1552    case Nil{}:
1553      {==}
1554    case Con{+o, +t}:
1555      %tea_op_unop(o, TE.tea.unrun(t, b)) : {b == TE.tea.run(t, _) : L.LcBlock64}
1556      tea_run_unrun(t, b)
1557
1558def Laws.tea_round_trip(k, b):
1559  match k:
1560    case TE.LcTeaKey{+ops}:
1561      Equal.sym(L.LcBlock64, b, TE.tea.unrun(ops, TE.tea.run(ops, b)), tea_unrun_run(ops, b))
1562
1563def Laws.tea_round_trip_dual(k, b):
1564  match k:
1565    case TE.LcTeaKey{+ops}:
1566      Equal.sym(L.LcBlock64, b, TE.tea.run(ops, TE.tea.unrun(ops, b)), tea_run_unrun(ops, b))
1567
1568def Laws.xtea_round_trip(k, b):
1569  match k:
1570    case XT.LcXteaKey{+ops}:
1571      Equal.sym(L.LcBlock64, b, TE.tea.unrun(ops, TE.tea.run(ops, b)), tea_unrun_run(ops, b))
1572
1573def Laws.xtea_round_trip_dual(k, b):
1574  match k:
1575    case XT.LcXteaKey{+ops}:
1576      Equal.sym(L.LcBlock64, b, TE.tea.run(ops, TE.tea.unrun(ops, b)), tea_run_unrun(ops, b))
1577
1578# Blowfish: a round and the final step, each undone by XOR whatever F is
1579
1580def bf_unop_op(o: BF.LcBfOp, b: L.LcBlock64) -> {b == BF.bf.unop(o, BF.bf.op(o, b)) : L.LcBlock64}:
1581  match o:
1582    case BF.LcBfRound{+p, +t}:
1583      match b:
1584        case L.LcBlock64{+l, +r}:
1585          %u32_xx(l, p) : {L.LcBlock64{l, r} == L.LcBlock64{_, U32.xor(U32.xor(r, BF.bf.f(t, U32.xor(l, p))), BF.bf.f(t, U32.xor(l, p)))} : L.LcBlock64}
1586          %u32_xx(r, BF.bf.f(t, U32.xor(l, p))) : {L.LcBlock64{l, r} == L.LcBlock64{l, _} : L.LcBlock64}
1587          {==}
1588    case BF.LcBfFinal{+p17, +p18}:
1589      match b:
1590        case L.LcBlock64{+l, +r}:
1591          %u32_xx(l, p17) : {L.LcBlock64{l, r} == L.LcBlock64{_, U32.xor(U32.xor(r, p18), p18)} : L.LcBlock64}
1592          %u32_xx(r, p18) : {L.LcBlock64{l, r} == L.LcBlock64{l, _} : L.LcBlock64}
1593          {==}
1594
1595def bf_op_unop(o: BF.LcBfOp, b: L.LcBlock64) -> {b == BF.bf.op(o, BF.bf.unop(o, b)) : L.LcBlock64}:
1596  match o:
1597    case BF.LcBfRound{+p, +t}:
1598      match b:
1599        case L.LcBlock64{+x, +y}:
1600          %u32_xx(y, p) : {L.LcBlock64{x, y} == L.LcBlock64{U32.xor(U32.xor(x, BF.bf.f(t, y)), BF.bf.f(t, _)), _} : L.LcBlock64}
1601          %u32_xx(x, BF.bf.f(t, y)) : {L.LcBlock64{x, y} == L.LcBlock64{_, y} : L.LcBlock64}
1602          {==}
1603    case BF.LcBfFinal{+p17, +p18}:
1604      match b:
1605        case L.LcBlock64{+x, +y}:
1606          %u32_xx(x, p18) : {L.LcBlock64{x, y} == L.LcBlock64{_, U32.xor(U32.xor(y, p17), p17)} : L.LcBlock64}
1607          %u32_xx(y, p17) : {L.LcBlock64{x, y} == L.LcBlock64{x, _} : L.LcBlock64}
1608          {==}
1609
1610def bf_unrun_run(os: List<&2, BF.LcBfOp>, +b: L.LcBlock64) -> {b == BF.bf.unrun(os, BF.bf.run(os, b)) : L.LcBlock64}:
1611  match os:
1612    case Nil{}:
1613      {==}
1614    case Con{+o, +t}:
1615      %bf_unrun_run(t, BF.bf.op(o, b)) : {b == BF.bf.unop(o, _) : L.LcBlock64}
1616      bf_unop_op(o, b)
1617
1618def bf_run_unrun(os: List<&2, BF.LcBfOp>, +b: L.LcBlock64) -> {b == BF.bf.run(os, BF.bf.unrun(os, b)) : L.LcBlock64}:
1619  match os:
1620    case Nil{}:
1621      {==}
1622    case Con{+o, +t}:
1623      %bf_op_unop(o, BF.bf.unrun(t, b)) : {b == BF.bf.run(t, _) : L.LcBlock64}
1624      bf_run_unrun(t, b)
1625
1626def Laws.blowfish_round_trip(k, b):
1627  match k:
1628    case BF.LcBlowfishKey{+ops}:
1629      Equal.sym(L.LcBlock64, b, BF.bf.unrun(ops, BF.bf.run(ops, b)), bf_unrun_run(ops, b))
1630
1631def Laws.blowfish_round_trip_dual(k, b):
1632  match k:
1633    case BF.LcBlowfishKey{+ops}:
1634      Equal.sym(L.LcBlock64, b, BF.bf.run(ops, BF.bf.unrun(ops, b)), bf_run_unrun(ops, b))
1635
1636# CAST-256: each step of a quad-round is undone by itself, so QBAR undoes Q
1637# and Q undoes QBAR
1638
1639def c6_sc2(k: C6.LcCast6Ks, s: M.CmBlock) -> {s == C6.c6.sc(k, C6.c6.sc(k, s)) : M.CmBlock}:
1640  match k:
1641    case C6.LcCast6Ks{+m0, +m1, +m2, +m3, +r0, +r1, +r2, +r3, +t}:
1642      match s:
1643        case M.CmBlock{a, b, c, +d}:
1644          %u32_xx(c, C5.cast.f(C5.LcCastF1{}, t, d, m0, r0)) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, _, d} : M.CmBlock}
1645          {==}
1646
1647def c6_sb2(k: C6.LcCast6Ks, s: M.CmBlock) -> {s == C6.c6.sb(k, C6.c6.sb(k, s)) : M.CmBlock}:
1648  match k:
1649    case C6.LcCast6Ks{+m0, +m1, +m2, +m3, +r0, +r1, +r2, +r3, +t}:
1650      match s:
1651        case M.CmBlock{a, b, +c, d}:
1652          %u32_xx(b, C5.cast.f(C5.LcCastF2{}, t, c, m1, r1)) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, _, c, d} : M.CmBlock}
1653          {==}
1654
1655def c6_sa2(k: C6.LcCast6Ks, s: M.CmBlock) -> {s == C6.c6.sa(k, C6.c6.sa(k, s)) : M.CmBlock}:
1656  match k:
1657    case C6.LcCast6Ks{+m0, +m1, +m2, +m3, +r0, +r1, +r2, +r3, +t}:
1658      match s:
1659        case M.CmBlock{a, +b, c, d}:
1660          %u32_xx(a, C5.cast.f(C5.LcCastF3{}, t, b, m2, r2)) : {M.CmBlock{a, b, c, d} == M.CmBlock{_, b, c, d} : M.CmBlock}
1661          {==}
1662
1663def c6_sd2(k: C6.LcCast6Ks, s: M.CmBlock) -> {s == C6.c6.sd(k, C6.c6.sd(k, s)) : M.CmBlock}:
1664  match k:
1665    case C6.LcCast6Ks{+m0, +m1, +m2, +m3, +r0, +r1, +r2, +r3, +t}:
1666      match s:
1667        case M.CmBlock{+a, b, c, d}:
1668          %u32_xx(d, C5.cast.f(C5.LcCastF1{}, t, a, m3, r3)) : {M.CmBlock{a, b, c, d} == M.CmBlock{a, b, c, _} : M.CmBlock}
1669          {==}
1670
1671def c6_qq(+k: C6.LcCast6Ks, +s: M.CmBlock) -> {s == C6.c6.qbar(k, C6.c6.q(k, s)) : M.CmBlock}:
1672  %c6_sd2(k, C6.c6.sa(k, C6.c6.sb(k, C6.c6.sc(k, s)))) : {s == C6.c6.sc(k, C6.c6.sb(k, C6.c6.sa(k, _))) : M.CmBlock}
1673  %c6_sa2(k, C6.c6.sb(k, C6.c6.sc(k, s))) : {s == C6.c6.sc(k, C6.c6.sb(k, _)) : M.CmBlock}
1674  %c6_sb2(k, C6.c6.sc(k, s)) : {s == C6.c6.sc(k, _) : M.CmBlock}
1675  c6_sc2(k, s)
1676
1677def c6_qbq(+k: C6.LcCast6Ks, +s: M.CmBlock) -> {s == C6.c6.q(k, C6.c6.qbar(k, s)) : M.CmBlock}:
1678  %c6_sc2(k, C6.c6.sb(k, C6.c6.sa(k, C6.c6.sd(k, s)))) : {s == C6.c6.sd(k, C6.c6.sa(k, C6.c6.sb(k, _))) : M.CmBlock}
1679  %c6_sb2(k, C6.c6.sa(k, C6.c6.sd(k, s))) : {s == C6.c6.sd(k, C6.c6.sa(k, _)) : M.CmBlock}
1680  %c6_sa2(k, C6.c6.sd(k, s)) : {s == C6.c6.sd(k, _) : M.CmBlock}
1681  c6_sd2(k, s)
1682
1683def c6_unop_op(o: C6.LcCast6Op, +s: M.CmBlock) -> {s == C6.c6.unop(o, C6.c6.op(o, s)) : M.CmBlock}:
1684  match o:
1685    case C6.LcCast6Op{fwd, +k}:
1686      match fwd:
1687        case True{}:
1688          c6_qq(k, s)
1689        case False{}:
1690          c6_qbq(k, s)
1691
1692def c6_op_unop(o: C6.LcCast6Op, +s: M.CmBlock) -> {s == C6.c6.op(o, C6.c6.unop(o, s)) : M.CmBlock}:
1693  match o:
1694    case C6.LcCast6Op{fwd, +k}:
1695      match fwd:
1696        case True{}:
1697          c6_qbq(k, s)
1698        case False{}:
1699          c6_qq(k, s)
1700
1701def c6_unrun_run(os: List<&2, C6.LcCast6Op>, +s: M.CmBlock) -> {s == C6.c6.unrun(os, C6.c6.run(os, s)) : M.CmBlock}:
1702  match os:
1703    case Nil{}:
1704      {==}
1705    case Con{+o, +t}:
1706      %c6_unrun_run(t, C6.c6.op(o, s)) : {s == C6.c6.unop(o, _) : M.CmBlock}
1707      c6_unop_op(o, s)
1708
1709def c6_run_unrun(os: List<&2, C6.LcCast6Op>, +s: M.CmBlock) -> {s == C6.c6.run(os, C6.c6.unrun(os, s)) : M.CmBlock}:
1710  match os:
1711    case Nil{}:
1712      {==}
1713    case Con{+o, +t}:
1714      %c6_op_unop(o, C6.c6.unrun(t, s)) : {s == C6.c6.run(t, _) : M.CmBlock}
1715      c6_run_unrun(t, s)
1716
1717def Laws.cast6_round_trip(k, b):
1718  match k:
1719    case C6.LcCast6Key{+ops}:
1720      Equal.sym(M.CmBlock, b, C6.c6.unrun(ops, C6.c6.run(ops, b)), c6_unrun_run(ops, b))
1721
1722def Laws.cast6_round_trip_dual(k, b):
1723  match k:
1724    case C6.LcCast6Key{+ops}:
1725      Equal.sym(M.CmBlock, b, C6.c6.run(ops, C6.c6.unrun(ops, b)), c6_run_unrun(ops, b))
1726
1727# ARIA: each step of the cipher undone (the "aria" lemmas below), so the
1728# list of steps is; and a block survives its bytes
1729
1730# BEGIN GENERATED by gen/proof.py: aria
1731# each S-box and its inverse undo each other on every byte
1732def aria_sb31(w0: Word(8n)) -> {w0 == A.aria.sb3(A.aria.sb1(w0)) : Word(8n)}:
1733  match w0:
1734    case WCon{False{}, w1}:
1735      match w1:
1736        case WCon{False{}, w2}:
1737          match w2:
1738            case WCon{False{}, w3}:
1739              match w3:
1740                case WCon{False{}, w4}:
1741                  match w4:
1742                    case WCon{False{}, w5}:
1743                      match w5:
1744                        case WCon{False{}, w6}:
1745                          match w6:
1746                            case WCon{False{}, w7}:
1747                              match w7:
1748                                case WCon{False{}, w8}:
1749                                  match w8:
1750                                    case WNil{}:
1751                                      {==}
1752                                case WCon{True{}, w8}:
1753                                  match w8:
1754                                    case WNil{}:
1755                                      {==}
1756                            case WCon{True{}, w7}:
1757                              match w7:
1758                                case WCon{False{}, w8}:
1759                                  match w8:
1760                                    case WNil{}:
1761                                      {==}
1762                                case WCon{True{}, w8}:
1763                                  match w8:
1764                                    case WNil{}:
1765                                      {==}
1766                        case WCon{True{}, w6}:
1767                          match w6:
1768                            case WCon{False{}, w7}:
1769                              match w7:
1770                                case WCon{False{}, w8}:
1771                                  match w8:
1772                                    case WNil{}:
1773                                      {==}
1774                                case WCon{True{}, w8}:
1775                                  match w8:
1776                                    case WNil{}:
1777                                      {==}
1778                            case WCon{True{}, w7}:
1779                              match w7:
1780                                case WCon{False{}, w8}:
1781                                  match w8:
1782                                    case WNil{}:
1783                                      {==}
1784                                case WCon{True{}, w8}:
1785                                  match w8:
1786                                    case WNil{}:
1787                                      {==}
1788                    case WCon{True{}, w5}:
1789                      match w5:
1790                        case WCon{False{}, w6}:
1791                          match w6:
1792                            case WCon{False{}, w7}:
1793                              match w7:
1794                                case WCon{False{}, w8}:
1795                                  match w8:
1796                                    case WNil{}:
1797                                      {==}
1798                                case WCon{True{}, w8}:
1799                                  match w8:
1800                                    case WNil{}:
1801                                      {==}
1802                            case WCon{True{}, w7}:
1803                              match w7:
1804                                case WCon{False{}, w8}:
1805                                  match w8:
1806                                    case WNil{}:
1807                                      {==}
1808                                case WCon{True{}, w8}:
1809                                  match w8:
1810                                    case WNil{}:
1811                                      {==}
1812                        case WCon{True{}, w6}:
1813                          match w6:
1814                            case WCon{False{}, w7}:
1815                              match w7:
1816                                case WCon{False{}, w8}:
1817                                  match w8:
1818                                    case WNil{}:
1819                                      {==}
1820                                case WCon{True{}, w8}:
1821                                  match w8:
1822                                    case WNil{}:
1823                                      {==}
1824                            case WCon{True{}, w7}:
1825                              match w7:
1826                                case WCon{False{}, w8}:
1827                                  match w8:
1828                                    case WNil{}:
1829                                      {==}
1830                                case WCon{True{}, w8}:
1831                                  match w8:
1832                                    case WNil{}:
1833                                      {==}
1834                case WCon{True{}, w4}:
1835                  match w4:
1836                    case WCon{False{}, w5}:
1837                      match w5:
1838                        case WCon{False{}, w6}:
1839                          match w6:
1840                            case WCon{False{}, w7}:
1841                              match w7:
1842                                case WCon{False{}, w8}:
1843                                  match w8:
1844                                    case WNil{}:
1845                                      {==}
1846                                case WCon{True{}, w8}:
1847                                  match w8:
1848                                    case WNil{}:
1849                                      {==}
1850                            case WCon{True{}, w7}:
1851                              match w7:
1852                                case WCon{False{}, w8}:
1853                                  match w8:
1854                                    case WNil{}:
1855                                      {==}
1856                                case WCon{True{}, w8}:
1857                                  match w8:
1858                                    case WNil{}:
1859                                      {==}
1860                        case WCon{True{}, w6}:
1861                          match w6:
1862                            case WCon{False{}, w7}:
1863                              match w7:
1864                                case WCon{False{}, w8}:
1865                                  match w8:
1866                                    case WNil{}:
1867                                      {==}
1868                                case WCon{True{}, w8}:
1869                                  match w8:
1870                                    case WNil{}:
1871                                      {==}
1872                            case WCon{True{}, w7}:
1873                              match w7:
1874                                case WCon{False{}, w8}:
1875                                  match w8:
1876                                    case WNil{}:
1877                                      {==}
1878                                case WCon{True{}, w8}:
1879                                  match w8:
1880                                    case WNil{}:
1881                                      {==}
1882                    case WCon{True{}, w5}:
1883                      match w5:
1884                        case WCon{False{}, w6}:
1885                          match w6:
1886                            case WCon{False{}, w7}:
1887                              match w7:
1888                                case WCon{False{}, w8}:
1889                                  match w8:
1890                                    case WNil{}:
1891                                      {==}
1892                                case WCon{True{}, w8}:
1893                                  match w8:
1894                                    case WNil{}:
1895                                      {==}
1896                            case WCon{True{}, w7}:
1897                              match w7:
1898                                case WCon{False{}, w8}:
1899                                  match w8:
1900                                    case WNil{}:
1901                                      {==}
1902                                case WCon{True{}, w8}:
1903                                  match w8:
1904                                    case WNil{}:
1905                                      {==}
1906                        case WCon{True{}, w6}:
1907                          match w6:
1908                            case WCon{False{}, w7}:
1909                              match w7:
1910                                case WCon{False{}, w8}:
1911                                  match w8:
1912                                    case WNil{}:
1913                                      {==}
1914                                case WCon{True{}, w8}:
1915                                  match w8:
1916                                    case WNil{}:
1917                                      {==}
1918                            case WCon{True{}, w7}:
1919                              match w7:
1920                                case WCon{False{}, w8}:
1921                                  match w8:
1922                                    case WNil{}:
1923                                      {==}
1924                                case WCon{True{}, w8}:
1925                                  match w8:
1926                                    case WNil{}:
1927                                      {==}
1928            case WCon{True{}, w3}:
1929              match w3:
1930                case WCon{False{}, w4}:
1931                  match w4:
1932                    case WCon{False{}, w5}:
1933                      match w5:
1934                        case WCon{False{}, w6}:
1935                          match w6:
1936                            case WCon{False{}, w7}:
1937                              match w7:
1938                                case WCon{False{}, w8}:
1939                                  match w8:
1940                                    case WNil{}:
1941                                      {==}
1942                                case WCon{True{}, w8}:
1943                                  match w8:
1944                                    case WNil{}:
1945                                      {==}
1946                            case WCon{True{}, w7}:
1947                              match w7:
1948                                case WCon{False{}, w8}:
1949                                  match w8:
1950                                    case WNil{}:
1951                                      {==}
1952                                case WCon{True{}, w8}:
1953                                  match w8:
1954                                    case WNil{}:
1955                                      {==}
1956                        case WCon{True{}, w6}:
1957                          match w6:
1958                            case WCon{False{}, w7}:
1959                              match w7:
1960                                case WCon{False{}, w8}:
1961                                  match w8:
1962                                    case WNil{}:
1963                                      {==}
1964                                case WCon{True{}, w8}:
1965                                  match w8:
1966                                    case WNil{}:
1967                                      {==}
1968                            case WCon{True{}, w7}:
1969                              match w7:
1970                                case WCon{False{}, w8}:
1971                                  match w8:
1972                                    case WNil{}:
1973                                      {==}
1974                                case WCon{True{}, w8}:
1975                                  match w8:
1976                                    case WNil{}:
1977                                      {==}
1978                    case WCon{True{}, w5}:
1979                      match w5:
1980                        case WCon{False{}, w6}:
1981                          match w6:
1982                            case WCon{False{}, w7}:
1983                              match w7:
1984                                case WCon{False{}, w8}:
1985                                  match w8:
1986                                    case WNil{}:
1987                                      {==}
1988                                case WCon{True{}, w8}:
1989                                  match w8:
1990                                    case WNil{}:
1991                                      {==}
1992                            case WCon{True{}, w7}:
1993                              match w7:
1994                                case WCon{False{}, w8}:
1995                                  match w8:
1996                                    case WNil{}:
1997                                      {==}
1998                                case WCon{True{}, w8}:
1999                                  match w8:
2000                                    case WNil{}:
2001                                      {==}
2002                        case WCon{True{}, w6}:
2003                          match w6:
2004                            case WCon{False{}, w7}:
2005                              match w7:
2006                                case WCon{False{}, w8}:
2007                                  match w8:
2008                                    case WNil{}:
2009                                      {==}
2010                                case WCon{True{}, w8}:
2011                                  match w8:
2012                                    case WNil{}:
2013                                      {==}
2014                            case WCon{True{}, w7}:
2015                              match w7:
2016                                case WCon{False{}, w8}:
2017                                  match w8:
2018                                    case WNil{}:
2019                                      {==}
2020                                case WCon{True{}, w8}:
2021                                  match w8:
2022                                    case WNil{}:
2023                                      {==}
2024                case WCon{True{}, w4}:
2025                  match w4:
2026                    case WCon{False{}, w5}:
2027                      match w5:
2028                        case WCon{False{}, w6}:
2029                          match w6:
2030                            case WCon{False{}, w7}:
2031                              match w7:
2032                                case WCon{False{}, w8}:
2033                                  match w8:
2034                                    case WNil{}:
2035                                      {==}
2036                                case WCon{True{}, w8}:
2037                                  match w8:
2038                                    case WNil{}:
2039                                      {==}
2040                            case WCon{True{}, w7}:
2041                              match w7:
2042                                case WCon{False{}, w8}:
2043                                  match w8:
2044                                    case WNil{}:
2045                                      {==}
2046                                case WCon{True{}, w8}:
2047                                  match w8:
2048                                    case WNil{}:
2049                                      {==}
2050                        case WCon{True{}, w6}:
2051                          match w6:
2052                            case WCon{False{}, w7}:
2053                              match w7:
2054                                case WCon{False{}, w8}:
2055                                  match w8:
2056                                    case WNil{}:
2057                                      {==}
2058                                case WCon{True{}, w8}:
2059                                  match w8:
2060                                    case WNil{}:
2061                                      {==}
2062                            case WCon{True{}, w7}:
2063                              match w7:
2064                                case WCon{False{}, w8}:
2065                                  match w8:
2066                                    case WNil{}:
2067                                      {==}
2068                                case WCon{True{}, w8}:
2069                                  match w8:
2070                                    case WNil{}:
2071                                      {==}
2072                    case WCon{True{}, w5}:
2073                      match w5:
2074                        case WCon{False{}, w6}:
2075                          match w6:
2076                            case WCon{False{}, w7}:
2077                              match w7:
2078                                case WCon{False{}, w8}:
2079                                  match w8:
2080                                    case WNil{}:
2081                                      {==}
2082                                case WCon{True{}, w8}:
2083                                  match w8:
2084                                    case WNil{}:
2085                                      {==}
2086                            case WCon{True{}, w7}:
2087                              match w7:
2088                                case WCon{False{}, w8}:
2089                                  match w8:
2090                                    case WNil{}:
2091                                      {==}
2092                                case WCon{True{}, w8}:
2093                                  match w8:
2094                                    case WNil{}:
2095                                      {==}
2096                        case WCon{True{}, w6}:
2097                          match w6:
2098                            case WCon{False{}, w7}:
2099                              match w7:
2100                                case WCon{False{}, w8}:
2101                                  match w8:
2102                                    case WNil{}:
2103                                      {==}
2104                                case WCon{True{}, w8}:
2105                                  match w8:
2106                                    case WNil{}:
2107                                      {==}
2108                            case WCon{True{}, w7}:
2109                              match w7:
2110                                case WCon{False{}, w8}:
2111                                  match w8:
2112                                    case WNil{}:
2113                                      {==}
2114                                case WCon{True{}, w8}:
2115                                  match w8:
2116                                    case WNil{}:
2117                                      {==}
2118        case WCon{True{}, w2}:
2119          match w2:
2120            case WCon{False{}, w3}:
2121              match w3:
2122                case WCon{False{}, w4}:
2123                  match w4:
2124                    case WCon{False{}, w5}:
2125                      match w5:
2126                        case WCon{False{}, w6}:
2127                          match w6:
2128                            case WCon{False{}, w7}:
2129                              match w7:
2130                                case WCon{False{}, w8}:
2131                                  match w8:
2132                                    case WNil{}:
2133                                      {==}
2134                                case WCon{True{}, w8}:
2135                                  match w8:
2136                                    case WNil{}:
2137                                      {==}
2138                            case WCon{True{}, w7}:
2139                              match w7:
2140                                case WCon{False{}, w8}:
2141                                  match w8:
2142                                    case WNil{}:
2143                                      {==}
2144                                case WCon{True{}, w8}:
2145                                  match w8:
2146                                    case WNil{}:
2147                                      {==}
2148                        case WCon{True{}, w6}:
2149                          match w6:
2150                            case WCon{False{}, w7}:
2151                              match w7:
2152                                case WCon{False{}, w8}:
2153                                  match w8:
2154                                    case WNil{}:
2155                                      {==}
2156                                case WCon{True{}, w8}:
2157                                  match w8:
2158                                    case WNil{}:
2159                                      {==}
2160                            case WCon{True{}, w7}:
2161                              match w7:
2162                                case WCon{False{}, w8}:
2163                                  match w8:
2164                                    case WNil{}:
2165                                      {==}
2166                                case WCon{True{}, w8}:
2167                                  match w8:
2168                                    case WNil{}:
2169                                      {==}
2170                    case WCon{True{}, w5}:
2171                      match w5:
2172                        case WCon{False{}, w6}:
2173                          match w6:
2174                            case WCon{False{}, w7}:
2175                              match w7:
2176                                case WCon{False{}, w8}:
2177                                  match w8:
2178                                    case WNil{}:
2179                                      {==}
2180                                case WCon{True{}, w8}:
2181                                  match w8:
2182                                    case WNil{}:
2183                                      {==}
2184                            case WCon{True{}, w7}:
2185                              match w7:
2186                                case WCon{False{}, w8}:
2187                                  match w8:
2188                                    case WNil{}:
2189                                      {==}
2190                                case WCon{True{}, w8}:
2191                                  match w8:
2192                                    case WNil{}:
2193                                      {==}
2194                        case WCon{True{}, w6}:
2195                          match w6:
2196                            case WCon{False{}, w7}:
2197                              match w7:
2198                                case WCon{False{}, w8}:
2199                                  match w8:
2200                                    case WNil{}:
2201                                      {==}
2202                                case WCon{True{}, w8}:
2203                                  match w8:
2204                                    case WNil{}:
2205                                      {==}
2206                            case WCon{True{}, w7}:
2207                              match w7:
2208                                case WCon{False{}, w8}:
2209                                  match w8:
2210                                    case WNil{}:
2211                                      {==}
2212                                case WCon{True{}, w8}:
2213                                  match w8:
2214                                    case WNil{}:
2215                                      {==}
2216                case WCon{True{}, w4}:
2217                  match w4:
2218                    case WCon{False{}, w5}:
2219                      match w5:
2220                        case WCon{False{}, w6}:
2221                          match w6:
2222                            case WCon{False{}, w7}:
2223                              match w7:
2224                                case WCon{False{}, w8}:
2225                                  match w8:
2226                                    case WNil{}:
2227                                      {==}
2228                                case WCon{True{}, w8}:
2229                                  match w8:
2230                                    case WNil{}:
2231                                      {==}
2232                            case WCon{True{}, w7}:
2233                              match w7:
2234                                case WCon{False{}, w8}:
2235                                  match w8:
2236                                    case WNil{}:
2237                                      {==}
2238                                case WCon{True{}, w8}:
2239                                  match w8:
2240                                    case WNil{}:
2241                                      {==}
2242                        case WCon{True{}, w6}:
2243                          match w6:
2244                            case WCon{False{}, w7}:
2245                              match w7:
2246                                case WCon{False{}, w8}:
2247                                  match w8:
2248                                    case WNil{}:
2249                                      {==}
2250                                case WCon{True{}, w8}:
2251                                  match w8:
2252                                    case WNil{}:
2253                                      {==}
2254                            case WCon{True{}, w7}:
2255                              match w7:
2256                                case WCon{False{}, w8}:
2257                                  match w8:
2258                                    case WNil{}:
2259                                      {==}
2260                                case WCon{True{}, w8}:
2261                                  match w8:
2262                                    case WNil{}:
2263                                      {==}
2264                    case WCon{True{}, w5}:
2265                      match w5:
2266                        case WCon{False{}, w6}:
2267                          match w6:
2268                            case WCon{False{}, w7}:
2269                              match w7:
2270                                case WCon{False{}, w8}:
2271                                  match w8:
2272                                    case WNil{}:
2273                                      {==}
2274                                case WCon{True{}, w8}:
2275                                  match w8:
2276                                    case WNil{}:
2277                                      {==}
2278                            case WCon{True{}, w7}:
2279                              match w7:
2280                                case WCon{False{}, w8}:
2281                                  match w8:
2282                                    case WNil{}:
2283                                      {==}
2284                                case WCon{True{}, w8}:
2285                                  match w8:
2286                                    case WNil{}:
2287                                      {==}
2288                        case WCon{True{}, w6}:
2289                          match w6:
2290                            case WCon{False{}, w7}:
2291                              match w7:
2292                                case WCon{False{}, w8}:
2293                                  match w8:
2294                                    case WNil{}:
2295                                      {==}
2296                                case WCon{True{}, w8}:
2297                                  match w8:
2298                                    case WNil{}:
2299                                      {==}
2300                            case WCon{True{}, w7}:
2301                              match w7:
2302                                case WCon{False{}, w8}:
2303                                  match w8:
2304                                    case WNil{}:
2305                                      {==}
2306                                case WCon{True{}, w8}:
2307                                  match w8:
2308                                    case WNil{}:
2309                                      {==}
2310            case WCon{True{}, w3}:
2311              match w3:
2312                case WCon{False{}, w4}:
2313                  match w4:
2314                    case WCon{False{}, w5}:
2315                      match w5:
2316                        case WCon{False{}, w6}:
2317                          match w6:
2318                            case WCon{False{}, w7}:
2319                              match w7:
2320                                case WCon{False{}, w8}:
2321                                  match w8:
2322                                    case WNil{}:
2323                                      {==}
2324                                case WCon{True{}, w8}:
2325                                  match w8:
2326                                    case WNil{}:
2327                                      {==}
2328                            case WCon{True{}, w7}:
2329                              match w7:
2330                                case WCon{False{}, w8}:
2331                                  match w8:
2332                                    case WNil{}:
2333                                      {==}
2334                                case WCon{True{}, w8}:
2335                                  match w8:
2336                                    case WNil{}:
2337                                      {==}
2338                        case WCon{True{}, w6}:
2339                          match w6:
2340                            case WCon{False{}, w7}:
2341                              match w7:
2342                                case WCon{False{}, w8}:
2343                                  match w8:
2344                                    case WNil{}:
2345                                      {==}
2346                                case WCon{True{}, w8}:
2347                                  match w8:
2348                                    case WNil{}:
2349                                      {==}
2350                            case WCon{True{}, w7}:
2351                              match w7:
2352                                case WCon{False{}, w8}:
2353                                  match w8:
2354                                    case WNil{}:
2355                                      {==}
2356                                case WCon{True{}, w8}:
2357                                  match w8:
2358                                    case WNil{}:
2359                                      {==}
2360                    case WCon{True{}, w5}:
2361                      match w5:
2362                        case WCon{False{}, w6}:
2363                          match w6:
2364                            case WCon{False{}, w7}:
2365                              match w7:
2366                                case WCon{False{}, w8}:
2367                                  match w8:
2368                                    case WNil{}:
2369                                      {==}
2370                                case WCon{True{}, w8}:
2371                                  match w8:
2372                                    case WNil{}:
2373                                      {==}
2374                            case WCon{True{}, w7}:
2375                              match w7:
2376                                case WCon{False{}, w8}:
2377                                  match w8:
2378                                    case WNil{}:
2379                                      {==}
2380                                case WCon{True{}, w8}:
2381                                  match w8:
2382                                    case WNil{}:
2383                                      {==}
2384                        case WCon{True{}, w6}:
2385                          match w6:
2386                            case WCon{False{}, w7}:
2387                              match w7:
2388                                case WCon{False{}, w8}:
2389                                  match w8:
2390                                    case WNil{}:
2391                                      {==}
2392                                case WCon{True{}, w8}:
2393                                  match w8:
2394                                    case WNil{}:
2395                                      {==}
2396                            case WCon{True{}, w7}:
2397                              match w7:
2398                                case WCon{False{}, w8}:
2399                                  match w8:
2400                                    case WNil{}:
2401                                      {==}
2402                                case WCon{True{}, w8}:
2403                                  match w8:
2404                                    case WNil{}:
2405                                      {==}
2406                case WCon{True{}, w4}:
2407                  match w4:
2408                    case WCon{False{}, w5}:
2409                      match w5:
2410                        case WCon{False{}, w6}:
2411                          match w6:
2412                            case WCon{False{}, w7}:
2413                              match w7:
2414                                case WCon{False{}, w8}:
2415                                  match w8:
2416                                    case WNil{}:
2417                                      {==}
2418                                case WCon{True{}, w8}:
2419                                  match w8:
2420                                    case WNil{}:
2421                                      {==}
2422                            case WCon{True{}, w7}:
2423                              match w7:
2424                                case WCon{False{}, w8}:
2425                                  match w8:
2426                                    case WNil{}:
2427                                      {==}
2428                                case WCon{True{}, w8}:
2429                                  match w8:
2430                                    case WNil{}:
2431                                      {==}
2432                        case WCon{True{}, w6}:
2433                          match w6:
2434                            case WCon{False{}, w7}:
2435                              match w7:
2436                                case WCon{False{}, w8}:
2437                                  match w8:
2438                                    case WNil{}:
2439                                      {==}
2440                                case WCon{True{}, w8}:
2441                                  match w8:
2442                                    case WNil{}:
2443                                      {==}
2444                            case WCon{True{}, w7}:
2445                              match w7:
2446                                case WCon{False{}, w8}:
2447                                  match w8:
2448                                    case WNil{}:
2449                                      {==}
2450                                case WCon{True{}, w8}:
2451                                  match w8:
2452                                    case WNil{}:
2453                                      {==}
2454                    case WCon{True{}, w5}:
2455                      match w5:
2456                        case WCon{False{}, w6}:
2457                          match w6:
2458                            case WCon{False{}, w7}:
2459                              match w7:
2460                                case WCon{False{}, w8}:
2461                                  match w8:
2462                                    case WNil{}:
2463                                      {==}
2464                                case WCon{True{}, w8}:
2465                                  match w8:
2466                                    case WNil{}:
2467                                      {==}
2468                            case WCon{True{}, w7}:
2469                              match w7:
2470                                case WCon{False{}, w8}:
2471                                  match w8:
2472                                    case WNil{}:
2473                                      {==}
2474                                case WCon{True{}, w8}:
2475                                  match w8:
2476                                    case WNil{}:
2477                                      {==}
2478                        case WCon{True{}, w6}:
2479                          match w6:
2480                            case WCon{False{}, w7}:
2481                              match w7:
2482                                case WCon{False{}, w8}:
2483                                  match w8:
2484                                    case WNil{}:
2485                                      {==}
2486                                case WCon{True{}, w8}:
2487                                  match w8:
2488                                    case WNil{}:
2489                                      {==}
2490                            case WCon{True{}, w7}:
2491                              match w7:
2492                                case WCon{False{}, w8}:
2493                                  match w8:
2494                                    case WNil{}:
2495                                      {==}
2496                                case WCon{True{}, w8}:
2497                                  match w8:
2498                                    case WNil{}:
2499                                      {==}
2500    case WCon{True{}, w1}:
2501      match w1:
2502        case WCon{False{}, w2}:
2503          match w2:
2504            case WCon{False{}, w3}:
2505              match w3:
2506                case WCon{False{}, w4}:
2507                  match w4:
2508                    case WCon{False{}, w5}:
2509                      match w5:
2510                        case WCon{False{}, w6}:
2511                          match w6:
2512                            case WCon{False{}, w7}:
2513                              match w7:
2514                                case WCon{False{}, w8}:
2515                                  match w8:
2516                                    case WNil{}:
2517                                      {==}
2518                                case WCon{True{}, w8}:
2519                                  match w8:
2520                                    case WNil{}:
2521                                      {==}
2522                            case WCon{True{}, w7}:
2523                              match w7:
2524                                case WCon{False{}, w8}:
2525                                  match w8:
2526                                    case WNil{}:
2527                                      {==}
2528                                case WCon{True{}, w8}:
2529                                  match w8:
2530                                    case WNil{}:
2531                                      {==}
2532                        case WCon{True{}, w6}:
2533                          match w6:
2534                            case WCon{False{}, w7}:
2535                              match w7:
2536                                case WCon{False{}, w8}:
2537                                  match w8:
2538                                    case WNil{}:
2539                                      {==}
2540                                case WCon{True{}, w8}:
2541                                  match w8:
2542                                    case WNil{}:
2543                                      {==}
2544                            case WCon{True{}, w7}:
2545                              match w7:
2546                                case WCon{False{}, w8}:
2547                                  match w8:
2548                                    case WNil{}:
2549                                      {==}
2550                                case WCon{True{}, w8}:
2551                                  match w8:
2552                                    case WNil{}:
2553                                      {==}
2554                    case WCon{True{}, w5}:
2555                      match w5:
2556                        case WCon{False{}, w6}:
2557                          match w6:
2558                            case WCon{False{}, w7}:
2559                              match w7:
2560                                case WCon{False{}, w8}:
2561                                  match w8:
2562                                    case WNil{}:
2563                                      {==}
2564                                case WCon{True{}, w8}:
2565                                  match w8:
2566                                    case WNil{}:
2567                                      {==}
2568                            case WCon{True{}, w7}:
2569                              match w7:
2570                                case WCon{False{}, w8}:
2571                                  match w8:
2572                                    case WNil{}:
2573                                      {==}
2574                                case WCon{True{}, w8}:
2575                                  match w8:
2576                                    case WNil{}:
2577                                      {==}
2578                        case WCon{True{}, w6}:
2579                          match w6:
2580                            case WCon{False{}, w7}:
2581                              match w7:
2582                                case WCon{False{}, w8}:
2583                                  match w8:
2584                                    case WNil{}:
2585                                      {==}
2586                                case WCon{True{}, w8}:
2587                                  match w8:
2588                                    case WNil{}:
2589                                      {==}
2590                            case WCon{True{}, w7}:
2591                              match w7:
2592                                case WCon{False{}, w8}:
2593                                  match w8:
2594                                    case WNil{}:
2595                                      {==}
2596                                case WCon{True{}, w8}:
2597                                  match w8:
2598                                    case WNil{}:
2599                                      {==}
2600                case WCon{True{}, w4}:
2601                  match w4:
2602                    case WCon{False{}, w5}:
2603                      match w5:
2604                        case WCon{False{}, w6}:
2605                          match w6:
2606                            case WCon{False{}, w7}:
2607                              match w7:
2608                                case WCon{False{}, w8}:
2609                                  match w8:
2610                                    case WNil{}:
2611                                      {==}
2612                                case WCon{True{}, w8}:
2613                                  match w8:
2614                                    case WNil{}:
2615                                      {==}
2616                            case WCon{True{}, w7}:
2617                              match w7:
2618                                case WCon{False{}, w8}:
2619                                  match w8:
2620                                    case WNil{}:
2621                                      {==}
2622                                case WCon{True{}, w8}:
2623                                  match w8:
2624                                    case WNil{}:
2625                                      {==}
2626                        case WCon{True{}, w6}:
2627                          match w6:
2628                            case WCon{False{}, w7}:
2629                              match w7:
2630                                case WCon{False{}, w8}:
2631                                  match w8:
2632                                    case WNil{}:
2633                                      {==}
2634                                case WCon{True{}, w8}:
2635                                  match w8:
2636                                    case WNil{}:
2637                                      {==}
2638                            case WCon{True{}, w7}:
2639                              match w7:
2640                                case WCon{False{}, w8}:
2641                                  match w8:
2642                                    case WNil{}:
2643                                      {==}
2644                                case WCon{True{}, w8}:
2645                                  match w8:
2646                                    case WNil{}:
2647                                      {==}
2648                    case WCon{True{}, w5}:
2649                      match w5:
2650                        case WCon{False{}, w6}:
2651                          match w6:
2652                            case WCon{False{}, w7}:
2653                              match w7:
2654                                case WCon{False{}, w8}:
2655                                  match w8:
2656                                    case WNil{}:
2657                                      {==}
2658                                case WCon{True{}, w8}:
2659                                  match w8:
2660                                    case WNil{}:
2661                                      {==}
2662                            case WCon{True{}, w7}:
2663                              match w7:
2664                                case WCon{False{}, w8}:
2665                                  match w8:
2666                                    case WNil{}:
2667                                      {==}
2668                                case WCon{True{}, w8}:
2669                                  match w8:
2670                                    case WNil{}:
2671                                      {==}
2672                        case WCon{True{}, w6}:
2673                          match w6:
2674                            case WCon{False{}, w7}:
2675                              match w7:
2676                                case WCon{False{}, w8}:
2677                                  match w8:
2678                                    case WNil{}:
2679                                      {==}
2680                                case WCon{True{}, w8}:
2681                                  match w8:
2682                                    case WNil{}:
2683                                      {==}
2684                            case WCon{True{}, w7}:
2685                              match w7:
2686                                case WCon{False{}, w8}:
2687                                  match w8:
2688                                    case WNil{}:
2689                                      {==}
2690                                case WCon{True{}, w8}:
2691                                  match w8:
2692                                    case WNil{}:
2693                                      {==}
2694            case WCon{True{}, w3}:
2695              match w3:
2696                case WCon{False{}, w4}:
2697                  match w4:
2698                    case WCon{False{}, w5}:
2699                      match w5:
2700                        case WCon{False{}, w6}:
2701                          match w6:
2702                            case WCon{False{}, w7}:
2703                              match w7:
2704                                case WCon{False{}, w8}:
2705                                  match w8:
2706                                    case WNil{}:
2707                                      {==}
2708                                case WCon{True{}, w8}:
2709                                  match w8:
2710                                    case WNil{}:
2711                                      {==}
2712                            case WCon{True{}, w7}:
2713                              match w7:
2714                                case WCon{False{}, w8}:
2715                                  match w8:
2716                                    case WNil{}:
2717                                      {==}
2718                                case WCon{True{}, w8}:
2719                                  match w8:
2720                                    case WNil{}:
2721                                      {==}
2722                        case WCon{True{}, w6}:
2723                          match w6:
2724                            case WCon{False{}, w7}:
2725                              match w7:
2726                                case WCon{False{}, w8}:
2727                                  match w8:
2728                                    case WNil{}:
2729                                      {==}
2730                                case WCon{True{}, w8}:
2731                                  match w8:
2732                                    case WNil{}:
2733                                      {==}
2734                            case WCon{True{}, w7}:
2735                              match w7:
2736                                case WCon{False{}, w8}:
2737                                  match w8:
2738                                    case WNil{}:
2739                                      {==}
2740                                case WCon{True{}, w8}:
2741                                  match w8:
2742                                    case WNil{}:
2743                                      {==}
2744                    case WCon{True{}, w5}:
2745                      match w5:
2746                        case WCon{False{}, w6}:
2747                          match w6:
2748                            case WCon{False{}, w7}:
2749                              match w7:
2750                                case WCon{False{}, w8}:
2751                                  match w8:
2752                                    case WNil{}:
2753                                      {==}
2754                                case WCon{True{}, w8}:
2755                                  match w8:
2756                                    case WNil{}:
2757                                      {==}
2758                            case WCon{True{}, w7}:
2759                              match w7:
2760                                case WCon{False{}, w8}:
2761                                  match w8:
2762                                    case WNil{}:
2763                                      {==}
2764                                case WCon{True{}, w8}:
2765                                  match w8:
2766                                    case WNil{}:
2767                                      {==}
2768                        case WCon{True{}, w6}:
2769                          match w6:
2770                            case WCon{False{}, w7}:
2771                              match w7:
2772                                case WCon{False{}, w8}:
2773                                  match w8:
2774                                    case WNil{}:
2775                                      {==}
2776                                case WCon{True{}, w8}:
2777                                  match w8:
2778                                    case WNil{}:
2779                                      {==}
2780                            case WCon{True{}, w7}:
2781                              match w7:
2782                                case WCon{False{}, w8}:
2783                                  match w8:
2784                                    case WNil{}:
2785                                      {==}
2786                                case WCon{True{}, w8}:
2787                                  match w8:
2788                                    case WNil{}:
2789                                      {==}
2790                case WCon{True{}, w4}:
2791                  match w4:
2792                    case WCon{False{}, w5}:
2793                      match w5:
2794                        case WCon{False{}, w6}:
2795                          match w6:
2796                            case WCon{False{}, w7}:
2797                              match w7:
2798                                case WCon{False{}, w8}:
2799                                  match w8:
2800                                    case WNil{}:
2801                                      {==}
2802                                case WCon{True{}, w8}:
2803                                  match w8:
2804                                    case WNil{}:
2805                                      {==}
2806                            case WCon{True{}, w7}:
2807                              match w7:
2808                                case WCon{False{}, w8}:
2809                                  match w8:
2810                                    case WNil{}:
2811                                      {==}
2812                                case WCon{True{}, w8}:
2813                                  match w8:
2814                                    case WNil{}:
2815                                      {==}
2816                        case WCon{True{}, w6}:
2817                          match w6:
2818                            case WCon{False{}, w7}:
2819                              match w7:
2820                                case WCon{False{}, w8}:
2821                                  match w8:
2822                                    case WNil{}:
2823                                      {==}
2824                                case WCon{True{}, w8}:
2825                                  match w8:
2826                                    case WNil{}:
2827                                      {==}
2828                            case WCon{True{}, w7}:
2829                              match w7:
2830                                case WCon{False{}, w8}:
2831                                  match w8:
2832                                    case WNil{}:
2833                                      {==}
2834                                case WCon{True{}, w8}:
2835                                  match w8:
2836                                    case WNil{}:
2837                                      {==}
2838                    case WCon{True{}, w5}:
2839                      match w5:
2840                        case WCon{False{}, w6}:
2841                          match w6:
2842                            case WCon{False{}, w7}:
2843                              match w7:
2844                                case WCon{False{}, w8}:
2845                                  match w8:
2846                                    case WNil{}:
2847                                      {==}
2848                                case WCon{True{}, w8}:
2849                                  match w8:
2850                                    case WNil{}:
2851                                      {==}
2852                            case WCon{True{}, w7}:
2853                              match w7:
2854                                case WCon{False{}, w8}:
2855                                  match w8:
2856                                    case WNil{}:
2857                                      {==}
2858                                case WCon{True{}, w8}:
2859                                  match w8:
2860                                    case WNil{}:
2861                                      {==}
2862                        case WCon{True{}, w6}:
2863                          match w6:
2864                            case WCon{False{}, w7}:
2865                              match w7:
2866                                case WCon{False{}, w8}:
2867                                  match w8:
2868                                    case WNil{}:
2869                                      {==}
2870                                case WCon{True{}, w8}:
2871                                  match w8:
2872                                    case WNil{}:
2873                                      {==}
2874                            case WCon{True{}, w7}:
2875                              match w7:
2876                                case WCon{False{}, w8}:
2877                                  match w8:
2878                                    case WNil{}:
2879                                      {==}
2880                                case WCon{True{}, w8}:
2881                                  match w8:
2882                                    case WNil{}:
2883                                      {==}
2884        case WCon{True{}, w2}:
2885          match w2:
2886            case WCon{False{}, w3}:
2887              match w3:
2888                case WCon{False{}, w4}:
2889                  match w4:
2890                    case WCon{False{}, w5}:
2891                      match w5:
2892                        case WCon{False{}, w6}:
2893                          match w6:
2894                            case WCon{False{}, w7}:
2895                              match w7:
2896                                case WCon{False{}, w8}:
2897                                  match w8:
2898                                    case WNil{}:
2899                                      {==}
2900                                case WCon{True{}, w8}:
2901                                  match w8:
2902                                    case WNil{}:
2903                                      {==}
2904                            case WCon{True{}, w7}:
2905                              match w7:
2906                                case WCon{False{}, w8}:
2907                                  match w8:
2908                                    case WNil{}:
2909                                      {==}
2910                                case WCon{True{}, w8}:
2911                                  match w8:
2912                                    case WNil{}:
2913                                      {==}
2914                        case WCon{True{}, w6}:
2915                          match w6:
2916                            case WCon{False{}, w7}:
2917                              match w7:
2918                                case WCon{False{}, w8}:
2919                                  match w8:
2920                                    case WNil{}:
2921                                      {==}
2922                                case WCon{True{}, w8}:
2923                                  match w8:
2924                                    case WNil{}:
2925                                      {==}
2926                            case WCon{True{}, w7}:
2927                              match w7:
2928                                case WCon{False{}, w8}:
2929                                  match w8:
2930                                    case WNil{}:
2931                                      {==}
2932                                case WCon{True{}, w8}:
2933                                  match w8:
2934                                    case WNil{}:
2935                                      {==}
2936                    case WCon{True{}, w5}:
2937                      match w5:
2938                        case WCon{False{}, w6}:
2939                          match w6:
2940                            case WCon{False{}, w7}:
2941                              match w7:
2942                                case WCon{False{}, w8}:
2943                                  match w8:
2944                                    case WNil{}:
2945                                      {==}
2946                                case WCon{True{}, w8}:
2947                                  match w8:
2948                                    case WNil{}:
2949                                      {==}
2950                            case WCon{True{}, w7}:
2951                              match w7:
2952                                case WCon{False{}, w8}:
2953                                  match w8:
2954                                    case WNil{}:
2955                                      {==}
2956                                case WCon{True{}, w8}:
2957                                  match w8:
2958                                    case WNil{}:
2959                                      {==}
2960                        case WCon{True{}, w6}:
2961                          match w6:
2962                            case WCon{False{}, w7}:
2963                              match w7:
2964                                case WCon{False{}, w8}:
2965                                  match w8:
2966                                    case WNil{}:
2967                                      {==}
2968                                case WCon{True{}, w8}:
2969                                  match w8:
2970                                    case WNil{}:
2971                                      {==}
2972                            case WCon{True{}, w7}:
2973                              match w7:
2974                                case WCon{False{}, w8}:
2975                                  match w8:
2976                                    case WNil{}:
2977                                      {==}
2978                                case WCon{True{}, w8}:
2979                                  match w8:
2980                                    case WNil{}:
2981                                      {==}
2982                case WCon{True{}, w4}:
2983                  match w4:
2984                    case WCon{False{}, w5}:
2985                      match w5:
2986                        case WCon{False{}, w6}:
2987                          match w6:
2988                            case WCon{False{}, w7}:
2989                              match w7:
2990                                case WCon{False{}, w8}:
2991                                  match w8:
2992                                    case WNil{}:
2993                                      {==}
2994                                case WCon{True{}, w8}:
2995                                  match w8:
2996                                    case WNil{}:
2997                                      {==}
2998                            case WCon{True{}, w7}:
2999                              match w7:
3000                                case WCon{False{}, w8}:
3001                                  match w8:
3002                                    case WNil{}:
3003                                      {==}
3004                                case WCon{True{}, w8}:
3005                                  match w8:
3006                                    case WNil{}:
3007                                      {==}
3008                        case WCon{True{}, w6}:
3009                          match w6:
3010                            case WCon{False{}, w7}:
3011                              match w7:
3012                                case WCon{False{}, w8}:
3013                                  match w8:
3014                                    case WNil{}:
3015                                      {==}
3016                                case WCon{True{}, w8}:
3017                                  match w8:
3018                                    case WNil{}:
3019                                      {==}
3020                            case WCon{True{}, w7}:
3021                              match w7:
3022                                case WCon{False{}, w8}:
3023                                  match w8:
3024                                    case WNil{}:
3025                                      {==}
3026                                case WCon{True{}, w8}:
3027                                  match w8:
3028                                    case WNil{}:
3029                                      {==}
3030                    case WCon{True{}, w5}:
3031                      match w5:
3032                        case WCon{False{}, w6}:
3033                          match w6:
3034                            case WCon{False{}, w7}:
3035                              match w7:
3036                                case WCon{False{}, w8}:
3037                                  match w8:
3038                                    case WNil{}:
3039                                      {==}
3040                                case WCon{True{}, w8}:
3041                                  match w8:
3042                                    case WNil{}:
3043                                      {==}
3044                            case WCon{True{}, w7}:
3045                              match w7:
3046                                case WCon{False{}, w8}:
3047                                  match w8:
3048                                    case WNil{}:
3049                                      {==}
3050                                case WCon{True{}, w8}:
3051                                  match w8:
3052                                    case WNil{}:
3053                                      {==}
3054                        case WCon{True{}, w6}:
3055                          match w6:
3056                            case WCon{False{}, w7}:
3057                              match w7:
3058                                case WCon{False{}, w8}:
3059                                  match w8:
3060                                    case WNil{}:
3061                                      {==}
3062                                case WCon{True{}, w8}:
3063                                  match w8:
3064                                    case WNil{}:
3065                                      {==}
3066                            case WCon{True{}, w7}:
3067                              match w7:
3068                                case WCon{False{}, w8}:
3069                                  match w8:
3070                                    case WNil{}:
3071                                      {==}
3072                                case WCon{True{}, w8}:
3073                                  match w8:
3074                                    case WNil{}:
3075                                      {==}
3076            case WCon{True{}, w3}:
3077              match w3:
3078                case WCon{False{}, w4}:
3079                  match w4:
3080                    case WCon{False{}, w5}:
3081                      match w5:
3082                        case WCon{False{}, w6}:
3083                          match w6:
3084                            case WCon{False{}, w7}:
3085                              match w7:
3086                                case WCon{False{}, w8}:
3087                                  match w8:
3088                                    case WNil{}:
3089                                      {==}
3090                                case WCon{True{}, w8}:
3091                                  match w8:
3092                                    case WNil{}:
3093                                      {==}
3094                            case WCon{True{}, w7}:
3095                              match w7:
3096                                case WCon{False{}, w8}:
3097                                  match w8:
3098                                    case WNil{}:
3099                                      {==}
3100                                case WCon{True{}, w8}:
3101                                  match w8:
3102                                    case WNil{}:
3103                                      {==}
3104                        case WCon{True{}, w6}:
3105                          match w6:
3106                            case WCon{False{}, w7}:
3107                              match w7:
3108                                case WCon{False{}, w8}:
3109                                  match w8:
3110                                    case WNil{}:
3111                                      {==}
3112                                case WCon{True{}, w8}:
3113                                  match w8:
3114                                    case WNil{}:
3115                                      {==}
3116                            case WCon{True{}, w7}:
3117                              match w7:
3118                                case WCon{False{}, w8}:
3119                                  match w8:
3120                                    case WNil{}:
3121                                      {==}
3122                                case WCon{True{}, w8}:
3123                                  match w8:
3124                                    case WNil{}:
3125                                      {==}
3126                    case WCon{True{}, w5}:
3127                      match w5:
3128                        case WCon{False{}, w6}:
3129                          match w6:
3130                            case WCon{False{}, w7}:
3131                              match w7:
3132                                case WCon{False{}, w8}:
3133                                  match w8:
3134                                    case WNil{}:
3135                                      {==}
3136                                case WCon{True{}, w8}:
3137                                  match w8:
3138                                    case WNil{}:
3139                                      {==}
3140                            case WCon{True{}, w7}:
3141                              match w7:
3142                                case WCon{False{}, w8}:
3143                                  match w8:
3144                                    case WNil{}:
3145                                      {==}
3146                                case WCon{True{}, w8}:
3147                                  match w8:
3148                                    case WNil{}:
3149                                      {==}
3150                        case WCon{True{}, w6}:
3151                          match w6:
3152                            case WCon{False{}, w7}:
3153                              match w7:
3154                                case WCon{False{}, w8}:
3155                                  match w8:
3156                                    case WNil{}:
3157                                      {==}
3158                                case WCon{True{}, w8}:
3159                                  match w8:
3160                                    case WNil{}:
3161                                      {==}
3162                            case WCon{True{}, w7}:
3163                              match w7:
3164                                case WCon{False{}, w8}:
3165                                  match w8:
3166                                    case WNil{}:
3167                                      {==}
3168                                case WCon{True{}, w8}:
3169                                  match w8:
3170                                    case WNil{}:
3171                                      {==}
3172                case WCon{True{}, w4}:
3173                  match w4:
3174                    case WCon{False{}, w5}:
3175                      match w5:
3176                        case WCon{False{}, w6}:
3177                          match w6:
3178                            case WCon{False{}, w7}:
3179                              match w7:
3180                                case WCon{False{}, w8}:
3181                                  match w8:
3182                                    case WNil{}:
3183                                      {==}
3184                                case WCon{True{}, w8}:
3185                                  match w8:
3186                                    case WNil{}:
3187                                      {==}
3188                            case WCon{True{}, w7}:
3189                              match w7:
3190                                case WCon{False{}, w8}:
3191                                  match w8:
3192                                    case WNil{}:
3193                                      {==}
3194                                case WCon{True{}, w8}:
3195                                  match w8:
3196                                    case WNil{}:
3197                                      {==}
3198                        case WCon{True{}, w6}:
3199                          match w6:
3200                            case WCon{False{}, w7}:
3201                              match w7:
3202                                case WCon{False{}, w8}:
3203                                  match w8:
3204                                    case WNil{}:
3205                                      {==}
3206                                case WCon{True{}, w8}:
3207                                  match w8:
3208                                    case WNil{}:
3209                                      {==}
3210                            case WCon{True{}, w7}:
3211                              match w7:
3212                                case WCon{False{}, w8}:
3213                                  match w8:
3214                                    case WNil{}:
3215                                      {==}
3216                                case WCon{True{}, w8}:
3217                                  match w8:
3218                                    case WNil{}:
3219                                      {==}
3220                    case WCon{True{}, w5}:
3221                      match w5:
3222                        case WCon{False{}, w6}:
3223                          match w6:
3224                            case WCon{False{}, w7}:
3225                              match w7:
3226                                case WCon{False{}, w8}:
3227                                  match w8:
3228                                    case WNil{}:
3229                                      {==}
3230                                case WCon{True{}, w8}:
3231                                  match w8:
3232                                    case WNil{}:
3233                                      {==}
3234                            case WCon{True{}, w7}:
3235                              match w7:
3236                                case WCon{False{}, w8}:
3237                                  match w8:
3238                                    case WNil{}:
3239                                      {==}
3240                                case WCon{True{}, w8}:
3241                                  match w8:
3242                                    case WNil{}:
3243                                      {==}
3244                        case WCon{True{}, w6}:
3245                          match w6:
3246                            case WCon{False{}, w7}:
3247                              match w7:
3248                                case WCon{False{}, w8}:
3249                                  match w8:
3250                                    case WNil{}:
3251                                      {==}
3252                                case WCon{True{}, w8}:
3253                                  match w8:
3254                                    case WNil{}:
3255                                      {==}
3256                            case WCon{True{}, w7}:
3257                              match w7:
3258                                case WCon{False{}, w8}:
3259                                  match w8:
3260                                    case WNil{}:
3261                                      {==}
3262                                case WCon{True{}, w8}:
3263                                  match w8:
3264                                    case WNil{}:
3265                                      {==}
3266
3267def aria_sb13(w0: Word(8n)) -> {w0 == A.aria.sb1(A.aria.sb3(w0)) : Word(8n)}:
3268  match w0:
3269    case WCon{False{}, w1}:
3270      match w1:
3271        case WCon{False{}, w2}:
3272          match w2:
3273            case WCon{False{}, w3}:
3274              match w3:
3275                case WCon{False{}, w4}:
3276                  match w4:
3277                    case WCon{False{}, w5}:
3278                      match w5:
3279                        case WCon{False{}, w6}:
3280                          match w6:
3281                            case WCon{False{}, w7}:
3282                              match w7:
3283                                case WCon{False{}, w8}:
3284                                  match w8:
3285                                    case WNil{}:
3286                                      {==}
3287                                case WCon{True{}, w8}:
3288                                  match w8:
3289                                    case WNil{}:
3290                                      {==}
3291                            case WCon{True{}, w7}:
3292                              match w7:
3293                                case WCon{False{}, w8}:
3294                                  match w8:
3295                                    case WNil{}:
3296                                      {==}
3297                                case WCon{True{}, w8}:
3298                                  match w8:
3299                                    case WNil{}:
3300                                      {==}
3301                        case WCon{True{}, w6}:
3302                          match w6:
3303                            case WCon{False{}, w7}:
3304                              match w7:
3305                                case WCon{False{}, w8}:
3306                                  match w8:
3307                                    case WNil{}:
3308                                      {==}
3309                                case WCon{True{}, w8}:
3310                                  match w8:
3311                                    case WNil{}:
3312                                      {==}
3313                            case WCon{True{}, w7}:
3314                              match w7:
3315                                case WCon{False{}, w8}:
3316                                  match w8:
3317                                    case WNil{}:
3318                                      {==}
3319                                case WCon{True{}, w8}:
3320                                  match w8:
3321                                    case WNil{}:
3322                                      {==}
3323                    case WCon{True{}, w5}:
3324                      match w5:
3325                        case WCon{False{}, w6}:
3326                          match w6:
3327                            case WCon{False{}, w7}:
3328                              match w7:
3329                                case WCon{False{}, w8}:
3330                                  match w8:
3331                                    case WNil{}:
3332                                      {==}
3333                                case WCon{True{}, w8}:
3334                                  match w8:
3335                                    case WNil{}:
3336                                      {==}
3337                            case WCon{True{}, w7}:
3338                              match w7:
3339                                case WCon{False{}, w8}:
3340                                  match w8:
3341                                    case WNil{}:
3342                                      {==}
3343                                case WCon{True{}, w8}:
3344                                  match w8:
3345                                    case WNil{}:
3346                                      {==}
3347                        case WCon{True{}, w6}:
3348                          match w6:
3349                            case WCon{False{}, w7}:
3350                              match w7:
3351                                case WCon{False{}, w8}:
3352                                  match w8:
3353                                    case WNil{}:
3354                                      {==}
3355                                case WCon{True{}, w8}:
3356                                  match w8:
3357                                    case WNil{}:
3358                                      {==}
3359                            case WCon{True{}, w7}:
3360                              match w7:
3361                                case WCon{False{}, w8}:
3362                                  match w8:
3363                                    case WNil{}:
3364                                      {==}
3365                                case WCon{True{}, w8}:
3366                                  match w8:
3367                                    case WNil{}:
3368                                      {==}
3369                case WCon{True{}, w4}:
3370                  match w4:
3371                    case WCon{False{}, w5}:
3372                      match w5:
3373                        case WCon{False{}, w6}:
3374                          match w6:
3375                            case WCon{False{}, w7}:
3376                              match w7:
3377                                case WCon{False{}, w8}:
3378                                  match w8:
3379                                    case WNil{}:
3380                                      {==}
3381                                case WCon{True{}, w8}:
3382                                  match w8:
3383                                    case WNil{}:
3384                                      {==}
3385                            case WCon{True{}, w7}:
3386                              match w7:
3387                                case WCon{False{}, w8}:
3388                                  match w8:
3389                                    case WNil{}:
3390                                      {==}
3391                                case WCon{True{}, w8}:
3392                                  match w8:
3393                                    case WNil{}:
3394                                      {==}
3395                        case WCon{True{}, w6}:
3396                          match w6:
3397                            case WCon{False{}, w7}:
3398                              match w7:
3399                                case WCon{False{}, w8}:
3400                                  match w8:
3401                                    case WNil{}:
3402                                      {==}
3403                                case WCon{True{}, w8}:
3404                                  match w8:
3405                                    case WNil{}:
3406                                      {==}
3407                            case WCon{True{}, w7}:
3408                              match w7:
3409                                case WCon{False{}, w8}:
3410                                  match w8:
3411                                    case WNil{}:
3412                                      {==}
3413                                case WCon{True{}, w8}:
3414                                  match w8:
3415                                    case WNil{}:
3416                                      {==}
3417                    case WCon{True{}, w5}:
3418                      match w5:
3419                        case WCon{False{}, w6}:
3420                          match w6:
3421                            case WCon{False{}, w7}:
3422                              match w7:
3423                                case WCon{False{}, w8}:
3424                                  match w8:
3425                                    case WNil{}:
3426                                      {==}
3427                                case WCon{True{}, w8}:
3428                                  match w8:
3429                                    case WNil{}:
3430                                      {==}
3431                            case WCon{True{}, w7}:
3432                              match w7:
3433                                case WCon{False{}, w8}:
3434                                  match w8:
3435                                    case WNil{}:
3436                                      {==}
3437                                case WCon{True{}, w8}:
3438                                  match w8:
3439                                    case WNil{}:
3440                                      {==}
3441                        case WCon{True{}, w6}:
3442                          match w6:
3443                            case WCon{False{}, w7}:
3444                              match w7:
3445                                case WCon{False{}, w8}:
3446                                  match w8:
3447                                    case WNil{}:
3448                                      {==}
3449                                case WCon{True{}, w8}:
3450                                  match w8:
3451                                    case WNil{}:
3452                                      {==}
3453                            case WCon{True{}, w7}:
3454                              match w7:
3455                                case WCon{False{}, w8}:
3456                                  match w8:
3457                                    case WNil{}:
3458                                      {==}
3459                                case WCon{True{}, w8}:
3460                                  match w8:
3461                                    case WNil{}:
3462                                      {==}
3463            case WCon{True{}, w3}:
3464              match w3:
3465                case WCon{False{}, w4}:
3466                  match w4:
3467                    case WCon{False{}, w5}:
3468                      match w5:
3469                        case WCon{False{}, w6}:
3470                          match w6:
3471                            case WCon{False{}, w7}:
3472                              match w7:
3473                                case WCon{False{}, w8}:
3474                                  match w8:
3475                                    case WNil{}:
3476                                      {==}
3477                                case WCon{True{}, w8}:
3478                                  match w8:
3479                                    case WNil{}:
3480                                      {==}
3481                            case WCon{True{}, w7}:
3482                              match w7:
3483                                case WCon{False{}, w8}:
3484                                  match w8:
3485                                    case WNil{}:
3486                                      {==}
3487                                case WCon{True{}, w8}:
3488                                  match w8:
3489                                    case WNil{}:
3490                                      {==}
3491                        case WCon{True{}, w6}:
3492                          match w6:
3493                            case WCon{False{}, w7}:
3494                              match w7:
3495                                case WCon{False{}, w8}:
3496                                  match w8:
3497                                    case WNil{}:
3498                                      {==}
3499                                case WCon{True{}, w8}:
3500                                  match w8:
3501                                    case WNil{}:
3502                                      {==}
3503                            case WCon{True{}, w7}:
3504                              match w7:
3505                                case WCon{False{}, w8}:
3506                                  match w8:
3507                                    case WNil{}:
3508                                      {==}
3509                                case WCon{True{}, w8}:
3510                                  match w8:
3511                                    case WNil{}:
3512                                      {==}
3513                    case WCon{True{}, w5}:
3514                      match w5:
3515                        case WCon{False{}, w6}:
3516                          match w6:
3517                            case WCon{False{}, w7}:
3518                              match w7:
3519                                case WCon{False{}, w8}:
3520                                  match w8:
3521                                    case WNil{}:
3522                                      {==}
3523                                case WCon{True{}, w8}:
3524                                  match w8:
3525                                    case WNil{}:
3526                                      {==}
3527                            case WCon{True{}, w7}:
3528                              match w7:
3529                                case WCon{False{}, w8}:
3530                                  match w8:
3531                                    case WNil{}:
3532                                      {==}
3533                                case WCon{True{}, w8}:
3534                                  match w8:
3535                                    case WNil{}:
3536                                      {==}
3537                        case WCon{True{}, w6}:
3538                          match w6:
3539                            case WCon{False{}, w7}:
3540                              match w7:
3541                                case WCon{False{}, w8}:
3542                                  match w8:
3543                                    case WNil{}:
3544                                      {==}
3545                                case WCon{True{}, w8}:
3546                                  match w8:
3547                                    case WNil{}:
3548                                      {==}
3549                            case WCon{True{}, w7}:
3550                              match w7:
3551                                case WCon{False{}, w8}:
3552                                  match w8:
3553                                    case WNil{}:
3554                                      {==}
3555                                case WCon{True{}, w8}:
3556                                  match w8:
3557                                    case WNil{}:
3558                                      {==}
3559                case WCon{True{}, w4}:
3560                  match w4:
3561                    case WCon{False{}, w5}:
3562                      match w5:
3563                        case WCon{False{}, w6}:
3564                          match w6:
3565                            case WCon{False{}, w7}:
3566                              match w7:
3567                                case WCon{False{}, w8}:
3568                                  match w8:
3569                                    case WNil{}:
3570                                      {==}
3571                                case WCon{True{}, w8}:
3572                                  match w8:
3573                                    case WNil{}:
3574                                      {==}
3575                            case WCon{True{}, w7}:
3576                              match w7:
3577                                case WCon{False{}, w8}:
3578                                  match w8:
3579                                    case WNil{}:
3580                                      {==}
3581                                case WCon{True{}, w8}:
3582                                  match w8:
3583                                    case WNil{}:
3584                                      {==}
3585                        case WCon{True{}, w6}:
3586                          match w6:
3587                            case WCon{False{}, w7}:
3588                              match w7:
3589                                case WCon{False{}, w8}:
3590                                  match w8:
3591                                    case WNil{}:
3592                                      {==}
3593                                case WCon{True{}, w8}:
3594                                  match w8:
3595                                    case WNil{}:
3596                                      {==}
3597                            case WCon{True{}, w7}:
3598                              match w7:
3599                                case WCon{False{}, w8}:
3600                                  match w8:
3601                                    case WNil{}:
3602                                      {==}
3603                                case WCon{True{}, w8}:
3604                                  match w8:
3605                                    case WNil{}:
3606                                      {==}
3607                    case WCon{True{}, w5}:
3608                      match w5:
3609                        case WCon{False{}, w6}:
3610                          match w6:
3611                            case WCon{False{}, w7}:
3612                              match w7:
3613                                case WCon{False{}, w8}:
3614                                  match w8:
3615                                    case WNil{}:
3616                                      {==}
3617                                case WCon{True{}, w8}:
3618                                  match w8:
3619                                    case WNil{}:
3620                                      {==}
3621                            case WCon{True{}, w7}:
3622                              match w7:
3623                                case WCon{False{}, w8}:
3624                                  match w8:
3625                                    case WNil{}:
3626                                      {==}
3627                                case WCon{True{}, w8}:
3628                                  match w8:
3629                                    case WNil{}:
3630                                      {==}
3631                        case WCon{True{}, w6}:
3632                          match w6:
3633                            case WCon{False{}, w7}:
3634                              match w7:
3635                                case WCon{False{}, w8}:
3636                                  match w8:
3637                                    case WNil{}:
3638                                      {==}
3639                                case WCon{True{}, w8}:
3640                                  match w8:
3641                                    case WNil{}:
3642                                      {==}
3643                            case WCon{True{}, w7}:
3644                              match w7:
3645                                case WCon{False{}, w8}:
3646                                  match w8:
3647                                    case WNil{}:
3648                                      {==}
3649                                case WCon{True{}, w8}:
3650                                  match w8:
3651                                    case WNil{}:
3652                                      {==}
3653        case WCon{True{}, w2}:
3654          match w2:
3655            case WCon{False{}, w3}:
3656              match w3:
3657                case WCon{False{}, w4}:
3658                  match w4:
3659                    case WCon{False{}, w5}:
3660                      match w5:
3661                        case WCon{False{}, w6}:
3662                          match w6:
3663                            case WCon{False{}, w7}:
3664                              match w7:
3665                                case WCon{False{}, w8}:
3666                                  match w8:
3667                                    case WNil{}:
3668                                      {==}
3669                                case WCon{True{}, w8}:
3670                                  match w8:
3671                                    case WNil{}:
3672                                      {==}
3673                            case WCon{True{}, w7}:
3674                              match w7:
3675                                case WCon{False{}, w8}:
3676                                  match w8:
3677                                    case WNil{}:
3678                                      {==}
3679                                case WCon{True{}, w8}:
3680                                  match w8:
3681                                    case WNil{}:
3682                                      {==}
3683                        case WCon{True{}, w6}:
3684                          match w6:
3685                            case WCon{False{}, w7}:
3686                              match w7:
3687                                case WCon{False{}, w8}:
3688                                  match w8:
3689                                    case WNil{}:
3690                                      {==}
3691                                case WCon{True{}, w8}:
3692                                  match w8:
3693                                    case WNil{}:
3694                                      {==}
3695                            case WCon{True{}, w7}:
3696                              match w7:
3697                                case WCon{False{}, w8}:
3698                                  match w8:
3699                                    case WNil{}:
3700                                      {==}
3701                                case WCon{True{}, w8}:
3702                                  match w8:
3703                                    case WNil{}:
3704                                      {==}
3705                    case WCon{True{}, w5}:
3706                      match w5:
3707                        case WCon{False{}, w6}:
3708                          match w6:
3709                            case WCon{False{}, w7}:
3710                              match w7:
3711                                case WCon{False{}, w8}:
3712                                  match w8:
3713                                    case WNil{}:
3714                                      {==}
3715                                case WCon{True{}, w8}:
3716                                  match w8:
3717                                    case WNil{}:
3718                                      {==}
3719                            case WCon{True{}, w7}:
3720                              match w7:
3721                                case WCon{False{}, w8}:
3722                                  match w8:
3723                                    case WNil{}:
3724                                      {==}
3725                                case WCon{True{}, w8}:
3726                                  match w8:
3727                                    case WNil{}:
3728                                      {==}
3729                        case WCon{True{}, w6}:
3730                          match w6:
3731                            case WCon{False{}, w7}:
3732                              match w7:
3733                                case WCon{False{}, w8}:
3734                                  match w8:
3735                                    case WNil{}:
3736                                      {==}
3737                                case WCon{True{}, w8}:
3738                                  match w8:
3739                                    case WNil{}:
3740                                      {==}
3741                            case WCon{True{}, w7}:
3742                              match w7:
3743                                case WCon{False{}, w8}:
3744                                  match w8:
3745                                    case WNil{}:
3746                                      {==}
3747                                case WCon{True{}, w8}:
3748                                  match w8:
3749                                    case WNil{}:
3750                                      {==}
3751                case WCon{True{}, w4}:
3752                  match w4:
3753                    case WCon{False{}, w5}:
3754                      match w5:
3755                        case WCon{False{}, w6}:
3756                          match w6:
3757                            case WCon{False{}, w7}:
3758                              match w7:
3759                                case WCon{False{}, w8}:
3760                                  match w8:
3761                                    case WNil{}:
3762                                      {==}
3763                                case WCon{True{}, w8}:
3764                                  match w8:
3765                                    case WNil{}:
3766                                      {==}
3767                            case WCon{True{}, w7}:
3768                              match w7:
3769                                case WCon{False{}, w8}:
3770                                  match w8:
3771                                    case WNil{}:
3772                                      {==}
3773                                case WCon{True{}, w8}:
3774                                  match w8:
3775                                    case WNil{}:
3776                                      {==}
3777                        case WCon{True{}, w6}:
3778                          match w6:
3779                            case WCon{False{}, w7}:
3780                              match w7:
3781                                case WCon{False{}, w8}:
3782                                  match w8:
3783                                    case WNil{}:
3784                                      {==}
3785                                case WCon{True{}, w8}:
3786                                  match w8:
3787                                    case WNil{}:
3788                                      {==}
3789                            case WCon{True{}, w7}:
3790                              match w7:
3791                                case WCon{False{}, w8}:
3792                                  match w8:
3793                                    case WNil{}:
3794                                      {==}
3795                                case WCon{True{}, w8}:
3796                                  match w8:
3797                                    case WNil{}:
3798                                      {==}
3799                    case WCon{True{}, w5}:
3800                      match w5:
3801                        case WCon{False{}, w6}:
3802                          match w6:
3803                            case WCon{False{}, w7}:
3804                              match w7:
3805                                case WCon{False{}, w8}:
3806                                  match w8:
3807                                    case WNil{}:
3808                                      {==}
3809                                case WCon{True{}, w8}:
3810                                  match w8:
3811                                    case WNil{}:
3812                                      {==}
3813                            case WCon{True{}, w7}:
3814                              match w7:
3815                                case WCon{False{}, w8}:
3816                                  match w8:
3817                                    case WNil{}:
3818                                      {==}
3819                                case WCon{True{}, w8}:
3820                                  match w8:
3821                                    case WNil{}:
3822                                      {==}
3823                        case WCon{True{}, w6}:
3824                          match w6:
3825                            case WCon{False{}, w7}:
3826                              match w7:
3827                                case WCon{False{}, w8}:
3828                                  match w8:
3829                                    case WNil{}:
3830                                      {==}
3831                                case WCon{True{}, w8}:
3832                                  match w8:
3833                                    case WNil{}:
3834                                      {==}
3835                            case WCon{True{}, w7}:
3836                              match w7:
3837                                case WCon{False{}, w8}:
3838                                  match w8:
3839                                    case WNil{}:
3840                                      {==}
3841                                case WCon{True{}, w8}:
3842                                  match w8:
3843                                    case WNil{}:
3844                                      {==}
3845            case WCon{True{}, w3}:
3846              match w3:
3847                case WCon{False{}, w4}:
3848                  match w4:
3849                    case WCon{False{}, w5}:
3850                      match w5:
3851                        case WCon{False{}, w6}:
3852                          match w6:
3853                            case WCon{False{}, w7}:
3854                              match w7:
3855                                case WCon{False{}, w8}:
3856                                  match w8:
3857                                    case WNil{}:
3858                                      {==}
3859                                case WCon{True{}, w8}:
3860                                  match w8:
3861                                    case WNil{}:
3862                                      {==}
3863                            case WCon{True{}, w7}:
3864                              match w7:
3865                                case WCon{False{}, w8}:
3866                                  match w8:
3867                                    case WNil{}:
3868                                      {==}
3869                                case WCon{True{}, w8}:
3870                                  match w8:
3871                                    case WNil{}:
3872                                      {==}
3873                        case WCon{True{}, w6}:
3874                          match w6:
3875                            case WCon{False{}, w7}:
3876                              match w7:
3877                                case WCon{False{}, w8}:
3878                                  match w8:
3879                                    case WNil{}:
3880                                      {==}
3881                                case WCon{True{}, w8}:
3882                                  match w8:
3883                                    case WNil{}:
3884                                      {==}
3885                            case WCon{True{}, w7}:
3886                              match w7:
3887                                case WCon{False{}, w8}:
3888                                  match w8:
3889                                    case WNil{}:
3890                                      {==}
3891                                case WCon{True{}, w8}:
3892                                  match w8:
3893                                    case WNil{}:
3894                                      {==}
3895                    case WCon{True{}, w5}:
3896                      match w5:
3897                        case WCon{False{}, w6}:
3898                          match w6:
3899                            case WCon{False{}, w7}:
3900                              match w7:
3901                                case WCon{False{}, w8}:
3902                                  match w8:
3903                                    case WNil{}:
3904                                      {==}
3905                                case WCon{True{}, w8}:
3906                                  match w8:
3907                                    case WNil{}:
3908                                      {==}
3909                            case WCon{True{}, w7}:
3910                              match w7:
3911                                case WCon{False{}, w8}:
3912                                  match w8:
3913                                    case WNil{}:
3914                                      {==}
3915                                case WCon{True{}, w8}:
3916                                  match w8:
3917                                    case WNil{}:
3918                                      {==}
3919                        case WCon{True{}, w6}:
3920                          match w6:
3921                            case WCon{False{}, w7}:
3922                              match w7:
3923                                case WCon{False{}, w8}:
3924                                  match w8:
3925                                    case WNil{}:
3926                                      {==}
3927                                case WCon{True{}, w8}:
3928                                  match w8:
3929                                    case WNil{}:
3930                                      {==}
3931                            case WCon{True{}, w7}:
3932                              match w7:
3933                                case WCon{False{}, w8}:
3934                                  match w8:
3935                                    case WNil{}:
3936                                      {==}
3937                                case WCon{True{}, w8}:
3938                                  match w8:
3939                                    case WNil{}:
3940                                      {==}
3941                case WCon{True{}, w4}:
3942                  match w4:
3943                    case WCon{False{}, w5}:
3944                      match w5:
3945                        case WCon{False{}, w6}:
3946                          match w6:
3947                            case WCon{False{}, w7}:
3948                              match w7:
3949                                case WCon{False{}, w8}:
3950                                  match w8:
3951                                    case WNil{}:
3952                                      {==}
3953                                case WCon{True{}, w8}:
3954                                  match w8:
3955                                    case WNil{}:
3956                                      {==}
3957                            case WCon{True{}, w7}:
3958                              match w7:
3959                                case WCon{False{}, w8}:
3960                                  match w8:
3961                                    case WNil{}:
3962                                      {==}
3963                                case WCon{True{}, w8}:
3964                                  match w8:
3965                                    case WNil{}:
3966                                      {==}
3967                        case WCon{True{}, w6}:
3968                          match w6:
3969                            case WCon{False{}, w7}:
3970                              match w7:
3971                                case WCon{False{}, w8}:
3972                                  match w8:
3973                                    case WNil{}:
3974                                      {==}
3975                                case WCon{True{}, w8}:
3976                                  match w8:
3977                                    case WNil{}:
3978                                      {==}
3979                            case WCon{True{}, w7}:
3980                              match w7:
3981                                case WCon{False{}, w8}:
3982                                  match w8:
3983                                    case WNil{}:
3984                                      {==}
3985                                case WCon{True{}, w8}:
3986                                  match w8:
3987                                    case WNil{}:
3988                                      {==}
3989                    case WCon{True{}, w5}:
3990                      match w5:
3991                        case WCon{False{}, w6}:
3992                          match w6:
3993                            case WCon{False{}, w7}:
3994                              match w7:
3995                                case WCon{False{}, w8}:
3996                                  match w8:
3997                                    case WNil{}:
3998                                      {==}
3999                                case WCon{True{}, w8}:
4000                                  match w8:
4001                                    case WNil{}:
4002                                      {==}
4003                            case WCon{True{}, w7}:
4004                              match w7:
4005                                case WCon{False{}, w8}:
4006                                  match w8:
4007                                    case WNil{}:
4008                                      {==}
4009                                case WCon{True{}, w8}:
4010                                  match w8:
4011                                    case WNil{}:
4012                                      {==}
4013                        case WCon{True{}, w6}:
4014                          match w6:
4015                            case WCon{False{}, w7}:
4016                              match w7:
4017                                case WCon{False{}, w8}:
4018                                  match w8:
4019                                    case WNil{}:
4020                                      {==}
4021                                case WCon{True{}, w8}:
4022                                  match w8:
4023                                    case WNil{}:
4024                                      {==}
4025                            case WCon{True{}, w7}:
4026                              match w7:
4027                                case WCon{False{}, w8}:
4028                                  match w8:
4029                                    case WNil{}:
4030                                      {==}
4031                                case WCon{True{}, w8}:
4032                                  match w8:
4033                                    case WNil{}:
4034                                      {==}
4035    case WCon{True{}, w1}:
4036      match w1:
4037        case WCon{False{}, w2}:
4038          match w2:
4039            case WCon{False{}, w3}:
4040              match w3:
4041                case WCon{False{}, w4}:
4042                  match w4:
4043                    case WCon{False{}, w5}:
4044                      match w5:
4045                        case WCon{False{}, w6}:
4046                          match w6:
4047                            case WCon{False{}, w7}:
4048                              match w7:
4049                                case WCon{False{}, w8}:
4050                                  match w8:
4051                                    case WNil{}:
4052                                      {==}
4053                                case WCon{True{}, w8}:
4054                                  match w8:
4055                                    case WNil{}:
4056                                      {==}
4057                            case WCon{True{}, w7}:
4058                              match w7:
4059                                case WCon{False{}, w8}:
4060                                  match w8:
4061                                    case WNil{}:
4062                                      {==}
4063                                case WCon{True{}, w8}:
4064                                  match w8:
4065                                    case WNil{}:
4066                                      {==}
4067                        case WCon{True{}, w6}:
4068                          match w6:
4069                            case WCon{False{}, w7}:
4070                              match w7:
4071                                case WCon{False{}, w8}:
4072                                  match w8:
4073                                    case WNil{}:
4074                                      {==}
4075                                case WCon{True{}, w8}:
4076                                  match w8:
4077                                    case WNil{}:
4078                                      {==}
4079                            case WCon{True{}, w7}:
4080                              match w7:
4081                                case WCon{False{}, w8}:
4082                                  match w8:
4083                                    case WNil{}:
4084                                      {==}
4085                                case WCon{True{}, w8}:
4086                                  match w8:
4087                                    case WNil{}:
4088                                      {==}
4089                    case WCon{True{}, w5}:
4090                      match w5:
4091                        case WCon{False{}, w6}:
4092                          match w6:
4093                            case WCon{False{}, w7}:
4094                              match w7:
4095                                case WCon{False{}, w8}:
4096                                  match w8:
4097                                    case WNil{}:
4098                                      {==}
4099                                case WCon{True{}, w8}:
4100                                  match w8:
4101                                    case WNil{}:
4102                                      {==}
4103                            case WCon{True{}, w7}:
4104                              match w7:
4105                                case WCon{False{}, w8}:
4106                                  match w8:
4107                                    case WNil{}:
4108                                      {==}
4109                                case WCon{True{}, w8}:
4110                                  match w8:
4111                                    case WNil{}:
4112                                      {==}
4113                        case WCon{True{}, w6}:
4114                          match w6:
4115                            case WCon{False{}, w7}:
4116                              match w7:
4117                                case WCon{False{}, w8}:
4118                                  match w8:
4119                                    case WNil{}:
4120                                      {==}
4121                                case WCon{True{}, w8}:
4122                                  match w8:
4123                                    case WNil{}:
4124                                      {==}
4125                            case WCon{True{}, w7}:
4126                              match w7:
4127                                case WCon{False{}, w8}:
4128                                  match w8:
4129                                    case WNil{}:
4130                                      {==}
4131                                case WCon{True{}, w8}:
4132                                  match w8:
4133                                    case WNil{}:
4134                                      {==}
4135                case WCon{True{}, w4}:
4136                  match w4:
4137                    case WCon{False{}, w5}:
4138                      match w5:
4139                        case WCon{False{}, w6}:
4140                          match w6:
4141                            case WCon{False{}, w7}:
4142                              match w7:
4143                                case WCon{False{}, w8}:
4144                                  match w8:
4145                                    case WNil{}:
4146                                      {==}
4147                                case WCon{True{}, w8}:
4148                                  match w8:
4149                                    case WNil{}:
4150                                      {==}
4151                            case WCon{True{}, w7}:
4152                              match w7:
4153                                case WCon{False{}, w8}:
4154                                  match w8:
4155                                    case WNil{}:
4156                                      {==}
4157                                case WCon{True{}, w8}:
4158                                  match w8:
4159                                    case WNil{}:
4160                                      {==}
4161                        case WCon{True{}, w6}:
4162                          match w6:
4163                            case WCon{False{}, w7}:
4164                              match w7:
4165                                case WCon{False{}, w8}:
4166                                  match w8:
4167                                    case WNil{}:
4168                                      {==}
4169                                case WCon{True{}, w8}:
4170                                  match w8:
4171                                    case WNil{}:
4172                                      {==}
4173                            case WCon{True{}, w7}:
4174                              match w7:
4175                                case WCon{False{}, w8}:
4176                                  match w8:
4177                                    case WNil{}:
4178                                      {==}
4179                                case WCon{True{}, w8}:
4180                                  match w8:
4181                                    case WNil{}:
4182                                      {==}
4183                    case WCon{True{}, w5}:
4184                      match w5:
4185                        case WCon{False{}, w6}:
4186                          match w6:
4187                            case WCon{False{}, w7}:
4188                              match w7:
4189                                case WCon{False{}, w8}:
4190                                  match w8:
4191                                    case WNil{}:
4192                                      {==}
4193                                case WCon{True{}, w8}:
4194                                  match w8:
4195                                    case WNil{}:
4196                                      {==}
4197                            case WCon{True{}, w7}:
4198                              match w7:
4199                                case WCon{False{}, w8}:
4200                                  match w8:
4201                                    case WNil{}:
4202                                      {==}
4203                                case WCon{True{}, w8}:
4204                                  match w8:
4205                                    case WNil{}:
4206                                      {==}
4207                        case WCon{True{}, w6}:
4208                          match w6:
4209                            case WCon{False{}, w7}:
4210                              match w7:
4211                                case WCon{False{}, w8}:
4212                                  match w8:
4213                                    case WNil{}:
4214                                      {==}
4215                                case WCon{True{}, w8}:
4216                                  match w8:
4217                                    case WNil{}:
4218                                      {==}
4219                            case WCon{True{}, w7}:
4220                              match w7:
4221                                case WCon{False{}, w8}:
4222                                  match w8:
4223                                    case WNil{}:
4224                                      {==}
4225                                case WCon{True{}, w8}:
4226                                  match w8:
4227                                    case WNil{}:
4228                                      {==}
4229            case WCon{True{}, w3}:
4230              match w3:
4231                case WCon{False{}, w4}:
4232                  match w4:
4233                    case WCon{False{}, w5}:
4234                      match w5:
4235                        case WCon{False{}, w6}:
4236                          match w6:
4237                            case WCon{False{}, w7}:
4238                              match w7:
4239                                case WCon{False{}, w8}:
4240                                  match w8:
4241                                    case WNil{}:
4242                                      {==}
4243                                case WCon{True{}, w8}:
4244                                  match w8:
4245                                    case WNil{}:
4246                                      {==}
4247                            case WCon{True{}, w7}:
4248                              match w7:
4249                                case WCon{False{}, w8}:
4250                                  match w8:
4251                                    case WNil{}:
4252                                      {==}
4253                                case WCon{True{}, w8}:
4254                                  match w8:
4255                                    case WNil{}:
4256                                      {==}
4257                        case WCon{True{}, w6}:
4258                          match w6:
4259                            case WCon{False{}, w7}:
4260                              match w7:
4261                                case WCon{False{}, w8}:
4262                                  match w8:
4263                                    case WNil{}:
4264                                      {==}
4265                                case WCon{True{}, w8}:
4266                                  match w8:
4267                                    case WNil{}:
4268                                      {==}
4269                            case WCon{True{}, w7}:
4270                              match w7:
4271                                case WCon{False{}, w8}:
4272                                  match w8:
4273                                    case WNil{}:
4274                                      {==}
4275                                case WCon{True{}, w8}:
4276                                  match w8:
4277                                    case WNil{}:
4278                                      {==}
4279                    case WCon{True{}, w5}:
4280                      match w5:
4281                        case WCon{False{}, w6}:
4282                          match w6:
4283                            case WCon{False{}, w7}:
4284                              match w7:
4285                                case WCon{False{}, w8}:
4286                                  match w8:
4287                                    case WNil{}:
4288                                      {==}
4289                                case WCon{True{}, w8}:
4290                                  match w8:
4291                                    case WNil{}:
4292                                      {==}
4293                            case WCon{True{}, w7}:
4294                              match w7:
4295                                case WCon{False{}, w8}:
4296                                  match w8:
4297                                    case WNil{}:
4298                                      {==}
4299                                case WCon{True{}, w8}:
4300                                  match w8:
4301                                    case WNil{}:
4302                                      {==}
4303                        case WCon{True{}, w6}:
4304                          match w6:
4305                            case WCon{False{}, w7}:
4306                              match w7:
4307                                case WCon{False{}, w8}:
4308                                  match w8:
4309                                    case WNil{}:
4310                                      {==}
4311                                case WCon{True{}, w8}:
4312                                  match w8:
4313                                    case WNil{}:
4314                                      {==}
4315                            case WCon{True{}, w7}:
4316                              match w7:
4317                                case WCon{False{}, w8}:
4318                                  match w8:
4319                                    case WNil{}:
4320                                      {==}
4321                                case WCon{True{}, w8}:
4322                                  match w8:
4323                                    case WNil{}:
4324                                      {==}
4325                case WCon{True{}, w4}:
4326                  match w4:
4327                    case WCon{False{}, w5}:
4328                      match w5:
4329                        case WCon{False{}, w6}:
4330                          match w6:
4331                            case WCon{False{}, w7}:
4332                              match w7:
4333                                case WCon{False{}, w8}:
4334                                  match w8:
4335                                    case WNil{}:
4336                                      {==}
4337                                case WCon{True{}, w8}:
4338                                  match w8:
4339                                    case WNil{}:
4340                                      {==}
4341                            case WCon{True{}, w7}:
4342                              match w7:
4343                                case WCon{False{}, w8}:
4344                                  match w8:
4345                                    case WNil{}:
4346                                      {==}
4347                                case WCon{True{}, w8}:
4348                                  match w8:
4349                                    case WNil{}:
4350                                      {==}
4351                        case WCon{True{}, w6}:
4352                          match w6:
4353                            case WCon{False{}, w7}:
4354                              match w7:
4355                                case WCon{False{}, w8}:
4356                                  match w8:
4357                                    case WNil{}:
4358                                      {==}
4359                                case WCon{True{}, w8}:
4360                                  match w8:
4361                                    case WNil{}:
4362                                      {==}
4363                            case WCon{True{}, w7}:
4364                              match w7:
4365                                case WCon{False{}, w8}:
4366                                  match w8:
4367                                    case WNil{}:
4368                                      {==}
4369                                case WCon{True{}, w8}:
4370                                  match w8:
4371                                    case WNil{}:
4372                                      {==}
4373                    case WCon{True{}, w5}:
4374                      match w5:
4375                        case WCon{False{}, w6}:
4376                          match w6:
4377                            case WCon{False{}, w7}:
4378                              match w7:
4379                                case WCon{False{}, w8}:
4380                                  match w8:
4381                                    case WNil{}:
4382                                      {==}
4383                                case WCon{True{}, w8}:
4384                                  match w8:
4385                                    case WNil{}:
4386                                      {==}
4387                            case WCon{True{}, w7}:
4388                              match w7:
4389                                case WCon{False{}, w8}:
4390                                  match w8:
4391                                    case WNil{}:
4392                                      {==}
4393                                case WCon{True{}, w8}:
4394                                  match w8:
4395                                    case WNil{}:
4396                                      {==}
4397                        case WCon{True{}, w6}:
4398                          match w6:
4399                            case WCon{False{}, w7}:
4400                              match w7:
4401                                case WCon{False{}, w8}:
4402                                  match w8:
4403                                    case WNil{}:
4404                                      {==}
4405                                case WCon{True{}, w8}:
4406                                  match w8:
4407                                    case WNil{}:
4408                                      {==}
4409                            case WCon{True{}, w7}:
4410                              match w7:
4411                                case WCon{False{}, w8}:
4412                                  match w8:
4413                                    case WNil{}:
4414                                      {==}
4415                                case WCon{True{}, w8}:
4416                                  match w8:
4417                                    case WNil{}:
4418                                      {==}
4419        case WCon{True{}, w2}:
4420          match w2:
4421            case WCon{False{}, w3}:
4422              match w3:
4423                case WCon{False{}, w4}:
4424                  match w4:
4425                    case WCon{False{}, w5}:
4426                      match w5:
4427                        case WCon{False{}, w6}:
4428                          match w6:
4429                            case WCon{False{}, w7}:
4430                              match w7:
4431                                case WCon{False{}, w8}:
4432                                  match w8:
4433                                    case WNil{}:
4434                                      {==}
4435                                case WCon{True{}, w8}:
4436                                  match w8:
4437                                    case WNil{}:
4438                                      {==}
4439                            case WCon{True{}, w7}:
4440                              match w7:
4441                                case WCon{False{}, w8}:
4442                                  match w8:
4443                                    case WNil{}:
4444                                      {==}
4445                                case WCon{True{}, w8}:
4446                                  match w8:
4447                                    case WNil{}:
4448                                      {==}
4449                        case WCon{True{}, w6}:
4450                          match w6:
4451                            case WCon{False{}, w7}:
4452                              match w7:
4453                                case WCon{False{}, w8}:
4454                                  match w8:
4455                                    case WNil{}:
4456                                      {==}
4457                                case WCon{True{}, w8}:
4458                                  match w8:
4459                                    case WNil{}:
4460                                      {==}
4461                            case WCon{True{}, w7}:
4462                              match w7:
4463                                case WCon{False{}, w8}:
4464                                  match w8:
4465                                    case WNil{}:
4466                                      {==}
4467                                case WCon{True{}, w8}:
4468                                  match w8:
4469                                    case WNil{}:
4470                                      {==}
4471                    case WCon{True{}, w5}:
4472                      match w5:
4473                        case WCon{False{}, w6}:
4474                          match w6:
4475                            case WCon{False{}, w7}:
4476                              match w7:
4477                                case WCon{False{}, w8}:
4478                                  match w8:
4479                                    case WNil{}:
4480                                      {==}
4481                                case WCon{True{}, w8}:
4482                                  match w8:
4483                                    case WNil{}:
4484                                      {==}
4485                            case WCon{True{}, w7}:
4486                              match w7:
4487                                case WCon{False{}, w8}:
4488                                  match w8:
4489                                    case WNil{}:
4490                                      {==}
4491                                case WCon{True{}, w8}:
4492                                  match w8:
4493                                    case WNil{}:
4494                                      {==}
4495                        case WCon{True{}, w6}:
4496                          match w6:
4497                            case WCon{False{}, w7}:
4498                              match w7:
4499                                case WCon{False{}, w8}:
4500                                  match w8:
4501                                    case WNil{}:
4502                                      {==}
4503                                case WCon{True{}, w8}:
4504                                  match w8:
4505                                    case WNil{}:
4506                                      {==}
4507                            case WCon{True{}, w7}:
4508                              match w7:
4509                                case WCon{False{}, w8}:
4510                                  match w8:
4511                                    case WNil{}:
4512                                      {==}
4513                                case WCon{True{}, w8}:
4514                                  match w8:
4515                                    case WNil{}:
4516                                      {==}
4517                case WCon{True{}, w4}:
4518                  match w4:
4519                    case WCon{False{}, w5}:
4520                      match w5:
4521                        case WCon{False{}, w6}:
4522                          match w6:
4523                            case WCon{False{}, w7}:
4524                              match w7:
4525                                case WCon{False{}, w8}:
4526                                  match w8:
4527                                    case WNil{}:
4528                                      {==}
4529                                case WCon{True{}, w8}:
4530                                  match w8:
4531                                    case WNil{}:
4532                                      {==}
4533                            case WCon{True{}, w7}:
4534                              match w7:
4535                                case WCon{False{}, w8}:
4536                                  match w8:
4537                                    case WNil{}:
4538                                      {==}
4539                                case WCon{True{}, w8}:
4540                                  match w8:
4541                                    case WNil{}:
4542                                      {==}
4543                        case WCon{True{}, w6}:
4544                          match w6:
4545                            case WCon{False{}, w7}:
4546                              match w7:
4547                                case WCon{False{}, w8}:
4548                                  match w8:
4549                                    case WNil{}:
4550                                      {==}
4551                                case WCon{True{}, w8}:
4552                                  match w8:
4553                                    case WNil{}:
4554                                      {==}
4555                            case WCon{True{}, w7}:
4556                              match w7:
4557                                case WCon{False{}, w8}:
4558                                  match w8:
4559                                    case WNil{}:
4560                                      {==}
4561                                case WCon{True{}, w8}:
4562                                  match w8:
4563                                    case WNil{}:
4564                                      {==}
4565                    case WCon{True{}, w5}:
4566                      match w5:
4567                        case WCon{False{}, w6}:
4568                          match w6:
4569                            case WCon{False{}, w7}:
4570                              match w7:
4571                                case WCon{False{}, w8}:
4572                                  match w8:
4573                                    case WNil{}:
4574                                      {==}
4575                                case WCon{True{}, w8}:
4576                                  match w8:
4577                                    case WNil{}:
4578                                      {==}
4579                            case WCon{True{}, w7}:
4580                              match w7:
4581                                case WCon{False{}, w8}:
4582                                  match w8:
4583                                    case WNil{}:
4584                                      {==}
4585                                case WCon{True{}, w8}:
4586                                  match w8:
4587                                    case WNil{}:
4588                                      {==}
4589                        case WCon{True{}, w6}:
4590                          match w6:
4591                            case WCon{False{}, w7}:
4592                              match w7:
4593                                case WCon{False{}, w8}:
4594                                  match w8:
4595                                    case WNil{}:
4596                                      {==}
4597                                case WCon{True{}, w8}:
4598                                  match w8:
4599                                    case WNil{}:
4600                                      {==}
4601                            case WCon{True{}, w7}:
4602                              match w7:
4603                                case WCon{False{}, w8}:
4604                                  match w8:
4605                                    case WNil{}:
4606                                      {==}
4607                                case WCon{True{}, w8}:
4608                                  match w8:
4609                                    case WNil{}:
4610                                      {==}
4611            case WCon{True{}, w3}:
4612              match w3:
4613                case WCon{False{}, w4}:
4614                  match w4:
4615                    case WCon{False{}, w5}:
4616                      match w5:
4617                        case WCon{False{}, w6}:
4618                          match w6:
4619                            case WCon{False{}, w7}:
4620                              match w7:
4621                                case WCon{False{}, w8}:
4622                                  match w8:
4623                                    case WNil{}:
4624                                      {==}
4625                                case WCon{True{}, w8}:
4626                                  match w8:
4627                                    case WNil{}:
4628                                      {==}
4629                            case WCon{True{}, w7}:
4630                              match w7:
4631                                case WCon{False{}, w8}:
4632                                  match w8:
4633                                    case WNil{}:
4634                                      {==}
4635                                case WCon{True{}, w8}:
4636                                  match w8:
4637                                    case WNil{}:
4638                                      {==}
4639                        case WCon{True{}, w6}:
4640                          match w6:
4641                            case WCon{False{}, w7}:
4642                              match w7:
4643                                case WCon{False{}, w8}:
4644                                  match w8:
4645                                    case WNil{}:
4646                                      {==}
4647                                case WCon{True{}, w8}:
4648                                  match w8:
4649                                    case WNil{}:
4650                                      {==}
4651                            case WCon{True{}, w7}:
4652                              match w7:
4653                                case WCon{False{}, w8}:
4654                                  match w8:
4655                                    case WNil{}:
4656                                      {==}
4657                                case WCon{True{}, w8}:
4658                                  match w8:
4659                                    case WNil{}:
4660                                      {==}
4661                    case WCon{True{}, w5}:
4662                      match w5:
4663                        case WCon{False{}, w6}:
4664                          match w6:
4665                            case WCon{False{}, w7}:
4666                              match w7:
4667                                case WCon{False{}, w8}:
4668                                  match w8:
4669                                    case WNil{}:
4670                                      {==}
4671                                case WCon{True{}, w8}:
4672                                  match w8:
4673                                    case WNil{}:
4674                                      {==}
4675                            case WCon{True{}, w7}:
4676                              match w7:
4677                                case WCon{False{}, w8}:
4678                                  match w8:
4679                                    case WNil{}:
4680                                      {==}
4681                                case WCon{True{}, w8}:
4682                                  match w8:
4683                                    case WNil{}:
4684                                      {==}
4685                        case WCon{True{}, w6}:
4686                          match w6:
4687                            case WCon{False{}, w7}:
4688                              match w7:
4689                                case WCon{False{}, w8}:
4690                                  match w8:
4691                                    case WNil{}:
4692                                      {==}
4693                                case WCon{True{}, w8}:
4694                                  match w8:
4695                                    case WNil{}:
4696                                      {==}
4697                            case WCon{True{}, w7}:
4698                              match w7:
4699                                case WCon{False{}, w8}:
4700                                  match w8:
4701                                    case WNil{}:
4702                                      {==}
4703                                case WCon{True{}, w8}:
4704                                  match w8:
4705                                    case WNil{}:
4706                                      {==}
4707                case WCon{True{}, w4}:
4708                  match w4:
4709                    case WCon{False{}, w5}:
4710                      match w5:
4711                        case WCon{False{}, w6}:
4712                          match w6:
4713                            case WCon{False{}, w7}:
4714                              match w7:
4715                                case WCon{False{}, w8}:
4716                                  match w8:
4717                                    case WNil{}:
4718                                      {==}
4719                                case WCon{True{}, w8}:
4720                                  match w8:
4721                                    case WNil{}:
4722                                      {==}
4723                            case WCon{True{}, w7}:
4724                              match w7:
4725                                case WCon{False{}, w8}:
4726                                  match w8:
4727                                    case WNil{}:
4728                                      {==}
4729                                case WCon{True{}, w8}:
4730                                  match w8:
4731                                    case WNil{}:
4732                                      {==}
4733                        case WCon{True{}, w6}:
4734                          match w6:
4735                            case WCon{False{}, w7}:
4736                              match w7:
4737                                case WCon{False{}, w8}:
4738                                  match w8:
4739                                    case WNil{}:
4740                                      {==}
4741                                case WCon{True{}, w8}:
4742                                  match w8:
4743                                    case WNil{}:
4744                                      {==}
4745                            case WCon{True{}, w7}:
4746                              match w7:
4747                                case WCon{False{}, w8}:
4748                                  match w8:
4749                                    case WNil{}:
4750                                      {==}
4751                                case WCon{True{}, w8}:
4752                                  match w8:
4753                                    case WNil{}:
4754                                      {==}
4755                    case WCon{True{}, w5}:
4756                      match w5:
4757                        case WCon{False{}, w6}:
4758                          match w6:
4759                            case WCon{False{}, w7}:
4760                              match w7:
4761                                case WCon{False{}, w8}:
4762                                  match w8:
4763                                    case WNil{}:
4764                                      {==}
4765                                case WCon{True{}, w8}:
4766                                  match w8:
4767                                    case WNil{}:
4768                                      {==}
4769                            case WCon{True{}, w7}:
4770                              match w7:
4771                                case WCon{False{}, w8}:
4772                                  match w8:
4773                                    case WNil{}:
4774                                      {==}
4775                                case WCon{True{}, w8}:
4776                                  match w8:
4777                                    case WNil{}:
4778                                      {==}
4779                        case WCon{True{}, w6}:
4780                          match w6:
4781                            case WCon{False{}, w7}:
4782                              match w7:
4783                                case WCon{False{}, w8}:
4784                                  match w8:
4785                                    case WNil{}:
4786                                      {==}
4787                                case WCon{True{}, w8}:
4788                                  match w8:
4789                                    case WNil{}:
4790                                      {==}
4791                            case WCon{True{}, w7}:
4792                              match w7:
4793                                case WCon{False{}, w8}:
4794                                  match w8:
4795                                    case WNil{}:
4796                                      {==}
4797                                case WCon{True{}, w8}:
4798                                  match w8:
4799                                    case WNil{}:
4800                                      {==}
4801
4802def aria_sb42(w0: Word(8n)) -> {w0 == A.aria.sb4(A.aria.sb2(w0)) : Word(8n)}:
4803  match w0:
4804    case WCon{False{}, w1}:
4805      match w1:
4806        case WCon{False{}, w2}:
4807          match w2:
4808            case WCon{False{}, w3}:
4809              match w3:
4810                case WCon{False{}, w4}:
4811                  match w4:
4812                    case WCon{False{}, w5}:
4813                      match w5:
4814                        case WCon{False{}, w6}:
4815                          match w6:
4816                            case WCon{False{}, w7}:
4817                              match w7:
4818                                case WCon{False{}, w8}:
4819                                  match w8:
4820                                    case WNil{}:
4821                                      {==}
4822                                case WCon{True{}, w8}:
4823                                  match w8:
4824                                    case WNil{}:
4825                                      {==}
4826                            case WCon{True{}, w7}:
4827                              match w7:
4828                                case WCon{False{}, w8}:
4829                                  match w8:
4830                                    case WNil{}:
4831                                      {==}
4832                                case WCon{True{}, w8}:
4833                                  match w8:
4834                                    case WNil{}:
4835                                      {==}
4836                        case WCon{True{}, w6}:
4837                          match w6:
4838                            case WCon{False{}, w7}:
4839                              match w7:
4840                                case WCon{False{}, w8}:
4841                                  match w8:
4842                                    case WNil{}:
4843                                      {==}
4844                                case WCon{True{}, w8}:
4845                                  match w8:
4846                                    case WNil{}:
4847                                      {==}
4848                            case WCon{True{}, w7}:
4849                              match w7:
4850                                case WCon{False{}, w8}:
4851                                  match w8:
4852                                    case WNil{}:
4853                                      {==}
4854                                case WCon{True{}, w8}:
4855                                  match w8:
4856                                    case WNil{}:
4857                                      {==}
4858                    case WCon{True{}, w5}:
4859                      match w5:
4860                        case WCon{False{}, w6}:
4861                          match w6:
4862                            case WCon{False{}, w7}:
4863                              match w7:
4864                                case WCon{False{}, w8}:
4865                                  match w8:
4866                                    case WNil{}:
4867                                      {==}
4868                                case WCon{True{}, w8}:
4869                                  match w8:
4870                                    case WNil{}:
4871                                      {==}
4872                            case WCon{True{}, w7}:
4873                              match w7:
4874                                case WCon{False{}, w8}:
4875                                  match w8:
4876                                    case WNil{}:
4877                                      {==}
4878                                case WCon{True{}, w8}:
4879                                  match w8:
4880                                    case WNil{}:
4881                                      {==}
4882                        case WCon{True{}, w6}:
4883                          match w6:
4884                            case WCon{False{}, w7}:
4885                              match w7:
4886                                case WCon{False{}, w8}:
4887                                  match w8:
4888                                    case WNil{}:
4889                                      {==}
4890                                case WCon{True{}, w8}:
4891                                  match w8:
4892                                    case WNil{}:
4893                                      {==}
4894                            case WCon{True{}, w7}:
4895                              match w7:
4896                                case WCon{False{}, w8}:
4897                                  match w8:
4898                                    case WNil{}:
4899                                      {==}
4900                                case WCon{True{}, w8}:
4901                                  match w8:
4902                                    case WNil{}:
4903                                      {==}
4904                case WCon{True{}, w4}:
4905                  match w4:
4906                    case WCon{False{}, w5}:
4907                      match w5:
4908                        case WCon{False{}, w6}:
4909                          match w6:
4910                            case WCon{False{}, w7}:
4911                              match w7:
4912                                case WCon{False{}, w8}:
4913                                  match w8:
4914                                    case WNil{}:
4915                                      {==}
4916                                case WCon{True{}, w8}:
4917                                  match w8:
4918                                    case WNil{}:
4919                                      {==}
4920                            case WCon{True{}, w7}:
4921                              match w7:
4922                                case WCon{False{}, w8}:
4923                                  match w8:
4924                                    case WNil{}:
4925                                      {==}
4926                                case WCon{True{}, w8}:
4927                                  match w8:
4928                                    case WNil{}:
4929                                      {==}
4930                        case WCon{True{}, w6}:
4931                          match w6:
4932                            case WCon{False{}, w7}:
4933                              match w7:
4934                                case WCon{False{}, w8}:
4935                                  match w8:
4936                                    case WNil{}:
4937                                      {==}
4938                                case WCon{True{}, w8}:
4939                                  match w8:
4940                                    case WNil{}:
4941                                      {==}
4942                            case WCon{True{}, w7}:
4943                              match w7:
4944                                case WCon{False{}, w8}:
4945                                  match w8:
4946                                    case WNil{}:
4947                                      {==}
4948                                case WCon{True{}, w8}:
4949                                  match w8:
4950                                    case WNil{}:
4951                                      {==}
4952                    case WCon{True{}, w5}:
4953                      match w5:
4954                        case WCon{False{}, w6}:
4955                          match w6:
4956                            case WCon{False{}, w7}:
4957                              match w7:
4958                                case WCon{False{}, w8}:
4959                                  match w8:
4960                                    case WNil{}:
4961                                      {==}
4962                                case WCon{True{}, w8}:
4963                                  match w8:
4964                                    case WNil{}:
4965                                      {==}
4966                            case WCon{True{}, w7}:
4967                              match w7:
4968                                case WCon{False{}, w8}:
4969                                  match w8:
4970                                    case WNil{}:
4971                                      {==}
4972                                case WCon{True{}, w8}:
4973                                  match w8:
4974                                    case WNil{}:
4975                                      {==}
4976                        case WCon{True{}, w6}:
4977                          match w6:
4978                            case WCon{False{}, w7}:
4979                              match w7:
4980                                case WCon{False{}, w8}:
4981                                  match w8:
4982                                    case WNil{}:
4983                                      {==}
4984                                case WCon{True{}, w8}:
4985                                  match w8:
4986                                    case WNil{}:
4987                                      {==}
4988                            case WCon{True{}, w7}:
4989                              match w7:
4990                                case WCon{False{}, w8}:
4991                                  match w8:
4992                                    case WNil{}:
4993                                      {==}
4994                                case WCon{True{}, w8}:
4995                                  match w8:
4996                                    case WNil{}:
4997                                      {==}
4998            case WCon{True{}, w3}:
4999              match w3:
5000                case WCon{False{}, w4}:
5001                  match w4:
5002                    case WCon{False{}, w5}:
5003                      match w5:
5004                        case WCon{False{}, w6}:
5005                          match w6:
5006                            case WCon{False{}, w7}:
5007                              match w7:
5008                                case WCon{False{}, w8}:
5009                                  match w8:
5010                                    case WNil{}:
5011                                      {==}
5012                                case WCon{True{}, w8}:
5013                                  match w8:
5014                                    case WNil{}:
5015                                      {==}
5016                            case WCon{True{}, w7}:
5017                              match w7:
5018                                case WCon{False{}, w8}:
5019                                  match w8:
5020                                    case WNil{}:
5021                                      {==}
5022                                case WCon{True{}, w8}:
5023                                  match w8:
5024                                    case WNil{}:
5025                                      {==}
5026                        case WCon{True{}, w6}:
5027                          match w6:
5028                            case WCon{False{}, w7}:
5029                              match w7:
5030                                case WCon{False{}, w8}:
5031                                  match w8:
5032                                    case WNil{}:
5033                                      {==}
5034                                case WCon{True{}, w8}:
5035                                  match w8:
5036                                    case WNil{}:
5037                                      {==}
5038                            case WCon{True{}, w7}:
5039                              match w7:
5040                                case WCon{False{}, w8}:
5041                                  match w8:
5042                                    case WNil{}:
5043                                      {==}
5044                                case WCon{True{}, w8}:
5045                                  match w8:
5046                                    case WNil{}:
5047                                      {==}
5048                    case WCon{True{}, w5}:
5049                      match w5:
5050                        case WCon{False{}, w6}:
5051                          match w6:
5052                            case WCon{False{}, w7}:
5053                              match w7:
5054                                case WCon{False{}, w8}:
5055                                  match w8:
5056                                    case WNil{}:
5057                                      {==}
5058                                case WCon{True{}, w8}:
5059                                  match w8:
5060                                    case WNil{}:
5061                                      {==}
5062                            case WCon{True{}, w7}:
5063                              match w7:
5064                                case WCon{False{}, w8}:
5065                                  match w8:
5066                                    case WNil{}:
5067                                      {==}
5068                                case WCon{True{}, w8}:
5069                                  match w8:
5070                                    case WNil{}:
5071                                      {==}
5072                        case WCon{True{}, w6}:
5073                          match w6:
5074                            case WCon{False{}, w7}:
5075                              match w7:
5076                                case WCon{False{}, w8}:
5077                                  match w8:
5078                                    case WNil{}:
5079                                      {==}
5080                                case WCon{True{}, w8}:
5081                                  match w8:
5082                                    case WNil{}:
5083                                      {==}
5084                            case WCon{True{}, w7}:
5085                              match w7:
5086                                case WCon{False{}, w8}:
5087                                  match w8:
5088                                    case WNil{}:
5089                                      {==}
5090                                case WCon{True{}, w8}:
5091                                  match w8:
5092                                    case WNil{}:
5093                                      {==}
5094                case WCon{True{}, w4}:
5095                  match w4:
5096                    case WCon{False{}, w5}:
5097                      match w5:
5098                        case WCon{False{}, w6}:
5099                          match w6:
5100                            case WCon{False{}, w7}:
5101                              match w7:
5102                                case WCon{False{}, w8}:
5103                                  match w8:
5104                                    case WNil{}:
5105                                      {==}
5106                                case WCon{True{}, w8}:
5107                                  match w8:
5108                                    case WNil{}:
5109                                      {==}
5110                            case WCon{True{}, w7}:
5111                              match w7:
5112                                case WCon{False{}, w8}:
5113                                  match w8:
5114                                    case WNil{}:
5115                                      {==}
5116                                case WCon{True{}, w8}:
5117                                  match w8:
5118                                    case WNil{}:
5119                                      {==}
5120                        case WCon{True{}, w6}:
5121                          match w6:
5122                            case WCon{False{}, w7}:
5123                              match w7:
5124                                case WCon{False{}, w8}:
5125                                  match w8:
5126                                    case WNil{}:
5127                                      {==}
5128                                case WCon{True{}, w8}:
5129                                  match w8:
5130                                    case WNil{}:
5131                                      {==}
5132                            case WCon{True{}, w7}:
5133                              match w7:
5134                                case WCon{False{}, w8}:
5135                                  match w8:
5136                                    case WNil{}:
5137                                      {==}
5138                                case WCon{True{}, w8}:
5139                                  match w8:
5140                                    case WNil{}:
5141                                      {==}
5142                    case WCon{True{}, w5}:
5143                      match w5:
5144                        case WCon{False{}, w6}:
5145                          match w6:
5146                            case WCon{False{}, w7}:
5147                              match w7:
5148                                case WCon{False{}, w8}:
5149                                  match w8:
5150                                    case WNil{}:
5151                                      {==}
5152                                case WCon{True{}, w8}:
5153                                  match w8:
5154                                    case WNil{}:
5155                                      {==}
5156                            case WCon{True{}, w7}:
5157                              match w7:
5158                                case WCon{False{}, w8}:
5159                                  match w8:
5160                                    case WNil{}:
5161                                      {==}
5162                                case WCon{True{}, w8}:
5163                                  match w8:
5164                                    case WNil{}:
5165                                      {==}
5166                        case WCon{True{}, w6}:
5167                          match w6:
5168                            case WCon{False{}, w7}:
5169                              match w7:
5170                                case WCon{False{}, w8}:
5171                                  match w8:
5172                                    case WNil{}:
5173                                      {==}
5174                                case WCon{True{}, w8}:
5175                                  match w8:
5176                                    case WNil{}:
5177                                      {==}
5178                            case WCon{True{}, w7}:
5179                              match w7:
5180                                case WCon{False{}, w8}:
5181                                  match w8:
5182                                    case WNil{}:
5183                                      {==}
5184                                case WCon{True{}, w8}:
5185                                  match w8:
5186                                    case WNil{}:
5187                                      {==}
5188        case WCon{True{}, w2}:
5189          match w2:
5190            case WCon{False{}, w3}:
5191              match w3:
5192                case WCon{False{}, w4}:
5193                  match w4:
5194                    case WCon{False{}, w5}:
5195                      match w5:
5196                        case WCon{False{}, w6}:
5197                          match w6:
5198                            case WCon{False{}, w7}:
5199                              match w7:
5200                                case WCon{False{}, w8}:
5201                                  match w8:
5202                                    case WNil{}:
5203                                      {==}
5204                                case WCon{True{}, w8}:
5205                                  match w8:
5206                                    case WNil{}:
5207                                      {==}
5208                            case WCon{True{}, w7}:
5209                              match w7:
5210                                case WCon{False{}, w8}:
5211                                  match w8:
5212                                    case WNil{}:
5213                                      {==}
5214                                case WCon{True{}, w8}:
5215                                  match w8:
5216                                    case WNil{}:
5217                                      {==}
5218                        case WCon{True{}, w6}:
5219                          match w6:
5220                            case WCon{False{}, w7}:
5221                              match w7:
5222                                case WCon{False{}, w8}:
5223                                  match w8:
5224                                    case WNil{}:
5225                                      {==}
5226                                case WCon{True{}, w8}:
5227                                  match w8:
5228                                    case WNil{}:
5229                                      {==}
5230                            case WCon{True{}, w7}:
5231                              match w7:
5232                                case WCon{False{}, w8}:
5233                                  match w8:
5234                                    case WNil{}:
5235                                      {==}
5236                                case WCon{True{}, w8}:
5237                                  match w8:
5238                                    case WNil{}:
5239                                      {==}
5240                    case WCon{True{}, w5}:
5241                      match w5:
5242                        case WCon{False{}, w6}:
5243                          match w6:
5244                            case WCon{False{}, w7}:
5245                              match w7:
5246                                case WCon{False{}, w8}:
5247                                  match w8:
5248                                    case WNil{}:
5249                                      {==}
5250                                case WCon{True{}, w8}:
5251                                  match w8:
5252                                    case WNil{}:
5253                                      {==}
5254                            case WCon{True{}, w7}:
5255                              match w7:
5256                                case WCon{False{}, w8}:
5257                                  match w8:
5258                                    case WNil{}:
5259                                      {==}
5260                                case WCon{True{}, w8}:
5261                                  match w8:
5262                                    case WNil{}:
5263                                      {==}
5264                        case WCon{True{}, w6}:
5265                          match w6:
5266                            case WCon{False{}, w7}:
5267                              match w7:
5268                                case WCon{False{}, w8}:
5269                                  match w8:
5270                                    case WNil{}:
5271                                      {==}
5272                                case WCon{True{}, w8}:
5273                                  match w8:
5274                                    case WNil{}:
5275                                      {==}
5276                            case WCon{True{}, w7}:
5277                              match w7:
5278                                case WCon{False{}, w8}:
5279                                  match w8:
5280                                    case WNil{}:
5281                                      {==}
5282                                case WCon{True{}, w8}:
5283                                  match w8:
5284                                    case WNil{}:
5285                                      {==}
5286                case WCon{True{}, w4}:
5287                  match w4:
5288                    case WCon{False{}, w5}:
5289                      match w5:
5290                        case WCon{False{}, w6}:
5291                          match w6:
5292                            case WCon{False{}, w7}:
5293                              match w7:
5294                                case WCon{False{}, w8}:
5295                                  match w8:
5296                                    case WNil{}:
5297                                      {==}
5298                                case WCon{True{}, w8}:
5299                                  match w8:
5300                                    case WNil{}:
5301                                      {==}
5302                            case WCon{True{}, w7}:
5303                              match w7:
5304                                case WCon{False{}, w8}:
5305                                  match w8:
5306                                    case WNil{}:
5307                                      {==}
5308                                case WCon{True{}, w8}:
5309                                  match w8:
5310                                    case WNil{}:
5311                                      {==}
5312                        case WCon{True{}, w6}:
5313                          match w6:
5314                            case WCon{False{}, w7}:
5315                              match w7:
5316                                case WCon{False{}, w8}:
5317                                  match w8:
5318                                    case WNil{}:
5319                                      {==}
5320                                case WCon{True{}, w8}:
5321                                  match w8:
5322                                    case WNil{}:
5323                                      {==}
5324                            case WCon{True{}, w7}:
5325                              match w7:
5326                                case WCon{False{}, w8}:
5327                                  match w8:
5328                                    case WNil{}:
5329                                      {==}
5330                                case WCon{True{}, w8}:
5331                                  match w8:
5332                                    case WNil{}:
5333                                      {==}
5334                    case WCon{True{}, w5}:
5335                      match w5:
5336                        case WCon{False{}, w6}:
5337                          match w6:
5338                            case WCon{False{}, w7}:
5339                              match w7:
5340                                case WCon{False{}, w8}:
5341                                  match w8:
5342                                    case WNil{}:
5343                                      {==}
5344                                case WCon{True{}, w8}:
5345                                  match w8:
5346                                    case WNil{}:
5347                                      {==}
5348                            case WCon{True{}, w7}:
5349                              match w7:
5350                                case WCon{False{}, w8}:
5351                                  match w8:
5352                                    case WNil{}:
5353                                      {==}
5354                                case WCon{True{}, w8}:
5355                                  match w8:
5356                                    case WNil{}:
5357                                      {==}
5358                        case WCon{True{}, w6}:
5359                          match w6:
5360                            case WCon{False{}, w7}:
5361                              match w7:
5362                                case WCon{False{}, w8}:
5363                                  match w8:
5364                                    case WNil{}:
5365                                      {==}
5366                                case WCon{True{}, w8}:
5367                                  match w8:
5368                                    case WNil{}:
5369                                      {==}
5370                            case WCon{True{}, w7}:
5371                              match w7:
5372                                case WCon{False{}, w8}:
5373                                  match w8:
5374                                    case WNil{}:
5375                                      {==}
5376                                case WCon{True{}, w8}:
5377                                  match w8:
5378                                    case WNil{}:
5379                                      {==}
5380            case WCon{True{}, w3}:
5381              match w3:
5382                case WCon{False{}, w4}:
5383                  match w4:
5384                    case WCon{False{}, w5}:
5385                      match w5:
5386                        case WCon{False{}, w6}:
5387                          match w6:
5388                            case WCon{False{}, w7}:
5389                              match w7:
5390                                case WCon{False{}, w8}:
5391                                  match w8:
5392                                    case WNil{}:
5393                                      {==}
5394                                case WCon{True{}, w8}:
5395                                  match w8:
5396                                    case WNil{}:
5397                                      {==}
5398                            case WCon{True{}, w7}:
5399                              match w7:
5400                                case WCon{False{}, w8}:
5401                                  match w8:
5402                                    case WNil{}:
5403                                      {==}
5404                                case WCon{True{}, w8}:
5405                                  match w8:
5406                                    case WNil{}:
5407                                      {==}
5408                        case WCon{True{}, w6}:
5409                          match w6:
5410                            case WCon{False{}, w7}:
5411                              match w7:
5412                                case WCon{False{}, w8}:
5413                                  match w8:
5414                                    case WNil{}:
5415                                      {==}
5416                                case WCon{True{}, w8}:
5417                                  match w8:
5418                                    case WNil{}:
5419                                      {==}
5420                            case WCon{True{}, w7}:
5421                              match w7:
5422                                case WCon{False{}, w8}:
5423                                  match w8:
5424                                    case WNil{}:
5425                                      {==}
5426                                case WCon{True{}, w8}:
5427                                  match w8:
5428                                    case WNil{}:
5429                                      {==}
5430                    case WCon{True{}, w5}:
5431                      match w5:
5432                        case WCon{False{}, w6}:
5433                          match w6:
5434                            case WCon{False{}, w7}:
5435                              match w7:
5436                                case WCon{False{}, w8}:
5437                                  match w8:
5438                                    case WNil{}:
5439                                      {==}
5440                                case WCon{True{}, w8}:
5441                                  match w8:
5442                                    case WNil{}:
5443                                      {==}
5444                            case WCon{True{}, w7}:
5445                              match w7:
5446                                case WCon{False{}, w8}:
5447                                  match w8:
5448                                    case WNil{}:
5449                                      {==}
5450                                case WCon{True{}, w8}:
5451                                  match w8:
5452                                    case WNil{}:
5453                                      {==}
5454                        case WCon{True{}, w6}:
5455                          match w6:
5456                            case WCon{False{}, w7}:
5457                              match w7:
5458                                case WCon{False{}, w8}:
5459                                  match w8:
5460                                    case WNil{}:
5461                                      {==}
5462                                case WCon{True{}, w8}:
5463                                  match w8:
5464                                    case WNil{}:
5465                                      {==}
5466                            case WCon{True{}, w7}:
5467                              match w7:
5468                                case WCon{False{}, w8}:
5469                                  match w8:
5470                                    case WNil{}:
5471                                      {==}
5472                                case WCon{True{}, w8}:
5473                                  match w8:
5474                                    case WNil{}:
5475                                      {==}
5476                case WCon{True{}, w4}:
5477                  match w4:
5478                    case WCon{False{}, w5}:
5479                      match w5:
5480                        case WCon{False{}, w6}:
5481                          match w6:
5482                            case WCon{False{}, w7}:
5483                              match w7:
5484                                case WCon{False{}, w8}:
5485                                  match w8:
5486                                    case WNil{}:
5487                                      {==}
5488                                case WCon{True{}, w8}:
5489                                  match w8:
5490                                    case WNil{}:
5491                                      {==}
5492                            case WCon{True{}, w7}:
5493                              match w7:
5494                                case WCon{False{}, w8}:
5495                                  match w8:
5496                                    case WNil{}:
5497                                      {==}
5498                                case WCon{True{}, w8}:
5499                                  match w8:
5500                                    case WNil{}:
5501                                      {==}
5502                        case WCon{True{}, w6}:
5503                          match w6:
5504                            case WCon{False{}, w7}:
5505                              match w7:
5506                                case WCon{False{}, w8}:
5507                                  match w8:
5508                                    case WNil{}:
5509                                      {==}
5510                                case WCon{True{}, w8}:
5511                                  match w8:
5512                                    case WNil{}:
5513                                      {==}
5514                            case WCon{True{}, w7}:
5515                              match w7:
5516                                case WCon{False{}, w8}:
5517                                  match w8:
5518                                    case WNil{}:
5519                                      {==}
5520                                case WCon{True{}, w8}:
5521                                  match w8:
5522                                    case WNil{}:
5523                                      {==}
5524                    case WCon{True{}, w5}:
5525                      match w5:
5526                        case WCon{False{}, w6}:
5527                          match w6:
5528                            case WCon{False{}, w7}:
5529                              match w7:
5530                                case WCon{False{}, w8}:
5531                                  match w8:
5532                                    case WNil{}:
5533                                      {==}
5534                                case WCon{True{}, w8}:
5535                                  match w8:
5536                                    case WNil{}:
5537                                      {==}
5538                            case WCon{True{}, w7}:
5539                              match w7:
5540                                case WCon{False{}, w8}:
5541                                  match w8:
5542                                    case WNil{}:
5543                                      {==}
5544                                case WCon{True{}, w8}:
5545                                  match w8:
5546                                    case WNil{}:
5547                                      {==}
5548                        case WCon{True{}, w6}:
5549                          match w6:
5550                            case WCon{False{}, w7}:
5551                              match w7:
5552                                case WCon{False{}, w8}:
5553                                  match w8:
5554                                    case WNil{}:
5555                                      {==}
5556                                case WCon{True{}, w8}:
5557                                  match w8:
5558                                    case WNil{}:
5559                                      {==}
5560                            case WCon{True{}, w7}:
5561                              match w7:
5562                                case WCon{False{}, w8}:
5563                                  match w8:
5564                                    case WNil{}:
5565                                      {==}
5566                                case WCon{True{}, w8}:
5567                                  match w8:
5568                                    case WNil{}:
5569                                      {==}
5570    case WCon{True{}, w1}:
5571      match w1:
5572        case WCon{False{}, w2}:
5573          match w2:
5574            case WCon{False{}, w3}:
5575              match w3:
5576                case WCon{False{}, w4}:
5577                  match w4:
5578                    case WCon{False{}, w5}:
5579                      match w5:
5580                        case WCon{False{}, w6}:
5581                          match w6:
5582                            case WCon{False{}, w7}:
5583                              match w7:
5584                                case WCon{False{}, w8}:
5585                                  match w8:
5586                                    case WNil{}:
5587                                      {==}
5588                                case WCon{True{}, w8}:
5589                                  match w8:
5590                                    case WNil{}:
5591                                      {==}
5592                            case WCon{True{}, w7}:
5593                              match w7:
5594                                case WCon{False{}, w8}:
5595                                  match w8:
5596                                    case WNil{}:
5597                                      {==}
5598                                case WCon{True{}, w8}:
5599                                  match w8:
5600                                    case WNil{}:
5601                                      {==}
5602                        case WCon{True{}, w6}:
5603                          match w6:
5604                            case WCon{False{}, w7}:
5605                              match w7:
5606                                case WCon{False{}, w8}:
5607                                  match w8:
5608                                    case WNil{}:
5609                                      {==}
5610                                case WCon{True{}, w8}:
5611                                  match w8:
5612                                    case WNil{}:
5613                                      {==}
5614                            case WCon{True{}, w7}:
5615                              match w7:
5616                                case WCon{False{}, w8}:
5617                                  match w8:
5618                                    case WNil{}:
5619                                      {==}
5620                                case WCon{True{}, w8}:
5621                                  match w8:
5622                                    case WNil{}:
5623                                      {==}
5624                    case WCon{True{}, w5}:
5625                      match w5:
5626                        case WCon{False{}, w6}:
5627                          match w6:
5628                            case WCon{False{}, w7}:
5629                              match w7:
5630                                case WCon{False{}, w8}:
5631                                  match w8:
5632                                    case WNil{}:
5633                                      {==}
5634                                case WCon{True{}, w8}:
5635                                  match w8:
5636                                    case WNil{}:
5637                                      {==}
5638                            case WCon{True{}, w7}:
5639                              match w7:
5640                                case WCon{False{}, w8}:
5641                                  match w8:
5642                                    case WNil{}:
5643                                      {==}
5644                                case WCon{True{}, w8}:
5645                                  match w8:
5646                                    case WNil{}:
5647                                      {==}
5648                        case WCon{True{}, w6}:
5649                          match w6:
5650                            case WCon{False{}, w7}:
5651                              match w7:
5652                                case WCon{False{}, w8}:
5653                                  match w8:
5654                                    case WNil{}:
5655                                      {==}
5656                                case WCon{True{}, w8}:
5657                                  match w8:
5658                                    case WNil{}:
5659                                      {==}
5660                            case WCon{True{}, w7}:
5661                              match w7:
5662                                case WCon{False{}, w8}:
5663                                  match w8:
5664                                    case WNil{}:
5665                                      {==}
5666                                case WCon{True{}, w8}:
5667                                  match w8:
5668                                    case WNil{}:
5669                                      {==}
5670                case WCon{True{}, w4}:
5671                  match w4:
5672                    case WCon{False{}, w5}:
5673                      match w5:
5674                        case WCon{False{}, w6}:
5675                          match w6:
5676                            case WCon{False{}, w7}:
5677                              match w7:
5678                                case WCon{False{}, w8}:
5679                                  match w8:
5680                                    case WNil{}:
5681                                      {==}
5682                                case WCon{True{}, w8}:
5683                                  match w8:
5684                                    case WNil{}:
5685                                      {==}
5686                            case WCon{True{}, w7}:
5687                              match w7:
5688                                case WCon{False{}, w8}:
5689                                  match w8:
5690                                    case WNil{}:
5691                                      {==}
5692                                case WCon{True{}, w8}:
5693                                  match w8:
5694                                    case WNil{}:
5695                                      {==}
5696                        case WCon{True{}, w6}:
5697                          match w6:
5698                            case WCon{False{}, w7}:
5699                              match w7:
5700                                case WCon{False{}, w8}:
5701                                  match w8:
5702                                    case WNil{}:
5703                                      {==}
5704                                case WCon{True{}, w8}:
5705                                  match w8:
5706                                    case WNil{}:
5707                                      {==}
5708                            case WCon{True{}, w7}:
5709                              match w7:
5710                                case WCon{False{}, w8}:
5711                                  match w8:
5712                                    case WNil{}:
5713                                      {==}
5714                                case WCon{True{}, w8}:
5715                                  match w8:
5716                                    case WNil{}:
5717                                      {==}
5718                    case WCon{True{}, w5}:
5719                      match w5:
5720                        case WCon{False{}, w6}:
5721                          match w6:
5722                            case WCon{False{}, w7}:
5723                              match w7:
5724                                case WCon{False{}, w8}:
5725                                  match w8:
5726                                    case WNil{}:
5727                                      {==}
5728                                case WCon{True{}, w8}:
5729                                  match w8:
5730                                    case WNil{}:
5731                                      {==}
5732                            case WCon{True{}, w7}:
5733                              match w7:
5734                                case WCon{False{}, w8}:
5735                                  match w8:
5736                                    case WNil{}:
5737                                      {==}
5738                                case WCon{True{}, w8}:
5739                                  match w8:
5740                                    case WNil{}:
5741                                      {==}
5742                        case WCon{True{}, w6}:
5743                          match w6:
5744                            case WCon{False{}, w7}:
5745                              match w7:
5746                                case WCon{False{}, w8}:
5747                                  match w8:
5748                                    case WNil{}:
5749                                      {==}
5750                                case WCon{True{}, w8}:
5751                                  match w8:
5752                                    case WNil{}:
5753                                      {==}
5754                            case WCon{True{}, w7}:
5755                              match w7:
5756                                case WCon{False{}, w8}:
5757                                  match w8:
5758                                    case WNil{}:
5759                                      {==}
5760                                case WCon{True{}, w8}:
5761                                  match w8:
5762                                    case WNil{}:
5763                                      {==}
5764            case WCon{True{}, w3}:
5765              match w3:
5766                case WCon{False{}, w4}:
5767                  match w4:
5768                    case WCon{False{}, w5}:
5769                      match w5:
5770                        case WCon{False{}, w6}:
5771                          match w6:
5772                            case WCon{False{}, w7}:
5773                              match w7:
5774                                case WCon{False{}, w8}:
5775                                  match w8:
5776                                    case WNil{}:
5777                                      {==}
5778                                case WCon{True{}, w8}:
5779                                  match w8:
5780                                    case WNil{}:
5781                                      {==}
5782                            case WCon{True{}, w7}:
5783                              match w7:
5784                                case WCon{False{}, w8}:
5785                                  match w8:
5786                                    case WNil{}:
5787                                      {==}
5788                                case WCon{True{}, w8}:
5789                                  match w8:
5790                                    case WNil{}:
5791                                      {==}
5792                        case WCon{True{}, w6}:
5793                          match w6:
5794                            case WCon{False{}, w7}:
5795                              match w7:
5796                                case WCon{False{}, w8}:
5797                                  match w8:
5798                                    case WNil{}:
5799                                      {==}
5800                                case WCon{True{}, w8}:
5801                                  match w8:
5802                                    case WNil{}:
5803                                      {==}
5804                            case WCon{True{}, w7}:
5805                              match w7:
5806                                case WCon{False{}, w8}:
5807                                  match w8:
5808                                    case WNil{}:
5809                                      {==}
5810                                case WCon{True{}, w8}:
5811                                  match w8:
5812                                    case WNil{}:
5813                                      {==}
5814                    case WCon{True{}, w5}:
5815                      match w5:
5816                        case WCon{False{}, w6}:
5817                          match w6:
5818                            case WCon{False{}, w7}:
5819                              match w7:
5820                                case WCon{False{}, w8}:
5821                                  match w8:
5822                                    case WNil{}:
5823                                      {==}
5824                                case WCon{True{}, w8}:
5825                                  match w8:
5826                                    case WNil{}:
5827                                      {==}
5828                            case WCon{True{}, w7}:
5829                              match w7:
5830                                case WCon{False{}, w8}:
5831                                  match w8:
5832                                    case WNil{}:
5833                                      {==}
5834                                case WCon{True{}, w8}:
5835                                  match w8:
5836                                    case WNil{}:
5837                                      {==}
5838                        case WCon{True{}, w6}:
5839                          match w6:
5840                            case WCon{False{}, w7}:
5841                              match w7:
5842                                case WCon{False{}, w8}:
5843                                  match w8:
5844                                    case WNil{}:
5845                                      {==}
5846                                case WCon{True{}, w8}:
5847                                  match w8:
5848                                    case WNil{}:
5849                                      {==}
5850                            case WCon{True{}, w7}:
5851                              match w7:
5852                                case WCon{False{}, w8}:
5853                                  match w8:
5854                                    case WNil{}:
5855                                      {==}
5856                                case WCon{True{}, w8}:
5857                                  match w8:
5858                                    case WNil{}:
5859                                      {==}
5860                case WCon{True{}, w4}:
5861                  match w4:
5862                    case WCon{False{}, w5}:
5863                      match w5:
5864                        case WCon{False{}, w6}:
5865                          match w6:
5866                            case WCon{False{}, w7}:
5867                              match w7:
5868                                case WCon{False{}, w8}:
5869                                  match w8:
5870                                    case WNil{}:
5871                                      {==}
5872                                case WCon{True{}, w8}:
5873                                  match w8:
5874                                    case WNil{}:
5875                                      {==}
5876                            case WCon{True{}, w7}:
5877                              match w7:
5878                                case WCon{False{}, w8}:
5879                                  match w8:
5880                                    case WNil{}:
5881                                      {==}
5882                                case WCon{True{}, w8}:
5883                                  match w8:
5884                                    case WNil{}:
5885                                      {==}
5886                        case WCon{True{}, w6}:
5887                          match w6:
5888                            case WCon{False{}, w7}:
5889                              match w7:
5890                                case WCon{False{}, w8}:
5891                                  match w8:
5892                                    case WNil{}:
5893                                      {==}
5894                                case WCon{True{}, w8}:
5895                                  match w8:
5896                                    case WNil{}:
5897                                      {==}
5898                            case WCon{True{}, w7}:
5899                              match w7:
5900                                case WCon{False{}, w8}:
5901                                  match w8:
5902                                    case WNil{}:
5903                                      {==}
5904                                case WCon{True{}, w8}:
5905                                  match w8:
5906                                    case WNil{}:
5907                                      {==}
5908                    case WCon{True{}, w5}:
5909                      match w5:
5910                        case WCon{False{}, w6}:
5911                          match w6:
5912                            case WCon{False{}, w7}:
5913                              match w7:
5914                                case WCon{False{}, w8}:
5915                                  match w8:
5916                                    case WNil{}:
5917                                      {==}
5918                                case WCon{True{}, w8}:
5919                                  match w8:
5920                                    case WNil{}:
5921                                      {==}
5922                            case WCon{True{}, w7}:
5923                              match w7:
5924                                case WCon{False{}, w8}:
5925                                  match w8:
5926                                    case WNil{}:
5927                                      {==}
5928                                case WCon{True{}, w8}:
5929                                  match w8:
5930                                    case WNil{}:
5931                                      {==}
5932                        case WCon{True{}, w6}:
5933                          match w6:
5934                            case WCon{False{}, w7}:
5935                              match w7:
5936                                case WCon{False{}, w8}:
5937                                  match w8:
5938                                    case WNil{}:
5939                                      {==}
5940                                case WCon{True{}, w8}:
5941                                  match w8:
5942                                    case WNil{}:
5943                                      {==}
5944                            case WCon{True{}, w7}:
5945                              match w7:
5946                                case WCon{False{}, w8}:
5947                                  match w8:
5948                                    case WNil{}:
5949                                      {==}
5950                                case WCon{True{}, w8}:
5951                                  match w8:
5952                                    case WNil{}:
5953                                      {==}
5954        case WCon{True{}, w2}:
5955          match w2:
5956            case WCon{False{}, w3}:
5957              match w3:
5958                case WCon{False{}, w4}:
5959                  match w4:
5960                    case WCon{False{}, w5}:
5961                      match w5:
5962                        case WCon{False{}, w6}:
5963                          match w6:
5964                            case WCon{False{}, w7}:
5965                              match w7:
5966                                case WCon{False{}, w8}:
5967                                  match w8:
5968                                    case WNil{}:
5969                                      {==}
5970                                case WCon{True{}, w8}:
5971                                  match w8:
5972                                    case WNil{}:
5973                                      {==}
5974                            case WCon{True{}, w7}:
5975                              match w7:
5976                                case WCon{False{}, w8}:
5977                                  match w8:
5978                                    case WNil{}:
5979                                      {==}
5980                                case WCon{True{}, w8}:
5981                                  match w8:
5982                                    case WNil{}:
5983                                      {==}
5984                        case WCon{True{}, w6}:
5985                          match w6:
5986                            case WCon{False{}, w7}:
5987                              match w7:
5988                                case WCon{False{}, w8}:
5989                                  match w8:
5990                                    case WNil{}:
5991                                      {==}
5992                                case WCon{True{}, w8}:
5993                                  match w8:
5994                                    case WNil{}:
5995                                      {==}
5996                            case WCon{True{}, w7}:
5997                              match w7:
5998                                case WCon{False{}, w8}:
5999                                  match w8:
6000                                    case WNil{}:
6001                                      {==}
6002                                case WCon{True{}, w8}:
6003                                  match w8:
6004                                    case WNil{}:
6005                                      {==}
6006                    case WCon{True{}, w5}:
6007                      match w5:
6008                        case WCon{False{}, w6}:
6009                          match w6:
6010                            case WCon{False{}, w7}:
6011                              match w7:
6012                                case WCon{False{}, w8}:
6013                                  match w8:
6014                                    case WNil{}:
6015                                      {==}
6016                                case WCon{True{}, w8}:
6017                                  match w8:
6018                                    case WNil{}:
6019                                      {==}
6020                            case WCon{True{}, w7}:
6021                              match w7:
6022                                case WCon{False{}, w8}:
6023                                  match w8:
6024                                    case WNil{}:
6025                                      {==}
6026                                case WCon{True{}, w8}:
6027                                  match w8:
6028                                    case WNil{}:
6029                                      {==}
6030                        case WCon{True{}, w6}:
6031                          match w6:
6032                            case WCon{False{}, w7}:
6033                              match w7:
6034                                case WCon{False{}, w8}:
6035                                  match w8:
6036                                    case WNil{}:
6037                                      {==}
6038                                case WCon{True{}, w8}:
6039                                  match w8:
6040                                    case WNil{}:
6041                                      {==}
6042                            case WCon{True{}, w7}:
6043                              match w7:
6044                                case WCon{False{}, w8}:
6045                                  match w8:
6046                                    case WNil{}:
6047                                      {==}
6048                                case WCon{True{}, w8}:
6049                                  match w8:
6050                                    case WNil{}:
6051                                      {==}
6052                case WCon{True{}, w4}:
6053                  match w4:
6054                    case WCon{False{}, w5}:
6055                      match w5:
6056                        case WCon{False{}, w6}:
6057                          match w6:
6058                            case WCon{False{}, w7}:
6059                              match w7:
6060                                case WCon{False{}, w8}:
6061                                  match w8:
6062                                    case WNil{}:
6063                                      {==}
6064                                case WCon{True{}, w8}:
6065                                  match w8:
6066                                    case WNil{}:
6067                                      {==}
6068                            case WCon{True{}, w7}:
6069                              match w7:
6070                                case WCon{False{}, w8}:
6071                                  match w8:
6072                                    case WNil{}:
6073                                      {==}
6074                                case WCon{True{}, w8}:
6075                                  match w8:
6076                                    case WNil{}:
6077                                      {==}
6078                        case WCon{True{}, w6}:
6079                          match w6:
6080                            case WCon{False{}, w7}:
6081                              match w7:
6082                                case WCon{False{}, w8}:
6083                                  match w8:
6084                                    case WNil{}:
6085                                      {==}
6086                                case WCon{True{}, w8}:
6087                                  match w8:
6088                                    case WNil{}:
6089                                      {==}
6090                            case WCon{True{}, w7}:
6091                              match w7:
6092                                case WCon{False{}, w8}:
6093                                  match w8:
6094                                    case WNil{}:
6095                                      {==}
6096                                case WCon{True{}, w8}:
6097                                  match w8:
6098                                    case WNil{}:
6099                                      {==}
6100                    case WCon{True{}, w5}:
6101                      match w5:
6102                        case WCon{False{}, w6}:
6103                          match w6:
6104                            case WCon{False{}, w7}:
6105                              match w7:
6106                                case WCon{False{}, w8}:
6107                                  match w8:
6108                                    case WNil{}:
6109                                      {==}
6110                                case WCon{True{}, w8}:
6111                                  match w8:
6112                                    case WNil{}:
6113                                      {==}
6114                            case WCon{True{}, w7}:
6115                              match w7:
6116                                case WCon{False{}, w8}:
6117                                  match w8:
6118                                    case WNil{}:
6119                                      {==}
6120                                case WCon{True{}, w8}:
6121                                  match w8:
6122                                    case WNil{}:
6123                                      {==}
6124                        case WCon{True{}, w6}:
6125                          match w6:
6126                            case WCon{False{}, w7}:
6127                              match w7:
6128                                case WCon{False{}, w8}:
6129                                  match w8:
6130                                    case WNil{}:
6131                                      {==}
6132                                case WCon{True{}, w8}:
6133                                  match w8:
6134                                    case WNil{}:
6135                                      {==}
6136                            case WCon{True{}, w7}:
6137                              match w7:
6138                                case WCon{False{}, w8}:
6139                                  match w8:
6140                                    case WNil{}:
6141                                      {==}
6142                                case WCon{True{}, w8}:
6143                                  match w8:
6144                                    case WNil{}:
6145                                      {==}
6146            case WCon{True{}, w3}:
6147              match w3:
6148                case WCon{False{}, w4}:
6149                  match w4:
6150                    case WCon{False{}, w5}:
6151                      match w5:
6152                        case WCon{False{}, w6}:
6153                          match w6:
6154                            case WCon{False{}, w7}:
6155                              match w7:
6156                                case WCon{False{}, w8}:
6157                                  match w8:
6158                                    case WNil{}:
6159                                      {==}
6160                                case WCon{True{}, w8}:
6161                                  match w8:
6162                                    case WNil{}:
6163                                      {==}
6164                            case WCon{True{}, w7}:
6165                              match w7:
6166                                case WCon{False{}, w8}:
6167                                  match w8:
6168                                    case WNil{}:
6169                                      {==}
6170                                case WCon{True{}, w8}:
6171                                  match w8:
6172                                    case WNil{}:
6173                                      {==}
6174                        case WCon{True{}, w6}:
6175                          match w6:
6176                            case WCon{False{}, w7}:
6177                              match w7:
6178                                case WCon{False{}, w8}:
6179                                  match w8:
6180                                    case WNil{}:
6181                                      {==}
6182                                case WCon{True{}, w8}:
6183                                  match w8:
6184                                    case WNil{}:
6185                                      {==}
6186                            case WCon{True{}, w7}:
6187                              match w7:
6188                                case WCon{False{}, w8}:
6189                                  match w8:
6190                                    case WNil{}:
6191                                      {==}
6192                                case WCon{True{}, w8}:
6193                                  match w8:
6194                                    case WNil{}:
6195                                      {==}
6196                    case WCon{True{}, w5}:
6197                      match w5:
6198                        case WCon{False{}, w6}:
6199                          match w6:
6200                            case WCon{False{}, w7}:
6201                              match w7:
6202                                case WCon{False{}, w8}:
6203                                  match w8:
6204                                    case WNil{}:
6205                                      {==}
6206                                case WCon{True{}, w8}:
6207                                  match w8:
6208                                    case WNil{}:
6209                                      {==}
6210                            case WCon{True{}, w7}:
6211                              match w7:
6212                                case WCon{False{}, w8}:
6213                                  match w8:
6214                                    case WNil{}:
6215                                      {==}
6216                                case WCon{True{}, w8}:
6217                                  match w8:
6218                                    case WNil{}:
6219                                      {==}
6220                        case WCon{True{}, w6}:
6221                          match w6:
6222                            case WCon{False{}, w7}:
6223                              match w7:
6224                                case WCon{False{}, w8}:
6225                                  match w8:
6226                                    case WNil{}:
6227                                      {==}
6228                                case WCon{True{}, w8}:
6229                                  match w8:
6230                                    case WNil{}:
6231                                      {==}
6232                            case WCon{True{}, w7}:
6233                              match w7:
6234                                case WCon{False{}, w8}:
6235                                  match w8:
6236                                    case WNil{}:
6237                                      {==}
6238                                case WCon{True{}, w8}:
6239                                  match w8:
6240                                    case WNil{}:
6241                                      {==}
6242                case WCon{True{}, w4}:
6243                  match w4:
6244                    case WCon{False{}, w5}:
6245                      match w5:
6246                        case WCon{False{}, w6}:
6247                          match w6:
6248                            case WCon{False{}, w7}:
6249                              match w7:
6250                                case WCon{False{}, w8}:
6251                                  match w8:
6252                                    case WNil{}:
6253                                      {==}
6254                                case WCon{True{}, w8}:
6255                                  match w8:
6256                                    case WNil{}:
6257                                      {==}
6258                            case WCon{True{}, w7}:
6259                              match w7:
6260                                case WCon{False{}, w8}:
6261                                  match w8:
6262                                    case WNil{}:
6263                                      {==}
6264                                case WCon{True{}, w8}:
6265                                  match w8:
6266                                    case WNil{}:
6267                                      {==}
6268                        case WCon{True{}, w6}:
6269                          match w6:
6270                            case WCon{False{}, w7}:
6271                              match w7:
6272                                case WCon{False{}, w8}:
6273                                  match w8:
6274                                    case WNil{}:
6275                                      {==}
6276                                case WCon{True{}, w8}:
6277                                  match w8:
6278                                    case WNil{}:
6279                                      {==}
6280                            case WCon{True{}, w7}:
6281                              match w7:
6282                                case WCon{False{}, w8}:
6283                                  match w8:
6284                                    case WNil{}:
6285                                      {==}
6286                                case WCon{True{}, w8}:
6287                                  match w8:
6288                                    case WNil{}:
6289                                      {==}
6290                    case WCon{True{}, w5}:
6291                      match w5:
6292                        case WCon{False{}, w6}:
6293                          match w6:
6294                            case WCon{False{}, w7}:
6295                              match w7:
6296                                case WCon{False{}, w8}:
6297                                  match w8:
6298                                    case WNil{}:
6299                                      {==}
6300                                case WCon{True{}, w8}:
6301                                  match w8:
6302                                    case WNil{}:
6303                                      {==}
6304                            case WCon{True{}, w7}:
6305                              match w7:
6306                                case WCon{False{}, w8}:
6307                                  match w8:
6308                                    case WNil{}:
6309                                      {==}
6310                                case WCon{True{}, w8}:
6311                                  match w8:
6312                                    case WNil{}:
6313                                      {==}
6314                        case WCon{True{}, w6}:
6315                          match w6:
6316                            case WCon{False{}, w7}:
6317                              match w7:
6318                                case WCon{False{}, w8}:
6319                                  match w8:
6320                                    case WNil{}:
6321                                      {==}
6322                                case WCon{True{}, w8}:
6323                                  match w8:
6324                                    case WNil{}:
6325                                      {==}
6326                            case WCon{True{}, w7}:
6327                              match w7:
6328                                case WCon{False{}, w8}:
6329                                  match w8:
6330                                    case WNil{}:
6331                                      {==}
6332                                case WCon{True{}, w8}:
6333                                  match w8:
6334                                    case WNil{}:
6335                                      {==}
6336
6337def aria_sb24(w0: Word(8n)) -> {w0 == A.aria.sb2(A.aria.sb4(w0)) : Word(8n)}:
6338  match w0:
6339    case WCon{False{}, w1}:
6340      match w1:
6341        case WCon{False{}, w2}:
6342          match w2:
6343            case WCon{False{}, w3}:
6344              match w3:
6345                case WCon{False{}, w4}:
6346                  match w4:
6347                    case WCon{False{}, w5}:
6348                      match w5:
6349                        case WCon{False{}, w6}:
6350                          match w6:
6351                            case WCon{False{}, w7}:
6352                              match w7:
6353                                case WCon{False{}, w8}:
6354                                  match w8:
6355                                    case WNil{}:
6356                                      {==}
6357                                case WCon{True{}, w8}:
6358                                  match w8:
6359                                    case WNil{}:
6360                                      {==}
6361                            case WCon{True{}, w7}:
6362                              match w7:
6363                                case WCon{False{}, w8}:
6364                                  match w8:
6365                                    case WNil{}:
6366                                      {==}
6367                                case WCon{True{}, w8}:
6368                                  match w8:
6369                                    case WNil{}:
6370                                      {==}
6371                        case WCon{True{}, w6}:
6372                          match w6:
6373                            case WCon{False{}, w7}:
6374                              match w7:
6375                                case WCon{False{}, w8}:
6376                                  match w8:
6377                                    case WNil{}:
6378                                      {==}
6379                                case WCon{True{}, w8}:
6380                                  match w8:
6381                                    case WNil{}:
6382                                      {==}
6383                            case WCon{True{}, w7}:
6384                              match w7:
6385                                case WCon{False{}, w8}:
6386                                  match w8:
6387                                    case WNil{}:
6388                                      {==}
6389                                case WCon{True{}, w8}:
6390                                  match w8:
6391                                    case WNil{}:
6392                                      {==}
6393                    case WCon{True{}, w5}:
6394                      match w5:
6395                        case WCon{False{}, w6}:
6396                          match w6:
6397                            case WCon{False{}, w7}:
6398                              match w7:
6399                                case WCon{False{}, w8}:
6400                                  match w8:
6401                                    case WNil{}:
6402                                      {==}
6403                                case WCon{True{}, w8}:
6404                                  match w8:
6405                                    case WNil{}:
6406                                      {==}
6407                            case WCon{True{}, w7}:
6408                              match w7:
6409                                case WCon{False{}, w8}:
6410                                  match w8:
6411                                    case WNil{}:
6412                                      {==}
6413                                case WCon{True{}, w8}:
6414                                  match w8:
6415                                    case WNil{}:
6416                                      {==}
6417                        case WCon{True{}, w6}:
6418                          match w6:
6419                            case WCon{False{}, w7}:
6420                              match w7:
6421                                case WCon{False{}, w8}:
6422                                  match w8:
6423                                    case WNil{}:
6424                                      {==}
6425                                case WCon{True{}, w8}:
6426                                  match w8:
6427                                    case WNil{}:
6428                                      {==}
6429                            case WCon{True{}, w7}:
6430                              match w7:
6431                                case WCon{False{}, w8}:
6432                                  match w8:
6433                                    case WNil{}:
6434                                      {==}
6435                                case WCon{True{}, w8}:
6436                                  match w8:
6437                                    case WNil{}:
6438                                      {==}
6439                case WCon{True{}, w4}:
6440                  match w4:
6441                    case WCon{False{}, w5}:
6442                      match w5:
6443                        case WCon{False{}, w6}:
6444                          match w6:
6445                            case WCon{False{}, w7}:
6446                              match w7:
6447                                case WCon{False{}, w8}:
6448                                  match w8:
6449                                    case WNil{}:
6450                                      {==}
6451                                case WCon{True{}, w8}:
6452                                  match w8:
6453                                    case WNil{}:
6454                                      {==}
6455                            case WCon{True{}, w7}:
6456                              match w7:
6457                                case WCon{False{}, w8}:
6458                                  match w8:
6459                                    case WNil{}:
6460                                      {==}
6461                                case WCon{True{}, w8}:
6462                                  match w8:
6463                                    case WNil{}:
6464                                      {==}
6465                        case WCon{True{}, w6}:
6466                          match w6:
6467                            case WCon{False{}, w7}:
6468                              match w7:
6469                                case WCon{False{}, w8}:
6470                                  match w8:
6471                                    case WNil{}:
6472                                      {==}
6473                                case WCon{True{}, w8}:
6474                                  match w8:
6475                                    case WNil{}:
6476                                      {==}
6477                            case WCon{True{}, w7}:
6478                              match w7:
6479                                case WCon{False{}, w8}:
6480                                  match w8:
6481                                    case WNil{}:
6482                                      {==}
6483                                case WCon{True{}, w8}:
6484                                  match w8:
6485                                    case WNil{}:
6486                                      {==}
6487                    case WCon{True{}, w5}:
6488                      match w5:
6489                        case WCon{False{}, w6}:
6490                          match w6:
6491                            case WCon{False{}, w7}:
6492                              match w7:
6493                                case WCon{False{}, w8}:
6494                                  match w8:
6495                                    case WNil{}:
6496                                      {==}
6497                                case WCon{True{}, w8}:
6498                                  match w8:
6499                                    case WNil{}:
6500                                      {==}
6501                            case WCon{True{}, w7}:
6502                              match w7:
6503                                case WCon{False{}, w8}:
6504                                  match w8:
6505                                    case WNil{}:
6506                                      {==}
6507                                case WCon{True{}, w8}:
6508                                  match w8:
6509                                    case WNil{}:
6510                                      {==}
6511                        case WCon{True{}, w6}:
6512                          match w6:
6513                            case WCon{False{}, w7}:
6514                              match w7:
6515                                case WCon{False{}, w8}:
6516                                  match w8:
6517                                    case WNil{}:
6518                                      {==}
6519                                case WCon{True{}, w8}:
6520                                  match w8:
6521                                    case WNil{}:
6522                                      {==}
6523                            case WCon{True{}, w7}:
6524                              match w7:
6525                                case WCon{False{}, w8}:
6526                                  match w8:
6527                                    case WNil{}:
6528                                      {==}
6529                                case WCon{True{}, w8}:
6530                                  match w8:
6531                                    case WNil{}:
6532                                      {==}
6533            case WCon{True{}, w3}:
6534              match w3:
6535                case WCon{False{}, w4}:
6536                  match w4:
6537                    case WCon{False{}, w5}:
6538                      match w5:
6539                        case WCon{False{}, w6}:
6540                          match w6:
6541                            case WCon{False{}, w7}:
6542                              match w7:
6543                                case WCon{False{}, w8}:
6544                                  match w8:
6545                                    case WNil{}:
6546                                      {==}
6547                                case WCon{True{}, w8}:
6548                                  match w8:
6549                                    case WNil{}:
6550                                      {==}
6551                            case WCon{True{}, w7}:
6552                              match w7:
6553                                case WCon{False{}, w8}:
6554                                  match w8:
6555                                    case WNil{}:
6556                                      {==}
6557                                case WCon{True{}, w8}:
6558                                  match w8:
6559                                    case WNil{}:
6560                                      {==}
6561                        case WCon{True{}, w6}:
6562                          match w6:
6563                            case WCon{False{}, w7}:
6564                              match w7:
6565                                case WCon{False{}, w8}:
6566                                  match w8:
6567                                    case WNil{}:
6568                                      {==}
6569                                case WCon{True{}, w8}:
6570                                  match w8:
6571                                    case WNil{}:
6572                                      {==}
6573                            case WCon{True{}, w7}:
6574                              match w7:
6575                                case WCon{False{}, w8}:
6576                                  match w8:
6577                                    case WNil{}:
6578                                      {==}
6579                                case WCon{True{}, w8}:
6580                                  match w8:
6581                                    case WNil{}:
6582                                      {==}
6583                    case WCon{True{}, w5}:
6584                      match w5:
6585                        case WCon{False{}, w6}:
6586                          match w6:
6587                            case WCon{False{}, w7}:
6588                              match w7:
6589                                case WCon{False{}, w8}:
6590                                  match w8:
6591                                    case WNil{}:
6592                                      {==}
6593                                case WCon{True{}, w8}:
6594                                  match w8:
6595                                    case WNil{}:
6596                                      {==}
6597                            case WCon{True{}, w7}:
6598                              match w7:
6599                                case WCon{False{}, w8}:
6600                                  match w8:
6601                                    case WNil{}:
6602                                      {==}
6603                                case WCon{True{}, w8}:
6604                                  match w8:
6605                                    case WNil{}:
6606                                      {==}
6607                        case WCon{True{}, w6}:
6608                          match w6:
6609                            case WCon{False{}, w7}:
6610                              match w7:
6611                                case WCon{False{}, w8}:
6612                                  match w8:
6613                                    case WNil{}:
6614                                      {==}
6615                                case WCon{True{}, w8}:
6616                                  match w8:
6617                                    case WNil{}:
6618                                      {==}
6619                            case WCon{True{}, w7}:
6620                              match w7:
6621                                case WCon{False{}, w8}:
6622                                  match w8:
6623                                    case WNil{}:
6624                                      {==}
6625                                case WCon{True{}, w8}:
6626                                  match w8:
6627                                    case WNil{}:
6628                                      {==}
6629                case WCon{True{}, w4}:
6630                  match w4:
6631                    case WCon{False{}, w5}:
6632                      match w5:
6633                        case WCon{False{}, w6}:
6634                          match w6:
6635                            case WCon{False{}, w7}:
6636                              match w7:
6637                                case WCon{False{}, w8}:
6638                                  match w8:
6639                                    case WNil{}:
6640                                      {==}
6641                                case WCon{True{}, w8}:
6642                                  match w8:
6643                                    case WNil{}:
6644                                      {==}
6645                            case WCon{True{}, w7}:
6646                              match w7:
6647                                case WCon{False{}, w8}:
6648                                  match w8:
6649                                    case WNil{}:
6650                                      {==}
6651                                case WCon{True{}, w8}:
6652                                  match w8:
6653                                    case WNil{}:
6654                                      {==}
6655                        case WCon{True{}, w6}:
6656                          match w6:
6657                            case WCon{False{}, w7}:
6658                              match w7:
6659                                case WCon{False{}, w8}:
6660                                  match w8:
6661                                    case WNil{}:
6662                                      {==}
6663                                case WCon{True{}, w8}:
6664                                  match w8:
6665                                    case WNil{}:
6666                                      {==}
6667                            case WCon{True{}, w7}:
6668                              match w7:
6669                                case WCon{False{}, w8}:
6670                                  match w8:
6671                                    case WNil{}:
6672                                      {==}
6673                                case WCon{True{}, w8}:
6674                                  match w8:
6675                                    case WNil{}:
6676                                      {==}
6677                    case WCon{True{}, w5}:
6678                      match w5:
6679                        case WCon{False{}, w6}:
6680                          match w6:
6681                            case WCon{False{}, w7}:
6682                              match w7:
6683                                case WCon{False{}, w8}:
6684                                  match w8:
6685                                    case WNil{}:
6686                                      {==}
6687                                case WCon{True{}, w8}:
6688                                  match w8:
6689                                    case WNil{}:
6690                                      {==}
6691                            case WCon{True{}, w7}:
6692                              match w7:
6693                                case WCon{False{}, w8}:
6694                                  match w8:
6695                                    case WNil{}:
6696                                      {==}
6697                                case WCon{True{}, w8}:
6698                                  match w8:
6699                                    case WNil{}:
6700                                      {==}
6701                        case WCon{True{}, w6}:
6702                          match w6:
6703                            case WCon{False{}, w7}:
6704                              match w7:
6705                                case WCon{False{}, w8}:
6706                                  match w8:
6707                                    case WNil{}:
6708                                      {==}
6709                                case WCon{True{}, w8}:
6710                                  match w8:
6711                                    case WNil{}:
6712                                      {==}
6713                            case WCon{True{}, w7}:
6714                              match w7:
6715                                case WCon{False{}, w8}:
6716                                  match w8:
6717                                    case WNil{}:
6718                                      {==}
6719                                case WCon{True{}, w8}:
6720                                  match w8:
6721                                    case WNil{}:
6722                                      {==}
6723        case WCon{True{}, w2}:
6724          match w2:
6725            case WCon{False{}, w3}:
6726              match w3:
6727                case WCon{False{}, w4}:
6728                  match w4:
6729                    case WCon{False{}, w5}:
6730                      match w5:
6731                        case WCon{False{}, w6}:
6732                          match w6:
6733                            case WCon{False{}, w7}:
6734                              match w7:
6735                                case WCon{False{}, w8}:
6736                                  match w8:
6737                                    case WNil{}:
6738                                      {==}
6739                                case WCon{True{}, w8}:
6740                                  match w8:
6741                                    case WNil{}:
6742                                      {==}
6743                            case WCon{True{}, w7}:
6744                              match w7:
6745                                case WCon{False{}, w8}:
6746                                  match w8:
6747                                    case WNil{}:
6748                                      {==}
6749                                case WCon{True{}, w8}:
6750                                  match w8:
6751                                    case WNil{}:
6752                                      {==}
6753                        case WCon{True{}, w6}:
6754                          match w6:
6755                            case WCon{False{}, w7}:
6756                              match w7:
6757                                case WCon{False{}, w8}:
6758                                  match w8:
6759                                    case WNil{}:
6760                                      {==}
6761                                case WCon{True{}, w8}:
6762                                  match w8:
6763                                    case WNil{}:
6764                                      {==}
6765                            case WCon{True{}, w7}:
6766                              match w7:
6767                                case WCon{False{}, w8}:
6768                                  match w8:
6769                                    case WNil{}:
6770                                      {==}
6771                                case WCon{True{}, w8}:
6772                                  match w8:
6773                                    case WNil{}:
6774                                      {==}
6775                    case WCon{True{}, w5}:
6776                      match w5:
6777                        case WCon{False{}, w6}:
6778                          match w6:
6779                            case WCon{False{}, w7}:
6780                              match w7:
6781                                case WCon{False{}, w8}:
6782                                  match w8:
6783                                    case WNil{}:
6784                                      {==}
6785                                case WCon{True{}, w8}:
6786                                  match w8:
6787                                    case WNil{}:
6788                                      {==}
6789                            case WCon{True{}, w7}:
6790                              match w7:
6791                                case WCon{False{}, w8}:
6792                                  match w8:
6793                                    case WNil{}:
6794                                      {==}
6795                                case WCon{True{}, w8}:
6796                                  match w8:
6797                                    case WNil{}:
6798                                      {==}
6799                        case WCon{True{}, w6}:
6800                          match w6:
6801                            case WCon{False{}, w7}:
6802                              match w7:
6803                                case WCon{False{}, w8}:
6804                                  match w8:
6805                                    case WNil{}:
6806                                      {==}
6807                                case WCon{True{}, w8}:
6808                                  match w8:
6809                                    case WNil{}:
6810                                      {==}
6811                            case WCon{True{}, w7}:
6812                              match w7:
6813                                case WCon{False{}, w8}:
6814                                  match w8:
6815                                    case WNil{}:
6816                                      {==}
6817                                case WCon{True{}, w8}:
6818                                  match w8:
6819                                    case WNil{}:
6820                                      {==}
6821                case WCon{True{}, w4}:
6822                  match w4:
6823                    case WCon{False{}, w5}:
6824                      match w5:
6825                        case WCon{False{}, w6}:
6826                          match w6:
6827                            case WCon{False{}, w7}:
6828                              match w7:
6829                                case WCon{False{}, w8}:
6830                                  match w8:
6831                                    case WNil{}:
6832                                      {==}
6833                                case WCon{True{}, w8}:
6834                                  match w8:
6835                                    case WNil{}:
6836                                      {==}
6837                            case WCon{True{}, w7}:
6838                              match w7:
6839                                case WCon{False{}, w8}:
6840                                  match w8:
6841                                    case WNil{}:
6842                                      {==}
6843                                case WCon{True{}, w8}:
6844                                  match w8:
6845                                    case WNil{}:
6846                                      {==}
6847                        case WCon{True{}, w6}:
6848                          match w6:
6849                            case WCon{False{}, w7}:
6850                              match w7:
6851                                case WCon{False{}, w8}:
6852                                  match w8:
6853                                    case WNil{}:
6854                                      {==}
6855                                case WCon{True{}, w8}:
6856                                  match w8:
6857                                    case WNil{}:
6858                                      {==}
6859                            case WCon{True{}, w7}:
6860                              match w7:
6861                                case WCon{False{}, w8}:
6862                                  match w8:
6863                                    case WNil{}:
6864                                      {==}
6865                                case WCon{True{}, w8}:
6866                                  match w8:
6867                                    case WNil{}:
6868                                      {==}
6869                    case WCon{True{}, w5}:
6870                      match w5:
6871                        case WCon{False{}, w6}:
6872                          match w6:
6873                            case WCon{False{}, w7}:
6874                              match w7:
6875                                case WCon{False{}, w8}:
6876                                  match w8:
6877                                    case WNil{}:
6878                                      {==}
6879                                case WCon{True{}, w8}:
6880                                  match w8:
6881                                    case WNil{}:
6882                                      {==}
6883                            case WCon{True{}, w7}:
6884                              match w7:
6885                                case WCon{False{}, w8}:
6886                                  match w8:
6887                                    case WNil{}:
6888                                      {==}
6889                                case WCon{True{}, w8}:
6890                                  match w8:
6891                                    case WNil{}:
6892                                      {==}
6893                        case WCon{True{}, w6}:
6894                          match w6:
6895                            case WCon{False{}, w7}:
6896                              match w7:
6897                                case WCon{False{}, w8}:
6898                                  match w8:
6899                                    case WNil{}:
6900                                      {==}
6901                                case WCon{True{}, w8}:
6902                                  match w8:
6903                                    case WNil{}:
6904                                      {==}
6905                            case WCon{True{}, w7}:
6906                              match w7:
6907                                case WCon{False{}, w8}:
6908                                  match w8:
6909                                    case WNil{}:
6910                                      {==}
6911                                case WCon{True{}, w8}:
6912                                  match w8:
6913                                    case WNil{}:
6914                                      {==}
6915            case WCon{True{}, w3}:
6916              match w3:
6917                case WCon{False{}, w4}:
6918                  match w4:
6919                    case WCon{False{}, w5}:
6920                      match w5:
6921                        case WCon{False{}, w6}:
6922                          match w6:
6923                            case WCon{False{}, w7}:
6924                              match w7:
6925                                case WCon{False{}, w8}:
6926                                  match w8:
6927                                    case WNil{}:
6928                                      {==}
6929                                case WCon{True{}, w8}:
6930                                  match w8:
6931                                    case WNil{}:
6932                                      {==}
6933                            case WCon{True{}, w7}:
6934                              match w7:
6935                                case WCon{False{}, w8}:
6936                                  match w8:
6937                                    case WNil{}:
6938                                      {==}
6939                                case WCon{True{}, w8}:
6940                                  match w8:
6941                                    case WNil{}:
6942                                      {==}
6943                        case WCon{True{}, w6}:
6944                          match w6:
6945                            case WCon{False{}, w7}:
6946                              match w7:
6947                                case WCon{False{}, w8}:
6948                                  match w8:
6949                                    case WNil{}:
6950                                      {==}
6951                                case WCon{True{}, w8}:
6952                                  match w8:
6953                                    case WNil{}:
6954                                      {==}
6955                            case WCon{True{}, w7}:
6956                              match w7:
6957                                case WCon{False{}, w8}:
6958                                  match w8:
6959                                    case WNil{}:
6960                                      {==}
6961                                case WCon{True{}, w8}:
6962                                  match w8:
6963                                    case WNil{}:
6964                                      {==}
6965                    case WCon{True{}, w5}:
6966                      match w5:
6967                        case WCon{False{}, w6}:
6968                          match w6:
6969                            case WCon{False{}, w7}:
6970                              match w7:
6971                                case WCon{False{}, w8}:
6972                                  match w8:
6973                                    case WNil{}:
6974                                      {==}
6975                                case WCon{True{}, w8}:
6976                                  match w8:
6977                                    case WNil{}:
6978                                      {==}
6979                            case WCon{True{}, w7}:
6980                              match w7:
6981                                case WCon{False{}, w8}:
6982                                  match w8:
6983                                    case WNil{}:
6984                                      {==}
6985                                case WCon{True{}, w8}:
6986                                  match w8:
6987                                    case WNil{}:
6988                                      {==}
6989                        case WCon{True{}, w6}:
6990                          match w6:
6991                            case WCon{False{}, w7}:
6992                              match w7:
6993                                case WCon{False{}, w8}:
6994                                  match w8:
6995                                    case WNil{}:
6996                                      {==}
6997                                case WCon{True{}, w8}:
6998                                  match w8:
6999                                    case WNil{}:
7000                                      {==}
7001                            case WCon{True{}, w7}:
7002                              match w7:
7003                                case WCon{False{}, w8}:
7004                                  match w8:
7005                                    case WNil{}:
7006                                      {==}
7007                                case WCon{True{}, w8}:
7008                                  match w8:
7009                                    case WNil{}:
7010                                      {==}
7011                case WCon{True{}, w4}:
7012                  match w4:
7013                    case WCon{False{}, w5}:
7014                      match w5:
7015                        case WCon{False{}, w6}:
7016                          match w6:
7017                            case WCon{False{}, w7}:
7018                              match w7:
7019                                case WCon{False{}, w8}:
7020                                  match w8:
7021                                    case WNil{}:
7022                                      {==}
7023                                case WCon{True{}, w8}:
7024                                  match w8:
7025                                    case WNil{}:
7026                                      {==}
7027                            case WCon{True{}, w7}:
7028                              match w7:
7029                                case WCon{False{}, w8}:
7030                                  match w8:
7031                                    case WNil{}:
7032                                      {==}
7033                                case WCon{True{}, w8}:
7034                                  match w8:
7035                                    case WNil{}:
7036                                      {==}
7037                        case WCon{True{}, w6}:
7038                          match w6:
7039                            case WCon{False{}, w7}:
7040                              match w7:
7041                                case WCon{False{}, w8}:
7042                                  match w8:
7043                                    case WNil{}:
7044                                      {==}
7045                                case WCon{True{}, w8}:
7046                                  match w8:
7047                                    case WNil{}:
7048                                      {==}
7049                            case WCon{True{}, w7}:
7050                              match w7:
7051                                case WCon{False{}, w8}:
7052                                  match w8:
7053                                    case WNil{}:
7054                                      {==}
7055                                case WCon{True{}, w8}:
7056                                  match w8:
7057                                    case WNil{}:
7058                                      {==}
7059                    case WCon{True{}, w5}:
7060                      match w5:
7061                        case WCon{False{}, w6}:
7062                          match w6:
7063                            case WCon{False{}, w7}:
7064                              match w7:
7065                                case WCon{False{}, w8}:
7066                                  match w8:
7067                                    case WNil{}:
7068                                      {==}
7069                                case WCon{True{}, w8}:
7070                                  match w8:
7071                                    case WNil{}:
7072                                      {==}
7073                            case WCon{True{}, w7}:
7074                              match w7:
7075                                case WCon{False{}, w8}:
7076                                  match w8:
7077                                    case WNil{}:
7078                                      {==}
7079                                case WCon{True{}, w8}:
7080                                  match w8:
7081                                    case WNil{}:
7082                                      {==}
7083                        case WCon{True{}, w6}:
7084                          match w6:
7085                            case WCon{False{}, w7}:
7086                              match w7:
7087                                case WCon{False{}, w8}:
7088                                  match w8:
7089                                    case WNil{}:
7090                                      {==}
7091                                case WCon{True{}, w8}:
7092                                  match w8:
7093                                    case WNil{}:
7094                                      {==}
7095                            case WCon{True{}, w7}:
7096                              match w7:
7097                                case WCon{False{}, w8}:
7098                                  match w8:
7099                                    case WNil{}:
7100                                      {==}
7101                                case WCon{True{}, w8}:
7102                                  match w8:
7103                                    case WNil{}:
7104                                      {==}
7105    case WCon{True{}, w1}:
7106      match w1:
7107        case WCon{False{}, w2}:
7108          match w2:
7109            case WCon{False{}, w3}:
7110              match w3:
7111                case WCon{False{}, w4}:
7112                  match w4:
7113                    case WCon{False{}, w5}:
7114                      match w5:
7115                        case WCon{False{}, w6}:
7116                          match w6:
7117                            case WCon{False{}, w7}:
7118                              match w7:
7119                                case WCon{False{}, w8}:
7120                                  match w8:
7121                                    case WNil{}:
7122                                      {==}
7123                                case WCon{True{}, w8}:
7124                                  match w8:
7125                                    case WNil{}:
7126                                      {==}
7127                            case WCon{True{}, w7}:
7128                              match w7:
7129                                case WCon{False{}, w8}:
7130                                  match w8:
7131                                    case WNil{}:
7132                                      {==}
7133                                case WCon{True{}, w8}:
7134                                  match w8:
7135                                    case WNil{}:
7136                                      {==}
7137                        case WCon{True{}, w6}:
7138                          match w6:
7139                            case WCon{False{}, w7}:
7140                              match w7:
7141                                case WCon{False{}, w8}:
7142                                  match w8:
7143                                    case WNil{}:
7144                                      {==}
7145                                case WCon{True{}, w8}:
7146                                  match w8:
7147                                    case WNil{}:
7148                                      {==}
7149                            case WCon{True{}, w7}:
7150                              match w7:
7151                                case WCon{False{}, w8}:
7152                                  match w8:
7153                                    case WNil{}:
7154                                      {==}
7155                                case WCon{True{}, w8}:
7156                                  match w8:
7157                                    case WNil{}:
7158                                      {==}
7159                    case WCon{True{}, w5}:
7160                      match w5:
7161                        case WCon{False{}, w6}:
7162                          match w6:
7163                            case WCon{False{}, w7}:
7164                              match w7:
7165                                case WCon{False{}, w8}:
7166                                  match w8:
7167                                    case WNil{}:
7168                                      {==}
7169                                case WCon{True{}, w8}:
7170                                  match w8:
7171                                    case WNil{}:
7172                                      {==}
7173                            case WCon{True{}, w7}:
7174                              match w7:
7175                                case WCon{False{}, w8}:
7176                                  match w8:
7177                                    case WNil{}:
7178                                      {==}
7179                                case WCon{True{}, w8}:
7180                                  match w8:
7181                                    case WNil{}:
7182                                      {==}
7183                        case WCon{True{}, w6}:
7184                          match w6:
7185                            case WCon{False{}, w7}:
7186                              match w7:
7187                                case WCon{False{}, w8}:
7188                                  match w8:
7189                                    case WNil{}:
7190                                      {==}
7191                                case WCon{True{}, w8}:
7192                                  match w8:
7193                                    case WNil{}:
7194                                      {==}
7195                            case WCon{True{}, w7}:
7196                              match w7:
7197                                case WCon{False{}, w8}:
7198                                  match w8:
7199                                    case WNil{}:
7200                                      {==}
7201                                case WCon{True{}, w8}:
7202                                  match w8:
7203                                    case WNil{}:
7204                                      {==}
7205                case WCon{True{}, w4}:
7206                  match w4:
7207                    case WCon{False{}, w5}:
7208                      match w5:
7209                        case WCon{False{}, w6}:
7210                          match w6:
7211                            case WCon{False{}, w7}:
7212                              match w7:
7213                                case WCon{False{}, w8}:
7214                                  match w8:
7215                                    case WNil{}:
7216                                      {==}
7217                                case WCon{True{}, w8}:
7218                                  match w8:
7219                                    case WNil{}:
7220                                      {==}
7221                            case WCon{True{}, w7}:
7222                              match w7:
7223                                case WCon{False{}, w8}:
7224                                  match w8:
7225                                    case WNil{}:
7226                                      {==}
7227                                case WCon{True{}, w8}:
7228                                  match w8:
7229                                    case WNil{}:
7230                                      {==}
7231                        case WCon{True{}, w6}:
7232                          match w6:
7233                            case WCon{False{}, w7}:
7234                              match w7:
7235                                case WCon{False{}, w8}:
7236                                  match w8:
7237                                    case WNil{}:
7238                                      {==}
7239                                case WCon{True{}, w8}:
7240                                  match w8:
7241                                    case WNil{}:
7242                                      {==}
7243                            case WCon{True{}, w7}:
7244                              match w7:
7245                                case WCon{False{}, w8}:
7246                                  match w8:
7247                                    case WNil{}:
7248                                      {==}
7249                                case WCon{True{}, w8}:
7250                                  match w8:
7251                                    case WNil{}:
7252                                      {==}
7253                    case WCon{True{}, w5}:
7254                      match w5:
7255                        case WCon{False{}, w6}:
7256                          match w6:
7257                            case WCon{False{}, w7}:
7258                              match w7:
7259                                case WCon{False{}, w8}:
7260                                  match w8:
7261                                    case WNil{}:
7262                                      {==}
7263                                case WCon{True{}, w8}:
7264                                  match w8:
7265                                    case WNil{}:
7266                                      {==}
7267                            case WCon{True{}, w7}:
7268                              match w7:
7269                                case WCon{False{}, w8}:
7270                                  match w8:
7271                                    case WNil{}:
7272                                      {==}
7273                                case WCon{True{}, w8}:
7274                                  match w8:
7275                                    case WNil{}:
7276                                      {==}
7277                        case WCon{True{}, w6}:
7278                          match w6:
7279                            case WCon{False{}, w7}:
7280                              match w7:
7281                                case WCon{False{}, w8}:
7282                                  match w8:
7283                                    case WNil{}:
7284                                      {==}
7285                                case WCon{True{}, w8}:
7286                                  match w8:
7287                                    case WNil{}:
7288                                      {==}
7289                            case WCon{True{}, w7}:
7290                              match w7:
7291                                case WCon{False{}, w8}:
7292                                  match w8:
7293                                    case WNil{}:
7294                                      {==}
7295                                case WCon{True{}, w8}:
7296                                  match w8:
7297                                    case WNil{}:
7298                                      {==}
7299            case WCon{True{}, w3}:
7300              match w3:
7301                case WCon{False{}, w4}:
7302                  match w4:
7303                    case WCon{False{}, w5}:
7304                      match w5:
7305                        case WCon{False{}, w6}:
7306                          match w6:
7307                            case WCon{False{}, w7}:
7308                              match w7:
7309                                case WCon{False{}, w8}:
7310                                  match w8:
7311                                    case WNil{}:
7312                                      {==}
7313                                case WCon{True{}, w8}:
7314                                  match w8:
7315                                    case WNil{}:
7316                                      {==}
7317                            case WCon{True{}, w7}:
7318                              match w7:
7319                                case WCon{False{}, w8}:
7320                                  match w8:
7321                                    case WNil{}:
7322                                      {==}
7323                                case WCon{True{}, w8}:
7324                                  match w8:
7325                                    case WNil{}:
7326                                      {==}
7327                        case WCon{True{}, w6}:
7328                          match w6:
7329                            case WCon{False{}, w7}:
7330                              match w7:
7331                                case WCon{False{}, w8}:
7332                                  match w8:
7333                                    case WNil{}:
7334                                      {==}
7335                                case WCon{True{}, w8}:
7336                                  match w8:
7337                                    case WNil{}:
7338                                      {==}
7339                            case WCon{True{}, w7}:
7340                              match w7:
7341                                case WCon{False{}, w8}:
7342                                  match w8:
7343                                    case WNil{}:
7344                                      {==}
7345                                case WCon{True{}, w8}:
7346                                  match w8:
7347                                    case WNil{}:
7348                                      {==}
7349                    case WCon{True{}, w5}:
7350                      match w5:
7351                        case WCon{False{}, w6}:
7352                          match w6:
7353                            case WCon{False{}, w7}:
7354                              match w7:
7355                                case WCon{False{}, w8}:
7356                                  match w8:
7357                                    case WNil{}:
7358                                      {==}
7359                                case WCon{True{}, w8}:
7360                                  match w8:
7361                                    case WNil{}:
7362                                      {==}
7363                            case WCon{True{}, w7}:
7364                              match w7:
7365                                case WCon{False{}, w8}:
7366                                  match w8:
7367                                    case WNil{}:
7368                                      {==}
7369                                case WCon{True{}, w8}:
7370                                  match w8:
7371                                    case WNil{}:
7372                                      {==}
7373                        case WCon{True{}, w6}:
7374                          match w6:
7375                            case WCon{False{}, w7}:
7376                              match w7:
7377                                case WCon{False{}, w8}:
7378                                  match w8:
7379                                    case WNil{}:
7380                                      {==}
7381                                case WCon{True{}, w8}:
7382                                  match w8:
7383                                    case WNil{}:
7384                                      {==}
7385                            case WCon{True{}, w7}:
7386                              match w7:
7387                                case WCon{False{}, w8}:
7388                                  match w8:
7389                                    case WNil{}:
7390                                      {==}
7391                                case WCon{True{}, w8}:
7392                                  match w8:
7393                                    case WNil{}:
7394                                      {==}
7395                case WCon{True{}, w4}:
7396                  match w4:
7397                    case WCon{False{}, w5}:
7398                      match w5:
7399                        case WCon{False{}, w6}:
7400                          match w6:
7401                            case WCon{False{}, w7}:
7402                              match w7:
7403                                case WCon{False{}, w8}:
7404                                  match w8:
7405                                    case WNil{}:
7406                                      {==}
7407                                case WCon{True{}, w8}:
7408                                  match w8:
7409                                    case WNil{}:
7410                                      {==}
7411                            case WCon{True{}, w7}:
7412                              match w7:
7413                                case WCon{False{}, w8}:
7414                                  match w8:
7415                                    case WNil{}:
7416                                      {==}
7417                                case WCon{True{}, w8}:
7418                                  match w8:
7419                                    case WNil{}:
7420                                      {==}
7421                        case WCon{True{}, w6}:
7422                          match w6:
7423                            case WCon{False{}, w7}:
7424                              match w7:
7425                                case WCon{False{}, w8}:
7426                                  match w8:
7427                                    case WNil{}:
7428                                      {==}
7429                                case WCon{True{}, w8}:
7430                                  match w8:
7431                                    case WNil{}:
7432                                      {==}
7433                            case WCon{True{}, w7}:
7434                              match w7:
7435                                case WCon{False{}, w8}:
7436                                  match w8:
7437                                    case WNil{}:
7438                                      {==}
7439                                case WCon{True{}, w8}:
7440                                  match w8:
7441                                    case WNil{}:
7442                                      {==}
7443                    case WCon{True{}, w5}:
7444                      match w5:
7445                        case WCon{False{}, w6}:
7446                          match w6:
7447                            case WCon{False{}, w7}:
7448                              match w7:
7449                                case WCon{False{}, w8}:
7450                                  match w8:
7451                                    case WNil{}:
7452                                      {==}
7453                                case WCon{True{}, w8}:
7454                                  match w8:
7455                                    case WNil{}:
7456                                      {==}
7457                            case WCon{True{}, w7}:
7458                              match w7:
7459                                case WCon{False{}, w8}:
7460                                  match w8:
7461                                    case WNil{}:
7462                                      {==}
7463                                case WCon{True{}, w8}:
7464                                  match w8:
7465                                    case WNil{}:
7466                                      {==}
7467                        case WCon{True{}, w6}:
7468                          match w6:
7469                            case WCon{False{}, w7}:
7470                              match w7:
7471                                case WCon{False{}, w8}:
7472                                  match w8:
7473                                    case WNil{}:
7474                                      {==}
7475                                case WCon{True{}, w8}:
7476                                  match w8:
7477                                    case WNil{}:
7478                                      {==}
7479                            case WCon{True{}, w7}:
7480                              match w7:
7481                                case WCon{False{}, w8}:
7482                                  match w8:
7483                                    case WNil{}:
7484                                      {==}
7485                                case WCon{True{}, w8}:
7486                                  match w8:
7487                                    case WNil{}:
7488                                      {==}
7489        case WCon{True{}, w2}:
7490          match w2:
7491            case WCon{False{}, w3}:
7492              match w3:
7493                case WCon{False{}, w4}:
7494                  match w4:
7495                    case WCon{False{}, w5}:
7496                      match w5:
7497                        case WCon{False{}, w6}:
7498                          match w6:
7499                            case WCon{False{}, w7}:
7500                              match w7:
7501                                case WCon{False{}, w8}:
7502                                  match w8:
7503                                    case WNil{}:
7504                                      {==}
7505                                case WCon{True{}, w8}:
7506                                  match w8:
7507                                    case WNil{}:
7508                                      {==}
7509                            case WCon{True{}, w7}:
7510                              match w7:
7511                                case WCon{False{}, w8}:
7512                                  match w8:
7513                                    case WNil{}:
7514                                      {==}
7515                                case WCon{True{}, w8}:
7516                                  match w8:
7517                                    case WNil{}:
7518                                      {==}
7519                        case WCon{True{}, w6}:
7520                          match w6:
7521                            case WCon{False{}, w7}:
7522                              match w7:
7523                                case WCon{False{}, w8}:
7524                                  match w8:
7525                                    case WNil{}:
7526                                      {==}
7527                                case WCon{True{}, w8}:
7528                                  match w8:
7529                                    case WNil{}:
7530                                      {==}
7531                            case WCon{True{}, w7}:
7532                              match w7:
7533                                case WCon{False{}, w8}:
7534                                  match w8:
7535                                    case WNil{}:
7536                                      {==}
7537                                case WCon{True{}, w8}:
7538                                  match w8:
7539                                    case WNil{}:
7540                                      {==}
7541                    case WCon{True{}, w5}:
7542                      match w5:
7543                        case WCon{False{}, w6}:
7544                          match w6:
7545                            case WCon{False{}, w7}:
7546                              match w7:
7547                                case WCon{False{}, w8}:
7548                                  match w8:
7549                                    case WNil{}:
7550                                      {==}
7551                                case WCon{True{}, w8}:
7552                                  match w8:
7553                                    case WNil{}:
7554                                      {==}
7555                            case WCon{True{}, w7}:
7556                              match w7:
7557                                case WCon{False{}, w8}:
7558                                  match w8:
7559                                    case WNil{}:
7560                                      {==}
7561                                case WCon{True{}, w8}:
7562                                  match w8:
7563                                    case WNil{}:
7564                                      {==}
7565                        case WCon{True{}, w6}:
7566                          match w6:
7567                            case WCon{False{}, w7}:
7568                              match w7:
7569                                case WCon{False{}, w8}:
7570                                  match w8:
7571                                    case WNil{}:
7572                                      {==}
7573                                case WCon{True{}, w8}:
7574                                  match w8:
7575                                    case WNil{}:
7576                                      {==}
7577                            case WCon{True{}, w7}:
7578                              match w7:
7579                                case WCon{False{}, w8}:
7580                                  match w8:
7581                                    case WNil{}:
7582                                      {==}
7583                                case WCon{True{}, w8}:
7584                                  match w8:
7585                                    case WNil{}:
7586                                      {==}
7587                case WCon{True{}, w4}:
7588                  match w4:
7589                    case WCon{False{}, w5}:
7590                      match w5:
7591                        case WCon{False{}, w6}:
7592                          match w6:
7593                            case WCon{False{}, w7}:
7594                              match w7:
7595                                case WCon{False{}, w8}:
7596                                  match w8:
7597                                    case WNil{}:
7598                                      {==}
7599                                case WCon{True{}, w8}:
7600                                  match w8:
7601                                    case WNil{}:
7602                                      {==}
7603                            case WCon{True{}, w7}:
7604                              match w7:
7605                                case WCon{False{}, w8}:
7606                                  match w8:
7607                                    case WNil{}:
7608                                      {==}
7609                                case WCon{True{}, w8}:
7610                                  match w8:
7611                                    case WNil{}:
7612                                      {==}
7613                        case WCon{True{}, w6}:
7614                          match w6:
7615                            case WCon{False{}, w7}:
7616                              match w7:
7617                                case WCon{False{}, w8}:
7618                                  match w8:
7619                                    case WNil{}:
7620                                      {==}
7621                                case WCon{True{}, w8}:
7622                                  match w8:
7623                                    case WNil{}:
7624                                      {==}
7625                            case WCon{True{}, w7}:
7626                              match w7:
7627                                case WCon{False{}, w8}:
7628                                  match w8:
7629                                    case WNil{}:
7630                                      {==}
7631                                case WCon{True{}, w8}:
7632                                  match w8:
7633                                    case WNil{}:
7634                                      {==}
7635                    case WCon{True{}, w5}:
7636                      match w5:
7637                        case WCon{False{}, w6}:
7638                          match w6:
7639                            case WCon{False{}, w7}:
7640                              match w7:
7641                                case WCon{False{}, w8}:
7642                                  match w8:
7643                                    case WNil{}:
7644                                      {==}
7645                                case WCon{True{}, w8}:
7646                                  match w8:
7647                                    case WNil{}:
7648                                      {==}
7649                            case WCon{True{}, w7}:
7650                              match w7:
7651                                case WCon{False{}, w8}:
7652                                  match w8:
7653                                    case WNil{}:
7654                                      {==}
7655                                case WCon{True{}, w8}:
7656                                  match w8:
7657                                    case WNil{}:
7658                                      {==}
7659                        case WCon{True{}, w6}:
7660                          match w6:
7661                            case WCon{False{}, w7}:
7662                              match w7:
7663                                case WCon{False{}, w8}:
7664                                  match w8:
7665                                    case WNil{}:
7666                                      {==}
7667                                case WCon{True{}, w8}:
7668                                  match w8:
7669                                    case WNil{}:
7670                                      {==}
7671                            case WCon{True{}, w7}:
7672                              match w7:
7673                                case WCon{False{}, w8}:
7674                                  match w8:
7675                                    case WNil{}:
7676                                      {==}
7677                                case WCon{True{}, w8}:
7678                                  match w8:
7679                                    case WNil{}:
7680                                      {==}
7681            case WCon{True{}, w3}:
7682              match w3:
7683                case WCon{False{}, w4}:
7684                  match w4:
7685                    case WCon{False{}, w5}:
7686                      match w5:
7687                        case WCon{False{}, w6}:
7688                          match w6:
7689                            case WCon{False{}, w7}:
7690                              match w7:
7691                                case WCon{False{}, w8}:
7692                                  match w8:
7693                                    case WNil{}:
7694                                      {==}
7695                                case WCon{True{}, w8}:
7696                                  match w8:
7697                                    case WNil{}:
7698                                      {==}
7699                            case WCon{True{}, w7}:
7700                              match w7:
7701                                case WCon{False{}, w8}:
7702                                  match w8:
7703                                    case WNil{}:
7704                                      {==}
7705                                case WCon{True{}, w8}:
7706                                  match w8:
7707                                    case WNil{}:
7708                                      {==}
7709                        case WCon{True{}, w6}:
7710                          match w6:
7711                            case WCon{False{}, w7}:
7712                              match w7:
7713                                case WCon{False{}, w8}:
7714                                  match w8:
7715                                    case WNil{}:
7716                                      {==}
7717                                case WCon{True{}, w8}:
7718                                  match w8:
7719                                    case WNil{}:
7720                                      {==}
7721                            case WCon{True{}, w7}:
7722                              match w7:
7723                                case WCon{False{}, w8}:
7724                                  match w8:
7725                                    case WNil{}:
7726                                      {==}
7727                                case WCon{True{}, w8}:
7728                                  match w8:
7729                                    case WNil{}:
7730                                      {==}
7731                    case WCon{True{}, w5}:
7732                      match w5:
7733                        case WCon{False{}, w6}:
7734                          match w6:
7735                            case WCon{False{}, w7}:
7736                              match w7:
7737                                case WCon{False{}, w8}:
7738                                  match w8:
7739                                    case WNil{}:
7740                                      {==}
7741                                case WCon{True{}, w8}:
7742                                  match w8:
7743                                    case WNil{}:
7744                                      {==}
7745                            case WCon{True{}, w7}:
7746                              match w7:
7747                                case WCon{False{}, w8}:
7748                                  match w8:
7749                                    case WNil{}:
7750                                      {==}
7751                                case WCon{True{}, w8}:
7752                                  match w8:
7753                                    case WNil{}:
7754                                      {==}
7755                        case WCon{True{}, w6}:
7756                          match w6:
7757                            case WCon{False{}, w7}:
7758                              match w7:
7759                                case WCon{False{}, w8}:
7760                                  match w8:
7761                                    case WNil{}:
7762                                      {==}
7763                                case WCon{True{}, w8}:
7764                                  match w8:
7765                                    case WNil{}:
7766                                      {==}
7767                            case WCon{True{}, w7}:
7768                              match w7:
7769                                case WCon{False{}, w8}:
7770                                  match w8:
7771                                    case WNil{}:
7772                                      {==}
7773                                case WCon{True{}, w8}:
7774                                  match w8:
7775                                    case WNil{}:
7776                                      {==}
7777                case WCon{True{}, w4}:
7778                  match w4:
7779                    case WCon{False{}, w5}:
7780                      match w5:
7781                        case WCon{False{}, w6}:
7782                          match w6:
7783                            case WCon{False{}, w7}:
7784                              match w7:
7785                                case WCon{False{}, w8}:
7786                                  match w8:
7787                                    case WNil{}:
7788                                      {==}
7789                                case WCon{True{}, w8}:
7790                                  match w8:
7791                                    case WNil{}:
7792                                      {==}
7793                            case WCon{True{}, w7}:
7794                              match w7:
7795                                case WCon{False{}, w8}:
7796                                  match w8:
7797                                    case WNil{}:
7798                                      {==}
7799                                case WCon{True{}, w8}:
7800                                  match w8:
7801                                    case WNil{}:
7802                                      {==}
7803                        case WCon{True{}, w6}:
7804                          match w6:
7805                            case WCon{False{}, w7}:
7806                              match w7:
7807                                case WCon{False{}, w8}:
7808                                  match w8:
7809                                    case WNil{}:
7810                                      {==}
7811                                case WCon{True{}, w8}:
7812                                  match w8:
7813                                    case WNil{}:
7814                                      {==}
7815                            case WCon{True{}, w7}:
7816                              match w7:
7817                                case WCon{False{}, w8}:
7818                                  match w8:
7819                                    case WNil{}:
7820                                      {==}
7821                                case WCon{True{}, w8}:
7822                                  match w8:
7823                                    case WNil{}:
7824                                      {==}
7825                    case WCon{True{}, w5}:
7826                      match w5:
7827                        case WCon{False{}, w6}:
7828                          match w6:
7829                            case WCon{False{}, w7}:
7830                              match w7:
7831                                case WCon{False{}, w8}:
7832                                  match w8:
7833                                    case WNil{}:
7834                                      {==}
7835                                case WCon{True{}, w8}:
7836                                  match w8:
7837                                    case WNil{}:
7838                                      {==}
7839                            case WCon{True{}, w7}:
7840                              match w7:
7841                                case WCon{False{}, w8}:
7842                                  match w8:
7843                                    case WNil{}:
7844                                      {==}
7845                                case WCon{True{}, w8}:
7846                                  match w8:
7847                                    case WNil{}:
7848                                      {==}
7849                        case WCon{True{}, w6}:
7850                          match w6:
7851                            case WCon{False{}, w7}:
7852                              match w7:
7853                                case WCon{False{}, w8}:
7854                                  match w8:
7855                                    case WNil{}:
7856                                      {==}
7857                                case WCon{True{}, w8}:
7858                                  match w8:
7859                                    case WNil{}:
7860                                      {==}
7861                            case WCon{True{}, w7}:
7862                              match w7:
7863                                case WCon{False{}, w8}:
7864                                  match w8:
7865                                    case WNil{}:
7866                                      {==}
7867                                case WCon{True{}, w8}:
7868                                  match w8:
7869                                    case WNil{}:
7870                                      {==}
7871
7872# SL2 undoes SL1, and SL1 undoes SL2, a byte at a time
7873def aria_sl21(s: A.LcAriaSt) -> {s == A.aria.sl2(A.aria.sl1(s)) : A.LcAriaSt}:
7874  match s:
7875    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7876      %aria_sb31(x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, A.aria.sb4(A.aria.sb2(x1)), A.aria.sb1(A.aria.sb3(x2)), A.aria.sb2(A.aria.sb4(x3)), A.aria.sb3(A.aria.sb1(x4)), A.aria.sb4(A.aria.sb2(x5)), A.aria.sb1(A.aria.sb3(x6)), A.aria.sb2(A.aria.sb4(x7)), A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7877      %aria_sb42(x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, A.aria.sb1(A.aria.sb3(x2)), A.aria.sb2(A.aria.sb4(x3)), A.aria.sb3(A.aria.sb1(x4)), A.aria.sb4(A.aria.sb2(x5)), A.aria.sb1(A.aria.sb3(x6)), A.aria.sb2(A.aria.sb4(x7)), A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7878      %aria_sb13(x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, _, A.aria.sb2(A.aria.sb4(x3)), A.aria.sb3(A.aria.sb1(x4)), A.aria.sb4(A.aria.sb2(x5)), A.aria.sb1(A.aria.sb3(x6)), A.aria.sb2(A.aria.sb4(x7)), A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7879      %aria_sb24(x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, _, A.aria.sb3(A.aria.sb1(x4)), A.aria.sb4(A.aria.sb2(x5)), A.aria.sb1(A.aria.sb3(x6)), A.aria.sb2(A.aria.sb4(x7)), A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7880      %aria_sb31(x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, _, A.aria.sb4(A.aria.sb2(x5)), A.aria.sb1(A.aria.sb3(x6)), A.aria.sb2(A.aria.sb4(x7)), A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7881      %aria_sb42(x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, _, A.aria.sb1(A.aria.sb3(x6)), A.aria.sb2(A.aria.sb4(x7)), A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7882      %aria_sb13(x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, _, A.aria.sb2(A.aria.sb4(x7)), A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7883      %aria_sb24(x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, _, A.aria.sb3(A.aria.sb1(x8)), A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7884      %aria_sb31(x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, _, A.aria.sb4(A.aria.sb2(x9)), A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7885      %aria_sb42(x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, _, A.aria.sb1(A.aria.sb3(x10)), A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7886      %aria_sb13(x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, _, A.aria.sb2(A.aria.sb4(x11)), A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7887      %aria_sb24(x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, _, A.aria.sb3(A.aria.sb1(x12)), A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7888      %aria_sb31(x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, _, A.aria.sb4(A.aria.sb2(x13)), A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7889      %aria_sb42(x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, _, A.aria.sb1(A.aria.sb3(x14)), A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7890      %aria_sb13(x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, _, A.aria.sb2(A.aria.sb4(x15))} : A.LcAriaSt}
7891      %aria_sb24(x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, _} : A.LcAriaSt}
7892      {==}
7893
7894def aria_sl12(s: A.LcAriaSt) -> {s == A.aria.sl1(A.aria.sl2(s)) : A.LcAriaSt}:
7895  match s:
7896    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7897      %aria_sb13(x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, A.aria.sb2(A.aria.sb4(x1)), A.aria.sb3(A.aria.sb1(x2)), A.aria.sb4(A.aria.sb2(x3)), A.aria.sb1(A.aria.sb3(x4)), A.aria.sb2(A.aria.sb4(x5)), A.aria.sb3(A.aria.sb1(x6)), A.aria.sb4(A.aria.sb2(x7)), A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7898      %aria_sb24(x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, A.aria.sb3(A.aria.sb1(x2)), A.aria.sb4(A.aria.sb2(x3)), A.aria.sb1(A.aria.sb3(x4)), A.aria.sb2(A.aria.sb4(x5)), A.aria.sb3(A.aria.sb1(x6)), A.aria.sb4(A.aria.sb2(x7)), A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7899      %aria_sb31(x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, _, A.aria.sb4(A.aria.sb2(x3)), A.aria.sb1(A.aria.sb3(x4)), A.aria.sb2(A.aria.sb4(x5)), A.aria.sb3(A.aria.sb1(x6)), A.aria.sb4(A.aria.sb2(x7)), A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7900      %aria_sb42(x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, _, A.aria.sb1(A.aria.sb3(x4)), A.aria.sb2(A.aria.sb4(x5)), A.aria.sb3(A.aria.sb1(x6)), A.aria.sb4(A.aria.sb2(x7)), A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7901      %aria_sb13(x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, _, A.aria.sb2(A.aria.sb4(x5)), A.aria.sb3(A.aria.sb1(x6)), A.aria.sb4(A.aria.sb2(x7)), A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7902      %aria_sb24(x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, _, A.aria.sb3(A.aria.sb1(x6)), A.aria.sb4(A.aria.sb2(x7)), A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7903      %aria_sb31(x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, _, A.aria.sb4(A.aria.sb2(x7)), A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7904      %aria_sb42(x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, _, A.aria.sb1(A.aria.sb3(x8)), A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7905      %aria_sb13(x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, _, A.aria.sb2(A.aria.sb4(x9)), A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7906      %aria_sb24(x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, _, A.aria.sb3(A.aria.sb1(x10)), A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7907      %aria_sb31(x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, _, A.aria.sb4(A.aria.sb2(x11)), A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7908      %aria_sb42(x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, _, A.aria.sb1(A.aria.sb3(x12)), A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7909      %aria_sb13(x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, _, A.aria.sb2(A.aria.sb4(x13)), A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7910      %aria_sb24(x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, _, A.aria.sb3(A.aria.sb1(x14)), A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7911      %aria_sb31(x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, _, A.aria.sb4(A.aria.sb2(x15))} : A.LcAriaSt}
7912      %aria_sb42(x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, _} : A.LcAriaSt}
7913      {==}
7914
7915# a round key XORed twice
7916def aria_xor2(s: A.LcAriaSt, k: M.CmBlock) -> {s == A.aria.xor(A.aria.xor(s, k), k) : A.LcAriaSt}:
7917  match s k:
7918    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15} M.CmBlock{U32{+k0}, U32{+k1}, U32{+k2}, U32{+k3}}:
7919      %word_xx(8n, x0, A.aria.byte0(k0)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, Word.xor(8n, Word.xor(8n, x1, A.aria.byte1(k0)), A.aria.byte1(k0)), Word.xor(8n, Word.xor(8n, x2, A.aria.byte2(k0)), A.aria.byte2(k0)), Word.xor(8n, Word.xor(8n, x3, A.aria.byte3(k0)), A.aria.byte3(k0)), Word.xor(8n, Word.xor(8n, x4, A.aria.byte0(k1)), A.aria.byte0(k1)), Word.xor(8n, Word.xor(8n, x5, A.aria.byte1(k1)), A.aria.byte1(k1)), Word.xor(8n, Word.xor(8n, x6, A.aria.byte2(k1)), A.aria.byte2(k1)), Word.xor(8n, Word.xor(8n, x7, A.aria.byte3(k1)), A.aria.byte3(k1)), Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7920      %word_xx(8n, x1, A.aria.byte1(k0)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, Word.xor(8n, Word.xor(8n, x2, A.aria.byte2(k0)), A.aria.byte2(k0)), Word.xor(8n, Word.xor(8n, x3, A.aria.byte3(k0)), A.aria.byte3(k0)), Word.xor(8n, Word.xor(8n, x4, A.aria.byte0(k1)), A.aria.byte0(k1)), Word.xor(8n, Word.xor(8n, x5, A.aria.byte1(k1)), A.aria.byte1(k1)), Word.xor(8n, Word.xor(8n, x6, A.aria.byte2(k1)), A.aria.byte2(k1)), Word.xor(8n, Word.xor(8n, x7, A.aria.byte3(k1)), A.aria.byte3(k1)), Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7921      %word_xx(8n, x2, A.aria.byte2(k0)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, _, Word.xor(8n, Word.xor(8n, x3, A.aria.byte3(k0)), A.aria.byte3(k0)), Word.xor(8n, Word.xor(8n, x4, A.aria.byte0(k1)), A.aria.byte0(k1)), Word.xor(8n, Word.xor(8n, x5, A.aria.byte1(k1)), A.aria.byte1(k1)), Word.xor(8n, Word.xor(8n, x6, A.aria.byte2(k1)), A.aria.byte2(k1)), Word.xor(8n, Word.xor(8n, x7, A.aria.byte3(k1)), A.aria.byte3(k1)), Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7922      %word_xx(8n, x3, A.aria.byte3(k0)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, _, Word.xor(8n, Word.xor(8n, x4, A.aria.byte0(k1)), A.aria.byte0(k1)), Word.xor(8n, Word.xor(8n, x5, A.aria.byte1(k1)), A.aria.byte1(k1)), Word.xor(8n, Word.xor(8n, x6, A.aria.byte2(k1)), A.aria.byte2(k1)), Word.xor(8n, Word.xor(8n, x7, A.aria.byte3(k1)), A.aria.byte3(k1)), Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7923      %word_xx(8n, x4, A.aria.byte0(k1)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, _, Word.xor(8n, Word.xor(8n, x5, A.aria.byte1(k1)), A.aria.byte1(k1)), Word.xor(8n, Word.xor(8n, x6, A.aria.byte2(k1)), A.aria.byte2(k1)), Word.xor(8n, Word.xor(8n, x7, A.aria.byte3(k1)), A.aria.byte3(k1)), Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7924      %word_xx(8n, x5, A.aria.byte1(k1)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, _, Word.xor(8n, Word.xor(8n, x6, A.aria.byte2(k1)), A.aria.byte2(k1)), Word.xor(8n, Word.xor(8n, x7, A.aria.byte3(k1)), A.aria.byte3(k1)), Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7925      %word_xx(8n, x6, A.aria.byte2(k1)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, _, Word.xor(8n, Word.xor(8n, x7, A.aria.byte3(k1)), A.aria.byte3(k1)), Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7926      %word_xx(8n, x7, A.aria.byte3(k1)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, _, Word.xor(8n, Word.xor(8n, x8, A.aria.byte0(k2)), A.aria.byte0(k2)), Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7927      %word_xx(8n, x8, A.aria.byte0(k2)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, _, Word.xor(8n, Word.xor(8n, x9, A.aria.byte1(k2)), A.aria.byte1(k2)), Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7928      %word_xx(8n, x9, A.aria.byte1(k2)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, _, Word.xor(8n, Word.xor(8n, x10, A.aria.byte2(k2)), A.aria.byte2(k2)), Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7929      %word_xx(8n, x10, A.aria.byte2(k2)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, _, Word.xor(8n, Word.xor(8n, x11, A.aria.byte3(k2)), A.aria.byte3(k2)), Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7930      %word_xx(8n, x11, A.aria.byte3(k2)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, _, Word.xor(8n, Word.xor(8n, x12, A.aria.byte0(k3)), A.aria.byte0(k3)), Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7931      %word_xx(8n, x12, A.aria.byte0(k3)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, _, Word.xor(8n, Word.xor(8n, x13, A.aria.byte1(k3)), A.aria.byte1(k3)), Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7932      %word_xx(8n, x13, A.aria.byte1(k3)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, _, Word.xor(8n, Word.xor(8n, x14, A.aria.byte2(k3)), A.aria.byte2(k3)), Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7933      %word_xx(8n, x14, A.aria.byte2(k3)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, _, Word.xor(8n, Word.xor(8n, x15, A.aria.byte3(k3)), A.aria.byte3(k3))} : A.LcAriaSt}
7934      %word_xx(8n, x15, A.aria.byte3(k3)) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, _} : A.LcAriaSt}
7935      {==}
7936
7937# each elementary step of the diffusion layer is undone by itself
7938def aria_e0(s: A.LcAriaSt) -> {s == A.aria.e0(A.aria.e0(s)) : A.LcAriaSt}:
7939  match s:
7940    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7941      %word_xx(8n, x10, x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x15), x15), Word.xor(8n, Word.xor(8n, x2, x15), x15), x3, Word.xor(8n, Word.xor(8n, x4, x15), x15), Word.xor(8n, Word.xor(8n, x5, x15), x15), x6, x7, Word.xor(8n, Word.xor(8n, x8, x15), x15), x9, _, x11, x12, x13, x14, x15} : A.LcAriaSt}
7942      %word_xx(8n, x8, x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x15), x15), Word.xor(8n, Word.xor(8n, x2, x15), x15), x3, Word.xor(8n, Word.xor(8n, x4, x15), x15), Word.xor(8n, Word.xor(8n, x5, x15), x15), x6, x7, _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7943      %word_xx(8n, x5, x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x15), x15), Word.xor(8n, Word.xor(8n, x2, x15), x15), x3, Word.xor(8n, Word.xor(8n, x4, x15), x15), _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7944      %word_xx(8n, x4, x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x15), x15), Word.xor(8n, Word.xor(8n, x2, x15), x15), x3, _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7945      %word_xx(8n, x2, x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x15), x15), _, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7946      %word_xx(8n, x1, x15) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7947      {==}
7948
7949def aria_e1(s: A.LcAriaSt) -> {s == A.aria.e1(A.aria.e1(s)) : A.LcAriaSt}:
7950  match s:
7951    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7952      %word_xx(8n, x11, x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x14), x14), x1, x2, Word.xor(8n, Word.xor(8n, x3, x14), x14), Word.xor(8n, Word.xor(8n, x4, x14), x14), Word.xor(8n, Word.xor(8n, x5, x14), x14), x6, x7, x8, Word.xor(8n, Word.xor(8n, x9, x14), x14), x10, _, x12, x13, x14, x15} : A.LcAriaSt}
7953      %word_xx(8n, x9, x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x14), x14), x1, x2, Word.xor(8n, Word.xor(8n, x3, x14), x14), Word.xor(8n, Word.xor(8n, x4, x14), x14), Word.xor(8n, Word.xor(8n, x5, x14), x14), x6, x7, x8, _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7954      %word_xx(8n, x5, x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x14), x14), x1, x2, Word.xor(8n, Word.xor(8n, x3, x14), x14), Word.xor(8n, Word.xor(8n, x4, x14), x14), _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7955      %word_xx(8n, x4, x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x14), x14), x1, x2, Word.xor(8n, Word.xor(8n, x3, x14), x14), _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7956      %word_xx(8n, x3, x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x14), x14), x1, x2, _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7957      %word_xx(8n, x0, x14) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7958      {==}
7959
7960def aria_e2(s: A.LcAriaSt) -> {s == A.aria.e2(A.aria.e2(s)) : A.LcAriaSt}:
7961  match s:
7962    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7963      %word_xx(8n, x10, x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x13), x13), x1, x2, Word.xor(8n, Word.xor(8n, x3, x13), x13), x4, x5, Word.xor(8n, Word.xor(8n, x6, x13), x13), Word.xor(8n, Word.xor(8n, x7, x13), x13), Word.xor(8n, Word.xor(8n, x8, x13), x13), x9, _, x11, x12, x13, x14, x15} : A.LcAriaSt}
7964      %word_xx(8n, x8, x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x13), x13), x1, x2, Word.xor(8n, Word.xor(8n, x3, x13), x13), x4, x5, Word.xor(8n, Word.xor(8n, x6, x13), x13), Word.xor(8n, Word.xor(8n, x7, x13), x13), _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7965      %word_xx(8n, x7, x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x13), x13), x1, x2, Word.xor(8n, Word.xor(8n, x3, x13), x13), x4, x5, Word.xor(8n, Word.xor(8n, x6, x13), x13), _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7966      %word_xx(8n, x6, x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x13), x13), x1, x2, Word.xor(8n, Word.xor(8n, x3, x13), x13), x4, x5, _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7967      %word_xx(8n, x3, x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x13), x13), x1, x2, _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7968      %word_xx(8n, x0, x13) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7969      {==}
7970
7971def aria_e3(s: A.LcAriaSt) -> {s == A.aria.e3(A.aria.e3(s)) : A.LcAriaSt}:
7972  match s:
7973    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7974      %word_xx(8n, x11, x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x12), x12), Word.xor(8n, Word.xor(8n, x2, x12), x12), x3, x4, x5, Word.xor(8n, Word.xor(8n, x6, x12), x12), Word.xor(8n, Word.xor(8n, x7, x12), x12), x8, Word.xor(8n, Word.xor(8n, x9, x12), x12), x10, _, x12, x13, x14, x15} : A.LcAriaSt}
7975      %word_xx(8n, x9, x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x12), x12), Word.xor(8n, Word.xor(8n, x2, x12), x12), x3, x4, x5, Word.xor(8n, Word.xor(8n, x6, x12), x12), Word.xor(8n, Word.xor(8n, x7, x12), x12), x8, _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7976      %word_xx(8n, x7, x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x12), x12), Word.xor(8n, Word.xor(8n, x2, x12), x12), x3, x4, x5, Word.xor(8n, Word.xor(8n, x6, x12), x12), _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7977      %word_xx(8n, x6, x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x12), x12), Word.xor(8n, Word.xor(8n, x2, x12), x12), x3, x4, x5, _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7978      %word_xx(8n, x2, x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x12), x12), _, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7979      %word_xx(8n, x1, x12) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7980      {==}
7981
7982def aria_e4(s: A.LcAriaSt) -> {s == A.aria.e4(A.aria.e4(s)) : A.LcAriaSt}:
7983  match s:
7984    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7985      %word_xx(8n, x9, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), Word.xor(8n, Word.xor(8n, x1, x11), x11), Word.xor(8n, Word.xor(8n, x2, x11), x11), Word.xor(8n, Word.xor(8n, x3, x11), x11), Word.xor(8n, Word.xor(8n, x4, x11), x11), Word.xor(8n, Word.xor(8n, x5, x11), x11), Word.xor(8n, Word.xor(8n, x6, x11), x11), Word.xor(8n, Word.xor(8n, x7, x11), x11), x8, _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7986      %word_xx(8n, x7, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), Word.xor(8n, Word.xor(8n, x1, x11), x11), Word.xor(8n, Word.xor(8n, x2, x11), x11), Word.xor(8n, Word.xor(8n, x3, x11), x11), Word.xor(8n, Word.xor(8n, x4, x11), x11), Word.xor(8n, Word.xor(8n, x5, x11), x11), Word.xor(8n, Word.xor(8n, x6, x11), x11), _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7987      %word_xx(8n, x6, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), Word.xor(8n, Word.xor(8n, x1, x11), x11), Word.xor(8n, Word.xor(8n, x2, x11), x11), Word.xor(8n, Word.xor(8n, x3, x11), x11), Word.xor(8n, Word.xor(8n, x4, x11), x11), Word.xor(8n, Word.xor(8n, x5, x11), x11), _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7988      %word_xx(8n, x5, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), Word.xor(8n, Word.xor(8n, x1, x11), x11), Word.xor(8n, Word.xor(8n, x2, x11), x11), Word.xor(8n, Word.xor(8n, x3, x11), x11), Word.xor(8n, Word.xor(8n, x4, x11), x11), _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7989      %word_xx(8n, x4, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), Word.xor(8n, Word.xor(8n, x1, x11), x11), Word.xor(8n, Word.xor(8n, x2, x11), x11), Word.xor(8n, Word.xor(8n, x3, x11), x11), _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7990      %word_xx(8n, x3, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), Word.xor(8n, Word.xor(8n, x1, x11), x11), Word.xor(8n, Word.xor(8n, x2, x11), x11), _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7991      %word_xx(8n, x2, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), Word.xor(8n, Word.xor(8n, x1, x11), x11), _, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7992      %word_xx(8n, x1, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x11), x11), _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7993      %word_xx(8n, x0, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
7994      {==}
7995
7996def aria_e5(s: A.LcAriaSt) -> {s == A.aria.e5(A.aria.e5(s)) : A.LcAriaSt}:
7997  match s:
7998    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
7999      %word_xx(8n, x8, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), Word.xor(8n, Word.xor(8n, x1, x10), x10), Word.xor(8n, Word.xor(8n, x2, x10), x10), Word.xor(8n, Word.xor(8n, x3, x10), x10), Word.xor(8n, Word.xor(8n, x4, x10), x10), Word.xor(8n, Word.xor(8n, x5, x10), x10), Word.xor(8n, Word.xor(8n, x6, x10), x10), Word.xor(8n, Word.xor(8n, x7, x10), x10), _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8000      %word_xx(8n, x7, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), Word.xor(8n, Word.xor(8n, x1, x10), x10), Word.xor(8n, Word.xor(8n, x2, x10), x10), Word.xor(8n, Word.xor(8n, x3, x10), x10), Word.xor(8n, Word.xor(8n, x4, x10), x10), Word.xor(8n, Word.xor(8n, x5, x10), x10), Word.xor(8n, Word.xor(8n, x6, x10), x10), _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8001      %word_xx(8n, x6, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), Word.xor(8n, Word.xor(8n, x1, x10), x10), Word.xor(8n, Word.xor(8n, x2, x10), x10), Word.xor(8n, Word.xor(8n, x3, x10), x10), Word.xor(8n, Word.xor(8n, x4, x10), x10), Word.xor(8n, Word.xor(8n, x5, x10), x10), _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8002      %word_xx(8n, x5, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), Word.xor(8n, Word.xor(8n, x1, x10), x10), Word.xor(8n, Word.xor(8n, x2, x10), x10), Word.xor(8n, Word.xor(8n, x3, x10), x10), Word.xor(8n, Word.xor(8n, x4, x10), x10), _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8003      %word_xx(8n, x4, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), Word.xor(8n, Word.xor(8n, x1, x10), x10), Word.xor(8n, Word.xor(8n, x2, x10), x10), Word.xor(8n, Word.xor(8n, x3, x10), x10), _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8004      %word_xx(8n, x3, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), Word.xor(8n, Word.xor(8n, x1, x10), x10), Word.xor(8n, Word.xor(8n, x2, x10), x10), _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8005      %word_xx(8n, x2, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), Word.xor(8n, Word.xor(8n, x1, x10), x10), _, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8006      %word_xx(8n, x1, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x10), x10), _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8007      %word_xx(8n, x0, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8008      {==}
8009
8010def aria_e6(s: A.LcAriaSt) -> {s == A.aria.e6(A.aria.e6(s)) : A.LcAriaSt}:
8011  match s:
8012    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8013      %word_xx(8n, x14, x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x9), x9), Word.xor(8n, Word.xor(8n, x1, x9), x9), x2, x3, x4, Word.xor(8n, Word.xor(8n, x5, x9), x9), Word.xor(8n, Word.xor(8n, x6, x9), x9), x7, x8, x9, x10, Word.xor(8n, Word.xor(8n, x11, x9), x9), Word.xor(8n, Word.xor(8n, x12, x9), x9), x13, _, x15} : A.LcAriaSt}
8014      %word_xx(8n, x12, x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x9), x9), Word.xor(8n, Word.xor(8n, x1, x9), x9), x2, x3, x4, Word.xor(8n, Word.xor(8n, x5, x9), x9), Word.xor(8n, Word.xor(8n, x6, x9), x9), x7, x8, x9, x10, Word.xor(8n, Word.xor(8n, x11, x9), x9), _, x13, x14, x15} : A.LcAriaSt}
8015      %word_xx(8n, x11, x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x9), x9), Word.xor(8n, Word.xor(8n, x1, x9), x9), x2, x3, x4, Word.xor(8n, Word.xor(8n, x5, x9), x9), Word.xor(8n, Word.xor(8n, x6, x9), x9), x7, x8, x9, x10, _, x12, x13, x14, x15} : A.LcAriaSt}
8016      %word_xx(8n, x6, x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x9), x9), Word.xor(8n, Word.xor(8n, x1, x9), x9), x2, x3, x4, Word.xor(8n, Word.xor(8n, x5, x9), x9), _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8017      %word_xx(8n, x5, x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x9), x9), Word.xor(8n, Word.xor(8n, x1, x9), x9), x2, x3, x4, _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8018      %word_xx(8n, x1, x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x9), x9), _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8019      %word_xx(8n, x0, x9) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8020      {==}
8021
8022def aria_e7(s: A.LcAriaSt) -> {s == A.aria.e7(A.aria.e7(s)) : A.LcAriaSt}:
8023  match s:
8024    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8025      %word_xx(8n, x9, x11) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8026      {==}
8027
8028def aria_e8(s: A.LcAriaSt) -> {s == A.aria.e8(A.aria.e8(s)) : A.LcAriaSt}:
8029  match s:
8030    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8031      %word_xx(8n, x15, x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x8), x8), Word.xor(8n, Word.xor(8n, x1, x8), x8), x2, x3, Word.xor(8n, Word.xor(8n, x4, x8), x8), x5, x6, Word.xor(8n, Word.xor(8n, x7, x8), x8), x8, x9, Word.xor(8n, Word.xor(8n, x10, x8), x8), x11, x12, Word.xor(8n, Word.xor(8n, x13, x8), x8), x14, _} : A.LcAriaSt}
8032      %word_xx(8n, x13, x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x8), x8), Word.xor(8n, Word.xor(8n, x1, x8), x8), x2, x3, Word.xor(8n, Word.xor(8n, x4, x8), x8), x5, x6, Word.xor(8n, Word.xor(8n, x7, x8), x8), x8, x9, Word.xor(8n, Word.xor(8n, x10, x8), x8), x11, x12, _, x14, x15} : A.LcAriaSt}
8033      %word_xx(8n, x10, x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x8), x8), Word.xor(8n, Word.xor(8n, x1, x8), x8), x2, x3, Word.xor(8n, Word.xor(8n, x4, x8), x8), x5, x6, Word.xor(8n, Word.xor(8n, x7, x8), x8), x8, x9, _, x11, x12, x13, x14, x15} : A.LcAriaSt}
8034      %word_xx(8n, x7, x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x8), x8), Word.xor(8n, Word.xor(8n, x1, x8), x8), x2, x3, Word.xor(8n, Word.xor(8n, x4, x8), x8), x5, x6, _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8035      %word_xx(8n, x4, x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x8), x8), Word.xor(8n, Word.xor(8n, x1, x8), x8), x2, x3, _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8036      %word_xx(8n, x1, x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x8), x8), _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8037      %word_xx(8n, x0, x8) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8038      {==}
8039
8040def aria_e9(s: A.LcAriaSt) -> {s == A.aria.e9(A.aria.e9(s)) : A.LcAriaSt}:
8041  match s:
8042    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8043      %word_xx(8n, x8, x10) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8044      {==}
8045
8046def aria_e10(s: A.LcAriaSt) -> {s == A.aria.e10(A.aria.e10(s)) : A.LcAriaSt}:
8047  match s:
8048    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8049      %word_xx(8n, x11, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), Word.xor(8n, Word.xor(8n, x1, x7), x7), Word.xor(8n, Word.xor(8n, x2, x7), x7), Word.xor(8n, Word.xor(8n, x3, x7), x7), x4, x5, Word.xor(8n, Word.xor(8n, x6, x7), x7), x7, Word.xor(8n, Word.xor(8n, x8, x7), x7), Word.xor(8n, Word.xor(8n, x9, x7), x7), Word.xor(8n, Word.xor(8n, x10, x7), x7), _, x12, x13, x14, x15} : A.LcAriaSt}
8050      %word_xx(8n, x10, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), Word.xor(8n, Word.xor(8n, x1, x7), x7), Word.xor(8n, Word.xor(8n, x2, x7), x7), Word.xor(8n, Word.xor(8n, x3, x7), x7), x4, x5, Word.xor(8n, Word.xor(8n, x6, x7), x7), x7, Word.xor(8n, Word.xor(8n, x8, x7), x7), Word.xor(8n, Word.xor(8n, x9, x7), x7), _, x11, x12, x13, x14, x15} : A.LcAriaSt}
8051      %word_xx(8n, x9, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), Word.xor(8n, Word.xor(8n, x1, x7), x7), Word.xor(8n, Word.xor(8n, x2, x7), x7), Word.xor(8n, Word.xor(8n, x3, x7), x7), x4, x5, Word.xor(8n, Word.xor(8n, x6, x7), x7), x7, Word.xor(8n, Word.xor(8n, x8, x7), x7), _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8052      %word_xx(8n, x8, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), Word.xor(8n, Word.xor(8n, x1, x7), x7), Word.xor(8n, Word.xor(8n, x2, x7), x7), Word.xor(8n, Word.xor(8n, x3, x7), x7), x4, x5, Word.xor(8n, Word.xor(8n, x6, x7), x7), x7, _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8053      %word_xx(8n, x6, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), Word.xor(8n, Word.xor(8n, x1, x7), x7), Word.xor(8n, Word.xor(8n, x2, x7), x7), Word.xor(8n, Word.xor(8n, x3, x7), x7), x4, x5, _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8054      %word_xx(8n, x3, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), Word.xor(8n, Word.xor(8n, x1, x7), x7), Word.xor(8n, Word.xor(8n, x2, x7), x7), _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8055      %word_xx(8n, x2, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), Word.xor(8n, Word.xor(8n, x1, x7), x7), _, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8056      %word_xx(8n, x1, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x7), x7), _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8057      %word_xx(8n, x0, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8058      {==}
8059
8060def aria_e11(s: A.LcAriaSt) -> {s == A.aria.e11(A.aria.e11(s)) : A.LcAriaSt}:
8061  match s:
8062    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8063      %word_xx(8n, x15, x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x6), x6), x2, Word.xor(8n, Word.xor(8n, x3, x6), x6), x4, x5, x6, Word.xor(8n, Word.xor(8n, x7, x6), x6), Word.xor(8n, Word.xor(8n, x8, x6), x6), x9, x10, Word.xor(8n, Word.xor(8n, x11, x6), x6), x12, x13, Word.xor(8n, Word.xor(8n, x14, x6), x6), _} : A.LcAriaSt}
8064      %word_xx(8n, x14, x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x6), x6), x2, Word.xor(8n, Word.xor(8n, x3, x6), x6), x4, x5, x6, Word.xor(8n, Word.xor(8n, x7, x6), x6), Word.xor(8n, Word.xor(8n, x8, x6), x6), x9, x10, Word.xor(8n, Word.xor(8n, x11, x6), x6), x12, x13, _, x15} : A.LcAriaSt}
8065      %word_xx(8n, x11, x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x6), x6), x2, Word.xor(8n, Word.xor(8n, x3, x6), x6), x4, x5, x6, Word.xor(8n, Word.xor(8n, x7, x6), x6), Word.xor(8n, Word.xor(8n, x8, x6), x6), x9, x10, _, x12, x13, x14, x15} : A.LcAriaSt}
8066      %word_xx(8n, x8, x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x6), x6), x2, Word.xor(8n, Word.xor(8n, x3, x6), x6), x4, x5, x6, Word.xor(8n, Word.xor(8n, x7, x6), x6), _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8067      %word_xx(8n, x7, x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x6), x6), x2, Word.xor(8n, Word.xor(8n, x3, x6), x6), x4, x5, x6, _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8068      %word_xx(8n, x3, x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x6), x6), x2, _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8069      %word_xx(8n, x1, x6) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8070      {==}
8071
8072def aria_e12(s: A.LcAriaSt) -> {s == A.aria.e12(A.aria.e12(s)) : A.LcAriaSt}:
8073  match s:
8074    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8075      %word_xx(8n, x6, x7) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, x4, x5, _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8076      {==}
8077
8078def aria_e13(s: A.LcAriaSt) -> {s == A.aria.e13(A.aria.e13(s)) : A.LcAriaSt}:
8079  match s:
8080    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8081      %word_xx(8n, x11, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), Word.xor(8n, Word.xor(8n, x1, x5), x5), Word.xor(8n, Word.xor(8n, x2, x5), x5), Word.xor(8n, Word.xor(8n, x3, x5), x5), Word.xor(8n, Word.xor(8n, x4, x5), x5), x5, x6, x7, Word.xor(8n, Word.xor(8n, x8, x5), x5), Word.xor(8n, Word.xor(8n, x9, x5), x5), Word.xor(8n, Word.xor(8n, x10, x5), x5), _, x12, x13, x14, x15} : A.LcAriaSt}
8082      %word_xx(8n, x10, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), Word.xor(8n, Word.xor(8n, x1, x5), x5), Word.xor(8n, Word.xor(8n, x2, x5), x5), Word.xor(8n, Word.xor(8n, x3, x5), x5), Word.xor(8n, Word.xor(8n, x4, x5), x5), x5, x6, x7, Word.xor(8n, Word.xor(8n, x8, x5), x5), Word.xor(8n, Word.xor(8n, x9, x5), x5), _, x11, x12, x13, x14, x15} : A.LcAriaSt}
8083      %word_xx(8n, x9, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), Word.xor(8n, Word.xor(8n, x1, x5), x5), Word.xor(8n, Word.xor(8n, x2, x5), x5), Word.xor(8n, Word.xor(8n, x3, x5), x5), Word.xor(8n, Word.xor(8n, x4, x5), x5), x5, x6, x7, Word.xor(8n, Word.xor(8n, x8, x5), x5), _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8084      %word_xx(8n, x8, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), Word.xor(8n, Word.xor(8n, x1, x5), x5), Word.xor(8n, Word.xor(8n, x2, x5), x5), Word.xor(8n, Word.xor(8n, x3, x5), x5), Word.xor(8n, Word.xor(8n, x4, x5), x5), x5, x6, x7, _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8085      %word_xx(8n, x4, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), Word.xor(8n, Word.xor(8n, x1, x5), x5), Word.xor(8n, Word.xor(8n, x2, x5), x5), Word.xor(8n, Word.xor(8n, x3, x5), x5), _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8086      %word_xx(8n, x3, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), Word.xor(8n, Word.xor(8n, x1, x5), x5), Word.xor(8n, Word.xor(8n, x2, x5), x5), _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8087      %word_xx(8n, x2, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), Word.xor(8n, Word.xor(8n, x1, x5), x5), _, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8088      %word_xx(8n, x1, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x5), x5), _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8089      %word_xx(8n, x0, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8090      {==}
8091
8092def aria_e14(s: A.LcAriaSt) -> {s == A.aria.e14(A.aria.e14(s)) : A.LcAriaSt}:
8093  match s:
8094    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8095      %word_xx(8n, x13, x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x4), x4), x2, Word.xor(8n, Word.xor(8n, x3, x4), x4), x4, Word.xor(8n, Word.xor(8n, x5, x4), x4), x6, x7, x8, Word.xor(8n, Word.xor(8n, x9, x4), x4), Word.xor(8n, Word.xor(8n, x10, x4), x4), x11, Word.xor(8n, Word.xor(8n, x12, x4), x4), _, x14, x15} : A.LcAriaSt}
8096      %word_xx(8n, x12, x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x4), x4), x2, Word.xor(8n, Word.xor(8n, x3, x4), x4), x4, Word.xor(8n, Word.xor(8n, x5, x4), x4), x6, x7, x8, Word.xor(8n, Word.xor(8n, x9, x4), x4), Word.xor(8n, Word.xor(8n, x10, x4), x4), x11, _, x13, x14, x15} : A.LcAriaSt}
8097      %word_xx(8n, x10, x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x4), x4), x2, Word.xor(8n, Word.xor(8n, x3, x4), x4), x4, Word.xor(8n, Word.xor(8n, x5, x4), x4), x6, x7, x8, Word.xor(8n, Word.xor(8n, x9, x4), x4), _, x11, x12, x13, x14, x15} : A.LcAriaSt}
8098      %word_xx(8n, x9, x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x4), x4), x2, Word.xor(8n, Word.xor(8n, x3, x4), x4), x4, Word.xor(8n, Word.xor(8n, x5, x4), x4), x6, x7, x8, _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8099      %word_xx(8n, x5, x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x4), x4), x2, Word.xor(8n, Word.xor(8n, x3, x4), x4), x4, _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8100      %word_xx(8n, x3, x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x4), x4), x2, _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8101      %word_xx(8n, x1, x4) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8102      {==}
8103
8104def aria_e15(s: A.LcAriaSt) -> {s == A.aria.e15(A.aria.e15(s)) : A.LcAriaSt}:
8105  match s:
8106    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8107      %word_xx(8n, x4, x5) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, x3, _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8108      {==}
8109
8110def aria_e16(s: A.LcAriaSt) -> {s == A.aria.e16(A.aria.e16(s)) : A.LcAriaSt}:
8111  match s:
8112    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8113      %word_xx(8n, x11, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, Word.xor(8n, Word.xor(8n, x4, x3), x3), Word.xor(8n, Word.xor(8n, x5, x3), x3), Word.xor(8n, Word.xor(8n, x6, x3), x3), Word.xor(8n, Word.xor(8n, x7, x3), x3), Word.xor(8n, Word.xor(8n, x8, x3), x3), Word.xor(8n, Word.xor(8n, x9, x3), x3), Word.xor(8n, Word.xor(8n, x10, x3), x3), _, x12, x13, x14, x15} : A.LcAriaSt}
8114      %word_xx(8n, x10, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, Word.xor(8n, Word.xor(8n, x4, x3), x3), Word.xor(8n, Word.xor(8n, x5, x3), x3), Word.xor(8n, Word.xor(8n, x6, x3), x3), Word.xor(8n, Word.xor(8n, x7, x3), x3), Word.xor(8n, Word.xor(8n, x8, x3), x3), Word.xor(8n, Word.xor(8n, x9, x3), x3), _, x11, x12, x13, x14, x15} : A.LcAriaSt}
8115      %word_xx(8n, x9, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, Word.xor(8n, Word.xor(8n, x4, x3), x3), Word.xor(8n, Word.xor(8n, x5, x3), x3), Word.xor(8n, Word.xor(8n, x6, x3), x3), Word.xor(8n, Word.xor(8n, x7, x3), x3), Word.xor(8n, Word.xor(8n, x8, x3), x3), _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8116      %word_xx(8n, x8, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, Word.xor(8n, Word.xor(8n, x4, x3), x3), Word.xor(8n, Word.xor(8n, x5, x3), x3), Word.xor(8n, Word.xor(8n, x6, x3), x3), Word.xor(8n, Word.xor(8n, x7, x3), x3), _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8117      %word_xx(8n, x7, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, Word.xor(8n, Word.xor(8n, x4, x3), x3), Word.xor(8n, Word.xor(8n, x5, x3), x3), Word.xor(8n, Word.xor(8n, x6, x3), x3), _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8118      %word_xx(8n, x6, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, Word.xor(8n, Word.xor(8n, x4, x3), x3), Word.xor(8n, Word.xor(8n, x5, x3), x3), _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8119      %word_xx(8n, x5, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, Word.xor(8n, Word.xor(8n, x4, x3), x3), _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8120      %word_xx(8n, x4, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{Word.xor(8n, Word.xor(8n, x0, x3), x3), x1, x2, x3, _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8121      %word_xx(8n, x0, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8122      {==}
8123
8124def aria_e17(s: A.LcAriaSt) -> {s == A.aria.e17(A.aria.e17(s)) : A.LcAriaSt}:
8125  match s:
8126    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8127      %word_xx(8n, x11, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, Word.xor(8n, Word.xor(8n, x4, x2), x2), Word.xor(8n, Word.xor(8n, x5, x2), x2), Word.xor(8n, Word.xor(8n, x6, x2), x2), Word.xor(8n, Word.xor(8n, x7, x2), x2), Word.xor(8n, Word.xor(8n, x8, x2), x2), Word.xor(8n, Word.xor(8n, x9, x2), x2), Word.xor(8n, Word.xor(8n, x10, x2), x2), _, x12, x13, x14, x15} : A.LcAriaSt}
8128      %word_xx(8n, x10, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, Word.xor(8n, Word.xor(8n, x4, x2), x2), Word.xor(8n, Word.xor(8n, x5, x2), x2), Word.xor(8n, Word.xor(8n, x6, x2), x2), Word.xor(8n, Word.xor(8n, x7, x2), x2), Word.xor(8n, Word.xor(8n, x8, x2), x2), Word.xor(8n, Word.xor(8n, x9, x2), x2), _, x11, x12, x13, x14, x15} : A.LcAriaSt}
8129      %word_xx(8n, x9, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, Word.xor(8n, Word.xor(8n, x4, x2), x2), Word.xor(8n, Word.xor(8n, x5, x2), x2), Word.xor(8n, Word.xor(8n, x6, x2), x2), Word.xor(8n, Word.xor(8n, x7, x2), x2), Word.xor(8n, Word.xor(8n, x8, x2), x2), _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8130      %word_xx(8n, x8, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, Word.xor(8n, Word.xor(8n, x4, x2), x2), Word.xor(8n, Word.xor(8n, x5, x2), x2), Word.xor(8n, Word.xor(8n, x6, x2), x2), Word.xor(8n, Word.xor(8n, x7, x2), x2), _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8131      %word_xx(8n, x7, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, Word.xor(8n, Word.xor(8n, x4, x2), x2), Word.xor(8n, Word.xor(8n, x5, x2), x2), Word.xor(8n, Word.xor(8n, x6, x2), x2), _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8132      %word_xx(8n, x6, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, Word.xor(8n, Word.xor(8n, x4, x2), x2), Word.xor(8n, Word.xor(8n, x5, x2), x2), _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8133      %word_xx(8n, x5, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, Word.xor(8n, Word.xor(8n, x4, x2), x2), _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8134      %word_xx(8n, x4, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, Word.xor(8n, Word.xor(8n, x1, x2), x2), x2, x3, _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8135      %word_xx(8n, x1, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8136      {==}
8137
8138def aria_e18(s: A.LcAriaSt) -> {s == A.aria.e18(A.aria.e18(s)) : A.LcAriaSt}:
8139  match s:
8140    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8141      %word_xx(8n, x15, x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, Word.xor(8n, Word.xor(8n, x2, x1), x1), x3, x4, Word.xor(8n, Word.xor(8n, x5, x1), x1), x6, Word.xor(8n, Word.xor(8n, x7, x1), x1), Word.xor(8n, Word.xor(8n, x8, x1), x1), Word.xor(8n, Word.xor(8n, x9, x1), x1), x10, x11, Word.xor(8n, Word.xor(8n, x12, x1), x1), x13, x14, _} : A.LcAriaSt}
8142      %word_xx(8n, x12, x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, Word.xor(8n, Word.xor(8n, x2, x1), x1), x3, x4, Word.xor(8n, Word.xor(8n, x5, x1), x1), x6, Word.xor(8n, Word.xor(8n, x7, x1), x1), Word.xor(8n, Word.xor(8n, x8, x1), x1), Word.xor(8n, Word.xor(8n, x9, x1), x1), x10, x11, _, x13, x14, x15} : A.LcAriaSt}
8143      %word_xx(8n, x9, x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, Word.xor(8n, Word.xor(8n, x2, x1), x1), x3, x4, Word.xor(8n, Word.xor(8n, x5, x1), x1), x6, Word.xor(8n, Word.xor(8n, x7, x1), x1), Word.xor(8n, Word.xor(8n, x8, x1), x1), _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8144      %word_xx(8n, x8, x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, Word.xor(8n, Word.xor(8n, x2, x1), x1), x3, x4, Word.xor(8n, Word.xor(8n, x5, x1), x1), x6, Word.xor(8n, Word.xor(8n, x7, x1), x1), _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8145      %word_xx(8n, x7, x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, Word.xor(8n, Word.xor(8n, x2, x1), x1), x3, x4, Word.xor(8n, Word.xor(8n, x5, x1), x1), x6, _, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8146      %word_xx(8n, x5, x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, Word.xor(8n, Word.xor(8n, x2, x1), x1), x3, x4, _, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8147      %word_xx(8n, x2, x1) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, _, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8148      {==}
8149
8150def aria_e19(s: A.LcAriaSt) -> {s == A.aria.e19(A.aria.e19(s)) : A.LcAriaSt}:
8151  match s:
8152    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8153      %word_xx(8n, x1, x2) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, _, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8154      {==}
8155
8156def aria_e20(s: A.LcAriaSt) -> {s == A.aria.e20(A.aria.e20(s)) : A.LcAriaSt}:
8157  match s:
8158    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8159      %word_xx(8n, x14, x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, Word.xor(8n, Word.xor(8n, x3, x0), x0), Word.xor(8n, Word.xor(8n, x4, x0), x0), x5, Word.xor(8n, Word.xor(8n, x6, x0), x0), x7, Word.xor(8n, Word.xor(8n, x8, x0), x0), Word.xor(8n, Word.xor(8n, x9, x0), x0), x10, x11, x12, Word.xor(8n, Word.xor(8n, x13, x0), x0), _, x15} : A.LcAriaSt}
8160      %word_xx(8n, x13, x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, Word.xor(8n, Word.xor(8n, x3, x0), x0), Word.xor(8n, Word.xor(8n, x4, x0), x0), x5, Word.xor(8n, Word.xor(8n, x6, x0), x0), x7, Word.xor(8n, Word.xor(8n, x8, x0), x0), Word.xor(8n, Word.xor(8n, x9, x0), x0), x10, x11, x12, _, x14, x15} : A.LcAriaSt}
8161      %word_xx(8n, x9, x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, Word.xor(8n, Word.xor(8n, x3, x0), x0), Word.xor(8n, Word.xor(8n, x4, x0), x0), x5, Word.xor(8n, Word.xor(8n, x6, x0), x0), x7, Word.xor(8n, Word.xor(8n, x8, x0), x0), _, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8162      %word_xx(8n, x8, x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, Word.xor(8n, Word.xor(8n, x3, x0), x0), Word.xor(8n, Word.xor(8n, x4, x0), x0), x5, Word.xor(8n, Word.xor(8n, x6, x0), x0), x7, _, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8163      %word_xx(8n, x6, x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, Word.xor(8n, Word.xor(8n, x3, x0), x0), Word.xor(8n, Word.xor(8n, x4, x0), x0), x5, _, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8164      %word_xx(8n, x4, x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, Word.xor(8n, Word.xor(8n, x3, x0), x0), _, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8165      %word_xx(8n, x3, x0) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{x0, x1, x2, _, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8166      {==}
8167
8168def aria_e21(s: A.LcAriaSt) -> {s == A.aria.e21(A.aria.e21(s)) : A.LcAriaSt}:
8169  match s:
8170    case A.LcAriaSt{+x0, +x1, +x2, +x3, +x4, +x5, +x6, +x7, +x8, +x9, +x10, +x11, +x12, +x13, +x14, +x15}:
8171      %word_xx(8n, x0, x3) : {A.LcAriaSt{x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} == A.LcAriaSt{_, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15} : A.LcAriaSt}
8172      {==}
8173
8174# the first j steps undone, last first, and the reverse
8175def aria_d0(s: A.LcAriaSt) -> {s == A.aria.u0(A.aria.d0(s)) : A.LcAriaSt}:
8176  {==}
8177
8178def aria_dd0(s: A.LcAriaSt) -> {s == A.aria.d0(A.aria.u0(s)) : A.LcAriaSt}:
8179  {==}
8180
8181def aria_d1(+s: A.LcAriaSt) -> {s == A.aria.u1(A.aria.d1(s)) : A.LcAriaSt}:
8182  %aria_e0(A.aria.d0(s)) : {s == A.aria.u0(_) : A.LcAriaSt}
8183  aria_d0(s)
8184
8185def aria_dd1(+s: A.LcAriaSt) -> {s == A.aria.d1(A.aria.u1(s)) : A.LcAriaSt}:
8186  %aria_dd0(A.aria.e0(s)) : {s == A.aria.e0(_) : A.LcAriaSt}
8187  aria_e0(s)
8188
8189def aria_d2(+s: A.LcAriaSt) -> {s == A.aria.u2(A.aria.d2(s)) : A.LcAriaSt}:
8190  %aria_e1(A.aria.d1(s)) : {s == A.aria.u1(_) : A.LcAriaSt}
8191  aria_d1(s)
8192
8193def aria_dd2(+s: A.LcAriaSt) -> {s == A.aria.d2(A.aria.u2(s)) : A.LcAriaSt}:
8194  %aria_dd1(A.aria.e1(s)) : {s == A.aria.e1(_) : A.LcAriaSt}
8195  aria_e1(s)
8196
8197def aria_d3(+s: A.LcAriaSt) -> {s == A.aria.u3(A.aria.d3(s)) : A.LcAriaSt}:
8198  %aria_e2(A.aria.d2(s)) : {s == A.aria.u2(_) : A.LcAriaSt}
8199  aria_d2(s)
8200
8201def aria_dd3(+s: A.LcAriaSt) -> {s == A.aria.d3(A.aria.u3(s)) : A.LcAriaSt}:
8202  %aria_dd2(A.aria.e2(s)) : {s == A.aria.e2(_) : A.LcAriaSt}
8203  aria_e2(s)
8204
8205def aria_d4(+s: A.LcAriaSt) -> {s == A.aria.u4(A.aria.d4(s)) : A.LcAriaSt}:
8206  %aria_e3(A.aria.d3(s)) : {s == A.aria.u3(_) : A.LcAriaSt}
8207  aria_d3(s)
8208
8209def aria_dd4(+s: A.LcAriaSt) -> {s == A.aria.d4(A.aria.u4(s)) : A.LcAriaSt}:
8210  %aria_dd3(A.aria.e3(s)) : {s == A.aria.e3(_) : A.LcAriaSt}
8211  aria_e3(s)
8212
8213def aria_d5(+s: A.LcAriaSt) -> {s == A.aria.u5(A.aria.d5(s)) : A.LcAriaSt}:
8214  %aria_e4(A.aria.d4(s)) : {s == A.aria.u4(_) : A.LcAriaSt}
8215  aria_d4(s)
8216
8217def aria_dd5(+s: A.LcAriaSt) -> {s == A.aria.d5(A.aria.u5(s)) : A.LcAriaSt}:
8218  %aria_dd4(A.aria.e4(s)) : {s == A.aria.e4(_) : A.LcAriaSt}
8219  aria_e4(s)
8220
8221def aria_d6(+s: A.LcAriaSt) -> {s == A.aria.u6(A.aria.d6(s)) : A.LcAriaSt}:
8222  %aria_e5(A.aria.d5(s)) : {s == A.aria.u5(_) : A.LcAriaSt}
8223  aria_d5(s)
8224
8225def aria_dd6(+s: A.LcAriaSt) -> {s == A.aria.d6(A.aria.u6(s)) : A.LcAriaSt}:
8226  %aria_dd5(A.aria.e5(s)) : {s == A.aria.e5(_) : A.LcAriaSt}
8227  aria_e5(s)
8228
8229def aria_d7(+s: A.LcAriaSt) -> {s == A.aria.u7(A.aria.d7(s)) : A.LcAriaSt}:
8230  %aria_e6(A.aria.d6(s)) : {s == A.aria.u6(_) : A.LcAriaSt}
8231  aria_d6(s)
8232
8233def aria_dd7(+s: A.LcAriaSt) -> {s == A.aria.d7(A.aria.u7(s)) : A.LcAriaSt}:
8234  %aria_dd6(A.aria.e6(s)) : {s == A.aria.e6(_) : A.LcAriaSt}
8235  aria_e6(s)
8236
8237def aria_d8(+s: A.LcAriaSt) -> {s == A.aria.u8(A.aria.d8(s)) : A.LcAriaSt}:
8238  %aria_e7(A.aria.d7(s)) : {s == A.aria.u7(_) : A.LcAriaSt}
8239  aria_d7(s)
8240
8241def aria_dd8(+s: A.LcAriaSt) -> {s == A.aria.d8(A.aria.u8(s)) : A.LcAriaSt}:
8242  %aria_dd7(A.aria.e7(s)) : {s == A.aria.e7(_) : A.LcAriaSt}
8243  aria_e7(s)
8244
8245def aria_d9(+s: A.LcAriaSt) -> {s == A.aria.u9(A.aria.d9(s)) : A.LcAriaSt}:
8246  %aria_e8(A.aria.d8(s)) : {s == A.aria.u8(_) : A.LcAriaSt}
8247  aria_d8(s)
8248
8249def aria_dd9(+s: A.LcAriaSt) -> {s == A.aria.d9(A.aria.u9(s)) : A.LcAriaSt}:
8250  %aria_dd8(A.aria.e8(s)) : {s == A.aria.e8(_) : A.LcAriaSt}
8251  aria_e8(s)
8252
8253def aria_d10(+s: A.LcAriaSt) -> {s == A.aria.u10(A.aria.d10(s)) : A.LcAriaSt}:
8254  %aria_e9(A.aria.d9(s)) : {s == A.aria.u9(_) : A.LcAriaSt}
8255  aria_d9(s)
8256
8257def aria_dd10(+s: A.LcAriaSt) -> {s == A.aria.d10(A.aria.u10(s)) : A.LcAriaSt}:
8258  %aria_dd9(A.aria.e9(s)) : {s == A.aria.e9(_) : A.LcAriaSt}
8259  aria_e9(s)
8260
8261def aria_d11(+s: A.LcAriaSt) -> {s == A.aria.u11(A.aria.d11(s)) : A.LcAriaSt}:
8262  %aria_e10(A.aria.d10(s)) : {s == A.aria.u10(_) : A.LcAriaSt}
8263  aria_d10(s)
8264
8265def aria_dd11(+s: A.LcAriaSt) -> {s == A.aria.d11(A.aria.u11(s)) : A.LcAriaSt}:
8266  %aria_dd10(A.aria.e10(s)) : {s == A.aria.e10(_) : A.LcAriaSt}
8267  aria_e10(s)
8268
8269def aria_d12(+s: A.LcAriaSt) -> {s == A.aria.u12(A.aria.d12(s)) : A.LcAriaSt}:
8270  %aria_e11(A.aria.d11(s)) : {s == A.aria.u11(_) : A.LcAriaSt}
8271  aria_d11(s)
8272
8273def aria_dd12(+s: A.LcAriaSt) -> {s == A.aria.d12(A.aria.u12(s)) : A.LcAriaSt}:
8274  %aria_dd11(A.aria.e11(s)) : {s == A.aria.e11(_) : A.LcAriaSt}
8275  aria_e11(s)
8276
8277def aria_d13(+s: A.LcAriaSt) -> {s == A.aria.u13(A.aria.d13(s)) : A.LcAriaSt}:
8278  %aria_e12(A.aria.d12(s)) : {s == A.aria.u12(_) : A.LcAriaSt}
8279  aria_d12(s)
8280
8281def aria_dd13(+s: A.LcAriaSt) -> {s == A.aria.d13(A.aria.u13(s)) : A.LcAriaSt}:
8282  %aria_dd12(A.aria.e12(s)) : {s == A.aria.e12(_) : A.LcAriaSt}
8283  aria_e12(s)
8284
8285def aria_d14(+s: A.LcAriaSt) -> {s == A.aria.u14(A.aria.d14(s)) : A.LcAriaSt}:
8286  %aria_e13(A.aria.d13(s)) : {s == A.aria.u13(_) : A.LcAriaSt}
8287  aria_d13(s)
8288
8289def aria_dd14(+s: A.LcAriaSt) -> {s == A.aria.d14(A.aria.u14(s)) : A.LcAriaSt}:
8290  %aria_dd13(A.aria.e13(s)) : {s == A.aria.e13(_) : A.LcAriaSt}
8291  aria_e13(s)
8292
8293def aria_d15(+s: A.LcAriaSt) -> {s == A.aria.u15(A.aria.d15(s)) : A.LcAriaSt}:
8294  %aria_e14(A.aria.d14(s)) : {s == A.aria.u14(_) : A.LcAriaSt}
8295  aria_d14(s)
8296
8297def aria_dd15(+s: A.LcAriaSt) -> {s == A.aria.d15(A.aria.u15(s)) : A.LcAriaSt}:
8298  %aria_dd14(A.aria.e14(s)) : {s == A.aria.e14(_) : A.LcAriaSt}
8299  aria_e14(s)
8300
8301def aria_d16(+s: A.LcAriaSt) -> {s == A.aria.u16(A.aria.d16(s)) : A.LcAriaSt}:
8302  %aria_e15(A.aria.d15(s)) : {s == A.aria.u15(_) : A.LcAriaSt}
8303  aria_d15(s)
8304
8305def aria_dd16(+s: A.LcAriaSt) -> {s == A.aria.d16(A.aria.u16(s)) : A.LcAriaSt}:
8306  %aria_dd15(A.aria.e15(s)) : {s == A.aria.e15(_) : A.LcAriaSt}
8307  aria_e15(s)
8308
8309def aria_d17(+s: A.LcAriaSt) -> {s == A.aria.u17(A.aria.d17(s)) : A.LcAriaSt}:
8310  %aria_e16(A.aria.d16(s)) : {s == A.aria.u16(_) : A.LcAriaSt}
8311  aria_d16(s)
8312
8313def aria_dd17(+s: A.LcAriaSt) -> {s == A.aria.d17(A.aria.u17(s)) : A.LcAriaSt}:
8314  %aria_dd16(A.aria.e16(s)) : {s == A.aria.e16(_) : A.LcAriaSt}
8315  aria_e16(s)
8316
8317def aria_d18(+s: A.LcAriaSt) -> {s == A.aria.u18(A.aria.d18(s)) : A.LcAriaSt}:
8318  %aria_e17(A.aria.d17(s)) : {s == A.aria.u17(_) : A.LcAriaSt}
8319  aria_d17(s)
8320
8321def aria_dd18(+s: A.LcAriaSt) -> {s == A.aria.d18(A.aria.u18(s)) : A.LcAriaSt}:
8322  %aria_dd17(A.aria.e17(s)) : {s == A.aria.e17(_) : A.LcAriaSt}
8323  aria_e17(s)
8324
8325def aria_d19(+s: A.LcAriaSt) -> {s == A.aria.u19(A.aria.d19(s)) : A.LcAriaSt}:
8326  %aria_e18(A.aria.d18(s)) : {s == A.aria.u18(_) : A.LcAriaSt}
8327  aria_d18(s)
8328
8329def aria_dd19(+s: A.LcAriaSt) -> {s == A.aria.d19(A.aria.u19(s)) : A.LcAriaSt}:
8330  %aria_dd18(A.aria.e18(s)) : {s == A.aria.e18(_) : A.LcAriaSt}
8331  aria_e18(s)
8332
8333def aria_d20(+s: A.LcAriaSt) -> {s == A.aria.u20(A.aria.d20(s)) : A.LcAriaSt}:
8334  %aria_e19(A.aria.d19(s)) : {s == A.aria.u19(_) : A.LcAriaSt}
8335  aria_d19(s)
8336
8337def aria_dd20(+s: A.LcAriaSt) -> {s == A.aria.d20(A.aria.u20(s)) : A.LcAriaSt}:
8338  %aria_dd19(A.aria.e19(s)) : {s == A.aria.e19(_) : A.LcAriaSt}
8339  aria_e19(s)
8340
8341def aria_d21(+s: A.LcAriaSt) -> {s == A.aria.u21(A.aria.d21(s)) : A.LcAriaSt}:
8342  %aria_e20(A.aria.d20(s)) : {s == A.aria.u20(_) : A.LcAriaSt}
8343  aria_d20(s)
8344
8345def aria_dd21(+s: A.LcAriaSt) -> {s == A.aria.d21(A.aria.u21(s)) : A.LcAriaSt}:
8346  %aria_dd20(A.aria.e20(s)) : {s == A.aria.e20(_) : A.LcAriaSt}
8347  aria_e20(s)
8348
8349def aria_d22(+s: A.LcAriaSt) -> {s == A.aria.u22(A.aria.d22(s)) : A.LcAriaSt}:
8350  %aria_e21(A.aria.d21(s)) : {s == A.aria.u21(_) : A.LcAriaSt}
8351  aria_d21(s)
8352
8353def aria_dd22(+s: A.LcAriaSt) -> {s == A.aria.d22(A.aria.u22(s)) : A.LcAriaSt}:
8354  %aria_dd21(A.aria.e21(s)) : {s == A.aria.e21(_) : A.LcAriaSt}
8355  aria_e21(s)
8356
8357def aria_diff(s: A.LcAriaSt) -> {s == A.aria.undiffuse(A.aria.diffuse(s)) : A.LcAriaSt}:
8358  aria_d22(s)
8359
8360def aria_diffd(s: A.LcAriaSt) -> {s == A.aria.diffuse(A.aria.undiffuse(s)) : A.LcAriaSt}:
8361  aria_dd22(s)
8362
8363# a block read back from its bytes, and the bytes from their block, on the bits
8364def aria_blk(b: M.CmBlock) -> {b == A.aria.to_block(A.aria.of_block(b)) : M.CmBlock}:
8365  match b:
8366    case M.CmBlock{U32{WCon{a0_0, WCon{a0_1, WCon{a0_2, WCon{a0_3, WCon{a0_4, WCon{a0_5, WCon{a0_6, WCon{a0_7, WCon{a0_8, WCon{a0_9, WCon{a0_10, WCon{a0_11, WCon{a0_12, WCon{a0_13, WCon{a0_14, WCon{a0_15, WCon{a0_16, WCon{a0_17, WCon{a0_18, WCon{a0_19, WCon{a0_20, WCon{a0_21, WCon{a0_22, WCon{a0_23, WCon{a0_24, WCon{a0_25, WCon{a0_26, WCon{a0_27, WCon{a0_28, WCon{a0_29, WCon{a0_30, WCon{a0_31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, U32{WCon{a1_0, WCon{a1_1, WCon{a1_2, WCon{a1_3, WCon{a1_4, WCon{a1_5, WCon{a1_6, WCon{a1_7, WCon{a1_8, WCon{a1_9, WCon{a1_10, WCon{a1_11, WCon{a1_12, WCon{a1_13, WCon{a1_14, WCon{a1_15, WCon{a1_16, WCon{a1_17, WCon{a1_18, WCon{a1_19, WCon{a1_20, WCon{a1_21, WCon{a1_22, WCon{a1_23, WCon{a1_24, WCon{a1_25, WCon{a1_26, WCon{a1_27, WCon{a1_28, WCon{a1_29, WCon{a1_30, WCon{a1_31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, U32{WCon{a2_0, WCon{a2_1, WCon{a2_2, WCon{a2_3, WCon{a2_4, WCon{a2_5, WCon{a2_6, WCon{a2_7, WCon{a2_8, WCon{a2_9, WCon{a2_10, WCon{a2_11, WCon{a2_12, WCon{a2_13, WCon{a2_14, WCon{a2_15, WCon{a2_16, WCon{a2_17, WCon{a2_18, WCon{a2_19, WCon{a2_20, WCon{a2_21, WCon{a2_22, WCon{a2_23, WCon{a2_24, WCon{a2_25, WCon{a2_26, WCon{a2_27, WCon{a2_28, WCon{a2_29, WCon{a2_30, WCon{a2_31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, U32{WCon{a3_0, WCon{a3_1, WCon{a3_2, WCon{a3_3, WCon{a3_4, WCon{a3_5, WCon{a3_6, WCon{a3_7, WCon{a3_8, WCon{a3_9, WCon{a3_10, WCon{a3_11, WCon{a3_12, WCon{a3_13, WCon{a3_14, WCon{a3_15, WCon{a3_16, WCon{a3_17, WCon{a3_18, WCon{a3_19, WCon{a3_20, WCon{a3_21, WCon{a3_22, WCon{a3_23, WCon{a3_24, WCon{a3_25, WCon{a3_26, WCon{a3_27, WCon{a3_28, WCon{a3_29, WCon{a3_30, WCon{a3_31, WNil{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:
8367      {==}
8368
8369def aria_st(s: A.LcAriaSt) -> {s == A.aria.of_block(A.aria.to_block(s)) : A.LcAriaSt}:
8370  match s:
8371    case A.LcAriaSt{WCon{b0_0, WCon{b0_1, WCon{b0_2, WCon{b0_3, WCon{b0_4, WCon{b0_5, WCon{b0_6, WCon{b0_7, WNil{}}}}}}}}}, WCon{b1_0, WCon{b1_1, WCon{b1_2, WCon{b1_3, WCon{b1_4, WCon{b1_5, WCon{b1_6, WCon{b1_7, WNil{}}}}}}}}}, WCon{b2_0, WCon{b2_1, WCon{b2_2, WCon{b2_3, WCon{b2_4, WCon{b2_5, WCon{b2_6, WCon{b2_7, WNil{}}}}}}}}}, WCon{b3_0, WCon{b3_1, WCon{b3_2, WCon{b3_3, WCon{b3_4, WCon{b3_5, WCon{b3_6, WCon{b3_7, WNil{}}}}}}}}}, WCon{b4_0, WCon{b4_1, WCon{b4_2, WCon{b4_3, WCon{b4_4, WCon{b4_5, WCon{b4_6, WCon{b4_7, WNil{}}}}}}}}}, WCon{b5_0, WCon{b5_1, WCon{b5_2, WCon{b5_3, WCon{b5_4, WCon{b5_5, WCon{b5_6, WCon{b5_7, WNil{}}}}}}}}}, WCon{b6_0, WCon{b6_1, WCon{b6_2, WCon{b6_3, WCon{b6_4, WCon{b6_5, WCon{b6_6, WCon{b6_7, WNil{}}}}}}}}}, WCon{b7_0, WCon{b7_1, WCon{b7_2, WCon{b7_3, WCon{b7_4, WCon{b7_5, WCon{b7_6, WCon{b7_7, WNil{}}}}}}}}}, WCon{b8_0, WCon{b8_1, WCon{b8_2, WCon{b8_3, WCon{b8_4, WCon{b8_5, WCon{b8_6, WCon{b8_7, WNil{}}}}}}}}}, WCon{b9_0, WCon{b9_1, WCon{b9_2, WCon{b9_3, WCon{b9_4, WCon{b9_5, WCon{b9_6, WCon{b9_7, WNil{}}}}}}}}}, WCon{b10_0, WCon{b10_1, WCon{b10_2, WCon{b10_3, WCon{b10_4, WCon{b10_5, WCon{b10_6, WCon{b10_7, WNil{}}}}}}}}}, WCon{b11_0, WCon{b11_1, WCon{b11_2, WCon{b11_3, WCon{b11_4, WCon{b11_5, WCon{b11_6, WCon{b11_7, WNil{}}}}}}}}}, WCon{b12_0, WCon{b12_1, WCon{b12_2, WCon{b12_3, WCon{b12_4, WCon{b12_5, WCon{b12_6, WCon{b12_7, WNil{}}}}}}}}}, WCon{b13_0, WCon{b13_1, WCon{b13_2, WCon{b13_3, WCon{b13_4, WCon{b13_5, WCon{b13_6, WCon{b13_7, WNil{}}}}}}}}}, WCon{b14_0, WCon{b14_1, WCon{b14_2, WCon{b14_3, WCon{b14_4, WCon{b14_5, WCon{b14_6, WCon{b14_7, WNil{}}}}}}}}}, WCon{b15_0, WCon{b15_1, WCon{b15_2, WCon{b15_3, WCon{b15_4, WCon{b15_5, WCon{b15_6, WCon{b15_7, WNil{}}}}}}}}}}:
8372      {==}
8373# END GENERATED: aria
8374
8375def aria_unop_op(o: A.LcAriaOp, +s: A.LcAriaSt) -> {s == A.aria.unop(o, A.aria.op(o, s)) : A.LcAriaSt}:
8376  match o:
8377    case A.LcAriaRk{+k}:
8378      aria_xor2(s, k)
8379    case A.LcAriaSl1{}:
8380      aria_sl21(s)
8381    case A.LcAriaSl2{}:
8382      aria_sl12(s)
8383    case A.LcAriaDiff{}:
8384      aria_diff(s)
8385
8386def aria_op_unop(o: A.LcAriaOp, +s: A.LcAriaSt) -> {s == A.aria.op(o, A.aria.unop(o, s)) : A.LcAriaSt}:
8387  match o:
8388    case A.LcAriaRk{+k}:
8389      aria_xor2(s, k)
8390    case A.LcAriaSl1{}:
8391      aria_sl12(s)
8392    case A.LcAriaSl2{}:
8393      aria_sl21(s)
8394    case A.LcAriaDiff{}:
8395      aria_diffd(s)
8396
8397def aria_unrun_run(os: List<&2, A.LcAriaOp>, +s: A.LcAriaSt) -> {s == A.aria.unrun(os, A.aria.run(os, s)) : A.LcAriaSt}:
8398  match os:
8399    case Nil{}:
8400      {==}
8401    case Con{+o, +t}:
8402      %aria_unrun_run(t, A.aria.op(o, s)) : {s == A.aria.unop(o, _) : A.LcAriaSt}
8403      aria_unop_op(o, s)
8404
8405def aria_run_unrun(os: List<&2, A.LcAriaOp>, +s: A.LcAriaSt) -> {s == A.aria.run(os, A.aria.unrun(os, s)) : A.LcAriaSt}:
8406  match os:
8407    case Nil{}:
8408      {==}
8409    case Con{+o, +t}:
8410      %aria_op_unop(o, A.aria.unrun(t, s)) : {s == A.aria.run(t, _) : A.LcAriaSt}
8411      aria_run_unrun(t, s)
8412
8413def Laws.aria_round_trip(k, b):
8414  match k:
8415    case A.LcAriaKey{+ops}:
8416      %aria_st(A.aria.run(ops, A.aria.of_block(b))) : {A.aria.to_block(A.aria.unrun(ops, _)) == b : M.CmBlock}
8417      %aria_unrun_run(ops, A.aria.of_block(b)) : {A.aria.to_block(_) == b : M.CmBlock}
8418      Equal.sym(M.CmBlock, b, A.aria.to_block(A.aria.of_block(b)), aria_blk(b))
8419
8420def Laws.aria_round_trip_dual(k, b):
8421  match k:
8422    case A.LcAriaKey{+ops}:
8423      %aria_st(A.aria.unrun(ops, A.aria.of_block(b))) : {A.aria.to_block(A.aria.run(ops, _)) == b : M.CmBlock}
8424      %aria_run_unrun(ops, A.aria.of_block(b)) : {A.aria.to_block(_) == b : M.CmBlock}
8425      Equal.sym(M.CmBlock, b, A.aria.to_block(A.aria.of_block(b)), aria_blk(b))
8426
8427# RC4: the tail-recursive loop is the structural form; XORing the keystream
8428# twice gives each byte back; the structural form splits at an append
8429
8430# the loop, for every list and state, is the structural output reversed
8431# onto what it had
8432def rc4_go_ref(xs: List<&2, U32>, +st: R.LcRc4State, +acc: List<&2, U32>) -> {R.rc4.go(xs, st, acc) == R.LcRc4Run{R.rc4.after(xs, st), R.rc4.rev_onto(acc, R.rc4.xs(xs, st))} : R.LcRc4Run}:
8433  match xs:
8434    case Nil{}:
8435      {==}
8436    case Con{x, t}:
8437      rc4_go_ref(t, R.rc4.step.st(R.rc4.next(st)), Con{B.byte(U32.xor(x, R.rc4.step.k(R.rc4.next(st)))), acc})
8438
8439def rc4_update_ref(+st: R.LcRc4State, +m: B.Octets) -> {R.LcRc4Out{R.rc4.after(B.Octets.to_list(m), st), B.Octets.of_list(R.rc4.xs(B.Octets.to_list(m), st))} == R.LcRc4.update(st, m) : R.LcRc4Out}:
8440  %Equal.sym(R.LcRc4Run, R.rc4.go(B.Octets.to_list(m), st, Nil{}), R.LcRc4Run{R.rc4.after(B.Octets.to_list(m), st), R.rc4.rev_onto(Nil{}, R.rc4.xs(B.Octets.to_list(m), st))}, rc4_go_ref(B.Octets.to_list(m), st, Nil{})) : {R.LcRc4Out{R.rc4.after(B.Octets.to_list(m), st), B.Octets.of_list(R.rc4.xs(B.Octets.to_list(m), st))} == R.rc4.out(_) : R.LcRc4Out}
8441  {==}
8442
8443def byte_xx(+h: U32, +k: U32) -> {B.byte(h) == B.byte(U32.xor(B.byte(U32.xor(h, k)), k)) : U32}:
8444  %byte_xor_byte(U32.xor(h, k), k) : {B.byte(h) == _ : U32}
8445  %u32_xx(h, k) : {B.byte(h) == B.byte(_) : U32}
8446  {==}
8447
8448def rc4_mask_xs(ys: List<&2, U32>, +st: R.LcRc4State) -> {R.rc4.xs(ys, st) == R.rc4.xs(B.mask(ys), st) : List<&2, U32>}:
8449  match ys:
8450    case Nil{}:
8451      {==}
8452    case Con{+h, +t}:
8453      %byte_xor_byte(h, R.rc4.step.k(R.rc4.next(st))) : {Con{B.byte(U32.xor(h, R.rc4.step.k(R.rc4.next(st)))), R.rc4.xs(t, R.rc4.step.st(R.rc4.next(st)))} == Con{_, R.rc4.xs(B.mask(t), R.rc4.step.st(R.rc4.next(st)))} : List<&2, U32>}
8454      %rc4_mask_xs(t, R.rc4.step.st(R.rc4.next(st))) : {Con{B.byte(U32.xor(h, R.rc4.step.k(R.rc4.next(st)))), R.rc4.xs(t, R.rc4.step.st(R.rc4.next(st)))} == Con{B.byte(U32.xor(h, R.rc4.step.k(R.rc4.next(st)))), _} : List<&2, U32>}
8455      {==}
8456
8457def rc4_xs_xs(ys: List<&2, U32>, +st: R.LcRc4State) -> {B.mask(ys) == R.rc4.xs(R.rc4.xs(ys, st), st) : List<&2, U32>}:
8458  match ys:
8459    case Nil{}:
8460      {==}
8461    case Con{+h, +t}:
8462      %byte_xx(h, R.rc4.step.k(R.rc4.next(st))) : {Con{B.byte(h), B.mask(t)} == Con{_, R.rc4.xs(R.rc4.xs(t, R.rc4.step.st(R.rc4.next(st))), R.rc4.step.st(R.rc4.next(st)))} : List<&2, U32>}
8463      %rc4_xs_xs(t, R.rc4.step.st(R.rc4.next(st))) : {Con{B.byte(h), B.mask(t)} == Con{B.byte(h), _} : List<&2, U32>}
8464      {==}
8465
8466def Laws.rc4_involution(st, m):
8467  %rc4_update_ref(st, m) : {R.LcRc4.out_data(R.LcRc4.update(st, R.LcRc4.out_data(_))) == m : B.Octets}
8468  %rc4_update_ref(st, B.Octets.of_list(R.rc4.xs(B.Octets.to_list(m), st))) : {R.LcRc4.out_data(_) == m : B.Octets}
8469  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.of_list(R.rc4.xs(B.Octets.to_list(m), st))), B.mask(R.rc4.xs(B.Octets.to_list(m), st)), BL.octets_to_of(R.rc4.xs(B.Octets.to_list(m), st))) : {B.Octets.of_list(R.rc4.xs(_, st)) == m : B.Octets}
8470  %rc4_mask_xs(R.rc4.xs(B.Octets.to_list(m), st), st) : {B.Octets.of_list(_) == m : B.Octets}
8471  %rc4_xs_xs(B.Octets.to_list(m), st) : {B.Octets.of_list(_) == m : B.Octets}
8472  %BL.octets_to_of(B.Octets.to_list(m)) : {B.Octets.of_list(_) == m : B.Octets}
8473  %Equal.sym(B.Octets, B.Octets.of_list(B.Octets.to_list(B.Octets.of_list(B.Octets.to_list(m)))), B.Octets.of_list(B.Octets.to_list(m)), BL.octets_of_list_idempotent(B.Octets.to_list(m))) : {_ == m : B.Octets}
8474  BL.octets_of_to(m)
8475
8476def rc4_after_append(xs: List<&2, U32>, +ys: List<&2, U32>, +st: R.LcRc4State) -> {R.rc4.after(B.append(xs, ys), st) == R.rc4.after(ys, R.rc4.after(xs, st)) : R.LcRc4State}:
8477  match xs:
8478    case Nil{}:
8479      {==}
8480    case Con{x, t}:
8481      rc4_after_append(t, ys, R.rc4.step.st(R.rc4.next(st)))
8482
8483def rc4_xs_append(xs: List<&2, U32>, +ys: List<&2, U32>, +st: R.LcRc4State) -> {R.rc4.xs(B.append(xs, ys), st) == B.append(R.rc4.xs(xs, st), R.rc4.xs(ys, R.rc4.after(xs, st))) : List<&2, U32>}:
8484  match xs:
8485    case Nil{}:
8486      {==}
8487    case Con{+x, +t}:
8488      %rc4_xs_append(t, ys, R.rc4.step.st(R.rc4.next(st))) : {Con{B.byte(U32.xor(x, R.rc4.step.k(R.rc4.next(st)))), R.rc4.xs(B.append(t, ys), R.rc4.step.st(R.rc4.next(st)))} == Con{B.byte(U32.xor(x, R.rc4.step.k(R.rc4.next(st)))), _} : List<&2, U32>}
8489      {==}
8490
8491def mask_append(p: List<&2, U32>, +q: List<&2, U32>) -> {B.mask(B.append(p, q)) == B.append(B.mask(p), B.mask(q)) : List<&2, U32>}:
8492  match p:
8493    case Nil{}:
8494      {==}
8495    case Con{+h, +t}:
8496      %mask_append(t, q) : {Con{B.byte(h), B.mask(B.append(t, q))} == Con{B.byte(h), _} : List<&2, U32>}
8497      {==}
8498
8499# Octets.of_list of an append is the append of the Octets (from bytes' laws)
8500def octets_of_append(+p: List<&2, U32>, +q: List<&2, U32>) -> {B.Octets.of_list(B.append(p, q)) == B.Octets.append(B.Octets.of_list(p), B.Octets.of_list(q)) : B.Octets}:
8501  %BL.octets_of_to(B.Octets.append(B.Octets.of_list(p), B.Octets.of_list(q))) : {B.Octets.of_list(B.append(p, q)) == _ : B.Octets}
8502  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.append(B.Octets.of_list(p), B.Octets.of_list(q))), B.append(B.Octets.to_list(B.Octets.of_list(p)), B.Octets.to_list(B.Octets.of_list(q))), BL.octets_append_list(B.Octets.of_list(p), B.Octets.of_list(q))) : {B.Octets.of_list(B.append(p, q)) == B.Octets.of_list(_) : B.Octets}
8503  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.of_list(p)), B.mask(p), BL.octets_to_of(p)) : {B.Octets.of_list(B.append(p, q)) == B.Octets.of_list(B.append(_, B.Octets.to_list(B.Octets.of_list(q)))) : B.Octets}
8504  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.of_list(q)), B.mask(q), BL.octets_to_of(q)) : {B.Octets.of_list(B.append(p, q)) == B.Octets.of_list(B.append(B.mask(p), _)) : B.Octets}
8505  %mask_append(p, q) : {B.Octets.of_list(B.append(p, q)) == B.Octets.of_list(_) : B.Octets}
8506  %BL.octets_to_of(B.append(p, q)) : {B.Octets.of_list(B.append(p, q)) == B.Octets.of_list(_) : B.Octets}
8507  %Equal.sym(B.Octets, B.Octets.of_list(B.Octets.to_list(B.Octets.of_list(B.append(p, q)))), B.Octets.of_list(B.append(p, q)), BL.octets_of_list_idempotent(B.append(p, q))) : {B.Octets.of_list(B.append(p, q)) == _ : B.Octets}
8508  {==}
8509
8510def Laws.rc4_streaming_state(st, a, b):
8511  %rc4_update_ref(st, a) : {R.LcRc4.out_state(R.LcRc4.update(st, B.Octets.append(a, b))) == R.LcRc4.out_state(R.LcRc4.update(R.LcRc4.out_state(_), b)) : R.LcRc4State}
8512  %rc4_update_ref(R.rc4.after(B.Octets.to_list(a), st), b) : {R.LcRc4.out_state(R.LcRc4.update(st, B.Octets.append(a, b))) == R.LcRc4.out_state(_) : R.LcRc4State}
8513  %rc4_update_ref(st, B.Octets.append(a, b)) : {R.LcRc4.out_state(_) == R.rc4.after(B.Octets.to_list(b), R.rc4.after(B.Octets.to_list(a), st)) : R.LcRc4State}
8514  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.append(a, b)), B.append(B.Octets.to_list(a), B.Octets.to_list(b)), BL.octets_append_list(a, b)) : {R.rc4.after(_, st) == R.rc4.after(B.Octets.to_list(b), R.rc4.after(B.Octets.to_list(a), st)) : R.LcRc4State}
8515  rc4_after_append(B.Octets.to_list(a), B.Octets.to_list(b), st)
8516
8517def Laws.rc4_streaming_data(st, a, b):
8518  %rc4_update_ref(st, a) : {R.LcRc4.out_data(R.LcRc4.update(st, B.Octets.append(a, b))) == B.Octets.append(R.LcRc4.out_data(_), R.LcRc4.out_data(R.LcRc4.update(R.LcRc4.out_state(_), b))) : B.Octets}
8519  %rc4_update_ref(R.rc4.after(B.Octets.to_list(a), st), b) : {R.LcRc4.out_data(R.LcRc4.update(st, B.Octets.append(a, b))) == B.Octets.append(B.Octets.of_list(R.rc4.xs(B.Octets.to_list(a), st)), R.LcRc4.out_data(_)) : B.Octets}
8520  %rc4_update_ref(st, B.Octets.append(a, b)) : {R.LcRc4.out_data(_) == B.Octets.append(B.Octets.of_list(R.rc4.xs(B.Octets.to_list(a), st)), B.Octets.of_list(R.rc4.xs(B.Octets.to_list(b), R.rc4.after(B.Octets.to_list(a), st)))) : B.Octets}
8521  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.append(a, b)), B.append(B.Octets.to_list(a), B.Octets.to_list(b)), BL.octets_append_list(a, b)) : {B.Octets.of_list(R.rc4.xs(_, st)) == B.Octets.append(B.Octets.of_list(R.rc4.xs(B.Octets.to_list(a), st)), B.Octets.of_list(R.rc4.xs(B.Octets.to_list(b), R.rc4.after(B.Octets.to_list(a), st)))) : B.Octets}
8522  %Equal.sym(List<&2, U32>, R.rc4.xs(B.append(B.Octets.to_list(a), B.Octets.to_list(b)), st), B.append(R.rc4.xs(B.Octets.to_list(a), st), R.rc4.xs(B.Octets.to_list(b), R.rc4.after(B.Octets.to_list(a), st))), rc4_xs_append(B.Octets.to_list(a), B.Octets.to_list(b), st)) : {B.Octets.of_list(_) == B.Octets.append(B.Octets.of_list(R.rc4.xs(B.Octets.to_list(a), st)), B.Octets.of_list(R.rc4.xs(B.Octets.to_list(b), R.rc4.after(B.Octets.to_list(a), st)))) : B.Octets}
8523  octets_of_append(R.rc4.xs(B.Octets.to_list(a), st), R.rc4.xs(B.Octets.to_list(b), R.rc4.after(B.Octets.to_list(a), st)))
8524
8525# 64-bit blocks as bytes (blk_bytes and blk8 above)
8526
8527def Laws.block64_octets_round_trip(b):
8528  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.of_list(L.lc.block_bytes(b, Nil{}))), B.mask(L.lc.block_bytes(b, Nil{})), BL.octets_to_of(L.lc.block_bytes(b, Nil{}))) : {L.lc.block_of(_) == Some{b} : Maybe<&2, L.LcBlock64>}
8529  blk_bytes(b)
8530
8531# the bytes of the blocks bs in front of ys, structurally
8532def m64_joins(bs: List<&2, L.LcBlock64>, ys: List<&2, U32>) -> List<&2, U32>:
8533  match bs:
8534    case Nil{}:
8535      ys
8536    case Con{b, t}:
8537      L.lc.block_bytes(b, m64_joins(t, ys))
8538
8539def m64_join_rev(bs: List<&2, L.LcBlock64>, +zs: List<&2, L.LcBlock64>, +ys: List<&2, U32>) -> {X.m64.join(zs, m64_joins(bs, ys)) == X.m64.join(X.m64.rev_onto(bs, zs), ys) : List<&2, U32>}:
8540  match bs:
8541    case Nil{}:
8542      {==}
8543    case Con{b, t}:
8544      m64_join_rev(t, Con{b, zs}, ys)
8545
8546def m64_split_joins(bs: List<&2, L.LcBlock64>, +acc: List<&2, L.LcBlock64>) -> {X.m64.split(B.mask(m64_joins(bs, Nil{})), acc) == Some{X.m64.rev_onto(acc, bs)} : Maybe<&2, List<&2, L.LcBlock64>>}:
8547  match bs:
8548    case Nil{}:
8549      {==}
8550    case Con{L.LcBlock64{+hi, +lo}, +t}:
8551      %blk8(hi, lo) : {X.m64.split(B.mask(m64_joins(t, Nil{})), Con{_, acc}) == Some{X.m64.rev_onto(acc, Con{L.LcBlock64{hi, lo}, t})} : Maybe<&2, List<&2, L.LcBlock64>>}
8552      m64_split_joins(t, Con{L.LcBlock64{hi, lo}, acc})
8553
8554def Laws.blocks64_octets_round_trip(bs):
8555  %Equal.sym(List<&2, U32>, B.Octets.to_list(B.Octets.of_list(X.m64.join(X.m64.rev_onto(bs, Nil{}), Nil{}))), B.mask(X.m64.join(X.m64.rev_onto(bs, Nil{}), Nil{})), BL.octets_to_of(X.m64.join(X.m64.rev_onto(bs, Nil{}), Nil{}))) : {X.m64.blocks(B.Octets.len(X.Lc64.octets_of(bs)), X.m64.split(_, Nil{})) == Done{bs} : Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>}
8556  %m64_join_rev(bs, Nil{}, Nil{}) : {X.m64.blocks(B.Octets.len(X.Lc64.octets_of(bs)), X.m64.split(B.mask(_), Nil{})) == Done{bs} : Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>}
8557  %Equal.sym(Maybe<&2, List<&2, L.LcBlock64>>, X.m64.split(B.mask(m64_joins(bs, Nil{})), Nil{}), Some{X.m64.rev_onto(Nil{}, bs)}, m64_split_joins(bs, Nil{})) : {X.m64.blocks(B.Octets.len(X.Lc64.octets_of(bs)), _) == Done{bs} : Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>}
8558  {==}
8559
8560# The modes: the tail-recursive loops are the structural forms; then XOR and
8561# decryption undo each block, for any cipher whose decryption undoes its
8562# encryption (for DES and 3DES, by their laws)
8563
8564def bool_xx2(a: Bool, b: Bool) -> {b == Bool.xor(a, Bool.xor(a, b)) : Bool}:
8565  match a b:
8566    case True{} True{}:
8567      {==}
8568    case True{} False{}:
8569      {==}
8570    case False{} True{}:
8571      {==}
8572    case False{} False{}:
8573      {==}
8574
8575def word_xx2(n: Nat, a: Word(n), b: Word(n)) -> {b == Word.xor(n, a, Word.xor(n, a, b)) : Word(n)}:
8576  match n:
8577    case 0n:
8578      match a b:
8579        case WNil{} WNil{}:
8580          {==}
8581    case 1n+p:
8582      match a b:
8583        case WCon{ah, at} WCon{bh, bt}:
8584          %bool_xx2(ah, bh) : {WCon{bh, bt} == WCon{_, Word.xor(p, at, Word.xor(p, at, bt))} : Word(1n+p)}
8585          %word_xx2(p, at, bt) : {WCon{bh, bt} == WCon{bh, _} : Word(1n+p)}
8586          {==}
8587
8588def u32_xx2(a: U32, b: U32) -> {b == U32.xor(a, U32.xor(a, b)) : U32}:
8589  match a b:
8590    case U32{x} U32{y}:
8591      %word_xx2(32n, x, y) : {U32{y} == U32{_} : U32}
8592      {==}
8593
8594def b64_xx2(a: L.LcBlock64, b: L.LcBlock64) -> {b == L.LcBlock64.xor(a, L.LcBlock64.xor(a, b)) : L.LcBlock64}:
8595  match a b:
8596    case L.LcBlock64{+a0, +a1} L.LcBlock64{+b0, +b1}:
8597      %u32_xx2(a0, b0) : {L.LcBlock64{b0, b1} == L.LcBlock64{_, U32.xor(a1, U32.xor(a1, b1))} : L.LcBlock64}
8598      %u32_xx2(a1, b1) : {L.LcBlock64{b0, b1} == L.LcBlock64{b0, _} : L.LcBlock64}
8599      {==}
8600
8601def ecb_ref(~K: Data, ~f: K -> L.LcBlock64 -> L.LcBlock64, +k: K, bs: List<&2, L.LcBlock64>, +acc: List<&2, L.LcBlock64>) -> {X.m64.ecb.go(~K, ~f, k, bs, acc) == X.m64.rev_onto(acc, X.m64.ecb(~K, ~f, k, bs)) : List<&2, L.LcBlock64>}:
8602  match bs:
8603    case Nil{}:
8604      {==}
8605    case Con{b, t}:
8606      ecb_ref(~K, ~f, k, t, Con{f(k, b), acc})
8607
8608def cbc_enc_ref(~K: Data, ~enc: K -> L.LcBlock64 -> L.LcBlock64, +k: K, bs: List<&2, L.LcBlock64>, +iv: L.LcBlock64, +acc: List<&2, L.LcBlock64>) -> {X.m64.cbc.enc.go(~K, ~enc, k, bs, iv, acc) == X.m64.rev_onto(acc, X.m64.cbc.enc(~K, ~enc, k, bs, iv)) : List<&2, L.LcBlock64>}:
8609  match bs:
8610    case Nil{}:
8611      {==}
8612    case Con{+p, t}:
8613      cbc_enc_ref(~K, ~enc, k, t, enc(k, L.LcBlock64.xor(iv, p)), Con{enc(k, L.LcBlock64.xor(iv, p)), acc})
8614
8615def cbc_dec_ref(~K: Data, ~dec: K -> L.LcBlock64 -> L.LcBlock64, +k: K, bs: List<&2, L.LcBlock64>, +iv: L.LcBlock64, +acc: List<&2, L.LcBlock64>) -> {X.m64.cbc.dec.go(~K, ~dec, k, bs, iv, acc) == X.m64.rev_onto(acc, X.m64.cbc.dec(~K, ~dec, k, bs, iv)) : List<&2, L.LcBlock64>}:
8616  match bs:
8617    case Nil{}:
8618      {==}
8619    case Con{+c, t}:
8620      cbc_dec_ref(~K, ~dec, k, t, c, Con{L.LcBlock64.xor(iv, dec(k, c)), acc})
8621
8622def tdes_rt(k: T.LcTdesKey, +b: L.LcBlock64) -> {b == T.LcTdes.decrypt(k, T.LcTdes.encrypt(k, b)) : L.LcBlock64}:
8623  Equal.sym(L.LcBlock64, T.LcTdes.decrypt(k, T.LcTdes.encrypt(k, b)), b, Laws.tdes_round_trip(k, b))
8624
8625def ecb_rt_des(+k: D.LcDesKey, bs: List<&2, L.LcBlock64>) -> {bs == X.m64.ecb(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.ecb(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)) : List<&2, L.LcBlock64>}:
8626  match bs:
8627    case Nil{}:
8628      {==}
8629    case Con{+b, +t}:
8630      %des_rt(k, b) : {Con{b, t} == Con{_, X.m64.ecb(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.ecb(~D.LcDesKey, ~D.LcDes.encrypt, k, t))} : List<&2, L.LcBlock64>}
8631      %ecb_rt_des(k, t) : {Con{b, t} == Con{b, _} : List<&2, L.LcBlock64>}
8632      {==}
8633
8634def cbc_rt_des(+k: D.LcDesKey, bs: List<&2, L.LcBlock64>, +iv: L.LcBlock64) -> {bs == X.m64.cbc.dec(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv), iv) : List<&2, L.LcBlock64>}:
8635  match bs:
8636    case Nil{}:
8637      {==}
8638    case Con{+p, +t}:
8639      %des_rt(k, L.LcBlock64.xor(iv, p)) : {Con{p, t} == Con{L.LcBlock64.xor(iv, _), X.m64.cbc.dec(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, t, D.LcDes.encrypt(k, L.LcBlock64.xor(iv, p))), D.LcDes.encrypt(k, L.LcBlock64.xor(iv, p)))} : List<&2, L.LcBlock64>}
8640      %b64_xx2(iv, p) : {Con{p, t} == Con{_, X.m64.cbc.dec(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, t, D.LcDes.encrypt(k, L.LcBlock64.xor(iv, p))), D.LcDes.encrypt(k, L.LcBlock64.xor(iv, p)))} : List<&2, L.LcBlock64>}
8641      %cbc_rt_des(k, t, D.LcDes.encrypt(k, L.LcBlock64.xor(iv, p))) : {Con{p, t} == Con{p, _} : List<&2, L.LcBlock64>}
8642      {==}
8643
8644# the public block layers, through the structural forms
8645def ecb_blocks_rt_des(+k: D.LcDesKey, +bs: List<&2, L.LcBlock64>) -> {X.Lc64.ecb_decrypt_blocks(~D.LcDesKey, ~D.LcDes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)) == bs : List<&2, L.LcBlock64>}:
8646  %Equal.sym(List<&2, L.LcBlock64>, X.m64.ecb.go(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, Nil{}), X.m64.rev_onto(Nil{}, X.m64.ecb(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)), ecb_ref(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, Nil{})) : {X.m64.ecb.go(~D.LcDesKey, ~D.LcDes.decrypt, k, _, Nil{}) == bs : List<&2, L.LcBlock64>}
8647  %Equal.sym(List<&2, L.LcBlock64>, X.m64.ecb.go(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.ecb(~D.LcDesKey, ~D.LcDes.encrypt, k, bs), Nil{}), X.m64.rev_onto(Nil{}, X.m64.ecb(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.ecb(~D.LcDesKey, ~D.LcDes.encrypt, k, bs))), ecb_ref(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.ecb(~D.LcDesKey, ~D.LcDes.encrypt, k, bs), Nil{})) : {_ == bs : List<&2, L.LcBlock64>}
8648  Equal.sym(List<&2, L.LcBlock64>, bs, X.m64.ecb(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.ecb(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)), ecb_rt_des(k, bs))
8649
8650def cbc_blocks_rt_des(+k: D.LcDesKey, +iv: L.LcBlock64, +bs: List<&2, L.LcBlock64>) -> {X.Lc64.cbc_decrypt_blocks(~D.LcDesKey, ~D.LcDes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, iv, bs)) == bs : List<&2, L.LcBlock64>}:
8651  %Equal.sym(List<&2, L.LcBlock64>, X.m64.cbc.enc.go(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv, Nil{}), X.m64.rev_onto(Nil{}, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv)), cbc_enc_ref(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv, Nil{})) : {X.m64.cbc.dec.go(~D.LcDesKey, ~D.LcDes.decrypt, k, _, iv, Nil{}) == bs : List<&2, L.LcBlock64>}
8652  %Equal.sym(List<&2, L.LcBlock64>, X.m64.cbc.dec.go(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv), iv, Nil{}), X.m64.rev_onto(Nil{}, X.m64.cbc.dec(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv), iv)), cbc_dec_ref(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv), iv, Nil{})) : {_ == bs : List<&2, L.LcBlock64>}
8653  Equal.sym(List<&2, L.LcBlock64>, bs, X.m64.cbc.dec(~D.LcDesKey, ~D.LcDes.decrypt, k, X.m64.cbc.enc(~D.LcDesKey, ~D.LcDes.encrypt, k, bs, iv), iv), cbc_rt_des(k, bs, iv))
8654
8655def ecb_rt_tdes(+k: T.LcTdesKey, bs: List<&2, L.LcBlock64>) -> {bs == X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)) : List<&2, L.LcBlock64>}:
8656  match bs:
8657    case Nil{}:
8658      {==}
8659    case Con{+b, +t}:
8660      %tdes_rt(k, b) : {Con{b, t} == Con{_, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.encrypt, k, t))} : List<&2, L.LcBlock64>}
8661      %ecb_rt_tdes(k, t) : {Con{b, t} == Con{b, _} : List<&2, L.LcBlock64>}
8662      {==}
8663
8664def cbc_rt_tdes(+k: T.LcTdesKey, bs: List<&2, L.LcBlock64>, +iv: L.LcBlock64) -> {bs == X.m64.cbc.dec(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv), iv) : List<&2, L.LcBlock64>}:
8665  match bs:
8666    case Nil{}:
8667      {==}
8668    case Con{+p, +t}:
8669      %tdes_rt(k, L.LcBlock64.xor(iv, p)) : {Con{p, t} == Con{L.LcBlock64.xor(iv, _), X.m64.cbc.dec(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, t, T.LcTdes.encrypt(k, L.LcBlock64.xor(iv, p))), T.LcTdes.encrypt(k, L.LcBlock64.xor(iv, p)))} : List<&2, L.LcBlock64>}
8670      %b64_xx2(iv, p) : {Con{p, t} == Con{_, X.m64.cbc.dec(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, t, T.LcTdes.encrypt(k, L.LcBlock64.xor(iv, p))), T.LcTdes.encrypt(k, L.LcBlock64.xor(iv, p)))} : List<&2, L.LcBlock64>}
8671      %cbc_rt_tdes(k, t, T.LcTdes.encrypt(k, L.LcBlock64.xor(iv, p))) : {Con{p, t} == Con{p, _} : List<&2, L.LcBlock64>}
8672      {==}
8673
8674# the public block layers, through the structural forms
8675def ecb_blocks_rt_tdes(+k: T.LcTdesKey, +bs: List<&2, L.LcBlock64>) -> {X.Lc64.ecb_decrypt_blocks(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)) == bs : List<&2, L.LcBlock64>}:
8676  %Equal.sym(List<&2, L.LcBlock64>, X.m64.ecb.go(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, Nil{}), X.m64.rev_onto(Nil{}, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)), ecb_ref(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, Nil{})) : {X.m64.ecb.go(~T.LcTdesKey, ~T.LcTdes.decrypt, k, _, Nil{}) == bs : List<&2, L.LcBlock64>}
8677  %Equal.sym(List<&2, L.LcBlock64>, X.m64.ecb.go(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs), Nil{}), X.m64.rev_onto(Nil{}, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs))), ecb_ref(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs), Nil{})) : {_ == bs : List<&2, L.LcBlock64>}
8678  Equal.sym(List<&2, L.LcBlock64>, bs, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.ecb(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)), ecb_rt_tdes(k, bs))
8679
8680def cbc_blocks_rt_tdes(+k: T.LcTdesKey, +iv: L.LcBlock64, +bs: List<&2, L.LcBlock64>) -> {X.Lc64.cbc_decrypt_blocks(~T.LcTdesKey, ~T.LcTdes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, iv, bs)) == bs : List<&2, L.LcBlock64>}:
8681  %Equal.sym(List<&2, L.LcBlock64>, X.m64.cbc.enc.go(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv, Nil{}), X.m64.rev_onto(Nil{}, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv)), cbc_enc_ref(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv, Nil{})) : {X.m64.cbc.dec.go(~T.LcTdesKey, ~T.LcTdes.decrypt, k, _, iv, Nil{}) == bs : List<&2, L.LcBlock64>}
8682  %Equal.sym(List<&2, L.LcBlock64>, X.m64.cbc.dec.go(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv), iv, Nil{}), X.m64.rev_onto(Nil{}, X.m64.cbc.dec(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv), iv)), cbc_dec_ref(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv), iv, Nil{})) : {_ == bs : List<&2, L.LcBlock64>}
8683  Equal.sym(List<&2, L.LcBlock64>, bs, X.m64.cbc.dec(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.m64.cbc.enc(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs, iv), iv), cbc_rt_tdes(k, bs, iv))
8684
8685def Laws.des_ecb_round_trip(k, bs):
8686  ecb_blocks_rt_des(k, bs)
8687
8688def Laws.des_cbc_round_trip(k, iv, bs):
8689  cbc_blocks_rt_des(k, iv, bs)
8690
8691def Laws.tdes_ecb_round_trip(k, bs):
8692  ecb_blocks_rt_tdes(k, bs)
8693
8694def Laws.tdes_cbc_round_trip(k, iv, bs):
8695  cbc_blocks_rt_tdes(k, iv, bs)
8696
8697# The byte layers, on the bytes of whole blocks under the bytes of an IV
8698
8699def cbc_enc_ok(~K: Data, ~enc: K -> L.LcBlock64 -> L.LcBlock64, +k: K, +iv: L.LcBlock64, +bs: List<&2, L.LcBlock64>) -> {X.Lc64.cbc_encrypt(~K, ~enc, k, L.LcBlock64.to_octets(iv), X.Lc64.octets_of(bs)) == Done{X.Lc64.octets_of(X.Lc64.cbc_encrypt_blocks(~K, ~enc, k, iv, bs))} : Result<&2, &2, L.LcError, B.Octets>}:
8700  %Equal.sym(Maybe<&2, L.LcBlock64>, L.LcBlock64.of_octets(L.LcBlock64.to_octets(iv)), Some{iv}, Laws.block64_octets_round_trip(iv)) : {X.m64.cbc.e1(~K, ~enc, k, X.m64.iv(_, B.Octets.len(L.LcBlock64.to_octets(iv))), X.Lc64.octets_of(bs)) == Done{X.Lc64.octets_of(X.Lc64.cbc_encrypt_blocks(~K, ~enc, k, iv, bs))} : Result<&2, &2, L.LcError, B.Octets>}
8701  %Equal.sym(Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>, X.Lc64.blocks_of(X.Lc64.octets_of(bs)), Done{bs}, Laws.blocks64_octets_round_trip(bs)) : {X.m64.cbc.e2(~K, ~enc, k, iv, _) == Done{X.Lc64.octets_of(X.Lc64.cbc_encrypt_blocks(~K, ~enc, k, iv, bs))} : Result<&2, &2, L.LcError, B.Octets>}
8702  {==}
8703
8704def cbc_dec_ok(~K: Data, ~dec: K -> L.LcBlock64 -> L.LcBlock64, +k: K, +iv: L.LcBlock64, +bs: List<&2, L.LcBlock64>) -> {X.Lc64.cbc_decrypt(~K, ~dec, k, L.LcBlock64.to_octets(iv), X.Lc64.octets_of(bs)) == Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~K, ~dec, k, iv, bs))} : Result<&2, &2, L.LcError, B.Octets>}:
8705  %Equal.sym(Maybe<&2, L.LcBlock64>, L.LcBlock64.of_octets(L.LcBlock64.to_octets(iv)), Some{iv}, Laws.block64_octets_round_trip(iv)) : {X.m64.cbc.d1(~K, ~dec, k, X.m64.iv(_, B.Octets.len(L.LcBlock64.to_octets(iv))), X.Lc64.octets_of(bs)) == Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~K, ~dec, k, iv, bs))} : Result<&2, &2, L.LcError, B.Octets>}
8706  %Equal.sym(Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>, X.Lc64.blocks_of(X.Lc64.octets_of(bs)), Done{bs}, Laws.blocks64_octets_round_trip(bs)) : {X.m64.cbc.d2(~K, ~dec, k, iv, _) == Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~K, ~dec, k, iv, bs))} : Result<&2, &2, L.LcError, B.Octets>}
8707  {==}
8708
8709def ecb_enc_ok(~K: Data, ~f: K -> L.LcBlock64 -> L.LcBlock64, +k: K, +bs: List<&2, L.LcBlock64>) -> {Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~K, ~f, k, xs)), X.Lc64.blocks_of(X.Lc64.octets_of(bs))) == Done{X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~K, ~f, k, bs))} : Result<&2, &2, L.LcError, B.Octets>}:
8710  %Equal.sym(Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>, X.Lc64.blocks_of(X.Lc64.octets_of(bs)), Done{bs}, Laws.blocks64_octets_round_trip(bs)) : {Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~K, ~f, k, xs)), _) == Done{X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~K, ~f, k, bs))} : Result<&2, &2, L.LcError, B.Octets>}
8711  {==}
8712
8713def ecb_dec_ok(~K: Data, ~f: K -> L.LcBlock64 -> L.LcBlock64, +k: K, +bs: List<&2, L.LcBlock64>) -> {Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~K, ~f, k, xs)), X.Lc64.blocks_of(X.Lc64.octets_of(bs))) == Done{X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~K, ~f, k, bs))} : Result<&2, &2, L.LcError, B.Octets>}:
8714  %Equal.sym(Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>, X.Lc64.blocks_of(X.Lc64.octets_of(bs)), Done{bs}, Laws.blocks64_octets_round_trip(bs)) : {Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~K, ~f, k, xs)), _) == Done{X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~K, ~f, k, bs))} : Result<&2, &2, L.LcError, B.Octets>}
8715  {==}
8716
8717def Laws.des_cbc_octets_round_trip(k, iv, bs):
8718  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, X.Lc64.cbc_encrypt(~D.LcDesKey, ~D.LcDes.encrypt, k, L.LcBlock64.to_octets(iv), X.Lc64.octets_of(bs)), Done{X.Lc64.octets_of(X.Lc64.cbc_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, iv, bs))}, cbc_enc_ok(~D.LcDesKey, ~D.LcDes.encrypt, k, iv, bs)) : {Result.bind(&2, &2, L.LcError, B.Octets, B.Octets, _, c => X.Lc64.cbc_decrypt(~D.LcDesKey, ~D.LcDes.decrypt, k, L.LcBlock64.to_octets(iv), c)) == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8719  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, X.Lc64.cbc_decrypt(~D.LcDesKey, ~D.LcDes.decrypt, k, L.LcBlock64.to_octets(iv), X.Lc64.octets_of(X.Lc64.cbc_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, iv, bs))), Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~D.LcDesKey, ~D.LcDes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, iv, bs)))}, cbc_dec_ok(~D.LcDesKey, ~D.LcDes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, iv, bs))) : {_ == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8720  %Laws.des_cbc_round_trip(k, iv, bs) : {Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~D.LcDesKey, ~D.LcDes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, iv, bs)))} == Done{X.Lc64.octets_of(_)} : Result<&2, &2, L.LcError, B.Octets>}
8721  {==}
8722
8723def Laws.tdes_cbc_octets_round_trip(k, iv, bs):
8724  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, X.Lc64.cbc_encrypt(~T.LcTdesKey, ~T.LcTdes.encrypt, k, L.LcBlock64.to_octets(iv), X.Lc64.octets_of(bs)), Done{X.Lc64.octets_of(X.Lc64.cbc_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, iv, bs))}, cbc_enc_ok(~T.LcTdesKey, ~T.LcTdes.encrypt, k, iv, bs)) : {Result.bind(&2, &2, L.LcError, B.Octets, B.Octets, _, c => X.Lc64.cbc_decrypt(~T.LcTdesKey, ~T.LcTdes.decrypt, k, L.LcBlock64.to_octets(iv), c)) == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8725  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, X.Lc64.cbc_decrypt(~T.LcTdesKey, ~T.LcTdes.decrypt, k, L.LcBlock64.to_octets(iv), X.Lc64.octets_of(X.Lc64.cbc_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, iv, bs))), Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~T.LcTdesKey, ~T.LcTdes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, iv, bs)))}, cbc_dec_ok(~T.LcTdesKey, ~T.LcTdes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, iv, bs))) : {_ == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8726  %Laws.tdes_cbc_round_trip(k, iv, bs) : {Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~T.LcTdesKey, ~T.LcTdes.decrypt, k, iv, X.Lc64.cbc_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, iv, bs)))} == Done{X.Lc64.octets_of(_)} : Result<&2, &2, L.LcError, B.Octets>}
8727  {==}
8728
8729def Laws.des_ecb_octets_round_trip(k, bs):
8730  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, xs)), X.Lc64.blocks_of(X.Lc64.octets_of(bs))), Done{X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, bs))}, ecb_enc_ok(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)) : {Result.bind(&2, &2, L.LcError, B.Octets, B.Octets, _, c => X.Lc64.ecb_decrypt(~D.LcDesKey, ~D.LcDes.decrypt, k, c)) == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8731  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~D.LcDesKey, ~D.LcDes.decrypt, k, xs)), X.Lc64.blocks_of(X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)))), Done{X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~D.LcDesKey, ~D.LcDes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)))}, ecb_dec_ok(~D.LcDesKey, ~D.LcDes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, bs))) : {_ == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8732  %Laws.des_ecb_round_trip(k, bs) : {Done{X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~D.LcDesKey, ~D.LcDes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~D.LcDesKey, ~D.LcDes.encrypt, k, bs)))} == Done{X.Lc64.octets_of(_)} : Result<&2, &2, L.LcError, B.Octets>}
8733  {==}
8734
8735def Laws.tdes_ecb_octets_round_trip(k, bs):
8736  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, xs)), X.Lc64.blocks_of(X.Lc64.octets_of(bs))), Done{X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs))}, ecb_enc_ok(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)) : {Result.bind(&2, &2, L.LcError, B.Octets, B.Octets, _, c => X.Lc64.ecb_decrypt(~T.LcTdesKey, ~T.LcTdes.decrypt, k, c)) == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8737  %Equal.sym(Result<&2, &2, L.LcError, B.Octets>, Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, B.Octets, xs => X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~T.LcTdesKey, ~T.LcTdes.decrypt, k, xs)), X.Lc64.blocks_of(X.Lc64.octets_of(X.Lc64.ecb_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)))), Done{X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)))}, ecb_dec_ok(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs))) : {_ == Done{X.Lc64.octets_of(bs)} : Result<&2, &2, L.LcError, B.Octets>}
8738  %Laws.tdes_ecb_round_trip(k, bs) : {Done{X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~T.LcTdesKey, ~T.LcTdes.decrypt, k, X.Lc64.ecb_encrypt_blocks(~T.LcTdesKey, ~T.LcTdes.encrypt, k, bs)))} == Done{X.Lc64.octets_of(_)} : Result<&2, &2, L.LcError, B.Octets>}
8739  {==}
8740
8741# BEGIN GENERATED by gen/proof.py: vectors
8742
8743def Laws.sm4_gbt32907():
8744  {==}
8745
8746def Laws.camellia_rfc3713():
8747  {==}
8748
8749def Laws.serpent_nessie():
8750  {==}
8751
8752def Laws.des_bad_key_length():
8753  {==}
8754
8755def Laws.tdes_bad_key_length():
8756  {==}
8757
8758def Laws.camellia_bad_key_length():
8759  {==}
8760
8761def Laws.serpent_bad_key_length():
8762  {==}
8763
8764def Laws.aria_rfc5794():
8765  {==}
8766
8767def Laws.cast5_rfc2144():
8768  {==}
8769
8770def Laws.fcrypt_spec():
8771  {==}
8772
8773def Laws.aria_bad_key_length():
8774  {==}
8775
8776def Laws.cast6_bad_key_length():
8777  {==}
8778
8779def Laws.blowfish_bad_key_length():
8780  {==}
8781
8782def Laws.cast5_bad_key_length():
8783  {==}
8784
8785def Laws.tea_bad_key_length():
8786  {==}
8787
8788def Laws.xtea_bad_key_length():
8789  {==}
8790
8791def Laws.fcrypt_bad_key_length():
8792  {==}
8793
8794def Laws.rc4_empty_key():
8795  {==}
8796
8797def Laws.modes64_not_whole_blocks():
8798  {==}
8799# END GENERATED: vectors