Coverage report: /home/ellis/comp/ext/ironclad/src/ciphers/kalyna.lisp

KindCoveredAll%
expression03103 0.0
branch04 0.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;;; kalyna.lisp -- implementation of the Kalyna block ciphers (DSTU 7624:2014)
2
 (in-package :crypto)
3
 
4
 ;;; Constants
5
 (eval-when (:compile-toplevel :load-toplevel :execute)
6
   (defconst +kalyna-t+
7
     (make-array '(8 256)
8
                 :element-type '(unsigned-byte 64)
9
                 :initial-contents '((#xa832a829d77f9aa8 #x4352432297d41143
10
                                      #x5f3e5fc2df80615f #x061e063014121806
11
                                      #x6bda6b7f670cb16b #x75bc758f2356c975
12
                                      #x6cc16c477519ad6c #x592059f2cb927959
13
                                      #x71a871af3b4ad971 #xdf84dfb6f8275bdf
14
                                      #x87a1874c35b22687 #x95fb95dc59cc6e95
15
                                      #x174b17b872655c17 #xf017f0d31aeae7f0
16
                                      #xd89fd88eea3247d8 #x092d0948363f2409
17
                                      #x6dc46d4f731ea96d #xf318f3cb10e3ebf3
18
                                      #x1d691de84e53741d #xcbc0cb16804b0bcb
19
                                      #xc9cac9068c4503c9 #x4d644d52b3fe294d
20
                                      #x2c9c2c7de8c4b02c #xaf29af11c56a86af
21
                                      #x798079ef0b72f979 #xe047e0537a9aa7e0
22
                                      #x97f197cc55c26697 #xfd2efdbb34c9d3fd
23
                                      #x6fce6f5f7f10a16f #x4b7a4b62a7ec314b
24
                                      #x454c451283c60945 #x39dd39d596afe439
25
                                      #x3ec63eed84baf83e #xdd8edda6f42953dd
26
                                      #xa315a371ed4eb6a3 #x4f6e4f42bff0214f
27
                                      #xb45eb4c99f2beab4 #xb654b6d99325e2b6
28
                                      #x9ac89aa47be1529a #x0e360e70242a380e
29
                                      #x1f631ff8425d7c1f #xbf79bf91a51ac6bf
30
                                      #x154115a87e6b5415 #xe142e15b7c9da3e1
31
                                      #x49704972abe23949 #xd2bdd2ded6046fd2
32
                                      #x93e593ec4dde7693 #xc6f9c67eae683fc6
33
                                      #x92e092e44bd97292 #x72a772b73143d572
34
                                      #x9edc9e8463fd429e #x61f8612f5b3a9961
35
                                      #xd1b2d1c6dc0d63d1 #x63f2633f57349163
36
                                      #xfa35fa8326dccffa #xee71ee235eb09fee
37
                                      #xf403f4f302f6f7f4 #x197d19c8564f6419
38
                                      #xd5a6d5e6c41173d5 #xad23ad01c9648ead
39
                                      #x582558facd957d58 #xa40ea449ff5baaa4
40
                                      #xbb6dbbb1bd06d6bb #xa11fa161e140bea1
41
                                      #xdc8bdcaef22e57dc #xf21df2c316e4eff2
42
                                      #x83b5836c2dae3683 #x37eb37a5b285dc37
43
                                      #x4257422a91d31542 #xe453e4736286b7e4
44
                                      #x7a8f7af7017bf57a #x32fa328dac9ec832
45
                                      #x9cd69c946ff34a9c #xccdbcc2e925e17cc
46
                                      #xab3dab31dd7696ab #x4a7f4a6aa1eb354a
47
                                      #x8f898f0c058a068f #x6ecb6e577917a56e
48
                                      #x04140420181c1004 #x27bb2725d2f59c27
49
                                      #x2e962e6de4cab82e #xe75ce76b688fbbe7
50
                                      #xe24de2437694afe2 #x5a2f5aeac19b755a
51
                                      #x96f496c453c56296 #x164e16b074625816
52
                                      #x23af2305cae98c23 #x2b872b45fad1ac2b
53
                                      #xc2edc25eb6742fc2 #x65ec650f43268965
54
                                      #x66e36617492f8566 #x0f330f78222d3c0f
55
                                      #xbc76bc89af13cabc #xa937a921d1789ea9
56
                                      #x474647028fc80147 #x415841329bda1941
57
                                      #x34e434bdb88cd034 #x4875487aade53d48
58
                                      #xfc2bfcb332ced7fc #xb751b7d19522e6b7
59
                                      #x6adf6a77610bb56a #x88928834179f1a88
60
                                      #xa50ba541f95caea5 #x530253a2f7a45153
61
                                      #x86a4864433b52286 #xf93af99b2cd5c3f9
62
                                      #x5b2a5be2c79c715b #xdb90db96e03b4bdb
63
                                      #x38d838dd90a8e038 #x7b8a7bff077cf17b
64
                                      #xc3e8c356b0732bc3 #x1e661ef0445a781e
65
                                      #x22aa220dccee8822 #x33ff3385aa99cc33
66
                                      #x24b4243dd8fc9024 #x2888285df0d8a028
67
                                      #x36ee36adb482d836 #xc7fcc776a86f3bc7
68
                                      #xb240b2f98b39f2b2 #x3bd73bc59aa1ec3b
69
                                      #x8e8c8e04038d028e #x77b6779f2f58c177
70
                                      #xba68bab9bb01d2ba #xf506f5fb04f1f3f5
71
                                      #x144414a0786c5014 #x9fd99f8c65fa469f
72
                                      #x0828084030382008 #x551c5592e3b64955
73
                                      #x9bcd9bac7de6569b #x4c614c5ab5f92d4c
74
                                      #xfe21fea33ec0dffe #x60fd60275d3d9d60
75
                                      #x5c315cdad5896d5c #xda95da9ee63c4fda
76
                                      #x187818c050486018 #x4643460a89cf0546
77
                                      #xcddecd26945913cd #x7d947dcf136ee97d
78
                                      #x21a52115c6e78421 #xb04ab0e98737fab0
79
                                      #x3fc33fe582bdfc3f #x1b771bd85a416c1b
80
                                      #x8997893c11981e89 #xff24ffab38c7dbff
81
                                      #xeb60eb0b40ab8beb #x84ae84543fbb2a84
82
                                      #x69d0696f6b02b969 #x3ad23acd9ca6e83a
83
                                      #x9dd39d9c69f44e9d #xd7acd7f6c81f7bd7
84
                                      #xd3b8d3d6d0036bd3 #x70ad70a73d4ddd70
85
                                      #x67e6671f4f288167 #x405d403a9ddd1d40
86
                                      #xb55bb5c1992ceeb5 #xde81debefe205fde
87
                                      #x5d345dd2d38e695d #x30f0309da090c030
88
                                      #x91ef91fc41d07e91 #xb14fb1e18130feb1
89
                                      #x788578e70d75fd78 #x1155118866774411
90
                                      #x0105010806070401 #xe556e57b6481b3e5
91
                                      #x0000000000000000 #x68d568676d05bd68
92
                                      #x98c298b477ef5a98 #xa01aa069e747baa0
93
                                      #xc5f6c566a46133c5 #x020a02100c0e0802
94
                                      #xa604a659f355a2a6 #x74b974872551cd74
95
                                      #x2d992d75eec3b42d #x0b270b583a312c0b
96
                                      #xa210a279eb49b2a2 #x76b37697295fc576
97
                                      #xb345b3f18d3ef6b3 #xbe7cbe99a31dc2be
98
                                      #xced1ce3e9e501fce #xbd73bd81a914cebd
99
                                      #xae2cae19c36d82ae #xe96ae91b4ca583e9
100
                                      #x8a988a241b91128a #x31f53195a697c431
101
                                      #x1c6c1ce04854701c #xec7bec3352be97ec
102
                                      #xf112f1db1cede3f1 #x99c799bc71e85e99
103
                                      #x94fe94d45fcb6a94 #xaa38aa39db7192aa
104
                                      #xf609f6e30ef8fff6 #x26be262dd4f29826
105
                                      #x2f932f65e2cdbc2f #xef74ef2b58b79bef
106
                                      #xe86fe8134aa287e8 #x8c868c140f830a8c
107
                                      #x35e135b5be8bd435 #x030f03180a090c03
108
                                      #xd4a3d4eec21677d4 #x7f9e7fdf1f60e17f
109
                                      #xfb30fb8b20dbcbfb #x051105281e1b1405
110
                                      #xc1e2c146bc7d23c1 #x5e3b5ecad987655e
111
                                      #x90ea90f447d77a90 #x20a0201dc0e08020
112
                                      #x3dc93df58eb3f43d #x82b082642ba93282
113
                                      #xf70cf7eb08fffbf7 #xea65ea0346ac8fea
114
                                      #x0a220a503c36280a #x0d390d682e23340d
115
                                      #x7e9b7ed71967e57e #xf83ff8932ad2c7f8
116
                                      #x500d50bafdad5d50 #x1a721ad05c46681a
117
                                      #xc4f3c46ea26637c4 #x071b073812151c07
118
                                      #x57165782efb84157 #xb862b8a9b70fdab8
119
                                      #x3ccc3cfd88b4f03c #x62f7623751339562
120
                                      #xe348e34b7093abe3 #xc8cfc80e8a4207c8
121
                                      #xac26ac09cf638aac #x520752aaf1a35552
122
                                      #x64e9640745218d64 #x1050108060704010
123
                                      #xd0b7d0ceda0a67d0 #xd99ad986ec3543d9
124
                                      #x135f13986a794c13 #x0c3c0c602824300c
125
                                      #x125a12906c7e4812 #x298d2955f6dfa429
126
                                      #x510851b2fbaa5951 #xb967b9a1b108deb9
127
                                      #xcfd4cf3698571bcf #xd6a9d6fece187fd6
128
                                      #x73a273bf3744d173 #x8d838d1c09840e8d
129
                                      #x81bf817c21a03e81 #x5419549ae5b14d54
130
                                      #xc0e7c04eba7a27c0 #xed7eed3b54b993ed
131
                                      #x4e6b4e4ab9f7254e #x4449441a85c10d44
132
                                      #xa701a751f552a6a7 #x2a822a4dfcd6a82a
133
                                      #x85ab855c39bc2e85 #x25b12535defb9425
134
                                      #xe659e6636e88bfe6 #xcac5ca1e864c0fca
135
                                      #x7c917cc71569ed7c #x8b9d8b2c1d96168b
136
                                      #x5613568ae9bf4556 #x80ba807427a73a80)
137
                                     (#xd1ce3e9e501fcece #x6dbbb1bd06d6bbbb
138
                                      #x60eb0b40ab8bebeb #xe092e44bd9729292
139
                                      #x65ea0346ac8feaea #xc0cb16804b0bcbcb
140
                                      #x5f13986a794c1313 #xe2c146bc7d23c1c1
141
                                      #x6ae91b4ca583e9e9 #xd23acd9ca6e83a3a
142
                                      #xa9d6fece187fd6d6 #x40b2f98b39f2b2b2
143
                                      #xbdd2ded6046fd2d2 #xea90f447d77a9090
144
                                      #x4b17b872655c1717 #x3ff8932ad2c7f8f8
145
                                      #x57422a91d3154242 #x4115a87e6b541515
146
                                      #x13568ae9bf455656 #x5eb4c99f2beab4b4
147
                                      #xec650f4326896565 #x6c1ce04854701c1c
148
                                      #x928834179f1a8888 #x52432297d4114343
149
                                      #xf6c566a46133c5c5 #x315cdad5896d5c5c
150
                                      #xee36adb482d83636 #x68bab9bb01d2baba
151
                                      #x06f5fb04f1f3f5f5 #x165782efb8415757
152
                                      #xe6671f4f28816767 #x838d1c09840e8d8d
153
                                      #xf53195a697c43131 #x09f6e30ef8fff6f6
154
                                      #xe9640745218d6464 #x2558facd957d5858
155
                                      #xdc9e8463fd429e9e #x03f4f302f6f7f4f4
156
                                      #xaa220dccee882222 #x38aa39db7192aaaa
157
                                      #xbc758f2356c97575 #x330f78222d3c0f0f
158
                                      #x0a02100c0e080202 #x4fb1e18130feb1b1
159
                                      #x84dfb6f8275bdfdf #xc46d4f731ea96d6d
160
                                      #xa273bf3744d17373 #x644d52b3fe294d4d
161
                                      #x917cc71569ed7c7c #xbe262dd4f2982626
162
                                      #x962e6de4cab82e2e #x0cf7eb08fffbf7f7
163
                                      #x2808403038200808 #x345dd2d38e695d5d
164
                                      #x49441a85c10d4444 #xc63eed84baf83e3e
165
                                      #xd99f8c65fa469f9f #x4414a0786c501414
166
                                      #xcfc80e8a4207c8c8 #x2cae19c36d82aeae
167
                                      #x19549ae5b14d5454 #x5010806070401010
168
                                      #x9fd88eea3247d8d8 #x76bc89af13cabcbc
169
                                      #x721ad05c46681a1a #xda6b7f670cb16b6b
170
                                      #xd0696f6b02b96969 #x18f3cb10e3ebf3f3
171
                                      #x73bd81a914cebdbd #xff3385aa99cc3333
172
                                      #x3dab31dd7696abab #x35fa8326dccffafa
173
                                      #xb2d1c6dc0d63d1d1 #xcd9bac7de6569b9b
174
                                      #xd568676d05bd6868 #x6b4e4ab9f7254e4e
175
                                      #x4e16b07462581616 #xfb95dc59cc6e9595
176
                                      #xef91fc41d07e9191 #x71ee235eb09feeee
177
                                      #x614c5ab5f92d4c4c #xf2633f5734916363
178
                                      #x8c8e04038d028e8e #x2a5be2c79c715b5b
179
                                      #xdbcc2e925e17cccc #xcc3cfd88b4f03c3c
180
                                      #x7d19c8564f641919 #x1fa161e140bea1a1
181
                                      #xbf817c21a03e8181 #x704972abe2394949
182
                                      #x8a7bff077cf17b7b #x9ad986ec3543d9d9
183
                                      #xce6f5f7f10a16f6f #xeb37a5b285dc3737
184
                                      #xfd60275d3d9d6060 #xc5ca1e864c0fcaca
185
                                      #x5ce76b688fbbe7e7 #x872b45fad1ac2b2b
186
                                      #x75487aade53d4848 #x2efdbb34c9d3fdfd
187
                                      #xf496c453c5629696 #x4c451283c6094545
188
                                      #x2bfcb332ced7fcfc #x5841329bda194141
189
                                      #x5a12906c7e481212 #x390d682e23340d0d
190
                                      #x8079ef0b72f97979 #x56e57b6481b3e5e5
191
                                      #x97893c11981e8989 #x868c140f830a8c8c
192
                                      #x48e34b7093abe3e3 #xa0201dc0e0802020
193
                                      #xf0309da090c03030 #x8bdcaef22e57dcdc
194
                                      #x51b7d19522e6b7b7 #xc16c477519ad6c6c
195
                                      #x7f4a6aa1eb354a4a #x5bb5c1992ceeb5b5
196
                                      #xc33fe582bdfc3f3f #xf197cc55c2669797
197
                                      #xa3d4eec21677d4d4 #xf762375133956262
198
                                      #x992d75eec3b42d2d #x1e06301412180606
199
                                      #x0ea449ff5baaa4a4 #x0ba541f95caea5a5
200
                                      #xb5836c2dae368383 #x3e5fc2df80615f5f
201
                                      #x822a4dfcd6a82a2a #x95da9ee63c4fdada
202
                                      #xcac9068c4503c9c9 #x0000000000000000
203
                                      #x9b7ed71967e57e7e #x10a279eb49b2a2a2
204
                                      #x1c5592e3b6495555 #x79bf91a51ac6bfbf
205
                                      #x5511886677441111 #xa6d5e6c41173d5d5
206
                                      #xd69c946ff34a9c9c #xd4cf3698571bcfcf
207
                                      #x360e70242a380e0e #x220a503c36280a0a
208
                                      #xc93df58eb3f43d3d #x0851b2fbaa595151
209
                                      #x947dcf136ee97d7d #xe593ec4dde769393
210
                                      #x771bd85a416c1b1b #x21fea33ec0dffefe
211
                                      #xf3c46ea26637c4c4 #x4647028fc8014747
212
                                      #x2d0948363f240909 #xa4864433b5228686
213
                                      #x270b583a312c0b0b #x898f0c058a068f8f
214
                                      #xd39d9c69f44e9d9d #xdf6a77610bb56a6a
215
                                      #x1b073812151c0707 #x67b9a1b108deb9b9
216
                                      #x4ab0e98737fab0b0 #xc298b477ef5a9898
217
                                      #x7818c05048601818 #xfa328dac9ec83232
218
                                      #xa871af3b4ad97171 #x7a4b62a7ec314b4b
219
                                      #x74ef2b58b79befef #xd73bc59aa1ec3b3b
220
                                      #xad70a73d4ddd7070 #x1aa069e747baa0a0
221
                                      #x53e4736286b7e4e4 #x5d403a9ddd1d4040
222
                                      #x24ffab38c7dbffff #xe8c356b0732bc3c3
223
                                      #x37a921d1789ea9a9 #x59e6636e88bfe6e6
224
                                      #x8578e70d75fd7878 #x3af99b2cd5c3f9f9
225
                                      #x9d8b2c1d96168b8b #x43460a89cf054646
226
                                      #xba807427a73a8080 #x661ef0445a781e1e
227
                                      #xd838dd90a8e03838 #x42e15b7c9da3e1e1
228
                                      #x62b8a9b70fdab8b8 #x32a829d77f9aa8a8
229
                                      #x47e0537a9aa7e0e0 #x3c0c602824300c0c
230
                                      #xaf2305cae98c2323 #xb37697295fc57676
231
                                      #x691de84e53741d1d #xb12535defb942525
232
                                      #xb4243dd8fc902424 #x1105281e1b140505
233
                                      #x12f1db1cede3f1f1 #xcb6e577917a56e6e
234
                                      #xfe94d45fcb6a9494 #x88285df0d8a02828
235
                                      #xc89aa47be1529a9a #xae84543fbb2a8484
236
                                      #x6fe8134aa287e8e8 #x15a371ed4eb6a3a3
237
                                      #x6e4f42bff0214f4f #xb6779f2f58c17777
238
                                      #xb8d3d6d0036bd3d3 #xab855c39bc2e8585
239
                                      #x4de2437694afe2e2 #x0752aaf1a3555252
240
                                      #x1df2c316e4eff2f2 #xb082642ba9328282
241
                                      #x0d50bafdad5d5050 #x8f7af7017bf57a7a
242
                                      #x932f65e2cdbc2f2f #xb974872551cd7474
243
                                      #x0253a2f7a4515353 #x45b3f18d3ef6b3b3
244
                                      #xf8612f5b3a996161 #x29af11c56a86afaf
245
                                      #xdd39d596afe43939 #xe135b5be8bd43535
246
                                      #x81debefe205fdede #xdecd26945913cdcd
247
                                      #x631ff8425d7c1f1f #xc799bc71e85e9999
248
                                      #x26ac09cf638aacac #x23ad01c9648eadad
249
                                      #xa772b73143d57272 #x9c2c7de8c4b02c2c
250
                                      #x8edda6f42953dddd #xb7d0ceda0a67d0d0
251
                                      #xa1874c35b2268787 #x7cbe99a31dc2bebe
252
                                      #x3b5ecad987655e5e #x04a659f355a2a6a6
253
                                      #x7bec3352be97ecec #x140420181c100404
254
                                      #xf9c67eae683fc6c6 #x0f03180a090c0303
255
                                      #xe434bdb88cd03434 #x30fb8b20dbcbfbfb
256
                                      #x90db96e03b4bdbdb #x2059f2cb92795959
257
                                      #x54b6d99325e2b6b6 #xedc25eb6742fc2c2
258
                                      #x0501080607040101 #x17f0d31aeae7f0f0
259
                                      #x2f5aeac19b755a5a #x7eed3b54b993eded
260
                                      #x01a751f552a6a7a7 #xe36617492f856666
261
                                      #xa52115c6e7842121 #x9e7fdf1f60e17f7f
262
                                      #x988a241b91128a8a #xbb2725d2f59c2727
263
                                      #xfcc776a86f3bc7c7 #xe7c04eba7a27c0c0
264
                                      #x8d2955f6dfa42929 #xacd7f6c81f7bd7d7)
265
                                     (#x93ec4dde769393e5 #xd986ec3543d9d99a
266
                                      #x9aa47be1529a9ac8 #xb5c1992ceeb5b55b
267
                                      #x98b477ef5a9898c2 #x220dccee882222aa
268
                                      #x451283c60945454c #xfcb332ced7fcfc2b
269
                                      #xbab9bb01d2baba68 #x6a77610bb56a6adf
270
                                      #xdfb6f8275bdfdf84 #x02100c0e0802020a
271
                                      #x9f8c65fa469f9fd9 #xdcaef22e57dcdc8b
272
                                      #x51b2fbaa59515108 #x59f2cb9279595920
273
                                      #x4a6aa1eb354a4a7f #x17b872655c17174b
274
                                      #x2b45fad1ac2b2b87 #xc25eb6742fc2c2ed
275
                                      #x94d45fcb6a9494fe #xf4f302f6f7f4f403
276
                                      #xbbb1bd06d6bbbb6d #xa371ed4eb6a3a315
277
                                      #x62375133956262f7 #xe4736286b7e4e453
278
                                      #x71af3b4ad97171a8 #xd4eec21677d4d4a3
279
                                      #xcd26945913cdcdde #x70a73d4ddd7070ad
280
                                      #x16b074625816164e #xe15b7c9da3e1e142
281
                                      #x4972abe239494970 #x3cfd88b4f03c3ccc
282
                                      #xc04eba7a27c0c0e7 #xd88eea3247d8d89f
283
                                      #x5cdad5896d5c5c31 #x9bac7de6569b9bcd
284
                                      #xad01c9648eadad23 #x855c39bc2e8585ab
285
                                      #x53a2f7a451535302 #xa161e140bea1a11f
286
                                      #x7af7017bf57a7a8f #xc80e8a4207c8c8cf
287
                                      #x2d75eec3b42d2d99 #xe0537a9aa7e0e047
288
                                      #xd1c6dc0d63d1d1b2 #x72b73143d57272a7
289
                                      #xa659f355a2a6a604 #x2c7de8c4b02c2c9c
290
                                      #xc46ea26637c4c4f3 #xe34b7093abe3e348
291
                                      #x7697295fc57676b3 #x78e70d75fd787885
292
                                      #xb7d19522e6b7b751 #xb4c99f2beab4b45e
293
                                      #x0948363f2409092d #x3bc59aa1ec3b3bd7
294
                                      #x0e70242a380e0e36 #x41329bda19414158
295
                                      #x4c5ab5f92d4c4c61 #xdebefe205fdede81
296
                                      #xb2f98b39f2b2b240 #x90f447d77a9090ea
297
                                      #x2535defb942525b1 #xa541f95caea5a50b
298
                                      #xd7f6c81f7bd7d7ac #x03180a090c03030f
299
                                      #x1188667744111155 #x0000000000000000
300
                                      #xc356b0732bc3c3e8 #x2e6de4cab82e2e96
301
                                      #x92e44bd9729292e0 #xef2b58b79befef74
302
                                      #x4e4ab9f7254e4e6b #x12906c7e4812125a
303
                                      #x9d9c69f44e9d9dd3 #x7dcf136ee97d7d94
304
                                      #xcb16804b0bcbcbc0 #x35b5be8bd43535e1
305
                                      #x1080607040101050 #xd5e6c41173d5d5a6
306
                                      #x4f42bff0214f4f6e #x9e8463fd429e9edc
307
                                      #x4d52b3fe294d4d64 #xa921d1789ea9a937
308
                                      #x5592e3b64955551c #xc67eae683fc6c6f9
309
                                      #xd0ceda0a67d0d0b7 #x7bff077cf17b7b8a
310
                                      #x18c0504860181878 #x97cc55c2669797f1
311
                                      #xd3d6d0036bd3d3b8 #x36adb482d83636ee
312
                                      #xe6636e88bfe6e659 #x487aade53d484875
313
                                      #x568ae9bf45565613 #x817c21a03e8181bf
314
                                      #x8f0c058a068f8f89 #x779f2f58c17777b6
315
                                      #xcc2e925e17ccccdb #x9c946ff34a9c9cd6
316
                                      #xb9a1b108deb9b967 #xe2437694afe2e24d
317
                                      #xac09cf638aacac26 #xb8a9b70fdab8b862
318
                                      #x2f65e2cdbc2f2f93 #x15a87e6b54151541
319
                                      #xa449ff5baaa4a40e #x7cc71569ed7c7c91
320
                                      #xda9ee63c4fdada95 #x38dd90a8e03838d8
321
                                      #x1ef0445a781e1e66 #x0b583a312c0b0b27
322
                                      #x05281e1b14050511 #xd6fece187fd6d6a9
323
                                      #x14a0786c50141444 #x6e577917a56e6ecb
324
                                      #x6c477519ad6c6cc1 #x7ed71967e57e7e9b
325
                                      #x6617492f856666e3 #xfdbb34c9d3fdfd2e
326
                                      #xb1e18130feb1b14f #xe57b6481b3e5e556
327
                                      #x60275d3d9d6060fd #xaf11c56a86afaf29
328
                                      #x5ecad987655e5e3b #x3385aa99cc3333ff
329
                                      #x874c35b2268787a1 #xc9068c4503c9c9ca
330
                                      #xf0d31aeae7f0f017 #x5dd2d38e695d5d34
331
                                      #x6d4f731ea96d6dc4 #x3fe582bdfc3f3fc3
332
                                      #x8834179f1a888892 #x8d1c09840e8d8d83
333
                                      #xc776a86f3bc7c7fc #xf7eb08fffbf7f70c
334
                                      #x1de84e53741d1d69 #xe91b4ca583e9e96a
335
                                      #xec3352be97ecec7b #xed3b54b993eded7e
336
                                      #x807427a73a8080ba #x2955f6dfa429298d
337
                                      #x2725d2f59c2727bb #xcf3698571bcfcfd4
338
                                      #x99bc71e85e9999c7 #xa829d77f9aa8a832
339
                                      #x50bafdad5d50500d #x0f78222d3c0f0f33
340
                                      #x37a5b285dc3737eb #x243dd8fc902424b4
341
                                      #x285df0d8a0282888 #x309da090c03030f0
342
                                      #x95dc59cc6e9595fb #xd2ded6046fd2d2bd
343
                                      #x3eed84baf83e3ec6 #x5be2c79c715b5b2a
344
                                      #x403a9ddd1d40405d #x836c2dae368383b5
345
                                      #xb3f18d3ef6b3b345 #x696f6b02b96969d0
346
                                      #x5782efb841575716 #x1ff8425d7c1f1f63
347
                                      #x073812151c07071b #x1ce04854701c1c6c
348
                                      #x8a241b91128a8a98 #xbc89af13cabcbc76
349
                                      #x201dc0e0802020a0 #xeb0b40ab8bebeb60
350
                                      #xce3e9e501fceced1 #x8e04038d028e8e8c
351
                                      #xab31dd7696abab3d #xee235eb09feeee71
352
                                      #x3195a697c43131f5 #xa279eb49b2a2a210
353
                                      #x73bf3744d17373a2 #xf99b2cd5c3f9f93a
354
                                      #xca1e864c0fcacac5 #x3acd9ca6e83a3ad2
355
                                      #x1ad05c46681a1a72 #xfb8b20dbcbfbfb30
356
                                      #x0d682e23340d0d39 #xc146bc7d23c1c1e2
357
                                      #xfea33ec0dffefe21 #xfa8326dccffafa35
358
                                      #xf2c316e4eff2f21d #x6f5f7f10a16f6fce
359
                                      #xbd81a914cebdbd73 #x96c453c5629696f4
360
                                      #xdda6f42953dddd8e #x432297d411434352
361
                                      #x52aaf1a355525207 #xb6d99325e2b6b654
362
                                      #x0840303820080828 #xf3cb10e3ebf3f318
363
                                      #xae19c36d82aeae2c #xbe99a31dc2bebe7c
364
                                      #x19c8564f6419197d #x893c11981e898997
365
                                      #x328dac9ec83232fa #x262dd4f2982626be
366
                                      #xb0e98737fab0b04a #xea0346ac8feaea65
367
                                      #x4b62a7ec314b4b7a #x640745218d6464e9
368
                                      #x84543fbb2a8484ae #x82642ba9328282b0
369
                                      #x6b7f670cb16b6bda #xf5fb04f1f3f5f506
370
                                      #x79ef0b72f9797980 #xbf91a51ac6bfbf79
371
                                      #x0108060704010105 #x5fc2df80615f5f3e
372
                                      #x758f2356c97575bc #x633f5734916363f2
373
                                      #x1bd85a416c1b1b77 #x2305cae98c2323af
374
                                      #x3df58eb3f43d3dc9 #x68676d05bd6868d5
375
                                      #x2a4dfcd6a82a2a82 #x650f4326896565ec
376
                                      #xe8134aa287e8e86f #x91fc41d07e9191ef
377
                                      #xf6e30ef8fff6f609 #xffab38c7dbffff24
378
                                      #x13986a794c13135f #x58facd957d585825
379
                                      #xf1db1cede3f1f112 #x47028fc801474746
380
                                      #x0a503c36280a0a22 #x7fdf1f60e17f7f9e
381
                                      #xc566a46133c5c5f6 #xa751f552a6a7a701
382
                                      #xe76b688fbbe7e75c #x612f5b3a996161f8
383
                                      #x5aeac19b755a5a2f #x063014121806061e
384
                                      #x460a89cf05464643 #x441a85c10d444449
385
                                      #x422a91d315424257 #x0420181c10040414
386
                                      #xa069e747baa0a01a #xdb96e03b4bdbdb90
387
                                      #x39d596afe43939dd #x864433b5228686a4
388
                                      #x549ae5b14d545419 #xaa39db7192aaaa38
389
                                      #x8c140f830a8c8c86 #x34bdb88cd03434e4
390
                                      #x2115c6e7842121a5 #x8b2c1d96168b8b9d
391
                                      #xf8932ad2c7f8f83f #x0c602824300c0c3c
392
                                      #x74872551cd7474b9 #x671f4f28816767e6)
393
                                     (#x676d05bd6868d568 #x1c09840e8d8d838d
394
                                      #x1e864c0fcacac5ca #x52b3fe294d4d644d
395
                                      #xbf3744d17373a273 #x62a7ec314b4b7a4b
396
                                      #x4ab9f7254e4e6b4e #x4dfcd6a82a2a822a
397
                                      #xeec21677d4d4a3d4 #xaaf1a35552520752
398
                                      #x2dd4f2982626be26 #xf18d3ef6b3b345b3
399
                                      #x9ae5b14d54541954 #xf0445a781e1e661e
400
                                      #xc8564f6419197d19 #xf8425d7c1f1f631f
401
                                      #x0dccee882222aa22 #x180a090c03030f03
402
                                      #x0a89cf0546464346 #xf58eb3f43d3dc93d
403
                                      #x75eec3b42d2d992d #x6aa1eb354a4a7f4a
404
                                      #xa2f7a45153530253 #x6c2dae368383b583
405
                                      #x986a794c13135f13 #x241b91128a8a988a
406
                                      #xd19522e6b7b751b7 #xe6c41173d5d5a6d5
407
                                      #x35defb942525b125 #xef0b72f979798079
408
                                      #xfb04f1f3f5f506f5 #x81a914cebdbd73bd
409
                                      #xfacd957d58582558 #x65e2cdbc2f2f932f
410
                                      #x682e23340d0d390d #x100c0e0802020a02
411
                                      #x3b54b993eded7eed #xb2fbaa5951510851
412
                                      #x8463fd429e9edc9e #x8866774411115511
413
                                      #xc316e4eff2f21df2 #xed84baf83e3ec63e
414
                                      #x92e3b64955551c55 #xcad987655e5e3b5e
415
                                      #xc6dc0d63d1d1b2d1 #xb074625816164e16
416
                                      #xfd88b4f03c3ccc3c #x17492f856666e366
417
                                      #xa73d4ddd7070ad70 #xd2d38e695d5d345d
418
                                      #xcb10e3ebf3f318f3 #x1283c60945454c45
419
                                      #x3a9ddd1d40405d40 #x2e925e17ccccdbcc
420
                                      #x134aa287e8e86fe8 #xd45fcb6a9494fe94
421
                                      #x8ae9bf4556561356 #x4030382008082808
422
                                      #x3e9e501fceced1ce #xd05c46681a1a721a
423
                                      #xcd9ca6e83a3ad23a #xded6046fd2d2bdd2
424
                                      #x5b7c9da3e1e142e1 #xb6f8275bdfdf84df
425
                                      #xc1992ceeb5b55bb5 #xdd90a8e03838d838
426
                                      #x577917a56e6ecb6e #x70242a380e0e360e
427
                                      #x7b6481b3e5e556e5 #xf302f6f7f4f403f4
428
                                      #x9b2cd5c3f9f93af9 #x4433b5228686a486
429
                                      #x1b4ca583e9e96ae9 #x42bff0214f4f6e4f
430
                                      #xfece187fd6d6a9d6 #x5c39bc2e8585ab85
431
                                      #x05cae98c2323af23 #x3698571bcfcfd4cf
432
                                      #x8dac9ec83232fa32 #xbc71e85e9999c799
433
                                      #x95a697c43131f531 #xa0786c5014144414
434
                                      #x19c36d82aeae2cae #x235eb09feeee71ee
435
                                      #x0e8a4207c8c8cfc8 #x7aade53d48487548
436
                                      #xd6d0036bd3d3b8d3 #x9da090c03030f030
437
                                      #x61e140bea1a11fa1 #xe44bd9729292e092
438
                                      #x329bda1941415841 #xe18130feb1b14fb1
439
                                      #xc050486018187818 #x6ea26637c4c4f3c4
440
                                      #x7de8c4b02c2c9c2c #xaf3b4ad97171a871
441
                                      #xb73143d57272a772 #x1a85c10d44444944
442
                                      #xa87e6b5415154115 #xbb34c9d3fdfd2efd
443
                                      #xa5b285dc3737eb37 #x99a31dc2bebe7cbe
444
                                      #xc2df80615f5f3e5f #x39db7192aaaa38aa
445
                                      #xac7de6569b9bcd9b #x34179f1a88889288
446
                                      #x8eea3247d8d89fd8 #x31dd7696abab3dab
447
                                      #x3c11981e89899789 #x946ff34a9c9cd69c
448
                                      #x8326dccffafa35fa #x275d3d9d6060fd60
449
                                      #x0346ac8feaea65ea #x89af13cabcbc76bc
450
                                      #x375133956262f762 #x602824300c0c3c0c
451
                                      #x3dd8fc902424b424 #x59f355a2a6a604a6
452
                                      #x29d77f9aa8a832a8 #x3352be97ecec7bec
453
                                      #x1f4f28816767e667 #x1dc0e0802020a020
454
                                      #x96e03b4bdbdb90db #xc71569ed7c7c917c
455
                                      #x5df0d8a028288828 #xa6f42953dddd8edd
456
                                      #x09cf638aacac26ac #xe2c79c715b5b2a5b
457
                                      #xbdb88cd03434e434 #xd71967e57e7e9b7e
458
                                      #x8060704010105010 #xdb1cede3f1f112f1
459
                                      #xff077cf17b7b8a7b #x0c058a068f8f898f
460
                                      #x3f5734916363f263 #x69e747baa0a01aa0
461
                                      #x281e1b1405051105 #xa47be1529a9ac89a
462
                                      #x2297d41143435243 #x9f2f58c17777b677
463
                                      #x15c6e7842121a521 #x91a51ac6bfbf79bf
464
                                      #x25d2f59c2727bb27 #x48363f2409092d09
465
                                      #x56b0732bc3c3e8c3 #x8c65fa469f9fd99f
466
                                      #xd99325e2b6b654b6 #xf6c81f7bd7d7acd7
467
                                      #x55f6dfa429298d29 #x5eb6742fc2c2edc2
468
                                      #x0b40ab8bebeb60eb #x4eba7a27c0c0e7c0
469
                                      #x49ff5baaa4a40ea4 #x2c1d96168b8b9d8b
470
                                      #x140f830a8c8c868c #xe84e53741d1d691d
471
                                      #x8b20dbcbfbfb30fb #xab38c7dbffff24ff
472
                                      #x46bc7d23c1c1e2c1 #xf98b39f2b2b240b2
473
                                      #xcc55c2669797f197 #x6de4cab82e2e962e
474
                                      #x932ad2c7f8f83ff8 #x0f4326896565ec65
475
                                      #xe30ef8fff6f609f6 #x8f2356c97575bc75
476
                                      #x3812151c07071b07 #x20181c1004041404
477
                                      #x72abe23949497049 #x85aa99cc3333ff33
478
                                      #x736286b7e4e453e4 #x86ec3543d9d99ad9
479
                                      #xa1b108deb9b967b9 #xceda0a67d0d0b7d0
480
                                      #x2a91d31542425742 #x76a86f3bc7c7fcc7
481
                                      #x477519ad6c6cc16c #xf447d77a9090ea90
482
                                      #x0000000000000000 #x04038d028e8e8c8e
483
                                      #x5f7f10a16f6fce6f #xbafdad5d50500d50
484
                                      #x0806070401010501 #x66a46133c5c5f6c5
485
                                      #x9ee63c4fdada95da #x028fc80147474647
486
                                      #xe582bdfc3f3fc33f #x26945913cdcddecd
487
                                      #x6f6b02b96969d069 #x79eb49b2a2a210a2
488
                                      #x437694afe2e24de2 #xf7017bf57a7a8f7a
489
                                      #x51f552a6a7a701a7 #x7eae683fc6c6f9c6
490
                                      #xec4dde769393e593 #x78222d3c0f0f330f
491
                                      #x503c36280a0a220a #x3014121806061e06
492
                                      #x636e88bfe6e659e6 #x45fad1ac2b2b872b
493
                                      #xc453c5629696f496 #x71ed4eb6a3a315a3
494
                                      #xe04854701c1c6c1c #x11c56a86afaf29af
495
                                      #x77610bb56a6adf6a #x906c7e4812125a12
496
                                      #x543fbb2a8484ae84 #xd596afe43939dd39
497
                                      #x6b688fbbe7e75ce7 #xe98737fab0b04ab0
498
                                      #x642ba9328282b082 #xeb08fffbf7f70cf7
499
                                      #xa33ec0dffefe21fe #x9c69f44e9d9dd39d
500
                                      #x4c35b2268787a187 #xdad5896d5c5c315c
501
                                      #x7c21a03e8181bf81 #xb5be8bd43535e135
502
                                      #xbefe205fdede81de #xc99f2beab4b45eb4
503
                                      #x41f95caea5a50ba5 #xb332ced7fcfc2bfc
504
                                      #x7427a73a8080ba80 #x2b58b79befef74ef
505
                                      #x16804b0bcbcbc0cb #xb1bd06d6bbbb6dbb
506
                                      #x7f670cb16b6bda6b #x97295fc57676b376
507
                                      #xb9bb01d2baba68ba #xeac19b755a5a2f5a
508
                                      #xcf136ee97d7d947d #xe70d75fd78788578
509
                                      #x583a312c0b0b270b #xdc59cc6e9595fb95
510
                                      #x4b7093abe3e348e3 #x01c9648eadad23ad
511
                                      #x872551cd7474b974 #xb477ef5a9898c298
512
                                      #xc59aa1ec3b3bd73b #xadb482d83636ee36
513
                                      #x0745218d6464e964 #x4f731ea96d6dc46d
514
                                      #xaef22e57dcdc8bdc #xd31aeae7f0f017f0
515
                                      #xf2cb927959592059 #x21d1789ea9a937a9
516
                                      #x5ab5f92d4c4c614c #xb872655c17174b17
517
                                      #xdf1f60e17f7f9e7f #xfc41d07e9191ef91
518
                                      #xa9b70fdab8b862b8 #x068c4503c9c9cac9
519
                                      #x82efb84157571657 #xd85a416c1b1b771b
520
                                      #x537a9aa7e0e047e0 #x2f5b3a996161f861)
521
                                     (#xd77f9aa8a832a829 #x97d4114343524322
522
                                      #xdf80615f5f3e5fc2 #x14121806061e0630
523
                                      #x670cb16b6bda6b7f #x2356c97575bc758f
524
                                      #x7519ad6c6cc16c47 #xcb927959592059f2
525
                                      #x3b4ad97171a871af #xf8275bdfdf84dfb6
526
                                      #x35b2268787a1874c #x59cc6e9595fb95dc
527
                                      #x72655c17174b17b8 #x1aeae7f0f017f0d3
528
                                      #xea3247d8d89fd88e #x363f2409092d0948
529
                                      #x731ea96d6dc46d4f #x10e3ebf3f318f3cb
530
                                      #x4e53741d1d691de8 #x804b0bcbcbc0cb16
531
                                      #x8c4503c9c9cac906 #xb3fe294d4d644d52
532
                                      #xe8c4b02c2c9c2c7d #xc56a86afaf29af11
533
                                      #x0b72f979798079ef #x7a9aa7e0e047e053
534
                                      #x55c2669797f197cc #x34c9d3fdfd2efdbb
535
                                      #x7f10a16f6fce6f5f #xa7ec314b4b7a4b62
536
                                      #x83c60945454c4512 #x96afe43939dd39d5
537
                                      #x84baf83e3ec63eed #xf42953dddd8edda6
538
                                      #xed4eb6a3a315a371 #xbff0214f4f6e4f42
539
                                      #x9f2beab4b45eb4c9 #x9325e2b6b654b6d9
540
                                      #x7be1529a9ac89aa4 #x242a380e0e360e70
541
                                      #x425d7c1f1f631ff8 #xa51ac6bfbf79bf91
542
                                      #x7e6b5415154115a8 #x7c9da3e1e142e15b
543
                                      #xabe2394949704972 #xd6046fd2d2bdd2de
544
                                      #x4dde769393e593ec #xae683fc6c6f9c67e
545
                                      #x4bd9729292e092e4 #x3143d57272a772b7
546
                                      #x63fd429e9edc9e84 #x5b3a996161f8612f
547
                                      #xdc0d63d1d1b2d1c6 #x5734916363f2633f
548
                                      #x26dccffafa35fa83 #x5eb09feeee71ee23
549
                                      #x02f6f7f4f403f4f3 #x564f6419197d19c8
550
                                      #xc41173d5d5a6d5e6 #xc9648eadad23ad01
551
                                      #xcd957d58582558fa #xff5baaa4a40ea449
552
                                      #xbd06d6bbbb6dbbb1 #xe140bea1a11fa161
553
                                      #xf22e57dcdc8bdcae #x16e4eff2f21df2c3
554
                                      #x2dae368383b5836c #xb285dc3737eb37a5
555
                                      #x91d315424257422a #x6286b7e4e453e473
556
                                      #x017bf57a7a8f7af7 #xac9ec83232fa328d
557
                                      #x6ff34a9c9cd69c94 #x925e17ccccdbcc2e
558
                                      #xdd7696abab3dab31 #xa1eb354a4a7f4a6a
559
                                      #x058a068f8f898f0c #x7917a56e6ecb6e57
560
                                      #x181c100404140420 #xd2f59c2727bb2725
561
                                      #xe4cab82e2e962e6d #x688fbbe7e75ce76b
562
                                      #x7694afe2e24de243 #xc19b755a5a2f5aea
563
                                      #x53c5629696f496c4 #x74625816164e16b0
564
                                      #xcae98c2323af2305 #xfad1ac2b2b872b45
565
                                      #xb6742fc2c2edc25e #x4326896565ec650f
566
                                      #x492f856666e36617 #x222d3c0f0f330f78
567
                                      #xaf13cabcbc76bc89 #xd1789ea9a937a921
568
                                      #x8fc8014747464702 #x9bda194141584132
569
                                      #xb88cd03434e434bd #xade53d484875487a
570
                                      #x32ced7fcfc2bfcb3 #x9522e6b7b751b7d1
571
                                      #x610bb56a6adf6a77 #x179f1a8888928834
572
                                      #xf95caea5a50ba541 #xf7a45153530253a2
573
                                      #x33b5228686a48644 #x2cd5c3f9f93af99b
574
                                      #xc79c715b5b2a5be2 #xe03b4bdbdb90db96
575
                                      #x90a8e03838d838dd #x077cf17b7b8a7bff
576
                                      #xb0732bc3c3e8c356 #x445a781e1e661ef0
577
                                      #xccee882222aa220d #xaa99cc3333ff3385
578
                                      #xd8fc902424b4243d #xf0d8a0282888285d
579
                                      #xb482d83636ee36ad #xa86f3bc7c7fcc776
580
                                      #x8b39f2b2b240b2f9 #x9aa1ec3b3bd73bc5
581
                                      #x038d028e8e8c8e04 #x2f58c17777b6779f
582
                                      #xbb01d2baba68bab9 #x04f1f3f5f506f5fb
583
                                      #x786c5014144414a0 #x65fa469f9fd99f8c
584
                                      #x3038200808280840 #xe3b64955551c5592
585
                                      #x7de6569b9bcd9bac #xb5f92d4c4c614c5a
586
                                      #x3ec0dffefe21fea3 #x5d3d9d6060fd6027
587
                                      #xd5896d5c5c315cda #xe63c4fdada95da9e
588
                                      #x50486018187818c0 #x89cf05464643460a
589
                                      #x945913cdcddecd26 #x136ee97d7d947dcf
590
                                      #xc6e7842121a52115 #x8737fab0b04ab0e9
591
                                      #x82bdfc3f3fc33fe5 #x5a416c1b1b771bd8
592
                                      #x11981e898997893c #x38c7dbffff24ffab
593
                                      #x40ab8bebeb60eb0b #x3fbb2a8484ae8454
594
                                      #x6b02b96969d0696f #x9ca6e83a3ad23acd
595
                                      #x69f44e9d9dd39d9c #xc81f7bd7d7acd7f6
596
                                      #xd0036bd3d3b8d3d6 #x3d4ddd7070ad70a7
597
                                      #x4f28816767e6671f #x9ddd1d40405d403a
598
                                      #x992ceeb5b55bb5c1 #xfe205fdede81debe
599
                                      #xd38e695d5d345dd2 #xa090c03030f0309d
600
                                      #x41d07e9191ef91fc #x8130feb1b14fb1e1
601
                                      #x0d75fd78788578e7 #x6677441111551188
602
                                      #x0607040101050108 #x6481b3e5e556e57b
603
                                      #x0000000000000000 #x6d05bd6868d56867
604
                                      #x77ef5a9898c298b4 #xe747baa0a01aa069
605
                                      #xa46133c5c5f6c566 #x0c0e0802020a0210
606
                                      #xf355a2a6a604a659 #x2551cd7474b97487
607
                                      #xeec3b42d2d992d75 #x3a312c0b0b270b58
608
                                      #xeb49b2a2a210a279 #x295fc57676b37697
609
                                      #x8d3ef6b3b345b3f1 #xa31dc2bebe7cbe99
610
                                      #x9e501fceced1ce3e #xa914cebdbd73bd81
611
                                      #xc36d82aeae2cae19 #x4ca583e9e96ae91b
612
                                      #x1b91128a8a988a24 #xa697c43131f53195
613
                                      #x4854701c1c6c1ce0 #x52be97ecec7bec33
614
                                      #x1cede3f1f112f1db #x71e85e9999c799bc
615
                                      #x5fcb6a9494fe94d4 #xdb7192aaaa38aa39
616
                                      #x0ef8fff6f609f6e3 #xd4f2982626be262d
617
                                      #xe2cdbc2f2f932f65 #x58b79befef74ef2b
618
                                      #x4aa287e8e86fe813 #x0f830a8c8c868c14
619
                                      #xbe8bd43535e135b5 #x0a090c03030f0318
620
                                      #xc21677d4d4a3d4ee #x1f60e17f7f9e7fdf
621
                                      #x20dbcbfbfb30fb8b #x1e1b140505110528
622
                                      #xbc7d23c1c1e2c146 #xd987655e5e3b5eca
623
                                      #x47d77a9090ea90f4 #xc0e0802020a0201d
624
                                      #x8eb3f43d3dc93df5 #x2ba9328282b08264
625
                                      #x08fffbf7f70cf7eb #x46ac8feaea65ea03
626
                                      #x3c36280a0a220a50 #x2e23340d0d390d68
627
                                      #x1967e57e7e9b7ed7 #x2ad2c7f8f83ff893
628
                                      #xfdad5d50500d50ba #x5c46681a1a721ad0
629
                                      #xa26637c4c4f3c46e #x12151c07071b0738
630
                                      #xefb8415757165782 #xb70fdab8b862b8a9
631
                                      #x88b4f03c3ccc3cfd #x5133956262f76237
632
                                      #x7093abe3e348e34b #x8a4207c8c8cfc80e
633
                                      #xcf638aacac26ac09 #xf1a35552520752aa
634
                                      #x45218d6464e96407 #x6070401010501080
635
                                      #xda0a67d0d0b7d0ce #xec3543d9d99ad986
636
                                      #x6a794c13135f1398 #x2824300c0c3c0c60
637
                                      #x6c7e4812125a1290 #xf6dfa429298d2955
638
                                      #xfbaa5951510851b2 #xb108deb9b967b9a1
639
                                      #x98571bcfcfd4cf36 #xce187fd6d6a9d6fe
640
                                      #x3744d17373a273bf #x09840e8d8d838d1c
641
                                      #x21a03e8181bf817c #xe5b14d545419549a
642
                                      #xba7a27c0c0e7c04e #x54b993eded7eed3b
643
                                      #xb9f7254e4e6b4e4a #x85c10d444449441a
644
                                      #xf552a6a7a701a751 #xfcd6a82a2a822a4d
645
                                      #x39bc2e8585ab855c #xdefb942525b12535
646
                                      #x6e88bfe6e659e663 #x864c0fcacac5ca1e
647
                                      #x1569ed7c7c917cc7 #x1d96168b8b9d8b2c
648
                                      #xe9bf45565613568a #x27a73a8080ba8074)
649
                                     (#x501fceced1ce3e9e #x06d6bbbb6dbbb1bd
650
                                      #xab8bebeb60eb0b40 #xd9729292e092e44b
651
                                      #xac8feaea65ea0346 #x4b0bcbcbc0cb1680
652
                                      #x794c13135f13986a #x7d23c1c1e2c146bc
653
                                      #xa583e9e96ae91b4c #xa6e83a3ad23acd9c
654
                                      #x187fd6d6a9d6fece #x39f2b2b240b2f98b
655
                                      #x046fd2d2bdd2ded6 #xd77a9090ea90f447
656
                                      #x655c17174b17b872 #xd2c7f8f83ff8932a
657
                                      #xd315424257422a91 #x6b5415154115a87e
658
                                      #xbf45565613568ae9 #x2beab4b45eb4c99f
659
                                      #x26896565ec650f43 #x54701c1c6c1ce048
660
                                      #x9f1a888892883417 #xd411434352432297
661
                                      #x6133c5c5f6c566a4 #x896d5c5c315cdad5
662
                                      #x82d83636ee36adb4 #x01d2baba68bab9bb
663
                                      #xf1f3f5f506f5fb04 #xb8415757165782ef
664
                                      #x28816767e6671f4f #x840e8d8d838d1c09
665
                                      #x97c43131f53195a6 #xf8fff6f609f6e30e
666
                                      #x218d6464e9640745 #x957d58582558facd
667
                                      #xfd429e9edc9e8463 #xf6f7f4f403f4f302
668
                                      #xee882222aa220dcc #x7192aaaa38aa39db
669
                                      #x56c97575bc758f23 #x2d3c0f0f330f7822
670
                                      #x0e0802020a02100c #x30feb1b14fb1e181
671
                                      #x275bdfdf84dfb6f8 #x1ea96d6dc46d4f73
672
                                      #x44d17373a273bf37 #xfe294d4d644d52b3
673
                                      #x69ed7c7c917cc715 #xf2982626be262dd4
674
                                      #xcab82e2e962e6de4 #xfffbf7f70cf7eb08
675
                                      #x3820080828084030 #x8e695d5d345dd2d3
676
                                      #xc10d444449441a85 #xbaf83e3ec63eed84
677
                                      #xfa469f9fd99f8c65 #x6c5014144414a078
678
                                      #x4207c8c8cfc80e8a #x6d82aeae2cae19c3
679
                                      #xb14d545419549ae5 #x7040101050108060
680
                                      #x3247d8d89fd88eea #x13cabcbc76bc89af
681
                                      #x46681a1a721ad05c #x0cb16b6bda6b7f67
682
                                      #x02b96969d0696f6b #xe3ebf3f318f3cb10
683
                                      #x14cebdbd73bd81a9 #x99cc3333ff3385aa
684
                                      #x7696abab3dab31dd #xdccffafa35fa8326
685
                                      #x0d63d1d1b2d1c6dc #xe6569b9bcd9bac7d
686
                                      #x05bd6868d568676d #xf7254e4e6b4e4ab9
687
                                      #x625816164e16b074 #xcc6e9595fb95dc59
688
                                      #xd07e9191ef91fc41 #xb09feeee71ee235e
689
                                      #xf92d4c4c614c5ab5 #x34916363f2633f57
690
                                      #x8d028e8e8c8e0403 #x9c715b5b2a5be2c7
691
                                      #x5e17ccccdbcc2e92 #xb4f03c3ccc3cfd88
692
                                      #x4f6419197d19c856 #x40bea1a11fa161e1
693
                                      #xa03e8181bf817c21 #xe2394949704972ab
694
                                      #x7cf17b7b8a7bff07 #x3543d9d99ad986ec
695
                                      #x10a16f6fce6f5f7f #x85dc3737eb37a5b2
696
                                      #x3d9d6060fd60275d #x4c0fcacac5ca1e86
697
                                      #x8fbbe7e75ce76b68 #xd1ac2b2b872b45fa
698
                                      #xe53d484875487aad #xc9d3fdfd2efdbb34
699
                                      #xc5629696f496c453 #xc60945454c451283
700
                                      #xced7fcfc2bfcb332 #xda1941415841329b
701
                                      #x7e4812125a12906c #x23340d0d390d682e
702
                                      #x72f979798079ef0b #x81b3e5e556e57b64
703
                                      #x981e898997893c11 #x830a8c8c868c140f
704
                                      #x93abe3e348e34b70 #xe0802020a0201dc0
705
                                      #x90c03030f0309da0 #x2e57dcdc8bdcaef2
706
                                      #x22e6b7b751b7d195 #x19ad6c6cc16c4775
707
                                      #xeb354a4a7f4a6aa1 #x2ceeb5b55bb5c199
708
                                      #xbdfc3f3fc33fe582 #xc2669797f197cc55
709
                                      #x1677d4d4a3d4eec2 #x33956262f7623751
710
                                      #xc3b42d2d992d75ee #x121806061e063014
711
                                      #x5baaa4a40ea449ff #x5caea5a50ba541f9
712
                                      #xae368383b5836c2d #x80615f5f3e5fc2df
713
                                      #xd6a82a2a822a4dfc #x3c4fdada95da9ee6
714
                                      #x4503c9c9cac9068c #x0000000000000000
715
                                      #x67e57e7e9b7ed719 #x49b2a2a210a279eb
716
                                      #xb64955551c5592e3 #x1ac6bfbf79bf91a5
717
                                      #x7744111155118866 #x1173d5d5a6d5e6c4
718
                                      #xf34a9c9cd69c946f #x571bcfcfd4cf3698
719
                                      #x2a380e0e360e7024 #x36280a0a220a503c
720
                                      #xb3f43d3dc93df58e #xaa5951510851b2fb
721
                                      #x6ee97d7d947dcf13 #xde769393e593ec4d
722
                                      #x416c1b1b771bd85a #xc0dffefe21fea33e
723
                                      #x6637c4c4f3c46ea2 #xc80147474647028f
724
                                      #x3f2409092d094836 #xb5228686a4864433
725
                                      #x312c0b0b270b583a #x8a068f8f898f0c05
726
                                      #xf44e9d9dd39d9c69 #x0bb56a6adf6a7761
727
                                      #x151c07071b073812 #x08deb9b967b9a1b1
728
                                      #x37fab0b04ab0e987 #xef5a9898c298b477
729
                                      #x486018187818c050 #x9ec83232fa328dac
730
                                      #x4ad97171a871af3b #xec314b4b7a4b62a7
731
                                      #xb79befef74ef2b58 #xa1ec3b3bd73bc59a
732
                                      #x4ddd7070ad70a73d #x47baa0a01aa069e7
733
                                      #x86b7e4e453e47362 #xdd1d40405d403a9d
734
                                      #xc7dbffff24ffab38 #x732bc3c3e8c356b0
735
                                      #x789ea9a937a921d1 #x88bfe6e659e6636e
736
                                      #x75fd78788578e70d #xd5c3f9f93af99b2c
737
                                      #x96168b8b9d8b2c1d #xcf05464643460a89
738
                                      #xa73a8080ba807427 #x5a781e1e661ef044
739
                                      #xa8e03838d838dd90 #x9da3e1e142e15b7c
740
                                      #x0fdab8b862b8a9b7 #x7f9aa8a832a829d7
741
                                      #x9aa7e0e047e0537a #x24300c0c3c0c6028
742
                                      #xe98c2323af2305ca #x5fc57676b3769729
743
                                      #x53741d1d691de84e #xfb942525b12535de
744
                                      #xfc902424b4243dd8 #x1b1405051105281e
745
                                      #xede3f1f112f1db1c #x17a56e6ecb6e5779
746
                                      #xcb6a9494fe94d45f #xd8a0282888285df0
747
                                      #xe1529a9ac89aa47b #xbb2a8484ae84543f
748
                                      #xa287e8e86fe8134a #x4eb6a3a315a371ed
749
                                      #xf0214f4f6e4f42bf #x58c17777b6779f2f
750
                                      #x036bd3d3b8d3d6d0 #xbc2e8585ab855c39
751
                                      #x94afe2e24de24376 #xa35552520752aaf1
752
                                      #xe4eff2f21df2c316 #xa9328282b082642b
753
                                      #xad5d50500d50bafd #x7bf57a7a8f7af701
754
                                      #xcdbc2f2f932f65e2 #x51cd7474b9748725
755
                                      #xa45153530253a2f7 #x3ef6b3b345b3f18d
756
                                      #x3a996161f8612f5b #x6a86afaf29af11c5
757
                                      #xafe43939dd39d596 #x8bd43535e135b5be
758
                                      #x205fdede81debefe #x5913cdcddecd2694
759
                                      #x5d7c1f1f631ff842 #xe85e9999c799bc71
760
                                      #x638aacac26ac09cf #x648eadad23ad01c9
761
                                      #x43d57272a772b731 #xc4b02c2c9c2c7de8
762
                                      #x2953dddd8edda6f4 #x0a67d0d0b7d0ceda
763
                                      #xb2268787a1874c35 #x1dc2bebe7cbe99a3
764
                                      #x87655e5e3b5ecad9 #x55a2a6a604a659f3
765
                                      #xbe97ecec7bec3352 #x1c10040414042018
766
                                      #x683fc6c6f9c67eae #x090c03030f03180a
767
                                      #x8cd03434e434bdb8 #xdbcbfbfb30fb8b20
768
                                      #x3b4bdbdb90db96e0 #x927959592059f2cb
769
                                      #x25e2b6b654b6d993 #x742fc2c2edc25eb6
770
                                      #x0704010105010806 #xeae7f0f017f0d31a
771
                                      #x9b755a5a2f5aeac1 #xb993eded7eed3b54
772
                                      #x52a6a7a701a751f5 #x2f856666e3661749
773
                                      #xe7842121a52115c6 #x60e17f7f9e7fdf1f
774
                                      #x91128a8a988a241b #xf59c2727bb2725d2
775
                                      #x6f3bc7c7fcc776a8 #x7a27c0c0e7c04eba
776
                                      #xdfa429298d2955f6 #x1f7bd7d7acd7f6c8)
777
                                     (#x769393e593ec4dde #x43d9d99ad986ec35
778
                                      #x529a9ac89aa47be1 #xeeb5b55bb5c1992c
779
                                      #x5a9898c298b477ef #x882222aa220dccee
780
                                      #x0945454c451283c6 #xd7fcfc2bfcb332ce
781
                                      #xd2baba68bab9bb01 #xb56a6adf6a77610b
782
                                      #x5bdfdf84dfb6f827 #x0802020a02100c0e
783
                                      #x469f9fd99f8c65fa #x57dcdc8bdcaef22e
784
                                      #x5951510851b2fbaa #x7959592059f2cb92
785
                                      #x354a4a7f4a6aa1eb #x5c17174b17b87265
786
                                      #xac2b2b872b45fad1 #x2fc2c2edc25eb674
787
                                      #x6a9494fe94d45fcb #xf7f4f403f4f302f6
788
                                      #xd6bbbb6dbbb1bd06 #xb6a3a315a371ed4e
789
                                      #x956262f762375133 #xb7e4e453e4736286
790
                                      #xd97171a871af3b4a #x77d4d4a3d4eec216
791
                                      #x13cdcddecd269459 #xdd7070ad70a73d4d
792
                                      #x5816164e16b07462 #xa3e1e142e15b7c9d
793
                                      #x394949704972abe2 #xf03c3ccc3cfd88b4
794
                                      #x27c0c0e7c04eba7a #x47d8d89fd88eea32
795
                                      #x6d5c5c315cdad589 #x569b9bcd9bac7de6
796
                                      #x8eadad23ad01c964 #x2e8585ab855c39bc
797
                                      #x5153530253a2f7a4 #xbea1a11fa161e140
798
                                      #xf57a7a8f7af7017b #x07c8c8cfc80e8a42
799
                                      #xb42d2d992d75eec3 #xa7e0e047e0537a9a
800
                                      #x63d1d1b2d1c6dc0d #xd57272a772b73143
801
                                      #xa2a6a604a659f355 #xb02c2c9c2c7de8c4
802
                                      #x37c4c4f3c46ea266 #xabe3e348e34b7093
803
                                      #xc57676b37697295f #xfd78788578e70d75
804
                                      #xe6b7b751b7d19522 #xeab4b45eb4c99f2b
805
                                      #x2409092d0948363f #xec3b3bd73bc59aa1
806
                                      #x380e0e360e70242a #x1941415841329bda
807
                                      #x2d4c4c614c5ab5f9 #x5fdede81debefe20
808
                                      #xf2b2b240b2f98b39 #x7a9090ea90f447d7
809
                                      #x942525b12535defb #xaea5a50ba541f95c
810
                                      #x7bd7d7acd7f6c81f #x0c03030f03180a09
811
                                      #x4411115511886677 #x0000000000000000
812
                                      #x2bc3c3e8c356b073 #xb82e2e962e6de4ca
813
                                      #x729292e092e44bd9 #x9befef74ef2b58b7
814
                                      #x254e4e6b4e4ab9f7 #x4812125a12906c7e
815
                                      #x4e9d9dd39d9c69f4 #xe97d7d947dcf136e
816
                                      #x0bcbcbc0cb16804b #xd43535e135b5be8b
817
                                      #x4010105010806070 #x73d5d5a6d5e6c411
818
                                      #x214f4f6e4f42bff0 #x429e9edc9e8463fd
819
                                      #x294d4d644d52b3fe #x9ea9a937a921d178
820
                                      #x4955551c5592e3b6 #x3fc6c6f9c67eae68
821
                                      #x67d0d0b7d0ceda0a #xf17b7b8a7bff077c
822
                                      #x6018187818c05048 #x669797f197cc55c2
823
                                      #x6bd3d3b8d3d6d003 #xd83636ee36adb482
824
                                      #xbfe6e659e6636e88 #x3d484875487aade5
825
                                      #x45565613568ae9bf #x3e8181bf817c21a0
826
                                      #x068f8f898f0c058a #xc17777b6779f2f58
827
                                      #x17ccccdbcc2e925e #x4a9c9cd69c946ff3
828
                                      #xdeb9b967b9a1b108 #xafe2e24de2437694
829
                                      #x8aacac26ac09cf63 #xdab8b862b8a9b70f
830
                                      #xbc2f2f932f65e2cd #x5415154115a87e6b
831
                                      #xaaa4a40ea449ff5b #xed7c7c917cc71569
832
                                      #x4fdada95da9ee63c #xe03838d838dd90a8
833
                                      #x781e1e661ef0445a #x2c0b0b270b583a31
834
                                      #x1405051105281e1b #x7fd6d6a9d6fece18
835
                                      #x5014144414a0786c #xa56e6ecb6e577917
836
                                      #xad6c6cc16c477519 #xe57e7e9b7ed71967
837
                                      #x856666e36617492f #xd3fdfd2efdbb34c9
838
                                      #xfeb1b14fb1e18130 #xb3e5e556e57b6481
839
                                      #x9d6060fd60275d3d #x86afaf29af11c56a
840
                                      #x655e5e3b5ecad987 #xcc3333ff3385aa99
841
                                      #x268787a1874c35b2 #x03c9c9cac9068c45
842
                                      #xe7f0f017f0d31aea #x695d5d345dd2d38e
843
                                      #xa96d6dc46d4f731e #xfc3f3fc33fe582bd
844
                                      #x1a8888928834179f #x0e8d8d838d1c0984
845
                                      #x3bc7c7fcc776a86f #xfbf7f70cf7eb08ff
846
                                      #x741d1d691de84e53 #x83e9e96ae91b4ca5
847
                                      #x97ecec7bec3352be #x93eded7eed3b54b9
848
                                      #x3a8080ba807427a7 #xa429298d2955f6df
849
                                      #x9c2727bb2725d2f5 #x1bcfcfd4cf369857
850
                                      #x5e9999c799bc71e8 #x9aa8a832a829d77f
851
                                      #x5d50500d50bafdad #x3c0f0f330f78222d
852
                                      #xdc3737eb37a5b285 #x902424b4243dd8fc
853
                                      #xa0282888285df0d8 #xc03030f0309da090
854
                                      #x6e9595fb95dc59cc #x6fd2d2bdd2ded604
855
                                      #xf83e3ec63eed84ba #x715b5b2a5be2c79c
856
                                      #x1d40405d403a9ddd #x368383b5836c2dae
857
                                      #xf6b3b345b3f18d3e #xb96969d0696f6b02
858
                                      #x415757165782efb8 #x7c1f1f631ff8425d
859
                                      #x1c07071b07381215 #x701c1c6c1ce04854
860
                                      #x128a8a988a241b91 #xcabcbc76bc89af13
861
                                      #x802020a0201dc0e0 #x8bebeb60eb0b40ab
862
                                      #x1fceced1ce3e9e50 #x028e8e8c8e04038d
863
                                      #x96abab3dab31dd76 #x9feeee71ee235eb0
864
                                      #xc43131f53195a697 #xb2a2a210a279eb49
865
                                      #xd17373a273bf3744 #xc3f9f93af99b2cd5
866
                                      #x0fcacac5ca1e864c #xe83a3ad23acd9ca6
867
                                      #x681a1a721ad05c46 #xcbfbfb30fb8b20db
868
                                      #x340d0d390d682e23 #x23c1c1e2c146bc7d
869
                                      #xdffefe21fea33ec0 #xcffafa35fa8326dc
870
                                      #xeff2f21df2c316e4 #xa16f6fce6f5f7f10
871
                                      #xcebdbd73bd81a914 #x629696f496c453c5
872
                                      #x53dddd8edda6f429 #x11434352432297d4
873
                                      #x5552520752aaf1a3 #xe2b6b654b6d99325
874
                                      #x2008082808403038 #xebf3f318f3cb10e3
875
                                      #x82aeae2cae19c36d #xc2bebe7cbe99a31d
876
                                      #x6419197d19c8564f #x1e898997893c1198
877
                                      #xc83232fa328dac9e #x982626be262dd4f2
878
                                      #xfab0b04ab0e98737 #x8feaea65ea0346ac
879
                                      #x314b4b7a4b62a7ec #x8d6464e964074521
880
                                      #x2a8484ae84543fbb #x328282b082642ba9
881
                                      #xb16b6bda6b7f670c #xf3f5f506f5fb04f1
882
                                      #xf979798079ef0b72 #xc6bfbf79bf91a51a
883
                                      #x0401010501080607 #x615f5f3e5fc2df80
884
                                      #xc97575bc758f2356 #x916363f2633f5734
885
                                      #x6c1b1b771bd85a41 #x8c2323af2305cae9
886
                                      #xf43d3dc93df58eb3 #xbd6868d568676d05
887
                                      #xa82a2a822a4dfcd6 #x896565ec650f4326
888
                                      #x87e8e86fe8134aa2 #x7e9191ef91fc41d0
889
                                      #xfff6f609f6e30ef8 #xdbffff24ffab38c7
890
                                      #x4c13135f13986a79 #x7d58582558facd95
891
                                      #xe3f1f112f1db1ced #x0147474647028fc8
892
                                      #x280a0a220a503c36 #xe17f7f9e7fdf1f60
893
                                      #x33c5c5f6c566a461 #xa6a7a701a751f552
894
                                      #xbbe7e75ce76b688f #x996161f8612f5b3a
895
                                      #x755a5a2f5aeac19b #x1806061e06301412
896
                                      #x05464643460a89cf #x0d444449441a85c1
897
                                      #x15424257422a91d3 #x100404140420181c
898
                                      #xbaa0a01aa069e747 #x4bdbdb90db96e03b
899
                                      #xe43939dd39d596af #x228686a4864433b5
900
                                      #x4d545419549ae5b1 #x92aaaa38aa39db71
901
                                      #x0a8c8c868c140f83 #xd03434e434bdb88c
902
                                      #x842121a52115c6e7 #x168b8b9d8b2c1d96
903
                                      #xc7f8f83ff8932ad2 #x300c0c3c0c602824
904
                                      #xcd7474b974872551 #x816767e6671f4f28)
905
                                     (#x6868d568676d05bd #x8d8d838d1c09840e
906
                                      #xcacac5ca1e864c0f #x4d4d644d52b3fe29
907
                                      #x7373a273bf3744d1 #x4b4b7a4b62a7ec31
908
                                      #x4e4e6b4e4ab9f725 #x2a2a822a4dfcd6a8
909
                                      #xd4d4a3d4eec21677 #x52520752aaf1a355
910
                                      #x2626be262dd4f298 #xb3b345b3f18d3ef6
911
                                      #x545419549ae5b14d #x1e1e661ef0445a78
912
                                      #x19197d19c8564f64 #x1f1f631ff8425d7c
913
                                      #x2222aa220dccee88 #x03030f03180a090c
914
                                      #x464643460a89cf05 #x3d3dc93df58eb3f4
915
                                      #x2d2d992d75eec3b4 #x4a4a7f4a6aa1eb35
916
                                      #x53530253a2f7a451 #x8383b5836c2dae36
917
                                      #x13135f13986a794c #x8a8a988a241b9112
918
                                      #xb7b751b7d19522e6 #xd5d5a6d5e6c41173
919
                                      #x2525b12535defb94 #x79798079ef0b72f9
920
                                      #xf5f506f5fb04f1f3 #xbdbd73bd81a914ce
921
                                      #x58582558facd957d #x2f2f932f65e2cdbc
922
                                      #x0d0d390d682e2334 #x02020a02100c0e08
923
                                      #xeded7eed3b54b993 #x51510851b2fbaa59
924
                                      #x9e9edc9e8463fd42 #x1111551188667744
925
                                      #xf2f21df2c316e4ef #x3e3ec63eed84baf8
926
                                      #x55551c5592e3b649 #x5e5e3b5ecad98765
927
                                      #xd1d1b2d1c6dc0d63 #x16164e16b0746258
928
                                      #x3c3ccc3cfd88b4f0 #x6666e36617492f85
929
                                      #x7070ad70a73d4ddd #x5d5d345dd2d38e69
930
                                      #xf3f318f3cb10e3eb #x45454c451283c609
931
                                      #x40405d403a9ddd1d #xccccdbcc2e925e17
932
                                      #xe8e86fe8134aa287 #x9494fe94d45fcb6a
933
                                      #x565613568ae9bf45 #x0808280840303820
934
                                      #xceced1ce3e9e501f #x1a1a721ad05c4668
935
                                      #x3a3ad23acd9ca6e8 #xd2d2bdd2ded6046f
936
                                      #xe1e142e15b7c9da3 #xdfdf84dfb6f8275b
937
                                      #xb5b55bb5c1992cee #x3838d838dd90a8e0
938
                                      #x6e6ecb6e577917a5 #x0e0e360e70242a38
939
                                      #xe5e556e57b6481b3 #xf4f403f4f302f6f7
940
                                      #xf9f93af99b2cd5c3 #x8686a4864433b522
941
                                      #xe9e96ae91b4ca583 #x4f4f6e4f42bff021
942
                                      #xd6d6a9d6fece187f #x8585ab855c39bc2e
943
                                      #x2323af2305cae98c #xcfcfd4cf3698571b
944
                                      #x3232fa328dac9ec8 #x9999c799bc71e85e
945
                                      #x3131f53195a697c4 #x14144414a0786c50
946
                                      #xaeae2cae19c36d82 #xeeee71ee235eb09f
947
                                      #xc8c8cfc80e8a4207 #x484875487aade53d
948
                                      #xd3d3b8d3d6d0036b #x3030f0309da090c0
949
                                      #xa1a11fa161e140be #x9292e092e44bd972
950
                                      #x41415841329bda19 #xb1b14fb1e18130fe
951
                                      #x18187818c0504860 #xc4c4f3c46ea26637
952
                                      #x2c2c9c2c7de8c4b0 #x7171a871af3b4ad9
953
                                      #x7272a772b73143d5 #x444449441a85c10d
954
                                      #x15154115a87e6b54 #xfdfd2efdbb34c9d3
955
                                      #x3737eb37a5b285dc #xbebe7cbe99a31dc2
956
                                      #x5f5f3e5fc2df8061 #xaaaa38aa39db7192
957
                                      #x9b9bcd9bac7de656 #x8888928834179f1a
958
                                      #xd8d89fd88eea3247 #xabab3dab31dd7696
959
                                      #x898997893c11981e #x9c9cd69c946ff34a
960
                                      #xfafa35fa8326dccf #x6060fd60275d3d9d
961
                                      #xeaea65ea0346ac8f #xbcbc76bc89af13ca
962
                                      #x6262f76237513395 #x0c0c3c0c60282430
963
                                      #x2424b4243dd8fc90 #xa6a604a659f355a2
964
                                      #xa8a832a829d77f9a #xecec7bec3352be97
965
                                      #x6767e6671f4f2881 #x2020a0201dc0e080
966
                                      #xdbdb90db96e03b4b #x7c7c917cc71569ed
967
                                      #x282888285df0d8a0 #xdddd8edda6f42953
968
                                      #xacac26ac09cf638a #x5b5b2a5be2c79c71
969
                                      #x3434e434bdb88cd0 #x7e7e9b7ed71967e5
970
                                      #x1010501080607040 #xf1f112f1db1cede3
971
                                      #x7b7b8a7bff077cf1 #x8f8f898f0c058a06
972
                                      #x6363f2633f573491 #xa0a01aa069e747ba
973
                                      #x05051105281e1b14 #x9a9ac89aa47be152
974
                                      #x434352432297d411 #x7777b6779f2f58c1
975
                                      #x2121a52115c6e784 #xbfbf79bf91a51ac6
976
                                      #x2727bb2725d2f59c #x09092d0948363f24
977
                                      #xc3c3e8c356b0732b #x9f9fd99f8c65fa46
978
                                      #xb6b654b6d99325e2 #xd7d7acd7f6c81f7b
979
                                      #x29298d2955f6dfa4 #xc2c2edc25eb6742f
980
                                      #xebeb60eb0b40ab8b #xc0c0e7c04eba7a27
981
                                      #xa4a40ea449ff5baa #x8b8b9d8b2c1d9616
982
                                      #x8c8c868c140f830a #x1d1d691de84e5374
983
                                      #xfbfb30fb8b20dbcb #xffff24ffab38c7db
984
                                      #xc1c1e2c146bc7d23 #xb2b240b2f98b39f2
985
                                      #x9797f197cc55c266 #x2e2e962e6de4cab8
986
                                      #xf8f83ff8932ad2c7 #x6565ec650f432689
987
                                      #xf6f609f6e30ef8ff #x7575bc758f2356c9
988
                                      #x07071b073812151c #x0404140420181c10
989
                                      #x4949704972abe239 #x3333ff3385aa99cc
990
                                      #xe4e453e4736286b7 #xd9d99ad986ec3543
991
                                      #xb9b967b9a1b108de #xd0d0b7d0ceda0a67
992
                                      #x424257422a91d315 #xc7c7fcc776a86f3b
993
                                      #x6c6cc16c477519ad #x9090ea90f447d77a
994
                                      #x0000000000000000 #x8e8e8c8e04038d02
995
                                      #x6f6fce6f5f7f10a1 #x50500d50bafdad5d
996
                                      #x0101050108060704 #xc5c5f6c566a46133
997
                                      #xdada95da9ee63c4f #x47474647028fc801
998
                                      #x3f3fc33fe582bdfc #xcdcddecd26945913
999
                                      #x6969d0696f6b02b9 #xa2a210a279eb49b2
1000
                                      #xe2e24de2437694af #x7a7a8f7af7017bf5
1001
                                      #xa7a701a751f552a6 #xc6c6f9c67eae683f
1002
                                      #x9393e593ec4dde76 #x0f0f330f78222d3c
1003
                                      #x0a0a220a503c3628 #x06061e0630141218
1004
                                      #xe6e659e6636e88bf #x2b2b872b45fad1ac
1005
                                      #x9696f496c453c562 #xa3a315a371ed4eb6
1006
                                      #x1c1c6c1ce0485470 #xafaf29af11c56a86
1007
                                      #x6a6adf6a77610bb5 #x12125a12906c7e48
1008
                                      #x8484ae84543fbb2a #x3939dd39d596afe4
1009
                                      #xe7e75ce76b688fbb #xb0b04ab0e98737fa
1010
                                      #x8282b082642ba932 #xf7f70cf7eb08fffb
1011
                                      #xfefe21fea33ec0df #x9d9dd39d9c69f44e
1012
                                      #x8787a1874c35b226 #x5c5c315cdad5896d
1013
                                      #x8181bf817c21a03e #x3535e135b5be8bd4
1014
                                      #xdede81debefe205f #xb4b45eb4c99f2bea
1015
                                      #xa5a50ba541f95cae #xfcfc2bfcb332ced7
1016
                                      #x8080ba807427a73a #xefef74ef2b58b79b
1017
                                      #xcbcbc0cb16804b0b #xbbbb6dbbb1bd06d6
1018
                                      #x6b6bda6b7f670cb1 #x7676b37697295fc5
1019
                                      #xbaba68bab9bb01d2 #x5a5a2f5aeac19b75
1020
                                      #x7d7d947dcf136ee9 #x78788578e70d75fd
1021
                                      #x0b0b270b583a312c #x9595fb95dc59cc6e
1022
                                      #xe3e348e34b7093ab #xadad23ad01c9648e
1023
                                      #x7474b974872551cd #x9898c298b477ef5a
1024
                                      #x3b3bd73bc59aa1ec #x3636ee36adb482d8
1025
                                      #x6464e9640745218d #x6d6dc46d4f731ea9
1026
                                      #xdcdc8bdcaef22e57 #xf0f017f0d31aeae7
1027
                                      #x59592059f2cb9279 #xa9a937a921d1789e
1028
                                      #x4c4c614c5ab5f92d #x17174b17b872655c
1029
                                      #x7f7f9e7fdf1f60e1 #x9191ef91fc41d07e
1030
                                      #xb8b862b8a9b70fda #xc9c9cac9068c4503
1031
                                      #x5757165782efb841 #x1b1b771bd85a416c
1032
                                      #xe0e047e0537a9aa7 #x6161f8612f5b3a99))))
1033
 
1034
   (defconst +kalyna-it+
1035
     (make-array '(8 256)
1036
                 :element-type '(unsigned-byte 64)
1037
                 :initial-contents '((#x7826942b9f5f8a9a #x210f43c934970c53
1038
                                      #x5f028fdd9d0551b8 #x14facd82b494c83b
1039
                                      #x2b72ab886edd68c0 #xa6a87e5bff19d9b4
1040
                                      #xa29ae571db6443ea #x039b2c911be8e5b6
1041
                                      #xd9275dcb5fd32cc6 #x10c856a890e95265
1042
                                      #x7d96e085b27ab85d #x31c71561a47e5e36
1043
                                      #x74702455f3d83978 #xe8e048aafbad72f0
1044
                                      #x9b39db4437e03460 #x75f2cbd1fa8091e1
1045
                                      #x1ab5bee9caa336f6 #x8395a6b8eff34fb9
1046
                                      #x64b872fd63316b1d #xe1068c7aba0ff3d5
1047
                                      #xeecb1095cd60a581 #xbc1dc0b235baef42
1048
                                      #xf04c355623be0929 #xb252b3d94b8d118f
1049
                                      #x18ac7dfcd8137bd9 #xbbb477090a2f90aa
1050
                                      #x8625d216c2d67d7e #x66a1b1e871812632
1051
                                      #x6f4775383023a717 #x92df1f947642b545
1052
                                      #xe962a72ef2f5da69 #x8bf18deca7096605
1053
                                      #xc86de4e7c662d63a #xaafece25939e6a56
1054
                                      #x5c99a34c86edb40e #x52d6d027f8da4ac3
1055
                                      #x6b75ee12145e3d49 #x54fd8818ce179db2
1056
                                      #xa3180af5d23ceb73 #xbe0403a7270aa26d
1057
                                      #xfe03463d5d89f7e4 #xf1cedad22ae6a1b0
1058
                                      #xd143769f1729057a #xc7a07808b10d806e
1059
                                      #xfc1a85284f39bacb #xa4b1bd4eeda9949b
1060
                                      #x0bff07c55312cc0a #xef49ff11c4380d18
1061
                                      #xc392e32295701a30 #x7f8f2390a0caf572
1062
                                      #x62932ac255fcbc6c #xc9ef0b63cf3a7ea3
1063
                                      #xf9aaf186621c880c #x818c65adfd430296
1064
                                      #x325c39f0bf96bb80 #x0c56b07e6c87b3e2
1065
                                      #x4bf8425f29919983 #xb5fb046274186e67
1066
                                      #x462c1da54c4e82f8 #x90c6dc8164f2f86a
1067
                                      #xf8281e026b442095 #x6af701961d0695d0
1068
                                      #x5766a489d5ff7804 #xf3d719c73856ec9f
1069
                                      #xad57799eac0b15be #x1b37516dc3fb9e6f
1070
                                      #xc009cfb38e98ff86 #x9576a82f49d7caad
1071
                                      #xe6af3bc1859a8c3d #x208dac4d3dcfa4ca
1072
                                      #x8ddad5d391c4b174 #x8e41f9428a2c54c2
1073
                                      #x6cdc59a92bcb42a1 #xe53417509e72698b
1074
                                      #xd0c1991b1e71ade3 #x8217493ce6abe720
1075
                                      #xd4f302313a0c37bd #x5e806059945df921
1076
                                      #x73d993eecc4d4690 #xf5fc41f80e9b3bee
1077
                                      #x13537a398b01b7d3 #x53543fa3f182e25a
1078
                                      #x2d59f3b75810bfb1 #x35f58e4b8003c468
1079
                                      #x886aa17dbce183b3 #x4c51f5e41604e66b
1080
                                      #x98a2f7d52c08d1d6 #xa101c9e0c08ca65c
1081
                                      #x4007459a7a835589 #xcc5f7fcde21f4c64
1082
                                      #xa965e2b488768fe0 #x12d195bd82591f4a
1083
                                      #x2f4030a24aa0f29e #x56e44b0ddca7d09d
1084
                                      #x914433056daa50f3 #x37ec4d5e92b38947
1085
                                      #xe31f4f6fa8bfbefa #x50cf1332ea6a07ec
1086
                                      #x6d5eb62d2293ea38 #x09e6c4d041a28125
1087
                                      #x8fc316c68374fc5b #x421e868f683318a6
1088
                                      #xe08463feb3575b4c #x3821d1b1e5dcdf13
1089
                                      #xed503c04d6884037 #xd35ab58a05994855
1090
                                      #x976f6b3a5b678782 #x6ec59abc397b0f8e
1091
                                      #x5929d7e2abc886c9 #xa53352cae4f13c02
1092
                                      #x89e84ef9b5b92b2a #x1761e113af7c2d8d
1093
                                      #x28e9871975358d76 #xdc97296572f61e01
1094
                                      #x67235e6c78d98eab #x3d91a51fc8f9edd4
1095
                                      #x68eec2830fb6d8ff #xfbb3329370acc523
1096
                                      #x062b583f36cdd771 #x15782206bdcc60a2
1097
                                      #x16e30e97a6248514 #x79a47baf96072203
1098
                                      #xf7e582ed1c2b76c1 #xde8eea706046532e
1099
                                      #xaf4eba8bbebb5891 #x08642b5448fa29bc
1100
                                      #x24bf376719b23e94 #x231680dc2627417c
1101
                                      #x0dd45ffa65df1b7b #x1d1c0952f536491e
1102
                                      #xff81a9b954d15f7d #x992018512550794f
1103
                                      #x71c050fbdefd0bbf #xc18b203787c0571f
1104
                                      #x253dd8e310ea960d #xeb7b643be0459746
1105
                                      #x0219c31512b04d2f #xc43b5499aae565d8
1106
                                      #xeaf98bbfe91d3fdf #x3a3812a4f76c923c
1107
                                      #x4dd31a601f5c4ef2 #xa8e70d30812e2779
1108
                                      #x800e8a29f41baa0f #x1c9ee6d6fc6ee187
1109
                                      #x5d1b4cc88fb51c97 #x610806534e1459da
1110
                                      #xf255f643310e4406 #xd2d85a0e0cc1e0cc
1111
                                      #x0182ef840958a899 #x7e0dcc14a9925deb
1112
                                      #x653a9d796a69c384 #x4e4836f104b4ab44
1113
                                      #x4fcad9750dec03dd #xcddd9049eb47e4fd
1114
                                      #x0e4f736b7e37fecd #x4185aa1e73dbfd10
1115
                                      #x725b7c6ac515ee09 #x8a736268ae51ce9c
1116
                                      #xc5b9bb1da3bdcd41 #x7bbdb8ba84b76f2c
1117
                                      #xdabc715a443bc970 #xe29da0eba1e71663
1118
                                      #x935df0107f1a1ddc #x608ae9d7474cf143
1119
                                      #xd571edb533549f24 #xa0832664c9d40ec5
1120
                                      #xfd986aac46611252 #x4435deb05efecfd7
1121
                                      #x0000000000000000 #x2cdb1c3351481728
1122
                                      #x94f447ab408f6234 #x45b7313457a6674e
1123
                                      #xb82f5b9811c7751c #x8c583a57989c19ed
1124
                                      #xdd15c6e17baeb698 #x696c2d0706ee7066
1125
                                      #x3f88660ada49a0fb #xf47eae7c07c39377
1126
                                      #x05b074ae2d2532c7 #xb3d05c5d42d5b916
1127
                                      #x39a33e35ec84778a #x0fcd9cef776f5654
1128
                                      #xacd5961aa553bd27 #x5b3014f7b978cbe6
1129
                                      #x347761cf895b6cf1 #xc622978cb85528f7
1130
                                      #xb7e2c77766a82348 #x77eb08c4e830dcce
1131
                                      #xb9adb41c189fdd85 #x114ab92c99b1fafc
1132
                                      #x26a6f4720b0273bb #x1e8725c3eedeaca8
1133
                                      #x2af0440c6785c059 #x04329b2a247d9a5e
1134
                                      #xd7682ea021e4d20b #x7c140f01bb2210c4
1135
                                      #x96ed84be523f2f1b #xca7427f2d4d29b15
1136
                                      #x47aef22145162a61 #xa72a91dff641712d
1137
                                      #x5ab2fb73b020637f #xcbf6c876dd8a338c
1138
                                      #x6311c5465ca414f5 #x07a9b7bb3f957fe8
1139
                                      #xe72dd4458cc224a4 #x9d12837b012de311
1140
                                      #x843c1103d0663051 #x0a7de8415a4a6493
1141
                                      #xd6eac12428bc7a92 #x9c906cff08754b88
1142
                                      #x7042bf7fd7a5a326 #xbd9f2f363ce247db
1143
                                      #xb66028f36ff08bd1 #x192e9278d14bd340
1144
                                      #x9f0b406e139dae3e #x1f05ca47e7860431
1145
                                      #x85befe87d93e98c8 #x439c690b616bb03f
1146
                                      #xba36988d03773833 #x87a73d92cb8ed5e7
1147
                                      #xaecc550fb7e3f008 #xc2100ca69c28b2a9
1148
                                      #x9abb34c03eb89cf9 #x49e1814a3b21d4ac
1149
                                      #xecd2d380dfd0e8ae #x296b689d7c6d25ef
1150
                                      #x3c134a9bc1a1454d #xcfc4535cf9f7a9d2
1151
                                      #x557f679cc74f352b #xb479ebe67d40c6fe
1152
                                      #xf6676d691573de58 #x9e89afea1ac506a7
1153
                                      #xd8a5b24f568b845f #x48636ece32797c35
1154
                                      #xdf0c05f4691efbb7 #xe4b6f8d4972ac112
1155
                                      #xfa31dd1779f46dba #xbf86ec232e520af4
1156
                                      #x3e0a898ed3110862 #x7a3f573e8defc7b5
1157
                                      #x27241bf6025adb22 #x58ab3866a2902e50
1158
                                      #x3bbafd20fe343aa5 #x3045fae5ad26f6af
1159
                                      #x2ec2df2643f85a07 #x22946f582f7fe9e5
1160
                                      #x366ea2da9beb21de #x4a7aaddb20c9311a
1161
                                      #xb1c99f485065f439 #xb04b70cc593d5ca0
1162
                                      #xab7c21a19ac6c2cf #x33ded674b6ce1319
1163
                                      #xce46bcd8f0af014b #xdb3e9ede4d6361e9
1164
                                      #x7669e740e1687457 #x514dfcb6e332af75)
1165
                                     (#x1f4f6fa8bfbefae3 #xf0440c6785c0592a
1166
                                      #x1dc0b235baef42bc #x22978cb85528f7c6
1167
                                      #xcedad22ae6a1b0f1 #x180af5d23ceb73a3
1168
                                      #x946f582f7fe9e522 #xe44b0ddca7d09d56
1169
                                      #x906cff08754b889c #x9f2f363ce247dbbd
1170
                                      #xa1b1e87181263266 #x21d1b1e5dcdf1338
1171
                                      #x31dd1779f46dbafa #x4b70cc593d5ca0b0
1172
                                      #xd719c73856ec9ff3 #x8725c3eedeaca81e
1173
                                      #x71edb533549f24d5 #x12837b012de3119d
1174
                                      #x3dd8e310ea960d25 #x29d7e2abc886c959
1175
                                      #xb477090a2f90aabb #x45fae5ad26f6af30
1176
                                      #x9ee6d6fc6ee1871c #xbefe87d93e98c885
1177
                                      #xe30e97a624851416 #xd6d027f8da4ac352
1178
                                      #xcc550fb7e3f008ae #x5ab58a05994855d3
1179
                                      #x806059945df9215e #x82ef840958a89901
1180
                                      #x4ab92c99b1fafc11 #x281e026b442095f8
1181
                                      #x62a72ef2f5da69e9 #x8b203787c0571fc1
1182
                                      #x4f736b7e37fecd0e #xab3866a2902e5058
1183
                                      #x6ea2da9beb21de36 #xf447ab408f623494
1184
                                      #x235e6c78d98eab67 #x11c5465ca414f563
1185
                                      #xd31a601f5c4ef24d #xa2f7d52c08d1d698
1186
                                      #x85aa1e73dbfd1041 #xdc59a92bcb42a16c
1187
                                      #x59f3b75810bfb12d #xe2c77766a82348b7
1188
                                      #xb9bb1da3bdcd41c5 #x96e085b27ab85d7d
1189
                                      #x99a34c86edb40e5c #x66a489d5ff780457
1190
                                      #x95a6b8eff34fb983 #x7f679cc74f352b55
1191
                                      #x7de8415a4a64930a #x9b2c911be8e5b603
1192
                                      #x4836f104b4ab444e #xdb1c33514817282c
1193
                                      #x15c6e17baeb698dd #xed84be523f2f1b96
1194
                                      #xe1814a3b21d4ac49 #x503c04d6884037ed
1195
                                      #x4c355623be0929f0 #x3b5499aae565d8c4
1196
                                      #x0a898ed31108623e #xb074ae2d2532c705
1197
                                      #x028fdd9d0551b85f #xf58e4b8003c46835
1198
                                      #x3352cae4f13c02a5 #x6c2d0706ee706669
1199
                                      #x7c21a19ac6c2cfab #x19c31512b04d2f02
1200
                                      #xa6f4720b0273bb26 #x05ca47e78604311f
1201
                                      #x46bcd8f0af014bce #x1e868f683318a642
1202
                                      #x5c39f0bf96bb8032 #x79ebe67d40c6feb4
1203
                                      #xff07c55312cc0a0b #xaef22145162a6147
1204
                                      #xc1991b1e71ade3d0 #xded674b6ce131933
1205
                                      #x7aaddb20c9311a4a #x4dfcb6e332af7551
1206
                                      #x6de4e7c662d63ac8 #xbf376719b23e9424
1207
                                      #x07459a7a83558940 #xac7dfcd8137bd918
1208
                                      #xdf1f947642b54592 #x17493ce6abe72082
1209
                                      #xfc41f80e9b3beef5 #xe70d30812e2779a8
1210
                                      #xd993eecc4d469073 #x65e2b488768fe0a9
1211
                                      #xd2d380dfd0e8aeec #xe6c4d041a2812509
1212
                                      #x068c7aba0ff3d5e1 #x51f5e41604e66b4c
1213
                                      #x41f9428a2c54c28e #x537a398b01b7d313
1214
                                      #x782206bdcc60a215 #x89afea1ac506a79e
1215
                                      #x8ae9d7474cf14360 #xf6c876dd8a338ccb
1216
                                      #x43769f1729057ad1 #x8dac4d3dcfa4ca20
1217
                                      #xb7313457a6674e45 #x2018512550794f99
1218
                                      #xbb34c03eb89cf99a #xbafd20fe343aa53b
1219
                                      #x03463d5d89f7e4fe #x42bf7fd7a5a32670
1220
                                      #x3f573e8defc7b57a #xadb41c189fdd85b9
1221
                                      #xcad9750dec03dd4f #x0f43c934970c5321
1222
                                      #x2f5b9811c7751cb8 #xd85a0e0cc1e0ccd2
1223
                                      #xe048aafbad72f0e8 #xf18deca70966058b
1224
                                      #xdd9049eb47e4fdcd #xa87e5bff19d9b4a6
1225
                                      #x5df0107f1a1ddc93 #xd195bd82591f4a12
1226
                                      #x0c05f4691efbb7df #x8463feb3575b4ce0
1227
                                      #x55f643310e4406f2 #xb6f8d4972ac112e4
1228
                                      #x4030a24aa0f29e2f #xfd8818ce179db254
1229
                                      #x3c1103d066305184 #x682ea021e4d20bd7
1230
                                      #x81a9b954d15f7dff #x275dcb5fd32cc6d9
1231
                                      #xfacd82b494c83b14 #x4433056daa50f391
1232
                                      #xe9871975358d7628 #xeac12428bc7a92d6
1233
                                      #x1a85284f39bacbfc #xf8425f299199834b
1234
                                      #x676d691573de58f6 #xd05c5d42d5b916b3
1235
                                      #x8eea706046532ede #xfb046274186e67b5
1236
                                      #x134a9bc1a1454d3c #x57799eac0b15bead
1237
                                      #x241bf6025adb2227 #x72ab886edd68c02b
1238
                                      #x9ae571db6443eaa2 #xc050fbdefd0bbf71
1239
                                      #xa5b24f568b845fd8 #xe84ef9b5b92b2a89
1240
                                      #x6f6b3a5b67878297 #xc6dc8164f2f86a90
1241
                                      #x7eae7c07c39377f4 #x5eb62d2293ea386d
1242
                                      #x8c65adfd43029681 #x2dd4458cc224a4e7
1243
                                      #xfece25939e6a56aa #xcd9cef776f56540f
1244
                                      #xa33e35ec84778a39 #xc2df2643f85a072e
1245
                                      #xbc715a443bc970da #xa07808b10d806ec7
1246
                                      #x36988d03773833ba #x1680dc2627417c23
1247
                                      #xcb1095cd60a581ee #xbdb8ba84b76f2c7b
1248
                                      #x702455f3d8397874 #x35deb05efecfd744
1249
                                      #x8f2390a0caf5727f #xb1bd4eeda9949ba4
1250
                                      #x39db4437e034609b #xe582ed1c2b76c1f7
1251
                                      #xc4535cf9f7a9d2cf #xb2fb73b020637f5a
1252
                                      #x583a57989c19ed8c #x25d216c2d67d7e86
1253
                                      #x0806534e1459da61 #x6b689d7c6d25ef29
1254
                                      #x0dcc14a9925deb7e #xc99f485065f439b1
1255
                                      #xa9b7bb3f957fe807 #x2a91dff641712da7
1256
                                      #x1c0952f536491e1d #x75ee12145e3d496b
1257
                                      #xf98bbfe91d3fdfea #x92e32295701a30c3
1258
                                      #x3e9ede4d6361e9db #x76a82f49d7caad95
1259
                                      #x9da0eba1e71663e2 #x09cfb38e98ff86c0
1260
                                      #x9c690b616bb03f43 #xdad5d391c4b1748d
1261
                                      #x3812a4f76c923c3a #x5f7fcde21f4c64cc
1262
                                      #x6aa17dbce183b388 #xeec2830fb6d8ff68
1263
                                      #x736268ae51ce9c8a #xa47baf9607220379
1264
                                      #x543fa3f182e25a53 #x4eba8bbebb5891af
1265
                                      #x2e9278d14bd34019 #x69e740e168745776
1266
                                      #x37516dc3fb9e6f1b #xb3329370acc523fb
1267
                                      #x3a9d796a69c38465 #x7761cf895b6cf134
1268
                                      #x0000000000000000 #x88660ada49a0fb3f
1269
                                      #xb5bee9caa336f61a #x5b7c6ac515ee0972
1270
                                      #x52b3d94b8d118fb2 #x329b2a247d9a5e04
1271
                                      #x0e8a29f41baa0f80 #x642b5448fa29bc08
1272
                                      #x7b643be0459746eb #xd45ffa65df1b7b0d
1273
                                      #xeb08c4e830dcce77 #xf2cbd1fa8091e175
1274
                                      #xf302313a0c37bdd4 #x91a51fc8f9edd43d
1275
                                      #xef0b63cf3a7ea3c9 #xc316c68374fc5b8f
1276
                                      #x01c9e0c08ca65ca1 #x3417509e72698be5
1277
                                      #x4775383023a7176f #x636ece32797c3548
1278
                                      #x1b4cc88fb51c975d #x140f01bb2210c47c
1279
                                      #x7427f2d4d29b15ca #xa73d92cb8ed5e787
1280
                                      #xc71561a47e5e3631 #xaaf186621c880cf9
1281
                                      #x6028f36ff08bd1b6 #x97296572f61e01dc
1282
                                      #xc59abc397b0f8e6e #xec4d5e92b3894737
1283
                                      #xb872fd63316b1d64 #xaf3bc1859a8c3de6
1284
                                      #x0403a7270aa26dbe #x26942b9f5f8a9a78
1285
                                      #x86ec232e520af4bf #x49ff11c4380d18ef
1286
                                      #xf701961d0695d06a #x56b07e6c87b3e20c
1287
                                      #xd5961aa553bd27ac #x61e113af7c2d8d17
1288
                                      #x100ca69c28b2a9c2 #xcf1332ea6a07ec50
1289
                                      #xc856a890e9526510 #x2b583f36cdd77106
1290
                                      #x932ac255fcbc6c62 #x0b406e139dae3e9f
1291
                                      #x832664c9d40ec5a0 #x3014f7b978cbe65b
1292
                                      #x2c1da54c4e82f846 #x986aac46611252fd)
1293
                                     (#x679cc74f352b557f #x376719b23e9424bf
1294
                                      #xcc14a9925deb7e0d #xb07e6c87b3e20c56
1295
                                      #xa17dbce183b3886a #xee12145e3d496b75
1296
                                      #x406e139dae3e9f0b #x942b9f5f8a9a7826
1297
                                      #xb24f568b845fd8a5 #xdf2643f85a072ec2
1298
                                      #x8c7aba0ff3d5e106 #x0b63cf3a7ea3c9ef
1299
                                      #x12a4f76c923c3a38 #x8bbfe91d3fdfeaf9
1300
                                      #x9278d14bd340192e #xca47e78604311f05
1301
                                      #x07c55312cc0a0bff #xcfb38e98ff86c009
1302
                                      #x991b1e71ade3d0c1 #x16c68374fc5b8fc3
1303
                                      #x39f0bf96bb80325c #x3d92cb8ed5e787a7
1304
                                      #xac4d3dcfa4ca208d #xfae5ad26f6af3045
1305
                                      #x63feb3575b4ce084 #x28f36ff08bd1b660
1306
                                      #xc6e17baeb698dd15 #x84be523f2f1b96ed
1307
                                      #x3c04d6884037ed50 #xce25939e6a56aafe
1308
                                      #xa34c86edb40e5c99 #xebe67d40c6feb479
1309
                                      #x27f2d4d29b15ca74 #x6d691573de58f667
1310
                                      #x329370acc523fbb3 #x2c911be8e5b6039b
1311
                                      #x871975358d7628e9 #x550fb7e3f008aecc
1312
                                      #x7e5bff19d9b4a6a8 #xf8d4972ac112e4b6
1313
                                      #xd1b1e5dcdf133821 #xfcb6e332af75514d
1314
                                      #x1e026b442095f828 #x1f947642b54592df
1315
                                      #x5e6c78d98eab6723 #x17509e72698be534
1316
                                      #x2ac255fcbc6c6293 #x95bd82591f4a12d1
1317
                                      #x799eac0b15bead57 #xf0107f1a1ddc935d
1318
                                      #xd674b6ce131933de #xf5e41604e66b4c51
1319
                                      #x8818ce179db254fd #x03a7270aa26dbe04
1320
                                      #x1c33514817282cdb #x2f363ce247dbbd9f
1321
                                      #xa72ef2f5da69e962 #x93eecc4d469073d9
1322
                                      #xb92c99b1fafc114a #x77090a2f90aabbb4
1323
                                      #x0ca69c28b2a9c210 #xc9e0c08ca65ca101
1324
                                      #x4b0ddca7d09d56e4 #x988d03773833ba36
1325
                                      #x06534e1459da6108 #x3a57989c19ed8c58
1326
                                      #x0952f536491e1d1c #x0af5d23ceb73a318
1327
                                      #x0d30812e2779a8e7 #xd7e2abc886c95929
1328
                                      #xa51fc8f9edd43d91 #x690b616bb03f439c
1329
                                      #x516dc3fb9e6f1b37 #xa489d5ff78045766
1330
                                      #x52cae4f13c02a533 #x4cc88fb51c975d1b
1331
                                      #x459a7a8355894007 #x9d796a69c384653a
1332
                                      #x313457a6674e45b7 #x4a9bc1a1454d3c13
1333
                                      #x6268ae51ce9c8a73 #xfe87d93e98c885be
1334
                                      #xff11c4380d18ef49 #x8deca70966058bf1
1335
                                      #xdeb05efecfd74435 #xd027f8da4ac352d6
1336
                                      #xf186621c880cf9aa #x43c934970c53210f
1337
                                      #xbee9caa336f61ab5 #x56a890e9526510c8
1338
                                      #xe8415a4a64930a7d #xe32295701a30c392
1339
                                      #x3e35ec84778a39a3 #x4f6fa8bfbefae31f
1340
                                      #x5dcb5fd32cc6d927 #x9f485065f439b1c9
1341
                                      #x1095cd60a581eecb #x978cb85528f7c622
1342
                                      #x7baf9607220379a4 #xd216c2d67d7e8625
1343
                                      #xe4e7c662d63ac86d #xb62d2293ea386d5e
1344
                                      #x8a29f41baa0f800e #x5ffa65df1b7b0dd4
1345
                                      #x61cf895b6cf13477 #xa6b8eff34fb98395
1346
                                      #x814a3b21d4ac49e1 #xaddb20c9311a4a7a
1347
                                      #x74ae2d2532c705b0 #x30a24aa0f29e2f40
1348
                                      #x91dff641712da72a #x9049eb47e4fdcddd
1349
                                      #x493ce6abe7208217 #x36f104b4ab444e48
1350
                                      #xf22145162a6147ae #x5c5d42d5b916b3d0
1351
                                      #xf7d52c08d1d698a2 #x7a398b01b7d31353
1352
                                      #x6cff08754b889c90 #x14f7b978cbe65b30
1353
                                      #xc4d041a2812509e6 #xe085b27ab85d7d96
1354
                                      #xc0b235baef42bc1d #x868f683318a6421e
1355
                                      #xea706046532ede8e #x4ef9b5b92b2a89e8
1356
                                      #xdc8164f2f86a90c6 #x2455f3d839787470
1357
                                      #x5499aae565d8c43b #x59a92bcb42a16cdc
1358
                                      #xa9b954d15f7dff81 #xae7c07c39377f47e
1359
                                      #x01961d0695d06af7 #xdb4437e034609b39
1360
                                      #x3bc1859a8c3de6af #xaa1e73dbfd104185
1361
                                      #x7dfcd8137bd918ac #x80dc2627417c2316
1362
                                      #xd9750dec03dd4fca #xc5465ca414f56311
1363
                                      #x203787c0571fc18b #xd5d391c4b1748dda
1364
                                      #xc2830fb6d8ff68ee #xbcd8f0af014bce46
1365
                                      #xa0eba1e71663e29d #xfb73b020637f5ab2
1366
                                      #x7c6ac515ee09725b #x0000000000000000
1367
                                      #xc876dd8a338ccbf6 #x9cef776f56540fcd
1368
                                      #x47ab408f623494f4 #xcbd1fa8091e175f2
1369
                                      #x9abc397b0f8e6ec5 #xb58a05994855d35a
1370
                                      #x4d5e92b3894737ec #x961aa553bd27acd5
1371
                                      #xc31512b04d2f0219 #xe6d6fc6ee1871c9e
1372
                                      #xe2b488768fe0a965 #xb3d94b8d118fb252
1373
                                      #x440c6785c0592af0 #x25c3eedeaca81e87
1374
                                      #x583f36cdd771062b #x2d0706ee7066696c
1375
                                      #x425f299199834bf8 #xfd20fe343aa53bba
1376
                                      #xf643310e4406f255 #xdad22ae6a1b0f1ce
1377
                                      #x1da54c4e82f8462c #x355623be0929f04c
1378
                                      #x769f1729057ad143 #xbd4eeda9949ba4b1
1379
                                      #xd8e310ea960d253d #x736b7e37fecd0e4f
1380
                                      #x65adfd430296818c #xb8ba84b76f2c7bbd
1381
                                      #x9b2a247d9a5e0432 #xc77766a82348b7e2
1382
                                      #x08c4e830dcce77eb #x0e97a624851416e3
1383
                                      #x898ed31108623e0a #xe571db6443eaa29a
1384
                                      #x573e8defc7b57a3f #x21a19ac6c2cfab7c
1385
                                      #x70cc593d5ca0b04b #x2664c9d40ec5a083
1386
                                      #x296572f61e01dc97 #x85284f39bacbfc1a
1387
                                      #x715a443bc970dabc #xef840958a8990182
1388
                                      #xcd82b494c83b14fa #x48aafbad72f0e8e0
1389
                                      #xe9d7474cf143608a #x2390a0caf5727f8f
1390
                                      #xb7bb3f957fe807a9 #x82ed1c2b76c1f7e5
1391
                                      #xbb1da3bdcd41c5b9 #x72fd63316b1d64b8
1392
                                      #x7808b10d806ec7a0 #x837b012de3119d12
1393
                                      #x689d7c6d25ef296b #x02313a0c37bdd4f3
1394
                                      #x1103d0663051843c #xab886edd68c02b72
1395
                                      #x6b3a5b678782976f #xe113af7c2d8d1761
1396
                                      #x6aac46611252fd98 #x50fbdefd0bbf71c0
1397
                                      #x2ea021e4d20bd768 #x5a0e0cc1e0ccd2d8
1398
                                      #x34c03eb89cf99abb #xb41c189fdd85b9ad
1399
                                      #x9ede4d6361e9db3e #xafea1ac506a79e89
1400
                                      #x463d5d89f7e4fe03 #x18512550794f9920
1401
                                      #x41f80e9b3beef5fc #xa82f49d7caad9576
1402
                                      #x0f01bb2210c47c14 #xec232e520af4bf86
1403
                                      #x1bf6025adb222724 #xa2da9beb21de366e
1404
                                      #xedb533549f24d571 #x643be0459746eb7b
1405
                                      #xbf7fd7a5a3267042 #x046274186e67b5fb
1406
                                      #x8e4b8003c46835f5 #x1332ea6a07ec50cf
1407
                                      #xd380dfd0e8aeecd2 #x6f582f7fe9e52294
1408
                                      #xf9428a2c54c28e41 #x3fa3f182e25a5354
1409
                                      #x535cf9f7a9d2cfc4 #x660ada49a0fb3f88
1410
                                      #x33056daa50f39144 #x8fdd9d0551b85f02
1411
                                      #x19c73856ec9ff3d7 #xb1e87181263266a1
1412
                                      #x1561a47e5e3631c7 #xd4458cc224a4e72d
1413
                                      #xe740e16874577669 #xc12428bc7a92d6ea
1414
                                      #x3866a2902e5058ab #x1a601f5c4ef24dd3
1415
                                      #x6059945df9215e80 #x05f4691efbb7df0c
1416
                                      #x5b9811c7751cb82f #x2b5448fa29bc0864
1417
                                      #xba8bbebb5891af4e #xf4720b0273bb26a6
1418
                                      #xdd1779f46dbafa31 #x6ece32797c354863
1419
                                      #x7fcde21f4c64cc5f #x2206bdcc60a21578
1420
                                      #x75383023a7176f47 #xf3b75810bfb12d59)
1421
                                     (#x03d0663051843c11 #xbfe91d3fdfeaf98b
1422
                                      #xf80e9b3beef5fc41 #xe5ad26f6af3045fa
1423
                                      #x5a443bc970dabc71 #x7b012de3119d1283
1424
                                      #x82b494c83b14facd #x750dec03dd4fcad9
1425
                                      #x090a2f90aabbb477 #xb6e332af75514dfc
1426
                                      #xadfd430296818c65 #xfd63316b1d64b872
1427
                                      #x3d5d89f7e4fe0346 #xd7474cf143608ae9
1428
                                      #x7e6c87b3e20c56b0 #x601f5c4ef24dd31a
1429
                                      #x40e16874577669e7 #x4437e034609b39db
1430
                                      #xe7c662d63ac86de4 #xaf9607220379a47b
1431
                                      #xea1ac506a79e89af #xd8f0af014bce46bc
1432
                                      #x7fd7a5a3267042bf #x9f1729057ad14376
1433
                                      #x1c189fdd85b9adb4 #x87d93e98c885befe
1434
                                      #x57989c19ed8c583a #xa4f76c923c3a3812
1435
                                      #x2a247d9a5e04329b #xc03eb89cf99abb34
1436
                                      #xf6025adb2227241b #xa890e9526510c856
1437
                                      #x06bdcc60a2157822 #xc73856ec9ff3d719
1438
                                      #xcae4f13c02a53352 #xd6fc6ee1871c9ee6
1439
                                      #xf0bf96bb80325c39 #x13af7c2d8d1761e1
1440
                                      #x3be0459746eb7b64 #x99aae565d8c43b54
1441
                                      #x95cd60a581eecb10 #x68ae51ce9c8a7362
1442
                                      #xcde21f4c64cc5f7f #xdc2627417c231680
1443
                                      #x428a2c54c28e41f9 #x76dd8a338ccbf6c8
1444
                                      #xb8eff34fb98395a6 #xa69c28b2a9c2100c
1445
                                      #x08b10d806ec7a078 #xc55312cc0a0bff07
1446
                                      #x886edd68c02b72ab #xdd9d0551b85f028f
1447
                                      #x1e73dbfd104185aa #x911be8e5b6039b2c
1448
                                      #x30812e2779a8e70d #x3a5b678782976f6b
1449
                                      #x20fe343aa53bbafd #xb954d15f7dff81a9
1450
                                      #x9a7a835589400745 #x1fc8f9edd43d91a5
1451
                                      #x0e0cc1e0ccd2d85a #xbb3f957fe807a9b7
1452
                                      #xc3eedeaca81e8725 #x66a2902e5058ab38
1453
                                      #xff08754b889c906c #xfeb3575b4ce08463
1454
                                      #x107f1a1ddc935df0 #x25939e6a56aafece
1455
                                      #xa92bcb42a16cdc59 #x32ea6a07ec50cf13
1456
                                      #x947642b54592df1f #x1779f46dbafa31dd
1457
                                      #x5623be0929f04c35 #xf2d4d29b15ca7427
1458
                                      #x59945df9215e8060 #x9370acc523fbb332
1459
                                      #xb05efecfd74435de #x71db6443eaa29ae5
1460
                                      #xe2abc886c95929d7 #x458cc224a4e72dd4
1461
                                      #xce32797c3548636e #x1aa553bd27acd596
1462
                                      #x4a3b21d4ac49e181 #x284f39bacbfc1a85
1463
                                      #xd94b8d118fb252b3 #xb235baef42bc1dc0
1464
                                      #x2643f85a072ec2df #x8bbebb5891af4eba
1465
                                      #x89d5ff78045766a4 #xeecc4d469073d993
1466
                                      #x0b616bb03f439c69 #xe41604e66b4c51f5
1467
                                      #x16c2d67d7e8625d2 #x6c78d98eab67235e
1468
                                      #x9d7c6d25ef296b68 #x64c9d40ec5a08326
1469
                                      #x2ef2f5da69e962a7 #xfa65df1b7b0dd45f
1470
                                      #x12145e3d496b75ee #xfcd8137bd918ac7d
1471
                                      #x52f536491e1d1c09 #xe67d40c6feb479eb
1472
                                      #x2145162a6147aef2 #x29f41baa0f800e8a
1473
                                      #x0000000000000000 #x840958a8990182ef
1474
                                      #xc88fb51c975d1b4c #xc68374fc5b8fc316
1475
                                      #x5d42d5b916b3d05c #x7dbce183b3886aa1
1476
                                      #x512550794f992018 #xe17baeb698dd15c6
1477
                                      #x43310e4406f255f6 #x6dc3fb9e6f1b3751
1478
                                      #x86621c880cf9aaf1 #xbc397b0f8e6ec59a
1479
                                      #x415a4a64930a7de8 #x04d6884037ed503c
1480
                                      #xe9caa336f61ab5be #x0ada49a0fb3f8866
1481
                                      #x55f3d83978747024 #x3ce6abe720821749
1482
                                      #xf5d23ceb73a3180a #xa24aa0f29e2f4030
1483
                                      #x582f7fe9e522946f #x7aba0ff3d5e1068c
1484
                                      #x313a0c37bdd4f302 #x3787c0571fc18b20
1485
                                      #x5cf9f7a9d2cfc453 #xbe523f2f1b96ed84
1486
                                      #x85b27ab85d7d96e0 #x0706ee7066696c2d
1487
                                      #x961d0695d06af701 #x1b1e71ade3d0c199
1488
                                      #xc255fcbc6c62932a #x398b01b7d313537a
1489
                                      #xcc593d5ca0b04b70 #x5f299199834bf842
1490
                                      #x80dfd0e8aeecd2d3 #x9eac0b15bead5779
1491
                                      #xef776f56540fcd9c #x2f49d7caad9576a8
1492
                                      #x2c99b1fafc114ab9 #x8d03773833ba3698
1493
                                      #x720b0273bb26a6f4 #x18ce179db254fd88
1494
                                      #x8f683318a6421e86 #x4f568b845fd8a5b2
1495
                                      #x8ed31108623e0a89 #xd22ae6a1b0f1ceda
1496
                                      #x74b6ce131933ded6 #x97a624851416e30e
1497
                                      #x6e139dae3e9f0b40 #xa7270aa26dbe0403
1498
                                      #x5448fa29bc08642b #xe310ea960d253dd8
1499
                                      #x706046532ede8eea #x485065f439b1c99f
1500
                                      #x6b7e37fecd0e4f73 #xfbdefd0bbf71c050
1501
                                      #xd391c4b1748ddad5 #xa021e4d20bd7682e
1502
                                      #xab408f623494f447 #x5bff19d9b4a6a87e
1503
                                      #xb1e5dcdf133821d1 #x026b442095f8281e
1504
                                      #xdff641712da72a91 #x11c4380d18ef49ff
1505
                                      #xae2d2532c705b074 #xc1859a8c3de6af3b
1506
                                      #x4b8003c46835f58e #x92cb8ed5e787a73d
1507
                                      #xcb5fd32cc6d9275d #x8cb85528f7c62297
1508
                                      #x9bc1a1454d3c134a #x056daa50f3914433
1509
                                      #xf4691efbb7df0c05 #xd1fa8091e175f2cb
1510
                                      #x7c07c39377f47eae #x14a9925deb7e0dcc
1511
                                      #xcf895b6cf1347761 #x0fb7e3f008aecc55
1512
                                      #x8a05994855d35ab5 #xf104b4ab444e4836
1513
                                      #x691573de58f6676d #x4eeda9949ba4b1bd
1514
                                      #x2428bc7a92d6eac1 #xb75810bfb12d59f3
1515
                                      #x63cf3a7ea3c9ef0b #x6274186e67b5fb04
1516
                                      #x1512b04d2f0219c3 #xe87181263266a1b1
1517
                                      #x1975358d7628e987 #x534e1459da610806
1518
                                      #x47e78604311f05ca #xd4972ac112e4b6f8
1519
                                      #x33514817282cdb1c #x90a0caf5727f8f23
1520
                                      #x3e8defc7b57a3f57 #x3f36cdd771062b58
1521
                                      #x796a69c384653a9d #x465ca414f56311c5
1522
                                      #x5e92b3894737ec4d #x9811c7751cb82f5b
1523
                                      #xd041a2812509e6c4 #x49eb47e4fdcddd90
1524
                                      #x78d14bd340192e92 #xf9b5b92b2a89e84e
1525
                                      #x61a47e5e3631c715 #x509e72698be53417
1526
                                      #xb533549f24d571ed #x27f8da4ac352d6d0
1527
                                      #x6572f61e01dc9729 #xde4d6361e9db3e9e
1528
                                      #x3457a6674e45b731 #xa54c4e82f8462c1d
1529
                                      #xbd82591f4a12d195 #x830fb6d8ff68eec2
1530
                                      #x383023a7176f4775 #x7766a82348b7e2c7
1531
                                      #x0c6785c0592af044 #xba84b76f2c7bbdb8
1532
                                      #xe0c08ca65ca101c9 #xeba1e71663e29da0
1533
                                      #xd52c08d1d698a2f7 #xc4e830dcce77eb08
1534
                                      #xda9beb21de366ea2 #xa3f182e25a53543f
1535
                                      #xac46611252fd986a #xb38e98ff86c009cf
1536
                                      #xf36ff08bd1b66028 #xdb20c9311a4a7aad
1537
                                      #xa19ac6c2cfab7c21 #x6ac515ee09725b7c
1538
                                      #x4c86edb40e5c99a3 #x363ce247dbbd9f2f
1539
                                      #x8164f2f86a90c6dc #x35ec84778a39a33e
1540
                                      #xb488768fe0a965e2 #x73b020637f5ab2fb
1541
                                      #x232e520af4bf86ec #x6fa8bfbefae31f4f
1542
                                      #xeca70966058bf18d #x1da3bdcd41c5b9bb
1543
                                      #x9cc74f352b557f67 #x4d3dcfa4ca208dac
1544
                                      #x2b9f5f8a9a782694 #xaafbad72f0e8e048
1545
                                      #xc934970c53210f43 #xed1c2b76c1f7e582
1546
                                      #x01bb2210c47c140f #x0ddca7d09d56e44b
1547
                                      #x2d2293ea386d5eb6 #xf7b978cbe65b3014
1548
                                      #x6719b23e9424bf37 #x2295701a30c392e3)
1549
                                     (#x9f5f8a9a7826942b #x34970c53210f43c9
1550
                                      #x9d0551b85f028fdd #xb494c83b14facd82
1551
                                      #x6edd68c02b72ab88 #xff19d9b4a6a87e5b
1552
                                      #xdb6443eaa29ae571 #x1be8e5b6039b2c91
1553
                                      #x5fd32cc6d9275dcb #x90e9526510c856a8
1554
                                      #xb27ab85d7d96e085 #xa47e5e3631c71561
1555
                                      #xf3d8397874702455 #xfbad72f0e8e048aa
1556
                                      #x37e034609b39db44 #xfa8091e175f2cbd1
1557
                                      #xcaa336f61ab5bee9 #xeff34fb98395a6b8
1558
                                      #x63316b1d64b872fd #xba0ff3d5e1068c7a
1559
                                      #xcd60a581eecb1095 #x35baef42bc1dc0b2
1560
                                      #x23be0929f04c3556 #x4b8d118fb252b3d9
1561
                                      #xd8137bd918ac7dfc #x0a2f90aabbb47709
1562
                                      #xc2d67d7e8625d216 #x7181263266a1b1e8
1563
                                      #x3023a7176f477538 #x7642b54592df1f94
1564
                                      #xf2f5da69e962a72e #xa70966058bf18dec
1565
                                      #xc662d63ac86de4e7 #x939e6a56aafece25
1566
                                      #x86edb40e5c99a34c #xf8da4ac352d6d027
1567
                                      #x145e3d496b75ee12 #xce179db254fd8818
1568
                                      #xd23ceb73a3180af5 #x270aa26dbe0403a7
1569
                                      #x5d89f7e4fe03463d #x2ae6a1b0f1cedad2
1570
                                      #x1729057ad143769f #xb10d806ec7a07808
1571
                                      #x4f39bacbfc1a8528 #xeda9949ba4b1bd4e
1572
                                      #x5312cc0a0bff07c5 #xc4380d18ef49ff11
1573
                                      #x95701a30c392e322 #xa0caf5727f8f2390
1574
                                      #x55fcbc6c62932ac2 #xcf3a7ea3c9ef0b63
1575
                                      #x621c880cf9aaf186 #xfd430296818c65ad
1576
                                      #xbf96bb80325c39f0 #x6c87b3e20c56b07e
1577
                                      #x299199834bf8425f #x74186e67b5fb0462
1578
                                      #x4c4e82f8462c1da5 #x64f2f86a90c6dc81
1579
                                      #x6b442095f8281e02 #x1d0695d06af70196
1580
                                      #xd5ff78045766a489 #x3856ec9ff3d719c7
1581
                                      #xac0b15bead57799e #xc3fb9e6f1b37516d
1582
                                      #x8e98ff86c009cfb3 #x49d7caad9576a82f
1583
                                      #x859a8c3de6af3bc1 #x3dcfa4ca208dac4d
1584
                                      #x91c4b1748ddad5d3 #x8a2c54c28e41f942
1585
                                      #x2bcb42a16cdc59a9 #x9e72698be5341750
1586
                                      #x1e71ade3d0c1991b #xe6abe7208217493c
1587
                                      #x3a0c37bdd4f30231 #x945df9215e806059
1588
                                      #xcc4d469073d993ee #x0e9b3beef5fc41f8
1589
                                      #x8b01b7d313537a39 #xf182e25a53543fa3
1590
                                      #x5810bfb12d59f3b7 #x8003c46835f58e4b
1591
                                      #xbce183b3886aa17d #x1604e66b4c51f5e4
1592
                                      #x2c08d1d698a2f7d5 #xc08ca65ca101c9e0
1593
                                      #x7a8355894007459a #xe21f4c64cc5f7fcd
1594
                                      #x88768fe0a965e2b4 #x82591f4a12d195bd
1595
                                      #x4aa0f29e2f4030a2 #xdca7d09d56e44b0d
1596
                                      #x6daa50f391443305 #x92b3894737ec4d5e
1597
                                      #xa8bfbefae31f4f6f #xea6a07ec50cf1332
1598
                                      #x2293ea386d5eb62d #x41a2812509e6c4d0
1599
                                      #x8374fc5b8fc316c6 #x683318a6421e868f
1600
                                      #xb3575b4ce08463fe #xe5dcdf133821d1b1
1601
                                      #xd6884037ed503c04 #x05994855d35ab58a
1602
                                      #x5b678782976f6b3a #x397b0f8e6ec59abc
1603
                                      #xabc886c95929d7e2 #xe4f13c02a53352ca
1604
                                      #xb5b92b2a89e84ef9 #xaf7c2d8d1761e113
1605
                                      #x75358d7628e98719 #x72f61e01dc972965
1606
                                      #x78d98eab67235e6c #xc8f9edd43d91a51f
1607
                                      #x0fb6d8ff68eec283 #x70acc523fbb33293
1608
                                      #x36cdd771062b583f #xbdcc60a215782206
1609
                                      #xa624851416e30e97 #x9607220379a47baf
1610
                                      #x1c2b76c1f7e582ed #x6046532ede8eea70
1611
                                      #xbebb5891af4eba8b #x48fa29bc08642b54
1612
                                      #x19b23e9424bf3767 #x2627417c231680dc
1613
                                      #x65df1b7b0dd45ffa #xf536491e1d1c0952
1614
                                      #x54d15f7dff81a9b9 #x2550794f99201851
1615
                                      #xdefd0bbf71c050fb #x87c0571fc18b2037
1616
                                      #x10ea960d253dd8e3 #xe0459746eb7b643b
1617
                                      #x12b04d2f0219c315 #xaae565d8c43b5499
1618
                                      #xe91d3fdfeaf98bbf #xf76c923c3a3812a4
1619
                                      #x1f5c4ef24dd31a60 #x812e2779a8e70d30
1620
                                      #xf41baa0f800e8a29 #xfc6ee1871c9ee6d6
1621
                                      #x8fb51c975d1b4cc8 #x4e1459da61080653
1622
                                      #x310e4406f255f643 #x0cc1e0ccd2d85a0e
1623
                                      #x0958a8990182ef84 #xa9925deb7e0dcc14
1624
                                      #x6a69c384653a9d79 #x04b4ab444e4836f1
1625
                                      #x0dec03dd4fcad975 #xeb47e4fdcddd9049
1626
                                      #x7e37fecd0e4f736b #x73dbfd104185aa1e
1627
                                      #xc515ee09725b7c6a #xae51ce9c8a736268
1628
                                      #xa3bdcd41c5b9bb1d #x84b76f2c7bbdb8ba
1629
                                      #x443bc970dabc715a #xa1e71663e29da0eb
1630
                                      #x7f1a1ddc935df010 #x474cf143608ae9d7
1631
                                      #x33549f24d571edb5 #xc9d40ec5a0832664
1632
                                      #x46611252fd986aac #x5efecfd74435deb0
1633
                                      #x0000000000000000 #x514817282cdb1c33
1634
                                      #x408f623494f447ab #x57a6674e45b73134
1635
                                      #x11c7751cb82f5b98 #x989c19ed8c583a57
1636
                                      #x7baeb698dd15c6e1 #x06ee7066696c2d07
1637
                                      #xda49a0fb3f88660a #x07c39377f47eae7c
1638
                                      #x2d2532c705b074ae #x42d5b916b3d05c5d
1639
                                      #xec84778a39a33e35 #x776f56540fcd9cef
1640
                                      #xa553bd27acd5961a #xb978cbe65b3014f7
1641
                                      #x895b6cf1347761cf #xb85528f7c622978c
1642
                                      #x66a82348b7e2c777 #xe830dcce77eb08c4
1643
                                      #x189fdd85b9adb41c #x99b1fafc114ab92c
1644
                                      #x0b0273bb26a6f472 #xeedeaca81e8725c3
1645
                                      #x6785c0592af0440c #x247d9a5e04329b2a
1646
                                      #x21e4d20bd7682ea0 #xbb2210c47c140f01
1647
                                      #x523f2f1b96ed84be #xd4d29b15ca7427f2
1648
                                      #x45162a6147aef221 #xf641712da72a91df
1649
                                      #xb020637f5ab2fb73 #xdd8a338ccbf6c876
1650
                                      #x5ca414f56311c546 #x3f957fe807a9b7bb
1651
                                      #x8cc224a4e72dd445 #x012de3119d12837b
1652
                                      #xd0663051843c1103 #x5a4a64930a7de841
1653
                                      #x28bc7a92d6eac124 #x08754b889c906cff
1654
                                      #xd7a5a3267042bf7f #x3ce247dbbd9f2f36
1655
                                      #x6ff08bd1b66028f3 #xd14bd340192e9278
1656
                                      #x139dae3e9f0b406e #xe78604311f05ca47
1657
                                      #xd93e98c885befe87 #x616bb03f439c690b
1658
                                      #x03773833ba36988d #xcb8ed5e787a73d92
1659
                                      #xb7e3f008aecc550f #x9c28b2a9c2100ca6
1660
                                      #x3eb89cf99abb34c0 #x3b21d4ac49e1814a
1661
                                      #xdfd0e8aeecd2d380 #x7c6d25ef296b689d
1662
                                      #xc1a1454d3c134a9b #xf9f7a9d2cfc4535c
1663
                                      #xc74f352b557f679c #x7d40c6feb479ebe6
1664
                                      #x1573de58f6676d69 #x1ac506a79e89afea
1665
                                      #x568b845fd8a5b24f #x32797c3548636ece
1666
                                      #x691efbb7df0c05f4 #x972ac112e4b6f8d4
1667
                                      #x79f46dbafa31dd17 #x2e520af4bf86ec23
1668
                                      #xd31108623e0a898e #x8defc7b57a3f573e
1669
                                      #x025adb2227241bf6 #xa2902e5058ab3866
1670
                                      #xfe343aa53bbafd20 #xad26f6af3045fae5
1671
                                      #x43f85a072ec2df26 #x2f7fe9e522946f58
1672
                                      #x9beb21de366ea2da #x20c9311a4a7aaddb
1673
                                      #x5065f439b1c99f48 #x593d5ca0b04b70cc
1674
                                      #x9ac6c2cfab7c21a1 #xb6ce131933ded674
1675
                                      #xf0af014bce46bcd8 #x4d6361e9db3e9ede
1676
                                      #xe16874577669e740 #xe332af75514dfcb6)
1677
                                     (#xbfbefae31f4f6fa8 #x85c0592af0440c67
1678
                                      #xbaef42bc1dc0b235 #x5528f7c622978cb8
1679
                                      #xe6a1b0f1cedad22a #x3ceb73a3180af5d2
1680
                                      #x7fe9e522946f582f #xa7d09d56e44b0ddc
1681
                                      #x754b889c906cff08 #xe247dbbd9f2f363c
1682
                                      #x81263266a1b1e871 #xdcdf133821d1b1e5
1683
                                      #xf46dbafa31dd1779 #x3d5ca0b04b70cc59
1684
                                      #x56ec9ff3d719c738 #xdeaca81e8725c3ee
1685
                                      #x549f24d571edb533 #x2de3119d12837b01
1686
                                      #xea960d253dd8e310 #xc886c95929d7e2ab
1687
                                      #x2f90aabbb477090a #x26f6af3045fae5ad
1688
                                      #x6ee1871c9ee6d6fc #x3e98c885befe87d9
1689
                                      #x24851416e30e97a6 #xda4ac352d6d027f8
1690
                                      #xe3f008aecc550fb7 #x994855d35ab58a05
1691
                                      #x5df9215e80605994 #x58a8990182ef8409
1692
                                      #xb1fafc114ab92c99 #x442095f8281e026b
1693
                                      #xf5da69e962a72ef2 #xc0571fc18b203787
1694
                                      #x37fecd0e4f736b7e #x902e5058ab3866a2
1695
                                      #xeb21de366ea2da9b #x8f623494f447ab40
1696
                                      #xd98eab67235e6c78 #xa414f56311c5465c
1697
                                      #x5c4ef24dd31a601f #x08d1d698a2f7d52c
1698
                                      #xdbfd104185aa1e73 #xcb42a16cdc59a92b
1699
                                      #x10bfb12d59f3b758 #xa82348b7e2c77766
1700
                                      #xbdcd41c5b9bb1da3 #x7ab85d7d96e085b2
1701
                                      #xedb40e5c99a34c86 #xff78045766a489d5
1702
                                      #xf34fb98395a6b8ef #x4f352b557f679cc7
1703
                                      #x4a64930a7de8415a #xe8e5b6039b2c911b
1704
                                      #xb4ab444e4836f104 #x4817282cdb1c3351
1705
                                      #xaeb698dd15c6e17b #x3f2f1b96ed84be52
1706
                                      #x21d4ac49e1814a3b #x884037ed503c04d6
1707
                                      #xbe0929f04c355623 #xe565d8c43b5499aa
1708
                                      #x1108623e0a898ed3 #x2532c705b074ae2d
1709
                                      #x0551b85f028fdd9d #x03c46835f58e4b80
1710
                                      #xf13c02a53352cae4 #xee7066696c2d0706
1711
                                      #xc6c2cfab7c21a19a #xb04d2f0219c31512
1712
                                      #x0273bb26a6f4720b #x8604311f05ca47e7
1713
                                      #xaf014bce46bcd8f0 #x3318a6421e868f68
1714
                                      #x96bb80325c39f0bf #x40c6feb479ebe67d
1715
                                      #x12cc0a0bff07c553 #x162a6147aef22145
1716
                                      #x71ade3d0c1991b1e #xce131933ded674b6
1717
                                      #xc9311a4a7aaddb20 #x32af75514dfcb6e3
1718
                                      #x62d63ac86de4e7c6 #xb23e9424bf376719
1719
                                      #x8355894007459a7a #x137bd918ac7dfcd8
1720
                                      #x42b54592df1f9476 #xabe7208217493ce6
1721
                                      #x9b3beef5fc41f80e #x2e2779a8e70d3081
1722
                                      #x4d469073d993eecc #x768fe0a965e2b488
1723
                                      #xd0e8aeecd2d380df #xa2812509e6c4d041
1724
                                      #x0ff3d5e1068c7aba #x04e66b4c51f5e416
1725
                                      #x2c54c28e41f9428a #x01b7d313537a398b
1726
                                      #xcc60a215782206bd #xc506a79e89afea1a
1727
                                      #x4cf143608ae9d747 #x8a338ccbf6c876dd
1728
                                      #x29057ad143769f17 #xcfa4ca208dac4d3d
1729
                                      #xa6674e45b7313457 #x50794f9920185125
1730
                                      #xb89cf99abb34c03e #x343aa53bbafd20fe
1731
                                      #x89f7e4fe03463d5d #xa5a3267042bf7fd7
1732
                                      #xefc7b57a3f573e8d #x9fdd85b9adb41c18
1733
                                      #xec03dd4fcad9750d #x970c53210f43c934
1734
                                      #xc7751cb82f5b9811 #xc1e0ccd2d85a0e0c
1735
                                      #xad72f0e8e048aafb #x0966058bf18deca7
1736
                                      #x47e4fdcddd9049eb #x19d9b4a6a87e5bff
1737
                                      #x1a1ddc935df0107f #x591f4a12d195bd82
1738
                                      #x1efbb7df0c05f469 #x575b4ce08463feb3
1739
                                      #x0e4406f255f64331 #x2ac112e4b6f8d497
1740
                                      #xa0f29e2f4030a24a #x179db254fd8818ce
1741
                                      #x663051843c1103d0 #xe4d20bd7682ea021
1742
                                      #xd15f7dff81a9b954 #xd32cc6d9275dcb5f
1743
                                      #x94c83b14facd82b4 #xaa50f3914433056d
1744
                                      #x358d7628e9871975 #xbc7a92d6eac12428
1745
                                      #x39bacbfc1a85284f #x9199834bf8425f29
1746
                                      #x73de58f6676d6915 #xd5b916b3d05c5d42
1747
                                      #x46532ede8eea7060 #x186e67b5fb046274
1748
                                      #xa1454d3c134a9bc1 #x0b15bead57799eac
1749
                                      #x5adb2227241bf602 #xdd68c02b72ab886e
1750
                                      #x6443eaa29ae571db #xfd0bbf71c050fbde
1751
                                      #x8b845fd8a5b24f56 #xb92b2a89e84ef9b5
1752
                                      #x678782976f6b3a5b #xf2f86a90c6dc8164
1753
                                      #xc39377f47eae7c07 #x93ea386d5eb62d22
1754
                                      #x430296818c65adfd #xc224a4e72dd4458c
1755
                                      #x9e6a56aafece2593 #x6f56540fcd9cef77
1756
                                      #x84778a39a33e35ec #xf85a072ec2df2643
1757
                                      #x3bc970dabc715a44 #x0d806ec7a07808b1
1758
                                      #x773833ba36988d03 #x27417c231680dc26
1759
                                      #x60a581eecb1095cd #xb76f2c7bbdb8ba84
1760
                                      #xd8397874702455f3 #xfecfd74435deb05e
1761
                                      #xcaf5727f8f2390a0 #xa9949ba4b1bd4eed
1762
                                      #xe034609b39db4437 #x2b76c1f7e582ed1c
1763
                                      #xf7a9d2cfc4535cf9 #x20637f5ab2fb73b0
1764
                                      #x9c19ed8c583a5798 #xd67d7e8625d216c2
1765
                                      #x1459da610806534e #x6d25ef296b689d7c
1766
                                      #x925deb7e0dcc14a9 #x65f439b1c99f4850
1767
                                      #x957fe807a9b7bb3f #x41712da72a91dff6
1768
                                      #x36491e1d1c0952f5 #x5e3d496b75ee1214
1769
                                      #x1d3fdfeaf98bbfe9 #x701a30c392e32295
1770
                                      #x6361e9db3e9ede4d #xd7caad9576a82f49
1771
                                      #xe71663e29da0eba1 #x98ff86c009cfb38e
1772
                                      #x6bb03f439c690b61 #xc4b1748ddad5d391
1773
                                      #x6c923c3a3812a4f7 #x1f4c64cc5f7fcde2
1774
                                      #xe183b3886aa17dbc #xb6d8ff68eec2830f
1775
                                      #x51ce9c8a736268ae #x07220379a47baf96
1776
                                      #x82e25a53543fa3f1 #xbb5891af4eba8bbe
1777
                                      #x4bd340192e9278d1 #x6874577669e740e1
1778
                                      #xfb9e6f1b37516dc3 #xacc523fbb3329370
1779
                                      #x69c384653a9d796a #x5b6cf1347761cf89
1780
                                      #x0000000000000000 #x49a0fb3f88660ada
1781
                                      #xa336f61ab5bee9ca #x15ee09725b7c6ac5
1782
                                      #x8d118fb252b3d94b #x7d9a5e04329b2a24
1783
                                      #x1baa0f800e8a29f4 #xfa29bc08642b5448
1784
                                      #x459746eb7b643be0 #xdf1b7b0dd45ffa65
1785
                                      #x30dcce77eb08c4e8 #x8091e175f2cbd1fa
1786
                                      #x0c37bdd4f302313a #xf9edd43d91a51fc8
1787
                                      #x3a7ea3c9ef0b63cf #x74fc5b8fc316c683
1788
                                      #x8ca65ca101c9e0c0 #x72698be53417509e
1789
                                      #x23a7176f47753830 #x797c3548636ece32
1790
                                      #xb51c975d1b4cc88f #x2210c47c140f01bb
1791
                                      #xd29b15ca7427f2d4 #x8ed5e787a73d92cb
1792
                                      #x7e5e3631c71561a4 #x1c880cf9aaf18662
1793
                                      #xf08bd1b66028f36f #xf61e01dc97296572
1794
                                      #x7b0f8e6ec59abc39 #xb3894737ec4d5e92
1795
                                      #x316b1d64b872fd63 #x9a8c3de6af3bc185
1796
                                      #x0aa26dbe0403a727 #x5f8a9a7826942b9f
1797
                                      #x520af4bf86ec232e #x380d18ef49ff11c4
1798
                                      #x0695d06af701961d #x87b3e20c56b07e6c
1799
                                      #x53bd27acd5961aa5 #x7c2d8d1761e113af
1800
                                      #x28b2a9c2100ca69c #x6a07ec50cf1332ea
1801
                                      #xe9526510c856a890 #xcdd771062b583f36
1802
                                      #xfcbc6c62932ac255 #x9dae3e9f0b406e13
1803
                                      #xd40ec5a0832664c9 #x78cbe65b3014f7b9
1804
                                      #x4e82f8462c1da54c #x611252fd986aac46)
1805
                                     (#x352b557f679cc74f #x3e9424bf376719b2
1806
                                      #x5deb7e0dcc14a992 #xb3e20c56b07e6c87
1807
                                      #x83b3886aa17dbce1 #x3d496b75ee12145e
1808
                                      #xae3e9f0b406e139d #x8a9a7826942b9f5f
1809
                                      #x845fd8a5b24f568b #x5a072ec2df2643f8
1810
                                      #xf3d5e1068c7aba0f #x7ea3c9ef0b63cf3a
1811
                                      #x923c3a3812a4f76c #x3fdfeaf98bbfe91d
1812
                                      #xd340192e9278d14b #x04311f05ca47e786
1813
                                      #xcc0a0bff07c55312 #xff86c009cfb38e98
1814
                                      #xade3d0c1991b1e71 #xfc5b8fc316c68374
1815
                                      #xbb80325c39f0bf96 #xd5e787a73d92cb8e
1816
                                      #xa4ca208dac4d3dcf #xf6af3045fae5ad26
1817
                                      #x5b4ce08463feb357 #x8bd1b66028f36ff0
1818
                                      #xb698dd15c6e17bae #x2f1b96ed84be523f
1819
                                      #x4037ed503c04d688 #x6a56aafece25939e
1820
                                      #xb40e5c99a34c86ed #xc6feb479ebe67d40
1821
                                      #x9b15ca7427f2d4d2 #xde58f6676d691573
1822
                                      #xc523fbb3329370ac #xe5b6039b2c911be8
1823
                                      #x8d7628e987197535 #xf008aecc550fb7e3
1824
                                      #xd9b4a6a87e5bff19 #xc112e4b6f8d4972a
1825
                                      #xdf133821d1b1e5dc #xaf75514dfcb6e332
1826
                                      #x2095f8281e026b44 #xb54592df1f947642
1827
                                      #x8eab67235e6c78d9 #x698be53417509e72
1828
                                      #xbc6c62932ac255fc #x1f4a12d195bd8259
1829
                                      #x15bead57799eac0b #x1ddc935df0107f1a
1830
                                      #x131933ded674b6ce #xe66b4c51f5e41604
1831
                                      #x9db254fd8818ce17 #xa26dbe0403a7270a
1832
                                      #x17282cdb1c335148 #x47dbbd9f2f363ce2
1833
                                      #xda69e962a72ef2f5 #x469073d993eecc4d
1834
                                      #xfafc114ab92c99b1 #x90aabbb477090a2f
1835
                                      #xb2a9c2100ca69c28 #xa65ca101c9e0c08c
1836
                                      #xd09d56e44b0ddca7 #x3833ba36988d0377
1837
                                      #x59da610806534e14 #x19ed8c583a57989c
1838
                                      #x491e1d1c0952f536 #xeb73a3180af5d23c
1839
                                      #x2779a8e70d30812e #x86c95929d7e2abc8
1840
                                      #xedd43d91a51fc8f9 #xb03f439c690b616b
1841
                                      #x9e6f1b37516dc3fb #x78045766a489d5ff
1842
                                      #x3c02a53352cae4f1 #x1c975d1b4cc88fb5
1843
                                      #x55894007459a7a83 #xc384653a9d796a69
1844
                                      #x674e45b7313457a6 #x454d3c134a9bc1a1
1845
                                      #xce9c8a736268ae51 #x98c885befe87d93e
1846
                                      #x0d18ef49ff11c438 #x66058bf18deca709
1847
                                      #xcfd74435deb05efe #x4ac352d6d027f8da
1848
                                      #x880cf9aaf186621c #x0c53210f43c93497
1849
                                      #x36f61ab5bee9caa3 #x526510c856a890e9
1850
                                      #x64930a7de8415a4a #x1a30c392e3229570
1851
                                      #x778a39a33e35ec84 #xbefae31f4f6fa8bf
1852
                                      #x2cc6d9275dcb5fd3 #xf439b1c99f485065
1853
                                      #xa581eecb1095cd60 #x28f7c622978cb855
1854
                                      #x220379a47baf9607 #x7d7e8625d216c2d6
1855
                                      #xd63ac86de4e7c662 #xea386d5eb62d2293
1856
                                      #xaa0f800e8a29f41b #x1b7b0dd45ffa65df
1857
                                      #x6cf1347761cf895b #x4fb98395a6b8eff3
1858
                                      #xd4ac49e1814a3b21 #x311a4a7aaddb20c9
1859
                                      #x32c705b074ae2d25 #xf29e2f4030a24aa0
1860
                                      #x712da72a91dff641 #xe4fdcddd9049eb47
1861
                                      #xe7208217493ce6ab #xab444e4836f104b4
1862
                                      #x2a6147aef2214516 #xb916b3d05c5d42d5
1863
                                      #xd1d698a2f7d52c08 #xb7d313537a398b01
1864
                                      #x4b889c906cff0875 #xcbe65b3014f7b978
1865
                                      #x812509e6c4d041a2 #xb85d7d96e085b27a
1866
                                      #xef42bc1dc0b235ba #x18a6421e868f6833
1867
                                      #x532ede8eea706046 #x2b2a89e84ef9b5b9
1868
                                      #xf86a90c6dc8164f2 #x397874702455f3d8
1869
                                      #x65d8c43b5499aae5 #x42a16cdc59a92bcb
1870
                                      #x5f7dff81a9b954d1 #x9377f47eae7c07c3
1871
                                      #x95d06af701961d06 #x34609b39db4437e0
1872
                                      #x8c3de6af3bc1859a #xfd104185aa1e73db
1873
                                      #x7bd918ac7dfcd813 #x417c231680dc2627
1874
                                      #x03dd4fcad9750dec #x14f56311c5465ca4
1875
                                      #x571fc18b203787c0 #xb1748ddad5d391c4
1876
                                      #xd8ff68eec2830fb6 #x014bce46bcd8f0af
1877
                                      #x1663e29da0eba1e7 #x637f5ab2fb73b020
1878
                                      #xee09725b7c6ac515 #x0000000000000000
1879
                                      #x338ccbf6c876dd8a #x56540fcd9cef776f
1880
                                      #x623494f447ab408f #x91e175f2cbd1fa80
1881
                                      #x0f8e6ec59abc397b #x4855d35ab58a0599
1882
                                      #x894737ec4d5e92b3 #xbd27acd5961aa553
1883
                                      #x4d2f0219c31512b0 #xe1871c9ee6d6fc6e
1884
                                      #x8fe0a965e2b48876 #x118fb252b3d94b8d
1885
                                      #xc0592af0440c6785 #xaca81e8725c3eede
1886
                                      #xd771062b583f36cd #x7066696c2d0706ee
1887
                                      #x99834bf8425f2991 #x3aa53bbafd20fe34
1888
                                      #x4406f255f643310e #xa1b0f1cedad22ae6
1889
                                      #x82f8462c1da54c4e #x0929f04c355623be
1890
                                      #x057ad143769f1729 #x949ba4b1bd4eeda9
1891
                                      #x960d253dd8e310ea #xfecd0e4f736b7e37
1892
                                      #x0296818c65adfd43 #x6f2c7bbdb8ba84b7
1893
                                      #x9a5e04329b2a247d #x2348b7e2c77766a8
1894
                                      #xdcce77eb08c4e830 #x851416e30e97a624
1895
                                      #x08623e0a898ed311 #x43eaa29ae571db64
1896
                                      #xc7b57a3f573e8def #xc2cfab7c21a19ac6
1897
                                      #x5ca0b04b70cc593d #x0ec5a0832664c9d4
1898
                                      #x1e01dc97296572f6 #xbacbfc1a85284f39
1899
                                      #xc970dabc715a443b #xa8990182ef840958
1900
                                      #xc83b14facd82b494 #x72f0e8e048aafbad
1901
                                      #xf143608ae9d7474c #xf5727f8f2390a0ca
1902
                                      #x7fe807a9b7bb3f95 #x76c1f7e582ed1c2b
1903
                                      #xcd41c5b9bb1da3bd #x6b1d64b872fd6331
1904
                                      #x806ec7a07808b10d #xe3119d12837b012d
1905
                                      #x25ef296b689d7c6d #x37bdd4f302313a0c
1906
                                      #x3051843c1103d066 #x68c02b72ab886edd
1907
                                      #x8782976f6b3a5b67 #x2d8d1761e113af7c
1908
                                      #x1252fd986aac4661 #x0bbf71c050fbdefd
1909
                                      #xd20bd7682ea021e4 #xe0ccd2d85a0e0cc1
1910
                                      #x9cf99abb34c03eb8 #xdd85b9adb41c189f
1911
                                      #x61e9db3e9ede4d63 #x06a79e89afea1ac5
1912
                                      #xf7e4fe03463d5d89 #x794f992018512550
1913
                                      #x3beef5fc41f80e9b #xcaad9576a82f49d7
1914
                                      #x10c47c140f01bb22 #x0af4bf86ec232e52
1915
                                      #xdb2227241bf6025a #x21de366ea2da9beb
1916
                                      #x9f24d571edb53354 #x9746eb7b643be045
1917
                                      #xa3267042bf7fd7a5 #x6e67b5fb04627418
1918
                                      #xc46835f58e4b8003 #x07ec50cf1332ea6a
1919
                                      #xe8aeecd2d380dfd0 #xe9e522946f582f7f
1920
                                      #x54c28e41f9428a2c #xe25a53543fa3f182
1921
                                      #xa9d2cfc4535cf9f7 #xa0fb3f88660ada49
1922
                                      #x50f3914433056daa #x51b85f028fdd9d05
1923
                                      #xec9ff3d719c73856 #x263266a1b1e87181
1924
                                      #x5e3631c71561a47e #x24a4e72dd4458cc2
1925
                                      #x74577669e740e168 #x7a92d6eac12428bc
1926
                                      #x2e5058ab3866a290 #x4ef24dd31a601f5c
1927
                                      #xf9215e806059945d #xfbb7df0c05f4691e
1928
                                      #x751cb82f5b9811c7 #x29bc08642b5448fa
1929
                                      #x5891af4eba8bbebb #x73bb26a6f4720b02
1930
                                      #x6dbafa31dd1779f4 #x7c3548636ece3279
1931
                                      #x4c64cc5f7fcde21f #x60a215782206bdcc
1932
                                      #xa7176f4775383023 #xbfb12d59f3b75810)
1933
                                     (#x51843c1103d06630 #xdfeaf98bbfe91d3f
1934
                                      #xeef5fc41f80e9b3b #xaf3045fae5ad26f6
1935
                                      #x70dabc715a443bc9 #x119d12837b012de3
1936
                                      #x3b14facd82b494c8 #xdd4fcad9750dec03
1937
                                      #xaabbb477090a2f90 #x75514dfcb6e332af
1938
                                      #x96818c65adfd4302 #x1d64b872fd63316b
1939
                                      #xe4fe03463d5d89f7 #x43608ae9d7474cf1
1940
                                      #xe20c56b07e6c87b3 #xf24dd31a601f5c4e
1941
                                      #x577669e740e16874 #x609b39db4437e034
1942
                                      #x3ac86de4e7c662d6 #x0379a47baf960722
1943
                                      #xa79e89afea1ac506 #x4bce46bcd8f0af01
1944
                                      #x267042bf7fd7a5a3 #x7ad143769f172905
1945
                                      #x85b9adb41c189fdd #xc885befe87d93e98
1946
                                      #xed8c583a57989c19 #x3c3a3812a4f76c92
1947
                                      #x5e04329b2a247d9a #xf99abb34c03eb89c
1948
                                      #x2227241bf6025adb #x6510c856a890e952
1949
                                      #xa215782206bdcc60 #x9ff3d719c73856ec
1950
                                      #x02a53352cae4f13c #x871c9ee6d6fc6ee1
1951
                                      #x80325c39f0bf96bb #x8d1761e113af7c2d
1952
                                      #x46eb7b643be04597 #xd8c43b5499aae565
1953
                                      #x81eecb1095cd60a5 #x9c8a736268ae51ce
1954
                                      #x64cc5f7fcde21f4c #x7c231680dc262741
1955
                                      #xc28e41f9428a2c54 #x8ccbf6c876dd8a33
1956
                                      #xb98395a6b8eff34f #xa9c2100ca69c28b2
1957
                                      #x6ec7a07808b10d80 #x0a0bff07c55312cc
1958
                                      #xc02b72ab886edd68 #xb85f028fdd9d0551
1959
                                      #x104185aa1e73dbfd #xb6039b2c911be8e5
1960
                                      #x79a8e70d30812e27 #x82976f6b3a5b6787
1961
                                      #xa53bbafd20fe343a #x7dff81a9b954d15f
1962
                                      #x894007459a7a8355 #xd43d91a51fc8f9ed
1963
                                      #xccd2d85a0e0cc1e0 #xe807a9b7bb3f957f
1964
                                      #xa81e8725c3eedeac #x5058ab3866a2902e
1965
                                      #x889c906cff08754b #x4ce08463feb3575b
1966
                                      #xdc935df0107f1a1d #x56aafece25939e6a
1967
                                      #xa16cdc59a92bcb42 #xec50cf1332ea6a07
1968
                                      #x4592df1f947642b5 #xbafa31dd1779f46d
1969
                                      #x29f04c355623be09 #x15ca7427f2d4d29b
1970
                                      #x215e806059945df9 #x23fbb3329370acc5
1971
                                      #xd74435deb05efecf #xeaa29ae571db6443
1972
                                      #xc95929d7e2abc886 #xa4e72dd4458cc224
1973
                                      #x3548636ece32797c #x27acd5961aa553bd
1974
                                      #xac49e1814a3b21d4 #xcbfc1a85284f39ba
1975
                                      #x8fb252b3d94b8d11 #x42bc1dc0b235baef
1976
                                      #x072ec2df2643f85a #x91af4eba8bbebb58
1977
                                      #x045766a489d5ff78 #x9073d993eecc4d46
1978
                                      #x3f439c690b616bb0 #x6b4c51f5e41604e6
1979
                                      #x7e8625d216c2d67d #xab67235e6c78d98e
1980
                                      #xef296b689d7c6d25 #xc5a0832664c9d40e
1981
                                      #x69e962a72ef2f5da #x7b0dd45ffa65df1b
1982
                                      #x496b75ee12145e3d #xd918ac7dfcd8137b
1983
                                      #x1e1d1c0952f53649 #xfeb479ebe67d40c6
1984
                                      #x6147aef22145162a #x0f800e8a29f41baa
1985
                                      #x0000000000000000 #x990182ef840958a8
1986
                                      #x975d1b4cc88fb51c #x5b8fc316c68374fc
1987
                                      #x16b3d05c5d42d5b9 #xb3886aa17dbce183
1988
                                      #x4f99201851255079 #x98dd15c6e17baeb6
1989
                                      #x06f255f643310e44 #x6f1b37516dc3fb9e
1990
                                      #x0cf9aaf186621c88 #x8e6ec59abc397b0f
1991
                                      #x930a7de8415a4a64 #x37ed503c04d68840
1992
                                      #xf61ab5bee9caa336 #xfb3f88660ada49a0
1993
                                      #x7874702455f3d839 #x208217493ce6abe7
1994
                                      #x73a3180af5d23ceb #x9e2f4030a24aa0f2
1995
                                      #xe522946f582f7fe9 #xd5e1068c7aba0ff3
1996
                                      #xbdd4f302313a0c37 #x1fc18b203787c057
1997
                                      #xd2cfc4535cf9f7a9 #x1b96ed84be523f2f
1998
                                      #x5d7d96e085b27ab8 #x66696c2d0706ee70
1999
                                      #xd06af701961d0695 #xe3d0c1991b1e71ad
2000
                                      #x6c62932ac255fcbc #xd313537a398b01b7
2001
                                      #xa0b04b70cc593d5c #x834bf8425f299199
2002
                                      #xaeecd2d380dfd0e8 #xbead57799eac0b15
2003
                                      #x540fcd9cef776f56 #xad9576a82f49d7ca
2004
                                      #xfc114ab92c99b1fa #x33ba36988d037738
2005
                                      #xbb26a6f4720b0273 #xb254fd8818ce179d
2006
                                      #xa6421e868f683318 #x5fd8a5b24f568b84
2007
                                      #x623e0a898ed31108 #xb0f1cedad22ae6a1
2008
                                      #x1933ded674b6ce13 #x1416e30e97a62485
2009
                                      #x3e9f0b406e139dae #x6dbe0403a7270aa2
2010
                                      #xbc08642b5448fa29 #x0d253dd8e310ea96
2011
                                      #x2ede8eea70604653 #x39b1c99f485065f4
2012
                                      #xcd0e4f736b7e37fe #xbf71c050fbdefd0b
2013
                                      #x748ddad5d391c4b1 #x0bd7682ea021e4d2
2014
                                      #x3494f447ab408f62 #xb4a6a87e5bff19d9
2015
                                      #x133821d1b1e5dcdf #x95f8281e026b4420
2016
                                      #x2da72a91dff64171 #x18ef49ff11c4380d
2017
                                      #xc705b074ae2d2532 #x3de6af3bc1859a8c
2018
                                      #x6835f58e4b8003c4 #xe787a73d92cb8ed5
2019
                                      #xc6d9275dcb5fd32c #xf7c622978cb85528
2020
                                      #x4d3c134a9bc1a145 #xf3914433056daa50
2021
                                      #xb7df0c05f4691efb #xe175f2cbd1fa8091
2022
                                      #x77f47eae7c07c393 #xeb7e0dcc14a9925d
2023
                                      #xf1347761cf895b6c #x08aecc550fb7e3f0
2024
                                      #x55d35ab58a059948 #x444e4836f104b4ab
2025
                                      #x58f6676d691573de #x9ba4b1bd4eeda994
2026
                                      #x92d6eac12428bc7a #xb12d59f3b75810bf
2027
                                      #xa3c9ef0b63cf3a7e #x67b5fb046274186e
2028
                                      #x2f0219c31512b04d #x3266a1b1e8718126
2029
                                      #x7628e9871975358d #xda610806534e1459
2030
                                      #x311f05ca47e78604 #x12e4b6f8d4972ac1
2031
                                      #x282cdb1c33514817 #x727f8f2390a0caf5
2032
                                      #xb57a3f573e8defc7 #x71062b583f36cdd7
2033
                                      #x84653a9d796a69c3 #xf56311c5465ca414
2034
                                      #x4737ec4d5e92b389 #x1cb82f5b9811c775
2035
                                      #x2509e6c4d041a281 #xfdcddd9049eb47e4
2036
                                      #x40192e9278d14bd3 #x2a89e84ef9b5b92b
2037
                                      #x3631c71561a47e5e #x8be53417509e7269
2038
                                      #x24d571edb533549f #xc352d6d027f8da4a
2039
                                      #x01dc97296572f61e #xe9db3e9ede4d6361
2040
                                      #x4e45b7313457a667 #xf8462c1da54c4e82
2041
                                      #x4a12d195bd82591f #xff68eec2830fb6d8
2042
                                      #x176f4775383023a7 #x48b7e2c77766a823
2043
                                      #x592af0440c6785c0 #x2c7bbdb8ba84b76f
2044
                                      #x5ca101c9e0c08ca6 #x63e29da0eba1e716
2045
                                      #xd698a2f7d52c08d1 #xce77eb08c4e830dc
2046
                                      #xde366ea2da9beb21 #x5a53543fa3f182e2
2047
                                      #x52fd986aac466112 #x86c009cfb38e98ff
2048
                                      #xd1b66028f36ff08b #x1a4a7aaddb20c931
2049
                                      #xcfab7c21a19ac6c2 #x09725b7c6ac515ee
2050
                                      #x0e5c99a34c86edb4 #xdbbd9f2f363ce247
2051
                                      #x6a90c6dc8164f2f8 #x8a39a33e35ec8477
2052
                                      #xe0a965e2b488768f #x7f5ab2fb73b02063
2053
                                      #xf4bf86ec232e520a #xfae31f4f6fa8bfbe
2054
                                      #x058bf18deca70966 #x41c5b9bb1da3bdcd
2055
                                      #x2b557f679cc74f35 #xca208dac4d3dcfa4
2056
                                      #x9a7826942b9f5f8a #xf0e8e048aafbad72
2057
                                      #x53210f43c934970c #xc1f7e582ed1c2b76
2058
                                      #xc47c140f01bb2210 #x9d56e44b0ddca7d0
2059
                                      #x386d5eb62d2293ea #xe65b3014f7b978cb
2060
                                      #x9424bf376719b23e #x30c392e32295701a))))
2061
 
2062
   (defconst +kalyna-s+
2063
     (make-array '(4 256)
2064
                 :element-type '(unsigned-byte 8)
2065
                 :initial-contents '((#xa8 #x43 #x5f #x06 #x6b #x75 #x6c #x59
2066
                                      #x71 #xdf #x87 #x95 #x17 #xf0 #xd8 #x09
2067
                                      #x6d #xf3 #x1d #xcb #xc9 #x4d #x2c #xaf
2068
                                      #x79 #xe0 #x97 #xfd #x6f #x4b #x45 #x39
2069
                                      #x3e #xdd #xa3 #x4f #xb4 #xb6 #x9a #x0e
2070
                                      #x1f #xbf #x15 #xe1 #x49 #xd2 #x93 #xc6
2071
                                      #x92 #x72 #x9e #x61 #xd1 #x63 #xfa #xee
2072
                                      #xf4 #x19 #xd5 #xad #x58 #xa4 #xbb #xa1
2073
                                      #xdc #xf2 #x83 #x37 #x42 #xe4 #x7a #x32
2074
                                      #x9c #xcc #xab #x4a #x8f #x6e #x04 #x27
2075
                                      #x2e #xe7 #xe2 #x5a #x96 #x16 #x23 #x2b
2076
                                      #xc2 #x65 #x66 #x0f #xbc #xa9 #x47 #x41
2077
                                      #x34 #x48 #xfc #xb7 #x6a #x88 #xa5 #x53
2078
                                      #x86 #xf9 #x5b #xdb #x38 #x7b #xc3 #x1e
2079
                                      #x22 #x33 #x24 #x28 #x36 #xc7 #xb2 #x3b
2080
                                      #x8e #x77 #xba #xf5 #x14 #x9f #x08 #x55
2081
                                      #x9b #x4c #xfe #x60 #x5c #xda #x18 #x46
2082
                                      #xcd #x7d #x21 #xb0 #x3f #x1b #x89 #xff
2083
                                      #xeb #x84 #x69 #x3a #x9d #xd7 #xd3 #x70
2084
                                      #x67 #x40 #xb5 #xde #x5d #x30 #x91 #xb1
2085
                                      #x78 #x11 #x01 #xe5 #x00 #x68 #x98 #xa0
2086
                                      #xc5 #x02 #xa6 #x74 #x2d #x0b #xa2 #x76
2087
                                      #xb3 #xbe #xce #xbd #xae #xe9 #x8a #x31
2088
                                      #x1c #xec #xf1 #x99 #x94 #xaa #xf6 #x26
2089
                                      #x2f #xef #xe8 #x8c #x35 #x03 #xd4 #x7f
2090
                                      #xfb #x05 #xc1 #x5e #x90 #x20 #x3d #x82
2091
                                      #xf7 #xea #x0a #x0d #x7e #xf8 #x50 #x1a
2092
                                      #xc4 #x07 #x57 #xb8 #x3c #x62 #xe3 #xc8
2093
                                      #xac #x52 #x64 #x10 #xd0 #xd9 #x13 #x0c
2094
                                      #x12 #x29 #x51 #xb9 #xcf #xd6 #x73 #x8d
2095
                                      #x81 #x54 #xc0 #xed #x4e #x44 #xa7 #x2a
2096
                                      #x85 #x25 #xe6 #xca #x7c #x8b #x56 #x80)
2097
                                     (#xce #xbb #xeb #x92 #xea #xcb #x13 #xc1
2098
                                      #xe9 #x3a #xd6 #xb2 #xd2 #x90 #x17 #xf8
2099
                                      #x42 #x15 #x56 #xb4 #x65 #x1c #x88 #x43
2100
                                      #xc5 #x5c #x36 #xba #xf5 #x57 #x67 #x8d
2101
                                      #x31 #xf6 #x64 #x58 #x9e #xf4 #x22 #xaa
2102
                                      #x75 #x0f #x02 #xb1 #xdf #x6d #x73 #x4d
2103
                                      #x7c #x26 #x2e #xf7 #x08 #x5d #x44 #x3e
2104
                                      #x9f #x14 #xc8 #xae #x54 #x10 #xd8 #xbc
2105
                                      #x1a #x6b #x69 #xf3 #xbd #x33 #xab #xfa
2106
                                      #xd1 #x9b #x68 #x4e #x16 #x95 #x91 #xee
2107
                                      #x4c #x63 #x8e #x5b #xcc #x3c #x19 #xa1
2108
                                      #x81 #x49 #x7b #xd9 #x6f #x37 #x60 #xca
2109
                                      #xe7 #x2b #x48 #xfd #x96 #x45 #xfc #x41
2110
                                      #x12 #x0d #x79 #xe5 #x89 #x8c #xe3 #x20
2111
                                      #x30 #xdc #xb7 #x6c #x4a #xb5 #x3f #x97
2112
                                      #xd4 #x62 #x2d #x06 #xa4 #xa5 #x83 #x5f
2113
                                      #x2a #xda #xc9 #x00 #x7e #xa2 #x55 #xbf
2114
                                      #x11 #xd5 #x9c #xcf #x0e #x0a #x3d #x51
2115
                                      #x7d #x93 #x1b #xfe #xc4 #x47 #x09 #x86
2116
                                      #x0b #x8f #x9d #x6a #x07 #xb9 #xb0 #x98
2117
                                      #x18 #x32 #x71 #x4b #xef #x3b #x70 #xa0
2118
                                      #xe4 #x40 #xff #xc3 #xa9 #xe6 #x78 #xf9
2119
                                      #x8b #x46 #x80 #x1e #x38 #xe1 #xb8 #xa8
2120
                                      #xe0 #x0c #x23 #x76 #x1d #x25 #x24 #x05
2121
                                      #xf1 #x6e #x94 #x28 #x9a #x84 #xe8 #xa3
2122
                                      #x4f #x77 #xd3 #x85 #xe2 #x52 #xf2 #x82
2123
                                      #x50 #x7a #x2f #x74 #x53 #xb3 #x61 #xaf
2124
                                      #x39 #x35 #xde #xcd #x1f #x99 #xac #xad
2125
                                      #x72 #x2c #xdd #xd0 #x87 #xbe #x5e #xa6
2126
                                      #xec #x04 #xc6 #x03 #x34 #xfb #xdb #x59
2127
                                      #xb6 #xc2 #x01 #xf0 #x5a #xed #xa7 #x66
2128
                                      #x21 #x7f #x8a #x27 #xc7 #xc0 #x29 #xd7)
2129
                                     (#x93 #xd9 #x9a #xb5 #x98 #x22 #x45 #xfc
2130
                                      #xba #x6a #xdf #x02 #x9f #xdc #x51 #x59
2131
                                      #x4a #x17 #x2b #xc2 #x94 #xf4 #xbb #xa3
2132
                                      #x62 #xe4 #x71 #xd4 #xcd #x70 #x16 #xe1
2133
                                      #x49 #x3c #xc0 #xd8 #x5c #x9b #xad #x85
2134
                                      #x53 #xa1 #x7a #xc8 #x2d #xe0 #xd1 #x72
2135
                                      #xa6 #x2c #xc4 #xe3 #x76 #x78 #xb7 #xb4
2136
                                      #x09 #x3b #x0e #x41 #x4c #xde #xb2 #x90
2137
                                      #x25 #xa5 #xd7 #x03 #x11 #x00 #xc3 #x2e
2138
                                      #x92 #xef #x4e #x12 #x9d #x7d #xcb #x35
2139
                                      #x10 #xd5 #x4f #x9e #x4d #xa9 #x55 #xc6
2140
                                      #xd0 #x7b #x18 #x97 #xd3 #x36 #xe6 #x48
2141
                                      #x56 #x81 #x8f #x77 #xcc #x9c #xb9 #xe2
2142
                                      #xac #xb8 #x2f #x15 #xa4 #x7c #xda #x38
2143
                                      #x1e #x0b #x05 #xd6 #x14 #x6e #x6c #x7e
2144
                                      #x66 #xfd #xb1 #xe5 #x60 #xaf #x5e #x33
2145
                                      #x87 #xc9 #xf0 #x5d #x6d #x3f #x88 #x8d
2146
                                      #xc7 #xf7 #x1d #xe9 #xec #xed #x80 #x29
2147
                                      #x27 #xcf #x99 #xa8 #x50 #x0f #x37 #x24
2148
                                      #x28 #x30 #x95 #xd2 #x3e #x5b #x40 #x83
2149
                                      #xb3 #x69 #x57 #x1f #x07 #x1c #x8a #xbc
2150
                                      #x20 #xeb #xce #x8e #xab #xee #x31 #xa2
2151
                                      #x73 #xf9 #xca #x3a #x1a #xfb #x0d #xc1
2152
                                      #xfe #xfa #xf2 #x6f #xbd #x96 #xdd #x43
2153
                                      #x52 #xb6 #x08 #xf3 #xae #xbe #x19 #x89
2154
                                      #x32 #x26 #xb0 #xea #x4b #x64 #x84 #x82
2155
                                      #x6b #xf5 #x79 #xbf #x01 #x5f #x75 #x63
2156
                                      #x1b #x23 #x3d #x68 #x2a #x65 #xe8 #x91
2157
                                      #xf6 #xff #x13 #x58 #xf1 #x47 #x0a #x7f
2158
                                      #xc5 #xa7 #xe7 #x61 #x5a #x06 #x46 #x44
2159
                                      #x42 #x04 #xa0 #xdb #x39 #x86 #x54 #xaa
2160
                                      #x8c #x34 #x21 #x8b #xf8 #x0c #x74 #x67)
2161
                                     (#x68 #x8d #xca #x4d #x73 #x4b #x4e #x2a
2162
                                      #xd4 #x52 #x26 #xb3 #x54 #x1e #x19 #x1f
2163
                                      #x22 #x03 #x46 #x3d #x2d #x4a #x53 #x83
2164
                                      #x13 #x8a #xb7 #xd5 #x25 #x79 #xf5 #xbd
2165
                                      #x58 #x2f #x0d #x02 #xed #x51 #x9e #x11
2166
                                      #xf2 #x3e #x55 #x5e #xd1 #x16 #x3c #x66
2167
                                      #x70 #x5d #xf3 #x45 #x40 #xcc #xe8 #x94
2168
                                      #x56 #x08 #xce #x1a #x3a #xd2 #xe1 #xdf
2169
                                      #xb5 #x38 #x6e #x0e #xe5 #xf4 #xf9 #x86
2170
                                      #xe9 #x4f #xd6 #x85 #x23 #xcf #x32 #x99
2171
                                      #x31 #x14 #xae #xee #xc8 #x48 #xd3 #x30
2172
                                      #xa1 #x92 #x41 #xb1 #x18 #xc4 #x2c #x71
2173
                                      #x72 #x44 #x15 #xfd #x37 #xbe #x5f #xaa
2174
                                      #x9b #x88 #xd8 #xab #x89 #x9c #xfa #x60
2175
                                      #xea #xbc #x62 #x0c #x24 #xa6 #xa8 #xec
2176
                                      #x67 #x20 #xdb #x7c #x28 #xdd #xac #x5b
2177
                                      #x34 #x7e #x10 #xf1 #x7b #x8f #x63 #xa0
2178
                                      #x05 #x9a #x43 #x77 #x21 #xbf #x27 #x09
2179
                                      #xc3 #x9f #xb6 #xd7 #x29 #xc2 #xeb #xc0
2180
                                      #xa4 #x8b #x8c #x1d #xfb #xff #xc1 #xb2
2181
                                      #x97 #x2e #xf8 #x65 #xf6 #x75 #x07 #x04
2182
                                      #x49 #x33 #xe4 #xd9 #xb9 #xd0 #x42 #xc7
2183
                                      #x6c #x90 #x00 #x8e #x6f #x50 #x01 #xc5
2184
                                      #xda #x47 #x3f #xcd #x69 #xa2 #xe2 #x7a
2185
                                      #xa7 #xc6 #x93 #x0f #x0a #x06 #xe6 #x2b
2186
                                      #x96 #xa3 #x1c #xaf #x6a #x12 #x84 #x39
2187
                                      #xe7 #xb0 #x82 #xf7 #xfe #x9d #x87 #x5c
2188
                                      #x81 #x35 #xde #xb4 #xa5 #xfc #x80 #xef
2189
                                      #xcb #xbb #x6b #x76 #xba #x5a #x7d #x78
2190
                                      #x0b #x95 #xe3 #xad #x74 #x98 #x3b #x36
2191
                                      #x64 #x6d #xdc #xf0 #x59 #xa9 #x4c #x17
2192
                                      #x7f #x91 #xb8 #xc9 #x57 #x1b #xe0 #x61))))
2193
 
2194
   (defconst +kalyna-is+
2195
     (make-array '(4 256)
2196
                 :element-type '(unsigned-byte 8)
2197
                 :initial-contents '((#xa4 #xa2 #xa9 #xc5 #x4e #xc9 #x03 #xd9
2198
                                      #x7e #x0f #xd2 #xad #xe7 #xd3 #x27 #x5b
2199
                                      #xe3 #xa1 #xe8 #xe6 #x7c #x2a #x55 #x0c
2200
                                      #x86 #x39 #xd7 #x8d #xb8 #x12 #x6f #x28
2201
                                      #xcd #x8a #x70 #x56 #x72 #xf9 #xbf #x4f
2202
                                      #x73 #xe9 #xf7 #x57 #x16 #xac #x50 #xc0
2203
                                      #x9d #xb7 #x47 #x71 #x60 #xc4 #x74 #x43
2204
                                      #x6c #x1f #x93 #x77 #xdc #xce #x20 #x8c
2205
                                      #x99 #x5f #x44 #x01 #xf5 #x1e #x87 #x5e
2206
                                      #x61 #x2c #x4b #x1d #x81 #x15 #xf4 #x23
2207
                                      #xd6 #xea #xe1 #x67 #xf1 #x7f #xfe #xda
2208
                                      #x3c #x07 #x53 #x6a #x84 #x9c #xcb #x02
2209
                                      #x83 #x33 #xdd #x35 #xe2 #x59 #x5a #x98
2210
                                      #xa5 #x92 #x64 #x04 #x06 #x10 #x4d #x1c
2211
                                      #x97 #x08 #x31 #xee #xab #x05 #xaf #x79
2212
                                      #xa0 #x18 #x46 #x6d #xfc #x89 #xd4 #xc7
2213
                                      #xff #xf0 #xcf #x42 #x91 #xf8 #x68 #x0a
2214
                                      #x65 #x8e #xb6 #xfd #xc3 #xef #x78 #x4c
2215
                                      #xcc #x9e #x30 #x2e #xbc #x0b #x54 #x1a
2216
                                      #xa6 #xbb #x26 #x80 #x48 #x94 #x32 #x7d
2217
                                      #xa7 #x3f #xae #x22 #x3d #x66 #xaa #xf6
2218
                                      #x00 #x5d #xbd #x4a #xe0 #x3b #xb4 #x17
2219
                                      #x8b #x9f #x76 #xb0 #x24 #x9a #x25 #x63
2220
                                      #xdb #xeb #x7a #x3e #x5c #xb3 #xb1 #x29
2221
                                      #xf2 #xca #x58 #x6e #xd8 #xa8 #x2f #x75
2222
                                      #xdf #x14 #xfb #x13 #x49 #x88 #xb2 #xec
2223
                                      #xe4 #x34 #x2d #x96 #xc6 #x3a #xed #x95
2224
                                      #x0e #xe5 #x85 #x6b #x40 #x21 #x9b #x09
2225
                                      #x19 #x2b #x52 #xde #x45 #xa3 #xfa #x51
2226
                                      #xc2 #xb5 #xd1 #x90 #xb9 #xf3 #x37 #xc1
2227
                                      #x0d #xba #x41 #x11 #x38 #x7b #xbe #xd0
2228
                                      #xd5 #x69 #x36 #xc8 #x62 #x1b #x82 #x8f)
2229
                                     (#x83 #xf2 #x2a #xeb #xe9 #xbf #x7b #x9c
2230
                                      #x34 #x96 #x8d #x98 #xb9 #x69 #x8c #x29
2231
                                      #x3d #x88 #x68 #x06 #x39 #x11 #x4c #x0e
2232
                                      #xa0 #x56 #x40 #x92 #x15 #xbc #xb3 #xdc
2233
                                      #x6f #xf8 #x26 #xba #xbe #xbd #x31 #xfb
2234
                                      #xc3 #xfe #x80 #x61 #xe1 #x7a #x32 #xd2
2235
                                      #x70 #x20 #xa1 #x45 #xec #xd9 #x1a #x5d
2236
                                      #xb4 #xd8 #x09 #xa5 #x55 #x8e #x37 #x76
2237
                                      #xa9 #x67 #x10 #x17 #x36 #x65 #xb1 #x95
2238
                                      #x62 #x59 #x74 #xa3 #x50 #x2f #x4b #xc8
2239
                                      #xd0 #x8f #xcd #xd4 #x3c #x86 #x12 #x1d
2240
                                      #x23 #xef #xf4 #x53 #x19 #x35 #xe6 #x7f
2241
                                      #x5e #xd6 #x79 #x51 #x22 #x14 #xf7 #x1e
2242
                                      #x4a #x42 #x9b #x41 #x73 #x2d #xc1 #x5c
2243
                                      #xa6 #xa2 #xe0 #x2e #xd3 #x28 #xbb #xc9
2244
                                      #xae #x6a #xd1 #x5a #x30 #x90 #x84 #xf9
2245
                                      #xb2 #x58 #xcf #x7e #xc5 #xcb #x97 #xe4
2246
                                      #x16 #x6c #xfa #xb0 #x6d #x1f #x52 #x99
2247
                                      #x0d #x4e #x03 #x91 #xc2 #x4d #x64 #x77
2248
                                      #x9f #xdd #xc4 #x49 #x8a #x9a #x24 #x38
2249
                                      #xa7 #x57 #x85 #xc7 #x7c #x7d #xe7 #xf6
2250
                                      #xb7 #xac #x27 #x46 #xde #xdf #x3b #xd7
2251
                                      #x9e #x2b #x0b #xd5 #x13 #x75 #xf0 #x72
2252
                                      #xb6 #x9d #x1b #x01 #x3f #x44 #xe5 #x87
2253
                                      #xfd #x07 #xf1 #xab #x94 #x18 #xea #xfc
2254
                                      #x3a #x82 #x5f #x05 #x54 #xdb #x00 #x8b
2255
                                      #xe3 #x48 #x0c #xca #x78 #x89 #x0a #xff
2256
                                      #x3e #x5b #x81 #xee #x71 #xe2 #xda #x2c
2257
                                      #xb8 #xb5 #xcc #x6e #xa8 #x6b #xad #x60
2258
                                      #xc6 #x08 #x04 #x02 #xe8 #xf5 #x4f #xa4
2259
                                      #xf3 #xc0 #xce #x43 #x25 #x1c #x21 #x33
2260
                                      #x0f #xaf #x47 #xed #x66 #x63 #x93 #xaa)
2261
                                     (#x45 #xd4 #x0b #x43 #xf1 #x72 #xed #xa4
2262
                                      #xc2 #x38 #xe6 #x71 #xfd #xb6 #x3a #x95
2263
                                      #x50 #x44 #x4b #xe2 #x74 #x6b #x1e #x11
2264
                                      #x5a #xc6 #xb4 #xd8 #xa5 #x8a #x70 #xa3
2265
                                      #xa8 #xfa #x05 #xd9 #x97 #x40 #xc9 #x90
2266
                                      #x98 #x8f #xdc #x12 #x31 #x2c #x47 #x6a
2267
                                      #x99 #xae #xc8 #x7f #xf9 #x4f #x5d #x96
2268
                                      #x6f #xf4 #xb3 #x39 #x21 #xda #x9c #x85
2269
                                      #x9e #x3b #xf0 #xbf #xef #x06 #xee #xe5
2270
                                      #x5f #x20 #x10 #xcc #x3c #x54 #x4a #x52
2271
                                      #x94 #x0e #xc0 #x28 #xf6 #x56 #x60 #xa2
2272
                                      #xe3 #x0f #xec #x9d #x24 #x83 #x7e #xd5
2273
                                      #x7c #xeb #x18 #xd7 #xcd #xdd #x78 #xff
2274
                                      #xdb #xa1 #x09 #xd0 #x76 #x84 #x75 #xbb
2275
                                      #x1d #x1a #x2f #xb0 #xfe #xd6 #x34 #x63
2276
                                      #x35 #xd2 #x2a #x59 #x6d #x4d #x77 #xe7
2277
                                      #x8e #x61 #xcf #x9f #xce #x27 #xf5 #x80
2278
                                      #x86 #xc7 #xa6 #xfb #xf8 #x87 #xab #x62
2279
                                      #x3f #xdf #x48 #x00 #x14 #x9a #xbd #x5b
2280
                                      #x04 #x92 #x02 #x25 #x65 #x4c #x53 #x0c
2281
                                      #xf2 #x29 #xaf #x17 #x6c #x41 #x30 #xe9
2282
                                      #x93 #x55 #xf7 #xac #x68 #x26 #xc4 #x7d
2283
                                      #xca #x7a #x3e #xa0 #x37 #x03 #xc1 #x36
2284
                                      #x69 #x66 #x08 #x16 #xa7 #xbc #xc5 #xd3
2285
                                      #x22 #xb7 #x13 #x46 #x32 #xe8 #x57 #x88
2286
                                      #x2b #x81 #xb2 #x4e #x64 #x1c #xaa #x91
2287
                                      #x58 #x2e #x9b #x5c #x1b #x51 #x73 #x42
2288
                                      #x23 #x01 #x6e #xf3 #x0d #xbe #x3d #x0a
2289
                                      #x2d #x1f #x67 #x33 #x19 #x7b #x5e #xea
2290
                                      #xde #x8b #xcb #xa9 #x8c #x8d #xad #x49
2291
                                      #x82 #xe4 #xba #xc3 #x15 #xd1 #xe0 #x89
2292
                                      #xfc #xb1 #xb9 #xb5 #x07 #x79 #xb8 #xe1)
2293
                                     (#xb2 #xb6 #x23 #x11 #xa7 #x88 #xc5 #xa6
2294
                                      #x39 #x8f #xc4 #xe8 #x73 #x22 #x43 #xc3
2295
                                      #x82 #x27 #xcd #x18 #x51 #x62 #x2d #xf7
2296
                                      #x5c #x0e #x3b #xfd #xca #x9b #x0d #x0f
2297
                                      #x79 #x8c #x10 #x4c #x74 #x1c #x0a #x8e
2298
                                      #x7c #x94 #x07 #xc7 #x5e #x14 #xa1 #x21
2299
                                      #x57 #x50 #x4e #xa9 #x80 #xd9 #xef #x64
2300
                                      #x41 #xcf #x3c #xee #x2e #x13 #x29 #xba
2301
                                      #x34 #x5a #xae #x8a #x61 #x33 #x12 #xb9
2302
                                      #x55 #xa8 #x15 #x05 #xf6 #x03 #x06 #x49
2303
                                      #xb5 #x25 #x09 #x16 #x0c #x2a #x38 #xfc
2304
                                      #x20 #xf4 #xe5 #x7f #xd7 #x31 #x2b #x66
2305
                                      #x6f #xff #x72 #x86 #xf0 #xa3 #x2f #x78
2306
                                      #x00 #xbc #xcc #xe2 #xb0 #xf1 #x42 #xb4
2307
                                      #x30 #x5f #x60 #x04 #xec #xa5 #xe3 #x8b
2308
                                      #xe7 #x1d #xbf #x84 #x7b #xe6 #x81 #xf8
2309
                                      #xde #xd8 #xd2 #x17 #xce #x4b #x47 #xd6
2310
                                      #x69 #x6c #x19 #x99 #x9a #x01 #xb3 #x85
2311
                                      #xb1 #xf9 #x59 #xc2 #x37 #xe9 #xc8 #xa0
2312
                                      #xed #x4f #x89 #x68 #x6d #xd5 #x26 #x91
2313
                                      #x87 #x58 #xbd #xc9 #x98 #xdc #x75 #xc0
2314
                                      #x76 #xf5 #x67 #x6b #x7e #xeb #x52 #xcb
2315
                                      #xd1 #x5b #x9f #x0b #xdb #x40 #x92 #x1a
2316
                                      #xfa #xac #xe4 #xe1 #x71 #x1f #x65 #x8d
2317
                                      #x97 #x9e #x95 #x90 #x5d #xb7 #xc1 #xaf
2318
                                      #x54 #xfb #x02 #xe0 #x35 #xbb #x3a #x4d
2319
                                      #xad #x2c #x3d #x56 #x08 #x1b #x4a #x93
2320
                                      #x6a #xab #xb8 #x7a #xf2 #x7d #xda #x3f
2321
                                      #xfe #x3e #xbe #xea #xaa #x44 #xc6 #xd0
2322
                                      #x36 #x48 #x70 #x96 #x77 #x24 #x53 #xdf
2323
                                      #xf3 #x83 #x28 #x32 #x45 #x1e #xa4 #xd3
2324
                                      #xa2 #x46 #x6e #x9c #xdd #x63 #xd4 #x9d)))))
2325
 
2326
 (declaim (type (simple-array (unsigned-byte 64) (8 256)) +kalyna-t+ +kalyna-it+)
2327
          (type (simple-array (unsigned-byte 8) (4 256)) +kalyna-s+ +kalyna-is+))
2328
 
2329
 
2330
 ;;;
2331
 ;;; Common functions and macros
2332
 ;;;
2333
 
2334
 (declaim (inline kalyna-make-odd-key))
2335
 (defun kalyna-make-odd-key (n ek ek-start ok ok-start)
2336
   (declare (type (integer 0 8) n)
2337
            (type (simple-array (unsigned-byte 64) (*)) ek ok)
2338
            (type (integer 0 144) ek-start ok-start)
2339
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2340
   (macrolet ((m (a b c d e)
2341
                `(setf (aref ok (+ ok-start ,a))
2342
                       (logior (mod64ash (aref ek (+ ek-start ,b)) ,c)
2343
                               (mod64ash (aref ek (+ ek-start ,d)) ,e)))))
2344
     (ecase n
2345
       (2
2346
        (m 0 1 8 0 -56) (m 1 0 8 1 -56))
2347
       (4
2348
        (m 0 2 40 1 -24) (m 1 3 40 2 -24) (m 2 0 40 3 -24) (m 3 1 40 0 -24))
2349
       (8
2350
        (m 0 3 40 2 -24) (m 1 4 40 3 -24) (m 2 5 40 4 -24) (m 3 6 40 5 -24)
2351
        (m 4 7 40 6 -24) (m 5 0 40 7 -24) (m 6 1 40 0 -24) (m 7 2 40 1 -24))))
2352
   (values))
2353
 
2354
 (declaim (inline kalyna-swap-blocks))
2355
 (defun kalyna-swap-blocks (n k)
2356
   (declare (type (integer 0 8) n)
2357
            (type (simple-array (unsigned-byte 64) (*)) k)
2358
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2359
   (ecase n
2360
     (2 (rotatef (aref k 0) (aref k 1)))
2361
     (4 (rotatef (aref k 0) (aref k 1) (aref k 2) (aref k 3)))
2362
     (8 (rotatef (aref k 0) (aref k 1) (aref k 2) (aref k 3)
2363
                 (aref k 4) (aref k 5) (aref k 6) (aref k 7))))
2364
   (values))
2365
 
2366
 (defmacro kalyna-add-key (n x x-start y k)
2367
   `(dotimes-unrolled (i ,n)
2368
      (setf (aref ,y i) (mod64+ (aref ,x (+ ,x-start i)) (aref ,k i)))))
2369
 
2370
 (defmacro kalyna-sub-key (n x y k k-start)
2371
   `(dotimes-unrolled (i ,n)
2372
      (setf (aref ,y i) (mod64- (aref ,x i) (aref ,k (+ ,k-start i))))))
2373
 
2374
 (defmacro kalyna-add-constant (n x y c)
2375
   `(dotimes-unrolled (i ,n)
2376
      (setf (aref ,y i) (mod64+ (aref ,x i) ,c))))
2377
 
2378
 
2379
 ;;;
2380
 ;;; Kalyna128
2381
 ;;;
2382
 
2383
 (declaim (inline kalyna-g0128))
2384
 (defun kalyna-g0128 (x y)
2385
   (declare (type (simple-array (unsigned-byte 64) (*)) x y)
2386
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2387
   (macrolet ((m (a b c)
2388
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2389
     (setf (aref y 0)
2390
           (logxor (m 0 0 0) (m 1 0 -8) (m 2 0 -16) (m 3 0 -24)
2391
                   (m 4 1 -32) (m 5 1 -40) (m 6 1 -48) (m 7 1 -56)))
2392
     (setf (aref y 1)
2393
           (logxor (m 0 1 0) (m 1 1 -8) (m 2 1 -16) (m 3 1 -24)
2394
                   (m 4 0 -32) (m 5 0 -40) (m 6 0 -48)(m 7 0 -56))))
2395
   (values))
2396
 
2397
 (declaim (inline kalyna-gl128))
2398
 (defun kalyna-gl128 (x y y-start k k-start)
2399
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2400
            (type (integer 0 30) y-start k-start)
2401
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2402
   (macrolet ((m (a b c)
2403
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2404
     (setf (aref y (+ y-start 0))
2405
           (mod64+ (aref k (+ k-start 0))
2406
                   (logxor (m 0 0 0) (m 1 0 -8) (m 2 0 -16) (m 3 0 -24)
2407
                           (m 4 1 -32) (m 5 1 -40) (m 6 1 -48) (m 7 1 -56))))
2408
     (setf (aref y (+ y-start 1))
2409
           (mod64+ (aref k (+ k-start 1))
2410
                   (logxor (m 0 1 0) (m 1 1 -8) (m 2 1 -16) (m 3 1 -24)
2411
                           (m 4 0 -32) (m 5 0 -40) (m 6 0 -48) (m 7 0 -56)))))
2412
   (values))
2413
 
2414
 (declaim (inline kalyna-imc128))
2415
 (defun kalyna-imc128 (x x-start)
2416
   (declare (type (simple-array (unsigned-byte 64) (*)) x)
2417
            (type (integer 0 30) x-start)
2418
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2419
   (macrolet ((m (a b c d)
2420
                `(aref +kalyna-it+
2421
                       ,a
2422
                       (aref +kalyna-s+
2423
                             ,b
2424
                             (logand (mod64ash (aref x (+ x-start ,c)) ,d) #xff)))))
2425
     (setf (aref x (+ x-start 0))
2426
           (logxor (m 0 0 0 0) (m 1 1 0 -8) (m 2 2 0 -16) (m 3 3 0 -24)
2427
                   (m 4 0 0 -32) (m 5 1 0 -40) (m 6 2 0 -48) (m 7 3 0 -56)))
2428
     (setf (aref x (+ x-start 1))
2429
           (logxor (m 0 0 1 0) (m 1 1 1 -8) (m 2 2 1 -16) (m 3 3 1 -24)
2430
                   (m 4 0 1 -32) (m 5 1 1 -40) (m 6 2 1 -48) (m 7 3 1 -56))))
2431
   (values))
2432
 
2433
 (declaim (inline kalyna-ig128))
2434
 (defun kalyna-ig128 (x y k k-start)
2435
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2436
            (type (integer 0 30) k-start)
2437
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2438
   (macrolet ((m (a b c)
2439
                `(aref +kalyna-it+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2440
     (setf (aref y 0)
2441
           (logxor (aref k (+ k-start 0))
2442
                   (m 0 0 0) (m 1 0 -8) (m 2 0 -16) (m 3 0 -24)
2443
                   (m 4 1 -32) (m 5 1 -40) (m 6 1 -48) (m 7 1 -56)))
2444
     (setf (aref y 1)
2445
           (logxor (aref k (+ k-start 1))
2446
                   (m 0 1 0) (m 1 1 -8) (m 2 1 -16) (m 3 1 -24)
2447
                   (m 4 0 -32) (m 5 0 -40) (m 6 0 -48) (m 7 0 -56))))
2448
   (values))
2449
 
2450
 (declaim (inline kalyna-igl128))
2451
 (defun kalyna-igl128 (x y k k-start)
2452
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2453
            (type (integer 0 30) k-start)
2454
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2455
   (macrolet ((m (a b c d)
2456
                `(mod64ash (aref +kalyna-is+
2457
                                 ,a
2458
                                 (logand (mod64ash (aref x ,b) ,c) #xff))
2459
                           ,d)))
2460
     (setf (aref y 0)
2461
           (mod64- (logxor (m 0 0 0 0) (m 1 0 -8 8) (m 2 0 -16 16) (m 3 0 -24 24)
2462
                           (m 0 1 -32 32) (m 1 1 -40 40) (m 2 1 -48 48) (m 3 1 -56 56))
2463
                   (aref k (+ k-start 0))))
2464
     (setf (aref y 1)
2465
           (mod64- (logxor (m 0 1 0 0) (m 1 1 -8 8) (m 2 1 -16 16) (m 3 1 -24 24)
2466
                           (m 0 0 -32 32) (m 1 0 -40 40) (m 2 0 -48 48) (m 3 0 -56 56))
2467
                   (aref k (+ k-start 1)))))
2468
   (values))
2469
 
2470
 (declaim (inline kalyna-g128))
2471
 (defun kalyna-g128 (x y k k-start)
2472
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2473
            (type (integer 0 30) k-start)
2474
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2475
   (macrolet ((m (a b c)
2476
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2477
     (setf (aref y 0)
2478
           (logxor (aref k (+ k-start 0))
2479
                   (m 0 0 0) (m 1 0 -8) (m 2 0 -16) (m 3 0 -24)
2480
                   (m 4 1 -32) (m 5 1 -40) (m 6 1 -48) (m 7 1 -56)))
2481
     (setf (aref y 1)
2482
           (logxor (aref k (+ k-start 1))
2483
                   (m 0 1 0) (m 1 1 -8) (m 2 1 -16) (m 3 1 -24)
2484
                   (m 4 0 -32) (m 5 0 -40) (m 6 0 -48) (m 7 0 -56))))
2485
   (values))
2486
 
2487
 (defclass kalyna128 (cipher 16-byte-block-mixin)
2488
   ((encryption-round-keys :accessor encryption-round-keys
2489
                           :initform (make-array 30 :element-type '(unsigned-byte 64))
2490
                           :type (simple-array (unsigned-byte 64) (30)))
2491
    (decryption-round-keys :accessor decryption-round-keys
2492
                           :initform (make-array 30 :element-type '(unsigned-byte 64))
2493
                           :type (simple-array (unsigned-byte 64) (30)))
2494
    (n-rounds :accessor n-rounds)))
2495
 
2496
 (defmethod schedule-key ((cipher kalyna128) key)
2497
   (let ((encryption-round-keys (encryption-round-keys cipher))
2498
         (decryption-round-keys (decryption-round-keys cipher)))
2499
     (declare (type (simple-array (unsigned-byte 64) (30)) encryption-round-keys)
2500
              (type (simple-array (unsigned-byte 64) (30)) decryption-round-keys))
2501
     (ecase (length key)
2502
       (16
2503
        (let ((key (make-array 2 :element-type '(unsigned-byte 64)
2504
                                 :initial-contents (list (ub64ref/le key 0)
2505
                                                         (ub64ref/le key 8))))
2506
              (ks (make-array 2 :element-type '(unsigned-byte 64)))
2507
              (ksc (make-array 2 :element-type '(unsigned-byte 64)))
2508
              (t1 (make-array 2 :element-type '(unsigned-byte 64)))
2509
              (t2 (make-array 2 :element-type '(unsigned-byte 64)))
2510
              (k (make-array 2 :element-type '(unsigned-byte 64)))
2511
              (kswapped (make-array 2 :element-type '(unsigned-byte 64)))
2512
              (constant #x0001000100010001))
2513
          (declare (type (simple-array (unsigned-byte 64) (2)) key ks ksc t1 t2 k kswapped)
2514
                   (dynamic-extent key ks ksc t1 t2 k kswapped)
2515
                   (type (unsigned-byte 64) constant))
2516
          (setf (n-rounds cipher) 10)
2517
          (setf (aref t1 0) (/ (+ 128 128 64) 64)
2518
                (aref t1 1) 0)
2519
          (kalyna-add-key 2 t1 0 t2 key)
2520
          (kalyna-g128 t2 t1 key 0)
2521
          (kalyna-gl128 t1 t2 0 key 0)
2522
          (kalyna-g0128 t2 ks)
2523
 
2524
          ;; Round 0
2525
          (replace k key)
2526
          (setf (aref kswapped 1) (aref k 0)
2527
                (aref kswapped 0) (aref k 1))
2528
          (kalyna-add-constant 2 ks ksc constant)
2529
          (kalyna-add-key 2 k 0 t2 ksc)
2530
          (kalyna-g128 t2 t1 ksc 0)
2531
          (kalyna-gl128 t1 encryption-round-keys 0 ksc 0)
2532
          (kalyna-make-odd-key 2 encryption-round-keys 0 encryption-round-keys 2)
2533
 
2534
          ;; Rounds 2 to 9
2535
          (flet ((r (v n)
2536
                   (setf constant (mod64ash constant 1))
2537
                   (kalyna-add-constant 2 ks ksc constant)
2538
                   (kalyna-add-key 2 v 0 t2 ksc)
2539
                   (kalyna-g128 t2 t1 ksc 0)
2540
                   (kalyna-gl128 t1 encryption-round-keys n ksc 0)
2541
                   (kalyna-make-odd-key 2
2542
                                        encryption-round-keys n
2543
                                        encryption-round-keys (+ n 2))))
2544
            (r kswapped 4)
2545
            (r k 8)
2546
            (r kswapped 12)
2547
            (r k 16))
2548
 
2549
          ;; Round 10
2550
          (setf constant (mod64ash constant 1))
2551
          (kalyna-add-constant 2 ks ksc constant)
2552
          (kalyna-add-key 2 kswapped 0 t2 ksc)
2553
          (kalyna-g128 t2 t1 ksc 0)
2554
          (kalyna-gl128 t1 encryption-round-keys 20 ksc 0)
2555
 
2556
          (replace decryption-round-keys encryption-round-keys)
2557
          (loop for n from 18 downto 2 by 2 do
2558
            (kalyna-imc128 decryption-round-keys n))))
2559
 
2560
       (32
2561
        (let ((key (make-array 4 :element-type '(unsigned-byte 64)
2562
                                 :initial-contents (list (ub64ref/le key 0)
2563
                                                         (ub64ref/le key 8)
2564
                                                         (ub64ref/le key 16)
2565
                                                         (ub64ref/le key 24))))
2566
              (ks (make-array 2 :element-type '(unsigned-byte 64)))
2567
              (ksc (make-array 2 :element-type '(unsigned-byte 64)))
2568
              (t1 (make-array 2 :element-type '(unsigned-byte 64)))
2569
              (t2 (make-array 2 :element-type '(unsigned-byte 64)))
2570
              (k (make-array 4 :element-type '(unsigned-byte 64)))
2571
              (ka (make-array 2 :element-type '(unsigned-byte 64)))
2572
              (ko (make-array 2 :element-type '(unsigned-byte 64)))
2573
              (constant #x0001000100010001))
2574
          (declare (type (simple-array (unsigned-byte 64) (4)) key k)
2575
                   (type (simple-array (unsigned-byte 64) (2)) ks ksc t1 t2 ka ko)
2576
                   (dynamic-extent key ks ksc t1 t2 k ka ko)
2577
                   (type (unsigned-byte 64) constant))
2578
          (setf (n-rounds cipher) 14)
2579
          (setf (aref t1 0) (/ (+ 128 256 64) 64)
2580
                (aref t1 1) 0)
2581
          (replace ka key :end2 2)
2582
          (replace ko key :start2 2)
2583
          (kalyna-add-key 2 t1 0 t2 ka)
2584
          (kalyna-g128 t2 t1 ko 0)
2585
          (kalyna-gl128 t1 t2 0 ka 0)
2586
          (kalyna-g0128 t2 ks)
2587
 
2588
          ;; Round 0
2589
          (replace k key)
2590
          (kalyna-add-constant 2 ks ksc constant)
2591
          (kalyna-add-key 2 k 0 t2 ksc)
2592
          (kalyna-g128 t2 t1 ksc 0)
2593
          (kalyna-gl128 t1 encryption-round-keys 0 ksc 0)
2594
          (kalyna-make-odd-key 2 encryption-round-keys 0 encryption-round-keys 2)
2595
 
2596
          ;; Rounds 2 to 13
2597
          (flet ((r (v n)
2598
                   (when (zerop v)
2599
                     (kalyna-swap-blocks 4 k))
2600
                   (setf constant (mod64ash constant 1))
2601
                   (kalyna-add-constant 2 ks ksc constant)
2602
                   (kalyna-add-key 2 k v t2 ksc)
2603
                   (kalyna-g128 t2 t1 ksc 0)
2604
                   (kalyna-gl128 t1 encryption-round-keys n ksc 0)
2605
                   (kalyna-make-odd-key 2
2606
                                        encryption-round-keys n
2607
                                        encryption-round-keys (+ n 2))))
2608
            (r 2 4)
2609
            (r 0 8)
2610
            (r 2 12)
2611
            (r 0 16)
2612
            (r 2 20)
2613
            (r 0 24))
2614
 
2615
          ;; Round 14
2616
          (setf constant (mod64ash constant 1))
2617
          (kalyna-add-constant 2 ks ksc constant)
2618
          (kalyna-add-key 2 k 2 t2 ksc)
2619
          (kalyna-g128 t2 t1 ksc 0)
2620
          (kalyna-gl128 t1 encryption-round-keys 28 ksc 0)
2621
 
2622
          (replace decryption-round-keys encryption-round-keys)
2623
          (loop for n from 26 downto 2 by 2 do
2624
            (kalyna-imc128 decryption-round-keys n)))))
2625
     cipher))
2626
 
2627
 (define-block-encryptor kalyna128 16
2628
   (let ((encryption-round-keys (encryption-round-keys context))
2629
         (t1 (make-array 2 :element-type '(unsigned-byte 64)))
2630
         (t2 (make-array 2 :element-type '(unsigned-byte 64))))
2631
     (declare (type (simple-array (unsigned-byte 64) (30)) encryption-round-keys)
2632
              (type (simple-array (unsigned-byte 64) (2)) t1 t2)
2633
              (dynamic-extent t1 t2))
2634
     (setf (aref t2 0) (ub64ref/le plaintext plaintext-start)
2635
           (aref t2 1) (ub64ref/le plaintext (+ plaintext-start 8)))
2636
     (kalyna-add-key 2 t2 0 t1 encryption-round-keys)
2637
     (kalyna-g128 t1 t2 encryption-round-keys 2)
2638
     (kalyna-g128 t2 t1 encryption-round-keys 4)
2639
     (kalyna-g128 t1 t2 encryption-round-keys 6)
2640
     (kalyna-g128 t2 t1 encryption-round-keys 8)
2641
     (kalyna-g128 t1 t2 encryption-round-keys 10)
2642
     (kalyna-g128 t2 t1 encryption-round-keys 12)
2643
     (kalyna-g128 t1 t2 encryption-round-keys 14)
2644
     (kalyna-g128 t2 t1 encryption-round-keys 16)
2645
     (kalyna-g128 t1 t2 encryption-round-keys 18)
2646
     (ecase (n-rounds context)
2647
       (10
2648
        (kalyna-gl128 t2 t1 0 encryption-round-keys 20))
2649
       (14
2650
        (kalyna-g128 t2 t1 encryption-round-keys 20)
2651
        (kalyna-g128 t1 t2 encryption-round-keys 22)
2652
        (kalyna-g128 t2 t1 encryption-round-keys 24)
2653
        (kalyna-g128 t1 t2 encryption-round-keys 26)
2654
        (kalyna-gl128 t2 t1 0 encryption-round-keys 28)))
2655
     (setf (ub64ref/le ciphertext ciphertext-start) (aref t1 0)
2656
           (ub64ref/le ciphertext (+ ciphertext-start 8)) (aref t1 1))
2657
     (values)))
2658
 
2659
 (define-block-decryptor kalyna128 16
2660
   (let ((decryption-round-keys (decryption-round-keys context))
2661
         (t1 (make-array 2 :element-type '(unsigned-byte 64)))
2662
         (t2 (make-array 2 :element-type '(unsigned-byte 64))))
2663
     (declare (type (simple-array (unsigned-byte 64) (30)) decryption-round-keys)
2664
              (type (simple-array (unsigned-byte 64) (2)) t1 t2)
2665
              (dynamic-extent t1 t2))
2666
     (setf (aref t2 0) (ub64ref/le ciphertext ciphertext-start)
2667
           (aref t2 1) (ub64ref/le ciphertext (+ ciphertext-start 8)))
2668
     (ecase (n-rounds context)
2669
       (10
2670
        (kalyna-sub-key 2 t2 t1 decryption-round-keys 20)
2671
        (kalyna-imc128 t1 0))
2672
       (14
2673
        (kalyna-sub-key 2 t2 t1 decryption-round-keys 28)
2674
        (kalyna-imc128 t1 0)
2675
        (kalyna-ig128 t1 t2 decryption-round-keys 26)
2676
        (kalyna-ig128 t2 t1 decryption-round-keys 24)
2677
        (kalyna-ig128 t1 t2 decryption-round-keys 22)
2678
        (kalyna-ig128 t2 t1 decryption-round-keys 20)))
2679
     (kalyna-ig128 t1 t2 decryption-round-keys 18)
2680
     (kalyna-ig128 t2 t1 decryption-round-keys 16)
2681
     (kalyna-ig128 t1 t2 decryption-round-keys 14)
2682
     (kalyna-ig128 t2 t1 decryption-round-keys 12)
2683
     (kalyna-ig128 t1 t2 decryption-round-keys 10)
2684
     (kalyna-ig128 t2 t1 decryption-round-keys 8)
2685
     (kalyna-ig128 t1 t2 decryption-round-keys 6)
2686
     (kalyna-ig128 t2 t1 decryption-round-keys 4)
2687
     (kalyna-ig128 t1 t2 decryption-round-keys 2)
2688
     (kalyna-igl128 t2 t1 decryption-round-keys 0)
2689
     (setf (ub64ref/le plaintext plaintext-start) (aref t1 0)
2690
           (ub64ref/le plaintext (+ plaintext-start 8)) (aref t1 1))
2691
     (values)))
2692
 
2693
 (defcipher kalyna128
2694
   (:encrypt-function kalyna128-encrypt-block)
2695
   (:decrypt-function kalyna128-decrypt-block)
2696
   (:block-length 16)
2697
   (:key-length (:fixed 16 32)))
2698
 
2699
 ;;; Kalyna256
2700
 (declaim (inline kalyna-g0256))
2701
 (defun kalyna-g0256 (x y)
2702
   (declare (type (simple-array (unsigned-byte 64) (*)) x y)
2703
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2704
   (macrolet ((m (a b c)
2705
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2706
     (setf (aref y 0)
2707
           (logxor (m 0 0 0) (m 1 0 -8) (m 2 3 -16) (m 3 3 -24)
2708
                   (m 4 2 -32) (m 5 2 -40) (m 6 1 -48) (m 7 1 -56)))
2709
     (setf (aref y 1)
2710
           (logxor (m 0 1 0) (m 1 1 -8) (m 2 0 -16) (m 3 0 -24)
2711
                   (m 4 3 -32) (m 5 3 -40) (m 6 2 -48) (m 7 2 -56)))
2712
     (setf (aref y 2)
2713
           (logxor (m 0 2 0) (m 1 2 -8) (m 2 1 -16) (m 3 1 -24)
2714
                   (m 4 0 -32) (m 5 0 -40) (m 6 3 -48) (m 7 3 -56)))
2715
     (setf (aref y 3)
2716
           (logxor (m 0 3 0) (m 1 3 -8) (m 2 2 -16) (m 3 2 -24)
2717
                   (m 4 1 -32) (m 5 1 -40) (m 6 0 -48) (m 7 0 -56))))
2718
   (values))
2719
 
2720
 (declaim (inline kalyna-gl256))
2721
 (defun kalyna-gl256 (x y y-start k k-start)
2722
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2723
            (type (integer 0 76) y-start k-start)
2724
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2725
   (macrolet ((m (a b c)
2726
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2727
     (setf (aref y (+ y-start 0))
2728
           (mod64+ (aref k (+ k-start 0))
2729
                   (logxor (m 0 0 0) (m 1 0 -8) (m 2 3 -16) (m 3 3 -24)
2730
                           (m 4 2 -32) (m 5 2 -40) (m 6 1 -48) (m 7 1 -56))))
2731
     (setf (aref y (+ y-start 1))
2732
           (mod64+ (aref k (+ k-start 1))
2733
                   (logxor (m 0 1 0) (m 1 1 -8) (m 2 0 -16) (m 3 0 -24)
2734
                           (m 4 3 -32) (m 5 3 -40) (m 6 2 -48) (m 7 2 -56))))
2735
     (setf (aref y (+ y-start 2))
2736
           (mod64+ (aref k (+ k-start 2))
2737
                   (logxor (m 0 2 0) (m 1 2 -8) (m 2 1 -16) (m 3 1 -24)
2738
                           (m 4 0 -32) (m 5 0 -40) (m 6 3 -48) (m 7 3 -56))))
2739
     (setf (aref y (+ y-start 3))
2740
           (mod64+ (aref k (+ k-start 3))
2741
                   (logxor (m 0 3 0) (m 1 3 -8) (m 2 2 -16) (m 3 2 -24)
2742
                           (m 4 1 -32) (m 5 1 -40) (m 6 0 -48) (m 7 0 -56)))))
2743
   (values))
2744
 
2745
 (declaim (inline kalyna-imc256))
2746
 (defun kalyna-imc256 (x x-start)
2747
   (declare (type (simple-array (unsigned-byte 64) (*)) x)
2748
            (type (integer 0 76) x-start)
2749
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2750
   (macrolet ((m (a b c d)
2751
                `(aref +kalyna-it+
2752
                       ,a
2753
                       (aref +kalyna-s+
2754
                             ,b
2755
                             (logand (mod64ash (aref x (+ x-start ,c)) ,d) #xff)))))
2756
     (setf (aref x (+ x-start 0))
2757
           (logxor (m 0 0 0 0) (m 1 1 0 -8) (m 2 2 0 -16) (m 3 3 0 -24)
2758
                   (m 4 0 0 -32) (m 5 1 0 -40) (m 6 2 0 -48) (m 7 3 0 -56)))
2759
     (setf (aref x (+ x-start 1))
2760
           (logxor (m 0 0 1 0) (m 1 1 1 -8) (m 2 2 1 -16) (m 3 3 1 -24)
2761
                   (m 4 0 1 -32) (m 5 1 1 -40) (m 6 2 1 -48) (m 7 3 1 -56)))
2762
     (setf (aref x (+ x-start 2))
2763
           (logxor (m 0 0 2 0) (m 1 1 2 -8) (m 2 2 2 -16) (m 3 3 2 -24)
2764
                   (m 4 0 2 -32) (m 5 1 2 -40) (m 6 2 2 -48) (m 7 3 2 -56)))
2765
     (setf (aref x (+ x-start 3))
2766
           (logxor (m 0 0 3 0) (m 1 1 3 -8) (m 2 2 3 -16) (m 3 3 3 -24)
2767
                   (m 4 0 3 -32) (m 5 1 3 -40) (m 6 2 3 -48) (m 7 3 3 -56))))
2768
   (values))
2769
 
2770
 (declaim (inline kalyna-ig256))
2771
 (defun kalyna-ig256 (x y k k-start)
2772
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2773
            (type (integer 0 76) k-start)
2774
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2775
   (macrolet ((m (a b c)
2776
                `(aref +kalyna-it+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2777
     (setf (aref y 0)
2778
           (logxor (aref k (+ k-start 0))
2779
                   (m 0 0 0) (m 1 0 -8) (m 2 1 -16) (m 3 1 -24)
2780
                   (m 4 2 -32) (m 5 2 -40) (m 6 3 -48) (m 7 3 -56)))
2781
     (setf (aref y 1)
2782
           (logxor (aref k (+ k-start 1))
2783
                   (m 0 1 0) (m 1 1 -8) (m 2 2 -16) (m 3 2 -24)
2784
                   (m 4 3 -32) (m 5 3 -40) (m 6 0 -48) (m 7 0 -56)))
2785
     (setf (aref y 2)
2786
           (logxor (aref k (+ k-start 2))
2787
                   (m 0 2 0) (m 1 2 -8) (m 2 3 -16) (m 3 3 -24)
2788
                   (m 4 0 -32) (m 5 0 -40) (m 6 1 -48) (m 7 1 -56)))
2789
     (setf (aref y 3)
2790
           (logxor (aref k (+ k-start 3))
2791
                   (m 0 3 0) (m 1 3 -8) (m 2 0 -16) (m 3 0 -24)
2792
                   (m 4 1 -32) (m 5 1 -40) (m 6 2 -48) (m 7 2 -56))))
2793
   (values))
2794
 
2795
 (declaim (inline kalyna-igl256))
2796
 (defun kalyna-igl256 (x y k k-start)
2797
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2798
            (type (integer 0 76) k-start)
2799
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2800
   (macrolet ((m (a b c d)
2801
                `(mod64ash (aref +kalyna-is+
2802
                                 ,a
2803
                                 (logand (mod64ash (aref x ,b) ,c) #xff))
2804
                           ,d)))
2805
     (setf (aref y 0)
2806
           (mod64- (logxor (m 0 0 0 0) (m 1 0 -8 8) (m 2 1 -16 16) (m 3 1 -24 24)
2807
                           (m 0 2 -32 32) (m 1 2 -40 40) (m 2 3 -48 48) (m 3 3 -56 56))
2808
                   (aref k (+ k-start 0))))
2809
     (setf (aref y 1)
2810
           (mod64- (logxor (m 0 1 0 0) (m 1 1 -8 8) (m 2 2 -16 16) (m 3 2 -24 24)
2811
                           (m 0 3 -32 32) (m 1 3 -40 40) (m 2 0 -48 48) (m 3 0 -56 56))
2812
                   (aref k (+ k-start 1))))
2813
     (setf (aref y 2)
2814
           (mod64- (logxor (m 0 2 0 0) (m 1 2 -8 8) (m 2 3 -16 16) (m 3 3 -24 24)
2815
                           (m 0 0 -32 32) (m 1 0 -40 40) (m 2 1 -48 48) (m 3 1 -56 56))
2816
                   (aref k (+ k-start 2))))
2817
     (setf (aref y 3)
2818
           (mod64- (logxor (m 0 3 0 0) (m 1 3 -8 8) (m 2 0 -16 16) (m 3 0 -24 24)
2819
                           (m 0 1 -32 32) (m 1 1 -40 40) (m 2 2 -48 48) (m 3 2 -56 56))
2820
                   (aref k (+ k-start 3)))))
2821
   (values))
2822
 
2823
 (declaim (inline kalyna-g256))
2824
 (defun kalyna-g256 (x y k k-start)
2825
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
2826
            (type (integer 0 76) k-start)
2827
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
2828
   (macrolet ((m (a b c)
2829
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
2830
     (setf (aref y 0)
2831
           (logxor (aref k (+ k-start 0))
2832
                   (m 0 0 0) (m 1 0 -8) (m 2 3 -16) (m 3 3 -24)
2833
                   (m 4 2 -32) (m 5 2 -40) (m 6 1 -48) (m 7 1 -56)))
2834
     (setf (aref y 1)
2835
           (logxor (aref k (+ k-start 1))
2836
                   (m 0 1 0) (m 1 1 -8) (m 2 0 -16) (m 3 0 -24)
2837
                   (m 4 3 -32) (m 5 3 -40) (m 6 2 -48) (m 7 2 -56)))
2838
     (setf (aref y 2)
2839
           (logxor (aref k (+ k-start 2))
2840
                   (m 0 2 0) (m 1 2 -8) (m 2 1 -16) (m 3 1 -24)
2841
                   (m 4 0 -32) (m 5 0 -40) (m 6 3 -48) (m 7 3 -56)))
2842
     (setf (aref y 3)
2843
           (logxor (aref k (+ k-start 3))
2844
                   (m 0 3 0) (m 1 3 -8) (m 2 2 -16) (m 3 2 -24)
2845
                   (m 4 1 -32) (m 5 1 -40) (m 6 0 -48) (m 7 0 -56))))
2846
   (values))
2847
 
2848
 (defclass kalyna256 (cipher 32-byte-block-mixin)
2849
   ((encryption-round-keys :accessor encryption-round-keys
2850
                           :initform (make-array 76 :element-type '(unsigned-byte 64))
2851
                           :type (simple-array (unsigned-byte 64) (76)))
2852
    (decryption-round-keys :accessor decryption-round-keys
2853
                           :initform (make-array 76 :element-type '(unsigned-byte 64))
2854
                           :type (simple-array (unsigned-byte 64) (76)))
2855
    (n-rounds :accessor n-rounds)))
2856
 
2857
 (defmethod schedule-key ((cipher kalyna256) key)
2858
   (let ((encryption-round-keys (encryption-round-keys cipher))
2859
         (decryption-round-keys (decryption-round-keys cipher)))
2860
     (declare (type (simple-array (unsigned-byte 64) (76)) encryption-round-keys)
2861
              (type (simple-array (unsigned-byte 64) (76)) decryption-round-keys))
2862
     (ecase (length key)
2863
       (32
2864
        (let ((key (make-array 4 :element-type '(unsigned-byte 64)
2865
                                 :initial-contents (list (ub64ref/le key 0)
2866
                                                         (ub64ref/le key 8)
2867
                                                         (ub64ref/le key 16)
2868
                                                         (ub64ref/le key 24))))
2869
              (ks (make-array 4 :element-type '(unsigned-byte 64)))
2870
              (ksc (make-array 4 :element-type '(unsigned-byte 64)))
2871
              (t1 (make-array 4 :element-type '(unsigned-byte 64)))
2872
              (t2 (make-array 4 :element-type '(unsigned-byte 64)))
2873
              (k (make-array 4 :element-type '(unsigned-byte 64)))
2874
              (constant #x0001000100010001))
2875
          (declare (type (simple-array (unsigned-byte 64) (4)) key ks ksc t1 t2 k)
2876
                   (dynamic-extent key ks ksc t1 t2 k)
2877
                   (type (unsigned-byte 64) constant))
2878
          (setf (n-rounds cipher) 14)
2879
          (fill t1 0)
2880
          (setf (aref t1 0) (/ (+ 256 256 64) 64))
2881
          (kalyna-add-key 4 t1 0 t2 key)
2882
          (kalyna-g256 t2 t1 key 0)
2883
          (kalyna-gl256 t1 t2 0 key 0)
2884
          (kalyna-g0256 t2 ks)
2885
 
2886
          ;; Round 0
2887
          (replace k key)
2888
          (kalyna-add-constant 4 ks ksc constant)
2889
          (kalyna-add-key 4 k 0 t2 ksc)
2890
          (kalyna-g256 t2 t1 ksc 0)
2891
          (kalyna-gl256 t1 encryption-round-keys 0 ksc 0)
2892
          (kalyna-make-odd-key 4 encryption-round-keys 0 encryption-round-keys 4)
2893
 
2894
          ;; Rounds 2 to 13
2895
          (flet ((r (n)
2896
                   (kalyna-swap-blocks 4 k)
2897
                   (setf constant (mod64ash constant 1))
2898
                   (kalyna-add-constant 4 ks ksc constant)
2899
                   (kalyna-add-key 4 k 0 t2 ksc)
2900
                   (kalyna-g256 t2 t1 ksc 0)
2901
                   (kalyna-gl256 t1 encryption-round-keys n ksc 0)
2902
                   (kalyna-make-odd-key 4
2903
                                        encryption-round-keys n
2904
                                        encryption-round-keys (+ n 4))))
2905
            (r 8)
2906
            (r 16)
2907
            (r 24)
2908
            (r 32)
2909
            (r 40)
2910
            (r 48))
2911
 
2912
          ;; Round 14
2913
          (kalyna-swap-blocks 4 k)
2914
          (setf constant (mod64ash constant 1))
2915
          (kalyna-add-constant 4 ks ksc constant)
2916
          (kalyna-add-key 4 k 0 t2 ksc)
2917
          (kalyna-g256 t2 t1 ksc 0)
2918
          (kalyna-gl256 t1 encryption-round-keys 56 ksc 0)
2919
 
2920
          (replace decryption-round-keys encryption-round-keys)
2921
          (loop for n from 52 downto 4 by 4 do
2922
            (kalyna-imc256 decryption-round-keys n))))
2923
 
2924
       (64
2925
        (let ((key (make-array 8 :element-type '(unsigned-byte 64)
2926
                                 :initial-contents (list (ub64ref/le key 0)
2927
                                                         (ub64ref/le key 8)
2928
                                                         (ub64ref/le key 16)
2929
                                                         (ub64ref/le key 24)
2930
                                                         (ub64ref/le key 32)
2931
                                                         (ub64ref/le key 40)
2932
                                                         (ub64ref/le key 48)
2933
                                                         (ub64ref/le key 56))))
2934
              (ks (make-array 4 :element-type '(unsigned-byte 64)))
2935
              (ksc (make-array 4 :element-type '(unsigned-byte 64)))
2936
              (t1 (make-array 4 :element-type '(unsigned-byte 64)))
2937
              (t2 (make-array 4 :element-type '(unsigned-byte 64)))
2938
              (k (make-array 8 :element-type '(unsigned-byte 64)))
2939
              (ko (make-array 4 :element-type '(unsigned-byte 64)))
2940
              (ka (make-array 4 :element-type '(unsigned-byte 64)))
2941
              (constant #x0001000100010001))
2942
          (declare (type (simple-array (unsigned-byte 64) (8)) key k)
2943
                   (type (simple-array (unsigned-byte 64) (4)) ks ksc t1 t2 ko ka)
2944
                   (dynamic-extent key ks ksc t1 t2 k ko ka)
2945
                   (type (unsigned-byte 64) constant))
2946
          (setf (n-rounds cipher) 18)
2947
          (fill t1 0)
2948
          (setf (aref t1 0) (/ (+ 512 256 64) 64))
2949
          (replace ka key :end2 4)
2950
          (replace ko key :start2 4)
2951
          (kalyna-add-key 4 t1 0 t2 ka)
2952
          (kalyna-g256 t2 t1 ko 0)
2953
          (kalyna-gl256 t1 t2 0 ka 0)
2954
          (kalyna-g0256 t2 ks)
2955
 
2956
          ;; Round 0
2957
          (replace k key)
2958
          (kalyna-add-constant 4 ks ksc constant)
2959
          (kalyna-add-key 4 k 0 t2 ksc)
2960
          (kalyna-g256 t2 t1 ksc 0)
2961
          (kalyna-gl256 t1 encryption-round-keys 0 ksc 0)
2962
          (kalyna-make-odd-key 4 encryption-round-keys 0 encryption-round-keys 4)
2963
 
2964
          ;; Rounds 2 to 17
2965
          (flet ((r (v n)
2966
                   (when (zerop v)
2967
                     (kalyna-swap-blocks 8 k))
2968
                   (setf constant (mod64ash constant 1))
2969
                   (kalyna-add-constant 4 ks ksc constant)
2970
                   (kalyna-add-key 4 k v t2 ksc)
2971
                   (kalyna-g256 t2 t1 ksc 0)
2972
                   (kalyna-gl256 t1 encryption-round-keys n ksc 0)
2973
                   (kalyna-make-odd-key 4
2974
                                        encryption-round-keys n
2975
                                        encryption-round-keys (+ n 4))))
2976
            (r 4 8)
2977
            (r 0 16)
2978
            (r 4 24)
2979
            (r 0 32)
2980
            (r 4 40)
2981
            (r 0 48)
2982
            (r 4 56)
2983
            (r 0 64))
2984
 
2985
          ;; Round 18
2986
          (setf constant (mod64ash constant 1))
2987
          (kalyna-add-constant 4 ks ksc constant)
2988
          (kalyna-add-key 4 k 4 t2 ksc)
2989
          (kalyna-g256 t2 t1 ksc 0)
2990
          (kalyna-gl256 t1 encryption-round-keys 72 ksc 0)
2991
 
2992
          (replace decryption-round-keys encryption-round-keys)
2993
          (loop for n from 68 downto 4 by 4 do
2994
            (kalyna-imc256 decryption-round-keys n)))))
2995
     cipher))
2996
 
2997
 (define-block-encryptor kalyna256 32
2998
   (let ((encryption-round-keys (encryption-round-keys context))
2999
         (t1 (make-array 4 :element-type '(unsigned-byte 64)))
3000
         (t2 (make-array 4 :element-type '(unsigned-byte 64))))
3001
     (declare (type (simple-array (unsigned-byte 64) (76)) encryption-round-keys)
3002
              (type (simple-array (unsigned-byte 64) (4)) t1 t2)
3003
              (dynamic-extent t1 t2))
3004
     (setf (aref t2 0) (ub64ref/le plaintext plaintext-start)
3005
           (aref t2 1) (ub64ref/le plaintext (+ plaintext-start 8))
3006
           (aref t2 2) (ub64ref/le plaintext (+ plaintext-start 16))
3007
           (aref t2 3) (ub64ref/le plaintext (+ plaintext-start 24)))
3008
     (kalyna-add-key 4 t2 0 t1 encryption-round-keys)
3009
     (kalyna-g256 t1 t2 encryption-round-keys 4)
3010
     (kalyna-g256 t2 t1 encryption-round-keys 8)
3011
     (kalyna-g256 t1 t2 encryption-round-keys 12)
3012
     (kalyna-g256 t2 t1 encryption-round-keys 16)
3013
     (kalyna-g256 t1 t2 encryption-round-keys 20)
3014
     (kalyna-g256 t2 t1 encryption-round-keys 24)
3015
     (kalyna-g256 t1 t2 encryption-round-keys 28)
3016
     (kalyna-g256 t2 t1 encryption-round-keys 32)
3017
     (kalyna-g256 t1 t2 encryption-round-keys 36)
3018
     (kalyna-g256 t2 t1 encryption-round-keys 40)
3019
     (kalyna-g256 t1 t2 encryption-round-keys 44)
3020
     (kalyna-g256 t2 t1 encryption-round-keys 48)
3021
     (kalyna-g256 t1 t2 encryption-round-keys 52)
3022
     (ecase (n-rounds context)
3023
       (14
3024
        (kalyna-gl256 t2 t1 0 encryption-round-keys 56))
3025
       (18
3026
        (kalyna-g256 t2 t1 encryption-round-keys 56)
3027
        (kalyna-g256 t1 t2 encryption-round-keys 60)
3028
        (kalyna-g256 t2 t1 encryption-round-keys 64)
3029
        (kalyna-g256 t1 t2 encryption-round-keys 68)
3030
        (kalyna-gl256 t2 t1 0 encryption-round-keys 72)))
3031
     (setf (ub64ref/le ciphertext ciphertext-start) (aref t1 0)
3032
           (ub64ref/le ciphertext (+ ciphertext-start 8)) (aref t1 1)
3033
           (ub64ref/le ciphertext (+ ciphertext-start 16)) (aref t1 2)
3034
           (ub64ref/le ciphertext (+ ciphertext-start 24)) (aref t1 3))
3035
     (values)))
3036
 
3037
 (define-block-decryptor kalyna256 32
3038
   (let ((decryption-round-keys (decryption-round-keys context))
3039
         (t1 (make-array 4 :element-type '(unsigned-byte 64)))
3040
         (t2 (make-array 4 :element-type '(unsigned-byte 64))))
3041
     (declare (type (simple-array (unsigned-byte 64) (76)) decryption-round-keys)
3042
              (type (simple-array (unsigned-byte 64) (4)) t1 t2)
3043
              (dynamic-extent t1 t2))
3044
     (setf (aref t2 0) (ub64ref/le ciphertext ciphertext-start)
3045
           (aref t2 1) (ub64ref/le ciphertext (+ ciphertext-start 8))
3046
           (aref t2 2) (ub64ref/le ciphertext (+ ciphertext-start 16))
3047
           (aref t2 3) (ub64ref/le ciphertext (+ ciphertext-start 24)))
3048
     (ecase (n-rounds context)
3049
       (14
3050
        (kalyna-sub-key 4 t2 t1 decryption-round-keys 56)
3051
        (kalyna-imc256 t1 0))
3052
       (18
3053
        (kalyna-sub-key 4 t2 t1 decryption-round-keys 72)
3054
        (kalyna-imc256 t1 0)
3055
        (kalyna-ig256 t1 t2 decryption-round-keys 68)
3056
        (kalyna-ig256 t2 t1 decryption-round-keys 64)
3057
        (kalyna-ig256 t1 t2 decryption-round-keys 60)
3058
        (kalyna-ig256 t2 t1 decryption-round-keys 56)))
3059
     (kalyna-ig256 t1 t2 decryption-round-keys 52)
3060
     (kalyna-ig256 t2 t1 decryption-round-keys 48)
3061
     (kalyna-ig256 t1 t2 decryption-round-keys 44)
3062
     (kalyna-ig256 t2 t1 decryption-round-keys 40)
3063
     (kalyna-ig256 t1 t2 decryption-round-keys 36)
3064
     (kalyna-ig256 t2 t1 decryption-round-keys 32)
3065
     (kalyna-ig256 t1 t2 decryption-round-keys 28)
3066
     (kalyna-ig256 t2 t1 decryption-round-keys 24)
3067
     (kalyna-ig256 t1 t2 decryption-round-keys 20)
3068
     (kalyna-ig256 t2 t1 decryption-round-keys 16)
3069
     (kalyna-ig256 t1 t2 decryption-round-keys 12)
3070
     (kalyna-ig256 t2 t1 decryption-round-keys 8)
3071
     (kalyna-ig256 t1 t2 decryption-round-keys 4)
3072
     (kalyna-igl256 t2 t1 decryption-round-keys 0)
3073
     (setf (ub64ref/le plaintext plaintext-start) (aref t1 0)
3074
           (ub64ref/le plaintext (+ plaintext-start 8)) (aref t1 1)
3075
           (ub64ref/le plaintext (+ plaintext-start 16)) (aref t1 2)
3076
           (ub64ref/le plaintext (+ plaintext-start 24)) (aref t1 3))
3077
     (values)))
3078
 
3079
 (defcipher kalyna256
3080
   (:encrypt-function kalyna256-encrypt-block)
3081
   (:decrypt-function kalyna256-decrypt-block)
3082
   (:block-length 32)
3083
   (:key-length (:fixed 32 64)))
3084
 
3085
 ;;; Kalyna512
3086
 (declaim (inline kalyna-g0512))
3087
 (defun kalyna-g0512 (x y)
3088
   (declare (type (simple-array (unsigned-byte 64) (*)) x y)
3089
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
3090
   (macrolet ((m (a b c)
3091
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
3092
     (setf (aref y 0)
3093
           (logxor (m 0 0 0) (m 1 7 -8) (m 2 6 -16) (m 3 5 -24)
3094
                   (m 4 4 -32) (m 5 3 -40) (m 6 2 -48) (m 7 1 -56)))
3095
     (setf (aref y 1)
3096
           (logxor (m 0 1 0) (m 1 0 -8) (m 2 7 -16) (m 3 6 -24)
3097
                   (m 4 5 -32) (m 5 4 -40) (m 6 3 -48) (m 7 2 -56)))
3098
     (setf (aref y 2)
3099
           (logxor (m 0 2 0) (m 1 1 -8) (m 2 0 -16) (m 3 7 -24)
3100
                   (m 4 6 -32) (m 5 5 -40) (m 6 4 -48) (m 7 3 -56)))
3101
     (setf (aref y 3)
3102
           (logxor (m 0 3 0) (m 1 2 -8) (m 2 1 -16) (m 3 0 -24)
3103
                   (m 4 7 -32) (m 5 6 -40) (m 6 5 -48) (m 7 4 -56)))
3104
     (setf (aref y 4)
3105
           (logxor (m 0 4 0) (m 1 3 -8) (m 2 2 -16) (m 3 1 -24)
3106
                   (m 4 0 -32) (m 5 7 -40) (m 6 6 -48) (m 7 5 -56)))
3107
     (setf (aref y 5)
3108
           (logxor (m 0 5 0) (m 1 4 -8) (m 2 3 -16) (m 3 2 -24)
3109
                   (m 4 1 -32) (m 5 0 -40) (m 6 7 -48) (m 7 6 -56)))
3110
     (setf (aref y 6)
3111
           (logxor (m 0 6 0) (m 1 5 -8) (m 2 4 -16) (m 3 3 -24)
3112
                   (m 4 2 -32) (m 5 1 -40) (m 6 0 -48) (m 7 7 -56)))
3113
     (setf (aref y 7)
3114
           (logxor (m 0 7 0) (m 1 6 -8) (m 2 5 -16) (m 3 4 -24)
3115
                   (m 4 3 -32) (m 5 2 -40) (m 6 1 -48) (m 7 0 -56))))
3116
   (values))
3117
 
3118
 (declaim (inline kalyna-gl512))
3119
 (defun kalyna-gl512 (x y y-start k k-start)
3120
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
3121
            (type (integer 0 152) y-start k-start)
3122
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
3123
   (macrolet ((m (a b c)
3124
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
3125
     (setf (aref y (+ y-start 0))
3126
           (mod64+ (aref k (+ k-start 0))
3127
                   (logxor (m 0 0 0) (m 1 7 -8) (m 2 6 -16) (m 3 5 -24)
3128
                           (m 4 4 -32) (m 5 3 -40) (m 6 2 -48) (m 7 1 -56))))
3129
     (setf (aref y (+ y-start 1))
3130
           (mod64+ (aref k (+ k-start 1))
3131
                   (logxor (m 0 1 0) (m 1 0 -8) (m 2 7 -16) (m 3 6 -24)
3132
                           (m 4 5 -32) (m 5 4 -40) (m 6 3 -48) (m 7 2 -56))))
3133
     (setf (aref y (+ y-start 2))
3134
           (mod64+ (aref k (+ k-start 2))
3135
                   (logxor (m 0 2 0) (m 1 1 -8) (m 2 0 -16) (m 3 7 -24)
3136
                           (m 4 6 -32) (m 5 5 -40) (m 6 4 -48) (m 7 3 -56))))
3137
     (setf (aref y (+ y-start 3))
3138
           (mod64+ (aref k (+ k-start 3))
3139
                   (logxor (m 0 3 0) (m 1 2 -8) (m 2 1 -16) (m 3 0 -24)
3140
                           (m 4 7 -32) (m 5 6 -40) (m 6 5 -48) (m 7 4 -56))))
3141
     (setf (aref y (+ y-start 4))
3142
           (mod64+ (aref k (+ k-start 4))
3143
                   (logxor (m 0 4 0) (m 1 3 -8) (m 2 2 -16) (m 3 1 -24)
3144
                           (m 4 0 -32) (m 5 7 -40) (m 6 6 -48) (m 7 5 -56))))
3145
     (setf (aref y (+ y-start 5))
3146
           (mod64+ (aref k (+ k-start 5))
3147
                   (logxor (m 0 5 0) (m 1 4 -8) (m 2 3 -16) (m 3 2 -24)
3148
                           (m 4 1 -32) (m 5 0 -40) (m 6 7 -48) (m 7 6 -56))))
3149
     (setf (aref y (+ y-start 6))
3150
           (mod64+ (aref k (+ k-start 6))
3151
                   (logxor (m 0 6 0) (m 1 5 -8) (m 2 4 -16) (m 3 3 -24)
3152
                           (m 4 2 -32) (m 5 1 -40) (m 6 0 -48) (m 7 7 -56))))
3153
     (setf (aref y (+ y-start 7))
3154
           (mod64+ (aref k (+ k-start 7))
3155
                   (logxor (m 0 7 0) (m 1 6 -8) (m 2 5 -16) (m 3 4 -24)
3156
                           (m 4 3 -32) (m 5 2 -40) (m 6 1 -48) (m 7 0 -56)))))
3157
   (values))
3158
 
3159
 (declaim (inline kalyna-imc512))
3160
 (defun kalyna-imc512 (x x-start)
3161
   (declare (type (simple-array (unsigned-byte 64) (*)) x)
3162
            (type (integer 0 152) x-start)
3163
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
3164
   (macrolet ((m (a b c d)
3165
                `(aref +kalyna-it+
3166
                       ,a
3167
                       (aref +kalyna-s+
3168
                             ,b
3169
                             (logand (mod64ash (aref x (+ x-start ,c)) ,d) #xff)))))
3170
     (setf (aref x (+ x-start 0))
3171
           (logxor (m 0 0 0 0) (m 1 1 0 -8) (m 2 2 0 -16) (m 3 3 0 -24)
3172
                   (m 4 0 0 -32) (m 5 1 0 -40) (m 6 2 0 -48) (m 7 3 0 -56)))
3173
     (setf (aref x (+ x-start 1))
3174
           (logxor (m 0 0 1 0) (m 1 1 1 -8) (m 2 2 1 -16) (m 3 3 1 -24)
3175
                   (m 4 0 1 -32) (m 5 1 1 -40) (m 6 2 1 -48) (m 7 3 1 -56)))
3176
     (setf (aref x (+ x-start 2))
3177
           (logxor (m 0 0 2 0) (m 1 1 2 -8) (m 2 2 2 -16) (m 3 3 2 -24)
3178
                   (m 4 0 2 -32) (m 5 1 2 -40) (m 6 2 2 -48) (m 7 3 2 -56)))
3179
     (setf (aref x (+ x-start 3))
3180
           (logxor (m 0 0 3 0) (m 1 1 3 -8) (m 2 2 3 -16) (m 3 3 3 -24)
3181
                   (m 4 0 3 -32) (m 5 1 3 -40) (m 6 2 3 -48) (m 7 3 3 -56)))
3182
     (setf (aref x (+ x-start 4))
3183
           (logxor (m 0 0 4 0) (m 1 1 4 -8) (m 2 2 4 -16) (m 3 3 4 -24)
3184
                   (m 4 0 4 -32) (m 5 1 4 -40) (m 6 2 4 -48) (m 7 3 4 -56)))
3185
     (setf (aref x (+ x-start 5))
3186
           (logxor (m 0 0 5 0) (m 1 1 5 -8) (m 2 2 5 -16) (m 3 3 5 -24)
3187
                   (m 4 0 5 -32) (m 5 1 5 -40) (m 6 2 5 -48) (m 7 3 5 -56)))
3188
     (setf (aref x (+ x-start 6))
3189
           (logxor (m 0 0 6 0) (m 1 1 6 -8) (m 2 2 6 -16) (m 3 3 6 -24)
3190
                   (m 4 0 6 -32) (m 5 1 6 -40) (m 6 2 6 -48) (m 7 3 6 -56)))
3191
     (setf (aref x (+ x-start 7))
3192
           (logxor (m 0 0 7 0) (m 1 1 7 -8) (m 2 2 7 -16) (m 3 3 7 -24)
3193
                   (m 4 0 7 -32) (m 5 1 7 -40) (m 6 2 7 -48) (m 7 3 7 -56))))
3194
   (values))
3195
 
3196
 (declaim (inline kalyna-ig512))
3197
 (defun kalyna-ig512 (x y k k-start)
3198
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
3199
            (type (integer 0 152) k-start)
3200
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
3201
   (macrolet ((m (a b c)
3202
                `(aref +kalyna-it+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
3203
     (setf (aref y 0)
3204
           (logxor (aref k (+ k-start 0))
3205
                   (m 0 0 0) (m 1 1 -8) (m 2 2 -16) (m 3 3 -24)
3206
                   (m 4 4 -32) (m 5 5 -40) (m 6 6 -48) (m 7 7 -56)))
3207
     (setf (aref y 1)
3208
           (logxor (aref k (+ k-start 1))
3209
                   (m 0 1 0) (m 1 2 -8) (m 2 3 -16) (m 3 4 -24)
3210
                   (m 4 5 -32) (m 5 6 -40) (m 6 7 -48) (m 7 0 -56)))
3211
     (setf (aref y 2)
3212
           (logxor (aref k (+ k-start 2))
3213
                   (m 0 2 0) (m 1 3 -8) (m 2 4 -16) (m 3 5 -24)
3214
                   (m 4 6 -32) (m 5 7 -40) (m 6 0 -48) (m 7 1 -56)))
3215
     (setf (aref y 3)
3216
           (logxor (aref k (+ k-start 3))
3217
                   (m 0 3 0) (m 1 4 -8) (m 2 5 -16) (m 3 6 -24)
3218
                   (m 4 7 -32) (m 5 0 -40) (m 6 1 -48) (m 7 2 -56)))
3219
     (setf (aref y 4)
3220
           (logxor (aref k (+ k-start 4))
3221
                   (m 0 4 0) (m 1 5 -8) (m 2 6 -16) (m 3 7 -24)
3222
                   (m 4 0 -32) (m 5 1 -40) (m 6 2 -48) (m 7 3 -56)))
3223
     (setf (aref y 5)
3224
           (logxor (aref k (+ k-start 5))
3225
                   (m 0 5 0) (m 1 6 -8) (m 2 7 -16) (m 3 0 -24)
3226
                   (m 4 1 -32) (m 5 2 -40) (m 6 3 -48) (m 7 4 -56)))
3227
     (setf (aref y 6)
3228
           (logxor (aref k (+ k-start 6))
3229
                   (m 0 6 0) (m 1 7 -8) (m 2 0 -16) (m 3 1 -24)
3230
                   (m 4 2 -32) (m 5 3 -40) (m 6 4 -48) (m 7 5 -56)))
3231
     (setf (aref y 7)
3232
           (logxor (aref k (+ k-start 7))
3233
                   (m 0 7 0) (m 1 0 -8) (m 2 1 -16) (m 3 2 -24)
3234
                   (m 4 3 -32) (m 5 4 -40) (m 6 5 -48) (m 7 6 -56))))
3235
   (values))
3236
 
3237
 (declaim (inline kalyna-igl512))
3238
 (defun kalyna-igl512 (x y k k-start)
3239
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
3240
            (type (integer 0 152) k-start)
3241
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
3242
   (macrolet ((m (a b c d)
3243
                `(mod64ash (aref +kalyna-is+
3244
                                 ,a
3245
                                 (logand (mod64ash (aref x ,b) ,c) #xff))
3246
                           ,d)))
3247
     (setf (aref y 0)
3248
           (mod64- (logxor (m 0 0 0 0) (m 1 1 -8 8) (m 2 2 -16 16) (m 3 3 -24 24)
3249
                           (m 0 4 -32 32) (m 1 5 -40 40) (m 2 6 -48 48) (m 3 7 -56 56))
3250
                   (aref k (+ k-start 0))))
3251
     (setf (aref y 1)
3252
           (mod64- (logxor (m 0 1 0 0) (m 1 2 -8 8) (m 2 3 -16 16) (m 3 4 -24 24)
3253
                           (m 0 5 -32 32) (m 1 6 -40 40) (m 2 7 -48 48) (m 3 0 -56 56))
3254
                   (aref k (+ k-start 1))))
3255
     (setf (aref y 2)
3256
           (mod64- (logxor (m 0 2 0 0) (m 1 3 -8 8) (m 2 4 -16 16) (m 3 5 -24 24)
3257
                           (m 0 6 -32 32) (m 1 7 -40 40) (m 2 0 -48 48) (m 3 1 -56 56))
3258
                   (aref k (+ k-start 2))))
3259
     (setf (aref y 3)
3260
           (mod64- (logxor (m 0 3 0 0) (m 1 4 -8 8) (m 2 5 -16 16) (m 3 6 -24 24)
3261
                           (m 0 7 -32 32) (m 1 0 -40 40) (m 2 1 -48 48) (m 3 2 -56 56))
3262
                   (aref k (+ k-start 3))))
3263
     (setf (aref y 4)
3264
           (mod64- (logxor (m 0 4 0 0) (m 1 5 -8 8) (m 2 6 -16 16) (m 3 7 -24 24)
3265
                           (m 0 0 -32 32) (m 1 1 -40 40) (m 2 2 -48 48) (m 3 3 -56 56))
3266
                   (aref k (+ k-start 4))))
3267
     (setf (aref y 5)
3268
           (mod64- (logxor (m 0 5 0 0) (m 1 6 -8 8) (m 2 7 -16 16) (m 3 0 -24 24)
3269
                           (m 0 1 -32 32) (m 1 2 -40 40) (m 2 3 -48 48) (m 3 4 -56 56))
3270
                   (aref k (+ k-start 5))))
3271
     (setf (aref y 6)
3272
           (mod64- (logxor (m 0 6 0 0) (m 1 7 -8 8) (m 2 0 -16 16) (m 3 1 -24 24)
3273
                           (m 0 2 -32 32) (m 1 3 -40 40) (m 2 4 -48 48) (m 3 5 -56 56))
3274
                   (aref k (+ k-start 6))))
3275
     (setf (aref y 7)
3276
           (mod64- (logxor (m 0 7 0 0) (m 1 0 -8 8) (m 2 1 -16 16) (m 3 2 -24 24)
3277
                           (m 0 3 -32 32) (m 1 4 -40 40) (m 2 5 -48 48) (m 3 6 -56 56))
3278
                   (aref k (+ k-start 7)))))
3279
   (values))
3280
 
3281
 (declaim (inline kalyna-g512))
3282
 (defun kalyna-g512 (x y k k-start)
3283
   (declare (type (simple-array (unsigned-byte 64) (*)) x y k)
3284
            (type (integer 0 152) k-start)
3285
            (optimize (speed 3) (space 0) (debug 0) (safety 0)))
3286
   (macrolet ((m (a b c)
3287
                `(aref +kalyna-t+ ,a (logand (mod64ash (aref x ,b) ,c) #xff))))
3288
     (setf (aref y 0)
3289
           (logxor (aref k (+ k-start 0))
3290
                   (m 0 0 0) (m 1 7 -8) (m 2 6 -16) (m 3 5 -24)
3291
                   (m 4 4 -32) (m 5 3 -40) (m 6 2 -48) (m 7 1 -56)))
3292
     (setf (aref y 1)
3293
           (logxor (aref k (+ k-start 1))
3294
                   (m 0 1 0) (m 1 0 -8) (m 2 7 -16) (m 3 6 -24)
3295
                   (m 4 5 -32) (m 5 4 -40) (m 6 3 -48) (m 7 2 -56)))
3296
     (setf (aref y 2)
3297
           (logxor (aref k (+ k-start 2))
3298
                   (m 0 2 0) (m 1 1 -8) (m 2 0 -16) (m 3 7 -24)
3299
                   (m 4 6 -32) (m 5 5 -40) (m 6 4 -48) (m 7 3 -56)))
3300
     (setf (aref y 3)
3301
           (logxor (aref k (+ k-start 3))
3302
                   (m 0 3 0) (m 1 2 -8) (m 2 1 -16) (m 3 0 -24)
3303
                   (m 4 7 -32) (m 5 6 -40) (m 6 5 -48) (m 7 4 -56)))
3304
     (setf (aref y 4)
3305
           (logxor (aref k (+ k-start 4))
3306
                   (m 0 4 0) (m 1 3 -8) (m 2 2 -16) (m 3 1 -24)
3307
                   (m 4 0 -32) (m 5 7 -40) (m 6 6 -48) (m 7 5 -56)))
3308
     (setf (aref y 5)
3309
           (logxor (aref k (+ k-start 5))
3310
                   (m 0 5 0) (m 1 4 -8) (m 2 3 -16) (m 3 2 -24)
3311
                   (m 4 1 -32) (m 5 0 -40) (m 6 7 -48) (m 7 6 -56)))
3312
     (setf (aref y 6)
3313
           (logxor (aref k (+ k-start 6))
3314
                   (m 0 6 0) (m 1 5 -8) (m 2 4 -16) (m 3 3 -24)
3315
                   (m 4 2 -32) (m 5 1 -40) (m 6 0 -48) (m 7 7 -56)))
3316
     (setf (aref y 7)
3317
           (logxor (aref k (+ k-start 7))
3318
                   (m 0 7 0) (m 1 6 -8) (m 2 5 -16) (m 3 4 -24)
3319
                   (m 4 3 -32) (m 5 2 -40) (m 6 1 -48) (m 7 0 -56))))
3320
   (values))
3321
 
3322
 (defclass kalyna512 (cipher 64-byte-block-mixin)
3323
   ((encryption-round-keys :accessor encryption-round-keys
3324
                           :initform (make-array 152 :element-type '(unsigned-byte 64))
3325
                           :type (simple-array (unsigned-byte 64) (152)))
3326
    (decryption-round-keys :accessor decryption-round-keys
3327
                           :initform (make-array 152 :element-type '(unsigned-byte 64))
3328
                           :type (simple-array (unsigned-byte 64) (152)))
3329
    (n-rounds :accessor n-rounds)))
3330
 
3331
 (defmethod schedule-key ((cipher kalyna512) key)
3332
   (let ((encryption-round-keys (encryption-round-keys cipher))
3333
         (decryption-round-keys (decryption-round-keys cipher))
3334
         (key (make-array 8 :element-type '(unsigned-byte 64)
3335
                            :initial-contents (list (ub64ref/le key 0)
3336
                                                    (ub64ref/le key 8)
3337
                                                    (ub64ref/le key 16)
3338
                                                    (ub64ref/le key 24)
3339
                                                    (ub64ref/le key 32)
3340
                                                    (ub64ref/le key 40)
3341
                                                    (ub64ref/le key 48)
3342
                                                    (ub64ref/le key 56))))
3343
         (ks (make-array 8 :element-type '(unsigned-byte 64)))
3344
         (ksc (make-array 8 :element-type '(unsigned-byte 64)))
3345
         (t1 (make-array 8 :element-type '(unsigned-byte 64)))
3346
         (t2 (make-array 8 :element-type '(unsigned-byte 64)))
3347
         (k (make-array 8 :element-type '(unsigned-byte 64)))
3348
         (constant #x0001000100010001))
3349
     (declare (type (simple-array (unsigned-byte 64) (152)) encryption-round-keys)
3350
              (type (simple-array (unsigned-byte 64) (152)) decryption-round-keys)
3351
              (type (simple-array (unsigned-byte 64) (8)) key ks ksc t1 t2 k)
3352
              (dynamic-extent key ks ksc t1 t2 k)
3353
              (type (unsigned-byte 64) constant))
3354
     (setf (n-rounds cipher) 18)
3355
     (fill t1 0)
3356
     (setf (aref t1 0) (/ (+ 512 512 64) 64))
3357
     (kalyna-add-key 8 t1 0 t2 key)
3358
     (kalyna-g512 t2 t1 key 0)
3359
     (kalyna-gl512 t1 t2 0 key 0)
3360
     (kalyna-g0512 t2 ks)
3361
 
3362
     ;; Round 0
3363
     (replace k key)
3364
     (kalyna-add-constant 8 ks ksc constant)
3365
     (kalyna-add-key 8 k 0 t2 ksc)
3366
     (kalyna-g512 t2 t1 ksc 0)
3367
     (kalyna-gl512 t1 encryption-round-keys 0 ksc 0)
3368
     (kalyna-make-odd-key 8 encryption-round-keys 0 encryption-round-keys 8)
3369
 
3370
     ;; Rounds 2 to 17
3371
     (flet ((r (n)
3372
              (kalyna-swap-blocks 8 k)
3373
              (setf constant (mod64ash constant 1))
3374
              (kalyna-add-constant 8 ks ksc constant)
3375
              (kalyna-add-key 8 k 0 t2 ksc)
3376
              (kalyna-g512 t2 t1 ksc 0)
3377
              (kalyna-gl512 t1 encryption-round-keys n ksc 0)
3378
              (kalyna-make-odd-key 8
3379
                                   encryption-round-keys n
3380
                                   encryption-round-keys (+ n 8))))
3381
       (r 16)
3382
       (r 32)
3383
       (r 48)
3384
       (r 64)
3385
       (r 80)
3386
       (r 96)
3387
       (r 112)
3388
       (r 128))
3389
 
3390
     ;; Round 18
3391
     (kalyna-swap-blocks 8 k)
3392
     (setf constant (mod64ash constant 1))
3393
     (kalyna-add-constant 8 ks ksc constant)
3394
     (kalyna-add-key 8 k 0 t2 ksc)
3395
     (kalyna-g512 t2 t1 ksc 0)
3396
     (kalyna-gl512 t1 encryption-round-keys 144 ksc 0)
3397
 
3398
     (replace decryption-round-keys encryption-round-keys)
3399
     (loop for n from 136 downto 8 by 8 do
3400
       (kalyna-imc512 decryption-round-keys n))
3401
     cipher))
3402
 
3403
 (define-block-encryptor kalyna512 64
3404
   (let ((encryption-round-keys (encryption-round-keys context))
3405
         (t1 (make-array 8 :element-type '(unsigned-byte 64)))
3406
         (t2 (make-array 8 :element-type '(unsigned-byte 64))))
3407
     (declare (type (simple-array (unsigned-byte 64) (152)) encryption-round-keys)
3408
              (type (simple-array (unsigned-byte 64) (8)) t1 t2)
3409
              (dynamic-extent t1 t2))
3410
     (setf (aref t2 0) (ub64ref/le plaintext plaintext-start)
3411
           (aref t2 1) (ub64ref/le plaintext (+ plaintext-start 8))
3412
           (aref t2 2) (ub64ref/le plaintext (+ plaintext-start 16))
3413
           (aref t2 3) (ub64ref/le plaintext (+ plaintext-start 24))
3414
           (aref t2 4) (ub64ref/le plaintext (+ plaintext-start 32))
3415
           (aref t2 5) (ub64ref/le plaintext (+ plaintext-start 40))
3416
           (aref t2 6) (ub64ref/le plaintext (+ plaintext-start 48))
3417
           (aref t2 7) (ub64ref/le plaintext (+ plaintext-start 56)))
3418
     (kalyna-add-key 8 t2 0 t1 encryption-round-keys)
3419
     (kalyna-g512 t1 t2 encryption-round-keys 8)
3420
     (kalyna-g512 t2 t1 encryption-round-keys 16)
3421
     (kalyna-g512 t1 t2 encryption-round-keys 24)
3422
     (kalyna-g512 t2 t1 encryption-round-keys 32)
3423
     (kalyna-g512 t1 t2 encryption-round-keys 40)
3424
     (kalyna-g512 t2 t1 encryption-round-keys 48)
3425
     (kalyna-g512 t1 t2 encryption-round-keys 56)
3426
     (kalyna-g512 t2 t1 encryption-round-keys 64)
3427
     (kalyna-g512 t1 t2 encryption-round-keys 72)
3428
     (kalyna-g512 t2 t1 encryption-round-keys 80)
3429
     (kalyna-g512 t1 t2 encryption-round-keys 88)
3430
     (kalyna-g512 t2 t1 encryption-round-keys 96)
3431
     (kalyna-g512 t1 t2 encryption-round-keys 104)
3432
     (kalyna-g512 t2 t1 encryption-round-keys 112)
3433
     (kalyna-g512 t1 t2 encryption-round-keys 120)
3434
     (kalyna-g512 t2 t1 encryption-round-keys 128)
3435
     (kalyna-g512 t1 t2 encryption-round-keys 136)
3436
     (kalyna-gl512 t2 t1 0 encryption-round-keys 144)
3437
     (setf (ub64ref/le ciphertext ciphertext-start) (aref t1 0)
3438
           (ub64ref/le ciphertext (+ ciphertext-start 8)) (aref t1 1)
3439
           (ub64ref/le ciphertext (+ ciphertext-start 16)) (aref t1 2)
3440
           (ub64ref/le ciphertext (+ ciphertext-start 24)) (aref t1 3)
3441
           (ub64ref/le ciphertext (+ ciphertext-start 32)) (aref t1 4)
3442
           (ub64ref/le ciphertext (+ ciphertext-start 40)) (aref t1 5)
3443
           (ub64ref/le ciphertext (+ ciphertext-start 48)) (aref t1 6)
3444
           (ub64ref/le ciphertext (+ ciphertext-start 56)) (aref t1 7))
3445
     (values)))
3446
 
3447
 (define-block-decryptor kalyna512 64
3448
   (let ((decryption-round-keys (decryption-round-keys context))
3449
         (t1 (make-array 8 :element-type '(unsigned-byte 64)))
3450
         (t2 (make-array 8 :element-type '(unsigned-byte 64))))
3451
     (declare (type (simple-array (unsigned-byte 64) (152)) decryption-round-keys)
3452
              (type (simple-array (unsigned-byte 64) (8)) t1 t2)
3453
              (dynamic-extent t1 t2))
3454
     (setf (aref t2 0) (ub64ref/le ciphertext ciphertext-start)
3455
           (aref t2 1) (ub64ref/le ciphertext (+ ciphertext-start 8))
3456
           (aref t2 2) (ub64ref/le ciphertext (+ ciphertext-start 16))
3457
           (aref t2 3) (ub64ref/le ciphertext (+ ciphertext-start 24))
3458
           (aref t2 4) (ub64ref/le ciphertext (+ ciphertext-start 32))
3459
           (aref t2 5) (ub64ref/le ciphertext (+ ciphertext-start 40))
3460
           (aref t2 6) (ub64ref/le ciphertext (+ ciphertext-start 48))
3461
           (aref t2 7) (ub64ref/le ciphertext (+ ciphertext-start 56)))
3462
     (kalyna-sub-key 8 t2 t1 decryption-round-keys 144)
3463
     (kalyna-imc512 t1 0)
3464
     (kalyna-ig512 t1 t2 decryption-round-keys 136)
3465
     (kalyna-ig512 t2 t1 decryption-round-keys 128)
3466
     (kalyna-ig512 t1 t2 decryption-round-keys 120)
3467
     (kalyna-ig512 t2 t1 decryption-round-keys 112)
3468
     (kalyna-ig512 t1 t2 decryption-round-keys 104)
3469
     (kalyna-ig512 t2 t1 decryption-round-keys 96)
3470
     (kalyna-ig512 t1 t2 decryption-round-keys 88)
3471
     (kalyna-ig512 t2 t1 decryption-round-keys 80)
3472
     (kalyna-ig512 t1 t2 decryption-round-keys 72)
3473
     (kalyna-ig512 t2 t1 decryption-round-keys 64)
3474
     (kalyna-ig512 t1 t2 decryption-round-keys 56)
3475
     (kalyna-ig512 t2 t1 decryption-round-keys 48)
3476
     (kalyna-ig512 t1 t2 decryption-round-keys 40)
3477
     (kalyna-ig512 t2 t1 decryption-round-keys 32)
3478
     (kalyna-ig512 t1 t2 decryption-round-keys 24)
3479
     (kalyna-ig512 t2 t1 decryption-round-keys 16)
3480
     (kalyna-ig512 t1 t2 decryption-round-keys 8)
3481
     (kalyna-igl512 t2 t1 decryption-round-keys 0)
3482
     (setf (ub64ref/le plaintext plaintext-start) (aref t1 0)
3483
           (ub64ref/le plaintext (+ plaintext-start 8)) (aref t1 1)
3484
           (ub64ref/le plaintext (+ plaintext-start 16)) (aref t1 2)
3485
           (ub64ref/le plaintext (+ plaintext-start 24)) (aref t1 3)
3486
           (ub64ref/le plaintext (+ plaintext-start 32)) (aref t1 4)
3487
           (ub64ref/le plaintext (+ plaintext-start 40)) (aref t1 5)
3488
           (ub64ref/le plaintext (+ plaintext-start 48)) (aref t1 6)
3489
           (ub64ref/le plaintext (+ plaintext-start 56)) (aref t1 7))
3490
     (values)))
3491
 
3492
 (defcipher kalyna512
3493
   (:encrypt-function kalyna512-encrypt-block)
3494
   (:decrypt-function kalyna512-decrypt-block)
3495
   (:block-length 64)
3496
   (:key-length (:fixed 64)))