1import _compression 2from io import BytesIO, UnsupportedOperation, DEFAULT_BUFFER_SIZE 3import os 4import pathlib 5import pickle 6import random 7import sys 8from test import support 9import unittest 10 11from test.support import ( 12 _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink 13) 14 15lzma = import_module("lzma") 16from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile 17 18 19class CompressorDecompressorTestCase(unittest.TestCase): 20 21 # Test error cases. 22 23 def test_simple_bad_args(self): 24 self.assertRaises(TypeError, LZMACompressor, []) 25 self.assertRaises(TypeError, LZMACompressor, format=3.45) 26 self.assertRaises(TypeError, LZMACompressor, check="") 27 self.assertRaises(TypeError, LZMACompressor, preset="asdf") 28 self.assertRaises(TypeError, LZMACompressor, filters=3) 29 # Can't specify FORMAT_AUTO when compressing. 30 self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO) 31 # Can't specify a preset and a custom filter chain at the same time. 32 with self.assertRaises(ValueError): 33 LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}]) 34 35 self.assertRaises(TypeError, LZMADecompressor, ()) 36 self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw") 37 with self.assertRaises(TypeError): 38 LZMADecompressor(lzma.FORMAT_RAW, filters="zzz") 39 # Cannot specify a memory limit with FILTER_RAW. 40 with self.assertRaises(ValueError): 41 LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000) 42 # Can only specify a custom filter chain with FILTER_RAW. 43 self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1) 44 with self.assertRaises(ValueError): 45 LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1) 46 with self.assertRaises(ValueError): 47 LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1) 48 49 lzc = LZMACompressor() 50 self.assertRaises(TypeError, lzc.compress) 51 self.assertRaises(TypeError, lzc.compress, b"foo", b"bar") 52 self.assertRaises(TypeError, lzc.flush, b"blah") 53 empty = lzc.flush() 54 self.assertRaises(ValueError, lzc.compress, b"quux") 55 self.assertRaises(ValueError, lzc.flush) 56 57 lzd = LZMADecompressor() 58 self.assertRaises(TypeError, lzd.decompress) 59 self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar") 60 lzd.decompress(empty) 61 self.assertRaises(EOFError, lzd.decompress, b"quux") 62 63 def test_bad_filter_spec(self): 64 self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"]) 65 self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}]) 66 self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}]) 67 with self.assertRaises(ValueError): 68 LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}]) 69 with self.assertRaises(ValueError): 70 LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}]) 71 with self.assertRaises(ValueError): 72 LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}]) 73 74 def test_decompressor_after_eof(self): 75 lzd = LZMADecompressor() 76 lzd.decompress(COMPRESSED_XZ) 77 self.assertRaises(EOFError, lzd.decompress, b"nyan") 78 79 def test_decompressor_memlimit(self): 80 lzd = LZMADecompressor(memlimit=1024) 81 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ) 82 83 lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024) 84 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ) 85 86 lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024) 87 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE) 88 89 # Test LZMADecompressor on known-good input data. 90 91 def _test_decompressor(self, lzd, data, check, unused_data=b""): 92 self.assertFalse(lzd.eof) 93 out = lzd.decompress(data) 94 self.assertEqual(out, INPUT) 95 self.assertEqual(lzd.check, check) 96 self.assertTrue(lzd.eof) 97 self.assertEqual(lzd.unused_data, unused_data) 98 99 def test_decompressor_auto(self): 100 lzd = LZMADecompressor() 101 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64) 102 103 lzd = LZMADecompressor() 104 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE) 105 106 def test_decompressor_xz(self): 107 lzd = LZMADecompressor(lzma.FORMAT_XZ) 108 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64) 109 110 def test_decompressor_alone(self): 111 lzd = LZMADecompressor(lzma.FORMAT_ALONE) 112 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE) 113 114 def test_decompressor_raw_1(self): 115 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1) 116 self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE) 117 118 def test_decompressor_raw_2(self): 119 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2) 120 self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE) 121 122 def test_decompressor_raw_3(self): 123 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3) 124 self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE) 125 126 def test_decompressor_raw_4(self): 127 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 128 self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE) 129 130 def test_decompressor_chunks(self): 131 lzd = LZMADecompressor() 132 out = [] 133 for i in range(0, len(COMPRESSED_XZ), 10): 134 self.assertFalse(lzd.eof) 135 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10])) 136 out = b"".join(out) 137 self.assertEqual(out, INPUT) 138 self.assertEqual(lzd.check, lzma.CHECK_CRC64) 139 self.assertTrue(lzd.eof) 140 self.assertEqual(lzd.unused_data, b"") 141 142 def test_decompressor_chunks_empty(self): 143 lzd = LZMADecompressor() 144 out = [] 145 for i in range(0, len(COMPRESSED_XZ), 10): 146 self.assertFalse(lzd.eof) 147 out.append(lzd.decompress(b'')) 148 out.append(lzd.decompress(b'')) 149 out.append(lzd.decompress(b'')) 150 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10])) 151 out = b"".join(out) 152 self.assertEqual(out, INPUT) 153 self.assertEqual(lzd.check, lzma.CHECK_CRC64) 154 self.assertTrue(lzd.eof) 155 self.assertEqual(lzd.unused_data, b"") 156 157 def test_decompressor_chunks_maxsize(self): 158 lzd = LZMADecompressor() 159 max_length = 100 160 out = [] 161 162 # Feed first half the input 163 len_ = len(COMPRESSED_XZ) // 2 164 out.append(lzd.decompress(COMPRESSED_XZ[:len_], 165 max_length=max_length)) 166 self.assertFalse(lzd.needs_input) 167 self.assertEqual(len(out[-1]), max_length) 168 169 # Retrieve more data without providing more input 170 out.append(lzd.decompress(b'', max_length=max_length)) 171 self.assertFalse(lzd.needs_input) 172 self.assertEqual(len(out[-1]), max_length) 173 174 # Retrieve more data while providing more input 175 out.append(lzd.decompress(COMPRESSED_XZ[len_:], 176 max_length=max_length)) 177 self.assertLessEqual(len(out[-1]), max_length) 178 179 # Retrieve remaining uncompressed data 180 while not lzd.eof: 181 out.append(lzd.decompress(b'', max_length=max_length)) 182 self.assertLessEqual(len(out[-1]), max_length) 183 184 out = b"".join(out) 185 self.assertEqual(out, INPUT) 186 self.assertEqual(lzd.check, lzma.CHECK_CRC64) 187 self.assertEqual(lzd.unused_data, b"") 188 189 def test_decompressor_inputbuf_1(self): 190 # Test reusing input buffer after moving existing 191 # contents to beginning 192 lzd = LZMADecompressor() 193 out = [] 194 195 # Create input buffer and fill it 196 self.assertEqual(lzd.decompress(COMPRESSED_XZ[:100], 197 max_length=0), b'') 198 199 # Retrieve some results, freeing capacity at beginning 200 # of input buffer 201 out.append(lzd.decompress(b'', 2)) 202 203 # Add more data that fits into input buffer after 204 # moving existing data to beginning 205 out.append(lzd.decompress(COMPRESSED_XZ[100:105], 15)) 206 207 # Decompress rest of data 208 out.append(lzd.decompress(COMPRESSED_XZ[105:])) 209 self.assertEqual(b''.join(out), INPUT) 210 211 def test_decompressor_inputbuf_2(self): 212 # Test reusing input buffer by appending data at the 213 # end right away 214 lzd = LZMADecompressor() 215 out = [] 216 217 # Create input buffer and empty it 218 self.assertEqual(lzd.decompress(COMPRESSED_XZ[:200], 219 max_length=0), b'') 220 out.append(lzd.decompress(b'')) 221 222 # Fill buffer with new data 223 out.append(lzd.decompress(COMPRESSED_XZ[200:280], 2)) 224 225 # Append some more data, not enough to require resize 226 out.append(lzd.decompress(COMPRESSED_XZ[280:300], 2)) 227 228 # Decompress rest of data 229 out.append(lzd.decompress(COMPRESSED_XZ[300:])) 230 self.assertEqual(b''.join(out), INPUT) 231 232 def test_decompressor_inputbuf_3(self): 233 # Test reusing input buffer after extending it 234 235 lzd = LZMADecompressor() 236 out = [] 237 238 # Create almost full input buffer 239 out.append(lzd.decompress(COMPRESSED_XZ[:200], 5)) 240 241 # Add even more data to it, requiring resize 242 out.append(lzd.decompress(COMPRESSED_XZ[200:300], 5)) 243 244 # Decompress rest of data 245 out.append(lzd.decompress(COMPRESSED_XZ[300:])) 246 self.assertEqual(b''.join(out), INPUT) 247 248 def test_decompressor_unused_data(self): 249 lzd = LZMADecompressor() 250 extra = b"fooblibar" 251 self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64, 252 unused_data=extra) 253 254 def test_decompressor_bad_input(self): 255 lzd = LZMADecompressor() 256 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1) 257 258 lzd = LZMADecompressor(lzma.FORMAT_XZ) 259 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE) 260 261 lzd = LZMADecompressor(lzma.FORMAT_ALONE) 262 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ) 263 264 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1) 265 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ) 266 267 def test_decompressor_bug_28275(self): 268 # Test coverage for Issue 28275 269 lzd = LZMADecompressor() 270 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1) 271 # Previously, a second call could crash due to internal inconsistency 272 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1) 273 274 # Test that LZMACompressor->LZMADecompressor preserves the input data. 275 276 def test_roundtrip_xz(self): 277 lzc = LZMACompressor() 278 cdata = lzc.compress(INPUT) + lzc.flush() 279 lzd = LZMADecompressor() 280 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64) 281 282 def test_roundtrip_alone(self): 283 lzc = LZMACompressor(lzma.FORMAT_ALONE) 284 cdata = lzc.compress(INPUT) + lzc.flush() 285 lzd = LZMADecompressor() 286 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE) 287 288 def test_roundtrip_raw(self): 289 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 290 cdata = lzc.compress(INPUT) + lzc.flush() 291 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 292 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE) 293 294 def test_roundtrip_raw_empty(self): 295 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 296 cdata = lzc.compress(INPUT) 297 cdata += lzc.compress(b'') 298 cdata += lzc.compress(b'') 299 cdata += lzc.compress(b'') 300 cdata += lzc.flush() 301 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 302 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE) 303 304 def test_roundtrip_chunks(self): 305 lzc = LZMACompressor() 306 cdata = [] 307 for i in range(0, len(INPUT), 10): 308 cdata.append(lzc.compress(INPUT[i:i+10])) 309 cdata.append(lzc.flush()) 310 cdata = b"".join(cdata) 311 lzd = LZMADecompressor() 312 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64) 313 314 def test_roundtrip_empty_chunks(self): 315 lzc = LZMACompressor() 316 cdata = [] 317 for i in range(0, len(INPUT), 10): 318 cdata.append(lzc.compress(INPUT[i:i+10])) 319 cdata.append(lzc.compress(b'')) 320 cdata.append(lzc.compress(b'')) 321 cdata.append(lzc.compress(b'')) 322 cdata.append(lzc.flush()) 323 cdata = b"".join(cdata) 324 lzd = LZMADecompressor() 325 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64) 326 327 # LZMADecompressor intentionally does not handle concatenated streams. 328 329 def test_decompressor_multistream(self): 330 lzd = LZMADecompressor() 331 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE, 332 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE) 333 334 # Test with inputs larger than 4GiB. 335 336 @support.skip_if_pgo_task 337 @bigmemtest(size=_4G + 100, memuse=2) 338 def test_compressor_bigmem(self, size): 339 lzc = LZMACompressor() 340 cdata = lzc.compress(b"x" * size) + lzc.flush() 341 ddata = lzma.decompress(cdata) 342 try: 343 self.assertEqual(len(ddata), size) 344 self.assertEqual(len(ddata.strip(b"x")), 0) 345 finally: 346 ddata = None 347 348 @support.skip_if_pgo_task 349 @bigmemtest(size=_4G + 100, memuse=3) 350 def test_decompressor_bigmem(self, size): 351 lzd = LZMADecompressor() 352 blocksize = 10 * 1024 * 1024 353 block = random.randbytes(blocksize) 354 try: 355 input = block * (size // blocksize + 1) 356 cdata = lzma.compress(input) 357 ddata = lzd.decompress(cdata) 358 self.assertEqual(ddata, input) 359 finally: 360 input = cdata = ddata = None 361 362 # Pickling raises an exception; there's no way to serialize an lzma_stream. 363 364 def test_pickle(self): 365 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 366 with self.assertRaises(TypeError): 367 pickle.dumps(LZMACompressor(), proto) 368 with self.assertRaises(TypeError): 369 pickle.dumps(LZMADecompressor(), proto) 370 371 @support.refcount_test 372 def test_refleaks_in_decompressor___init__(self): 373 gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount') 374 lzd = LZMADecompressor() 375 refs_before = gettotalrefcount() 376 for i in range(100): 377 lzd.__init__() 378 self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10) 379 380 381class CompressDecompressFunctionTestCase(unittest.TestCase): 382 383 # Test error cases: 384 385 def test_bad_args(self): 386 self.assertRaises(TypeError, lzma.compress) 387 self.assertRaises(TypeError, lzma.compress, []) 388 self.assertRaises(TypeError, lzma.compress, b"", format="xz") 389 self.assertRaises(TypeError, lzma.compress, b"", check="none") 390 self.assertRaises(TypeError, lzma.compress, b"", preset="blah") 391 self.assertRaises(TypeError, lzma.compress, b"", filters=1024) 392 # Can't specify a preset and a custom filter chain at the same time. 393 with self.assertRaises(ValueError): 394 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}]) 395 396 self.assertRaises(TypeError, lzma.decompress) 397 self.assertRaises(TypeError, lzma.decompress, []) 398 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma") 399 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9) 400 with self.assertRaises(TypeError): 401 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={}) 402 # Cannot specify a memory limit with FILTER_RAW. 403 with self.assertRaises(ValueError): 404 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000) 405 # Can only specify a custom filter chain with FILTER_RAW. 406 with self.assertRaises(ValueError): 407 lzma.decompress(b"", filters=FILTERS_RAW_1) 408 with self.assertRaises(ValueError): 409 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1) 410 with self.assertRaises(ValueError): 411 lzma.decompress( 412 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1) 413 414 def test_decompress_memlimit(self): 415 with self.assertRaises(LZMAError): 416 lzma.decompress(COMPRESSED_XZ, memlimit=1024) 417 with self.assertRaises(LZMAError): 418 lzma.decompress( 419 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024) 420 with self.assertRaises(LZMAError): 421 lzma.decompress( 422 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024) 423 424 # Test LZMADecompressor on known-good input data. 425 426 def test_decompress_good_input(self): 427 ddata = lzma.decompress(COMPRESSED_XZ) 428 self.assertEqual(ddata, INPUT) 429 430 ddata = lzma.decompress(COMPRESSED_ALONE) 431 self.assertEqual(ddata, INPUT) 432 433 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ) 434 self.assertEqual(ddata, INPUT) 435 436 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE) 437 self.assertEqual(ddata, INPUT) 438 439 ddata = lzma.decompress( 440 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1) 441 self.assertEqual(ddata, INPUT) 442 443 ddata = lzma.decompress( 444 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2) 445 self.assertEqual(ddata, INPUT) 446 447 ddata = lzma.decompress( 448 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3) 449 self.assertEqual(ddata, INPUT) 450 451 ddata = lzma.decompress( 452 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 453 self.assertEqual(ddata, INPUT) 454 455 def test_decompress_incomplete_input(self): 456 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128]) 457 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128]) 458 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128], 459 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) 460 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128], 461 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) 462 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128], 463 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) 464 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128], 465 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 466 467 def test_decompress_bad_input(self): 468 with self.assertRaises(LZMAError): 469 lzma.decompress(COMPRESSED_BOGUS) 470 with self.assertRaises(LZMAError): 471 lzma.decompress(COMPRESSED_RAW_1) 472 with self.assertRaises(LZMAError): 473 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ) 474 with self.assertRaises(LZMAError): 475 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE) 476 with self.assertRaises(LZMAError): 477 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW, 478 filters=FILTERS_RAW_1) 479 480 # Test that compress()->decompress() preserves the input data. 481 482 def test_roundtrip(self): 483 cdata = lzma.compress(INPUT) 484 ddata = lzma.decompress(cdata) 485 self.assertEqual(ddata, INPUT) 486 487 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ) 488 ddata = lzma.decompress(cdata) 489 self.assertEqual(ddata, INPUT) 490 491 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE) 492 ddata = lzma.decompress(cdata) 493 self.assertEqual(ddata, INPUT) 494 495 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 496 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4) 497 self.assertEqual(ddata, INPUT) 498 499 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams. 500 501 def test_decompress_multistream(self): 502 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE) 503 self.assertEqual(ddata, INPUT * 2) 504 505 # Test robust handling of non-LZMA data following the compressed stream(s). 506 507 def test_decompress_trailing_junk(self): 508 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_BOGUS) 509 self.assertEqual(ddata, INPUT) 510 511 def test_decompress_multistream_trailing_junk(self): 512 ddata = lzma.decompress(COMPRESSED_XZ * 3 + COMPRESSED_BOGUS) 513 self.assertEqual(ddata, INPUT * 3) 514 515 516class TempFile: 517 """Context manager - creates a file, and deletes it on __exit__.""" 518 519 def __init__(self, filename, data=b""): 520 self.filename = filename 521 self.data = data 522 523 def __enter__(self): 524 with open(self.filename, "wb") as f: 525 f.write(self.data) 526 527 def __exit__(self, *args): 528 unlink(self.filename) 529 530 531class FileTestCase(unittest.TestCase): 532 533 def test_init(self): 534 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 535 pass 536 with LZMAFile(BytesIO(), "w") as f: 537 pass 538 with LZMAFile(BytesIO(), "x") as f: 539 pass 540 with LZMAFile(BytesIO(), "a") as f: 541 pass 542 543 def test_init_with_PathLike_filename(self): 544 filename = pathlib.Path(TESTFN) 545 with TempFile(filename, COMPRESSED_XZ): 546 with LZMAFile(filename) as f: 547 self.assertEqual(f.read(), INPUT) 548 with LZMAFile(filename, "a") as f: 549 f.write(INPUT) 550 with LZMAFile(filename) as f: 551 self.assertEqual(f.read(), INPUT * 2) 552 553 def test_init_with_filename(self): 554 with TempFile(TESTFN, COMPRESSED_XZ): 555 with LZMAFile(TESTFN) as f: 556 pass 557 with LZMAFile(TESTFN, "w") as f: 558 pass 559 with LZMAFile(TESTFN, "a") as f: 560 pass 561 562 def test_init_mode(self): 563 with TempFile(TESTFN): 564 with LZMAFile(TESTFN, "r"): 565 pass 566 with LZMAFile(TESTFN, "rb"): 567 pass 568 with LZMAFile(TESTFN, "w"): 569 pass 570 with LZMAFile(TESTFN, "wb"): 571 pass 572 with LZMAFile(TESTFN, "a"): 573 pass 574 with LZMAFile(TESTFN, "ab"): 575 pass 576 577 def test_init_with_x_mode(self): 578 self.addCleanup(unlink, TESTFN) 579 for mode in ("x", "xb"): 580 unlink(TESTFN) 581 with LZMAFile(TESTFN, mode): 582 pass 583 with self.assertRaises(FileExistsError): 584 with LZMAFile(TESTFN, mode): 585 pass 586 587 def test_init_bad_mode(self): 588 with self.assertRaises(ValueError): 589 LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x")) 590 with self.assertRaises(ValueError): 591 LZMAFile(BytesIO(COMPRESSED_XZ), "") 592 with self.assertRaises(ValueError): 593 LZMAFile(BytesIO(COMPRESSED_XZ), "xt") 594 with self.assertRaises(ValueError): 595 LZMAFile(BytesIO(COMPRESSED_XZ), "x+") 596 with self.assertRaises(ValueError): 597 LZMAFile(BytesIO(COMPRESSED_XZ), "rx") 598 with self.assertRaises(ValueError): 599 LZMAFile(BytesIO(COMPRESSED_XZ), "wx") 600 with self.assertRaises(ValueError): 601 LZMAFile(BytesIO(COMPRESSED_XZ), "rt") 602 with self.assertRaises(ValueError): 603 LZMAFile(BytesIO(COMPRESSED_XZ), "r+") 604 with self.assertRaises(ValueError): 605 LZMAFile(BytesIO(COMPRESSED_XZ), "wt") 606 with self.assertRaises(ValueError): 607 LZMAFile(BytesIO(COMPRESSED_XZ), "w+") 608 with self.assertRaises(ValueError): 609 LZMAFile(BytesIO(COMPRESSED_XZ), "rw") 610 611 def test_init_bad_check(self): 612 with self.assertRaises(TypeError): 613 LZMAFile(BytesIO(), "w", check=b"asd") 614 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid. 615 with self.assertRaises(LZMAError): 616 LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN) 617 with self.assertRaises(LZMAError): 618 LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3) 619 # Cannot specify a check with mode="r". 620 with self.assertRaises(ValueError): 621 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE) 622 with self.assertRaises(ValueError): 623 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32) 624 with self.assertRaises(ValueError): 625 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64) 626 with self.assertRaises(ValueError): 627 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256) 628 with self.assertRaises(ValueError): 629 LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN) 630 631 def test_init_bad_preset(self): 632 with self.assertRaises(TypeError): 633 LZMAFile(BytesIO(), "w", preset=4.39) 634 with self.assertRaises(LZMAError): 635 LZMAFile(BytesIO(), "w", preset=10) 636 with self.assertRaises(LZMAError): 637 LZMAFile(BytesIO(), "w", preset=23) 638 with self.assertRaises(OverflowError): 639 LZMAFile(BytesIO(), "w", preset=-1) 640 with self.assertRaises(OverflowError): 641 LZMAFile(BytesIO(), "w", preset=-7) 642 with self.assertRaises(TypeError): 643 LZMAFile(BytesIO(), "w", preset="foo") 644 # Cannot specify a preset with mode="r". 645 with self.assertRaises(ValueError): 646 LZMAFile(BytesIO(COMPRESSED_XZ), preset=3) 647 648 def test_init_bad_filter_spec(self): 649 with self.assertRaises(TypeError): 650 LZMAFile(BytesIO(), "w", filters=[b"wobsite"]) 651 with self.assertRaises(ValueError): 652 LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}]) 653 with self.assertRaises(ValueError): 654 LZMAFile(BytesIO(), "w", filters=[{"id": 98765}]) 655 with self.assertRaises(ValueError): 656 LZMAFile(BytesIO(), "w", 657 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}]) 658 with self.assertRaises(ValueError): 659 LZMAFile(BytesIO(), "w", 660 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}]) 661 with self.assertRaises(ValueError): 662 LZMAFile(BytesIO(), "w", 663 filters=[{"id": lzma.FILTER_X86, "foo": 0}]) 664 665 def test_init_with_preset_and_filters(self): 666 with self.assertRaises(ValueError): 667 LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW, 668 preset=6, filters=FILTERS_RAW_1) 669 670 def test_close(self): 671 with BytesIO(COMPRESSED_XZ) as src: 672 f = LZMAFile(src) 673 f.close() 674 # LZMAFile.close() should not close the underlying file object. 675 self.assertFalse(src.closed) 676 # Try closing an already-closed LZMAFile. 677 f.close() 678 self.assertFalse(src.closed) 679 680 # Test with a real file on disk, opened directly by LZMAFile. 681 with TempFile(TESTFN, COMPRESSED_XZ): 682 f = LZMAFile(TESTFN) 683 fp = f._fp 684 f.close() 685 # Here, LZMAFile.close() *should* close the underlying file object. 686 self.assertTrue(fp.closed) 687 # Try closing an already-closed LZMAFile. 688 f.close() 689 690 def test_closed(self): 691 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 692 try: 693 self.assertFalse(f.closed) 694 f.read() 695 self.assertFalse(f.closed) 696 finally: 697 f.close() 698 self.assertTrue(f.closed) 699 700 f = LZMAFile(BytesIO(), "w") 701 try: 702 self.assertFalse(f.closed) 703 finally: 704 f.close() 705 self.assertTrue(f.closed) 706 707 def test_fileno(self): 708 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 709 try: 710 self.assertRaises(UnsupportedOperation, f.fileno) 711 finally: 712 f.close() 713 self.assertRaises(ValueError, f.fileno) 714 with TempFile(TESTFN, COMPRESSED_XZ): 715 f = LZMAFile(TESTFN) 716 try: 717 self.assertEqual(f.fileno(), f._fp.fileno()) 718 self.assertIsInstance(f.fileno(), int) 719 finally: 720 f.close() 721 self.assertRaises(ValueError, f.fileno) 722 723 def test_seekable(self): 724 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 725 try: 726 self.assertTrue(f.seekable()) 727 f.read() 728 self.assertTrue(f.seekable()) 729 finally: 730 f.close() 731 self.assertRaises(ValueError, f.seekable) 732 733 f = LZMAFile(BytesIO(), "w") 734 try: 735 self.assertFalse(f.seekable()) 736 finally: 737 f.close() 738 self.assertRaises(ValueError, f.seekable) 739 740 src = BytesIO(COMPRESSED_XZ) 741 src.seekable = lambda: False 742 f = LZMAFile(src) 743 try: 744 self.assertFalse(f.seekable()) 745 finally: 746 f.close() 747 self.assertRaises(ValueError, f.seekable) 748 749 def test_readable(self): 750 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 751 try: 752 self.assertTrue(f.readable()) 753 f.read() 754 self.assertTrue(f.readable()) 755 finally: 756 f.close() 757 self.assertRaises(ValueError, f.readable) 758 759 f = LZMAFile(BytesIO(), "w") 760 try: 761 self.assertFalse(f.readable()) 762 finally: 763 f.close() 764 self.assertRaises(ValueError, f.readable) 765 766 def test_writable(self): 767 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 768 try: 769 self.assertFalse(f.writable()) 770 f.read() 771 self.assertFalse(f.writable()) 772 finally: 773 f.close() 774 self.assertRaises(ValueError, f.writable) 775 776 f = LZMAFile(BytesIO(), "w") 777 try: 778 self.assertTrue(f.writable()) 779 finally: 780 f.close() 781 self.assertRaises(ValueError, f.writable) 782 783 def test_read(self): 784 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 785 self.assertEqual(f.read(), INPUT) 786 self.assertEqual(f.read(), b"") 787 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f: 788 self.assertEqual(f.read(), INPUT) 789 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f: 790 self.assertEqual(f.read(), INPUT) 791 self.assertEqual(f.read(), b"") 792 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f: 793 self.assertEqual(f.read(), INPUT) 794 self.assertEqual(f.read(), b"") 795 with LZMAFile(BytesIO(COMPRESSED_RAW_1), 796 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f: 797 self.assertEqual(f.read(), INPUT) 798 self.assertEqual(f.read(), b"") 799 with LZMAFile(BytesIO(COMPRESSED_RAW_2), 800 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f: 801 self.assertEqual(f.read(), INPUT) 802 self.assertEqual(f.read(), b"") 803 with LZMAFile(BytesIO(COMPRESSED_RAW_3), 804 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f: 805 self.assertEqual(f.read(), INPUT) 806 self.assertEqual(f.read(), b"") 807 with LZMAFile(BytesIO(COMPRESSED_RAW_4), 808 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f: 809 self.assertEqual(f.read(), INPUT) 810 self.assertEqual(f.read(), b"") 811 812 def test_read_0(self): 813 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 814 self.assertEqual(f.read(0), b"") 815 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f: 816 self.assertEqual(f.read(0), b"") 817 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f: 818 self.assertEqual(f.read(0), b"") 819 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f: 820 self.assertEqual(f.read(0), b"") 821 822 def test_read_10(self): 823 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 824 chunks = [] 825 while True: 826 result = f.read(10) 827 if not result: 828 break 829 self.assertLessEqual(len(result), 10) 830 chunks.append(result) 831 self.assertEqual(b"".join(chunks), INPUT) 832 833 def test_read_multistream(self): 834 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f: 835 self.assertEqual(f.read(), INPUT * 5) 836 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f: 837 self.assertEqual(f.read(), INPUT * 2) 838 with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4), 839 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f: 840 self.assertEqual(f.read(), INPUT * 4) 841 842 def test_read_multistream_buffer_size_aligned(self): 843 # Test the case where a stream boundary coincides with the end 844 # of the raw read buffer. 845 saved_buffer_size = _compression.BUFFER_SIZE 846 _compression.BUFFER_SIZE = len(COMPRESSED_XZ) 847 try: 848 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f: 849 self.assertEqual(f.read(), INPUT * 5) 850 finally: 851 _compression.BUFFER_SIZE = saved_buffer_size 852 853 def test_read_trailing_junk(self): 854 with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_BOGUS)) as f: 855 self.assertEqual(f.read(), INPUT) 856 857 def test_read_multistream_trailing_junk(self): 858 with LZMAFile(BytesIO(COMPRESSED_XZ * 5 + COMPRESSED_BOGUS)) as f: 859 self.assertEqual(f.read(), INPUT * 5) 860 861 def test_read_from_file(self): 862 with TempFile(TESTFN, COMPRESSED_XZ): 863 with LZMAFile(TESTFN) as f: 864 self.assertEqual(f.read(), INPUT) 865 self.assertEqual(f.read(), b"") 866 867 def test_read_from_file_with_bytes_filename(self): 868 try: 869 bytes_filename = TESTFN.encode("ascii") 870 except UnicodeEncodeError: 871 self.skipTest("Temporary file name needs to be ASCII") 872 with TempFile(TESTFN, COMPRESSED_XZ): 873 with LZMAFile(bytes_filename) as f: 874 self.assertEqual(f.read(), INPUT) 875 self.assertEqual(f.read(), b"") 876 877 def test_read_incomplete(self): 878 with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f: 879 self.assertRaises(EOFError, f.read) 880 881 def test_read_truncated(self): 882 # Drop stream footer: CRC (4 bytes), index size (4 bytes), 883 # flags (2 bytes) and magic number (2 bytes). 884 truncated = COMPRESSED_XZ[:-12] 885 with LZMAFile(BytesIO(truncated)) as f: 886 self.assertRaises(EOFError, f.read) 887 with LZMAFile(BytesIO(truncated)) as f: 888 self.assertEqual(f.read(len(INPUT)), INPUT) 889 self.assertRaises(EOFError, f.read, 1) 890 # Incomplete 12-byte header. 891 for i in range(12): 892 with LZMAFile(BytesIO(truncated[:i])) as f: 893 self.assertRaises(EOFError, f.read, 1) 894 895 def test_read_bad_args(self): 896 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 897 f.close() 898 self.assertRaises(ValueError, f.read) 899 with LZMAFile(BytesIO(), "w") as f: 900 self.assertRaises(ValueError, f.read) 901 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 902 self.assertRaises(TypeError, f.read, float()) 903 904 def test_read_bad_data(self): 905 with LZMAFile(BytesIO(COMPRESSED_BOGUS)) as f: 906 self.assertRaises(LZMAError, f.read) 907 908 def test_read1(self): 909 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 910 blocks = [] 911 while True: 912 result = f.read1() 913 if not result: 914 break 915 blocks.append(result) 916 self.assertEqual(b"".join(blocks), INPUT) 917 self.assertEqual(f.read1(), b"") 918 919 def test_read1_0(self): 920 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 921 self.assertEqual(f.read1(0), b"") 922 923 def test_read1_10(self): 924 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 925 blocks = [] 926 while True: 927 result = f.read1(10) 928 if not result: 929 break 930 blocks.append(result) 931 self.assertEqual(b"".join(blocks), INPUT) 932 self.assertEqual(f.read1(), b"") 933 934 def test_read1_multistream(self): 935 with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f: 936 blocks = [] 937 while True: 938 result = f.read1() 939 if not result: 940 break 941 blocks.append(result) 942 self.assertEqual(b"".join(blocks), INPUT * 5) 943 self.assertEqual(f.read1(), b"") 944 945 def test_read1_bad_args(self): 946 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 947 f.close() 948 self.assertRaises(ValueError, f.read1) 949 with LZMAFile(BytesIO(), "w") as f: 950 self.assertRaises(ValueError, f.read1) 951 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 952 self.assertRaises(TypeError, f.read1, None) 953 954 def test_peek(self): 955 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 956 result = f.peek() 957 self.assertGreater(len(result), 0) 958 self.assertTrue(INPUT.startswith(result)) 959 self.assertEqual(f.read(), INPUT) 960 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 961 result = f.peek(10) 962 self.assertGreater(len(result), 0) 963 self.assertTrue(INPUT.startswith(result)) 964 self.assertEqual(f.read(), INPUT) 965 966 def test_peek_bad_args(self): 967 with LZMAFile(BytesIO(), "w") as f: 968 self.assertRaises(ValueError, f.peek) 969 970 def test_iterator(self): 971 with BytesIO(INPUT) as f: 972 lines = f.readlines() 973 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 974 self.assertListEqual(list(iter(f)), lines) 975 with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f: 976 self.assertListEqual(list(iter(f)), lines) 977 with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f: 978 self.assertListEqual(list(iter(f)), lines) 979 with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f: 980 self.assertListEqual(list(iter(f)), lines) 981 with LZMAFile(BytesIO(COMPRESSED_RAW_2), 982 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f: 983 self.assertListEqual(list(iter(f)), lines) 984 985 def test_readline(self): 986 with BytesIO(INPUT) as f: 987 lines = f.readlines() 988 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 989 for line in lines: 990 self.assertEqual(f.readline(), line) 991 992 def test_readlines(self): 993 with BytesIO(INPUT) as f: 994 lines = f.readlines() 995 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 996 self.assertListEqual(f.readlines(), lines) 997 998 def test_decompress_limited(self): 999 """Decompressed data buffering should be limited""" 1000 bomb = lzma.compress(b'\0' * int(2e6), preset=6) 1001 self.assertLess(len(bomb), _compression.BUFFER_SIZE) 1002 1003 decomp = LZMAFile(BytesIO(bomb)) 1004 self.assertEqual(decomp.read(1), b'\0') 1005 max_decomp = 1 + DEFAULT_BUFFER_SIZE 1006 self.assertLessEqual(decomp._buffer.raw.tell(), max_decomp, 1007 "Excessive amount of data was decompressed") 1008 1009 def test_write(self): 1010 with BytesIO() as dst: 1011 with LZMAFile(dst, "w") as f: 1012 f.write(INPUT) 1013 expected = lzma.compress(INPUT) 1014 self.assertEqual(dst.getvalue(), expected) 1015 with BytesIO() as dst: 1016 with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f: 1017 f.write(INPUT) 1018 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ) 1019 self.assertEqual(dst.getvalue(), expected) 1020 with BytesIO() as dst: 1021 with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f: 1022 f.write(INPUT) 1023 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE) 1024 self.assertEqual(dst.getvalue(), expected) 1025 with BytesIO() as dst: 1026 with LZMAFile(dst, "w", format=lzma.FORMAT_RAW, 1027 filters=FILTERS_RAW_2) as f: 1028 f.write(INPUT) 1029 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW, 1030 filters=FILTERS_RAW_2) 1031 self.assertEqual(dst.getvalue(), expected) 1032 1033 def test_write_10(self): 1034 with BytesIO() as dst: 1035 with LZMAFile(dst, "w") as f: 1036 for start in range(0, len(INPUT), 10): 1037 f.write(INPUT[start:start+10]) 1038 expected = lzma.compress(INPUT) 1039 self.assertEqual(dst.getvalue(), expected) 1040 1041 def test_write_append(self): 1042 part1 = INPUT[:1024] 1043 part2 = INPUT[1024:1536] 1044 part3 = INPUT[1536:] 1045 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3)) 1046 with BytesIO() as dst: 1047 with LZMAFile(dst, "w") as f: 1048 f.write(part1) 1049 with LZMAFile(dst, "a") as f: 1050 f.write(part2) 1051 with LZMAFile(dst, "a") as f: 1052 f.write(part3) 1053 self.assertEqual(dst.getvalue(), expected) 1054 1055 def test_write_to_file(self): 1056 try: 1057 with LZMAFile(TESTFN, "w") as f: 1058 f.write(INPUT) 1059 expected = lzma.compress(INPUT) 1060 with open(TESTFN, "rb") as f: 1061 self.assertEqual(f.read(), expected) 1062 finally: 1063 unlink(TESTFN) 1064 1065 def test_write_to_file_with_bytes_filename(self): 1066 try: 1067 bytes_filename = TESTFN.encode("ascii") 1068 except UnicodeEncodeError: 1069 self.skipTest("Temporary file name needs to be ASCII") 1070 try: 1071 with LZMAFile(bytes_filename, "w") as f: 1072 f.write(INPUT) 1073 expected = lzma.compress(INPUT) 1074 with open(TESTFN, "rb") as f: 1075 self.assertEqual(f.read(), expected) 1076 finally: 1077 unlink(TESTFN) 1078 1079 def test_write_append_to_file(self): 1080 part1 = INPUT[:1024] 1081 part2 = INPUT[1024:1536] 1082 part3 = INPUT[1536:] 1083 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3)) 1084 try: 1085 with LZMAFile(TESTFN, "w") as f: 1086 f.write(part1) 1087 with LZMAFile(TESTFN, "a") as f: 1088 f.write(part2) 1089 with LZMAFile(TESTFN, "a") as f: 1090 f.write(part3) 1091 with open(TESTFN, "rb") as f: 1092 self.assertEqual(f.read(), expected) 1093 finally: 1094 unlink(TESTFN) 1095 1096 def test_write_bad_args(self): 1097 f = LZMAFile(BytesIO(), "w") 1098 f.close() 1099 self.assertRaises(ValueError, f.write, b"foo") 1100 with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f: 1101 self.assertRaises(ValueError, f.write, b"bar") 1102 with LZMAFile(BytesIO(), "w") as f: 1103 self.assertRaises(TypeError, f.write, None) 1104 self.assertRaises(TypeError, f.write, "text") 1105 self.assertRaises(TypeError, f.write, 789) 1106 1107 def test_writelines(self): 1108 with BytesIO(INPUT) as f: 1109 lines = f.readlines() 1110 with BytesIO() as dst: 1111 with LZMAFile(dst, "w") as f: 1112 f.writelines(lines) 1113 expected = lzma.compress(INPUT) 1114 self.assertEqual(dst.getvalue(), expected) 1115 1116 def test_seek_forward(self): 1117 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1118 f.seek(555) 1119 self.assertEqual(f.read(), INPUT[555:]) 1120 1121 def test_seek_forward_across_streams(self): 1122 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f: 1123 f.seek(len(INPUT) + 123) 1124 self.assertEqual(f.read(), INPUT[123:]) 1125 1126 def test_seek_forward_relative_to_current(self): 1127 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1128 f.read(100) 1129 f.seek(1236, 1) 1130 self.assertEqual(f.read(), INPUT[1336:]) 1131 1132 def test_seek_forward_relative_to_end(self): 1133 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1134 f.seek(-555, 2) 1135 self.assertEqual(f.read(), INPUT[-555:]) 1136 1137 def test_seek_backward(self): 1138 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1139 f.read(1001) 1140 f.seek(211) 1141 self.assertEqual(f.read(), INPUT[211:]) 1142 1143 def test_seek_backward_across_streams(self): 1144 with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f: 1145 f.read(len(INPUT) + 333) 1146 f.seek(737) 1147 self.assertEqual(f.read(), INPUT[737:] + INPUT) 1148 1149 def test_seek_backward_relative_to_end(self): 1150 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1151 f.seek(-150, 2) 1152 self.assertEqual(f.read(), INPUT[-150:]) 1153 1154 def test_seek_past_end(self): 1155 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1156 f.seek(len(INPUT) + 9001) 1157 self.assertEqual(f.tell(), len(INPUT)) 1158 self.assertEqual(f.read(), b"") 1159 1160 def test_seek_past_start(self): 1161 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1162 f.seek(-88) 1163 self.assertEqual(f.tell(), 0) 1164 self.assertEqual(f.read(), INPUT) 1165 1166 def test_seek_bad_args(self): 1167 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 1168 f.close() 1169 self.assertRaises(ValueError, f.seek, 0) 1170 with LZMAFile(BytesIO(), "w") as f: 1171 self.assertRaises(ValueError, f.seek, 0) 1172 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1173 self.assertRaises(ValueError, f.seek, 0, 3) 1174 # io.BufferedReader raises TypeError instead of ValueError 1175 self.assertRaises((TypeError, ValueError), f.seek, 9, ()) 1176 self.assertRaises(TypeError, f.seek, None) 1177 self.assertRaises(TypeError, f.seek, b"derp") 1178 1179 def test_tell(self): 1180 with LZMAFile(BytesIO(COMPRESSED_XZ)) as f: 1181 pos = 0 1182 while True: 1183 self.assertEqual(f.tell(), pos) 1184 result = f.read(183) 1185 if not result: 1186 break 1187 pos += len(result) 1188 self.assertEqual(f.tell(), len(INPUT)) 1189 with LZMAFile(BytesIO(), "w") as f: 1190 for pos in range(0, len(INPUT), 144): 1191 self.assertEqual(f.tell(), pos) 1192 f.write(INPUT[pos:pos+144]) 1193 self.assertEqual(f.tell(), len(INPUT)) 1194 1195 def test_tell_bad_args(self): 1196 f = LZMAFile(BytesIO(COMPRESSED_XZ)) 1197 f.close() 1198 self.assertRaises(ValueError, f.tell) 1199 1200 def test_issue21872(self): 1201 # sometimes decompress data incompletely 1202 1203 # --------------------- 1204 # when max_length == -1 1205 # --------------------- 1206 d1 = LZMADecompressor() 1207 entire = d1.decompress(ISSUE_21872_DAT, max_length=-1) 1208 self.assertEqual(len(entire), 13160) 1209 self.assertTrue(d1.eof) 1210 1211 # --------------------- 1212 # when max_length > 0 1213 # --------------------- 1214 d2 = LZMADecompressor() 1215 1216 # When this value of max_length is used, the input and output 1217 # buffers are exhausted at the same time, and lzs's internal 1218 # state still have 11 bytes can be output. 1219 out1 = d2.decompress(ISSUE_21872_DAT, max_length=13149) 1220 self.assertFalse(d2.needs_input) # ensure needs_input mechanism works 1221 self.assertFalse(d2.eof) 1222 1223 # simulate needs_input mechanism 1224 # output internal state's 11 bytes 1225 out2 = d2.decompress(b'') 1226 self.assertEqual(len(out2), 11) 1227 self.assertTrue(d2.eof) 1228 self.assertEqual(out1 + out2, entire) 1229 1230 1231class OpenTestCase(unittest.TestCase): 1232 1233 def test_binary_modes(self): 1234 with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f: 1235 self.assertEqual(f.read(), INPUT) 1236 with BytesIO() as bio: 1237 with lzma.open(bio, "wb") as f: 1238 f.write(INPUT) 1239 file_data = lzma.decompress(bio.getvalue()) 1240 self.assertEqual(file_data, INPUT) 1241 with lzma.open(bio, "ab") as f: 1242 f.write(INPUT) 1243 file_data = lzma.decompress(bio.getvalue()) 1244 self.assertEqual(file_data, INPUT * 2) 1245 1246 def test_text_modes(self): 1247 uncompressed = INPUT.decode("ascii") 1248 uncompressed_raw = uncompressed.replace("\n", os.linesep) 1249 with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f: 1250 self.assertEqual(f.read(), uncompressed) 1251 with BytesIO() as bio: 1252 with lzma.open(bio, "wt") as f: 1253 f.write(uncompressed) 1254 file_data = lzma.decompress(bio.getvalue()).decode("ascii") 1255 self.assertEqual(file_data, uncompressed_raw) 1256 with lzma.open(bio, "at") as f: 1257 f.write(uncompressed) 1258 file_data = lzma.decompress(bio.getvalue()).decode("ascii") 1259 self.assertEqual(file_data, uncompressed_raw * 2) 1260 1261 def test_filename(self): 1262 with TempFile(TESTFN): 1263 with lzma.open(TESTFN, "wb") as f: 1264 f.write(INPUT) 1265 with open(TESTFN, "rb") as f: 1266 file_data = lzma.decompress(f.read()) 1267 self.assertEqual(file_data, INPUT) 1268 with lzma.open(TESTFN, "rb") as f: 1269 self.assertEqual(f.read(), INPUT) 1270 with lzma.open(TESTFN, "ab") as f: 1271 f.write(INPUT) 1272 with lzma.open(TESTFN, "rb") as f: 1273 self.assertEqual(f.read(), INPUT * 2) 1274 1275 def test_with_pathlike_filename(self): 1276 filename = pathlib.Path(TESTFN) 1277 with TempFile(filename): 1278 with lzma.open(filename, "wb") as f: 1279 f.write(INPUT) 1280 with open(filename, "rb") as f: 1281 file_data = lzma.decompress(f.read()) 1282 self.assertEqual(file_data, INPUT) 1283 with lzma.open(filename, "rb") as f: 1284 self.assertEqual(f.read(), INPUT) 1285 1286 def test_bad_params(self): 1287 # Test invalid parameter combinations. 1288 with self.assertRaises(ValueError): 1289 lzma.open(TESTFN, "") 1290 with self.assertRaises(ValueError): 1291 lzma.open(TESTFN, "rbt") 1292 with self.assertRaises(ValueError): 1293 lzma.open(TESTFN, "rb", encoding="utf-8") 1294 with self.assertRaises(ValueError): 1295 lzma.open(TESTFN, "rb", errors="ignore") 1296 with self.assertRaises(ValueError): 1297 lzma.open(TESTFN, "rb", newline="\n") 1298 1299 def test_format_and_filters(self): 1300 # Test non-default format and filter chain. 1301 options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1} 1302 with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f: 1303 self.assertEqual(f.read(), INPUT) 1304 with BytesIO() as bio: 1305 with lzma.open(bio, "wb", **options) as f: 1306 f.write(INPUT) 1307 file_data = lzma.decompress(bio.getvalue(), **options) 1308 self.assertEqual(file_data, INPUT) 1309 1310 def test_encoding(self): 1311 # Test non-default encoding. 1312 uncompressed = INPUT.decode("ascii") 1313 uncompressed_raw = uncompressed.replace("\n", os.linesep) 1314 with BytesIO() as bio: 1315 with lzma.open(bio, "wt", encoding="utf-16-le") as f: 1316 f.write(uncompressed) 1317 file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le") 1318 self.assertEqual(file_data, uncompressed_raw) 1319 bio.seek(0) 1320 with lzma.open(bio, "rt", encoding="utf-16-le") as f: 1321 self.assertEqual(f.read(), uncompressed) 1322 1323 def test_encoding_error_handler(self): 1324 # Test with non-default encoding error handler. 1325 with BytesIO(lzma.compress(b"foo\xffbar")) as bio: 1326 with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f: 1327 self.assertEqual(f.read(), "foobar") 1328 1329 def test_newline(self): 1330 # Test with explicit newline (universal newline mode disabled). 1331 text = INPUT.decode("ascii") 1332 with BytesIO() as bio: 1333 with lzma.open(bio, "wt", newline="\n") as f: 1334 f.write(text) 1335 bio.seek(0) 1336 with lzma.open(bio, "rt", newline="\r") as f: 1337 self.assertEqual(f.readlines(), [text]) 1338 1339 def test_x_mode(self): 1340 self.addCleanup(unlink, TESTFN) 1341 for mode in ("x", "xb", "xt"): 1342 unlink(TESTFN) 1343 with lzma.open(TESTFN, mode): 1344 pass 1345 with self.assertRaises(FileExistsError): 1346 with lzma.open(TESTFN, mode): 1347 pass 1348 1349 1350class MiscellaneousTestCase(unittest.TestCase): 1351 1352 def test_is_check_supported(self): 1353 # CHECK_NONE and CHECK_CRC32 should always be supported, 1354 # regardless of the options liblzma was compiled with. 1355 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE)) 1356 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32)) 1357 1358 # The .xz format spec cannot store check IDs above this value. 1359 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1)) 1360 1361 # This value should not be a valid check ID. 1362 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN)) 1363 1364 def test__encode_filter_properties(self): 1365 with self.assertRaises(TypeError): 1366 lzma._encode_filter_properties(b"not a dict") 1367 with self.assertRaises(ValueError): 1368 lzma._encode_filter_properties({"id": 0x100}) 1369 with self.assertRaises(ValueError): 1370 lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12}) 1371 with self.assertRaises(lzma.LZMAError): 1372 lzma._encode_filter_properties({"id": lzma.FILTER_DELTA, 1373 "dist": 9001}) 1374 1375 # Test with parameters used by zipfile module. 1376 props = lzma._encode_filter_properties({ 1377 "id": lzma.FILTER_LZMA1, 1378 "pb": 2, 1379 "lp": 0, 1380 "lc": 3, 1381 "dict_size": 8 << 20, 1382 }) 1383 self.assertEqual(props, b"]\x00\x00\x80\x00") 1384 1385 def test__decode_filter_properties(self): 1386 with self.assertRaises(TypeError): 1387 lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes}) 1388 with self.assertRaises(lzma.LZMAError): 1389 lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long") 1390 1391 # Test with parameters used by zipfile module. 1392 filterspec = lzma._decode_filter_properties( 1393 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00") 1394 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1) 1395 self.assertEqual(filterspec["pb"], 2) 1396 self.assertEqual(filterspec["lp"], 0) 1397 self.assertEqual(filterspec["lc"], 3) 1398 self.assertEqual(filterspec["dict_size"], 8 << 20) 1399 1400 def test_filter_properties_roundtrip(self): 1401 spec1 = lzma._decode_filter_properties( 1402 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00") 1403 reencoded = lzma._encode_filter_properties(spec1) 1404 spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded) 1405 self.assertEqual(spec1, spec2) 1406 1407 1408# Test data: 1409 1410INPUT = b""" 1411LAERTES 1412 1413 O, fear me not. 1414 I stay too long: but here my father comes. 1415 1416 Enter POLONIUS 1417 1418 A double blessing is a double grace, 1419 Occasion smiles upon a second leave. 1420 1421LORD POLONIUS 1422 1423 Yet here, Laertes! aboard, aboard, for shame! 1424 The wind sits in the shoulder of your sail, 1425 And you are stay'd for. There; my blessing with thee! 1426 And these few precepts in thy memory 1427 See thou character. Give thy thoughts no tongue, 1428 Nor any unproportioned thought his act. 1429 Be thou familiar, but by no means vulgar. 1430 Those friends thou hast, and their adoption tried, 1431 Grapple them to thy soul with hoops of steel; 1432 But do not dull thy palm with entertainment 1433 Of each new-hatch'd, unfledged comrade. Beware 1434 Of entrance to a quarrel, but being in, 1435 Bear't that the opposed may beware of thee. 1436 Give every man thy ear, but few thy voice; 1437 Take each man's censure, but reserve thy judgment. 1438 Costly thy habit as thy purse can buy, 1439 But not express'd in fancy; rich, not gaudy; 1440 For the apparel oft proclaims the man, 1441 And they in France of the best rank and station 1442 Are of a most select and generous chief in that. 1443 Neither a borrower nor a lender be; 1444 For loan oft loses both itself and friend, 1445 And borrowing dulls the edge of husbandry. 1446 This above all: to thine ownself be true, 1447 And it must follow, as the night the day, 1448 Thou canst not then be false to any man. 1449 Farewell: my blessing season this in thee! 1450 1451LAERTES 1452 1453 Most humbly do I take my leave, my lord. 1454 1455LORD POLONIUS 1456 1457 The time invites you; go; your servants tend. 1458 1459LAERTES 1460 1461 Farewell, Ophelia; and remember well 1462 What I have said to you. 1463 1464OPHELIA 1465 1466 'Tis in my memory lock'd, 1467 And you yourself shall keep the key of it. 1468 1469LAERTES 1470 1471 Farewell. 1472""" 1473 1474COMPRESSED_BOGUS = b"this is not a valid lzma stream" 1475 1476COMPRESSED_XZ = ( 1477 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3" 1478 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d" 1479 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8(" 1480 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89" 1481 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12" 1482 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde" 1483 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O" 1484 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#" 1485 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7" 1486 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b" 1487 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa" 1488 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k" 1489 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f" 1490 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd" 1491 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99" 1492 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac" 1493 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal" 1494 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl" 1495 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3" 1496 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d" 1497 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2" 1498 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3" 1499 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1" 1500 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>" 1501 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS" 1502 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0" 1503 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1" 1504 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\" 1505 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef" 1506 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13" 1507 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\"" 1508 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u" 1509 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1" 1510 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0" 1511 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8" 1512 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p" 1513 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba" 1514 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3" 1515 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3" 1516 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88" 1517 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08" 1518 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85" 1519 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw" 1520 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ" 1521) 1522 1523COMPRESSED_ALONE = ( 1524 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19" 1525 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8" 1526 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02" 1527 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ" 1528 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t" 1529 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81" 1530 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z" 1531 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0" 1532 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9" 1533 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7" 1534 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8" 1535 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4" 1536 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7" 1537 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d" 1538 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a" 1539 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01" 1540 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?" 1541 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t" 1542 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00" 1543 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a" 1544 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82" 1545 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2" 1546 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11" 1547 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A" 1548 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|" 1549 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2" 1550 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93" 1551 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ" 1552 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc" 1553 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7" 1554 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~" 1555 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf" 1556 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t" 1557 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2" 1558 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI" 1559 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90" 1560 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19" 1561 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g" 1562 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4" 1563 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8" 1564 b"\xfbf\x7f\xff\xf0\x19\xeax" 1565) 1566 1567FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}] 1568COMPRESSED_RAW_1 = ( 1569 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee" 1570 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15" 1571 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d" 1572 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b" 1573 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r" 1574 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4" 1575 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g" 1576 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918" 1577 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%" 1578 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_" 1579 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3" 1580 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f" 1581 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b" 1582 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\"" 1583 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92" 1584 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04" 1585 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd" 1586 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC" 1587 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W" 1588 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81" 1589 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd" 1590 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f" 1591 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98" 1592 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6" 1593 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9" 1594 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1" 1595 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07" 1596 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn" 1597 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12" 1598 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6" 1599 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3" 1600 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03" 1601 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99" 1602 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8" 1603 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6" 1604 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az" 1605 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f" 1606 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD" 1607 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08" 1608 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2" 1609 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae" 1610 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u" 1611 b"\xf6*F\xb32\x00\x00\x00" 1612) 1613 1614FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2}, 1615 {"id": lzma.FILTER_LZMA2, 1616 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}] 1617COMPRESSED_RAW_2 = ( 1618 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042" 1619 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH" 1620 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o" 1621 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42" 1622 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa" 1623 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb" 1624 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8" 1625 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`" 1626 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi" 1627 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]" 1628 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd" 1629 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~" 1630 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1" 1631 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj" 1632 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&" 1633 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5" 1634 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06" 1635 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb" 1636 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd" 1637 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY" 1638 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6" 1639 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6" 1640 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15" 1641 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3" 1642 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5" 1643 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%" 1644 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f" 1645 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b" 1646 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t" 1647 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o" 1648 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j" 1649 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}" 1650 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97" 1651 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d" 1652 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05" 1653 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3" 1654 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1" 1655 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-" 1656 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb" 1657 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7" 1658 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~" 1659 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15" 1660 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94" 1661 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8" 1662 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA" 1663 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7" 1664 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t" 1665 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j" 1666 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>" 1667 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3" 1668 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1" 1669 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/" 1670 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9" 1671 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I" 1672 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S" 1673 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!" 1674 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f" 1675 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11" 1676 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00" 1677) 1678 1679FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100}, 1680 {"id": lzma.FILTER_LZMA2}] 1681COMPRESSED_RAW_3 = ( 1682 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d" 1683 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8(" 1684 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89" 1685 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12" 1686 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde" 1687 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O" 1688 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#" 1689 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7" 1690 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b" 1691 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa" 1692 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k" 1693 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f" 1694 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd" 1695 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99" 1696 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac" 1697 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal" 1698 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl" 1699 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3" 1700 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d" 1701 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2" 1702 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3" 1703 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1" 1704 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>" 1705 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS" 1706 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0" 1707 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1" 1708 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\" 1709 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef" 1710 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13" 1711 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\"" 1712 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u" 1713 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1" 1714 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0" 1715 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8" 1716 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p" 1717 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba" 1718 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3" 1719 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3" 1720 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88" 1721 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08" 1722 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85" 1723 b"\xec!\t4\x00\x00\x00" 1724) 1725 1726FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4}, 1727 {"id": lzma.FILTER_X86, "start_offset": 0x40}, 1728 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}] 1729COMPRESSED_RAW_4 = ( 1730 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v" 1731 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?" 1732 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1" 1733 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd" 1734 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff" 1735 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z" 1736 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca" 1737 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0" 1738 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831" 1739 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu" 1740 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY" 1741 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7" 1742 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f" 1743 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\" 1744 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d" 1745 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4" 1746 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04" 1747 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7" 1748 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\" 1749 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08" 1750 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82" 1751 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c" 1752 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'" 1753 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M" 1754 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce" 1755 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7" 1756 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7" 1757 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r" 1758 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3" 1759 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda" 1760 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80" 1761 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-" 1762 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s" 1763 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV." 1764 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei[" 1765 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA" 1766 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\" 1767 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV" 1768 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B" 1769 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1" 1770 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1" 1771 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0" 1772 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2" 1773 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e" 1774 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0" 1775 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4" 1776 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z" 1777 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H" 1778 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab" 1779 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed" 1780 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a" 1781 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!" 1782 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!" 1783 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~" 1784 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb" 1785 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3" 1786 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q" 1787 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb" 1788 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@" 1789 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82" 1790 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94" 1791 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca" 1792 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj" 1793 b"\x00" 1794) 1795 1796ISSUE_21872_DAT = ( 1797 b']\x00\x00@\x00h3\x00\x00\x00\x00\x00\x00\x00\x00`D\x0c\x99\xc8' 1798 b'\xd1\xbbZ^\xc43+\x83\xcd\xf1\xc6g\xec-\x061F\xb1\xbb\xc7\x17%-\xea' 1799 b'\xfap\xfb\x8fs\x128\xb2,\x88\xe4\xc0\x12|*x\xd0\xa2\xc4b\x1b!\x02c' 1800 b'\xab\xd9\x87U\xb8n \xfaVJ\x9a"\xb78\xff%_\x17`?@*\xc2\x82' 1801 b"\xf2^\x1b\xb8\x04&\xc0\xbb\x03g\x9d\xca\xe9\xa4\xc9\xaf'\xe5\x8e}" 1802 b'F\xdd\x11\xf3\x86\xbe\x1fN\x95\\\xef\xa2Mz-\xcb\x9a\xe3O@' 1803 b"\x19\x07\xf6\xee\x9e\x9ag\xc6\xa5w\rnG'\x99\xfd\xfeGI\xb0" 1804 b'\xbb\xf9\xc2\xe1\xff\xc5r\xcf\x85y[\x01\xa1\xbd\xcc/\xa3\x1b\x83\xaa' 1805 b'\xc6\xf9\x99\x0c\xb6_\xc9MQ+x\xa2F\xda]\xdd\xe8\xfb\x1a&' 1806 b',\xc4\x19\x1df\x81\x1e\x90\xf3\xb8Hgr\x85v\xbe\xa3qx\x01Y\xb5\x9fF' 1807 b"\x13\x18\x01\xe69\x9b\xc8'\x1e\x9d\xd6\xe4F\x84\xac\xf8d<\x11\xd5" 1808 b'\\\x0b\xeb\x0e\x82\xab\xb1\xe6\x1fka\xe1i\xc4 C\xb1"4)\xd6\xa7`\x02' 1809 b'\xec\x11\x8c\xf0\x14\xb0\x1d\x1c\xecy\xf0\xb7|\x11j\x85X\xb2!\x1c' 1810 b'\xac\xb5N\xc7\x85j\x9ev\xf5\xe6\x0b\xc1]c\xc15\x16\x9f\xd5\x99' 1811 b"\xfei^\xd2G\x9b\xbdl\xab:\xbe,\xa9'4\x82\xe5\xee\xb3\xc1" 1812 b'$\x93\x95\xa8Y\x16\xf5\xbf\xacw\x91\x04\x1d\x18\x06\xe9\xc5\xfdk\x06' 1813 b'\xe8\xfck\xc5\x86>\x8b~\xa4\xcb\xf1\xb3\x04\xf1\x04G5\xe2\xcc]' 1814 b'\x16\xbf\x140d\x18\xe2\xedw#(3\xca\xa1\x80bX\x7f\xb3\x84' 1815 b'\x9d\xdb\xe7\x08\x97\xcd\x16\xb9\xf1\xd5r+m\x1e\xcb3q\xc5\x9e\x92' 1816 b"\x7f\x8e*\xc7\xde\xe9\xe26\xcds\xb1\x10-\xf6r\x02?\x9d\xddCgJN'" 1817 b'\x11M\xfa\nQ\n\xe6`m\xb8N\xbbq\x8el\x0b\x02\xc7:q\x04G\xa1T' 1818 b'\xf1\xfe!0\x85~\xe5\x884\xe9\x89\xfb\x13J8\x15\xe42\xb6\xad' 1819 b'\x877A\x9a\xa6\xbft]\xd0\xe35M\xb0\x0cK\xc8\xf6\x88\xae\xed\xa9,j7' 1820 b'\x81\x13\xa0(\xcb\xe1\xe9l2\x7f\xcd\xda\x95(\xa70B\xbd\xf4\xe3' 1821 b'hp\x94\xbdJ\xd7\t\xc7g\xffo?\x89?\xf8}\x7f\xbc\x1c\x87' 1822 b'\x14\xc0\xcf\x8cV:\x9a\x0e\xd0\xb2\x1ck\xffk\xb9\xe0=\xc7\x8d/' 1823 b'\xb8\xff\x7f\x1d\x87`\x19.\x98X*~\xa7j\xb9\x0b"\xf4\xe4;V`\xb9\xd7' 1824 b'\x03\x1e\xd0t0\xd3\xde\x1fd\xb9\xe2)\x16\x81}\xb1\\b\x7fJ' 1825 b'\x92\xf4\xff\n+V!\xe9\xde\x98\xa0\x8fK\xdf7\xb9\xc0\x12\x1f\xe2' 1826 b'\xe9\xb0`\xae\x14\r\xa7\xc4\x81~\xd8\x8d\xc5\x06\xd8m\xb0Y\x8a)' 1827 b'\x06/\xbb\xf9\xac\xeaP\xe0\x91\x05m[\xe5z\xe6Z\xf3\x9f\xc7\xd0' 1828 b'\xd3\x8b\xf3\x8a\x1b\xfa\xe4Pf\xbc0\x17\x10\xa9\xd0\x95J{\xb3\xc3' 1829 b'\xfdW\x9bop\x0f\xbe\xaee\xa3]\x93\x9c\xda\xb75<\xf6g!\xcc\xb1\xfc\\' 1830 b'7\x152Mc\x17\x84\x9d\xcd35\r0\xacL-\xf3\xfb\xcb\x96\x1e\xe9U\x7f' 1831 b'\xd7\xca\xb0\xcc\x89\x0c*\xce\x14\xd1P\xf1\x03\xb6.~9o?\xe8' 1832 b'\r\x86\xe0\x92\x87}\xa3\x84\x03P\xe0\xc2\x7f\n;m\x9d\x9e\xb4|' 1833 b'\x8c\x18\xc0#0\xfe3\x07<\xda\xd8\xcf^\xd4Hi\xd6\xb3\x0bT' 1834 b'\x1dF\x88\x85q}\x02\xc6&\xc4\xae\xce\x9cU\xfa\x0f\xcc\xb6\x1f\x11' 1835 b'drw\x9eN\x19\xbd\xffz\x0f\xf0\x04s\xadR\xc1\xc0\xbfl\xf1\xba\xf95^' 1836 b'e\xb1\xfbVY\xd9\x9f\x1c\xbf*\xc4\xa86\x08+\xd6\x88[\xc4_rc\xf0f' 1837 b'\xb8\xd4\xec\x1dx\x19|\xbf\xa7\xe0\x82\x0b\x8c~\x10L/\x90\xd6\xfb' 1838 b'\x81\xdb\x98\xcc\x02\x14\xa5C\xb2\xa7i\xfd\xcd\x1fO\xf7\xe9\x89t\xf0' 1839 b'\x17\xa5\x1c\xad\xfe<Q`%\x075k\n7\x9eI\x82<#)&\x04\xc2\xf0C\xd4`!' 1840 b'\xcb\xa9\xf9\xb3F\x86\xb5\xc3M\xbeu\x12\xb2\xca\x95e\x10\x0b\xb1\xcc' 1841 b'\x01b\x9bXa\x1b[B\x8c\x07\x11Of;\xeaC\xebr\x8eb\xd9\x9c\xe4i]<z\x9a' 1842 b'\x03T\x8b9pF\x10\x8c\x84\xc7\x0e\xeaPw\xe5\xa0\x94\x1f\x84\xdd' 1843 b'a\xe8\x85\xc2\x00\xebq\xe7&Wo5q8\xc2t\x98\xab\xb7\x7f\xe64-H' 1844 b'\t\xb4d\xbe\x06\xe3Q\x8b\xa9J\xb0\x00\xd7s.\x85"\xc0p\x05' 1845 b'\x1c\x06N\x87\xa5\xf8\xc3g\x1b}\x0f\x0f\xc3|\x90\xea\xefd3X' 1846 b'[\xab\x04E\xf2\xf2\xc9\x08\x8a\xa8+W\xa2v\xec\x15G\x08/I<L\\1' 1847 b'\xff\x15O\xaa\x89{\xd1mW\x13\xbd~\xe1\x90^\xc4@\r\xed\xb5D@\xb4\x08' 1848 b'A\x90\xe69;\xc7BO\xdb\xda\xebu\x9e\xa9tN\xae\x8aJ5\xcd\x11\x1d\xea' 1849 b"\xe5\xa7\x04\xe6\x82Z\xc7O\xe46[7\xdco*[\xbe\x0b\xc9\xb7a\xab'\xf6" 1850 b"\xd1u\xdb\xd9q\xf5+y\x1b\x00\xb4\xf3a\xae\xf1M\xc4\xbc\xd00'\x06pQ" 1851 b'\x8dH\xaa\xaa\xc4\xd2K\x9b\xc0\xe9\xec=n\xa9\x1a\x8a\xc2\xe8\x18\xbc' 1852 b'\x93\xb8F\xa1\x8fOY\xe7\xda\xcf0\t\xff|\xd9\xe5\xcf\xe7\xf6\xbe' 1853 b'\xf8\x04\x17\xf2\xe5P\xa7y~\xce\x11h0\x81\x80d[\x00_v\xbbc\xdbI' 1854 b'3\xbc`W\xc0yrkB\xf5\x9f\xe9i\xc5\x8a^\x8d\xd4\x81\xd9\x05\xc1\xfc>' 1855 b'"\xd1v`\x82\xd5$\x89\xcf^\xd52.\xafd\xe8d@\xaa\xd5Y|\x90\x84' 1856 b'j\xdb}\x84riV\x8e\xf0X4rB\xf2NPS[\x8e\x88\xd4\x0fI\xb8' 1857 b'\xdd\xcb\x1d\xf2(\xdf;9\x9e|\xef^0;.*[\x9fl\x7f\xa2_X\xaff!\xbb\x03' 1858 b'\xff\x19\x8f\x88\xb5\xb6\x884\xa3\x05\xde3D{\xe3\xcb\xce\xe4t]' 1859 b'\x875\xe3Uf\xae\xea\x88\x1c\x03b\n\xb1,Q\xec\xcf\x08\t\xde@\x83\xaa<' 1860 b',-\xe4\xee\x9b\x843\xe5\x007\tK\xac\x057\xd6*X\xa3\xc6~\xba\xe6O' 1861 b'\x81kz"\xbe\xe43sL\xf1\xfa;\xf4^\x1e\xb4\x80\xe2\xbd\xaa\x17Z\xe1f' 1862 b'\xda\xa6\xb9\x07:]}\x9fa\x0b?\xba\xe7\xf15\x04M\xe3\n}M\xa4\xcb\r' 1863 b'2\x8a\x88\xa9\xa7\x92\x93\x84\x81Yo\x00\xcc\xc4\xab\x9aT\x96\x0b\xbe' 1864 b'U\xac\x1d\x8d\x1b\x98"\xf8\x8f\xf1u\xc1n\xcc\xfcA\xcc\x90\xb7i' 1865 b'\x83\x9c\x9c~\x1d4\xa2\xf0*J\xe7t\x12\xb4\xe3\xa0u\xd7\x95Z' 1866 b'\xf7\xafG\x96~ST,\xa7\rC\x06\xf4\xf0\xeb`2\x9e>Q\x0e\xf6\xf5\xc5' 1867 b'\x9b\xb5\xaf\xbe\xa3\x8f\xc0\xa3hu\x14\x12 \x97\x99\x04b\x8e\xc7\x1b' 1868 b'VKc\xc1\xf3 \xde\x85-:\xdc\x1f\xac\xce*\x06\xb3\x80;`' 1869 b'\xdb\xdd\x97\xfdg\xbf\xe7\xa8S\x08}\xf55e7\xb8/\xf0!\xc8' 1870 b"Y\xa8\x9a\x07'\xe2\xde\r\x02\xe1\xb2\x0c\xf4C\xcd\xf9\xcb(\xe8\x90" 1871 b'\xd3bTD\x15_\xf6\xc3\xfb\xb3E\xfc\xd6\x98{\xc6\\fz\x81\xa99\x85\xcb' 1872 b'\xa5\xb1\x1d\x94bqW\x1a!;z~\x18\x88\xe8i\xdb\x1b\x8d\x8d' 1873 b'\x06\xaa\x0e\x99s+5k\x00\xe4\xffh\xfe\xdbt\xa6\x1bU\xde\xa3' 1874 b'\xef\xcb\x86\x9e\x81\x16j\n\x9d\xbc\xbbC\x80?\x010\xc7Jj;' 1875 b'\xc4\xe5\x86\xd5\x0e0d#\xc6;\xb8\xd1\xc7c\xb5&8?\xd9J\xe5\xden\xb9' 1876 b'\xe9cb4\xbb\xe6\x14\xe0\xe7l\x1b\x85\x94\x1fh\xf1n\xdeZ\xbe' 1877 b'\x88\xff\xc2e\xca\xdc,B-\x8ac\xc9\xdf\xf5|&\xe4LL\xf0\x1f\xaa8\xbd' 1878 b'\xc26\x94bVi\xd3\x0c\x1c\xb6\xbb\x99F\x8f\x0e\xcc\x8e4\xc6/^W\xf5?' 1879 b'\xdc\x84(\x14dO\x9aD6\x0f4\xa3,\x0c\x0bS\x9fJ\xe1\xacc^\x8a0\t\x80D[' 1880 b'\xb8\xe6\x86\xb0\xe8\xd4\xf9\x1en\xf1\xf5^\xeb\xb8\xb8\xf8' 1881 b')\xa8\xbf\xaa\x84\x86\xb1a \x95\x16\x08\x1c\xbb@\xbd+\r/\xfb' 1882 b'\x92\xfbh\xf1\x8d3\xf9\x92\xde`\xf1\x86\x03\xaa+\xd9\xd9\xc6P\xaf' 1883 b'\xe3-\xea\xa5\x0fB\xca\xde\xd5n^\xe3/\xbf\xa6w\xc8\x0e<M' 1884 b'\xc2\x1e!\xd4\xc6E\xf2\xad\x0c\xbc\x1d\x88Y\x03\x98<\x92\xd9\xa6B' 1885 b'\xc7\x83\xb5"\x97D|&\xc4\xd4\xfad\x0e\xde\x06\xa3\xc2\x9c`\xf2' 1886 b'7\x03\x1a\xed\xd80\x10\xe9\x0co\x10\xcf\x18\x16\xa7\x1c' 1887 b"\xe5\x96\xa4\xd9\xe1\xa5v;]\xb7\xa9\xdc'hA\xe3\x9c&\x98\x0b9\xdf~@" 1888 b'\xf8\xact\x87<\xf94\x0c\x9d\x93\xb0)\xe1\xa2\x0f\x1e=:&\xd56\xa5A+' 1889 b'\xab\xc4\x00\x8d\x81\x93\xd4\xd8<\x82k\\d\xd8v\xab\xbd^l5C?\xd4\xa0' 1890 b'M\x12C\xc8\x80\r\xc83\xe8\xc0\xf5\xdf\xca\x05\xf4BPjy\xbe\x91\x9bzE' 1891 b"\xd8[\x93oT\r\x13\x16'\x1a\xbd*H\xd6\xfe\r\xf3\x91M\x8b\xee\x8f7f" 1892 b"\x0b;\xaa\x85\xf2\xdd'\x0fwM \xbd\x13\xb9\xe5\xb8\xb7 D+P\x1c\xe4g" 1893 b'n\xd2\xf1kc\x15\xaf\xc6\x90V\x03\xc2UovfZ\xcc\xd23^\xb3\xe7\xbf' 1894 b'\xacv\x1d\x82\xedx\xa3J\xa9\xb7\xcf\x0c\xe6j\x96n*o\x18>' 1895 b'\xc6\xfd\x97_+D{\x03\x15\xe8s\xb1\xc8HAG\xcf\xf4\x1a\xdd' 1896 b'\xad\x11\xbf\x157q+\xdeW\x89g"X\x82\xfd~\xf7\xab4\xf6`\xab\xf1q' 1897 b')\x82\x10K\xe9sV\xfe\xe45\xafs*\x14\xa7;\xac{\x06\x9d<@\x93G' 1898 b'j\x1d\xefL\xe9\xd8\x92\x19&\xa1\x16\x19\x04\tu5\x01]\xf6\xf4' 1899 b'\xcd\\\xd8A|I\xd4\xeb\x05\x88C\xc6e\xacQ\xe9*\x97~\x9au\xf8Xy' 1900 b"\x17P\x10\x9f\n\x8c\xe2fZEu>\x9b\x1e\x91\x0b'`\xbd\xc0\xa8\x86c\x1d" 1901 b'Z\xe2\xdc8j\x95\xffU\x90\x1e\xf4o\xbc\xe5\xe3e>\xd2R\xc0b#\xbc\x15' 1902 b'H-\xb9!\xde\x9d\x90k\xdew\x9b{\x99\xde\xf7/K)A\xfd\xf5\xe6:\xda' 1903 b'UM\xcc\xbb\xa2\x0b\x9a\x93\xf5{9\xc0 \xd2((6i\xc0\xbbu\xd8\x9e\x8d' 1904 b'\xf8\x04q\x10\xd4\x14\x9e7-\xb9B\xea\x01Q8\xc8v\x9a\x12A\x88Cd\x92' 1905 b"\x1c\x8c!\xf4\x94\x87'\xe3\xcd\xae\xf7\xd8\x93\xfa\xde\xa8b\x9e\xee2" 1906 b'K\xdb\x00l\x9d\t\xb1|D\x05U\xbb\xf4>\xf1w\x887\xd1}W\x9d|g|1\xb0\x13' 1907 b"\xa3 \xe5\xbfm@\xc06+\xb7\t\xcf\x15D\x9a \x1fM\x1f\xd2\xb5'\xa9\xbb" 1908 b'~Co\x82\xfa\xc2\t\xe6f\xfc\xbeI\xae1\x8e\xbe\xb8\xcf\x86\x17' 1909 b'\x9f\xe2`\xbd\xaf\xba\xb9\xbc\x1b\xa3\xcd\x82\x8fwc\xefd\xa9\xd5\x14' 1910 b'\xe2C\xafUE\xb6\x11MJH\xd0=\x05\xd4*I\xff"\r\x1b^\xcaS6=\xec@\xd5' 1911 b'\x11,\xe0\x87Gr\xaa[\xb8\xbc>n\xbd\x81\x0c\x07<\xe9\x92(' 1912 b'\xb2\xff\xac}\xe7\xb6\x15\x90\x9f~4\x9a\xe6\xd6\xd8s\xed\x99tf' 1913 b'\xa0f\xf8\xf1\x87\t\x96/)\x85\xb6\n\xd7\xb2w\x0b\xbc\xba\x99\xee' 1914 b'Q\xeen\x1d\xad\x03\xc3s\xd1\xfd\xa2\xc6\xb7\x9a\x9c(G<6\xad[~H ' 1915 b'\x16\x89\x89\xd0\xc3\xd2\xca~\xac\xea\xa5\xed\xe5\xfb\r:' 1916 b'\x8e\xa6\xf1e\xbb\xba\xbd\xe0(\xa3\x89_\x01(\xb5c\xcc\x9f\x1fg' 1917 b'v\xfd\x17\xb3\x08S=S\xee\xfc\x85>\x91\x8d\x8d\nYR\xb3G\xd1A\xa2\xb1' 1918 b'\xec\xb0\x01\xd2\xcd\xf9\xfe\x82\x06O\xb3\xecd\xa9c\xe0\x8eP\x90\xce' 1919 b'\xe0\xcd\xd8\xd8\xdc\x9f\xaa\x01"[Q~\xe4\x88\xa1#\xc1\x12C\xcf' 1920 b'\xbe\x80\x11H\xbf\x86\xd8\xbem\xcfWFQ(X\x01DK\xdfB\xaa\x10.-' 1921 b'\xd5\x9e|\x86\x15\x86N]\xc7Z\x17\xcd=\xd7)M\xde\x15\xa4LTi\xa0\x15' 1922 b'\xd1\xe7\xbdN\xa4?\xd1\xe7\x02\xfe4\xe4O\x89\x98&\x96\x0f\x02\x9c' 1923 b'\x9e\x19\xaa\x13u7\xbd0\xdc\xd8\x93\xf4BNE\x1d\x93\x82\x81\x16' 1924 b'\xe5y\xcf\x98D\xca\x9a\xe2\xfd\xcdL\xcc\xd1\xfc_\x0b\x1c\xa0]\xdc' 1925 b'\xa91 \xc9c\xd8\xbf\x97\xcfp\xe6\x19-\xad\xff\xcc\xd1N(\xe8' 1926 b'\xeb#\x182\x96I\xf7l\xf3r\x00' 1927) 1928 1929 1930def test_main(): 1931 run_unittest( 1932 CompressorDecompressorTestCase, 1933 CompressDecompressFunctionTestCase, 1934 FileTestCase, 1935 OpenTestCase, 1936 MiscellaneousTestCase, 1937 ) 1938 1939if __name__ == "__main__": 1940 test_main() 1941