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