Coverage report: /home/ellis/comp/ext/ironclad/src/digests/groestl.lisp

KindCoveredAll%
expression0788 0.0
branch020 0.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;;; groestl.lisp -- implementation of the Grøstl hash function
2
 (in-package :crypto)
3
 
4
 ;;; Parameters
5
 (eval-when (:compile-toplevel :load-toplevel :execute)
6
   (defconstant +groestl-rows+ 8)
7
   (defconstant +groestl-length-field-length+ +groestl-rows+)
8
   (defconstant +groestl-cols-512+ 8)
9
   (defconstant +groestl-cols-1024+ 16)
10
   (defconstant +groestl-size-512+ (* +groestl-rows+ +groestl-cols-512+))
11
   (defconstant +groestl-size-1024+ (* +groestl-rows+ +groestl-cols-1024+))
12
   (defconstant +groestl-rounds-512+ 10)
13
   (defconstant +groestl-rounds-1024+ 14)
14
   (defconst +groestl-table+
15
     (make-array 2048
16
                 :element-type '(unsigned-byte 64)
17
                 :initial-contents '(#xc632f4a5f497a5c6 #xf86f978497eb84f8
18
                                     #xee5eb099b0c799ee #xf67a8c8d8cf78df6
19
                                     #xffe8170d17e50dff #xd60adcbddcb7bdd6
20
                                     #xde16c8b1c8a7b1de #x916dfc54fc395491
21
                                     #x6090f050f0c05060 #x0207050305040302
22
                                     #xce2ee0a9e087a9ce #x56d1877d87ac7d56
23
                                     #xe7cc2b192bd519e7 #xb513a662a67162b5
24
                                     #x4d7c31e6319ae64d #xec59b59ab5c39aec
25
                                     #x8f40cf45cf05458f #x1fa3bc9dbc3e9d1f
26
                                     #x8949c040c0094089 #xfa68928792ef87fa
27
                                     #xefd03f153fc515ef #xb29426eb267febb2
28
                                     #x8ece40c94007c98e #xfbe61d0b1ded0bfb
29
                                     #x416e2fec2f82ec41 #xb31aa967a97d67b3
30
                                     #x5f431cfd1cbefd5f #x456025ea258aea45
31
                                     #x23f9dabfda46bf23 #x535102f702a6f753
32
                                     #xe445a196a1d396e4 #x9b76ed5bed2d5b9b
33
                                     #x75285dc25deac275 #xe1c5241c24d91ce1
34
                                     #x3dd4e9aee97aae3d #x4cf2be6abe986a4c
35
                                     #x6c82ee5aeed85a6c #x7ebdc341c3fc417e
36
                                     #xf5f3060206f102f5 #x8352d14fd11d4f83
37
                                     #x688ce45ce4d05c68 #x515607f407a2f451
38
                                     #xd18d5c345cb934d1 #xf9e1180818e908f9
39
                                     #xe24cae93aedf93e2 #xab3e9573954d73ab
40
                                     #x6297f553f5c45362 #x2a6b413f41543f2a
41
                                     #x081c140c14100c08 #x9563f652f6315295
42
                                     #x46e9af65af8c6546 #x9d7fe25ee2215e9d
43
                                     #x3048782878602830 #x37cff8a1f86ea137
44
                                     #x0a1b110f11140f0a #x2febc4b5c45eb52f
45
                                     #x0e151b091b1c090e #x247e5a365a483624
46
                                     #x1badb69bb6369b1b #xdf98473d47a53ddf
47
                                     #xcda76a266a8126cd #x4ef5bb69bb9c694e
48
                                     #x7f334ccd4cfecd7f #xea50ba9fbacf9fea
49
                                     #x123f2d1b2d241b12 #x1da4b99eb93a9e1d
50
                                     #x58c49c749cb07458 #x3446722e72682e34
51
                                     #x3641772d776c2d36 #xdc11cdb2cda3b2dc
52
                                     #xb49d29ee2973eeb4 #x5b4d16fb16b6fb5b
53
                                     #xa4a501f60153f6a4 #x76a1d74dd7ec4d76
54
                                     #xb714a361a37561b7 #x7d3449ce49face7d
55
                                     #x52df8d7b8da47b52 #xdd9f423e42a13edd
56
                                     #x5ecd937193bc715e #x13b1a297a2269713
57
                                     #xa6a204f50457f5a6 #xb901b868b86968b9
58
                                     #x0000000000000000 #xc1b5742c74992cc1
59
                                     #x40e0a060a0806040 #xe3c2211f21dd1fe3
60
                                     #x793a43c843f2c879 #xb69a2ced2c77edb6
61
                                     #xd40dd9bed9b3bed4 #x8d47ca46ca01468d
62
                                     #x671770d970ced967 #x72afdd4bdde44b72
63
                                     #x94ed79de7933de94 #x98ff67d4672bd498
64
                                     #xb09323e8237be8b0 #x855bde4ade114a85
65
                                     #xbb06bd6bbd6d6bbb #xc5bb7e2a7e912ac5
66
                                     #x4f7b34e5349ee54f #xedd73a163ac116ed
67
                                     #x86d254c55417c586 #x9af862d7622fd79a
68
                                     #x6699ff55ffcc5566 #x11b6a794a7229411
69
                                     #x8ac04acf4a0fcf8a #xe9d9301030c910e9
70
                                     #x040e0a060a080604 #xfe66988198e781fe
71
                                     #xa0ab0bf00b5bf0a0 #x78b4cc44ccf04478
72
                                     #x25f0d5bad54aba25 #x4b753ee33e96e34b
73
                                     #xa2ac0ef30e5ff3a2 #x5d4419fe19bafe5d
74
                                     #x80db5bc05b1bc080 #x0580858a850a8a05
75
                                     #x3fd3ecadec7ead3f #x21fedfbcdf42bc21
76
                                     #x70a8d848d8e04870 #xf1fd0c040cf904f1
77
                                     #x63197adf7ac6df63 #x772f58c158eec177
78
                                     #xaf309f759f4575af #x42e7a563a5846342
79
                                     #x2070503050403020 #xe5cb2e1a2ed11ae5
80
                                     #xfdef120e12e10efd #xbf08b76db7656dbf
81
                                     #x8155d44cd4194c81 #x18243c143c301418
82
                                     #x26795f355f4c3526 #xc3b2712f719d2fc3
83
                                     #xbe8638e13867e1be #x35c8fda2fd6aa235
84
                                     #x88c74fcc4f0bcc88 #x2e654b394b5c392e
85
                                     #x936af957f93d5793 #x55580df20daaf255
86
                                     #xfc619d829de382fc #x7ab3c947c9f4477a
87
                                     #xc827efacef8bacc8 #xba8832e7326fe7ba
88
                                     #x324f7d2b7d642b32 #xe642a495a4d795e6
89
                                     #xc03bfba0fb9ba0c0 #x19aab398b3329819
90
                                     #x9ef668d16827d19e #xa322817f815d7fa3
91
                                     #x44eeaa66aa886644 #x54d6827e82a87e54
92
                                     #x3bdde6abe676ab3b #x0b959e839e16830b
93
                                     #x8cc945ca4503ca8c #xc7bc7b297b9529c7
94
                                     #x6b056ed36ed6d36b #x286c443c44503c28
95
                                     #xa72c8b798b5579a7 #xbc813de23d63e2bc
96
                                     #x1631271d272c1d16 #xad379a769a4176ad
97
                                     #xdb964d3b4dad3bdb #x649efa56fac85664
98
                                     #x74a6d24ed2e84e74 #x1436221e22281e14
99
                                     #x92e476db763fdb92 #x0c121e0a1e180a0c
100
                                     #x48fcb46cb4906c48 #xb88f37e4376be4b8
101
                                     #x9f78e75de7255d9f #xbd0fb26eb2616ebd
102
                                     #x43692aef2a86ef43 #xc435f1a6f193a6c4
103
                                     #x39dae3a8e372a839 #x31c6f7a4f762a431
104
                                     #xd38a593759bd37d3 #xf274868b86ff8bf2
105
                                     #xd583563256b132d5 #x8b4ec543c50d438b
106
                                     #x6e85eb59ebdc596e #xda18c2b7c2afb7da
107
                                     #x018e8f8c8f028c01 #xb11dac64ac7964b1
108
                                     #x9cf16dd26d23d29c #x49723be03b92e049
109
                                     #xd81fc7b4c7abb4d8 #xacb915fa1543faac
110
                                     #xf3fa090709fd07f3 #xcfa06f256f8525cf
111
                                     #xca20eaafea8fafca #xf47d898e89f38ef4
112
                                     #x476720e9208ee947 #x1038281828201810
113
                                     #x6f0b64d564ded56f #xf073838883fb88f0
114
                                     #x4afbb16fb1946f4a #x5cca967296b8725c
115
                                     #x38546c246c702438 #x575f08f108aef157
116
                                     #x732152c752e6c773 #x9764f351f3355197
117
                                     #xcbae6523658d23cb #xa125847c84597ca1
118
                                     #xe857bf9cbfcb9ce8 #x3e5d6321637c213e
119
                                     #x96ea7cdd7c37dd96 #x611e7fdc7fc2dc61
120
                                     #x0d9c9186911a860d #x0f9b9485941e850f
121
                                     #xe04bab90abdb90e0 #x7cbac642c6f8427c
122
                                     #x712657c457e2c471 #xcc29e5aae583aacc
123
                                     #x90e373d8733bd890 #x06090f050f0c0506
124
                                     #xf7f4030103f501f7 #x1c2a36123638121c
125
                                     #xc23cfea3fe9fa3c2 #x6a8be15fe1d45f6a
126
                                     #xaebe10f91047f9ae #x69026bd06bd2d069
127
                                     #x17bfa891a82e9117 #x9971e858e8295899
128
                                     #x3a5369276974273a #x27f7d0b9d04eb927
129
                                     #xd991483848a938d9 #xebde351335cd13eb
130
                                     #x2be5ceb3ce56b32b #x2277553355443322
131
                                     #xd204d6bbd6bfbbd2 #xa9399070904970a9
132
                                     #x07878089800e8907 #x33c1f2a7f266a733
133
                                     #x2decc1b6c15ab62d #x3c5a66226678223c
134
                                     #x15b8ad92ad2a9215 #xc9a96020608920c9
135
                                     #x875cdb49db154987 #xaab01aff1a4fffaa
136
                                     #x50d8887888a07850 #xa52b8e7a8e517aa5
137
                                     #x03898a8f8a068f03 #x594a13f813b2f859
138
                                     #x09929b809b128009 #x1a2339173934171a
139
                                     #x651075da75cada65 #xd784533153b531d7
140
                                     #x84d551c65113c684 #xd003d3b8d3bbb8d0
141
                                     #x82dc5ec35e1fc382 #x29e2cbb0cb52b029
142
                                     #x5ac3997799b4775a #x1e2d3311333c111e
143
                                     #x7b3d46cb46f6cb7b #xa8b71ffc1f4bfca8
144
                                     #x6d0c61d661dad66d #x2c624e3a4e583a2c
145
 
146
                                     #xc6c632f4a5f497a5 #xf8f86f978497eb84
147
                                     #xeeee5eb099b0c799 #xf6f67a8c8d8cf78d
148
                                     #xffffe8170d17e50d #xd6d60adcbddcb7bd
149
                                     #xdede16c8b1c8a7b1 #x91916dfc54fc3954
150
                                     #x606090f050f0c050 #x0202070503050403
151
                                     #xcece2ee0a9e087a9 #x5656d1877d87ac7d
152
                                     #xe7e7cc2b192bd519 #xb5b513a662a67162
153
                                     #x4d4d7c31e6319ae6 #xecec59b59ab5c39a
154
                                     #x8f8f40cf45cf0545 #x1f1fa3bc9dbc3e9d
155
                                     #x898949c040c00940 #xfafa68928792ef87
156
                                     #xefefd03f153fc515 #xb2b29426eb267feb
157
                                     #x8e8ece40c94007c9 #xfbfbe61d0b1ded0b
158
                                     #x41416e2fec2f82ec #xb3b31aa967a97d67
159
                                     #x5f5f431cfd1cbefd #x45456025ea258aea
160
                                     #x2323f9dabfda46bf #x53535102f702a6f7
161
                                     #xe4e445a196a1d396 #x9b9b76ed5bed2d5b
162
                                     #x7575285dc25deac2 #xe1e1c5241c24d91c
163
                                     #x3d3dd4e9aee97aae #x4c4cf2be6abe986a
164
                                     #x6c6c82ee5aeed85a #x7e7ebdc341c3fc41
165
                                     #xf5f5f3060206f102 #x838352d14fd11d4f
166
                                     #x68688ce45ce4d05c #x51515607f407a2f4
167
                                     #xd1d18d5c345cb934 #xf9f9e1180818e908
168
                                     #xe2e24cae93aedf93 #xabab3e9573954d73
169
                                     #x626297f553f5c453 #x2a2a6b413f41543f
170
                                     #x08081c140c14100c #x959563f652f63152
171
                                     #x4646e9af65af8c65 #x9d9d7fe25ee2215e
172
                                     #x3030487828786028 #x3737cff8a1f86ea1
173
                                     #x0a0a1b110f11140f #x2f2febc4b5c45eb5
174
                                     #x0e0e151b091b1c09 #x24247e5a365a4836
175
                                     #x1b1badb69bb6369b #xdfdf98473d47a53d
176
                                     #xcdcda76a266a8126 #x4e4ef5bb69bb9c69
177
                                     #x7f7f334ccd4cfecd #xeaea50ba9fbacf9f
178
                                     #x12123f2d1b2d241b #x1d1da4b99eb93a9e
179
                                     #x5858c49c749cb074 #x343446722e72682e
180
                                     #x363641772d776c2d #xdcdc11cdb2cda3b2
181
                                     #xb4b49d29ee2973ee #x5b5b4d16fb16b6fb
182
                                     #xa4a4a501f60153f6 #x7676a1d74dd7ec4d
183
                                     #xb7b714a361a37561 #x7d7d3449ce49face
184
                                     #x5252df8d7b8da47b #xdddd9f423e42a13e
185
                                     #x5e5ecd937193bc71 #x1313b1a297a22697
186
                                     #xa6a6a204f50457f5 #xb9b901b868b86968
187
                                     #x0000000000000000 #xc1c1b5742c74992c
188
                                     #x4040e0a060a08060 #xe3e3c2211f21dd1f
189
                                     #x79793a43c843f2c8 #xb6b69a2ced2c77ed
190
                                     #xd4d40dd9bed9b3be #x8d8d47ca46ca0146
191
                                     #x67671770d970ced9 #x7272afdd4bdde44b
192
                                     #x9494ed79de7933de #x9898ff67d4672bd4
193
                                     #xb0b09323e8237be8 #x85855bde4ade114a
194
                                     #xbbbb06bd6bbd6d6b #xc5c5bb7e2a7e912a
195
                                     #x4f4f7b34e5349ee5 #xededd73a163ac116
196
                                     #x8686d254c55417c5 #x9a9af862d7622fd7
197
                                     #x666699ff55ffcc55 #x1111b6a794a72294
198
                                     #x8a8ac04acf4a0fcf #xe9e9d9301030c910
199
                                     #x04040e0a060a0806 #xfefe66988198e781
200
                                     #xa0a0ab0bf00b5bf0 #x7878b4cc44ccf044
201
                                     #x2525f0d5bad54aba #x4b4b753ee33e96e3
202
                                     #xa2a2ac0ef30e5ff3 #x5d5d4419fe19bafe
203
                                     #x8080db5bc05b1bc0 #x050580858a850a8a
204
                                     #x3f3fd3ecadec7ead #x2121fedfbcdf42bc
205
                                     #x7070a8d848d8e048 #xf1f1fd0c040cf904
206
                                     #x6363197adf7ac6df #x77772f58c158eec1
207
                                     #xafaf309f759f4575 #x4242e7a563a58463
208
                                     #x2020705030504030 #xe5e5cb2e1a2ed11a
209
                                     #xfdfdef120e12e10e #xbfbf08b76db7656d
210
                                     #x818155d44cd4194c #x1818243c143c3014
211
                                     #x2626795f355f4c35 #xc3c3b2712f719d2f
212
                                     #xbebe8638e13867e1 #x3535c8fda2fd6aa2
213
                                     #x8888c74fcc4f0bcc #x2e2e654b394b5c39
214
                                     #x93936af957f93d57 #x5555580df20daaf2
215
                                     #xfcfc619d829de382 #x7a7ab3c947c9f447
216
                                     #xc8c827efacef8bac #xbaba8832e7326fe7
217
                                     #x32324f7d2b7d642b #xe6e642a495a4d795
218
                                     #xc0c03bfba0fb9ba0 #x1919aab398b33298
219
                                     #x9e9ef668d16827d1 #xa3a322817f815d7f
220
                                     #x4444eeaa66aa8866 #x5454d6827e82a87e
221
                                     #x3b3bdde6abe676ab #x0b0b959e839e1683
222
                                     #x8c8cc945ca4503ca #xc7c7bc7b297b9529
223
                                     #x6b6b056ed36ed6d3 #x28286c443c44503c
224
                                     #xa7a72c8b798b5579 #xbcbc813de23d63e2
225
                                     #x161631271d272c1d #xadad379a769a4176
226
                                     #xdbdb964d3b4dad3b #x64649efa56fac856
227
                                     #x7474a6d24ed2e84e #x141436221e22281e
228
                                     #x9292e476db763fdb #x0c0c121e0a1e180a
229
                                     #x4848fcb46cb4906c #xb8b88f37e4376be4
230
                                     #x9f9f78e75de7255d #xbdbd0fb26eb2616e
231
                                     #x4343692aef2a86ef #xc4c435f1a6f193a6
232
                                     #x3939dae3a8e372a8 #x3131c6f7a4f762a4
233
                                     #xd3d38a593759bd37 #xf2f274868b86ff8b
234
                                     #xd5d583563256b132 #x8b8b4ec543c50d43
235
                                     #x6e6e85eb59ebdc59 #xdada18c2b7c2afb7
236
                                     #x01018e8f8c8f028c #xb1b11dac64ac7964
237
                                     #x9c9cf16dd26d23d2 #x4949723be03b92e0
238
                                     #xd8d81fc7b4c7abb4 #xacacb915fa1543fa
239
                                     #xf3f3fa090709fd07 #xcfcfa06f256f8525
240
                                     #xcaca20eaafea8faf #xf4f47d898e89f38e
241
                                     #x47476720e9208ee9 #x1010382818282018
242
                                     #x6f6f0b64d564ded5 #xf0f073838883fb88
243
                                     #x4a4afbb16fb1946f #x5c5cca967296b872
244
                                     #x3838546c246c7024 #x57575f08f108aef1
245
                                     #x73732152c752e6c7 #x979764f351f33551
246
                                     #xcbcbae6523658d23 #xa1a125847c84597c
247
                                     #xe8e857bf9cbfcb9c #x3e3e5d6321637c21
248
                                     #x9696ea7cdd7c37dd #x61611e7fdc7fc2dc
249
                                     #x0d0d9c9186911a86 #x0f0f9b9485941e85
250
                                     #xe0e04bab90abdb90 #x7c7cbac642c6f842
251
                                     #x71712657c457e2c4 #xcccc29e5aae583aa
252
                                     #x9090e373d8733bd8 #x0606090f050f0c05
253
                                     #xf7f7f4030103f501 #x1c1c2a3612363812
254
                                     #xc2c23cfea3fe9fa3 #x6a6a8be15fe1d45f
255
                                     #xaeaebe10f91047f9 #x6969026bd06bd2d0
256
                                     #x1717bfa891a82e91 #x999971e858e82958
257
                                     #x3a3a536927697427 #x2727f7d0b9d04eb9
258
                                     #xd9d991483848a938 #xebebde351335cd13
259
                                     #x2b2be5ceb3ce56b3 #x2222775533554433
260
                                     #xd2d204d6bbd6bfbb #xa9a9399070904970
261
                                     #x0707878089800e89 #x3333c1f2a7f266a7
262
                                     #x2d2decc1b6c15ab6 #x3c3c5a6622667822
263
                                     #x1515b8ad92ad2a92 #xc9c9a96020608920
264
                                     #x87875cdb49db1549 #xaaaab01aff1a4fff
265
                                     #x5050d8887888a078 #xa5a52b8e7a8e517a
266
                                     #x0303898a8f8a068f #x59594a13f813b2f8
267
                                     #x0909929b809b1280 #x1a1a233917393417
268
                                     #x65651075da75cada #xd7d784533153b531
269
                                     #x8484d551c65113c6 #xd0d003d3b8d3bbb8
270
                                     #x8282dc5ec35e1fc3 #x2929e2cbb0cb52b0
271
                                     #x5a5ac3997799b477 #x1e1e2d3311333c11
272
                                     #x7b7b3d46cb46f6cb #xa8a8b71ffc1f4bfc
273
                                     #x6d6d0c61d661dad6 #x2c2c624e3a4e583a
274
                                     
275
                                     #xa5c6c632f4a5f497 #x84f8f86f978497eb
276
                                     #x99eeee5eb099b0c7 #x8df6f67a8c8d8cf7
277
                                     #x0dffffe8170d17e5 #xbdd6d60adcbddcb7
278
                                     #xb1dede16c8b1c8a7 #x5491916dfc54fc39
279
                                     #x50606090f050f0c0 #x0302020705030504
280
                                     #xa9cece2ee0a9e087 #x7d5656d1877d87ac
281
                                     #x19e7e7cc2b192bd5 #x62b5b513a662a671
282
                                     #xe64d4d7c31e6319a #x9aecec59b59ab5c3
283
                                     #x458f8f40cf45cf05 #x9d1f1fa3bc9dbc3e
284
                                     #x40898949c040c009 #x87fafa68928792ef
285
                                     #x15efefd03f153fc5 #xebb2b29426eb267f
286
                                     #xc98e8ece40c94007 #x0bfbfbe61d0b1ded
287
                                     #xec41416e2fec2f82 #x67b3b31aa967a97d
288
                                     #xfd5f5f431cfd1cbe #xea45456025ea258a
289
                                     #xbf2323f9dabfda46 #xf753535102f702a6
290
                                     #x96e4e445a196a1d3 #x5b9b9b76ed5bed2d
291
                                     #xc27575285dc25dea #x1ce1e1c5241c24d9
292
                                     #xae3d3dd4e9aee97a #x6a4c4cf2be6abe98
293
                                     #x5a6c6c82ee5aeed8 #x417e7ebdc341c3fc
294
                                     #x02f5f5f3060206f1 #x4f838352d14fd11d
295
                                     #x5c68688ce45ce4d0 #xf451515607f407a2
296
                                     #x34d1d18d5c345cb9 #x08f9f9e1180818e9
297
                                     #x93e2e24cae93aedf #x73abab3e9573954d
298
                                     #x53626297f553f5c4 #x3f2a2a6b413f4154
299
                                     #x0c08081c140c1410 #x52959563f652f631
300
                                     #x654646e9af65af8c #x5e9d9d7fe25ee221
301
                                     #x2830304878287860 #xa13737cff8a1f86e
302
                                     #x0f0a0a1b110f1114 #xb52f2febc4b5c45e
303
                                     #x090e0e151b091b1c #x3624247e5a365a48
304
                                     #x9b1b1badb69bb636 #x3ddfdf98473d47a5
305
                                     #x26cdcda76a266a81 #x694e4ef5bb69bb9c
306
                                     #xcd7f7f334ccd4cfe #x9feaea50ba9fbacf
307
                                     #x1b12123f2d1b2d24 #x9e1d1da4b99eb93a
308
                                     #x745858c49c749cb0 #x2e343446722e7268
309
                                     #x2d363641772d776c #xb2dcdc11cdb2cda3
310
                                     #xeeb4b49d29ee2973 #xfb5b5b4d16fb16b6
311
                                     #xf6a4a4a501f60153 #x4d7676a1d74dd7ec
312
                                     #x61b7b714a361a375 #xce7d7d3449ce49fa
313
                                     #x7b5252df8d7b8da4 #x3edddd9f423e42a1
314
                                     #x715e5ecd937193bc #x971313b1a297a226
315
                                     #xf5a6a6a204f50457 #x68b9b901b868b869
316
                                     #x0000000000000000 #x2cc1c1b5742c7499
317
                                     #x604040e0a060a080 #x1fe3e3c2211f21dd
318
                                     #xc879793a43c843f2 #xedb6b69a2ced2c77
319
                                     #xbed4d40dd9bed9b3 #x468d8d47ca46ca01
320
                                     #xd967671770d970ce #x4b7272afdd4bdde4
321
                                     #xde9494ed79de7933 #xd49898ff67d4672b
322
                                     #xe8b0b09323e8237b #x4a85855bde4ade11
323
                                     #x6bbbbb06bd6bbd6d #x2ac5c5bb7e2a7e91
324
                                     #xe54f4f7b34e5349e #x16ededd73a163ac1
325
                                     #xc58686d254c55417 #xd79a9af862d7622f
326
                                     #x55666699ff55ffcc #x941111b6a794a722
327
                                     #xcf8a8ac04acf4a0f #x10e9e9d9301030c9
328
                                     #x0604040e0a060a08 #x81fefe66988198e7
329
                                     #xf0a0a0ab0bf00b5b #x447878b4cc44ccf0
330
                                     #xba2525f0d5bad54a #xe34b4b753ee33e96
331
                                     #xf3a2a2ac0ef30e5f #xfe5d5d4419fe19ba
332
                                     #xc08080db5bc05b1b #x8a050580858a850a
333
                                     #xad3f3fd3ecadec7e #xbc2121fedfbcdf42
334
                                     #x487070a8d848d8e0 #x04f1f1fd0c040cf9
335
                                     #xdf6363197adf7ac6 #xc177772f58c158ee
336
                                     #x75afaf309f759f45 #x634242e7a563a584
337
                                     #x3020207050305040 #x1ae5e5cb2e1a2ed1
338
                                     #x0efdfdef120e12e1 #x6dbfbf08b76db765
339
                                     #x4c818155d44cd419 #x141818243c143c30
340
                                     #x352626795f355f4c #x2fc3c3b2712f719d
341
                                     #xe1bebe8638e13867 #xa23535c8fda2fd6a
342
                                     #xcc8888c74fcc4f0b #x392e2e654b394b5c
343
                                     #x5793936af957f93d #xf25555580df20daa
344
                                     #x82fcfc619d829de3 #x477a7ab3c947c9f4
345
                                     #xacc8c827efacef8b #xe7baba8832e7326f
346
                                     #x2b32324f7d2b7d64 #x95e6e642a495a4d7
347
                                     #xa0c0c03bfba0fb9b #x981919aab398b332
348
                                     #xd19e9ef668d16827 #x7fa3a322817f815d
349
                                     #x664444eeaa66aa88 #x7e5454d6827e82a8
350
                                     #xab3b3bdde6abe676 #x830b0b959e839e16
351
                                     #xca8c8cc945ca4503 #x29c7c7bc7b297b95
352
                                     #xd36b6b056ed36ed6 #x3c28286c443c4450
353
                                     #x79a7a72c8b798b55 #xe2bcbc813de23d63
354
                                     #x1d161631271d272c #x76adad379a769a41
355
                                     #x3bdbdb964d3b4dad #x5664649efa56fac8
356
                                     #x4e7474a6d24ed2e8 #x1e141436221e2228
357
                                     #xdb9292e476db763f #x0a0c0c121e0a1e18
358
                                     #x6c4848fcb46cb490 #xe4b8b88f37e4376b
359
                                     #x5d9f9f78e75de725 #x6ebdbd0fb26eb261
360
                                     #xef4343692aef2a86 #xa6c4c435f1a6f193
361
                                     #xa83939dae3a8e372 #xa43131c6f7a4f762
362
                                     #x37d3d38a593759bd #x8bf2f274868b86ff
363
                                     #x32d5d583563256b1 #x438b8b4ec543c50d
364
                                     #x596e6e85eb59ebdc #xb7dada18c2b7c2af
365
                                     #x8c01018e8f8c8f02 #x64b1b11dac64ac79
366
                                     #xd29c9cf16dd26d23 #xe04949723be03b92
367
                                     #xb4d8d81fc7b4c7ab #xfaacacb915fa1543
368
                                     #x07f3f3fa090709fd #x25cfcfa06f256f85
369
                                     #xafcaca20eaafea8f #x8ef4f47d898e89f3
370
                                     #xe947476720e9208e #x1810103828182820
371
                                     #xd56f6f0b64d564de #x88f0f073838883fb
372
                                     #x6f4a4afbb16fb194 #x725c5cca967296b8
373
                                     #x243838546c246c70 #xf157575f08f108ae
374
                                     #xc773732152c752e6 #x51979764f351f335
375
                                     #x23cbcbae6523658d #x7ca1a125847c8459
376
                                     #x9ce8e857bf9cbfcb #x213e3e5d6321637c
377
                                     #xdd9696ea7cdd7c37 #xdc61611e7fdc7fc2
378
                                     #x860d0d9c9186911a #x850f0f9b9485941e
379
                                     #x90e0e04bab90abdb #x427c7cbac642c6f8
380
                                     #xc471712657c457e2 #xaacccc29e5aae583
381
                                     #xd89090e373d8733b #x050606090f050f0c
382
                                     #x01f7f7f4030103f5 #x121c1c2a36123638
383
                                     #xa3c2c23cfea3fe9f #x5f6a6a8be15fe1d4
384
                                     #xf9aeaebe10f91047 #xd06969026bd06bd2
385
                                     #x911717bfa891a82e #x58999971e858e829
386
                                     #x273a3a5369276974 #xb92727f7d0b9d04e
387
                                     #x38d9d991483848a9 #x13ebebde351335cd
388
                                     #xb32b2be5ceb3ce56 #x3322227755335544
389
                                     #xbbd2d204d6bbd6bf #x70a9a93990709049
390
                                     #x890707878089800e #xa73333c1f2a7f266
391
                                     #xb62d2decc1b6c15a #x223c3c5a66226678
392
                                     #x921515b8ad92ad2a #x20c9c9a960206089
393
                                     #x4987875cdb49db15 #xffaaaab01aff1a4f
394
                                     #x785050d8887888a0 #x7aa5a52b8e7a8e51
395
                                     #x8f0303898a8f8a06 #xf859594a13f813b2
396
                                     #x800909929b809b12 #x171a1a2339173934
397
                                     #xda65651075da75ca #x31d7d784533153b5
398
                                     #xc68484d551c65113 #xb8d0d003d3b8d3bb
399
                                     #xc38282dc5ec35e1f #xb02929e2cbb0cb52
400
                                     #x775a5ac3997799b4 #x111e1e2d3311333c
401
                                     #xcb7b7b3d46cb46f6 #xfca8a8b71ffc1f4b
402
                                     #xd66d6d0c61d661da #x3a2c2c624e3a4e58
403
                                     
404
                                     #x97a5c6c632f4a5f4 #xeb84f8f86f978497
405
                                     #xc799eeee5eb099b0 #xf78df6f67a8c8d8c
406
                                     #xe50dffffe8170d17 #xb7bdd6d60adcbddc
407
                                     #xa7b1dede16c8b1c8 #x395491916dfc54fc
408
                                     #xc050606090f050f0 #x0403020207050305
409
                                     #x87a9cece2ee0a9e0 #xac7d5656d1877d87
410
                                     #xd519e7e7cc2b192b #x7162b5b513a662a6
411
                                     #x9ae64d4d7c31e631 #xc39aecec59b59ab5
412
                                     #x05458f8f40cf45cf #x3e9d1f1fa3bc9dbc
413
                                     #x0940898949c040c0 #xef87fafa68928792
414
                                     #xc515efefd03f153f #x7febb2b29426eb26
415
                                     #x07c98e8ece40c940 #xed0bfbfbe61d0b1d
416
                                     #x82ec41416e2fec2f #x7d67b3b31aa967a9
417
                                     #xbefd5f5f431cfd1c #x8aea45456025ea25
418
                                     #x46bf2323f9dabfda #xa6f753535102f702
419
                                     #xd396e4e445a196a1 #x2d5b9b9b76ed5bed
420
                                     #xeac27575285dc25d #xd91ce1e1c5241c24
421
                                     #x7aae3d3dd4e9aee9 #x986a4c4cf2be6abe
422
                                     #xd85a6c6c82ee5aee #xfc417e7ebdc341c3
423
                                     #xf102f5f5f3060206 #x1d4f838352d14fd1
424
                                     #xd05c68688ce45ce4 #xa2f451515607f407
425
                                     #xb934d1d18d5c345c #xe908f9f9e1180818
426
                                     #xdf93e2e24cae93ae #x4d73abab3e957395
427
                                     #xc453626297f553f5 #x543f2a2a6b413f41
428
                                     #x100c08081c140c14 #x3152959563f652f6
429
                                     #x8c654646e9af65af #x215e9d9d7fe25ee2
430
                                     #x6028303048782878 #x6ea13737cff8a1f8
431
                                     #x140f0a0a1b110f11 #x5eb52f2febc4b5c4
432
                                     #x1c090e0e151b091b #x483624247e5a365a
433
                                     #x369b1b1badb69bb6 #xa53ddfdf98473d47
434
                                     #x8126cdcda76a266a #x9c694e4ef5bb69bb
435
                                     #xfecd7f7f334ccd4c #xcf9feaea50ba9fba
436
                                     #x241b12123f2d1b2d #x3a9e1d1da4b99eb9
437
                                     #xb0745858c49c749c #x682e343446722e72
438
                                     #x6c2d363641772d77 #xa3b2dcdc11cdb2cd
439
                                     #x73eeb4b49d29ee29 #xb6fb5b5b4d16fb16
440
                                     #x53f6a4a4a501f601 #xec4d7676a1d74dd7
441
                                     #x7561b7b714a361a3 #xface7d7d3449ce49
442
                                     #xa47b5252df8d7b8d #xa13edddd9f423e42
443
                                     #xbc715e5ecd937193 #x26971313b1a297a2
444
                                     #x57f5a6a6a204f504 #x6968b9b901b868b8
445
                                     #x0000000000000000 #x992cc1c1b5742c74
446
                                     #x80604040e0a060a0 #xdd1fe3e3c2211f21
447
                                     #xf2c879793a43c843 #x77edb6b69a2ced2c
448
                                     #xb3bed4d40dd9bed9 #x01468d8d47ca46ca
449
                                     #xced967671770d970 #xe44b7272afdd4bdd
450
                                     #x33de9494ed79de79 #x2bd49898ff67d467
451
                                     #x7be8b0b09323e823 #x114a85855bde4ade
452
                                     #x6d6bbbbb06bd6bbd #x912ac5c5bb7e2a7e
453
                                     #x9ee54f4f7b34e534 #xc116ededd73a163a
454
                                     #x17c58686d254c554 #x2fd79a9af862d762
455
                                     #xcc55666699ff55ff #x22941111b6a794a7
456
                                     #x0fcf8a8ac04acf4a #xc910e9e9d9301030
457
                                     #x080604040e0a060a #xe781fefe66988198
458
                                     #x5bf0a0a0ab0bf00b #xf0447878b4cc44cc
459
                                     #x4aba2525f0d5bad5 #x96e34b4b753ee33e
460
                                     #x5ff3a2a2ac0ef30e #xbafe5d5d4419fe19
461
                                     #x1bc08080db5bc05b #x0a8a050580858a85
462
                                     #x7ead3f3fd3ecadec #x42bc2121fedfbcdf
463
                                     #xe0487070a8d848d8 #xf904f1f1fd0c040c
464
                                     #xc6df6363197adf7a #xeec177772f58c158
465
                                     #x4575afaf309f759f #x84634242e7a563a5
466
                                     #x4030202070503050 #xd11ae5e5cb2e1a2e
467
                                     #xe10efdfdef120e12 #x656dbfbf08b76db7
468
                                     #x194c818155d44cd4 #x30141818243c143c
469
                                     #x4c352626795f355f #x9d2fc3c3b2712f71
470
                                     #x67e1bebe8638e138 #x6aa23535c8fda2fd
471
                                     #x0bcc8888c74fcc4f #x5c392e2e654b394b
472
                                     #x3d5793936af957f9 #xaaf25555580df20d
473
                                     #xe382fcfc619d829d #xf4477a7ab3c947c9
474
                                     #x8bacc8c827efacef #x6fe7baba8832e732
475
                                     #x642b32324f7d2b7d #xd795e6e642a495a4
476
                                     #x9ba0c0c03bfba0fb #x32981919aab398b3
477
                                     #x27d19e9ef668d168 #x5d7fa3a322817f81
478
                                     #x88664444eeaa66aa #xa87e5454d6827e82
479
                                     #x76ab3b3bdde6abe6 #x16830b0b959e839e
480
                                     #x03ca8c8cc945ca45 #x9529c7c7bc7b297b
481
                                     #xd6d36b6b056ed36e #x503c28286c443c44
482
                                     #x5579a7a72c8b798b #x63e2bcbc813de23d
483
                                     #x2c1d161631271d27 #x4176adad379a769a
484
                                     #xad3bdbdb964d3b4d #xc85664649efa56fa
485
                                     #xe84e7474a6d24ed2 #x281e141436221e22
486
                                     #x3fdb9292e476db76 #x180a0c0c121e0a1e
487
                                     #x906c4848fcb46cb4 #x6be4b8b88f37e437
488
                                     #x255d9f9f78e75de7 #x616ebdbd0fb26eb2
489
                                     #x86ef4343692aef2a #x93a6c4c435f1a6f1
490
                                     #x72a83939dae3a8e3 #x62a43131c6f7a4f7
491
                                     #xbd37d3d38a593759 #xff8bf2f274868b86
492
                                     #xb132d5d583563256 #x0d438b8b4ec543c5
493
                                     #xdc596e6e85eb59eb #xafb7dada18c2b7c2
494
                                     #x028c01018e8f8c8f #x7964b1b11dac64ac
495
                                     #x23d29c9cf16dd26d #x92e04949723be03b
496
                                     #xabb4d8d81fc7b4c7 #x43faacacb915fa15
497
                                     #xfd07f3f3fa090709 #x8525cfcfa06f256f
498
                                     #x8fafcaca20eaafea #xf38ef4f47d898e89
499
                                     #x8ee947476720e920 #x2018101038281828
500
                                     #xded56f6f0b64d564 #xfb88f0f073838883
501
                                     #x946f4a4afbb16fb1 #xb8725c5cca967296
502
                                     #x70243838546c246c #xaef157575f08f108
503
                                     #xe6c773732152c752 #x3551979764f351f3
504
                                     #x8d23cbcbae652365 #x597ca1a125847c84
505
                                     #xcb9ce8e857bf9cbf #x7c213e3e5d632163
506
                                     #x37dd9696ea7cdd7c #xc2dc61611e7fdc7f
507
                                     #x1a860d0d9c918691 #x1e850f0f9b948594
508
                                     #xdb90e0e04bab90ab #xf8427c7cbac642c6
509
                                     #xe2c471712657c457 #x83aacccc29e5aae5
510
                                     #x3bd89090e373d873 #x0c050606090f050f
511
                                     #xf501f7f7f4030103 #x38121c1c2a361236
512
                                     #x9fa3c2c23cfea3fe #xd45f6a6a8be15fe1
513
                                     #x47f9aeaebe10f910 #xd2d06969026bd06b
514
                                     #x2e911717bfa891a8 #x2958999971e858e8
515
                                     #x74273a3a53692769 #x4eb92727f7d0b9d0
516
                                     #xa938d9d991483848 #xcd13ebebde351335
517
                                     #x56b32b2be5ceb3ce #x4433222277553355
518
                                     #xbfbbd2d204d6bbd6 #x4970a9a939907090
519
                                     #x0e89070787808980 #x66a73333c1f2a7f2
520
                                     #x5ab62d2decc1b6c1 #x78223c3c5a662266
521
                                     #x2a921515b8ad92ad #x8920c9c9a9602060
522
                                     #x154987875cdb49db #x4fffaaaab01aff1a
523
                                     #xa0785050d8887888 #x517aa5a52b8e7a8e
524
                                     #x068f0303898a8f8a #xb2f859594a13f813
525
                                     #x12800909929b809b #x34171a1a23391739
526
                                     #xcada65651075da75 #xb531d7d784533153
527
                                     #x13c68484d551c651 #xbbb8d0d003d3b8d3
528
                                     #x1fc38282dc5ec35e #x52b02929e2cbb0cb
529
                                     #xb4775a5ac3997799 #x3c111e1e2d331133
530
                                     #xf6cb7b7b3d46cb46 #x4bfca8a8b71ffc1f
531
                                     #xdad66d6d0c61d661 #x583a2c2c624e3a4e
532
                                     
533
                                     #xf497a5c6c632f4a5 #x97eb84f8f86f9784
534
                                     #xb0c799eeee5eb099 #x8cf78df6f67a8c8d
535
                                     #x17e50dffffe8170d #xdcb7bdd6d60adcbd
536
                                     #xc8a7b1dede16c8b1 #xfc395491916dfc54
537
                                     #xf0c050606090f050 #x0504030202070503
538
                                     #xe087a9cece2ee0a9 #x87ac7d5656d1877d
539
                                     #x2bd519e7e7cc2b19 #xa67162b5b513a662
540
                                     #x319ae64d4d7c31e6 #xb5c39aecec59b59a
541
                                     #xcf05458f8f40cf45 #xbc3e9d1f1fa3bc9d
542
                                     #xc00940898949c040 #x92ef87fafa689287
543
                                     #x3fc515efefd03f15 #x267febb2b29426eb
544
                                     #x4007c98e8ece40c9 #x1ded0bfbfbe61d0b
545
                                     #x2f82ec41416e2fec #xa97d67b3b31aa967
546
                                     #x1cbefd5f5f431cfd #x258aea45456025ea
547
                                     #xda46bf2323f9dabf #x02a6f753535102f7
548
                                     #xa1d396e4e445a196 #xed2d5b9b9b76ed5b
549
                                     #x5deac27575285dc2 #x24d91ce1e1c5241c
550
                                     #xe97aae3d3dd4e9ae #xbe986a4c4cf2be6a
551
                                     #xeed85a6c6c82ee5a #xc3fc417e7ebdc341
552
                                     #x06f102f5f5f30602 #xd11d4f838352d14f
553
                                     #xe4d05c68688ce45c #x07a2f451515607f4
554
                                     #x5cb934d1d18d5c34 #x18e908f9f9e11808
555
                                     #xaedf93e2e24cae93 #x954d73abab3e9573
556
                                     #xf5c453626297f553 #x41543f2a2a6b413f
557
                                     #x14100c08081c140c #xf63152959563f652
558
                                     #xaf8c654646e9af65 #xe2215e9d9d7fe25e
559
                                     #x7860283030487828 #xf86ea13737cff8a1
560
                                     #x11140f0a0a1b110f #xc45eb52f2febc4b5
561
                                     #x1b1c090e0e151b09 #x5a483624247e5a36
562
                                     #xb6369b1b1badb69b #x47a53ddfdf98473d
563
                                     #x6a8126cdcda76a26 #xbb9c694e4ef5bb69
564
                                     #x4cfecd7f7f334ccd #xbacf9feaea50ba9f
565
                                     #x2d241b12123f2d1b #xb93a9e1d1da4b99e
566
                                     #x9cb0745858c49c74 #x72682e343446722e
567
                                     #x776c2d363641772d #xcda3b2dcdc11cdb2
568
                                     #x2973eeb4b49d29ee #x16b6fb5b5b4d16fb
569
                                     #x0153f6a4a4a501f6 #xd7ec4d7676a1d74d
570
                                     #xa37561b7b714a361 #x49face7d7d3449ce
571
                                     #x8da47b5252df8d7b #x42a13edddd9f423e
572
                                     #x93bc715e5ecd9371 #xa226971313b1a297
573
                                     #x0457f5a6a6a204f5 #xb86968b9b901b868
574
                                     #x0000000000000000 #x74992cc1c1b5742c
575
                                     #xa080604040e0a060 #x21dd1fe3e3c2211f
576
                                     #x43f2c879793a43c8 #x2c77edb6b69a2ced
577
                                     #xd9b3bed4d40dd9be #xca01468d8d47ca46
578
                                     #x70ced967671770d9 #xdde44b7272afdd4b
579
                                     #x7933de9494ed79de #x672bd49898ff67d4
580
                                     #x237be8b0b09323e8 #xde114a85855bde4a
581
                                     #xbd6d6bbbbb06bd6b #x7e912ac5c5bb7e2a
582
                                     #x349ee54f4f7b34e5 #x3ac116ededd73a16
583
                                     #x5417c58686d254c5 #x622fd79a9af862d7
584
                                     #xffcc55666699ff55 #xa722941111b6a794
585
                                     #x4a0fcf8a8ac04acf #x30c910e9e9d93010
586
                                     #x0a080604040e0a06 #x98e781fefe669881
587
                                     #x0b5bf0a0a0ab0bf0 #xccf0447878b4cc44
588
                                     #xd54aba2525f0d5ba #x3e96e34b4b753ee3
589
                                     #x0e5ff3a2a2ac0ef3 #x19bafe5d5d4419fe
590
                                     #x5b1bc08080db5bc0 #x850a8a050580858a
591
                                     #xec7ead3f3fd3ecad #xdf42bc2121fedfbc
592
                                     #xd8e0487070a8d848 #x0cf904f1f1fd0c04
593
                                     #x7ac6df6363197adf #x58eec177772f58c1
594
                                     #x9f4575afaf309f75 #xa584634242e7a563
595
                                     #x5040302020705030 #x2ed11ae5e5cb2e1a
596
                                     #x12e10efdfdef120e #xb7656dbfbf08b76d
597
                                     #xd4194c818155d44c #x3c30141818243c14
598
                                     #x5f4c352626795f35 #x719d2fc3c3b2712f
599
                                     #x3867e1bebe8638e1 #xfd6aa23535c8fda2
600
                                     #x4f0bcc8888c74fcc #x4b5c392e2e654b39
601
                                     #xf93d5793936af957 #x0daaf25555580df2
602
                                     #x9de382fcfc619d82 #xc9f4477a7ab3c947
603
                                     #xef8bacc8c827efac #x326fe7baba8832e7
604
                                     #x7d642b32324f7d2b #xa4d795e6e642a495
605
                                     #xfb9ba0c0c03bfba0 #xb332981919aab398
606
                                     #x6827d19e9ef668d1 #x815d7fa3a322817f
607
                                     #xaa88664444eeaa66 #x82a87e5454d6827e
608
                                     #xe676ab3b3bdde6ab #x9e16830b0b959e83
609
                                     #x4503ca8c8cc945ca #x7b9529c7c7bc7b29
610
                                     #x6ed6d36b6b056ed3 #x44503c28286c443c
611
                                     #x8b5579a7a72c8b79 #x3d63e2bcbc813de2
612
                                     #x272c1d161631271d #x9a4176adad379a76
613
                                     #x4dad3bdbdb964d3b #xfac85664649efa56
614
                                     #xd2e84e7474a6d24e #x22281e141436221e
615
                                     #x763fdb9292e476db #x1e180a0c0c121e0a
616
                                     #xb4906c4848fcb46c #x376be4b8b88f37e4
617
                                     #xe7255d9f9f78e75d #xb2616ebdbd0fb26e
618
                                     #x2a86ef4343692aef #xf193a6c4c435f1a6
619
                                     #xe372a83939dae3a8 #xf762a43131c6f7a4
620
                                     #x59bd37d3d38a5937 #x86ff8bf2f274868b
621
                                     #x56b132d5d5835632 #xc50d438b8b4ec543
622
                                     #xebdc596e6e85eb59 #xc2afb7dada18c2b7
623
                                     #x8f028c01018e8f8c #xac7964b1b11dac64
624
                                     #x6d23d29c9cf16dd2 #x3b92e04949723be0
625
                                     #xc7abb4d8d81fc7b4 #x1543faacacb915fa
626
                                     #x09fd07f3f3fa0907 #x6f8525cfcfa06f25
627
                                     #xea8fafcaca20eaaf #x89f38ef4f47d898e
628
                                     #x208ee947476720e9 #x2820181010382818
629
                                     #x64ded56f6f0b64d5 #x83fb88f0f0738388
630
                                     #xb1946f4a4afbb16f #x96b8725c5cca9672
631
                                     #x6c70243838546c24 #x08aef157575f08f1
632
                                     #x52e6c773732152c7 #xf33551979764f351
633
                                     #x658d23cbcbae6523 #x84597ca1a125847c
634
                                     #xbfcb9ce8e857bf9c #x637c213e3e5d6321
635
                                     #x7c37dd9696ea7cdd #x7fc2dc61611e7fdc
636
                                     #x911a860d0d9c9186 #x941e850f0f9b9485
637
                                     #xabdb90e0e04bab90 #xc6f8427c7cbac642
638
                                     #x57e2c471712657c4 #xe583aacccc29e5aa
639
                                     #x733bd89090e373d8 #x0f0c050606090f05
640
                                     #x03f501f7f7f40301 #x3638121c1c2a3612
641
                                     #xfe9fa3c2c23cfea3 #xe1d45f6a6a8be15f
642
                                     #x1047f9aeaebe10f9 #x6bd2d06969026bd0
643
                                     #xa82e911717bfa891 #xe82958999971e858
644
                                     #x6974273a3a536927 #xd04eb92727f7d0b9
645
                                     #x48a938d9d9914838 #x35cd13ebebde3513
646
                                     #xce56b32b2be5ceb3 #x5544332222775533
647
                                     #xd6bfbbd2d204d6bb #x904970a9a9399070
648
                                     #x800e890707878089 #xf266a73333c1f2a7
649
                                     #xc15ab62d2decc1b6 #x6678223c3c5a6622
650
                                     #xad2a921515b8ad92 #x608920c9c9a96020
651
                                     #xdb154987875cdb49 #x1a4fffaaaab01aff
652
                                     #x88a0785050d88878 #x8e517aa5a52b8e7a
653
                                     #x8a068f0303898a8f #x13b2f859594a13f8
654
                                     #x9b12800909929b80 #x3934171a1a233917
655
                                     #x75cada65651075da #x53b531d7d7845331
656
                                     #x5113c68484d551c6 #xd3bbb8d0d003d3b8
657
                                     #x5e1fc38282dc5ec3 #xcb52b02929e2cbb0
658
                                     #x99b4775a5ac39977 #x333c111e1e2d3311
659
                                     #x46f6cb7b7b3d46cb #x1f4bfca8a8b71ffc
660
                                     #x61dad66d6d0c61d6 #x4e583a2c2c624e3a
661
                                     
662
                                     #xa5f497a5c6c632f4 #x8497eb84f8f86f97
663
                                     #x99b0c799eeee5eb0 #x8d8cf78df6f67a8c
664
                                     #x0d17e50dffffe817 #xbddcb7bdd6d60adc
665
                                     #xb1c8a7b1dede16c8 #x54fc395491916dfc
666
                                     #x50f0c050606090f0 #x0305040302020705
667
                                     #xa9e087a9cece2ee0 #x7d87ac7d5656d187
668
                                     #x192bd519e7e7cc2b #x62a67162b5b513a6
669
                                     #xe6319ae64d4d7c31 #x9ab5c39aecec59b5
670
                                     #x45cf05458f8f40cf #x9dbc3e9d1f1fa3bc
671
                                     #x40c00940898949c0 #x8792ef87fafa6892
672
                                     #x153fc515efefd03f #xeb267febb2b29426
673
                                     #xc94007c98e8ece40 #x0b1ded0bfbfbe61d
674
                                     #xec2f82ec41416e2f #x67a97d67b3b31aa9
675
                                     #xfd1cbefd5f5f431c #xea258aea45456025
676
                                     #xbfda46bf2323f9da #xf702a6f753535102
677
                                     #x96a1d396e4e445a1 #x5bed2d5b9b9b76ed
678
                                     #xc25deac27575285d #x1c24d91ce1e1c524
679
                                     #xaee97aae3d3dd4e9 #x6abe986a4c4cf2be
680
                                     #x5aeed85a6c6c82ee #x41c3fc417e7ebdc3
681
                                     #x0206f102f5f5f306 #x4fd11d4f838352d1
682
                                     #x5ce4d05c68688ce4 #xf407a2f451515607
683
                                     #x345cb934d1d18d5c #x0818e908f9f9e118
684
                                     #x93aedf93e2e24cae #x73954d73abab3e95
685
                                     #x53f5c453626297f5 #x3f41543f2a2a6b41
686
                                     #x0c14100c08081c14 #x52f63152959563f6
687
                                     #x65af8c654646e9af #x5ee2215e9d9d7fe2
688
                                     #x2878602830304878 #xa1f86ea13737cff8
689
                                     #x0f11140f0a0a1b11 #xb5c45eb52f2febc4
690
                                     #x091b1c090e0e151b #x365a483624247e5a
691
                                     #x9bb6369b1b1badb6 #x3d47a53ddfdf9847
692
                                     #x266a8126cdcda76a #x69bb9c694e4ef5bb
693
                                     #xcd4cfecd7f7f334c #x9fbacf9feaea50ba
694
                                     #x1b2d241b12123f2d #x9eb93a9e1d1da4b9
695
                                     #x749cb0745858c49c #x2e72682e34344672
696
                                     #x2d776c2d36364177 #xb2cda3b2dcdc11cd
697
                                     #xee2973eeb4b49d29 #xfb16b6fb5b5b4d16
698
                                     #xf60153f6a4a4a501 #x4dd7ec4d7676a1d7
699
                                     #x61a37561b7b714a3 #xce49face7d7d3449
700
                                     #x7b8da47b5252df8d #x3e42a13edddd9f42
701
                                     #x7193bc715e5ecd93 #x97a226971313b1a2
702
                                     #xf50457f5a6a6a204 #x68b86968b9b901b8
703
                                     #x0000000000000000 #x2c74992cc1c1b574
704
                                     #x60a080604040e0a0 #x1f21dd1fe3e3c221
705
                                     #xc843f2c879793a43 #xed2c77edb6b69a2c
706
                                     #xbed9b3bed4d40dd9 #x46ca01468d8d47ca
707
                                     #xd970ced967671770 #x4bdde44b7272afdd
708
                                     #xde7933de9494ed79 #xd4672bd49898ff67
709
                                     #xe8237be8b0b09323 #x4ade114a85855bde
710
                                     #x6bbd6d6bbbbb06bd #x2a7e912ac5c5bb7e
711
                                     #xe5349ee54f4f7b34 #x163ac116ededd73a
712
                                     #xc55417c58686d254 #xd7622fd79a9af862
713
                                     #x55ffcc55666699ff #x94a722941111b6a7
714
                                     #xcf4a0fcf8a8ac04a #x1030c910e9e9d930
715
                                     #x060a080604040e0a #x8198e781fefe6698
716
                                     #xf00b5bf0a0a0ab0b #x44ccf0447878b4cc
717
                                     #xbad54aba2525f0d5 #xe33e96e34b4b753e
718
                                     #xf30e5ff3a2a2ac0e #xfe19bafe5d5d4419
719
                                     #xc05b1bc08080db5b #x8a850a8a05058085
720
                                     #xadec7ead3f3fd3ec #xbcdf42bc2121fedf
721
                                     #x48d8e0487070a8d8 #x040cf904f1f1fd0c
722
                                     #xdf7ac6df6363197a #xc158eec177772f58
723
                                     #x759f4575afaf309f #x63a584634242e7a5
724
                                     #x3050403020207050 #x1a2ed11ae5e5cb2e
725
                                     #x0e12e10efdfdef12 #x6db7656dbfbf08b7
726
                                     #x4cd4194c818155d4 #x143c30141818243c
727
                                     #x355f4c352626795f #x2f719d2fc3c3b271
728
                                     #xe13867e1bebe8638 #xa2fd6aa23535c8fd
729
                                     #xcc4f0bcc8888c74f #x394b5c392e2e654b
730
                                     #x57f93d5793936af9 #xf20daaf25555580d
731
                                     #x829de382fcfc619d #x47c9f4477a7ab3c9
732
                                     #xacef8bacc8c827ef #xe7326fe7baba8832
733
                                     #x2b7d642b32324f7d #x95a4d795e6e642a4
734
                                     #xa0fb9ba0c0c03bfb #x98b332981919aab3
735
                                     #xd16827d19e9ef668 #x7f815d7fa3a32281
736
                                     #x66aa88664444eeaa #x7e82a87e5454d682
737
                                     #xabe676ab3b3bdde6 #x839e16830b0b959e
738
                                     #xca4503ca8c8cc945 #x297b9529c7c7bc7b
739
                                     #xd36ed6d36b6b056e #x3c44503c28286c44
740
                                     #x798b5579a7a72c8b #xe23d63e2bcbc813d
741
                                     #x1d272c1d16163127 #x769a4176adad379a
742
                                     #x3b4dad3bdbdb964d #x56fac85664649efa
743
                                     #x4ed2e84e7474a6d2 #x1e22281e14143622
744
                                     #xdb763fdb9292e476 #x0a1e180a0c0c121e
745
                                     #x6cb4906c4848fcb4 #xe4376be4b8b88f37
746
                                     #x5de7255d9f9f78e7 #x6eb2616ebdbd0fb2
747
                                     #xef2a86ef4343692a #xa6f193a6c4c435f1
748
                                     #xa8e372a83939dae3 #xa4f762a43131c6f7
749
                                     #x3759bd37d3d38a59 #x8b86ff8bf2f27486
750
                                     #x3256b132d5d58356 #x43c50d438b8b4ec5
751
                                     #x59ebdc596e6e85eb #xb7c2afb7dada18c2
752
                                     #x8c8f028c01018e8f #x64ac7964b1b11dac
753
                                     #xd26d23d29c9cf16d #xe03b92e04949723b
754
                                     #xb4c7abb4d8d81fc7 #xfa1543faacacb915
755
                                     #x0709fd07f3f3fa09 #x256f8525cfcfa06f
756
                                     #xafea8fafcaca20ea #x8e89f38ef4f47d89
757
                                     #xe9208ee947476720 #x1828201810103828
758
                                     #xd564ded56f6f0b64 #x8883fb88f0f07383
759
                                     #x6fb1946f4a4afbb1 #x7296b8725c5cca96
760
                                     #x246c70243838546c #xf108aef157575f08
761
                                     #xc752e6c773732152 #x51f33551979764f3
762
                                     #x23658d23cbcbae65 #x7c84597ca1a12584
763
                                     #x9cbfcb9ce8e857bf #x21637c213e3e5d63
764
                                     #xdd7c37dd9696ea7c #xdc7fc2dc61611e7f
765
                                     #x86911a860d0d9c91 #x85941e850f0f9b94
766
                                     #x90abdb90e0e04bab #x42c6f8427c7cbac6
767
                                     #xc457e2c471712657 #xaae583aacccc29e5
768
                                     #xd8733bd89090e373 #x050f0c050606090f
769
                                     #x0103f501f7f7f403 #x123638121c1c2a36
770
                                     #xa3fe9fa3c2c23cfe #x5fe1d45f6a6a8be1
771
                                     #xf91047f9aeaebe10 #xd06bd2d06969026b
772
                                     #x91a82e911717bfa8 #x58e82958999971e8
773
                                     #x276974273a3a5369 #xb9d04eb92727f7d0
774
                                     #x3848a938d9d99148 #x1335cd13ebebde35
775
                                     #xb3ce56b32b2be5ce #x3355443322227755
776
                                     #xbbd6bfbbd2d204d6 #x70904970a9a93990
777
                                     #x89800e8907078780 #xa7f266a73333c1f2
778
                                     #xb6c15ab62d2decc1 #x226678223c3c5a66
779
                                     #x92ad2a921515b8ad #x20608920c9c9a960
780
                                     #x49db154987875cdb #xff1a4fffaaaab01a
781
                                     #x7888a0785050d888 #x7a8e517aa5a52b8e
782
                                     #x8f8a068f0303898a #xf813b2f859594a13
783
                                     #x809b12800909929b #x173934171a1a2339
784
                                     #xda75cada65651075 #x3153b531d7d78453
785
                                     #xc65113c68484d551 #xb8d3bbb8d0d003d3
786
                                     #xc35e1fc38282dc5e #xb0cb52b02929e2cb
787
                                     #x7799b4775a5ac399 #x11333c111e1e2d33
788
                                     #xcb46f6cb7b7b3d46 #xfc1f4bfca8a8b71f
789
                                     #xd661dad66d6d0c61 #x3a4e583a2c2c624e
790
                                     
791
                                     #xf4a5f497a5c6c632 #x978497eb84f8f86f
792
                                     #xb099b0c799eeee5e #x8c8d8cf78df6f67a
793
                                     #x170d17e50dffffe8 #xdcbddcb7bdd6d60a
794
                                     #xc8b1c8a7b1dede16 #xfc54fc395491916d
795
                                     #xf050f0c050606090 #x0503050403020207
796
                                     #xe0a9e087a9cece2e #x877d87ac7d5656d1
797
                                     #x2b192bd519e7e7cc #xa662a67162b5b513
798
                                     #x31e6319ae64d4d7c #xb59ab5c39aecec59
799
                                     #xcf45cf05458f8f40 #xbc9dbc3e9d1f1fa3
800
                                     #xc040c00940898949 #x928792ef87fafa68
801
                                     #x3f153fc515efefd0 #x26eb267febb2b294
802
                                     #x40c94007c98e8ece #x1d0b1ded0bfbfbe6
803
                                     #x2fec2f82ec41416e #xa967a97d67b3b31a
804
                                     #x1cfd1cbefd5f5f43 #x25ea258aea454560
805
                                     #xdabfda46bf2323f9 #x02f702a6f7535351
806
                                     #xa196a1d396e4e445 #xed5bed2d5b9b9b76
807
                                     #x5dc25deac2757528 #x241c24d91ce1e1c5
808
                                     #xe9aee97aae3d3dd4 #xbe6abe986a4c4cf2
809
                                     #xee5aeed85a6c6c82 #xc341c3fc417e7ebd
810
                                     #x060206f102f5f5f3 #xd14fd11d4f838352
811
                                     #xe45ce4d05c68688c #x07f407a2f4515156
812
                                     #x5c345cb934d1d18d #x180818e908f9f9e1
813
                                     #xae93aedf93e2e24c #x9573954d73abab3e
814
                                     #xf553f5c453626297 #x413f41543f2a2a6b
815
                                     #x140c14100c08081c #xf652f63152959563
816
                                     #xaf65af8c654646e9 #xe25ee2215e9d9d7f
817
                                     #x7828786028303048 #xf8a1f86ea13737cf
818
                                     #x110f11140f0a0a1b #xc4b5c45eb52f2feb
819
                                     #x1b091b1c090e0e15 #x5a365a483624247e
820
                                     #xb69bb6369b1b1bad #x473d47a53ddfdf98
821
                                     #x6a266a8126cdcda7 #xbb69bb9c694e4ef5
822
                                     #x4ccd4cfecd7f7f33 #xba9fbacf9feaea50
823
                                     #x2d1b2d241b12123f #xb99eb93a9e1d1da4
824
                                     #x9c749cb0745858c4 #x722e72682e343446
825
                                     #x772d776c2d363641 #xcdb2cda3b2dcdc11
826
                                     #x29ee2973eeb4b49d #x16fb16b6fb5b5b4d
827
                                     #x01f60153f6a4a4a5 #xd74dd7ec4d7676a1
828
                                     #xa361a37561b7b714 #x49ce49face7d7d34
829
                                     #x8d7b8da47b5252df #x423e42a13edddd9f
830
                                     #x937193bc715e5ecd #xa297a226971313b1
831
                                     #x04f50457f5a6a6a2 #xb868b86968b9b901
832
                                     #x0000000000000000 #x742c74992cc1c1b5
833
                                     #xa060a080604040e0 #x211f21dd1fe3e3c2
834
                                     #x43c843f2c879793a #x2ced2c77edb6b69a
835
                                     #xd9bed9b3bed4d40d #xca46ca01468d8d47
836
                                     #x70d970ced9676717 #xdd4bdde44b7272af
837
                                     #x79de7933de9494ed #x67d4672bd49898ff
838
                                     #x23e8237be8b0b093 #xde4ade114a85855b
839
                                     #xbd6bbd6d6bbbbb06 #x7e2a7e912ac5c5bb
840
                                     #x34e5349ee54f4f7b #x3a163ac116ededd7
841
                                     #x54c55417c58686d2 #x62d7622fd79a9af8
842
                                     #xff55ffcc55666699 #xa794a722941111b6
843
                                     #x4acf4a0fcf8a8ac0 #x301030c910e9e9d9
844
                                     #x0a060a080604040e #x988198e781fefe66
845
                                     #x0bf00b5bf0a0a0ab #xcc44ccf0447878b4
846
                                     #xd5bad54aba2525f0 #x3ee33e96e34b4b75
847
                                     #x0ef30e5ff3a2a2ac #x19fe19bafe5d5d44
848
                                     #x5bc05b1bc08080db #x858a850a8a050580
849
                                     #xecadec7ead3f3fd3 #xdfbcdf42bc2121fe
850
                                     #xd848d8e0487070a8 #x0c040cf904f1f1fd
851
                                     #x7adf7ac6df636319 #x58c158eec177772f
852
                                     #x9f759f4575afaf30 #xa563a584634242e7
853
                                     #x5030504030202070 #x2e1a2ed11ae5e5cb
854
                                     #x120e12e10efdfdef #xb76db7656dbfbf08
855
                                     #xd44cd4194c818155 #x3c143c3014181824
856
                                     #x5f355f4c35262679 #x712f719d2fc3c3b2
857
                                     #x38e13867e1bebe86 #xfda2fd6aa23535c8
858
                                     #x4fcc4f0bcc8888c7 #x4b394b5c392e2e65
859
                                     #xf957f93d5793936a #x0df20daaf2555558
860
                                     #x9d829de382fcfc61 #xc947c9f4477a7ab3
861
                                     #xefacef8bacc8c827 #x32e7326fe7baba88
862
                                     #x7d2b7d642b32324f #xa495a4d795e6e642
863
                                     #xfba0fb9ba0c0c03b #xb398b332981919aa
864
                                     #x68d16827d19e9ef6 #x817f815d7fa3a322
865
                                     #xaa66aa88664444ee #x827e82a87e5454d6
866
                                     #xe6abe676ab3b3bdd #x9e839e16830b0b95
867
                                     #x45ca4503ca8c8cc9 #x7b297b9529c7c7bc
868
                                     #x6ed36ed6d36b6b05 #x443c44503c28286c
869
                                     #x8b798b5579a7a72c #x3de23d63e2bcbc81
870
                                     #x271d272c1d161631 #x9a769a4176adad37
871
                                     #x4d3b4dad3bdbdb96 #xfa56fac85664649e
872
                                     #xd24ed2e84e7474a6 #x221e22281e141436
873
                                     #x76db763fdb9292e4 #x1e0a1e180a0c0c12
874
                                     #xb46cb4906c4848fc #x37e4376be4b8b88f
875
                                     #xe75de7255d9f9f78 #xb26eb2616ebdbd0f
876
                                     #x2aef2a86ef434369 #xf1a6f193a6c4c435
877
                                     #xe3a8e372a83939da #xf7a4f762a43131c6
878
                                     #x593759bd37d3d38a #x868b86ff8bf2f274
879
                                     #x563256b132d5d583 #xc543c50d438b8b4e
880
                                     #xeb59ebdc596e6e85 #xc2b7c2afb7dada18
881
                                     #x8f8c8f028c01018e #xac64ac7964b1b11d
882
                                     #x6dd26d23d29c9cf1 #x3be03b92e0494972
883
                                     #xc7b4c7abb4d8d81f #x15fa1543faacacb9
884
                                     #x090709fd07f3f3fa #x6f256f8525cfcfa0
885
                                     #xeaafea8fafcaca20 #x898e89f38ef4f47d
886
                                     #x20e9208ee9474767 #x2818282018101038
887
                                     #x64d564ded56f6f0b #x838883fb88f0f073
888
                                     #xb16fb1946f4a4afb #x967296b8725c5cca
889
                                     #x6c246c7024383854 #x08f108aef157575f
890
                                     #x52c752e6c7737321 #xf351f33551979764
891
                                     #x6523658d23cbcbae #x847c84597ca1a125
892
                                     #xbf9cbfcb9ce8e857 #x6321637c213e3e5d
893
                                     #x7cdd7c37dd9696ea #x7fdc7fc2dc61611e
894
                                     #x9186911a860d0d9c #x9485941e850f0f9b
895
                                     #xab90abdb90e0e04b #xc642c6f8427c7cba
896
                                     #x57c457e2c4717126 #xe5aae583aacccc29
897
                                     #x73d8733bd89090e3 #x0f050f0c05060609
898
                                     #x030103f501f7f7f4 #x36123638121c1c2a
899
                                     #xfea3fe9fa3c2c23c #xe15fe1d45f6a6a8b
900
                                     #x10f91047f9aeaebe #x6bd06bd2d0696902
901
                                     #xa891a82e911717bf #xe858e82958999971
902
                                     #x69276974273a3a53 #xd0b9d04eb92727f7
903
                                     #x483848a938d9d991 #x351335cd13ebebde
904
                                     #xceb3ce56b32b2be5 #x5533554433222277
905
                                     #xd6bbd6bfbbd2d204 #x9070904970a9a939
906
                                     #x8089800e89070787 #xf2a7f266a73333c1
907
                                     #xc1b6c15ab62d2dec #x66226678223c3c5a
908
                                     #xad92ad2a921515b8 #x6020608920c9c9a9
909
                                     #xdb49db154987875c #x1aff1a4fffaaaab0
910
                                     #x887888a0785050d8 #x8e7a8e517aa5a52b
911
                                     #x8a8f8a068f030389 #x13f813b2f859594a
912
                                     #x9b809b1280090992 #x39173934171a1a23
913
                                     #x75da75cada656510 #x533153b531d7d784
914
                                     #x51c65113c68484d5 #xd3b8d3bbb8d0d003
915
                                     #x5ec35e1fc38282dc #xcbb0cb52b02929e2
916
                                     #x997799b4775a5ac3 #x3311333c111e1e2d
917
                                     #x46cb46f6cb7b7b3d #x1ffc1f4bfca8a8b7
918
                                     #x61d661dad66d6d0c #x4e3a4e583a2c2c62
919
                                     
920
                                     #x32f4a5f497a5c6c6 #x6f978497eb84f8f8
921
                                     #x5eb099b0c799eeee #x7a8c8d8cf78df6f6
922
                                     #xe8170d17e50dffff #x0adcbddcb7bdd6d6
923
                                     #x16c8b1c8a7b1dede #x6dfc54fc39549191
924
                                     #x90f050f0c0506060 #x0705030504030202
925
                                     #x2ee0a9e087a9cece #xd1877d87ac7d5656
926
                                     #xcc2b192bd519e7e7 #x13a662a67162b5b5
927
                                     #x7c31e6319ae64d4d #x59b59ab5c39aecec
928
                                     #x40cf45cf05458f8f #xa3bc9dbc3e9d1f1f
929
                                     #x49c040c009408989 #x68928792ef87fafa
930
                                     #xd03f153fc515efef #x9426eb267febb2b2
931
                                     #xce40c94007c98e8e #xe61d0b1ded0bfbfb
932
                                     #x6e2fec2f82ec4141 #x1aa967a97d67b3b3
933
                                     #x431cfd1cbefd5f5f #x6025ea258aea4545
934
                                     #xf9dabfda46bf2323 #x5102f702a6f75353
935
                                     #x45a196a1d396e4e4 #x76ed5bed2d5b9b9b
936
                                     #x285dc25deac27575 #xc5241c24d91ce1e1
937
                                     #xd4e9aee97aae3d3d #xf2be6abe986a4c4c
938
                                     #x82ee5aeed85a6c6c #xbdc341c3fc417e7e
939
                                     #xf3060206f102f5f5 #x52d14fd11d4f8383
940
                                     #x8ce45ce4d05c6868 #x5607f407a2f45151
941
                                     #x8d5c345cb934d1d1 #xe1180818e908f9f9
942
                                     #x4cae93aedf93e2e2 #x3e9573954d73abab
943
                                     #x97f553f5c4536262 #x6b413f41543f2a2a
944
                                     #x1c140c14100c0808 #x63f652f631529595
945
                                     #xe9af65af8c654646 #x7fe25ee2215e9d9d
946
                                     #x4878287860283030 #xcff8a1f86ea13737
947
                                     #x1b110f11140f0a0a #xebc4b5c45eb52f2f
948
                                     #x151b091b1c090e0e #x7e5a365a48362424
949
                                     #xadb69bb6369b1b1b #x98473d47a53ddfdf
950
                                     #xa76a266a8126cdcd #xf5bb69bb9c694e4e
951
                                     #x334ccd4cfecd7f7f #x50ba9fbacf9feaea
952
                                     #x3f2d1b2d241b1212 #xa4b99eb93a9e1d1d
953
                                     #xc49c749cb0745858 #x46722e72682e3434
954
                                     #x41772d776c2d3636 #x11cdb2cda3b2dcdc
955
                                     #x9d29ee2973eeb4b4 #x4d16fb16b6fb5b5b
956
                                     #xa501f60153f6a4a4 #xa1d74dd7ec4d7676
957
                                     #x14a361a37561b7b7 #x3449ce49face7d7d
958
                                     #xdf8d7b8da47b5252 #x9f423e42a13edddd
959
                                     #xcd937193bc715e5e #xb1a297a226971313
960
                                     #xa204f50457f5a6a6 #x01b868b86968b9b9
961
                                     #x0000000000000000 #xb5742c74992cc1c1
962
                                     #xe0a060a080604040 #xc2211f21dd1fe3e3
963
                                     #x3a43c843f2c87979 #x9a2ced2c77edb6b6
964
                                     #x0dd9bed9b3bed4d4 #x47ca46ca01468d8d
965
                                     #x1770d970ced96767 #xafdd4bdde44b7272
966
                                     #xed79de7933de9494 #xff67d4672bd49898
967
                                     #x9323e8237be8b0b0 #x5bde4ade114a8585
968
                                     #x06bd6bbd6d6bbbbb #xbb7e2a7e912ac5c5
969
                                     #x7b34e5349ee54f4f #xd73a163ac116eded
970
                                     #xd254c55417c58686 #xf862d7622fd79a9a
971
                                     #x99ff55ffcc556666 #xb6a794a722941111
972
                                     #xc04acf4a0fcf8a8a #xd9301030c910e9e9
973
                                     #x0e0a060a08060404 #x66988198e781fefe
974
                                     #xab0bf00b5bf0a0a0 #xb4cc44ccf0447878
975
                                     #xf0d5bad54aba2525 #x753ee33e96e34b4b
976
                                     #xac0ef30e5ff3a2a2 #x4419fe19bafe5d5d
977
                                     #xdb5bc05b1bc08080 #x80858a850a8a0505
978
                                     #xd3ecadec7ead3f3f #xfedfbcdf42bc2121
979
                                     #xa8d848d8e0487070 #xfd0c040cf904f1f1
980
                                     #x197adf7ac6df6363 #x2f58c158eec17777
981
                                     #x309f759f4575afaf #xe7a563a584634242
982
                                     #x7050305040302020 #xcb2e1a2ed11ae5e5
983
                                     #xef120e12e10efdfd #x08b76db7656dbfbf
984
                                     #x55d44cd4194c8181 #x243c143c30141818
985
                                     #x795f355f4c352626 #xb2712f719d2fc3c3
986
                                     #x8638e13867e1bebe #xc8fda2fd6aa23535
987
                                     #xc74fcc4f0bcc8888 #x654b394b5c392e2e
988
                                     #x6af957f93d579393 #x580df20daaf25555
989
                                     #x619d829de382fcfc #xb3c947c9f4477a7a
990
                                     #x27efacef8bacc8c8 #x8832e7326fe7baba
991
                                     #x4f7d2b7d642b3232 #x42a495a4d795e6e6
992
                                     #x3bfba0fb9ba0c0c0 #xaab398b332981919
993
                                     #xf668d16827d19e9e #x22817f815d7fa3a3
994
                                     #xeeaa66aa88664444 #xd6827e82a87e5454
995
                                     #xdde6abe676ab3b3b #x959e839e16830b0b
996
                                     #xc945ca4503ca8c8c #xbc7b297b9529c7c7
997
                                     #x056ed36ed6d36b6b #x6c443c44503c2828
998
                                     #x2c8b798b5579a7a7 #x813de23d63e2bcbc
999
                                     #x31271d272c1d1616 #x379a769a4176adad
1000
                                     #x964d3b4dad3bdbdb #x9efa56fac8566464
1001
                                     #xa6d24ed2e84e7474 #x36221e22281e1414
1002
                                     #xe476db763fdb9292 #x121e0a1e180a0c0c
1003
                                     #xfcb46cb4906c4848 #x8f37e4376be4b8b8
1004
                                     #x78e75de7255d9f9f #x0fb26eb2616ebdbd
1005
                                     #x692aef2a86ef4343 #x35f1a6f193a6c4c4
1006
                                     #xdae3a8e372a83939 #xc6f7a4f762a43131
1007
                                     #x8a593759bd37d3d3 #x74868b86ff8bf2f2
1008
                                     #x83563256b132d5d5 #x4ec543c50d438b8b
1009
                                     #x85eb59ebdc596e6e #x18c2b7c2afb7dada
1010
                                     #x8e8f8c8f028c0101 #x1dac64ac7964b1b1
1011
                                     #xf16dd26d23d29c9c #x723be03b92e04949
1012
                                     #x1fc7b4c7abb4d8d8 #xb915fa1543faacac
1013
                                     #xfa090709fd07f3f3 #xa06f256f8525cfcf
1014
                                     #x20eaafea8fafcaca #x7d898e89f38ef4f4
1015
                                     #x6720e9208ee94747 #x3828182820181010
1016
                                     #x0b64d564ded56f6f #x73838883fb88f0f0
1017
                                     #xfbb16fb1946f4a4a #xca967296b8725c5c
1018
                                     #x546c246c70243838 #x5f08f108aef15757
1019
                                     #x2152c752e6c77373 #x64f351f335519797
1020
                                     #xae6523658d23cbcb #x25847c84597ca1a1
1021
                                     #x57bf9cbfcb9ce8e8 #x5d6321637c213e3e
1022
                                     #xea7cdd7c37dd9696 #x1e7fdc7fc2dc6161
1023
                                     #x9c9186911a860d0d #x9b9485941e850f0f
1024
                                     #x4bab90abdb90e0e0 #xbac642c6f8427c7c
1025
                                     #x2657c457e2c47171 #x29e5aae583aacccc
1026
                                     #xe373d8733bd89090 #x090f050f0c050606
1027
                                     #xf4030103f501f7f7 #x2a36123638121c1c
1028
                                     #x3cfea3fe9fa3c2c2 #x8be15fe1d45f6a6a
1029
                                     #xbe10f91047f9aeae #x026bd06bd2d06969
1030
                                     #xbfa891a82e911717 #x71e858e829589999
1031
                                     #x5369276974273a3a #xf7d0b9d04eb92727
1032
                                     #x91483848a938d9d9 #xde351335cd13ebeb
1033
                                     #xe5ceb3ce56b32b2b #x7755335544332222
1034
                                     #x04d6bbd6bfbbd2d2 #x399070904970a9a9
1035
                                     #x878089800e890707 #xc1f2a7f266a73333
1036
                                     #xecc1b6c15ab62d2d #x5a66226678223c3c
1037
                                     #xb8ad92ad2a921515 #xa96020608920c9c9
1038
                                     #x5cdb49db15498787 #xb01aff1a4fffaaaa
1039
                                     #xd8887888a0785050 #x2b8e7a8e517aa5a5
1040
                                     #x898a8f8a068f0303 #x4a13f813b2f85959
1041
                                     #x929b809b12800909 #x2339173934171a1a
1042
                                     #x1075da75cada6565 #x84533153b531d7d7
1043
                                     #xd551c65113c68484 #x03d3b8d3bbb8d0d0
1044
                                     #xdc5ec35e1fc38282 #xe2cbb0cb52b02929
1045
                                     #xc3997799b4775a5a #x2d3311333c111e1e
1046
                                     #x3d46cb46f6cb7b7b #xb71ffc1f4bfca8a8
1047
                                     #x0c61d661dad66d6d #x624e3a4e583a2c2c))))
1048
 
1049
 (declaim (inline groestl-table)
1050
          (ftype (function ((integer 0 2048)) (unsigned-byte 64)) groestl-table))
1051
 (defun groestl-table (i)
1052
   (declare (type (integer 0 2048) i))
1053
   (aref +groestl-table+ i))
1054
 
1055
 ;;;
1056
 ;;; Rounds
1057
 ;;;
1058
 
1059
 (defmacro groestl-ext-byte (v n)
1060
   `(logand (ash ,v (* 8 (- ,n 7))) #xff))
1061
 
1062
 (defmacro groestl-column (x y i c0 c1 c2 c3 c4 c5 c6 c7)
1063
   "Compute one new state column."
1064
   `(setf (aref ,y ,i)
1065
          (logxor (groestl-table (groestl-ext-byte (aref ,x ,c0) 0))
1066
                  (groestl-table (+ 256 (groestl-ext-byte (aref ,x ,c1) 1)))
1067
                  (groestl-table (+ 512 (groestl-ext-byte (aref ,x ,c2) 2)))
1068
                  (groestl-table (+ 768 (groestl-ext-byte (aref ,x ,c3) 3)))
1069
                  (groestl-table (+ 1024 (groestl-ext-byte (aref ,x ,c4) 4)))
1070
                  (groestl-table (+ 1280 (groestl-ext-byte (aref ,x ,c5) 5)))
1071
                  (groestl-table (+ 1536 (groestl-ext-byte (aref ,x ,c6) 6)))
1072
                  (groestl-table (+ 1792 (groestl-ext-byte (aref ,x ,c7) 7))))))
1073
 
1074
 (declaim (inline groestl-rnd512p)
1075
          (ftype (function ((simple-array (unsigned-byte 64) (#.+groestl-cols-512+))
1076
                            (simple-array (unsigned-byte 64) (#.+groestl-cols-512+))
1077
                            (unsigned-byte 64)))
1078
                 groestl-end512p))
1079
 (defun groestl-rnd512p (x y r)
1080
   "Compute a round in P (short variants)."
1081
   (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-512+)) x y)
1082
            (type (unsigned-byte 64) r)
1083
            (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1084
   (setf (aref x 0) (logxor (aref x 0) #x0000000000000000 r)
1085
         (aref x 1) (logxor (aref x 1) #x1000000000000000 r)
1086
         (aref x 2) (logxor (aref x 2) #x2000000000000000 r)
1087
         (aref x 3) (logxor (aref x 3) #x3000000000000000 r)
1088
         (aref x 4) (logxor (aref x 4) #x4000000000000000 r)
1089
         (aref x 5) (logxor (aref x 5) #x5000000000000000 r)
1090
         (aref x 6) (logxor (aref x 6) #x6000000000000000 r)
1091
         (aref x 7) (logxor (aref x 7) #x7000000000000000 r))
1092
   (groestl-column x y 0 0 1 2 3 4 5 6 7)
1093
   (groestl-column x y 1 1 2 3 4 5 6 7 0)
1094
   (groestl-column x y 2 2 3 4 5 6 7 0 1)
1095
   (groestl-column x y 3 3 4 5 6 7 0 1 2)
1096
   (groestl-column x y 4 4 5 6 7 0 1 2 3)
1097
   (groestl-column x y 5 5 6 7 0 1 2 3 4)
1098
   (groestl-column x y 6 6 7 0 1 2 3 4 5)
1099
   (groestl-column x y 7 7 0 1 2 3 4 5 6)
1100
   (values))
1101
 
1102
 (declaim (inline groestl-rnd512q)
1103
          (ftype (function ((simple-array (unsigned-byte 64) (#.+groestl-cols-512+))
1104
                            (simple-array (unsigned-byte 64) (#.+groestl-cols-512+))
1105
                            (unsigned-byte 64)))
1106
                 groestl-end512q))
1107
 (defun groestl-rnd512q (x y r)
1108
   "Compute a round in Q (short variants)."
1109
   (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-512+)) x y)
1110
            (type (unsigned-byte 64) r)
1111
            (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1112
   (setf (aref x 0) (logxor (aref x 0) #xffffffffffffffff r)
1113
         (aref x 1) (logxor (aref x 1) #xffffffffffffffef r)
1114
         (aref x 2) (logxor (aref x 2) #xffffffffffffffdf r)
1115
         (aref x 3) (logxor (aref x 3) #xffffffffffffffcf r)
1116
         (aref x 4) (logxor (aref x 4) #xffffffffffffffbf r)
1117
         (aref x 5) (logxor (aref x 5) #xffffffffffffffaf r)
1118
         (aref x 6) (logxor (aref x 6) #xffffffffffffff9f r)
1119
         (aref x 7) (logxor (aref x 7) #xffffffffffffff8f r))
1120
   (groestl-column x y 0 1 3 5 7 0 2 4 6)
1121
   (groestl-column x y 1 2 4 6 0 1 3 5 7)
1122
   (groestl-column x y 2 3 5 7 1 2 4 6 0)
1123
   (groestl-column x y 3 4 6 0 2 3 5 7 1)
1124
   (groestl-column x y 4 5 7 1 3 4 6 0 2)
1125
   (groestl-column x y 5 6 0 2 4 5 7 1 3)
1126
   (groestl-column x y 6 7 1 3 5 6 0 2 4)
1127
   (groestl-column x y 7 0 2 4 6 7 1 3 5)
1128
   (values))
1129
 
1130
 (declaim (inline groestl-rnd1024p)
1131
          (ftype (function ((simple-array (unsigned-byte 64) (#.+groestl-cols-1024+))
1132
                            (simple-array (unsigned-byte 64) (#.+groestl-cols-1024+))
1133
                            (unsigned-byte 64)))
1134
                 groestl-end1024p))
1135
 (defun groestl-rnd1024p (x y r)
1136
   "Compute a round in P (long variants)."
1137
   (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-1024+)) x y)
1138
            (type (unsigned-byte 64) r)
1139
            (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1140
   (setf (aref x 0) (logxor (aref x 0) #x0000000000000000 r)
1141
         (aref x 1) (logxor (aref x 1) #x1000000000000000 r)
1142
         (aref x 2) (logxor (aref x 2) #x2000000000000000 r)
1143
         (aref x 3) (logxor (aref x 3) #x3000000000000000 r)
1144
         (aref x 4) (logxor (aref x 4) #x4000000000000000 r)
1145
         (aref x 5) (logxor (aref x 5) #x5000000000000000 r)
1146
         (aref x 6) (logxor (aref x 6) #x6000000000000000 r)
1147
         (aref x 7) (logxor (aref x 7) #x7000000000000000 r)
1148
         (aref x 8) (logxor (aref x 8) #x8000000000000000 r)
1149
         (aref x 9) (logxor (aref x 9) #x9000000000000000 r)
1150
         (aref x 10) (logxor (aref x 10) #xa000000000000000 r)
1151
         (aref x 11) (logxor (aref x 11) #xb000000000000000 r)
1152
         (aref x 12) (logxor (aref x 12) #xc000000000000000 r)
1153
         (aref x 13) (logxor (aref x 13) #xd000000000000000 r)
1154
         (aref x 14) (logxor (aref x 14) #xe000000000000000 r)
1155
         (aref x 15) (logxor (aref x 15) #xf000000000000000 r))
1156
   (groestl-column x y 15 15 0 1 2 3 4 5 10)
1157
   (groestl-column x y 14 14 15 0 1 2 3 4 9)
1158
   (groestl-column x y 13 13 14 15 0 1 2 3 8)
1159
   (groestl-column x y 12 12 13 14 15 0 1 2 7)
1160
   (groestl-column x y 11 11 12 13 14 15 0 1 6)
1161
   (groestl-column x y 10 10 11 12 13 14 15 0 5)
1162
   (groestl-column x y 9 9 10 11 12 13 14 15 4)
1163
   (groestl-column x y 8 8 9 10 11 12 13 14 3)
1164
   (groestl-column x y 7 7 8 9 10 11 12 13 2)
1165
   (groestl-column x y 6 6 7 8 9 10 11 12 1)
1166
   (groestl-column x y 5 5 6 7 8 9 10 11 0)
1167
   (groestl-column x y 4 4 5 6 7 8 9 10 15)
1168
   (groestl-column x y 3 3 4 5 6 7 8 9 14)
1169
   (groestl-column x y 2 2 3 4 5 6 7 8 13)
1170
   (groestl-column x y 1 1 2 3 4 5 6 7 12)
1171
   (groestl-column x y 0 0 1 2 3 4 5 6 11)
1172
   (values))
1173
 
1174
 (declaim (inline groestl-rnd1024q)
1175
          (ftype (function ((simple-array (unsigned-byte 64) (#.+groestl-cols-1024+))
1176
                            (simple-array (unsigned-byte 64) (#.+groestl-cols-1024+))
1177
                            (unsigned-byte 64)))
1178
                 groestl-end1024q))
1179
 (defun groestl-rnd1024q (x y r)
1180
   "Compute a round in Q (long variants)."
1181
   (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-1024+)) x y)
1182
            (type (unsigned-byte 64) r)
1183
            (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1184
   (setf (aref x 0) (logxor (aref x 0) #xffffffffffffffff r)
1185
         (aref x 1) (logxor (aref x 1) #xffffffffffffffef r)
1186
         (aref x 2) (logxor (aref x 2) #xffffffffffffffdf r)
1187
         (aref x 3) (logxor (aref x 3) #xffffffffffffffcf r)
1188
         (aref x 4) (logxor (aref x 4) #xffffffffffffffbf r)
1189
         (aref x 5) (logxor (aref x 5) #xffffffffffffffaf r)
1190
         (aref x 6) (logxor (aref x 6) #xffffffffffffff9f r)
1191
         (aref x 7) (logxor (aref x 7) #xffffffffffffff8f r)
1192
         (aref x 8) (logxor (aref x 8) #xffffffffffffff7f r)
1193
         (aref x 9) (logxor (aref x 9) #xffffffffffffff6f r)
1194
         (aref x 10) (logxor (aref x 10) #xffffffffffffff5f r)
1195
         (aref x 11) (logxor (aref x 11) #xffffffffffffff4f r)
1196
         (aref x 12) (logxor (aref x 12) #xffffffffffffff3f r)
1197
         (aref x 13) (logxor (aref x 13) #xffffffffffffff2f r)
1198
         (aref x 14) (logxor (aref x 14) #xffffffffffffff1f r)
1199
         (aref x 15) (logxor (aref x 15) #xffffffffffffff0f r))
1200
   (groestl-column x y 15 0 2 4 10 15 1 3 5)
1201
   (groestl-column x y 14 15 1 3 9 14 0 2 4)
1202
   (groestl-column x y 13 14 0 2 8 13 15 1 3)
1203
   (groestl-column x y 12 13 15 1 7 12 14 0 2)
1204
   (groestl-column x y 11 12 14 0 6 11 13 15 1)
1205
   (groestl-column x y 10 11 13 15 5 10 12 14 0)
1206
   (groestl-column x y 9 10 12 14 4 9 11 13 15)
1207
   (groestl-column x y 8 9 11 13 3 8 10 12 14)
1208
   (groestl-column x y 7 8 10 12 2 7 9 11 13)
1209
   (groestl-column x y 6 7 9 11 1 6 8 10 12)
1210
   (groestl-column x y 5 6 8 10 0 5 7 9 11)
1211
   (groestl-column x y 4 5 7 9 15 4 6 8 10)
1212
   (groestl-column x y 3 4 6 8 14 3 5 7 9)
1213
   (groestl-column x y 2 3 5 7 13 2 4 6 8)
1214
   (groestl-column x y 1 2 4 6 12 1 3 5 7)
1215
   (groestl-column x y 0 1 3 5 11 0 2 4 6)
1216
   (values))
1217
 
1218
 
1219
 ;;;
1220
 ;;; Compression
1221
 ;;;
1222
 
1223
 (defun groestl-f512 (state input start)
1224
   "The compression function (short variants)."
1225
   (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-512+)) state)
1226
            (type (simple-array (unsigned-byte 8) (*)) input)
1227
            (type (unsigned-byte 64) start)
1228
            (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1229
   (let ((y (make-array #.+groestl-cols-512+ :element-type '(unsigned-byte 64)))
1230
         (z (make-array #.+groestl-cols-512+ :element-type '(unsigned-byte 64)))
1231
         (outq (make-array #.+groestl-cols-512+ :element-type '(unsigned-byte 64)))
1232
         (inp (make-array #.+groestl-cols-512+ :element-type '(unsigned-byte 64))))
1233
     (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-512+)) y z outq inp)
1234
              (dynamic-extent y z outq inp))
1235
 
1236
     (dotimes (i +groestl-cols-512+)
1237
       (declare (type (integer 0 #.+groestl-cols-512+) i))
1238
       (let ((n (ub64ref/be input (+ start (* 8 i)))))
1239
         (declare (type (unsigned-byte 64) n))
1240
         (setf (aref z i) n
1241
               (aref inp i) (logxor (aref state i) n))))
1242
 
1243
     ;; Compute Q(m)
1244
     (groestl-rnd512q z y 0)
1245
     (loop for i from 1 below (1- +groestl-rounds-512+) by 2 do
1246
              (groestl-rnd512q y z i)
1247
              (groestl-rnd512q z y (1+ i)))
1248
     (groestl-rnd512q y outq (1- +groestl-rounds-512+))
1249
 
1250
     ;; Compute P(h + m)
1251
     (groestl-rnd512p inp z 0)
1252
     (loop for i of-type fixnum from 1 below (1- +groestl-rounds-512+) by 2 do
1253
              (groestl-rnd512p z y (ash i 56))
1254
              (groestl-rnd512p y z (ash (1+ i) 56)))
1255
     (groestl-rnd512p z y (ash (1- +groestl-rounds-512+) 56))
1256
 
1257
     ;; h' = h + Q(m) + P(h + m)
1258
     (dotimes (i +groestl-cols-512+)
1259
       (declare (type (integer 0 #.+groestl-cols-512+) i))
1260
       (setf (aref state i) (logxor (aref state i) (aref outq i) (aref y i))))
1261
 
1262
     (values)))
1263
 
1264
 (defun groestl-f1024 (state input start)
1265
   "The compression function (long variants)."
1266
   (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-1024+)) state)
1267
            (type (simple-array (unsigned-byte 8) (*)) input)
1268
            (type (unsigned-byte 64) start)
1269
            (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1270
   (let ((y (make-array #.+groestl-cols-1024+ :element-type '(unsigned-byte 64)))
1271
         (z (make-array #.+groestl-cols-1024+ :element-type '(unsigned-byte 64)))
1272
         (outq (make-array #.+groestl-cols-1024+ :element-type '(unsigned-byte 64)))
1273
         (inp (make-array #.+groestl-cols-1024+ :element-type '(unsigned-byte 64))))
1274
     (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-1024+)) y z outq inp)
1275
              (dynamic-extent y z outq inp))
1276
 
1277
     (dotimes (i +groestl-cols-1024+)
1278
       (declare (type (integer 0 #.+groestl-cols-1024+) i))
1279
       (let ((n (ub64ref/be input (+ start (* 8 i)))))
1280
         (declare (type (unsigned-byte 64) n))
1281
         (setf (aref z i) n
1282
               (aref inp i) (logxor (aref state i) n))))
1283
 
1284
     ;; Compute Q(m)
1285
     (groestl-rnd1024q z y 0)
1286
     (loop for i from 1 below (1- +groestl-rounds-1024+) by 2 do
1287
              (groestl-rnd1024q y z i)
1288
              (groestl-rnd1024q z y (1+ i)))
1289
     (groestl-rnd1024q y outq (1- +groestl-rounds-1024+))
1290
 
1291
     ;; Compute P(h + m)
1292
     (groestl-rnd1024p inp z 0)
1293
     (loop for i of-type fixnum from 1 below (1- +groestl-rounds-1024+) by 2 do
1294
              (groestl-rnd1024p z y (ash i 56))
1295
              (groestl-rnd1024p y z (ash (1+ i) 56)))
1296
     (groestl-rnd1024p z y (ash (1- +groestl-rounds-1024+) 56))
1297
 
1298
     ;; h' = h + Q(m) + P(h + m)
1299
     (dotimes (i +groestl-cols-1024+)
1300
       (declare (type (integer 0 #.+groestl-cols-1024+) i))
1301
       (setf (aref state i) (logxor (aref state i) (aref outq i) (aref y i))))
1302
 
1303
     (values)))
1304
 
1305
 
1306
 ;;;
1307
 ;;; Digest structures and functions
1308
 ;;;
1309
 
1310
 (defun groestl-make-initial-state (output-bit-length)
1311
   (let ((state (make-array (if (<= output-bit-length 256)
1312
                                #.+groestl-cols-512+
1313
                                #.+groestl-cols-1024+)
1314
                            :element-type '(unsigned-byte 64)
1315
                            :initial-element 0)))
1316
     (setf (aref state (1- (length state))) output-bit-length)
1317
     state))
1318
 
1319
 (defstruct (groestl
1320
             (:constructor %make-groestl-digest nil)
1321
             (:copier nil))
1322
   (state (groestl-make-initial-state 512)
1323
    :type (simple-array (unsigned-byte 64) (*)))
1324
   (block-counter 0 :type (unsigned-byte 64))
1325
   (buffer (make-array #.+groestl-size-1024+ :element-type '(unsigned-byte 8))
1326
    :type (simple-array (unsigned-byte 8) (*)))
1327
   (buffer-index 0 :type (integer 0 #.+groestl-size-1024+)))
1328
 
1329
 (defstruct (groestl/384
1330
             (:include groestl)
1331
             (:constructor %make-groestl/384-digest
1332
                 (&aux (state (groestl-make-initial-state 384))))
1333
             (:copier nil)))
1334
 
1335
 (defstruct (groestl/256
1336
             (:include groestl)
1337
             (:constructor %make-groestl/256-digest
1338
                 (&aux (state (groestl-make-initial-state 256))
1339
                       (buffer (make-array #.+groestl-size-512+
1340
                                           :element-type '(unsigned-byte 8)))))))
1341
 
1342
 (defstruct (groestl/224
1343
             (:include groestl)
1344
             (:constructor %make-groestl/224-digest
1345
                 (&aux (state (groestl-make-initial-state 224))
1346
                       (buffer (make-array #.+groestl-size-512+
1347
                                           :element-type '(unsigned-byte 8)))))))
1348
 
1349
 (defmethod reinitialize-instance ((state groestl) &rest initargs)
1350
   (declare (ignore initargs))
1351
   (setf (groestl-state state) (etypecase state
1352
                                 (groestl/224 (groestl-make-initial-state 224))
1353
                                 (groestl/256 (groestl-make-initial-state 256))
1354
                                 (groestl/384 (groestl-make-initial-state 384))
1355
                                 (groestl (groestl-make-initial-state 512)))
1356
         (groestl-block-counter state) 0
1357
         (groestl-buffer-index state) 0)
1358
   state)
1359
 
1360
 (defmethod copy-digest ((state groestl) &optional copy)
1361
   (check-type copy (or null groestl))
1362
   (let ((copy (if copy
1363
                   copy
1364
                   (etypecase state
1365
                     (groestl/224 (%make-groestl/224-digest))
1366
                     (groestl/256 (%make-groestl/256-digest))
1367
                     (groestl/384 (%make-groestl/384-digest))
1368
                     (groestl (%make-groestl-digest))))))
1369
     (declare (type groestl copy))
1370
     (replace (groestl-state copy) (groestl-state state))
1371
     (replace (groestl-buffer copy) (groestl-buffer state))
1372
     (setf (groestl-block-counter copy) (groestl-block-counter state)
1373
           (groestl-buffer-index copy) (groestl-buffer-index state))
1374
     copy))
1375
 
1376
 (defun groestl-update (state input start end)
1377
   (declare (type (simple-array (unsigned-byte 8) (*)) input)
1378
            (type (unsigned-byte 64) start end)
1379
            (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1380
   (let* ((groestl-state (groestl-state state))
1381
          (buffer (groestl-buffer state))
1382
          (buffer-index (groestl-buffer-index state))
1383
          (block-counter (groestl-block-counter state))
1384
          (block-size (length buffer))
1385
          (transform (if (= block-size +groestl-size-512+)
1386
                         #'groestl-f512
1387
                         #'groestl-f1024))
1388
          (length (- end start))
1389
          (n 0))
1390
     (declare (type (simple-array (unsigned-byte 64) (*)) groestl-state)
1391
              (type (simple-array (unsigned-byte 8) (*)) buffer)
1392
              (type (integer 0 #.+groestl-size-1024+) block-size buffer-index n)
1393
              (type (unsigned-byte 64) length))
1394
 
1395
     ;; Try to fill the buffer with the new data
1396
     (setf n (min length (- block-size buffer-index)))
1397
     (replace buffer input :start1 buffer-index :start2 start :end2 (+ start n))
1398
     (incf buffer-index n)
1399
     (incf start n)
1400
     (decf length n)
1401
 
1402
     ;; Process data in buffer
1403
     (when (= buffer-index block-size)
1404
       (funcall transform groestl-state buffer 0)
1405
       (setf buffer-index 0)
1406
       (incf block-counter))
1407
 
1408
     ;; Process data in message
1409
     (loop until (< length block-size) do
1410
              (funcall transform groestl-state input start)
1411
              (incf block-counter)
1412
              (incf start block-size)
1413
              (decf length block-size))
1414
 
1415
     ;; Put remaining message data in buffer
1416
     (when (plusp length)
1417
       (replace buffer input :end1 length :start2 start)
1418
       (setf buffer-index length))
1419
 
1420
     ;; Save the new state
1421
     (setf (groestl-block-counter state) block-counter
1422
           (groestl-buffer-index state) buffer-index)
1423
 
1424
     (values)))
1425
 
1426
 (defun groestl-finalize (state digest digest-start)
1427
   (let* ((digest-length (digest-length state))
1428
          (groestl-state (groestl-state state))
1429
          (buffer (groestl-buffer state))
1430
          (buffer-index (groestl-buffer-index state))
1431
          (block-counter (groestl-block-counter state))
1432
          (block-size (length buffer))
1433
          (transform (if (= block-size +groestl-size-512+)
1434
                         #'groestl-f512
1435
                         #'groestl-f1024)))
1436
     (declare (type (simple-array (unsigned-byte 64) (*)) groestl-state)
1437
              (type (simple-array (unsigned-byte 8) (*)) buffer)
1438
              (type (integer 0 #.+groestl-size-1024+) block-size buffer-index)
1439
              (optimize (speed 3) (space 0) (safety 0) (debug 0)))
1440
 
1441
     ;; Pad with 0s
1442
     (setf (aref buffer buffer-index) #x80)
1443
     (incf buffer-index)
1444
     (when (> buffer-index (- block-size +groestl-length-field-length+))
1445
       ;; Padding requires two blocks
1446
       (fill buffer 0 :start buffer-index)
1447
       (funcall transform groestl-state buffer 0)
1448
       (incf block-counter)
1449
       (setf buffer-index 0))
1450
     (fill buffer 0 :start buffer-index)
1451
     (setf buffer-index (- block-size +groestl-length-field-length+))
1452
 
1453
     ;; Length padding
1454
     (incf block-counter)
1455
     (setf (ub64ref/be buffer buffer-index) block-counter)
1456
     (funcall transform groestl-state buffer 0)
1457
 
1458
     ;; Output transformation: h = P(h) + h
1459
     (if (= block-size +groestl-size-512+)
1460
         (let ((temp (copy-seq groestl-state))
1461
               (y (make-array +groestl-cols-512+ :element-type '(unsigned-byte 64)))
1462
               (z (make-array +groestl-cols-512+ :element-type '(unsigned-byte 64))))
1463
           (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-512+)) temp y z)
1464
                    (dynamic-extent temp y z))
1465
           (groestl-rnd512p temp z 0)
1466
           (loop for i from 1 below (1- +groestl-rounds-512+) by 2 do
1467
                    (groestl-rnd512p z y (ash i 56))
1468
                    (groestl-rnd512p y z (ash (1+ i) 56)))
1469
           (groestl-rnd512p z temp (ash (1- +groestl-rounds-512+) 56))
1470
           (dotimes (i +groestl-cols-512+)
1471
             (setf (aref groestl-state i) (logxor (aref groestl-state i)
1472
                                                  (aref temp i)))))
1473
         (let ((temp (copy-seq groestl-state))
1474
               (y (make-array +groestl-cols-1024+ :element-type '(unsigned-byte 64)))
1475
               (z (make-array +groestl-cols-1024+ :element-type '(unsigned-byte 64))))
1476
           (declare (type (simple-array (unsigned-byte 64) (#.+groestl-cols-1024+)) temp y z)
1477
                    (dynamic-extent temp y z))
1478
           (groestl-rnd1024p temp y 0)
1479
           (loop for i from 1 below (1- +groestl-rounds-1024+) by 2 do
1480
                    (groestl-rnd1024p y z (ash i 56))
1481
                    (groestl-rnd1024p z y (ash (1+ i) 56)))
1482
           (groestl-rnd1024p y temp (ash (1- +groestl-rounds-1024+) 56))
1483
           (dotimes (i +groestl-cols-1024+)
1484
             (setf (aref groestl-state i) (logxor (aref groestl-state i)
1485
                                                  (aref temp i))))))
1486
 
1487
     ;; Truncate the final hash value to generate the message digest
1488
     (let ((output (make-array block-size :element-type '(unsigned-byte 8))))
1489
       (dotimes (i (length groestl-state))
1490
         (setf (ub64ref/be output (* i 8)) (aref groestl-state i)))
1491
       (replace digest output :start1 digest-start :start2 (- block-size digest-length))
1492
       digest)))
1493
 
1494
 (define-digest-updater groestl
1495
   (groestl-update state sequence start end))
1496
 
1497
 (define-digest-finalizer ((groestl 64)
1498
                           (groestl/384 48)
1499
                           (groestl/256 32)
1500
                           (groestl/224 28))
1501
   (groestl-finalize state digest digest-start))
1502
 
1503
 (defdigest groestl :digest-length 64 :block-length 128)
1504
 (defdigest groestl/384 :digest-length 48 :block-length 128)
1505
 (defdigest groestl/256 :digest-length 32 :block-length 64)
1506
 (defdigest groestl/224 :digest-length 28 :block-length 64)
1507