Undo incorrect arithmetic decoder change + follow-up Reverts https://pdfium-review.googlesource.com/c/pdfium/+/52712 Reverts https://pdfium-review.googlesource.com/c/pdfium/+/16791 The last of those two is incorrect per JBIG2 spec, the first papers over an issue caused by it. The last change even cites the spec part that says that an arithmetic decoder should keep returning 1-bits on out-of-data. This is also described in detail in Annex E. This includes two tests, one of which has several trailing 7fff byte pairs stripped before the final ffac pair. pdf.js, Preview.app, Acrobat Reader all decode these files fine. The construction of these tests is described in detail in: * https://github.com/SerenityOS/serenity/pull/26272/commits/ba49ffac4dd * https://github.com/SerenityOS/serenity/pull/26242/commits/9882a8462b6 I took these two files, converted them to PDF using Meta/jbig2_to_pdf.py in that repo, and then to .in format using the script in https://pdfium-review.googlesource.com/c/pdfium/+/136590 This also fixes decoding 042_25.jb2 from the Power JBIG2 test set. clusterfuzz-testcase-pdf_codec_jbig2_fuzzer-5210024078213120 from the third linked bug is a 5636 x 60419 image and needs ~35s to run on my machine. To not re-introduce the timeouts fixed by the incorrect fix, instead limit regions to 4096 x 4096 while fuzzing. This makes `pdf_codec_jbig2_fuzzer` process that test case in 0 ms instead of in 35s on my machine as it now early-outs. I confirmed that bug_947622_min.pdf from comment 7 on bug 41450095 renders exactly the same before and after this change. Bug: 432920906,41450095,40540933 Change-Id: Idc5c13c9440d0b4749f0832659bcdf36c1bc3597 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/136630 Reviewed-by: Nico Weber <thakis@google.com> Commit-Queue: Nico Weber <thakis@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp index dbc9a8e..deb6426 100644 --- a/core/fpdfapi/page/cpdf_dib.cpp +++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -269,11 +269,12 @@ pGlobalSpan = global_acc_->GetSpan(); nGlobalKey = global_acc_->KeyForCache(); } + const bool reject_large_regions_when_fuzzing = false; iDecodeStatus = Jbig2Decoder::StartDecode( jbig_2context_.get(), document_->GetOrCreateCodecContext(), GetWidth(), GetHeight(), pSrcSpan, nSrcKey, pGlobalSpan, nGlobalKey, - cached_bitmap_->GetWritableBuffer(), cached_bitmap_->GetPitch(), - pPause); + cached_bitmap_->GetWritableBuffer(), cached_bitmap_->GetPitch(), pPause, + reject_large_regions_when_fuzzing); } else { iDecodeStatus = Jbig2Decoder::ContinueDecode(jbig_2context_.get(), pPause); }
diff --git a/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp b/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp index b25b557..1c4a0d2 100644 --- a/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp +++ b/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp
@@ -94,22 +94,6 @@ unsigned char B1 = stream_->getNextByte_arith(); if (B1 > 0x8f) { ct_ = 8; - - switch (state_) { - case StreamState::kDataAvailable: - // Finished decoding data (see JBIG2 spec, Section E.3.4). - state_ = StreamState::kDecodingFinished; - break; - case StreamState::kDecodingFinished: - // Allow one more call in the finished state. https://crbug.com/947622 - state_ = StreamState::kLooping; - break; - case StreamState::kLooping: - // Looping state detected. Mark decoding as complete to bail out. - // https://crbug.com/767156 - complete_ = true; - break; - } } else { stream_->incByteIdx(); b_ = B1;
diff --git a/core/fxcodec/jbig2/JBig2_ArithDecoder.h b/core/fxcodec/jbig2/JBig2_ArithDecoder.h index 4d3ff12..a103508 100644 --- a/core/fxcodec/jbig2/JBig2_ArithDecoder.h +++ b/core/fxcodec/jbig2/JBig2_ArithDecoder.h
@@ -48,17 +48,10 @@ bool IsComplete() const { return complete_; } private: - enum class StreamState : uint8_t { - kDataAvailable, - kDecodingFinished, - kLooping, - }; - void BYTEIN(); void ReadValueA(); bool complete_ = false; - StreamState state_ = StreamState::kDataAvailable; uint8_t b_; unsigned int c_; unsigned int a_;
diff --git a/core/fxcodec/jbig2/JBig2_Context.cpp b/core/fxcodec/jbig2/JBig2_Context.cpp index 827386d..2d62067 100644 --- a/core/fxcodec/jbig2/JBig2_Context.cpp +++ b/core/fxcodec/jbig2/JBig2_Context.cpp
@@ -1192,6 +1192,12 @@ stream_->read1Byte(&pRI->flags) != 0) { return JBig2_Result::kFailure; } + + if (reject_large_regions_when_fuzzing_ && + (pRI->width > 4096 || pRI->height > 4096)) { + return JBig2_Result::kFailure; + } + return JBig2_Result::kSuccess; }
diff --git a/core/fxcodec/jbig2/JBig2_Context.h b/core/fxcodec/jbig2/JBig2_Context.h index b7521e5..fb967f2 100644 --- a/core/fxcodec/jbig2/JBig2_Context.h +++ b/core/fxcodec/jbig2/JBig2_Context.h
@@ -52,6 +52,10 @@ bool Continue(PauseIndicatorIface* pPause); FXCODEC_STATUS GetProcessingStatus() const { return processing_status_; } + void RejectLargeRegionsWhenFuzzing() { + reject_large_regions_when_fuzzing_ = true; + } + private: CJBig2_Context(pdfium::span<const uint8_t> pSrcSpan, uint64_t src_key, @@ -102,6 +106,7 @@ uint32_t offset_ = 0; JBig2RegionInfo ri_ = {}; UnownedPtr<std::list<CJBig2_CachePair>> const symbol_dict_cache_; + bool reject_large_regions_when_fuzzing_ = false; }; #endif // CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_
diff --git a/core/fxcodec/jbig2/jbig2_decoder.cpp b/core/fxcodec/jbig2/jbig2_decoder.cpp index d195525..f64f065 100644 --- a/core/fxcodec/jbig2/jbig2_decoder.cpp +++ b/core/fxcodec/jbig2/jbig2_decoder.cpp
@@ -53,7 +53,8 @@ uint64_t global_key, pdfium::span<uint8_t> dest_buf, uint32_t dest_pitch, - PauseIndicatorIface* pPause) { + PauseIndicatorIface* pPause, + bool reject_large_regions_when_fuzzing) { pJbig2Context->width_ = width; pJbig2Context->height_ = height; pJbig2Context->src_span_ = src_span; @@ -66,6 +67,11 @@ pJbig2Context->context_ = CJBig2_Context::Create(global_span, global_key, src_span, src_key, pJBig2DocumentContext->GetSymbolDictCache()); + + if (reject_large_regions_when_fuzzing) { + pJbig2Context->context_->RejectLargeRegionsWhenFuzzing(); + } + bool succeeded = pJbig2Context->context_->GetFirstPage( dest_buf, width, height, dest_pitch, pPause); return Decode(pJbig2Context, succeeded);
diff --git a/core/fxcodec/jbig2/jbig2_decoder.h b/core/fxcodec/jbig2/jbig2_decoder.h index d068842..96e3685 100644 --- a/core/fxcodec/jbig2/jbig2_decoder.h +++ b/core/fxcodec/jbig2/jbig2_decoder.h
@@ -50,7 +50,8 @@ uint64_t global_key, pdfium::span<uint8_t> dest_buf, uint32_t dest_pitch, - PauseIndicatorIface* pPause); + PauseIndicatorIface* pPause, + bool reject_large_regions_when_fuzzing); static FXCODEC_STATUS ContinueDecode(Jbig2Context* pJbig2Context, PauseIndicatorIface* pPause);
diff --git a/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc b/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc index e28d630..91a4eac 100644 --- a/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc +++ b/testing/fuzzers/pdf_codec_jbig2_fuzzer.cc
@@ -42,9 +42,12 @@ JBig2_DocumentContext document_context; Jbig2Context jbig2_context; + + const bool reject_large_regions_when_fuzzing = true; FXCODEC_STATUS status = Jbig2Decoder::StartDecode( &jbig2_context, &document_context, width, height, span, 1, {}, 0, - bitmap->GetWritableBuffer(), bitmap->GetPitch(), nullptr); + bitmap->GetWritableBuffer(), bitmap->GetPitch(), nullptr, + reject_large_regions_when_fuzzing); while (status == FXCODEC_STATUS::kDecodeToBeContinued) { status = Jbig2Decoder::ContinueDecode(&jbig2_context, nullptr);
diff --git a/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder-refine.in b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder-refine.in new file mode 100644 index 0000000..cb2d1ba --- /dev/null +++ b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder-refine.in
@@ -0,0 +1,91 @@ +{{header}} + +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +endobj + +{{object 2 0}} << + /Type /Pages + /Kids [ 3 0 R ] + /Count 1 +>> +endobj + +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [ 0 0 399 400 ] + /Contents 4 0 R + /Resources << + /XObject << + /Im 5 0 R + >> + >> +>> +endobj + +{{object 4 0}} << + {{streamlen}} +>> +stream +399 0 0 400 0 0 cm +/Im Do +endstream +endobj + +{{object 5 0}} << + {{streamlen}} + /Type /XObject + /Subtype /Image + /Width 399 + /Height 400 + /ColorSpace /DeviceGray + /Filter [ /ASCIIHexDecode /JBIG2Decode ] + /BitsPerComponent 1 +>> +stream +00000000300001000000130000018f0000019000000000000000001000000000 +00012700010000001c0000018f000001900000000000000000020003fffdff02 +fefefeffac000000022401010000001c0000018f000001900000000000000000 +020003fffdff02fefefeffac000000032a200201000004040000018f00000190 +00000000000000000200fffffffffd1bf1ff73d66fda2e249b8aff7fff7eab49 +0046e2d27531edc993aba10778ff7fff7e91ea01ab03a991e82dd0544da88fcb +4f0b874959b9f0851daab39a106030934e932ff8325f47ea96e7238edf169788 +ab49a67bd54d8ff7f9f1779fd559206a31fbc0c9c737faaa38fe1b5c903dff76 +33e2ee34302c9af81cacbd7cd0bb7efe0c5e67da5c01b53ff7e0efff3a788743 +ff7fff1570ff7df26b4ef68f6822f28c17ff7fff7fff7fff7fff7f635b05ff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7f32a3ff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fea058c0a7959dc7da161ee41bb0c202ce6090b989d794c12e5cca042 +42546d33e998a82d4247f8a7a2078457325c33cdd49f5c6e1853dbc0af70f568 +d3b522e3708d40dbd39b451d78a0e3d31a8392dcdce09a677f5b3380fbab0144 +a8486f66dca8e0c290442cefd115696b398ae5185379cffcd42ac6a508d40ed5 +6cc2cd2cfd51a81fbf035cf84c24a3fcd6f5af2eb7055a02575ba43733b5f820 +3ce9a419c78d127f15bae1649f83da072f1bfe369a549191843d570fd258e3de +1b222b9955296c34651dc5cf459e2d724547223fc779cd26129226673c145760 +bbadcc6dd6174b4aa1652a76b9438f53b89800e29bb284527ee8cec60e7e9cf3 +65bdcb3e68cdf7ac5168d3c33b0ce43a68a7489785f43125fe8738df7966623f +f5ff8170dcff4f68e799eb5fca3cf42f0f81ea3423b04678ecb818039594411e +85ecd7cd406098a16d542c6257463a865616cbb33419bd11301f869ac01006a9 +2271822e0a04ebe7ec765a7aab606bd3f3a0465d3b2b5ce8505c3b3e5d4b6cda +a1a89ca6d9129c291c37bdc409afd11f4733e9796bcb9fbde76f5d7164ab2483 +f63a399836c1df484d9011d4fd4ac95902e1f8c41ca7fa1b2703df42569a8e34 +769c6cd533b4c110d4b7ea753828792ec59a774f534b20e7ded40588cae6185b +5f2f0021016600fe1984fa02dd8a19e49488537449275b2214b77964df6d7ab2 +5e4449df9fbc5e8eceacb9f1f21435edbdb78f41f2b7c5dde561f30df69bbb8c +14aa26009735f2fe5576e292b41b5e5c2a1ffd102994f7e0deb5961e61f194b8 +89ea0b440efe4504009d4028e83a0b330b166ca6802640679e1c71bdf4a0751b +458b6813e28c66f72390a01b1c8be955a5b4bb582a0d419a2c857b40cc46cded +2caf66eab028a0841fe8e4d3b5139de022cd47d41d67bc8f8685ffac> +endstream +endobj + +{{xref}} +{{trailer}} +{{startxref}} +%%EOF
diff --git a/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder-refine_expected.pdf.0.png b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder-refine_expected.pdf.0.png new file mode 100644 index 0000000..02f6c0d --- /dev/null +++ b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder-refine_expected.pdf.0.png Binary files differ
diff --git a/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder.in b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder.in new file mode 100644 index 0000000..c5668ae --- /dev/null +++ b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder.in
@@ -0,0 +1,507 @@ +{{header}} + +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +endobj + +{{object 2 0}} << + /Type /Pages + /Kids [ 3 0 R ] + /Count 1 +>> +endobj + +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [ 0 0 399 400 ] + /Contents 4 0 R + /Resources << + /XObject << + /Im 5 0 R + >> + >> +>> +endobj + +{{object 4 0}} << + {{streamlen}} +>> +stream +399 0 0 400 0 0 cm +/Im Do +endstream +endobj + +{{object 5 0}} << + {{streamlen}} + /Type /XObject + /Subtype /Image + /Width 399 + /Height 400 + /ColorSpace /DeviceGray + /Filter [ /ASCIIHexDecode /JBIG2Decode ] + /BitsPerComponent 1 +>> +stream +00000000300001000000130000018f0000019000000000000000001000000000 +00012700010000001c0000018f000001900000000000000000020003fffdff02 +fefefeffac00000002270001000038180000018f000001900000000000000000 +020003fffdff02fefefeff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f +ff7fff7fff7fff7fff7fff7ffab71a63a241056deb0f4f92220ca3d3273969ee +baabd0d4247cc5388af1e0afd002e13b4cb085006dc51c9446527da2256841e8 +066dde8ab51d4818a3d1f824acd7883e975b6a1262397de9d9c46227ea42f8f3 +f760609f43ac4e0ae96d7df0fde07b0890344e169f5fd2abb3d639bb84e5ab24 +7025cf3df7a4cf75400e4c5f80a62c3a0f650342c7c24284fa772de274130822 +dd423ccef2c2118897fb6f8972c6399b72d2a04e7d5477ea1f5c2e915b21a36b +07f1dcd00f4f1c1d1a70eda6c6eb53d71594ce63afda06a87762d77f69c73031 +c1407a765b8e01120deebbac0bfe3e1185e28ef14a2eca7e15ff6aa55f365fcf +949c231083c87e9c21108040700fe65bc558ef00c04a212bc41c98ff3a91d145 +68eb43f5f7a09bb91dea2c054cb5ee10d0cd8a39aa469f63c2f4b5fb6d2b3bce +590bf3de645027081aee10579b11fa27e556be7370796f50a00dec017c0c4666 +c16a7efb4011364a658df27cf93f312dddfc3c982482b8c0798943545ec73ac8 +8e46275d403cdfd6f412c914f8382cfd7e8295b660f5361a83c8ebe2e08b1025 +3da573aa1da2772930420ba346a1561b9cd382c54061793dc847a39b8f8679c2 +71ba4a5e643bbf53da27423aad1b2861396e177e5d245aec24204c0f3a6e2191 +34030d966d45accfcd2d3244740889f38a5f1a100c4c4511993ea06af8925cee +b035c4d0489959668f6f5ed47871ecc035cccaf965b19fc106cea28dc720ebc2 +d906d8e03c5820073699ee631f71141f7c22ee4a894dd477c889b72c3bfe9754 +dec000b00455774afb9b2bc97789ea09f6e1a2dd4cb985abf5c560e7e0473b91 +d24c0ea4be0c3025d2137e5d228f8ef31765188d8d22e319775ac3c0737830b0 +8c6adeba1d6282e693a44958941b83d43a28cad151fe9437a2634023e3e4f3b2 +36b3f4d2c2c5670c1974759c631c8d186a89fa672cb9eb0b6ffa4843c2e8f8ed +5013d824325c45a9c3182d81c4392f40519e6396172cb473884153eb04f841c3 +af0e809ab0bf40351dfb70f884caafad4492e3b03717e99d77f4ee041b1c440a +cac9243e7e8f61a9f6f958ca37e832b2e6034e2adde311fb0d229f3fb71b8180 +9c911cd1549232d702aced54b4b8983c03cb472afe0d717fa7b5cc9ea9cef7db +f35f91867d88cd1f409d912d2b890efdc57f1fa0ca0f7f626d5606a6d5ce45c4 +052cacfecae8529c7279de6b34de9b6fa7cba4dd723a569f737020056865813d +4d42ed463393aae9d1b82bc78f07c24a9be46c332995e1d90fcb692452a72166 +9c03def659ff3b46bd3c389d71b279130b2441331658e391f972d313e004f1cf +66d414a9eec1548e3b72e36e654d922b6217dde0eb433b266e8c26a825faf549 +19faf2676680116cf48ee4b6e3517bdf860321539ba2bc6679b9c758ddb7f488 +0e9f7c5747dd45549ec50393acf3ba3e71420eee909282ab6e59aa0866b07af6 +e09dff08bef0c7daa638fef8f4462599761b7570a897a78bdd13ce442219b397 +1adb588fc21d48ad8ede1092660e6a469c6b0b7f9377a6a7dfa15baedbab4915 +ea0b61d13e72600425d10cb2cc042e7a8a2e694e3d50e8db52a42f1f23b8ee7e +754262cb1f4b0d869d9b36c99fe6391d35fbca7846ee2a22a91a89cf5015b544 +89f33db25b0a2a1bef6ccf48e3aaa6d5f58dee1a7a1e7cecd7010453358dab18 +565f68a52048d18ed3f3b41bca5c6f50d5403b07f5c5e9c796e2e942532daa73 +a34f997cb3c96e52806eb3a37c3f5dcf4e101941ac428860608871300e6c039d +c8581344b0532cc8d2609b369d4fd0249cf48d9398005169c72710383834a3ad +e705427aa804eb916dc6bfd2ac058e42050a2b2b5f281d8e9b9db8803107a177 +f7918342fb7c391852240fe39532f7c92ee4cfcfa794dd1c53048122bb200e14 +dbff611d8c8f1cc81be97d4c8f2211dba0ea37c1e375e78e05346e553847db72 +c81e6a6565582e9d9db86b2f407b7205ea42bfecb5114af5a78d14c7044ecd9c +664fdcb4125993f34b715df5a0ae58ff0578733c8952ef4d823463fad7ef35e3 +461cf89eac131b4d4c7293c4d0572f14a8222cb03129261179ecb06518ac0e04 +ddbd0b24e77dd2ab27c7f16c35b3e8b7f0b5f0b1180d9f1374c329f6a687f808 +17fa075e4f5364667a3229eed330dd3ea29ffe6257983a410f13c72651ec9e90 +f7e8944549fe47798c2521eb05542fe083925a71049e4007f6926c0d089747d8 +d0c66e255c46ed27d8e1561d7c390bdd5178acc6664314f4c9d33072ba82890b +de5d34687d1577be2251136b2fc3e12d3c9236e8b7d2d7ce08299903d3fce76e +e590e85cef6fae531dc4e4ca922e9cc2df5ab8e7f3607e8470654065db9bd1cf +c7d3778c8a9407e804f6d013790fd7f39d03bae6191d2df01c4801a724d9e263 +d43594931ccb055a91494e678764fd58db3466d9d912d307afdf13f54c8bd733 +399592a8eed1dcf545f455bf74bbef884c2937943255cb371c6530fcb8008528 +43f8a0dadeafc38748bf352fc61113e6f64149920ac259d0c0fb155fc25dc3c1 +6938ad3bff3569108387b693e72d7b4cb06d3b2ee4fb62c24796614152480265 +d93c1c120a060410a44c028d64ba179578663710d641f40368b4c9872f6690c7 +96a669c5784d5b01597bbf96e822bd705362803207a4b9e7874329c4cf51a632 +7c1f9919580ca6906a42e9c15d76dcee49a110bedf2989e475981c37f91a2542 +08b310c719f452c838ea912ddf4a93753793a4ff2aa4096620105070976558a4 +0c87a4860b219304042d141f871db8d4a0514830c18b335a17349ca0641b621d +a2ea00d83a648bf69d21046ece86e55740cef8028878e3b75db72923522cadf5 +3504b5d740ba31129d27591831ca1880334db33a931013027c9b15bf90539529 +82758ceb3877d8870df8ad1c856ccb6a3397b19305669f9605f5989b673dfd7e +0ed2bc564c3a5c302dd67fa00e50d66f5d1373bb9e55dddfff28bf457dca7d59 +8635651de7fd1d97788e6f3214e9202716f02c36ced31219a8ae24e4c613093a +02cc53e9c379078303afc43f8ddb77b00db4f70755a37a02b7c0236700cfb790 +52a14a0d09ed9a8fb316206621624cb69acfb2c312364fef5a9651d65446d285 +a1992f39c38b95583aa660c3e320286e094528479e40a699b0070354acdb81e5 +a5a2e904c42ca4fe1fe200ec0fee28913dec5a2bb422853d143cebba790c0ba2 +5a67dd6e067051220745eba19437854eafa0cbd64a2a96deec8babee4251ddb9 +694be0ee52701018caed5e30b7b8582cf607baea2bb69681de623bdc1d5015a0 +ea6d5dc5c1858fe3898a9cd7e7c7f9ee8e8d8701204285c3d7c6ad7646878074 +8cdae306b7883a347ee3009ec04cd2961e2bc383b2a5467ce28fa815b85aedd4 +62d7c987988fbc2c97d1fae5da3c94dd18766cf70d400eaad3cce0f48a5415a0 +1dec35f68a0cc20a64eab45f50bce6144a4d3d7d1d5de78ad53bf47a2d58a080 +3ebb5446111f70dff80e5f54b96a0d02b9d0954e24d601ed2685ee3853c4899a +84b79a2582494cd1df4060ddeec90146e2e126122a70f27ba04868a24e0d5430 +aaed997da6111865f00414dea8775772f5c62ca094bdc81d7a1d079fdd7165b1 +4d9e4e78a397456d3b0f6e8e458cdf70d063e0d2b809e26e7e31d22863603ea3 +99d46f767a790288867a85868e48a9a95768e7749ceb8ee9d6db89eb2601f565 +282e2626e0c5e37763a077c3f4f8a8d8973b9cc13743a5f783b854af6ffbfe67 +b5dd278a34e87329173a2c5a0db32d2da9a4bdc152f28a1ead450edf5caad746 +a3143b2ba407618be08e15417257eadfd8f56ff13799f24818a1ed7aa63fc169 +8cebe3421a9a01e1ca9610931da2fe8c615c6875fd43d88a1dc17ada14deb29a +8c8c852719f3b22b3642b99e11523a7cb8594f8b78a545cb7dd72a113b645ad9 +78219e0aaef2e956f5ccb0c786e830b80e8f25c54beb3279c46f0677e5bb15bc +a56419c78f5c6b415f8d07ab9241fe8fc72d63e624ac0b112079dbe2ff0aa2af +18330e03adef7d2ec482881890d0a46d3501267a7734a4bbece0c9256439df6e +6c975cbe0ec32a82d44a9a1607c6a85c446259dda777830514cb1f18b2523b56 +2a1c0a22aa3691accc73d73ba433958aee40d2f85c0346b03e7f36570a1002bd +410bd765d9e719224c7546ef57a95924f9314483dc54021d1c658b1dd0b0024e +59c39c91ebcaf7371bbc4e879227669a4fc7fa2ad1b7599d70872eee9a2936a1 +32dd3da89fac27313715c44ce76145a159a85fbb0833fdaacb417543dcdefa31 +9e178306fef18046dbbdc7f7744a853ef2dd889691965799feb742d30f4552c0 +58ce8789f0c3ae70662a4be997ceeb258d892d6e75f22aea1b2a04668ca88706 +60b7469264654e4c615e77e86966703197c6d54eee6d2a66459f03906b9d955a +42765d969d064454c0666f3735a19eff07278cc53254c0669aac84b2159bd364 +9e1a6ae758f1f0ec8b00b6ea796b9b6e3779f10e785e51c227f35ab125bb63d4 +674af694a888e60c990d198831574ddc267abfc76d32cf2d33a82caff2f2f36b +b4d217d3d956ca0e1c80a92c5ded536b705ccd38f3ed88b50ca9b9a9061d7213 +f7efd9f18536c812ad2a4edb9767295cd00b48313863cd9e7fd83779877a7b01 +2720755a903dbaedb02ba5dbf8428c9adcaf459fdcb6050b1f6ce985b6eeeaf9 +d7d667b9e9116ad6147824fe88d7196ecdc02ff06c4d716fdd6f641dde652092 +959db87d24b28db2be5d047205ea3264d76aeb6a99ce34cf3442338e7a4fdedb +5ed5c16e699e357a7aad537566ed135c50c8edeaccca33cd46691e05e1cf7ddf +fdcc4e5b386d49fe74df8f84c6e402279ea6fe874115bc87eb0249610c71ae1d +e03ec38792d660abc92006badd894c98c667481ede6ea30106dbb0d2dc184626 +0cbb02853008983683443c7fbd23b622077eb38ae32597ba80025cbd5f6205e2 +d0f3d15215269e30b18c77708dc9945c1f9ea0a18c7732025f8ceda9538d6f86 +34090a1c18ebfae25004f9f29e645f721d687051029872b6312275dddc161acf +3b33214889900d94ca302cec429b4f2fb5e1bdcca576d45aa9aa64e181dd6260 +0ef76aafedd84448952f8538146a8427dd67f02de497cce8cbf46096a1b13732 +2485a15425d6593d295c1f348ca62aae57788ee3db67424076a423a5b6399a07 +2f93f6c5a2a2d153a7693c37e9295f0c8125683d6888681f79e33f93efa96c42 +76e9c8d10399b5cc546d0ff1b64c5f6700fbe37066c5fdda148375dcaa144665 +8adfb2befb5ecdecddb389773930574021ea2324025e585402b7f530a06198a2 +3fd3bc0b15bee65b4197342260a5dd862c49e46acff95413c357a0308954a418 +a5e9105d26abb95b14afec42a062443d1b32c58c72473d91783e7a1669efeba1 +7bead2234ac57f03c5ea7781755c5991bd81f206519c8ea4d9807680825098c2 +23349b2a24403e359884337677df98f8b1a9dca654502ab477857b0d739f0f67 +5e0cf87cfd0de58926fe2162b56c2446be0668797765cb502640a247659bef6e +7d26205023e112d3e5a497d0a0c2adcf1152089c9b877b3dfc1604e2cdd03367 +8caa973f4bf99d32f247e7fd9284e6749c4395ec3fa543931102bbad49de81e1 +1a690239e26564ff4587d81edffd0edb9f7ad2d82d263511b3d497a925d249c8 +0158765736af3184130401e1bf748b8f184e2cdfbb3267eb1a82c1da8594002d +27b76ee2f943be44c349d4bf86d9aee85db6837ec1fbb4c9eac98879a92e8d7b +eebbd2026c16812a58def04702deea1786945a6e720243461ab31c4cceadcb7c +ac63b1df2961a11e1011a296a0944632817acf7c919181e31b8669954fafc3db +6a577b8eba82a50c219a59d6645520e72f48bf53c6855199053919d22a484ad4 +6fbf3bdfc1ecc3b7800b3ee88c64be45cbb9f585d2bd4cf62690a128f3cd3142 +dd91c5366c1cfb7fb73b7c29d86d26f19589b08aff0cf772ecc7b76156d5da80 +0260592b0a784d4920e0421c4ed86eddeb02bbc1313d62987b52f3754bb60f81 +1a3cf48bc03e224bbd67f1ef13d4a32ad4666b0944c048c1f89f30e38f8533c7 +94958e60ff5087bf869bd268e2fbdf1a6bd1b9b1c5006215a286cf7af82c3f67 +b0b1611a5a74331810ea9a219ccde730e9ce98bcdec4692ae673622aefe7e1a7 +319fa20398f0b939ed41676b9a6857072181439e7651233ee567e72ef3eee362 +9379ccfcc052c5508b63d09862a938029b9dbdbba646c1fa7e9129193dea4bf8 +c35859746e7af90ccbc8ad88571f7f6c538b18dc85f5198efb51fd45f079548b +333e5fe7bb3364a55ee1740230f1f046d3b3ad470b0e52a19820a0316d5f0f55 +87fef1d8a8250bddaa208b83738cf666b3df27fcc182559809028f26b72e7654 +9fd068b8dea9bab23657078b5afac3e72b65a0f50397f976ac9be904df142cb0 +b3fbc2b3cb3587cc3acdc8aa2afc1c4d8576a1b0caee590c3e250f1f25d8633d +0edef486cd4df63339d7f4c355b861d4953cf8d4c0e1293e00a80901d09d8a0b +7b64f2df70c9ed7f075c87c1878d4cdabaa10a2076374b6348dcdf6d87d72b38 +0400f7c7a34cdc6d09d001e5da21280cbf872977ac965702d7e46eb01be9677b +f6901ae6ab37468219d8c658a8f61bf4faeb2a7502446634b35369905f5ed0fe +1533fe4b3bee71da4993f1f731dc8be3cdf89e9f3670243404f9652c57456968 +ba918510954bf849dbdf734e4b0559a3c753b35fceccd217c9f3716c46504bd4 +b78a0e83019df168336737df688ab65d98269efb0b9ac131e69acae5326c7550 +aba0d6bd9e062b184a6a669a7f740fff04261b42024fd42a3c826648f8718608 +261ddcf910b25573b04bb5dab1ddcab53fd668283eca3ef34dc121f15ea27a51 +f304a7e6ff05290a85aee78f14f4bda50f498508b9d2c44792d06146074f694b +2c90b51c4750e2dbe6fce249aaac2c5a392d1d182f014dca607e6f1d2ea717d7 +45b1e6b530343fd6bccd431f2af7c4954c2d12ad089deaf418891fac51ddb9e1 +795863f63ebd82c746e45a7e97f9c115731a7d199ae21f5ea5fe7ad29de5b481 +0077f87c37848295f9f5ef24ce187c48e593d38539c8eee9e263f6afe109e604 +9436731be78afcaeb07cf226e7554b190735a3f8f1f2cd1a30be7dd92e58ea37 +56006f5c1917ace61b6856191addb68bfb36d608a159753f05fa0a40a083c03a +ca867d6a312716493b40bb0e4e733fe058037777cd80816d41af599e2aaa57b8 +75271b3334a0f93f10aaef6af01e5fd98d2fd9ca7e05c750b62f3d114d9c795e +2759dad43ed485b7add8b80f9c459f81c819057ab31ac23549f3ce3c3de6f410 +6404a04ca9dc758d9e8225d197f3ef005289b9e0a2af49ad14d6b5317aea5caf +388e82530ae26476d5a07613033a7c959496432eb882258c8227752571829cdf +4161cbd1e52e33205eb9bce3e04ab8dc52bb3525d80ed96d5fee9b24a531edbc +73b416d786b48b8cb2e821aa25780d924b67c6814247ace207aa29060e8a043f +ce375378f0b1adc3889dc28a737a89c418d0541a588bd27cbc4a62aa8675d28b +4407cbfdae40afe8e3fe78d1a9a3001a16dfa56f70d3e3a509452bf52956b3c9 +326bb174c06d28fc40034cf9ed2457d90a7bdd9159cb855a0f9d0ba6fe110a48 +5a8eac9222b5f77aff318029f4b86c194f575d92999fe1102e128d0f68ce927f +e669ed634cf5265046180999d0bba2e0ff5deb7027e63260d72b68d258128873 +36c3549a3aff30b4557878bdce2153c8dd8368a77a69e08489afb6a868d3b041 +11721f755d8fb933d1c84d5f427b78ba380ec79832f29acea27e756ec2847d5e +0aaf8792e1657c4d70f7ca9fde3d2149456014894047557403e5413a197036cf +47841f339a0234ca45398381f3c25809580624219a17d89d0a535666f6b6934e +864fff0737825f3d48949c5ddc1fccee32118da63bcfc12be33721a421eae44b +fc1bb8eddfe82301f488f2f3ba4f36b6617420ca4c5359795a2057dc5091ad9d +d524687752f52f0eaf2552ee93d4d388c99877a6a54d384c4f55bb87086d24cd +42eb09da79cebf9e828394abf4a566339ef774662f89bfd6b4225ee54d08984b +202a2de739bc6a1ed8ff31b3ba3c291e64d986cf5dd7335cf69475f7ed9b1c59 +3014efceff18b7d8d06a3ba67660aa5fb38e006f9d1b7d8f084f8e110a1400a5 +9bd5d8e8bf9e3763a4f4dab2a16bf00a3d112e1ceb01dce5b404ad438d571df2 +98d248419b303c4e0934c926046100d5d6a512bb80e3b6b17039aea6bb875df3 +7510c23274210792e049824bc745cfff66d7b0896fe63f8069e392d8a39f12f0 +b2100442fea778df4e6770e33b21035b0345760e73a835a4bdd12fed77834fb3 +aca8d1edbf5262d4c2d9905799369776984c2a02554d6636ca7edd4df1a1bb66 +c8b811a2077a5c3ae0860cf421b3a91f01bc8176d7ff83c7bd9fb4dc3541e4ee +dff49d99fb8fee92b4eac155c192d381c0a2767ea17d81b0313d83a421aadd97 +1b27f32145cd9c2d83c7dd39234c33648904ea6270c9fd8161d6eedeb462d50e +ff7de3c46ddd800e29a603b5bd01c0c445a2d49763b5b6969aef53fd39762674 +bd269ebb89f247e9e3e0ed22ad2b909eacd411328fa8a21162076066c2efd31a +8521c39791ce5f0f465c0a8b7c59920e4f5994fe3e5165bd4a108974e3668af6 +d4202ab5cce061b76b652f112a4640bcd10d49390ef11f1797b13576868c5989 +7a01ad22bfd3224bcebe5c2143da0b167ed9ff17f556d83aeefa3b2cfef37f22 +bdc296683b612f4d463db6a36a852c03046536ced4f2a6655a1f3156865e82f1 +9a7f439dc961c0017bad6ca9d8dda164db9ee3c59d983eb93d582caf6c96b1a8 +fa9eb469937b63ac38ec7f78771d6bb6b82a2692cfe2c42fceff158fb8cb5841 +4173b063878ce4a3a594fcf6d00f31b262322443c5d00db4388600d21c8227ed +a9e4cb66fafad8de1df9d6725f967149006b3eb9b6f9c8adb43852530c69af2c +f3e5c0a589a50442e575f4b62bce4dd03a183a81129cc8249c3685621031daf9 +0f1078949761ed33ac2b45a6b0cabcbe046cf778c8805e9c88b43b6e8f9e0a99 +79e36ea93886cac3a6bf5c575ad7576c3793789f0c5ef1342fba67c700ff6b92 +b70e88ce836c245866bd37151e912a4ee67f54d52dbf4da02b8ec19c19cea788 +f4c21dfbbb8037198ad8f42ade78eb6e9d68abc415e436d8656df62cd5a17110 +3414ed0c9125df56ceefc29eeab5cc6334525ee5b035487c24e2a65c4707894a +9dbe23a10c8a605aab0370fa40bc5131e1ad87796b4da0e5821d635a7228f940 +22491d21599ca294d419cb6422e74c39832a6c2ba83d8101985bc8899b39f81a +7ee4ef7b288a9d73e5a815d21afe73c1d6e387c6ae737c827aa673fa2cdd022e +ee226b878b5209c64bf59d25858f75d25aca3d118349a40bb8a079214557fabd +8cdc0d0d5afd470f5d1f029429f8d061ed09804aa256ab11ebe7965a4128c170 +25b16e3fee86d555d70027f61f87ba84212dcb40d20ba960002557fcd22eb53d +ab51d6d639817d94f32ddd47126cff48679f8a6b9e707d5bc0211ac62e58ea4d +2ff4c972d8db4edc442223bc739a7c28f78020531cdff2aee07cc0bb437d01b5 +6d320f6a45313fe34e9517224a0c1c928ebfb7fef3dcdc48a784b4fa9bc99abc +62c004345ead16073deeee9b2caa007876e2e47467f1aa3714fad94dab41158c +21da8e4e848029c3b22fceaa97916f3a3586c4986de4c00904f35e5888088184 +fc8546722202550f676f59bded4de83839f8fde6caf346e4c98460fa6de39de6 +50951c14bd21c97f2173f65282afcdb8eca197759f8988eba10cd5209c2f78bd +3225252b01f0653d85fbf30c8973fb146927db77d67f226e507dd21dff7f60c7 +f556ece6613c6d6d4b6a08bea3b37c56baaf0d0343bf8d34a4efc0de6b12b3a4 +e2fcf9c57b82ef22308e15e0df5dfc3719f2f19a89f5d2ce11bee3cc16f0fd6a +1f08c256169fbdc3dd16ed115855b412636de7ec153f2a5bd5f6998e228ccbf9 +d236cd21a1a513af91e543b193c3a94a03012d709351d65805ab87cd22bf7e2b +2065625f457e90aa5e43cbce132d90bd9bcb0fdfedd6f092e9b3cc1f1aa78ea2 +8ce84f0ac3b5d2217a575c1acf59e106c2e80af8719f23a14a790ff67051d286 +25a8533982ac2129c01c37342d9048b2de29b5ade5f1968bfaeec4dfb7be9369 +f47f8bbeb33bfb83a37c0f11b4227f6c262476e2c0b4062805c99314783f2e11 +a7dd88f16016ab186e78228e7c4f6ebf931b014746bfb34b1cd82131bb7d5d36 +45ff5b799b048439376fe3866159f323439ec9e30843e53d7b88124b4e8b2e76 +f748baf591cb84d11d4c875b27080d0d2b0613a87861cf2446c59d7a6c13d66e +2b7f7e72f86792e91f62a9981d21ea40b0f62f5301df3536bf2036f34eec3b05 +a07fb075790315aaed9e9408d3f25df1de0059a0c6cadccb4132b3cbfe66121e +a5bf2c6606f88cb2aee7b9ba85b65a309f5385e142eb2fa4cb3198a2513e6c6c +39d0e712ee4bce2e67975daf62851303e5b2173379176bcd834471f224ad267d +e4af8eaf1bae6f6a9327f83246d7d781d7abd0a0fd60fd15b7d06fc52c16fd47 +627e00a186169da25069d75ece5d96ec8fc5f1ff604c39b84c87edc70f8502ff +6ee396493a9e4ab3ccc0324dae7699837b29fdb5a622f479c3493deff2bfe525 +6dae714a4ca030e2cd269cb6f70d903d36428b23f3e34c40adc3e42e5f226be9 +339ed78338c4c52614262ec729d7d1c269cf82c8d12b17558d67a33db3270499 +51841531acf3f721b50bbe48f2fb40c9f46797653185796aae59145ff03b6cde +6f25da2a53e1cd614f0df3ae63cc330d85c2e5ee19d4c037da518523ff74eb1e +a1cb9ad81ec1e48007686fd4cc4cbfe0e80dec59f008190d24574b2f8ea6cac5 +d346e77d340f245ef186783850a97edb9cda462776f8683ddc9161298c84aa0c +96b431e4661f016c1ccbdee2045ee27a64f3a9de9a178b23094f012160a5c5af +559df8ea639586dc6489a0571d5b62f2c2813a9433d00478649fe9bda034d80f +0ca3c0a1ab7269ac97fe14ecad621530095fcdd5a9ced7759554b3a7a9f2b2a7 +19955ad506f3ecc3ef1ff5fe7d2394652dc30f9c9e02df4382259faa973b4c6b +91bb39d9da436a5f90b6fa400e5cf4de65f09251f2d5e839c85fab20e49930e3 +f707ea46c9c20420e2006e3ae90e9e0c6a6efb691c9b739994962372b1a896ed +1aad4a26f066531925c06e747ef7a135cad42077f0b387e61f80689cb426f8bf +9e0ff625d4fdf39861a40b9b5339100ee15d06cd5b0af85dca1b5cab33f949a0 +00b0cbbfcc4f581d05cc91bf906c845a6d10ef23dbe101b4758ea0ec4443f99f +209882fd7174995566c10a5dc0fca2693ec68f5390bb1aff73139461f8e654e7 +0a1f6ab97f132d0e3efcc4e59729d52417bfbda03faf45dfcbe8cc42b790a87e +bd9e35da0ab94d8a3746ed85157990f3795a08ab9d21b7b960d758b593df7a9d +59afe4637129d1700672519f8b365bbe285d293afecee29de48f3d25abcb7fd9 +7301a49860ea4afac287bfdc4147f49d6e380dbb9a57852e2888c79e3201052b +26941b905733e586d3baa2ac2950ed29a86044826b776a5a73162b7bbae47c26 +f9bf8cdabbeadb8328736257582f8faf3f42146d31dceb2f0d1c5fe734a9908c +17b3814c16fa526231d7d4d9410beebe6396250575ac3e683c1cfa93ae6d7dae +0e19e09c9d8f0e116ce23efcf1631ef231ab6ad6ce7b37210416e6149fa773c9 +288c607c7c640cc756592efccb538e8b5544e0e76d6096e668f7988c11cffcde +e866d150b720280d0ccb809f655fdf9a497d0c77155f4b6f1f5cfd357eb0967e +acf77fc62c15f83f11e3c3d84ed736e7f8727d842820aa97b05cf31d9f36d8c0 +e6a457b0ee59fb8099aa8c37e0936ed499901715351dc69cae4bb6b2f31a2c07 +a3a51662e6b15d5dd6e5428ec263bfcef6df5dde1792d79a030f0528067d178a +761740935c4ca926ceca451ea1dc0e1de4150e35c74e6c693fbd6135a6c069e5 +4602558c86f62ba4363e0f10725836b735e4aef35146a69b311a351fc1aa380e +37afab2e000908f0537b8f03406e215a7d62cac29f0635505ea349a71c68a030 +8169bcb64b5f73afb92707fbb04fef3f009e0a66d2ce703ca7e07c343832e5c7 +f5a6d807af4ef0e4285d3dff2087d6040ee79af60da47d27f9830793148c5037 +5cb1fe488dec229b522bfb37973fca53bef0481426308ce0b55a68fc85a48d9f +193a69f416d69eb5bbb8ff57f4192a7fd3160d597235b6b688c2e10c14edf671 +fc9a4ecba2282c98fd6c0c2f3f6146fd5559d04fa00a00363a3f3150f9d526f5 +1aa8b8d00ad6a97cda57dc7eb917a2003474e88df788d823c83f69bde0be03ef +5291ecee592351a5aac14d96e428ca1b989baf76fbd4d49c9e78ee57586740e9 +c864414838c60d96f073f42145956422925967e36fbc8fb4aa074021d7294f3a +a54d9c6e10dec7d425ccda2b45d7fc5f255c8c8b8d72f2d8f5c4d156fd78c73f +0417f7d098e1338ace2cce7851973f218aba28c28cb2f512d8a5438114d9e8e3 +e51ea428e6a391b57d1e6ec349e1f0c7962fc52ba7e2467a455e185440a3ba19 +6b9da76c437fff274033f96c79512f9918b2eb7b1625d72f5ebbb17b62f37114 +c02be687d8a07ae8f922ee5a7edf32e192bf98d9fdadd293cc47b83d09f26175 +81a9036dc01e4a85484f0d1419d9ef15e3c2f9a7219a044b4c632ada69462478 +af829ab201fc657bca7d2fd0397034417179d22da20ca17751e70db558956c4d +44818185f52c57003f5f570d4c94e2904c54eaff5807ddf4d53af191c03167a0 +30c67430d9a4f7d6f7575d46c07b5b78418f682c4ff2d77cce816a5829413cd5 +348344ad7133b4a3d5b11ae0373248f35883d561770dc0dd838db39569188b50 +dc423e990d7d57d2b47bcf8760db57edb9305c11055b477229c6415e60f7eb7b +16bb6c7d80b53882c92f3fb1a2d1e04450dede6931195c71368f51ebf5047706 +3e2496c36130cd7ca975cd930a986588ef700f181b2f46ac6a3b74fe86fbc257 +4f1a2d90e452eacc7096459a6e4c2cac0924cb6135b5586bc34d22202af39e14 +42c62045159641af84ebc39b7fcb184953b55cde0e2c88fb2cb3ee0c6685cf6c +357c90f482d4752f534995f8f28f4ba9eb41dfecafacbcacf4eeda567baf10be +e6c6c18be8a08ef7b4517e4e382f37448719a43e1518146d91ade370e057d5d5 +52e13f06a66fba703774105e6b6f044a508d7d0ffb9bab76bea7607080f8c060 +913e617f07ae56a2e0a5ff69e075190ecc99a2dc1ea2dedf6a234c1deda49139 +49f04766947909616a419e07b86503e00b070145f4c46a1008e607c23dec4ea0 +998bcfeefdbe0511c847f45465b67147764bb8b5c2365ec38af4ac8b6cd5380d +6d6c0d29585130621aefc37b4709cf942292cd52015b8774f67735cedcd83936 +b67675418b58fc366c37767fab2fa76a38b9b51240f3873dd025ee5ef4bf5f9e +6753307b2cee6f60a381e32679b6f37b750c3f03354b10cc93fac884bc216951 +e559542dbc54fc7a9222b0a5dee253b9dd8b33c00d5c9f6c19f83161d8a7d456 +8927b1ef519dd95a48e2f474d73254b80031b448f59d604f9ef433c8278829a7 +f3c411d1e780a325acf608dd57e77dc4dd10424b25fbafad28af7c23d1dd72ec +81eefd6fd1bd13de50024df5054baeb0e19317a0c80488155088d367fc99caff +594ee4f9b8688439a74399dd40a1a961588d14adcb7e90eadef65b14fb7db73c +770d66d856b6bb464f62c516553017cbb4bcea96afbffcc5680c81b9953e9f3e +af5e035410f8b1f209c022691699d7f4b6210bf0c5198aa27881e392dbacc49b +635594ddda5b95fe0b9598302ac8787901aaa646e7e6d53c07d3462b5d872f79 +a028db63baf3bab7261dc69d57f1c06e71e146ec7b3a65ba0c9ee6038b0ed5bd +55d1c4203adb9f01c74dab34d3dc6d617fdc24d4fcff513889db8f187c006810 +f60a73679a3e71405bcf2e91e317d1188b10ff3f31040692ccf0498955d7053e +b729e4657d5db68941776814b9ed88a6370b8ea63ec1703b9e40f140c0884387 +b484927ff6fbb0a6be84eb56075225e3df764f7865252d4685a200662140305f +05dee781534958a264e7d062a3f7c95d3e7c865a9abbb7623f3f166d9ce681b3 +13e8ee51ea356ceb2ce37f52863bef13347bc398240bdefb46ed524b3cdc46af +366a91b9bee1720e1df4201448a9f2ea7d3464c853c9d6ec698f967df80a8c7d +93ecf0c5884b706a00e1e2c9172cb99f1ef6c200ddfb0fdb8c3fdb896dd3704f +67c2f7a66e85b7133613881efc7bf90834872b9691fc362611471c9f1aa3eb26 +202e36c7bc27bba964a352539106117b85e7b379cd24c1038017a88ab6bee872 +9773e61b996651b730e7d9b66bbc4dbccfeaee83e68d0aa7d49af95be2219877 +b898c2ddaedfebf399b06aa9cb2a0208ea340ba2789ab6f651381c656fdfa95e +28efd732a11bfd656be999129716202f44dcb3a2404be59a2aafd7aea7ceaf24 +8b482f0d80d50f7619fe48fac7ef44038e8ae76e479da8df21e417cdbc9edc3b +d8dad18963e28b90d813378abd6e2698a8565c9a024e89371ee924db78cd86c0 +5120a3b33fdd6bd051adc37b21ed8a8e2f5d9d7a6e120a6e0077cd7f1bd3f5b7 +4e661269b642699be33e83900487ea9658d14b69322ff04e1856134ccf270097 +e01cb41ca37d7da54f52de416c5f3f2b8f7565ac98ff75d1137857ff784f128b +ed0557ab12c4feb0cbfb8efcff4bb584b9c0358c7e7db24f21503d0a12c8752c +06b48bb942b24b3cdff45227044d5fdf130783358e0305e70b48d107ddfb6e0a +a6108bdea4da127b55d771f14f318da154f25ba46d2879decbb2bae30b5bec14 +0f3bb4e2133452e579d218a53eeb1ecb59e248faa5db21ff41f06b5b59a6e7e8 +a3b115dd4efbffac> +endstream +endobj + +{{xref}} +{{trailer}} +{{startxref}} +%%EOF
diff --git a/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder_expected.pdf.0.png b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder_expected.pdf.0.png new file mode 100644 index 0000000..02f6c0d --- /dev/null +++ b/testing/resources/pixel/jbig2-trailing-7fff-stripped-harder_expected.pdf.0.png Binary files differ