From 0440777c8d90b62ced9cb5faae16086b9fcd3729 Mon Sep 17 00:00:00 2001 From: Tony Arcieri Date: Sun, 9 Apr 2023 19:51:45 -0600 Subject: [PATCH] p224: add Wycheproof test vectors (#818) Generated using the `wycheproof2blb` utility: $ cargo run ~/src/wycheproof secp224r1 224 wycheproof.blb desc.txt This required a small change to `wycheproof2blb`: https://github.com/RustCrypto/utils/pull/891 Includes the following test vectors: ECDSA case 1 [valid] signature malleability ECDSA case 3 [valid] valid ECDSA case 4 [invalid] long form encoding of length of sequence ECDSA case 5 [invalid] length of sequence contains leading 0 ECDSA case 6 [invalid] wrong length of sequence ECDSA case 7 [invalid] wrong length of sequence ECDSA case 8 [invalid] uint32 overflow in length of sequence ECDSA case 9 [invalid] uint64 overflow in length of sequence ECDSA case 10 [invalid] length of sequence = 2**31 - 1 ECDSA case 11 [invalid] length of sequence = 2**32 - 1 ECDSA case 12 [invalid] length of sequence = 2**40 - 1 ECDSA case 13 [invalid] length of sequence = 2**64 - 1 ECDSA case 14 [invalid] incorrect length of sequence ECDSA case 15 [invalid] indefinite length without termination ECDSA case 16 [invalid] indefinite length without termination ECDSA case 17 [invalid] indefinite length without termination ECDSA case 18 [invalid] removing sequence ECDSA case 19 [invalid] lonely sequence tag ECDSA case 20 [invalid] appending 0's to sequence ECDSA case 21 [invalid] prepending 0's to sequence ECDSA case 22 [invalid] appending unused 0's to sequence ECDSA case 23 [invalid] appending null value to sequence ECDSA case 24 [invalid] including garbage ECDSA case 25 [invalid] including garbage ECDSA case 26 [invalid] including garbage ECDSA case 27 [invalid] including garbage ECDSA case 28 [invalid] including garbage ECDSA case 29 [invalid] including garbage ECDSA case 30 [invalid] including garbage ECDSA case 31 [invalid] including garbage ECDSA case 32 [invalid] including garbage ECDSA case 33 [invalid] including undefined tags ECDSA case 34 [invalid] including undefined tags ECDSA case 35 [invalid] including undefined tags ECDSA case 36 [invalid] including undefined tags ECDSA case 37 [invalid] including undefined tags ECDSA case 38 [invalid] including undefined tags ECDSA case 39 [invalid] truncated length of sequence ECDSA case 40 [invalid] using composition with indefinite length ECDSA case 41 [invalid] using composition with indefinite length ECDSA case 42 [invalid] using composition with indefinite length ECDSA case 43 [invalid] using composition with wrong tag ECDSA case 44 [invalid] using composition with wrong tag ECDSA case 45 [invalid] using composition with wrong tag ECDSA case 46 [invalid] Replacing sequence with NULL ECDSA case 47 [invalid] changing tag value of sequence ECDSA case 48 [invalid] changing tag value of sequence ECDSA case 49 [invalid] changing tag value of sequence ECDSA case 50 [invalid] changing tag value of sequence ECDSA case 51 [invalid] changing tag value of sequence ECDSA case 52 [invalid] dropping value of sequence ECDSA case 53 [invalid] using composition for sequence ECDSA case 54 [invalid] truncated sequence ECDSA case 55 [invalid] truncated sequence ECDSA case 56 [invalid] indefinite length ECDSA case 57 [invalid] indefinite length with truncated delimiter ECDSA case 58 [invalid] indefinite length with additional element ECDSA case 59 [invalid] indefinite length with truncated element ECDSA case 60 [invalid] indefinite length with garbage ECDSA case 61 [invalid] indefinite length with nonempty EOC ECDSA case 62 [invalid] prepend empty sequence ECDSA case 63 [invalid] append empty sequence ECDSA case 64 [invalid] append garbage with high tag number ECDSA case 65 [invalid] sequence of sequence ECDSA case 66 [invalid] truncated sequence: removed last 1 elements ECDSA case 67 [invalid] repeating element in sequence ECDSA case 68 [invalid] long form encoding of length of integer ECDSA case 69 [invalid] long form encoding of length of integer ECDSA case 70 [invalid] length of integer contains leading 0 ECDSA case 71 [invalid] length of integer contains leading 0 ECDSA case 72 [invalid] wrong length of integer ECDSA case 73 [invalid] wrong length of integer ECDSA case 74 [invalid] wrong length of integer ECDSA case 75 [invalid] wrong length of integer ECDSA case 76 [invalid] uint32 overflow in length of integer ECDSA case 77 [invalid] uint32 overflow in length of integer ECDSA case 78 [invalid] uint64 overflow in length of integer ECDSA case 79 [invalid] uint64 overflow in length of integer ECDSA case 80 [invalid] length of integer = 2**31 - 1 ECDSA case 81 [invalid] length of integer = 2**31 - 1 ECDSA case 82 [invalid] length of integer = 2**32 - 1 ECDSA case 83 [invalid] length of integer = 2**32 - 1 ECDSA case 84 [invalid] length of integer = 2**40 - 1 ECDSA case 85 [invalid] length of integer = 2**40 - 1 ECDSA case 86 [invalid] length of integer = 2**64 - 1 ECDSA case 87 [invalid] length of integer = 2**64 - 1 ECDSA case 88 [invalid] incorrect length of integer ECDSA case 89 [invalid] incorrect length of integer ECDSA case 90 [invalid] removing integer ECDSA case 91 [invalid] lonely integer tag ECDSA case 92 [invalid] lonely integer tag ECDSA case 93 [invalid] appending 0's to integer ECDSA case 94 [invalid] appending 0's to integer ECDSA case 95 [invalid] prepending 0's to integer ECDSA case 96 [invalid] prepending 0's to integer ECDSA case 97 [invalid] appending unused 0's to integer ECDSA case 98 [invalid] appending null value to integer ECDSA case 99 [invalid] appending null value to integer ECDSA case 100 [invalid] truncated length of integer ECDSA case 101 [invalid] truncated length of integer ECDSA case 102 [invalid] Replacing integer with NULL ECDSA case 103 [invalid] Replacing integer with NULL ECDSA case 104 [invalid] changing tag value of integer ECDSA case 105 [invalid] changing tag value of integer ECDSA case 106 [invalid] changing tag value of integer ECDSA case 107 [invalid] changing tag value of integer ECDSA case 108 [invalid] changing tag value of integer ECDSA case 109 [invalid] changing tag value of integer ECDSA case 110 [invalid] changing tag value of integer ECDSA case 111 [invalid] changing tag value of integer ECDSA case 112 [invalid] changing tag value of integer ECDSA case 113 [invalid] changing tag value of integer ECDSA case 114 [invalid] dropping value of integer ECDSA case 115 [invalid] dropping value of integer ECDSA case 116 [invalid] using composition for integer ECDSA case 117 [invalid] using composition for integer ECDSA case 118 [invalid] modify first byte of integer ECDSA case 119 [invalid] modify first byte of integer ECDSA case 120 [invalid] modify last byte of integer ECDSA case 121 [invalid] modify last byte of integer ECDSA case 122 [invalid] truncated integer ECDSA case 123 [invalid] truncated integer ECDSA case 124 [invalid] truncated integer ECDSA case 125 [invalid] leading ff in integer ECDSA case 126 [invalid] leading ff in integer ECDSA case 127 [invalid] replaced integer by infinity ECDSA case 128 [invalid] replaced integer by infinity ECDSA case 129 [invalid] replacing integer with zero ECDSA case 130 [invalid] replacing integer with zero ECDSA case 131 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 132 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 133 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 134 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 135 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 136 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 137 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 138 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 139 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 140 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 141 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 142 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 143 [invalid] Modified r or s, e.g. by adding or subtracting the order of the group ECDSA case 144 [invalid] Signature with special case values for r and s ECDSA case 145 [invalid] Signature with special case values for r and s ECDSA case 146 [invalid] Signature with special case values for r and s ECDSA case 147 [invalid] Signature with special case values for r and s ECDSA case 148 [invalid] Signature with special case values for r and s ECDSA case 149 [invalid] Signature with special case values for r and s ECDSA case 150 [invalid] Signature with special case values for r and s ECDSA case 151 [invalid] Signature with special case values for r and s ECDSA case 152 [invalid] Signature with special case values for r and s ECDSA case 153 [invalid] Signature with special case values for r and s ECDSA case 154 [invalid] Signature with special case values for r and s ECDSA case 155 [invalid] Signature with special case values for r and s ECDSA case 156 [invalid] Signature with special case values for r and s ECDSA case 157 [invalid] Signature with special case values for r and s ECDSA case 158 [invalid] Signature with special case values for r and s ECDSA case 159 [invalid] Signature with special case values for r and s ECDSA case 160 [invalid] Signature with special case values for r and s ECDSA case 161 [invalid] Signature with special case values for r and s ECDSA case 162 [invalid] Signature with special case values for r and s ECDSA case 163 [invalid] Signature with special case values for r and s ECDSA case 164 [invalid] Signature with special case values for r and s ECDSA case 165 [invalid] Signature with special case values for r and s ECDSA case 166 [invalid] Signature with special case values for r and s ECDSA case 167 [invalid] Signature with special case values for r and s ECDSA case 168 [invalid] Signature with special case values for r and s ECDSA case 169 [invalid] Signature with special case values for r and s ECDSA case 170 [invalid] Signature with special case values for r and s ECDSA case 171 [invalid] Signature with special case values for r and s ECDSA case 172 [invalid] Signature with special case values for r and s ECDSA case 173 [invalid] Signature with special case values for r and s ECDSA case 174 [invalid] Signature with special case values for r and s ECDSA case 175 [invalid] Signature with special case values for r and s ECDSA case 176 [invalid] Signature with special case values for r and s ECDSA case 177 [invalid] Signature with special case values for r and s ECDSA case 178 [invalid] Signature with special case values for r and s ECDSA case 179 [invalid] Signature with special case values for r and s ECDSA case 180 [invalid] Signature with special case values for r and s ECDSA case 181 [invalid] Signature with special case values for r and s ECDSA case 182 [invalid] Signature with special case values for r and s ECDSA case 183 [invalid] Signature with special case values for r and s ECDSA case 184 [invalid] Signature with special case values for r and s ECDSA case 185 [invalid] Signature with special case values for r and s ECDSA case 186 [invalid] Signature with special case values for r and s ECDSA case 187 [invalid] Signature with special case values for r and s ECDSA case 188 [invalid] Signature with special case values for r and s ECDSA case 189 [invalid] Signature with special case values for r and s ECDSA case 190 [invalid] Signature with special case values for r and s ECDSA case 191 [invalid] Signature with special case values for r and s ECDSA case 192 [invalid] Signature with special case values for r and s ECDSA case 193 [invalid] Signature with special case values for r and s ECDSA case 194 [invalid] Signature with special case values for r and s ECDSA case 195 [invalid] Signature with special case values for r and s ECDSA case 196 [invalid] Signature with special case values for r and s ECDSA case 197 [invalid] Signature with special case values for r and s ECDSA case 198 [invalid] Signature with special case values for r and s ECDSA case 199 [invalid] Signature with special case values for r and s ECDSA case 200 [invalid] Signature with special case values for r and s ECDSA case 201 [invalid] Signature with special case values for r and s ECDSA case 202 [invalid] Signature with special case values for r and s ECDSA case 203 [invalid] Signature with special case values for r and s ECDSA case 204 [invalid] Signature with special case values for r and s ECDSA case 205 [invalid] Signature with special case values for r and s ECDSA case 206 [invalid] Signature with special case values for r and s ECDSA case 207 [invalid] Signature with special case values for r and s ECDSA case 208 [invalid] Signature with special case values for r and s ECDSA case 209 [invalid] Signature with special case values for r and s ECDSA case 210 [invalid] Signature with special case values for r and s ECDSA case 211 [invalid] Signature with special case values for r and s ECDSA case 212 [invalid] Signature with special case values for r and s ECDSA case 213 [invalid] Signature with special case values for r and s ECDSA case 214 [invalid] Signature with special case values for r and s ECDSA case 215 [invalid] Signature with special case values for r and s ECDSA case 216 [invalid] Signature with special case values for r and s ECDSA case 217 [invalid] Signature with special case values for r and s ECDSA case 218 [invalid] Signature with special case values for r and s ECDSA case 219 [invalid] Signature with special case values for r and s ECDSA case 220 [invalid] Signature with special case values for r and s ECDSA case 221 [invalid] Signature with special case values for r and s ECDSA case 222 [invalid] Signature with special case values for r and s ECDSA case 223 [invalid] Signature with special case values for r and s ECDSA case 224 [invalid] Signature encoding contains wrong types. ECDSA case 225 [invalid] Signature encoding contains wrong types. ECDSA case 226 [invalid] Signature encoding contains wrong types. ECDSA case 227 [invalid] Signature encoding contains wrong types. ECDSA case 228 [invalid] Signature encoding contains wrong types. ECDSA case 229 [invalid] Signature encoding contains wrong types. ECDSA case 230 [valid] Edge case for Shamir multiplication ECDSA case 231 [valid] special case hash ECDSA case 232 [valid] special case hash ECDSA case 233 [valid] special case hash ECDSA case 234 [valid] special case hash ECDSA case 235 [valid] special case hash ECDSA case 236 [valid] special case hash ECDSA case 237 [valid] special case hash ECDSA case 238 [valid] special case hash ECDSA case 239 [valid] special case hash ECDSA case 240 [valid] special case hash ECDSA case 241 [valid] special case hash ECDSA case 242 [valid] special case hash ECDSA case 243 [valid] special case hash ECDSA case 244 [valid] special case hash ECDSA case 245 [valid] special case hash ECDSA case 246 [valid] special case hash ECDSA case 247 [valid] special case hash ECDSA case 248 [valid] special case hash ECDSA case 249 [valid] special case hash ECDSA case 250 [valid] special case hash ECDSA case 251 [valid] special case hash ECDSA case 252 [valid] special case hash ECDSA case 253 [valid] special case hash ECDSA case 254 [valid] special case hash ECDSA case 255 [valid] special case hash ECDSA case 256 [valid] special case hash ECDSA case 257 [valid] k*G has a large x-coordinate ECDSA case 258 [invalid] r too large ECDSA case 259 [valid] r,s are large ECDSA case 260 [valid] r and s^-1 have a large Hamming weight ECDSA case 261 [valid] r and s^-1 have a large Hamming weight ECDSA case 262 [valid] small r and s ECDSA case 263 [valid] small r and s ECDSA case 264 [valid] small r and s ECDSA case 265 [invalid] r is larger than n ECDSA case 266 [invalid] s is larger than n ECDSA case 267 [valid] small r and s^-1 ECDSA case 268 [valid] smallish r and s^-1 ECDSA case 269 [valid] 100-bit r and small s^-1 ECDSA case 270 [valid] small r and 100 bit s^-1 ECDSA case 271 [valid] 100-bit r and s^-1 ECDSA case 272 [valid] r and s^-1 are close to n ECDSA case 273 [valid] s == 1 ECDSA case 274 [invalid] s == 0 ECDSA case 275 [invalid] point at infinity during verify ECDSA case 276 [valid] edge case for signature malleability ECDSA case 277 [valid] edge case for signature malleability ECDSA case 278 [valid] u1 == 1 ECDSA case 279 [valid] u1 == n - 1 ECDSA case 280 [valid] u2 == 1 ECDSA case 281 [valid] u2 == n - 1 ECDSA case 282 [valid] edge case for u1 ECDSA case 283 [valid] edge case for u1 ECDSA case 284 [valid] edge case for u1 ECDSA case 285 [valid] edge case for u1 ECDSA case 286 [valid] edge case for u1 ECDSA case 287 [valid] edge case for u1 ECDSA case 288 [valid] edge case for u1 ECDSA case 289 [valid] edge case for u1 ECDSA case 290 [valid] edge case for u1 ECDSA case 291 [valid] edge case for u1 ECDSA case 292 [valid] edge case for u1 ECDSA case 293 [valid] edge case for u2 ECDSA case 294 [valid] edge case for u2 ECDSA case 295 [valid] edge case for u2 ECDSA case 296 [valid] edge case for u2 ECDSA case 297 [valid] edge case for u2 ECDSA case 298 [valid] edge case for u2 ECDSA case 299 [valid] edge case for u2 ECDSA case 300 [valid] edge case for u2 ECDSA case 301 [valid] edge case for u2 ECDSA case 302 [valid] edge case for u2 ECDSA case 303 [valid] edge case for u2 ECDSA case 304 [valid] point duplication during verification ECDSA case 305 [invalid] duplication bug ECDSA case 306 [invalid] comparison with point at infinity ECDSA case 307 [valid] extreme value for k and edgecase s ECDSA case 308 [valid] extreme value for k and s^-1 ECDSA case 309 [valid] extreme value for k and s^-1 ECDSA case 310 [valid] extreme value for k and s^-1 ECDSA case 311 [valid] extreme value for k and s^-1 ECDSA case 312 [valid] extreme value for k ECDSA case 313 [valid] extreme value for k and edgecase s ECDSA case 314 [valid] extreme value for k and s^-1 ECDSA case 315 [valid] extreme value for k and s^-1 ECDSA case 316 [valid] extreme value for k and s^-1 ECDSA case 317 [valid] extreme value for k and s^-1 ECDSA case 318 [valid] extreme value for k ECDSA case 319 [invalid] testing point duplication ECDSA case 320 [invalid] testing point duplication ECDSA case 321 [invalid] testing point duplication ECDSA case 322 [invalid] testing point duplication ECDSA case 323 [valid] pseudorandom signature ECDSA case 324 [valid] pseudorandom signature ECDSA case 325 [valid] pseudorandom signature ECDSA case 326 [valid] pseudorandom signature ECDSA case 327 [valid] y-coordinate of the public key has many trailing 0's ECDSA case 328 [valid] y-coordinate of the public key has many trailing 0's ECDSA case 329 [valid] y-coordinate of the public key has many trailing 0's ECDSA case 330 [valid] y-coordinate of the public key has many trailing 1's ECDSA case 331 [valid] y-coordinate of the public key has many trailing 1's ECDSA case 332 [valid] y-coordinate of the public key has many trailing 1's ECDSA case 333 [valid] x-coordinate of the public key has many trailing 0's ECDSA case 334 [valid] x-coordinate of the public key has many trailing 0's ECDSA case 335 [valid] x-coordinate of the public key has many trailing 0's ECDSA case 336 [valid] x-coordinate of the public key has many trailing 1's ECDSA case 337 [valid] x-coordinate of the public key has many trailing 1's ECDSA case 338 [valid] x-coordinate of the public key has many trailing 1's ECDSA case 339 [valid] y-coordinate of the public key is small ECDSA case 340 [valid] y-coordinate of the public key is small ECDSA case 341 [valid] y-coordinate of the public key is small ECDSA case 342 [valid] y-coordinate of the public key is large ECDSA case 343 [valid] y-coordinate of the public key is large ECDSA case 344 [valid] y-coordinate of the public key is large ECDSA case 345 [valid] x-coordinate of the public key is small ECDSA case 346 [valid] x-coordinate of the public key is small ECDSA case 347 [valid] x-coordinate of the public key is small ECDSA case 348 [valid] x-coordinate of the public key is large ECDSA case 349 [valid] x-coordinate of the public key is large ECDSA case 350 [valid] x-coordinate of the public key is large ECDSA case 351 [valid] y-coordinate of the public key is small ECDSA case 352 [valid] y-coordinate of the public key is small ECDSA case 353 [valid] y-coordinate of the public key is small ECDSA case 354 [valid] y-coordinate of the public key is large ECDSA case 355 [valid] y-coordinate of the public key is large ECDSA case 356 [valid] y-coordinate of the public key is large --- Cargo.lock | 1 + p224/Cargo.toml | 1 + p224/src/ecdsa.rs | 5 +++++ p224/src/test_vectors/data/wycheproof.blb | Bin 0 -> 25454 bytes 4 files changed, 7 insertions(+) create mode 100644 p224/src/test_vectors/data/wycheproof.blb diff --git a/Cargo.lock b/Cargo.lock index cc8cdd3a..5fc58a20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -712,6 +712,7 @@ checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" name = "p224" version = "0.13.0" dependencies = [ + "blobby", "ecdsa", "elliptic-curve", "hex-literal", diff --git a/p224/Cargo.toml b/p224/Cargo.toml index 4d60a641..84d0a3ed 100644 --- a/p224/Cargo.toml +++ b/p224/Cargo.toml @@ -25,6 +25,7 @@ primeorder = { version = "0.13", optional = true, path = "../primeorder" } sha2 = { version = "0.10", optional = true, default-features = false } [dev-dependencies] +blobby = "0.3" ecdsa-core = { version = "0.16", package = "ecdsa", default-features = false, features = ["dev"] } hex-literal = "0.4" primeorder = { version = "0.13", features = ["dev"], path = "../primeorder" } diff --git a/p224/src/ecdsa.rs b/p224/src/ecdsa.rs index 8046d20b..d8e34549 100644 --- a/p224/src/ecdsa.rs +++ b/p224/src/ecdsa.rs @@ -110,4 +110,9 @@ mod tests { use crate::{test_vectors::ecdsa::ECDSA_TEST_VECTORS, NistP224}; ecdsa_core::new_verification_test!(NistP224, ECDSA_TEST_VECTORS); } + + mod wycheproof { + use crate::NistP224; + ecdsa_core::new_wycheproof_test!(wycheproof, "wycheproof", NistP224); + } } diff --git a/p224/src/test_vectors/data/wycheproof.blb b/p224/src/test_vectors/data/wycheproof.blb new file mode 100644 index 0000000000000000000000000000000000000000..4a5d4578c2f7cc64bc0db500b65fab99d481cea0 GIT binary patch literal 25454 zcmch92RzmP|NV6@*(3m-Bj_^E}VjdcW`GCjb!;>=A>DBVaIA(B~X?1O=q4 z`+ed`fm7Gs8SlxsZ4~?BO-3sDqheOj$HBN7nn$YXY>~ymM13421hS?y7nwQkFy*w| zCDye&ckYC}9h8B<+3>Ngd!MAbC(&wvWlt^1$EP3q|ps1DC5SGx#SrNw^VcAhgeD92|48l$Jnd)w?APO*aC45%~6 zNj>W270){UcFrL{F{E!>(@K7=$ztwZ@fl-WR?XmPa zJ0hJIp)13o)5$E?$A8$S<`{o{kRb#cVFlIh|Gc5HIU2r{yx=W%LaqGnGLk&K{n$fJ zPLEku(1TZN1w5dJ0X^fPlA^usayr6?E-Ta|_X?ytcd&vYcyiO-5OS9oSb3vGN@5YI z2TUHHdP9=~=m%m2U1=bNrAb{q-p)p*lTLK6hmYUXFKV>aU;2lLJoFHY%CT?hZzU#m z^Ep=veOZ!|IAK!Xy)3mfi58*C&8Zi(NQMa?zv0*quZpnB{$7?+Ddcy`XEU%(0VW4# z1vRKa2B$3hIEe$k2?{(O;AeuG#$17PIq~c{*#w5N&6|x^)4QB}&0t}{%l$+A$crHA z%X5K;D|!NNZvA~kgZ5_VnOZ*q<*#)zC)Xaonv^7aX_7QQL%oj{4CT45`IrCv?HtTb zo(b$pqCQhe2J$djF!a346OdP&VqkwYt$ahu{u$D)3USRVu?A;#_ljWubLhUZl((nf zBC>)`UOv$ocV%+F>^+L?$B?T+sE{rwlf9{)t%Whwe9w{Pv#J6sCmf%JJwE9ba%l{1 z!wUNPoT0LSusHhJ-Gt+@WrXC#L`QflGw(-ATikbH1yv(Yh7~V!uj+8Un`l!xpLvW} z-Bz_PFgXO|hhPPjxCx%^TZ%m_s?7iz&wtW8>4p#qAvJWESXqoI48F4m&FuCiQk zeHhbq-;uBX`7i{4@B@;H9fB3qU#mDoN*d4VwGtn!_&lAyQOQ5*GP&Q7#O0GG&=>(A zSm5qZ2+$~CSP*FUFn%!kT@gZu;)hdL?4n@kkibF+fNI=5qW~IMI2sB4_ycHrV3+-Y zv1`{N1pq+kL2&m#fKq6nKY&C93&SA&2{1p{?gR3J1?*ZLbcF_BEppsu#9ie9SgRau zXb}1b7>4mS7^bi*ULXt@Q1J>N(5`^CquE_q{ElWIExIXavyxZa+mJH=#EYz z&sJpE$>N}j0R!UV;zCEZdnnxE^KM6tM<#)|ut&tjjfomJ6d^2dyNCjIss8rx2e_3B z$7}@**0=)$)&;n1AAkeqS406~yBxN*<{1n%2-flMk5PkQS7?hG;nrN?C%QX&Xao2i z`~w)flo=BT{13#jxqA#k*sq+!2*5B|tXaq5Lo_ekdn~L8--g(26u?pmM{VMuvRzW3 z-NK;x02RKwV2FU733y6=675Y#4*c!Yp^OMBUR?C0tt*4j?RuF4R3ZWP z$Z^jx00#DrJst`I7=(Wyj?F)SfjyIWuGz50L4cR0*yF%)#(^HLaE`Kse;^Lv0z9@l zLdSuwB7BM#r|rSNjup5#zyz*f7HpSYamR&wNyEhnCIB{%xCml|cHdnvIFkit1>+S5 zmgyh@ze2=rJnR@F=!B!sYp`uNutQ*WVHk+rDT@2l2=?v@p>)rDc=L%Z4foAZFrzy$|+{mj^h2r(xhki#Kd}EGkck@Q<}Rj zyglmtp>zokjIBsOJ5c(?SY(UWlP`A@r?n`JisOy4u>)lQ(&wwn%4*3}Ot&{Yx*Ttm zo!b8WMibnb{5MAbcU|xpst9%rRgF(dvwyg}yfKx_aqWF{I@&9E6z2|zrck%>uoyj8 zQR9RG0Vy6d1Rh~*?zr_v>cl7Mnt*e@3xPZ@eN!{=#Msz@A+4=(j3`#ZfywlpGrPMD zo)|mj_}lF}c*?OOjDMj*1KWcx=dDuw`GNoq{`18q`o*uR$Lx21{b0QPzU-Sk-5WtQ z3kxARd>hK*+fW`$Ltuyg`+*7gKVsa`5R68ohmin;Ng)9ne<4arpp1SG!yGFsJ?tek~XI^)Wf=Rj#j0cB$zYKvpwfLGv7GJXf4e>Jz&=60v z$l{=jpILCA;As{dD0rIXpD6!}S#Y4>XBJuf%_57hS>*9G3(ychvj7e8Gz+kw!8z68 zu0tFsc$x(V3Z7>9C(8d~791$}nMEFdv&dsH%g*?*nC0&c|I;jgZ}{J4`CH5X(JcQL zl>au%{{`j0&4L4E=iC1|R_<)}k0RRf_J5jXN2}lKw11n1{?>GBO^dT37+Jz z&=60vps%xFThibsEe;es&4L33PqX|JWoK6YS4KNf@G}b->&UVbaC>Cg+5k}yU~U(u zf)N23r@)-kFv3VFz`W-uAm@0`p($W?Q3No^ws*+T&oJiLLLk6wDapi;5=azg+YWbn zdh*Ef%8O;+7;WQ2dRO+x>v?%Aio7%xC1eIe#TZBKT-AC6y804w@KIODhiA;(qJ?V2 z4@{W+yMa%t(8J*p2uV0f3WY##;8{UYqlKg74r-q311#DI#;8<+{fULyyKNHk`ck1l7Sp7OfaO z2{9CahJ;CN%4-Xt^ntKQTt3+oJNGL)5VSLmvPyFL&(OCi6;V>ZzAu zcY==XZ)f6g_OXjuaODkW!>|>DOTop(5pehx+s*d1Vz=1NGQU-?jA8`wx`l8%2q!)F ztF^mP6xlRes_^}k$Sm))E7gm0pQoR1YJj1l3huef&U>5N7Bu`wP3mUUyha9f1z!&Z z=_;9HLKBC5 ztb3F6p8aL-a*iykorbv5xX#QMyb zD3!c=KKba@ryr)?%G?0n{bxOyyw~TF-iRfQg(+J#-DCB08V}OQQ9pM=2ZM)@l#~=h zAP^YgpceA;7oq~$PS222A*s|pQ~H&K5YXoh+Qyhjs5w=y$W!j||dv zT;$Ww(P;@E3`Jc8(Dot_Vp0;42>4Hze2F<~camFV)~cF7yLaUV{}{4kyj|n8{)ETX zX8_#hviF_O_Y5SsVz2TF32WtX96x^bOn2{W+4ICUOmI??QV5hJOcH^~gYDDHOQq*4 zm#>CR{1sKHaiSaV;uN)Fz2CJ5D;3~GSqt5;Z>5G z)0&M8e-Pu-wWorYZ>*(4hE%7w(10>Uh$CU*+j$tLQP7GAR1GP4vS%Z@pKDLWt86Ma zzA8HlIj#@@FQp~=2>aA?5{j>M5^=Vi_2)`q!0)R7)%Nwx#i#V zcV*(L&dnujm%rZ88z&1Xg@1UFmYdgHvDU}{h8{M2LY=1QGYx_Wrsj=}WQP_R2lBsM z6?^N%hr;M4i9#Y#QV22F7Fq$Hdh;goLQ>9y2fdO#6u!KxhRR`r?Y2B`5L3YC<`%EG z^a8pXC0Xj5sDRH=@7#zMeDp{_%6rjw9cpjCK*{&-e zQM3RFR7x&*OW&y$+Wuj)ZC zlptSyS=COZ7bF8o%P<CT(6Es{);q{(MDvcK1CxTm zkdiPdag1$E2j3L6IIc)N{K#CW-6U$lKtXXRJ21#CZo-lY43(+(eXDo8G`!+UrcsYS z?X~xTntXMcGz1P^XP7X7Ny6YLaY-?8BnC{{gGRV(?S$*TnTFM;%9HzZS&W0p^4VG2 zzI?U=L$%8{VhN6^%|oLS-rUwVS{t%;5TRR&*1gk}_Z|%fhoN9_1W*QuZP$*KRI-?V z?bLYBpieM_&L`_>r04(Xv4ej_6w0q<4cYw9o9ovU{x9-FztEfF@`1!?aJlJyIn zY{mqKlmaFOgyi->Da$E*%+GG1P}NrE)xj*Gl+?|M>Jskh@^NuD6EIY;c`x%`Wgobn zr7`FVWseMJVZDsyzenyzfwLZ=)Nw7bILMZGD6&UX9MZH%~I$ zQBbh{-4>b{Fmk}*NaVI|GZ_nqroPTkYb@-|m-y*kW1m-hluPx2RI37h&!m5ZOt`ECg zUR^j`m((ho%>`gZGHt9yJlrII>=UPId!(1zu1ci*q!TTNzeVgVh^`uuEer;x22ESA zt5er~=6Y3e=T2W8@Ml<-h|=gk+a|KJ+2+PyUT@$)AwcmR+LRnP?Q{PNr7bPfivIBt zR7KhJHDTk3_qqF|K`%ANkBJ*ou$Xs~fyM{k!Ni}!xu$#v90PC6z4`atcjhx2j=ZCx1g{|no{KLtbO4jZ0kiEd8&R3J%sYVJ;Y(9{E=nbM20*9$Io z0i9oeU^Et~m+CkjFBa!7jUyS%jS}`9OH3;^{0K7<26}&JDrQl4 z|Ko&S@#D*eVM+<>8xahvCi?{RH3~mSgGN>>3f$u_WLYB(OP7VZSK2PMD;>=pWeMb; zy1R8^k6wEMFrfnjwuIW|i~;QMw;2ktr}pbbeka?!(?Y2`#3~Ic{*+=DKhaf{-?^S< z-$1e){;u5mlXuSOYO2oHUoa2|Qt8(VLiCG&+dl2cog$ckkU$y~5LXyoq%GGyS>Kpa zq7^K1uxx5XsbaE%0g*t4qG_D+`CQH3wkFxOua^amdX#@czVyZ0r0B4Hj9XV%AlUrr z0%`zyc;3&hof)UF_w@3scfsovsrJ13G_0+A&(>Mrmq*E}4QG65f@TO)c0Clfvr$?c zli1^;aNT^UV>*UN3&xG!P9|SYYM>+zE68Xq(1%ie6A$*%X1(krPh2*=cHl(po!UVn zLl{4p_&|y-!rQPF43!V*v-K!$w63{w{IYVcw(z&O(thhBS?-5NnkXQs{l*mvv6FYD z)R`^!37hHMQ2(UaCt(AbuZ)aK1%$j5)-FvFQkz{|x-?z$Feqe_j);RaOMts5#`B+%hIG|Q<6$}Nh|Mee8C2Re_9VVW0Bu%={%OEI=@(?83VseOBj74W17yQFwC>c2r*7-&S!Ig7QVogmP!WQmJ$AewOw^T(A=g3g>oR@)W1v z@RbI=oj4f+a~renX>v(s^-^gZad>H$5?6hk!62rB=r~LiOu2`btFq^F%|)qc`HSdN zXzaZ~<{VS$Zlo@D#(v}-PCS_e7WrDwK$zF?klND|b;;N*ZA8HL>Yh&DeRzPypsz7${;x1$RhNh7K)w!YTuJ*I`a|v z7m5UrD4Oi6i_FfR6GVfvYv8WXox|bIz<@Hl z^EsACj*W(dp{u52`b>)Cp$`X^oqeHW`XTbG z%JZ}|rF*u!?3^9wy!dH~hC$9bx380x-*^l@a6~D-JyFFh{*IsK@nvbyaJ!y)aJ^6f zRrF}gJ;}bHwwGNYQ}HkJz5Q9~w>rlrEB5dC06LFn6Ob9B1J(8}-4YIU>ESzPXbf#g zPoFurY=@Et)iHe7kh#93^1OYvF-GBvsi`izZNepufMkoe!CUhT*3N;iSHbcnB@mR# zi`LGFfT~*oT<*f;!~LVzFNJM@+`sEr=WsB=dT2xAYK%AnO3`x z(60w499jN0eFzk%MW*@TW){j#n(isn`AI9$ib>0K!S2H+E;IRF>b!C#E>t2B=j^@? z3|L(?*NiV+aqOFmH>dwB&QzsRCmz%3xTI-A&^ii1$%&?v-`!g)-78eT$85d&UQM#e z5&sNi8_~B-BSqDRX8nsZY zDLr$igUwzo9W5Sbyu@(V+|)U!d!`x*@Xo9`NJFokqFlr{Tb=O|HvUZOf%&7gFW{dj24{NoMeS#F|Y^7tUyJxV;@_;jvcxko-oQIv6m{>z}Q_m!fu zVAWfTGE{t*zxs(mP`VycK1a_)G>-ArbRs#bCn0`X#1AGpGF&xf^H4PQUbUTpT|Onl zW$O`Ynl|xJzRz{3gBhh4_7CBuc~6b?;eNiA6pZ7YHoV^WOu)MNXUKDX#!>*{Q3vT$ zm{2?lfjP6B5>m&6Z@Yz^v=KcuCcnnRjxs@YI8JvwPVnlGcDn&4617T?2QxO(oo#Xc z7J^sj9~LRyU6RZ4RcpU{wk*?(`^ScM6~22oSn_Ic7U;adkbgYl$1S_ba=-7KdqRz! zX>1h+Bal9Y`sNF$y;EnkK3JZ{jb+7KMh-j5zXrn<`@!!>^;j zvbw(N=ZmjB;F9YdO#PVGFLOiXOp;LYaQ`Ev)hG)vo%Ag5Ln* zV%bc3VRSV{I}!k*&p^Wh&N8fspfcnaTrz>#OJ(h5PznvF;W zt*0`pC9|-lc~47a3)#F>zhOJ8?k7NpVgc!-Z1#VnAR1$gvaxs}U79&t5$$r@QP;qx z1s|)6DmmW|@=g$T^xCc^5`7rVwz!k#XLPFAx3|l(~{O5FZ{*&D%1k;QoYfJceB34x|W{v z!tu0+;d$nrbUZHmN1)loxA-Bbi^T4$c1NCmrtDglv3wlhshe@oXH_qs?SgK8AIe$O z^8L`sT1ZFY`HvIb?>;E&dFM%K8oVeW>wAY+-*?{xvnz2hk^7T*e&MUqyVsh|>`EBL zQv5C32nj(ck-Ts1y;woI>eo9kuXdE%i`0(6>qK2`Ok9sP>d>q8QnvK)g8P$no(~ne zJXIgEeF60*dC6r~Fyo{7PB%P~)S5a>|4_5+j0am;4Fq-YKo%K``;u>tB;9Ql+Ek?` zUID2N8s{s;uP4S($JnS2Hl*l_xlmBKOM01VenPZgm*svi4=W56$BTA|wfTYOapwks z?6_t4{tmmr$+#(mGprR!0853SE%ZShyWt)IX;9E9IAUVZ;J~Fz)|1yv z3aIvPK0k2cs_a6LC(T*Bh+ocWGLW~{c)BHiDBXO^EkSvG`2;iniE5zt_j`vqTC=N# z-reV4^w@89=6!nSY{WHBf})z2 zPPP(GtP{7y+1=G1t4~Ea9Wdd!w2-=@Ja)2!D-(?)qhxARn;i(}7wylB^M6W;nI z7h0*>EMAGyrRLIUdkaAwFq?U;l%*ZKt~_x&N$bduxB?y#TKkym93ri&(x8N@Lh^&o zMH9WR<>ANQBYTFaH1f_UDYZM9yzIn>xBrg5ZO4 zHjf)ge;C;}snE~r^pLWBhTK~;6-CmZGn2&k9X4A}%nqQdx*>5-Ll%eqH zT46`mJ2ogBfYmM!%Zb)@AOhTE9&Ex2hy$ylbob<)eWUMBqgIGI?|S5-rQ6*|W=4r0;!#BKxNjO3D{RG7uHiad!K`V*!n`@?Sm4@2yAog=h+~ zJJ!CZ*PNR}5y=2YC8IM@Q7uP5-3}e#PeG)68n)hL&KiKrS?e^RAeUqY9S~A=K$r@(8S@_Ap_QllpGmf z_J8*i8Rzag)jZ095`~3{klvuQ?2EMjP#I9T(WI<#uSLsC{BmuID=3is7E zO6o0zedny#PRc4%)iz8rcpd>a-ePWw+mak>-&iGwpv(;sWkXKYQqB)9L9-@aUkK7k zYMWmD@mSj_ss+W4dXN!XP(RVFu2($Pc5~+2^>ZAY+8+)tPKfs6MZ0y!V=v3Z53?2( zCL`n}#xOCUR`S2-<;JHU8}pl6{A2~PwPZSNi$ z!B^6U7F_nmd(h5(G+{R5FomFa0^_(#Ya)uSQTvNmAM`xkpiTEJ-aFAMLEsW_U|eLz ztyWW5I}|lYRhu(#-QBY^YkF76s(70lf z+&_2hpkppbOqbvdUetFCF5){!7YNE>w4dZ^{=SL}=1Wl)htsbVzFI*TJQ@GWdT#Ur zFz)FujQTA#?jN#08zf>`q^KbfMj#u53aq;M{1~3xcbL8PA8v0`aw}+woV2=t*uzX1 zDLg08W&h0M0RML*DUL(Zpet78M?dv&RD_-q>dE(6ba-AvOND%O1R>p_{hMTOn`PR%vXu{vSX_mSG}-IMI2 zse(EmO2y6a>Kv=%8Ptgs2!J1Q1PoH>XHvj3S~?Ks$}hjGqMUN+6DwnJlCGt!09*1C zFP}b;JZ0%Z-=hcEDdeydAt9gD+jlp^*Dj{|7}uRKr}SdKpgXnTatlIBw@3G!{nn-J zlIXi!l@Rxik*%z2uYTnFK{tlDpkRmY)hEor^;wPqlC;u_1*brX z5kCT3t8)jq`U)OVA>9W(sJ;Ra0>3{~@%tI(`lbA#=?dMa;hV4@QDD+~7TQhCp|4M4 zR~BVK6z9QE7f~5W$#}-&!Y_k497w-}$8<16m^?dX$B1;{ar7Nm?{42< zPr7{hAdOefd3~>t#AmMBG$peEBK1-Xd}muT98wj0T32|HHG-?8siJan^>y*%ZwG&3 z05|?X9*Z!Zp@>ZG|L&RJMXKtzO1D%ds5TjGaQieEYIojYHZ!;S(&A{vWcDNC=(6g^qY~3zpXcNcIJqlXkv1$=>@c8(Y_c-Ln zEGdLln0))PX?6;4>6Jcfz9QX?*stK6>IuD9<6^@Z)%AIjR6rza^u+}n^J({DsU%dq zC7W$rT9;0W`pBgp^%JK>qhPWtI>??_morunA4ynIp;v^jxuj}+_m8oL2(oO)QGmScXeF5yTWX+K z-Bcp^e0u5iO2E>OA(G|O0LI7$9odL?)c&)+6CysALt+jc+R+*%B~OOq^JIQvu!3^4 zUMQV)Z$54+M+^^aA!&Aeb%gGl6T=s za{B6Ul$6CN*FQw#fy6T!eh4Mg78S%ew8AFlwU_U$Y=I>LOOXcz7SNkloJsD|q0pb} z3GU_Ee3RTNd)75^=DI&QZBq0;o{4Fc;^wI{ZDhC zcQ`jsendEY<_H){yiy&1A!MK1`PUjHqx~5^k1Oj)e3i|}DOPzM(Gc7I=-ar|x2oUu z(PH8Z3D2TJV!Qf!%9)c-`n>qpnSem5K2%9B6BXWX39QZOGkmo_+-9Raqe98(%<%)m z5K7+diiu*q{q5p#)%Z|=ec8!FQETqei-G}Mu>ub1rX^q~oXLVNHtW&L5{Z<&j1W!J z-gR%!7taScn%$lnpfR>189%E}Tjq3Z@6v`BD|?*Y++!-QrIpqz_mZ7Co}wi&xS^eB z%m>k;X#Y0ZQ$;txl*B+E_JTp2UcncQf{_Gf(LruWF)!DoR(a9e_L=xn$Lnw*DD(6p z`9a`2ExfFqLl!3tk6v_U=xnf1cK7PAtE3mqz7)pyQVPOQ-ZCu-nx2UL7fWsa0@ZUKRW z2`={Bkx@Aje@CvCR*kT9o{tsYR<16FGa)|i>ZPG zKSeU+hKwnpGqYZw5KZ_E`LMTAqm6>Bkce2D@kyo+3AA&Gb8#0dNU=l2_P371NbM zk?0TJoHaam@jdMkyXXbAhW=7C#&&w=9fQ@MZ$NI`Vq})osnUM;Z1s42VS4x>TOHEfzo-rIYsF^C17QhT;44vqb)ad7P3_YkJ)AH6~UL zKO+IY@cu1j9P3~?)hWL!ve%$?&1tviL@Ig1huSw+_<;2~2_qBv>+^Bts}X%)Za#VQ RkO#8q@*d7BAYRb``G2>Q&(8n= literal 0 HcmV?d00001