summaryrefslogtreecommitdiffstats
path: root/qpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2008-04-29 14:55:25 +0200
committerJay Berkenbilt <ejb@ql.org>2008-04-29 14:55:25 +0200
commit9a0b88bf7777c153dc46ace22db74ef24d51583a (patch)
treef567ac1cf2bf5071a611eb49323a935b6ac938ff /qpdf
downloadqpdf-9a0b88bf7777c153dc46ace22db74ef24d51583a.tar.zst
update release date to actual daterelease-qpdf-2.0
git-svn-id: svn+q:///qpdf/trunk@599 71b93d88-0707-0410-a8cf-f5a4172ac649
Diffstat (limited to 'qpdf')
-rw-r--r--qpdf/Makefile1
-rw-r--r--qpdf/build.mk26
-rwxr-xr-xqpdf/fix-qdf352
-rw-r--r--qpdf/qpdf.cc942
-rw-r--r--qpdf/qpdf.testcov117
-rw-r--r--qpdf/qtest/qpdf.test942
-rw-r--r--qpdf/qtest/qpdf/U25A0.1.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.10.check5
-rw-r--r--qpdf/qtest/qpdf/U25A0.11.check5
-rw-r--r--qpdf/qtest/qpdf/U25A0.12.check5
-rw-r--r--qpdf/qtest/qpdf/U25A0.2.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.3.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.4.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.5.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.6.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.7.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.8.check4
-rw-r--r--qpdf/qtest/qpdf/U25A0.9.check5
-rw-r--r--qpdf/qtest/qpdf/U25A0.pdfbin0 -> 67790 bytes
-rw-r--r--qpdf/qtest/qpdf/bad1-recover.out1
-rw-r--r--qpdf/qtest/qpdf/bad1.out1
-rw-r--r--qpdf/qtest/qpdf/bad1.pdf1
-rw-r--r--qpdf/qtest/qpdf/bad10-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad10.out1
-rw-r--r--qpdf/qtest/qpdf/bad10.pdf79
-rw-r--r--qpdf/qtest/qpdf/bad11-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad11.out1
-rw-r--r--qpdf/qtest/qpdf/bad11.pdf104
-rw-r--r--qpdf/qtest/qpdf/bad12-recover.out7
-rw-r--r--qpdf/qtest/qpdf/bad12.out7
-rw-r--r--qpdf/qtest/qpdf/bad12.pdf122
-rw-r--r--qpdf/qtest/qpdf/bad13-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad13.out1
-rw-r--r--qpdf/qtest/qpdf/bad13.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad14-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad14.out1
-rw-r--r--qpdf/qtest/qpdf/bad14.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad15-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad15.out1
-rw-r--r--qpdf/qtest/qpdf/bad15.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad16-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad16.out1
-rw-r--r--qpdf/qtest/qpdf/bad16.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad17-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad17.out1
-rw-r--r--qpdf/qtest/qpdf/bad17.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad18-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad18.out1
-rw-r--r--qpdf/qtest/qpdf/bad18.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad19-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad19.out1
-rw-r--r--qpdf/qtest/qpdf/bad19.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad2-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad2.out1
-rw-r--r--qpdf/qtest/qpdf/bad2.pdf76
-rw-r--r--qpdf/qtest/qpdf/bad20-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad20.out1
-rw-r--r--qpdf/qtest/qpdf/bad20.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad21-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad21.out1
-rw-r--r--qpdf/qtest/qpdf/bad21.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad22-recover.out21
-rw-r--r--qpdf/qtest/qpdf/bad22.out1
-rw-r--r--qpdf/qtest/qpdf/bad22.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad23-recover.out21
-rw-r--r--qpdf/qtest/qpdf/bad23.out1
-rw-r--r--qpdf/qtest/qpdf/bad23.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad24-recover.out2
-rw-r--r--qpdf/qtest/qpdf/bad24.out1
-rw-r--r--qpdf/qtest/qpdf/bad24.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad25-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad25.out1
-rw-r--r--qpdf/qtest/qpdf/bad25.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad26-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad26.out1
-rw-r--r--qpdf/qtest/qpdf/bad26.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad27-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad27.out1
-rw-r--r--qpdf/qtest/qpdf/bad27.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad28-recover.out21
-rw-r--r--qpdf/qtest/qpdf/bad28.out21
-rw-r--r--qpdf/qtest/qpdf/bad28.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad29-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad29.out1
-rw-r--r--qpdf/qtest/qpdf/bad29.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad3-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad3.out1
-rw-r--r--qpdf/qtest/qpdf/bad3.pdf76
-rw-r--r--qpdf/qtest/qpdf/bad30-recover.out6
-rw-r--r--qpdf/qtest/qpdf/bad30.out6
-rw-r--r--qpdf/qtest/qpdf/bad30.pdf93
-rw-r--r--qpdf/qtest/qpdf/bad31-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad31.out9
-rw-r--r--qpdf/qtest/qpdf/bad31.pdf93
-rw-r--r--qpdf/qtest/qpdf/bad32-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad32.out1
-rw-r--r--qpdf/qtest/qpdf/bad32.pdf80
-rw-r--r--qpdf/qtest/qpdf/bad4-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad4.out1
-rw-r--r--qpdf/qtest/qpdf/bad4.pdf77
-rw-r--r--qpdf/qtest/qpdf/bad5-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad5.out1
-rw-r--r--qpdf/qtest/qpdf/bad5.pdf77
-rw-r--r--qpdf/qtest/qpdf/bad6-recover.out6
-rw-r--r--qpdf/qtest/qpdf/bad6.out6
-rw-r--r--qpdf/qtest/qpdf/bad6.pdf122
-rw-r--r--qpdf/qtest/qpdf/bad7-recover.out4
-rw-r--r--qpdf/qtest/qpdf/bad7.out1
-rw-r--r--qpdf/qtest/qpdf/bad7.pdf77
-rw-r--r--qpdf/qtest/qpdf/bad8-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad8.out1
-rw-r--r--qpdf/qtest/qpdf/bad8.pdf104
-rw-r--r--qpdf/qtest/qpdf/bad9-recover.out9
-rw-r--r--qpdf/qtest/qpdf/bad9.out1
-rw-r--r--qpdf/qtest/qpdf/bad9.pdf79
-rw-r--r--qpdf/qtest/qpdf/badlin1.out380
-rw-r--r--qpdf/qtest/qpdf/badlin1.pdfbin0 -> 13103 bytes
-rw-r--r--qpdf/qtest/qpdf/check-ID.pl20
-rw-r--r--qpdf/qtest/qpdf/delete-and-reuse.pdf1573
-rw-r--r--qpdf/qtest/qpdf/delete-and-reuse.qdf1408
-rwxr-xr-xqpdf/qtest/qpdf/diff-encrypted7
-rw-r--r--qpdf/qtest/qpdf/enc-R2,V1,O=master.pdfbin0 -> 17146 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-R2,V1,U=view,O=master.pdfbin0 -> 17134 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-R2,V1,U=view.pdfbin0 -> 17137 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-R2,V1.pdfbin0 -> 17143 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-R3,V2,O=master.pdfbin0 -> 17144 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-R3,V2,U=view,O=master.pdfbin0 -> 17139 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-R3,V2,U=view.pdfbin0 -> 17142 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-R3,V2.pdfbin0 -> 17140 bytes
-rw-r--r--qpdf/qtest/qpdf/enc-base.pdfbin0 -> 16937 bytes
-rwxr-xr-xqpdf/qtest/qpdf/enc-long-password.pdfbin0 -> 17144 bytes
-rw-r--r--qpdf/qtest/qpdf/encrypted-with-images.pdfbin0 -> 50219 bytes
-rw-r--r--qpdf/qtest/qpdf/encrypted1.out578
-rw-r--r--qpdf/qtest/qpdf/fix1.qdf111
-rw-r--r--qpdf/qtest/qpdf/fix1.qdf.out113
-rw-r--r--qpdf/qtest/qpdf/fix2.qdfbin0 -> 1227 bytes
-rw-r--r--qpdf/qtest/qpdf/fix2.qdf.outbin0 -> 1232 bytes
-rw-r--r--qpdf/qtest/qpdf/good1.out6
-rw-r--r--qpdf/qtest/qpdf/good1.pdfbin0 -> 813 bytes
-rw-r--r--qpdf/qtest/qpdf/good1.qdf95
-rw-r--r--qpdf/qtest/qpdf/good10.out8
-rw-r--r--qpdf/qtest/qpdf/good10.pdf80
-rw-r--r--qpdf/qtest/qpdf/good10.qdf100
-rw-r--r--qpdf/qtest/qpdf/good11.out6
-rw-r--r--qpdf/qtest/qpdf/good11.pdf81
-rw-r--r--qpdf/qtest/qpdf/good11.qdf98
-rw-r--r--qpdf/qtest/qpdf/good12.out13
-rw-r--r--qpdf/qtest/qpdf/good12.pdf93
-rw-r--r--qpdf/qtest/qpdf/good12.qdf113
-rw-r--r--qpdf/qtest/qpdf/good13.out9
-rw-r--r--qpdf/qtest/qpdf/good13.pdf101
-rw-r--r--qpdf/qtest/qpdf/good13.qdf139
-rw-r--r--qpdf/qtest/qpdf/good14.out39
-rw-r--r--qpdf/qtest/qpdf/good14.pdf142
-rw-r--r--qpdf/qtest/qpdf/good14.qdf189
-rw-r--r--qpdf/qtest/qpdf/good15.out5
-rw-r--r--qpdf/qtest/qpdf/good15.pdf79
-rw-r--r--qpdf/qtest/qpdf/good15.qdf97
-rw-r--r--qpdf/qtest/qpdf/good16.out6
-rw-r--r--qpdf/qtest/qpdf/good16.pdfbin0 -> 792 bytes
-rw-r--r--qpdf/qtest/qpdf/good16.qdfbin0 -> 1106 bytes
-rw-r--r--qpdf/qtest/qpdf/good17-not-qdf.pdfbin0 -> 9893 bytes
-rw-r--r--qpdf/qtest/qpdf/good17-not-recompressed.pdfbin0 -> 9147 bytes
-rw-r--r--qpdf/qtest/qpdf/good17.out6
-rw-r--r--qpdf/qtest/qpdf/good17.pdf1550
-rw-r--r--qpdf/qtest/qpdf/good17.qdf1523
-rw-r--r--qpdf/qtest/qpdf/good18.out6
-rw-r--r--qpdf/qtest/qpdf/good18.pdf1538
-rw-r--r--qpdf/qtest/qpdf/good18.qdf1343
-rw-r--r--qpdf/qtest/qpdf/good19.out6
-rw-r--r--qpdf/qtest/qpdf/good19.pdfbin0 -> 1032 bytes
-rw-r--r--qpdf/qtest/qpdf/good19.qdfbin0 -> 1105 bytes
-rw-r--r--qpdf/qtest/qpdf/good2.out6
-rw-r--r--qpdf/qtest/qpdf/good2.pdf80
-rw-r--r--qpdf/qtest/qpdf/good2.qdf95
-rw-r--r--qpdf/qtest/qpdf/good20.out6
-rw-r--r--qpdf/qtest/qpdf/good20.pdf901
-rw-r--r--qpdf/qtest/qpdf/good20.qdf1075
-rw-r--r--qpdf/qtest/qpdf/good3.out6
-rw-r--r--qpdf/qtest/qpdf/good3.pdf80
-rw-r--r--qpdf/qtest/qpdf/good3.qdf95
-rw-r--r--qpdf/qtest/qpdf/good4.out6
-rw-r--r--qpdf/qtest/qpdf/good4.pdf83
-rw-r--r--qpdf/qtest/qpdf/good4.qdf95
-rw-r--r--qpdf/qtest/qpdf/good5.out5
-rw-r--r--qpdf/qtest/qpdf/good5.pdf83
-rw-r--r--qpdf/qtest/qpdf/good5.qdf96
-rw-r--r--qpdf/qtest/qpdf/good6.out5
-rw-r--r--qpdf/qtest/qpdf/good6.pdf79
-rw-r--r--qpdf/qtest/qpdf/good6.qdf96
-rw-r--r--qpdf/qtest/qpdf/good7-not-normalized.qdf95
-rw-r--r--qpdf/qtest/qpdf/good7.out5
-rw-r--r--qpdf/qtest/qpdf/good7.pdf79
-rw-r--r--qpdf/qtest/qpdf/good7.qdf97
-rw-r--r--qpdf/qtest/qpdf/good8.out5
-rw-r--r--qpdf/qtest/qpdf/good8.pdf79
-rw-r--r--qpdf/qtest/qpdf/good8.qdf96
-rw-r--r--qpdf/qtest/qpdf/good9.out5
-rw-r--r--qpdf/qtest/qpdf/good9.pdf81
-rw-r--r--qpdf/qtest/qpdf/good9.qdf97
-rw-r--r--qpdf/qtest/qpdf/heifer.out4
-rw-r--r--qpdf/qtest/qpdf/heifer.pdfbin0 -> 93593 bytes
-rw-r--r--qpdf/qtest/qpdf/heifer.qdf1349
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.1.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.10.check5
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.11.check5
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.12.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.2.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.3.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.4.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.5.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.6.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.7.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.8.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.9.check4
-rw-r--r--qpdf/qtest/qpdf/hybrid-xref.pdf1538
-rw-r--r--qpdf/qtest/qpdf/inline-images.1.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.10.check5
-rw-r--r--qpdf/qtest/qpdf/inline-images.11.check5
-rw-r--r--qpdf/qtest/qpdf/inline-images.12.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.2.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.3.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.4.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.5.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.6.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.7.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.8.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.9.check4
-rw-r--r--qpdf/qtest/qpdf/inline-images.pdfbin0 -> 300684 bytes
-rw-r--r--qpdf/qtest/qpdf/lin-delete-and-reuse.pdfbin0 -> 13382 bytes
-rw-r--r--qpdf/qtest/qpdf/lin-special.1.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.10.check5
-rw-r--r--qpdf/qtest/qpdf/lin-special.11.check5
-rw-r--r--qpdf/qtest/qpdf/lin-special.12.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.2.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.3.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.4.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.5.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.6.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.7.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.8.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.9.check4
-rw-r--r--qpdf/qtest/qpdf/lin-special.disable.expbin0 -> 3138 bytes
-rw-r--r--qpdf/qtest/qpdf/lin-special.generate.expbin0 -> 2757 bytes
-rw-r--r--qpdf/qtest/qpdf/lin-special.pdf354
-rw-r--r--qpdf/qtest/qpdf/lin-special.preserve.expbin0 -> 3138 bytes
-rw-r--r--qpdf/qtest/qpdf/lin0.out1
-rw-r--r--qpdf/qtest/qpdf/lin0.pdf79
-rw-r--r--qpdf/qtest/qpdf/lin1.out378
-rw-r--r--qpdf/qtest/qpdf/lin1.pdfbin0 -> 13103 bytes
-rw-r--r--qpdf/qtest/qpdf/lin2.out378
-rw-r--r--qpdf/qtest/qpdf/lin2.pdfbin0 -> 13103 bytes
-rw-r--r--qpdf/qtest/qpdf/lin3.out318
-rw-r--r--qpdf/qtest/qpdf/lin3.pdfbin0 -> 16937 bytes
-rw-r--r--qpdf/qtest/qpdf/lin4.out353
-rw-r--r--qpdf/qtest/qpdf/lin4.pdfbin0 -> 13055 bytes
-rw-r--r--qpdf/qtest/qpdf/lin5.out318
-rw-r--r--qpdf/qtest/qpdf/lin5.pdfbin0 -> 27464 bytes
-rw-r--r--qpdf/qtest/qpdf/lin6.out592
-rw-r--r--qpdf/qtest/qpdf/lin6.pdfbin0 -> 24824 bytes
-rw-r--r--qpdf/qtest/qpdf/lin7.out292
-rw-r--r--qpdf/qtest/qpdf/lin7.pdfbin0 -> 27408 bytes
-rw-r--r--qpdf/qtest/qpdf/lin8.out568
-rw-r--r--qpdf/qtest/qpdf/lin8.pdfbin0 -> 24875 bytes
-rw-r--r--qpdf/qtest/qpdf/lin9.out104
-rw-r--r--qpdf/qtest/qpdf/lin9.pdfbin0 -> 3316 bytes
-rw-r--r--qpdf/qtest/qpdf/misc-1.out15
-rw-r--r--qpdf/qtest/qpdf/misc-1.pdfbin0 -> 18204 bytes
-rw-r--r--qpdf/qtest/qpdf/misc-2.out26
-rw-r--r--qpdf/qtest/qpdf/misc-2.pdfbin0 -> 16022 bytes
-rw-r--r--qpdf/qtest/qpdf/misc-3.out14
-rw-r--r--qpdf/qtest/qpdf/misc-3.pdf127
-rwxr-xr-xqpdf/qtest/qpdf/multiple-mods.pdfbin0 -> 60960 bytes
-rw-r--r--qpdf/qtest/qpdf/object-stream.1.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.10.check5
-rw-r--r--qpdf/qtest/qpdf/object-stream.11.check5
-rw-r--r--qpdf/qtest/qpdf/object-stream.12.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.2.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.3.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.4.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.5.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.6.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.7.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.8.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.9.check4
-rw-r--r--qpdf/qtest/qpdf/object-stream.disable.expbin0 -> 1250 bytes
-rw-r--r--qpdf/qtest/qpdf/object-stream.generate.expbin0 -> 1526 bytes
-rw-r--r--qpdf/qtest/qpdf/object-stream.pdfbin0 -> 792 bytes
-rw-r--r--qpdf/qtest/qpdf/object-stream.preserve.expbin0 -> 1526 bytes
-rw-r--r--qpdf/qtest/qpdf/old-and-complex.pdfbin0 -> 335662 bytes
-rw-r--r--qpdf/qtest/qpdf/p1-a-p2-a.pdf138
-rw-r--r--qpdf/qtest/qpdf/p1-a-p2-b.pdf138
-rw-r--r--qpdf/qtest/qpdf/p1-a.pdf95
-rw-r--r--qpdf/qtest/qpdf/p1-b.pdf95
-rw-r--r--qpdf/qtest/qpdf/show-page-1-content-filtered.out1
-rw-r--r--qpdf/qtest/qpdf/show-page-1-content-normalized.out8
-rw-r--r--qpdf/qtest/qpdf/show-page-1-content-raw.outbin0 -> 61 bytes
-rw-r--r--qpdf/qtest/qpdf/show-page-1-image.outbin0 -> 39109 bytes
-rw-r--r--qpdf/qtest/qpdf/show-page-1.out1
-rw-r--r--qpdf/qtest/qpdf/show-pages-images.out11
-rw-r--r--qpdf/qtest/qpdf/show-pages.out6
-rw-r--r--qpdf/qtest/qpdf/show-unfilterable.out1
-rw-r--r--qpdf/qtest/qpdf/show-xref-by-id-filtered.outbin0 -> 52 bytes
-rw-r--r--qpdf/qtest/qpdf/show-xref-by-id.out2
-rw-r--r--qpdf/qtest/qpdf/show-xref.out12
-rw-r--r--qpdf/qtest/qpdf/test4-1.pdf126
-rw-r--r--qpdf/qtest/qpdf/test4-1.qdf145
-rw-r--r--qpdf/qtest/qpdf/test4-2.out1
-rw-r--r--qpdf/qtest/qpdf/test4-2.pdf104
-rw-r--r--qpdf/qtest/qpdf/test4-3.out1
-rw-r--r--qpdf/qtest/qpdf/test4-3.pdf109
-rw-r--r--qpdf/qtest/qpdf/test4-4.pdf123
-rw-r--r--qpdf/qtest/qpdf/test4-4.qdf145
-rw-r--r--qpdf/test_driver.cc323
314 files changed, 29144 insertions, 0 deletions
diff --git a/qpdf/Makefile b/qpdf/Makefile
new file mode 100644
index 00000000..90899055
--- /dev/null
+++ b/qpdf/Makefile
@@ -0,0 +1 @@
+include ../make/proxy.mk
diff --git a/qpdf/build.mk b/qpdf/build.mk
new file mode 100644
index 00000000..b6fc55c9
--- /dev/null
+++ b/qpdf/build.mk
@@ -0,0 +1,26 @@
+BINS_qpdf = qpdf test_driver
+
+TARGETS_qpdf = $(foreach B,$(BINS_qpdf),qpdf/$(OUTPUT_DIR)/$(B))
+
+$(TARGETS_qpdf): $(TARGETS_libqpdf)
+
+INCLUDES_qpdf = include
+
+TC_SRCS_qpdf = $(wildcard libqpdf/*.cc) $(wildcard qpdf/*.cc)
+
+# -----
+
+$(foreach B,$(BINS_qpdf),$(eval \
+ OBJS_$(B) = $(call src_to_obj,qpdf/$(B).cc)))
+
+ifeq ($(GENDEPS),1)
+-include $(foreach B,$(BINS_qpdf),$(call obj_to_dep,$(OBJS_$(B))))
+endif
+
+$(foreach B,$(BINS_qpdf),$(eval \
+ $(OBJS_$(B)): qpdf/$(OUTPUT_DIR)/%.o: qpdf/$(B).cc ; \
+ $(call compile,qpdf/$(B).cc,$(INCLUDES_qpdf))))
+
+$(foreach B,$(BINS_qpdf),$(eval \
+ qpdf/$(OUTPUT_DIR)/$(B): $(OBJS_$(B)) ; \
+ $(call makebin,$(OBJS_$(B)),$$@)))
diff --git a/qpdf/fix-qdf b/qpdf/fix-qdf
new file mode 100755
index 00000000..d3544d95
--- /dev/null
+++ b/qpdf/fix-qdf
@@ -0,0 +1,352 @@
+#!/usr/bin/env perl
+
+require 5.008;
+BEGIN { $^W = 1; }
+use strict;
+
+my $whoami = ($0 =~ m,([^/\\]*)$,) ? $1 : $0;
+my $dirname = ($0 =~ m,(.*)[/\\][^/\\]+$,) ? $1 : ".";
+
+if ((@ARGV == 1) && ($ARGV[0] eq '--version'))
+{
+ exec "$dirname/qpdf", '--version';
+ exit 2;
+}
+
+my $offset = 0;
+my $last_offset = 0;
+
+my $file = shift(@ARGV);
+if (defined $file)
+{
+ open(F, "<$file") or die "$whoami: can't open $file: $!\n";
+}
+else
+{
+ $file = 'stdin';
+ open(F, "<&STDIN") or die "$whoami: can't dup stdin: $!\n";
+}
+binmode F;
+binmode STDOUT;
+
+my $line = get_line();
+if (! ((defined $line) && ($line =~ m/^%PDF-1\.\d+\b/)))
+{
+ die "$whoami: $file: not a pdf file\n";
+}
+print $line;
+$line = get_line();
+die "$whoami: $file: premature EOF\n" unless defined $line;
+print $line;
+$line = get_line();
+if (! ((defined $line) && ($line =~ m/^%QDF-1.\d+\b/)))
+{
+ die "$whoami: $file: not a qdf file\n";
+}
+print $line;
+
+my $last_obj = 0;
+my @xref = ();
+
+my $stream_start = 0;
+my $stream_length = 0;
+my $xref_offset = 0;
+my $xref_f1_nbytes = 0;
+my $xref_size = 0;
+
+my $cur_state = 0;
+my $st_top = ++$cur_state;
+my $st_in_obj = ++$cur_state;
+my $st_in_stream = ++$cur_state;
+my $st_after_stream = ++$cur_state;
+my $st_in_ostream_dict = ++$cur_state;
+my $st_in_ostream_offsets = ++$cur_state;
+my $st_in_ostream_outer = ++$cur_state;
+my $st_in_ostream_obj = ++$cur_state;
+my $st_in_xref_stream_dict = ++$cur_state;
+my $st_in_length = ++$cur_state;
+my $st_at_xref = ++$cur_state;
+my $st_before_trailer = ++$cur_state;
+my $st_in_trailer = ++$cur_state;
+my $st_done = ++$cur_state;
+
+my @ostream = ();
+my @ostream_offsets = ();
+my $ostream_idx = 0;
+my $ostream_id = 0;
+my $ostream_extends = "";
+
+my $state = $st_top;
+while (defined($line = get_line()))
+{
+ if ($state == $st_top)
+ {
+ if ($line =~ m/^(\d+) 0 obj$/)
+ {
+ check_obj_id($1);
+ $state = $st_in_obj;
+ }
+ elsif ($line =~ m/^xref$/)
+ {
+ $xref_offset = $last_offset;
+ $state = $st_at_xref;
+ }
+ print $line;
+ }
+ elsif ($state == $st_in_obj)
+ {
+ print $line;
+ if ($line =~ m/^stream$/)
+ {
+ $state = $st_in_stream;
+ $stream_start = $offset;
+ }
+ elsif ($line =~ m/^endobj$/)
+ {
+ $state = $st_top;
+ }
+ elsif ($line =~ m,/Type /ObjStm,)
+ {
+ $state = $st_in_ostream_dict;
+ $ostream_id = $last_obj;
+ }
+ elsif ($line =~ m,/Type /XRef,)
+ {
+ $xref_offset = $xref[-1][1];
+ $xref_f1_nbytes = 0;
+ my $t = $xref_offset;
+ while ($t)
+ {
+ $t >>= 8;
+ ++$xref_f1_nbytes;
+ }
+ my $esize = $xref_f1_nbytes + 2;
+ $xref_size = 1 + @xref;
+ my $length = $xref_size * $esize;
+ print " /Length $length\n";
+ print " /W [ 1 $xref_f1_nbytes 1 ]\n";
+ $state = $st_in_xref_stream_dict;
+ }
+ }
+ elsif ($state == $st_in_ostream_dict)
+ {
+ if ($line =~ m,/Extends (\d+ 0 R),)
+ {
+ $ostream_extends = $1;
+ }
+ elsif ($line =~ m/^stream/)
+ {
+ $state = $st_in_ostream_offsets;
+ }
+ # discard line
+ }
+ elsif ($state == $st_in_ostream_offsets)
+ {
+ if ($line =~ m/^\%\% Object stream: object (\d+)/)
+ {
+ check_obj_id($1);
+ $stream_start = $last_offset;
+ $state = $st_in_ostream_outer;
+ push(@ostream, $line);
+ }
+ # discard line
+ }
+ elsif ($state == $st_in_ostream_outer)
+ {
+ adjust_ostream_xref();
+ push(@ostream_offsets, $last_offset - $stream_start);
+ $state = $st_in_ostream_obj;
+ push(@ostream, $line);
+ }
+ elsif ($state == $st_in_ostream_obj)
+ {
+ push(@ostream, $line);
+ if ($line =~ m/^\%\% Object stream: object (\d+)/)
+ {
+ check_obj_id($1);
+ $state = $st_in_ostream_outer;
+ }
+ elsif ($line =~ m/^endstream/)
+ {
+ $stream_length = $last_offset - $stream_start;
+ write_ostream();
+ $state = $st_in_obj;
+ }
+ }
+ elsif ($state == $st_in_xref_stream_dict)
+ {
+ if ($line =~ m,/(Length|W) ,)
+ {
+ # already printed
+ }
+ elsif ($line =~ m,/Size ,)
+ {
+ my $size = 1 + @xref;
+ print " /Size $xref_size\n";
+ }
+ else
+ {
+ print $line;
+ }
+ if ($line =~ m/^stream\n/)
+ {
+ my $pack = "(C C$xref_f1_nbytes C)";
+ print pack($pack, 0, 0, 0);
+ foreach my $x (@xref)
+ {
+ my ($type, $f1, $f2) = @$x;
+ $f2 = 0 unless defined $f2;
+ my @f1 = ();
+ for (my $i = 0; $i < $xref_f1_nbytes; ++$i)
+ {
+ unshift(@f1, $f1 & 0xff);
+ $f1 >>= 8;
+ }
+ print pack($pack, $type, @f1, $f2);
+ }
+ print "\nendstream\nendobj\n\n";
+ print "startxref\n$xref_offset\n\%\%EOF\n";
+ $state = $st_done;
+ }
+ }
+ elsif ($state == $st_in_stream)
+ {
+ if ($line =~ m/^endstream$/)
+ {
+ $stream_length = $last_offset - $stream_start;
+ $state = $st_after_stream;
+ }
+ print $line;
+ }
+ elsif ($state == $st_after_stream)
+ {
+ if ($line =~ m/^\%QDF: ignore_newline$/)
+ {
+ --$stream_length;
+ }
+ elsif ($line =~ m/^(\d+) 0 obj$/)
+ {
+ check_obj_id($1);
+ $state = $st_in_length;
+ }
+ print $line;
+ }
+ elsif ($state == $st_in_length)
+ {
+ if ($line !~ m/^\d+$/)
+ {
+ die "$file:$.: expected integer\n";
+ }
+ my $new = "$stream_length\n";
+ $offset -= length($line);
+ $offset += length($new);
+ print $new;
+ $state = $st_top;
+ }
+ elsif ($state == $st_at_xref)
+ {
+ my $n = scalar(@xref);
+ print "0 ", $n+1, "\n0000000000 65535 f \n";
+ for (@xref)
+ {
+ my ($type, $f1, $f2) = @$_;
+ printf("%010d 00000 n \n", $f1);
+ }
+ $state = $st_before_trailer;
+ }
+ elsif ($state == $st_before_trailer)
+ {
+ if ($line =~ m/^trailer <</)
+ {
+ print $line;
+ $state = $st_in_trailer;
+ }
+ # no output
+ }
+ elsif ($state == $st_in_trailer)
+ {
+ if ($line =~ m/^ \/Size \d+$/)
+ {
+ print " /Size ", scalar(@xref) + 1, "\n";
+ }
+ else
+ {
+ print $line;
+ }
+ if ($line =~ m/^>>$/)
+ {
+ print "startxref\n$xref_offset\n\%\%EOF\n";
+ $state = $st_done;
+ }
+ }
+ elsif ($state == $st_done)
+ {
+ # ignore
+ }
+}
+
+die "$whoami: $file: premature EOF\n" unless $state == $st_done;
+
+sub get_line
+{
+ my $line = scalar(<F>);
+ if (defined $line)
+ {
+ $last_offset = $offset;
+ $offset += length($line);
+ }
+ $line;
+}
+
+sub check_obj_id
+{
+ my $cur_obj = shift;
+ if ($cur_obj != $last_obj + 1)
+ {
+ die "$file:$.: expected object ", $last_obj + 1, "\n";
+ }
+ $last_obj = $cur_obj;
+ push(@xref, [1, $last_offset]);
+}
+
+sub adjust_ostream_xref
+{
+ pop(@xref);
+ push(@xref, [2, $ostream_id, $ostream_idx++]);
+}
+
+sub write_ostream
+{
+ my $first = $ostream_offsets[0];
+ my $onum = $ostream_id;
+ my $offsets = "";
+ my $n = scalar(@ostream_offsets);
+ for (@ostream_offsets)
+ {
+ $_ -= $first;
+ ++$onum;
+ $offsets .= "$onum $_\n";
+ }
+ $first += length($offsets);
+ $stream_length += length($offsets);
+ print " /Length $stream_length\n";
+ print " /N $n\n";
+ print " /First $first\n";
+ if ($ostream_extends)
+ {
+ print " /Extends $ostream_extends\n";
+ }
+ print ">>\n";
+ print "stream\n";
+ print $offsets;
+ foreach (@ostream)
+ {
+ print $_;
+ }
+
+ $ostream_idx = 0;
+ $ostream_id = 0;
+ @ostream = ();
+ @ostream_offsets = ();
+ $ostream_extends = "";
+}
diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc
new file mode 100644
index 00000000..853767ed
--- /dev/null
+++ b/qpdf/qpdf.cc
@@ -0,0 +1,942 @@
+
+#include <iostream>
+#include <string.h>
+#include <stdlib.h>
+
+#include <qpdf/QUtil.hh>
+#include <qpdf/QTC.hh>
+#include <qpdf/Pl_StdioFile.hh>
+
+#include <qpdf/QPDF.hh>
+#include <qpdf/QPDFExc.hh>
+
+#include <qpdf/QPDFWriter.hh>
+
+static char const* whoami = 0;
+
+// Note: let's not be too noisy about documenting the fact that this
+// software purposely fails to enforce the distinction between user
+// and owner passwords. A user password is sufficient to gain full
+// access to the PDF file, so there is nothing this software can do
+// with an owner password that it couldn't do with a user password
+// other than changing the /P value in the encryption dictionary.
+// (Setting this value requires the owner password.) The
+// documentation discusses this as well.
+
+static char const* help = "\
+\n\
+Usage: qpdf [ options ] infilename outfilename\n\
+\n\
+An option summary appears below. Please see the documentation for details.\n\
+\n\
+\n\
+Basic Options\n\
+-------------\n\
+\n\
+--password=password specify a password for accessing encrypted files\n\
+--linearize generated a linearized (web optimized) file\n\
+--encrypt options -- generate an encrypted file\n\
+--decrypt remove any encryption on the file\n\
+\n\
+If neither --encrypt or --decrypt are given, qpdf will preserve any\n\
+encryption data associated with a file.\n\
+\n\
+\n\
+Encryption Options\n\
+------------------\n\
+\n\
+ --encrypt user-password owner-password key-length flags --\n\
+\n\
+Note that -- terminates parsing of encryption flags.\n\
+\n\
+Either or both of the user password and the owner password may be\n\
+empty strings.\n\
+\n\
+key-length may be 40 or 128\n\
+\n\
+Additional flags are dependent upon key length.\n\
+\n\
+ If 40:\n\
+\n\
+ --print=[yn] allow printing\n\
+ --modify=[yn] allow document modification\n\
+ --extract=[yn] allow text/graphic extraction\n\
+ --annotate=[yn] allow comments and form fill-in and signing\n\
+\n\
+ If 128:\n\
+\n\
+ --accessibility=[yn] allow accessibility to visually impaired\n\
+ --extract=[yn] allow other text/graphic extraction\n\
+ --print=print-opt control printing access\n\
+ --modify=modify-opt control modify access\n\
+\n\
+ print-opt may be:\n\
+\n\
+ full allow full printing\n\
+ low allow only low-resolution printing\n\
+ none disallow printing\n\
+\n\
+ modify-opt may be:\n\
+\n\
+ all allow full document modification\n\
+ annotate allow comment authoring and form operations\n\
+ form allow form field fill-in and signing\n\
+ assembly allow document assembly only\n\
+ none allow no modifications\n\
+\n\
+The default for each permission option is to be fully permissive.\n\
+\n\
+\n\
+Advanced Transformation Options\n\
+-------------------------------\n\
+\n\
+These transformation options control fine points of how qpdf creates\n\
+the output file. Mostly these are of use only to people who are very\n\
+familiar with the PDF file format or who are PDF developers.\n\
+\n\
+--stream-data=option controls transformation of stream data (below)\n\
+--normalize-content=[yn] enables or disables normalization of content streams\n\
+--suppress-recovery prevents qpdf from attempting to recover damaged files\n\
+--object-streams=mode controls handing of object streams\n\
+--ignore-xref-streams tells qpdf to ignore any cross-reference streams\n\
+--qdf turns on \"QDF mode\" (below)\n\
+\n\
+Values for stream data options:\n\
+\n\
+ compress recompress stream data when possible (default)\n\
+ preserve leave all stream data as is\n\
+ uncompress uncompress stream data when possible\n\
+\n\
+Values for object strea mode:\n\
+\n\
+ preserve preserve original object streams (default)\n\
+ disable don't write any object streams\n\
+ generate use object streams wherever possible\n\
+\n\
+In qdf mode, by default, content normalization is turned on, and the\n\
+stream data mode is set to uncompress.\n\
+\n\
+\n\
+Testing, Inspection, and Debugging Options\n\
+------------------------------------------\n\
+\n\
+These options can be useful for digging into PDF files or for use in\n\
+automated test suites for software that uses the qpdf library.\n\
+\n\
+--static-id generate static /ID: FOR TESTING ONLY!\n\
+--show-encryption quickly show encryption parameters\n\
+--check-linearization check file integrity and linearization status\n\
+--show-linearization check and show all linearization data\n\
+--show-xref show the contents of the cross-reference table\n\
+--show-object=obj[,gen] show the contents of the given object\n\
+ --raw-stream-data show raw stream data instead of object contents\n\
+ --filtered-stream-data show filtered stream data instead of object contents\n\
+--show-pages shows the object/generation number for each page\n\
+ --with-images also shows the object IDs for images on each page\n\
+--check check file structure + encryption, linearization\n\
+\n\
+The --raw-stream-data and --filtered-stream-data options are ignored\n\
+unless --show-object is given. Either of these options will cause the\n\
+stream data to be written to standard output.\n\
+\n\
+If --filtered-stream-data is given and --normalize-content=y is also\n\
+given, qpdf will attempt to normalize the stream data as if it is a\n\
+page content stream. This attempt will be made even if it is not a\n\
+page content stream, in which case it will produce unusuable results.\n\
+\n\
+\n";
+
+void usage(std::string const& msg)
+{
+ std::cerr
+ << std::endl
+ << whoami << ": " << msg << std::endl
+ << std::endl
+ << "Usage: " << whoami << " [options] infile outfile" << std::endl
+ << "For detailed help, run " << whoami << " --help" << std::endl
+ << std::endl;
+ exit(2);
+}
+
+static void show_encryption(QPDF& pdf)
+{
+ // Extract /P from /Encrypt
+ QPDFObjectHandle trailer = pdf.getTrailer();
+ QPDFObjectHandle encrypt = trailer.getKey("/Encrypt");
+ if (encrypt.isNull())
+ {
+ std::cout << "File is not encrypted" << std::endl;
+ }
+ else
+ {
+ QPDFObjectHandle P = encrypt.getKey("/P");
+ std::cout << "P = " << P.getIntValue() << std::endl;
+ std::string user_password = pdf.getUserPassword();
+ QPDF::trim_user_password(user_password);
+ std::cout << "User password = " << user_password << std::endl;
+ }
+}
+
+static void
+parse_encrypt_options(
+ int argc, char* argv[], int& cur_arg,
+ std::string& user_password, std::string& owner_password, int& keylen,
+ bool& r2_print, bool& r2_modify, bool& r2_extract, bool& r2_annotate,
+ bool& r3_accessibility, bool& r3_extract,
+ QPDFWriter::r3_print_e& r3_print, QPDFWriter::r3_modify_e& r3_modify)
+{
+ if (cur_arg + 3 >= argc)
+ {
+ usage("insufficient arguments to --encrypt");
+ }
+ user_password = argv[cur_arg++];
+ owner_password = argv[cur_arg++];
+ std::string len_str = argv[cur_arg++];
+ if (len_str == "40")
+ {
+ keylen = 40;
+ }
+ else if (len_str == "128")
+ {
+ keylen = 128;
+ }
+ else
+ {
+ usage("encryption key length must be 40 or 128");
+ }
+ while (1)
+ {
+ char* arg = argv[cur_arg];
+ if (arg == 0)
+ {
+ usage("insufficient arguments to --encrypt");
+ }
+ else if (strcmp(arg, "--") == 0)
+ {
+ return;
+ }
+ if (arg[0] == '-')
+ {
+ ++arg;
+ if (arg[0] == '-')
+ {
+ ++arg;
+ }
+ }
+ else
+ {
+ usage(std::string("invalid encryption parameter ") + arg);
+ }
+ ++cur_arg;
+ char* parameter = strchr(arg, '=');
+ if (parameter)
+ {
+ *parameter++ = 0;
+ }
+ if (strcmp(arg, "print") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--print must be given as --print=option");
+ }
+ std::string val = parameter;
+ if (keylen == 40)
+ {
+ if (val == "y")
+ {
+ r2_print = true;
+ }
+ else if (val == "n")
+ {
+ r2_print = false;
+ }
+ else
+ {
+ usage("invalid 40-bit -print parameter");
+ }
+ }
+ else
+ {
+ if (val == "full")
+ {
+ r3_print = QPDFWriter::r3p_full;
+ }
+ else if (val == "low")
+ {
+ r3_print = QPDFWriter::r3p_low;
+ }
+ else if (val == "none")
+ {
+ r3_print = QPDFWriter::r3p_none;
+ }
+ else
+ {
+ usage("invalid 128-bit -print parameter");
+ }
+ }
+ }
+ else if (strcmp(arg, "modify") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--modify must be given as --modify=option");
+ }
+ std::string val = parameter;
+ if (keylen == 40)
+ {
+ if (val == "y")
+ {
+ r2_modify = true;
+ }
+ else if (val == "n")
+ {
+ r2_modify = false;
+ }
+ else
+ {
+ usage("invalid 40-bit -modify parameter");
+ }
+ }
+ else
+ {
+ if (val == "all")
+ {
+ r3_modify = QPDFWriter::r3m_all;
+ }
+ else if (val == "annotate")
+ {
+ r3_modify = QPDFWriter::r3m_annotate;
+ }
+ else if (val == "form")
+ {
+ r3_modify = QPDFWriter::r3m_form;
+ }
+ else if (val == "assembly")
+ {
+ r3_modify = QPDFWriter::r3m_assembly;
+ }
+ else if (val == "none")
+ {
+ r3_modify = QPDFWriter::r3m_none;
+ }
+ else
+ {
+ usage("invalid 128-bit -modify parameter");
+ }
+ }
+ }
+ else if (strcmp(arg, "extract") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--extract must be given as --extract=option");
+ }
+ std::string val = parameter;
+ bool result = false;
+ if (val == "y")
+ {
+ result = true;
+ }
+ else if (val == "n")
+ {
+ result = false;
+ }
+ else
+ {
+ usage("invalid -extract parameter");
+ }
+ if (keylen == 40)
+ {
+ r2_extract = result;
+ }
+ else
+ {
+ r3_extract = result;
+ }
+ }
+ else if (strcmp(arg, "annotate") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--annotate must be given as --annotate=option");
+ }
+ std::string val = parameter;
+ bool result = false;
+ if (val == "y")
+ {
+ result = true;
+ }
+ else if (val == "n")
+ {
+ result = false;
+ }
+ else
+ {
+ usage("invalid -annotate parameter");
+ }
+ if (keylen == 40)
+ {
+ r2_annotate = result;
+ }
+ else
+ {
+ usage("-annotate invalid for 128-bit keys");
+ }
+ }
+ else if (strcmp(arg, "accessibility") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--accessibility must be given as"
+ " --accessibility=option");
+ }
+ std::string val = parameter;
+ bool result = false;
+ if (val == "y")
+ {
+ result = true;
+ }
+ else if (val == "n")
+ {
+ result = false;
+ }
+ else
+ {
+ usage("invalid -accessibility parameter");
+ }
+ if (keylen == 128)
+ {
+ r3_accessibility = result;
+ }
+ else
+ {
+ usage("-accessibility invalid for 40-bit keys");
+ }
+ }
+ else
+ {
+ usage(std::string("invalid encryption parameter --") + arg);
+ }
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ if ((whoami = strrchr(argv[0], '/')) == NULL)
+ {
+ whoami = argv[0];
+ }
+ else
+ {
+ ++whoami;
+ }
+ // For libtool's sake....
+ if (strncmp(whoami, "lt-", 3) == 0)
+ {
+ whoami += 3;
+ }
+
+ if ((argc == 2) && (strcmp(argv[1], "--version") == 0))
+ {
+ // make_dist looks for the line of code here that actually
+ // prints the version number, so read make_dist if you change
+ // anything other than the version number. Don't worry about
+ // the numbers. That's just a guide to 80 columns so that the
+ // help message looks right on an 80-column display.
+
+ // 1 2 3 4 5 6 7 8
+ // 12345678901234567890123456789012345678901234567890123456789012345678901234567890
+ std::cout
+ << whoami << " version 2.0" << std::endl
+ << "Copyright (c) 2005-2008 Jay Berkenbilt"
+ << std::endl
+ << "This software may be distributed under the terms of version 2 of the"
+ << std::endl
+ << "Artistic License which may be found in the source distribution. It is"
+ << std::endl
+ << "provided \"as is\" without express or implied warranty."
+ << std::endl;
+ exit(0);
+ }
+
+ if ((argc == 2) && (strcmp(argv[1], "--help") == 0))
+ {
+ std::cout << help;
+ exit(0);
+ }
+
+ char const* password = "";
+ bool linearize = false;
+ bool decrypt = false;
+
+ bool encrypt = false;
+ std::string user_password;
+ std::string owner_password;
+ int keylen = 0;
+ bool r2_print = true;
+ bool r2_modify = true;
+ bool r2_extract = true;
+ bool r2_annotate = true;
+ bool r3_accessibility = true;
+ bool r3_extract = true;;
+ QPDFWriter::r3_print_e r3_print = QPDFWriter::r3p_full;
+ QPDFWriter::r3_modify_e r3_modify = QPDFWriter::r3m_all;
+
+ bool stream_data_set = false;
+ QPDFWriter::stream_data_e stream_data_mode = QPDFWriter::s_compress;
+ bool normalize_set = false;
+ bool normalize = false;
+ bool suppress_recovery = false;
+ bool object_stream_set = false;
+ QPDFWriter::object_stream_e object_stream_mode = QPDFWriter::o_preserve;
+ bool ignore_xref_streams = false;
+ bool qdf_mode = false;
+
+ bool static_id = false;
+ bool show_encryption = false;
+ bool check_linearization = false;
+ bool show_linearization = false;
+ bool show_xref = false;
+ int show_obj = 0;
+ int show_gen = 0;
+ bool show_raw_stream_data = false;
+ bool show_filtered_stream_data = false;
+ bool show_pages = false;
+ bool show_page_images = false;
+ bool check = false;
+
+ bool require_outfile = true;
+ char const* infilename = 0;
+ char const* outfilename = 0;
+
+ for (int i = 1; i < argc; ++i)
+ {
+ char const* arg = argv[i];
+ if ((arg[0] == '-') && (strcmp(arg, "-") != 0))
+ {
+ ++arg;
+ if (arg[0] == '-')
+ {
+ // Be lax about -arg vs --arg
+ ++arg;
+ }
+ char* parameter = strchr(arg, '=');
+ if (parameter)
+ {
+ *parameter++ = 0;
+ }
+
+ if (strcmp(arg, "password") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--password must be given as --password=pass");
+ }
+ password = parameter;
+ }
+ else if (strcmp(arg, "linearize") == 0)
+ {
+ linearize = true;
+ }
+ else if (strcmp(arg, "encrypt") == 0)
+ {
+ parse_encrypt_options(
+ argc, argv, ++i,
+ user_password, owner_password, keylen,
+ r2_print, r2_modify, r2_extract, r2_annotate,
+ r3_accessibility, r3_extract, r3_print, r3_modify);
+ encrypt = true;
+ }
+ else if (strcmp(arg, "decrypt") == 0)
+ {
+ decrypt = true;
+ }
+ else if (strcmp(arg, "stream-data") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--stream-data must be given as"
+ "--stream-data=option");
+ }
+ stream_data_set = true;
+ if (strcmp(parameter, "compress") == 0)
+ {
+ stream_data_mode = QPDFWriter::s_compress;
+ }
+ else if (strcmp(parameter, "preserve") == 0)
+ {
+ stream_data_mode = QPDFWriter::s_preserve;
+ }
+ else if (strcmp(parameter, "uncompress") == 0)
+ {
+ stream_data_mode = QPDFWriter::s_uncompress;
+ }
+ else
+ {
+ usage("invalid stream-data option");
+ }
+ }
+ else if (strcmp(arg, "normalize-content") == 0)
+ {
+ if ((parameter == 0) || (*parameter == '\0'))
+ {
+ usage("--normalize-content must be given as"
+ " --normalize-content=[yn]");
+ }
+ normalize_set = true;
+ normalize = (parameter[0] == 'y');
+ }
+ else if (strcmp(arg, "suppress-recovery") == 0)
+ {
+ suppress_recovery = true;
+ }
+ else if (strcmp(arg, "object-streams") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--object-streams must be given as"
+ " --object-streams=option");
+ }
+ object_stream_set = true;
+ if (strcmp(parameter, "disable") == 0)
+ {
+ object_stream_mode = QPDFWriter::o_disable;
+ }
+ else if (strcmp(parameter, "preserve") == 0)
+ {
+ object_stream_mode = QPDFWriter::o_preserve;
+ }
+ else if (strcmp(parameter, "generate") == 0)
+ {
+ object_stream_mode = QPDFWriter::o_generate;
+ }
+ else
+ {
+ usage("invalid object stream mode");
+ }
+ }
+ else if (strcmp(arg, "ignore-xref-streams") == 0)
+ {
+ ignore_xref_streams = true;
+ }
+ else if (strcmp(arg, "qdf") == 0)
+ {
+ qdf_mode = true;
+ }
+ else if (strcmp(arg, "static-id") == 0)
+ {
+ static_id = true;
+ }
+ else if (strcmp(arg, "show-encryption") == 0)
+ {
+ show_encryption = true;
+ require_outfile = false;
+ }
+ else if (strcmp(arg, "check-linearization") == 0)
+ {
+ check_linearization = true;
+ require_outfile = false;
+ }
+ else if (strcmp(arg, "show-linearization") == 0)
+ {
+ show_linearization = true;
+ require_outfile = false;
+ }
+ else if (strcmp(arg, "show-xref") == 0)
+ {
+ show_xref = true;
+ require_outfile = false;
+ }
+ else if (strcmp(arg, "show-object") == 0)
+ {
+ if (parameter == 0)
+ {
+ usage("--show-object must be given as"
+ " --show-object=obj[,gen]");
+ }
+ char* obj = parameter;
+ char* gen = obj;
+ if ((gen = strchr(obj, ',')) != 0)
+ {
+ *gen++ = 0;
+ show_gen = atoi(gen);
+ }
+ show_obj = atoi(obj);
+ require_outfile = false;
+ }
+ else if (strcmp(arg, "raw-stream-data") == 0)
+ {
+ show_raw_stream_data = true;
+ }
+ else if (strcmp(arg, "filtered-stream-data") == 0)
+ {
+ show_filtered_stream_data = true;
+ }
+ else if (strcmp(arg, "show-pages") == 0)
+ {
+ show_pages = true;
+ require_outfile = false;
+ }
+ else if (strcmp(arg, "with-images") == 0)
+ {
+ show_page_images = true;
+ }
+ else if (strcmp(arg, "check") == 0)
+ {
+ check = true;
+ require_outfile = false;
+ }
+ else
+ {
+ usage(std::string("unknown option --") + arg);
+ }
+ }
+ else if (infilename == 0)
+ {
+ infilename = arg;
+ }
+ else if (outfilename == 0)
+ {
+ outfilename = arg;
+ }
+ else
+ {
+ usage(std::string("unknown argument ") + arg);
+ }
+ }
+
+ if (infilename == 0)
+ {
+ usage("an input file name is required");
+ }
+ else if (require_outfile && (outfilename == 0))
+ {
+ usage("an output file name is required; use - for standard output");
+ }
+ else if ((! require_outfile) && (outfilename != 0))
+ {
+ usage("no output file may be given for this option");
+ }
+
+ try
+ {
+ QPDF pdf;
+ if (ignore_xref_streams)
+ {
+ pdf.setIgnoreXRefStreams(true);
+ }
+ if (suppress_recovery)
+ {
+ pdf.setAttemptRecovery(false);
+ }
+ pdf.processFile(infilename, password);
+ if (outfilename == 0)
+ {
+ if (show_encryption)
+ {
+ ::show_encryption(pdf);
+ }
+ if (check_linearization)
+ {
+ if (pdf.checkLinearization())
+ {
+ std::cout << infilename << ": no linearization errors"
+ << std::endl;
+ }
+ else
+ {
+ exit(2);
+ }
+ }
+ if (show_linearization)
+ {
+ pdf.showLinearizationData();
+ }
+ if (show_xref)
+ {
+ pdf.showXRefTable();
+ }
+ if (show_obj > 0)
+ {
+ QPDFObjectHandle obj = pdf.getObjectByID(show_obj, show_gen);
+ if (obj.isStream())
+ {
+ if (show_raw_stream_data || show_filtered_stream_data)
+ {
+ bool filter = show_filtered_stream_data;
+ if (filter &&
+ (! obj.pipeStreamData(0, true, false, false)))
+ {
+ QTC::TC("qpdf", "unable to filter");
+ std::cerr << "Unable to filter stream data."
+ << std::endl;
+ exit(2);
+ }
+ else
+ {
+ Pl_StdioFile out("stdout", stdout);
+ obj.pipeStreamData(&out, filter, normalize, false);
+ }
+ }
+ else
+ {
+ std::cout
+ << "Object is stream. Dictionary:" << std::endl
+ << obj.getDict().unparseResolved() << std::endl;
+ }
+ }
+ else
+ {
+ std::cout << obj.unparseResolved() << std::endl;
+ }
+ }
+ if (show_pages)
+ {
+ std::vector<QPDFObjectHandle> pages = pdf.getAllPages();
+ int pageno = 0;
+ for (std::vector<QPDFObjectHandle>::iterator iter =
+ pages.begin();
+ iter != pages.end(); ++iter)
+ {
+ QPDFObjectHandle& page = *iter;
+ ++pageno;
+
+ std::cout << "page " << pageno << ": "
+ << page.getObjectID() << " "
+ << page.getGeneration() << " R" << std::endl;
+ if (show_page_images)
+ {
+ std::map<std::string, QPDFObjectHandle> images =
+ page.getPageImages();
+ if (! images.empty())
+ {
+ std::cout << " images:" << std::endl;
+ for (std::map<std::string,
+ QPDFObjectHandle>::iterator
+ iter = images.begin();
+ iter != images.end(); ++iter)
+ {
+ std::string const& name = (*iter).first;
+ QPDFObjectHandle image = (*iter).second;
+ QPDFObjectHandle dict = image.getDict();
+ int width =
+ dict.getKey("/Width").getIntValue();
+ int height =
+ dict.getKey("/Height").getIntValue();
+ std::cout << " " << name << ": "
+ << image.unparse()
+ << ", " << width << " x " << height
+ << std::endl;
+ }
+ }
+ }
+
+ std::cout << " content:" << std::endl;
+ std::vector<QPDFObjectHandle> content =
+ page.getPageContents();
+ for (std::vector<QPDFObjectHandle>::iterator iter =
+ content.begin();
+ iter != content.end(); ++iter)
+ {
+ std::cout << " " << (*iter).unparse() << std::endl;
+ }
+ }
+ }
+ if (check)
+ {
+ bool okay = false;
+ std::cout << "checking " << infilename << std::endl;
+ try
+ {
+ ::show_encryption(pdf);
+ if (pdf.isLinearized())
+ {
+ std::cout << "File is linearized\n";
+ okay = pdf.checkLinearization();
+ // any errors are reported by checkLinearization().
+ }
+ else
+ {
+ std::cout << "File is not linearized\n";
+ // calling flattenScalarReferences causes full
+ // traversal of file, so any structural errors
+ // would be exposed.
+ pdf.flattenScalarReferences();
+ okay = true;
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cout << e.what() << std::endl;
+ }
+ if (okay)
+ {
+ std::cout << "No errors found" << std::endl;
+ }
+ }
+ }
+ else
+ {
+ if (strcmp(outfilename, "-") == 0)
+ {
+ outfilename = 0;
+ }
+ QPDFWriter w(pdf, outfilename);
+ if (qdf_mode)
+ {
+ w.setQDFMode(true);
+ }
+ if (normalize_set)
+ {
+ w.setContentNormalization(normalize);
+ }
+ if (stream_data_set)
+ {
+ w.setStreamDataMode(stream_data_mode);
+ }
+ if (decrypt)
+ {
+ w.setPreserveEncryption(false);
+ }
+ if (static_id)
+ {
+ w.setStaticID(true);
+ }
+ if (encrypt)
+ {
+ if (keylen == 40)
+ {
+ w.setR2EncryptionParameters(
+ user_password.c_str(), owner_password.c_str(),
+ r2_print, r2_modify, r2_extract, r2_annotate);
+ }
+ else if (keylen == 128)
+ {
+ w.setR3EncryptionParameters(
+ user_password.c_str(), owner_password.c_str(),
+ r3_accessibility, r3_extract, r3_print, r3_modify);
+ }
+ else
+ {
+ throw QEXC::Internal("bad encryption keylen");
+ }
+ }
+ if (linearize)
+ {
+ w.setLinearization(true);
+ }
+ if (object_stream_set)
+ {
+ w.setObjectStreamMode(object_stream_mode);
+ }
+ w.write();
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ exit(2);
+ }
+
+ return 0;
+}
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov
new file mode 100644
index 00000000..e6323600
--- /dev/null
+++ b/qpdf/qpdf.testcov
@@ -0,0 +1,117 @@
+ignored-scope: libtests
+QPDF lindict null found 0
+QPDF lindict searching after null 0
+QPDF err expected endobj 0
+QPDF err wrong objid/generation 0
+QPDF check objid 1
+QPDF check generation 1
+QPDF check obj 1
+QPDF hint table length indirect 0
+QPDF hint table length direct 0
+QPDF P absent in lindict 0
+QPDF P present in lindict 0
+QPDF expected n n obj 0
+QPDF lindict found newline 0
+QPDF /L mismatch 0
+QPDF err /T mismatch 0
+QPDF err /O mismatch 0
+QPDF opt direct pages resource 1
+QPDF opt inheritable keys 0
+QPDF opt no inheritable keys 0
+QPDF opt erase empty key ancestor 0
+QPDF opt resource inherited 0
+QPDF opt page resource hides ancestor 0
+QPDF opt key ancestors depth > 1 0
+QPDF opt loop detected 0
+QPDF categorize pagemode present 1
+QPDF categorize pagemode outlines 1
+QPDF warn /E mismatch 0
+QPDF lin outlines in part 1
+QPDF lin nshared_total > nshared_first_page 1
+QPDF lin part 8 empty 1
+QPDF lin check shared past first page 0
+QPDF opt flatten array scalar 0
+QPDF opt flatten dict scalar 0
+main QTest implicit 0
+main QTest indirect 1
+main QTest null 0
+main QTest bool 1
+main QTest int 0
+main QTest real 0
+main QTest name 0
+main QTest string 0
+main QTest array 0
+main QTest array indirect 1
+main QTest dictionary 0
+main QTest dictionary indirect 1
+main QTest stream 0
+QPDFWriter write to stdout 0
+QPDFWriter write to file 0
+QPDF lin write nshared_total > nshared_first_page 1
+QPDFWriter encrypted hint stream 0
+QPDF opt inherited scalar 0
+QPDF xref reused object 0
+QPDF xref gen > 0 1
+QPDF xref size mismatch 0
+QPDF not a pdf file 0
+QPDF can't find startxref 0
+QPDF invalid xref 0
+QPDF invalid xref entry 0
+QPDF missing trailer 0
+QPDF trailer lacks size 0
+QPDF trailer size not integer 0
+QPDF trailer prev not integer 0
+QPDF bad brace 0
+QPDF bad array close 0
+QPDF dictionary odd number of elements 0
+QPDF stream without length 0
+QPDF stream length not integer 0
+QPDF missing endstream 0
+QPDF bad dictionary close 0
+QPDF can't find xref 0
+QPDF_Tokenizer bad ) 0
+QPDF_Tokenizer bad > 0
+QPDF_Tokenizer bad ( 0
+QPDF_Tokenizer null in name 0
+QPDF_Tokenizer bad name 0
+QPDF_Stream invalid filter 0
+QPDF UseOutlines but no Outlines 0
+QPDFObjectHandle clone bool 0
+QPDFObjectHandle clone null 0
+QPDFObjectHandle clone integer 0
+QPDFObjectHandle clone real 0
+QPDFObjectHandle clone name 0
+QPDFObjectHandle clone string 0
+QPDFObjectHandle clone array 0
+QPDFObjectHandle clone dictionary 0
+QPDFObjectHandle makeDirect loop 0
+QPDFObjectHandle ERR clone stream 0
+QPDFTokenizer allow pound anywhere in name 0
+QPDF indirect last obj from xref 1
+QPDF default for xref stream field 0 0
+QPDF prev key in xref stream dictionary 0
+QPDF prev key in trailer dictionary 0
+QPDF found xref stream 0
+QPDF ignoring XRefStm in trailer 0
+QPDF xref deleted object 0
+QPDF_Stream PNG filter 0
+QPDF xref /Index is null 0
+QPDF xref /Index is array 1
+QPDFWriter copy Extends 0
+QPDFWriter encrypt object stream 0
+QPDFWriter uncompressing page dictionary 0
+QPDFWriter uncompressing root 0
+QPDFWriter compressing uncompressed stream 0
+QPDF exclude indirect length 0
+QPDFWriter generate >1 ostream 0
+QPDF exclude encryption dictionary 0
+QPDF loop detected traversing objects 0
+QPDF reconstructed xref table 0
+QPDF recovered in readObjectAtOffset 0
+QPDF recovered stream length 0
+QPDF found wrong endstream in recovery 0
+QPDFObjectHandle indirect to unknown 0
+QPDF_Stream pipeStreamData with null pipeline 0
+QPDFWriter not recompressing /FlateDecode 0
+QPDF piping xref stream from encrypted file 0
+unable to filter 0
diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test
new file mode 100644
index 00000000..d3aeded6
--- /dev/null
+++ b/qpdf/qtest/qpdf.test
@@ -0,0 +1,942 @@
+#!/usr/bin/env perl
+require 5.008;
+BEGIN { $^W = 1; }
+use strict;
+use File::Copy;
+use File::Basename;
+use Cwd;
+use Digest::MD5;
+
+chdir("qpdf") or die "chdir testdir failed: $!\n";
+
+require TestDriver;
+
+cleanup();
+
+my $td = new TestDriver('qpdf');
+
+my $compare_images = 1;
+if ((exists $ENV{'SKIP_TEST_COMPARE_IMAGES'}) &&
+ ($ENV{'SKIP_TEST_COMPARE_IMAGES'} eq '1'))
+{
+ $compare_images = 0;
+}
+
+my $have_acroread = 0;
+
+if ($compare_images)
+{
+ # check for acroread
+ my @path = split(':', $ENV{'PATH'});
+ foreach my $p (@path)
+ {
+ if (-x "$p/acroread")
+ {
+ $have_acroread = 1;
+ last;
+ }
+ }
+}
+
+# These variables are used to store the total number of tests in the
+# test suite. NOTE: qtest's requirement to indicate the number of
+# tests serves as a check that the test suite is operating properly.
+# Do not calculate these values as a side effect of running the tests.
+# That defeats the purpose. However, since this test suite consists
+# of several separate series of tests, many of which iterate over
+# static lists of things, we calculate the numbers as we go in terms
+# of static values.
+
+# This should be set to the number of times we called compare_pdfs.
+# This has to be kept separate because the number of test cases
+# compare_pdfs generates depends on the value of $compare_images.
+my $n_compare_pdfs = 0;
+
+# This should be set to the number of times we call acroread.
+my $n_acroread = 0;
+
+# Each section of tests should increment this number by the number of
+# tests they generate excluding calls to acroread or compare_pdfs,
+# which are tracked separately by $n_compare_pdfs and $n_acroread.
+my $n_tests = 0;
+
+# Call show_ntests after each block of test cases. In show_ntests,
+# you can turn on printing of the expected number of test cases. This
+# is useful for tracking down problems in the number of test cases.
+
+show_ntests();
+# ----------
+
+$n_compare_pdfs += 5;
+
+# Check compare_pdfs to make sure that it works properly. Each call
+# to compare_pdfs is worth three test cases.
+compare_pdfs("p1-a-p2-b.pdf", "p1-a-p2-b.pdf");
+compare_pdfs("p1-a.pdf", "p1-a.pdf");
+compare_pdfs("p1-a.pdf", "p1-b.pdf", 1);
+compare_pdfs("p1-a.pdf", "p1-a-p2-b.pdf", 1);
+compare_pdfs("p1-a-p2-a.pdf", "p1-a-p2-b.pdf", 1);
+flush_tiff_cache();
+
+show_ntests();
+# ----------
+$td->notify("--- Miscellaneous Tests ---");
+$n_tests += 3;
+
+foreach (my $i = 1; $i <= 3; ++$i)
+{
+ $td->runtest("misc tests",
+ {$td->COMMAND => "test_driver 5 misc-$i.pdf"},
+ {$td->FILE => "misc-$i.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+}
+
+show_ntests();
+# ----------
+$td->notify("--- Error Condition Tests ---");
+# $n_tests incremented after initialization of badfiles below.
+
+my @badfiles = ("not a PDF file", # 1
+ "no startxref", # 2
+ "bad primary xref offset", # 3
+ "invalid xref syntax", # 4
+ "invalid xref entry", # 5
+ "free table inconsistency", # 6
+ "no trailer dictionary", # 7
+ "bad secondary xref", # 8
+ "no /Size in trailer", # 9
+ "/Size not integer", # 10
+ "/Prev not integer", # 11
+ "/Size inconsistency", # 12
+ "bad {", # 13
+ "bad }", # 14
+ "bad ]", # 15
+ "bad >>", # 16
+ "odd number of dictionary items", # 17
+ "bad )", # 18
+ "bad >", # 19
+ "invalid hexstring character", # 20
+ "invalid name token", # 21
+ "no /Length for stream dictionary", # 22
+ "/Length not integer", # 23
+ "expected endstream", # 24
+ "bad obj declaration (objid)", # 25
+ "bad obj declaration (generation)", # 26
+ "bad obj declaration (obj)", # 27
+ "expected endobj", # 28
+ "null in name", # 29
+ "invalid stream /Filter", # 30
+ "unknown stream /Filter", # 31
+ "obj/gen mismatch", # 32
+ );
+
+$n_tests += @badfiles;
+
+# Test 6 contains errors in the free table consistency, but we no
+# longer have any consistency check for this since it is not important
+# neither Acrobat nor other PDF viewers really care. Tests 12 and 28
+# have error conditions that used to be fatal but are now considered
+# non-fatal.
+my %badtest_overrides = (6 => 0, 12 => 0, 28 => 0, 31 => 0);
+for (my $i = 1; $i <= scalar(@badfiles); ++$i)
+{
+ my $status = $badtest_overrides{$i};
+ $status = 2 unless defined $status;
+ $td->runtest($badfiles[$i-1],
+ {$td->COMMAND => "test_driver 0 bad$i.pdf"},
+ {$td->FILE => "bad$i.out",
+ $td->EXIT_STATUS => $status},
+ $td->NORMALIZE_NEWLINES);
+}
+
+show_ntests();
+# ----------
+$td->notify("--- Recovery Tests ---");
+$n_tests += @badfiles + 2;
+
+# Recovery tests. These are mostly after-the-fact -- when recovery
+# was implemented, some degree of recovery was possible on many of the
+# files. Mostly the recovery does not actually repair the error,
+# though in some cases it may. Acrobat Reader would not be able to
+# recover any of these files any better.
+my %recover_failures = ();
+for (1, 7, 13..21, 24..27, 29..30)
+{
+ $recover_failures{$_} = 1;
+}
+for (my $i = 1; $i <= scalar(@badfiles); ++$i)
+{
+ my $status = 0;
+ if (exists $recover_failures{$i})
+ {
+ $status = 2;
+ }
+ $td->runtest("recover " . $badfiles[$i-1],
+ {$td->COMMAND => "test_driver 1 bad$i.pdf"},
+ {$td->FILE => "bad$i-recover.out",
+ $td->EXIT_STATUS => $status},
+ $td->NORMALIZE_NEWLINES);
+}
+
+# This heifer file was a real file that contained errors that Acrobat
+# Reader can recover. We can recover it too.
+$td->runtest("recover heifer file",
+ {$td->COMMAND => "qpdf --static-id -qdf heifer.pdf a.pdf"},
+ {$td->FILE => "heifer.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "heifer.qdf"});
+
+show_ntests();
+# ----------
+$td->notify("--- Basic Parsing Tests ---");
+# $n_tests incremented below after initialization of @goodfiles.
+
+my @goodfiles = ("implicit null", # 1
+ "direct null", # 2
+ "unresolved null", # 3
+ "indirect null", # 4
+ "indirect bool", # 5
+ "direct bool", # 6
+ "integer", # 7
+ "real, ASCIIHexDecode", # 8
+ "string", # 9
+ "array", # 10
+ "dictionary", # 11
+ "stream", # 12
+ "nesting, strings, names", # 13
+ "tokenizing pipeline", # 14
+ "name", # 15
+ "object-stream", # 16
+ "hybrid xref", # 17
+ "hybrid xref old mode", # 18
+ "xref with prev", # 19
+ "lots of compressible objects", # 20
+ );
+
+$n_tests += (9 * @goodfiles) + 6;
+
+my %goodtest_overrides = ('14' => 3);
+my %goodtest_flags =
+ ('18' => '-ignore-xref-streams',
+ '20' => '-object-streams=generate',
+ );
+for (my $i = 1; $i <= scalar(@goodfiles); ++$i)
+{
+ my $n = $goodtest_overrides{$i} || 1;
+ foreach my $lang (qw(C en_US en_US.UTF-8))
+ {
+ $td->runtest("$goodfiles[$i-1], ($lang)",
+ {$td->COMMAND => "test_driver $n good$i.pdf"},
+ {$td->FILE => "good$i.out",
+ $td->EXIT_STATUS => 0});
+ my $xflags = $goodtest_flags{$i} || '';
+ check_pdf("create qdf",
+ "qpdf --static-id -qdf $xflags good$i.pdf",
+ "good$i.qdf", 0);
+ }
+}
+
+check_pdf("no normalization",
+ "qpdf -qdf --static-id --normalize-content=n good7.pdf",
+ "good7-not-normalized.qdf",
+ 0);
+
+check_pdf("no qdf",
+ "qpdf --static-id good17.pdf",
+ "good17-not-qdf.pdf",
+ 0);
+
+check_pdf("no recompression",
+ "qpdf --static-id --stream-data=preserve good17.pdf",
+ "good17-not-recompressed.pdf",
+ 0);
+
+show_ntests();
+# ----------
+$td->notify("--- Object Stream Tests ---");
+$n_tests += 36 * 4;
+$n_compare_pdfs += 36;
+
+for (my $n = 16; $n <= 19; ++$n)
+{
+ my $in = "good$n.pdf";
+ foreach my $flags ('-object-streams=disable',
+ '-object-streams=preserve',
+ '-object-streams=generate')
+ {
+ foreach my $qdf ('-qdf', '', '-encrypt "" x 128 --')
+ {
+ # 4 tests + 1 compare_pdfs
+ $td->runtest("object stream mode",
+ {$td->COMMAND =>
+ "qpdf --static-id $flags $qdf $in a.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ compare_pdfs("good$n.pdf", "a.pdf");
+ $td->runtest("convert to qdf",
+ {$td->COMMAND =>
+ "qpdf --static-id -qdf -decrypt" .
+ " -object-streams=disable $in a.qdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("convert output to qdf",
+ {$td->COMMAND =>
+ "qpdf --static-id -qdf" .
+ " -object-streams=disable a.pdf b.qdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("compare files",
+ {$td->FILE => "a.qdf"},
+ {$td->FILE => "b.qdf"});
+ }
+ }
+ flush_tiff_cache();
+}
+
+show_ntests();
+# ----------
+$td->notify("--- Specific File Tests ---");
+$n_tests += 1;
+
+# Special PDF files that caused problems at some point
+
+# This file is a PDF 1.1 file with /# as a name and with
+# inconsistencies in its free table.
+$td->runtest("old and complex",
+ {$td->COMMAND => "qpdf --check old-and-complex.pdf"},
+ {$td->STRING => +("checking old-and-complex.pdf\n" .
+ "File is not encrypted\n" .
+ "File is not linearized\n" .
+ "No errors found\n"),
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+show_ntests();
+# ----------
+$td->notify("--- Mutability Tests ---");
+$n_tests += 4;
+
+$td->runtest("no normalization",
+ {$td->COMMAND => "test_driver 4 test4-1.pdf"},
+ {$td->FILE => "test4-1.qdf",
+ $td->EXIT_STATUS => 0});
+
+$td->runtest("object ordering",
+ {$td->COMMAND => "test_driver 4 test4-4.pdf"},
+ {$td->FILE => "test4-4.qdf",
+ $td->EXIT_STATUS => 0});
+
+$td->runtest("loop detected",
+ {$td->COMMAND => "test_driver 4 test4-2.pdf"},
+ {$td->FILE => "test4-2.out",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("stream detected",
+ {$td->COMMAND => "test_driver 4 test4-3.pdf"},
+ {$td->FILE => "test4-3.out",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+
+show_ntests();
+# ----------
+$td->notify("--- Extraction Tests ---");
+$n_tests += 11;
+
+$td->runtest("show xref",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-xref"},
+ {$td->FILE => "show-xref.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("show pages",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-pages"},
+ {$td->FILE => "show-pages.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("show-pages-images",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-pages --with-images"},
+ {$td->FILE => "show-pages-images.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("show-page-1",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=5,0"},
+ {$td->FILE => "show-page-1.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("show-page-1-content-raw",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=7 --raw-stream-data"},
+ {$td->FILE => "show-page-1-content-raw.out",
+ $td->EXIT_STATUS => 0});
+
+$td->runtest("show-page-1-content-filtered",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=7 --filtered-stream-data"},
+ {$td->FILE => "show-page-1-content-filtered.out",
+ $td->EXIT_STATUS => 0});
+
+$td->runtest("show-page-1-content-normalized",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=7,0 --filtered-stream-data --normalize-content=y"},
+ {$td->FILE => "show-page-1-content-normalized.out",
+ $td->EXIT_STATUS => 0});
+
+$td->runtest("show-page-1-image",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=8 --raw-stream-data"},
+ {$td->FILE => "show-page-1-image.out",
+ $td->EXIT_STATUS => 0});
+
+$td->runtest("unfilterable stream data",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=8 --filtered-stream-data"},
+ {$td->FILE => "show-unfilterable.out",
+ $td->EXIT_STATUS => 2});
+
+$td->runtest("show-xref-by-id",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=12"},
+ {$td->FILE => "show-xref-by-id.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("show-xref-by-id-filtered",
+ {$td->COMMAND => "qpdf encrypted-with-images.pdf" .
+ " --show-object=12 --filtered-stream-data"},
+ {$td->FILE => "show-xref-by-id-filtered.out",
+ $td->EXIT_STATUS => 0});
+
+show_ntests();
+# ----------
+$td->notify("--- Linearization Tests ---");
+# $n_tests incremented after initialization of @linearized_files and
+# @to_linearize.
+
+# *'ed files were linearized with Pdlin.
+my @linearized_files =
+ ('lin0', # not linearized
+ 'lin1', # * outlines, page labels, pdlin
+ 'lin2', # * lin1 with null and newline
+ 'lin3', # same file saved with acrobat
+ 'lin4', # * lin1 with no /PageMode
+ 'lin5', # lin3 with embedded thumbnails
+ 'lin6', # * lin5 with pdlin
+ 'lin7', # lin5 with /PageMode /UseThumbs
+ 'lin8', # * lin7 with pdlin
+ 'lin9', # * shared objects, indirect null
+ 'badlin1', # parameter dictionary errors
+ );
+
+my @to_linearize =
+ ('lin-special', # lots of weird cases -- see file comments
+ 'delete-and-reuse', # deleted, reused objects
+ 'lin-delete-and-reuse', # linearized, then delete and reuse
+ 'object-stream', # contains object streams
+ 'hybrid-xref', # contains both xref tables and streams
+ @linearized_files, # we should be able to relinearize
+ );
+
+$n_tests += @linearized_files + 6;
+$n_tests += (3 * @to_linearize * 5) + 6;
+
+foreach my $base (@linearized_files)
+{
+ $td->runtest("dump linearization: $base",
+ {$td->COMMAND => "qpdf --show-linearization $base.pdf"},
+ {$td->FILE => "$base.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+}
+
+# Check normal modified and linearized modified files, making sure
+# that their qdf files are identical. The next two tests have the
+# same expected output files and different input files.
+check_pdf("modified",
+ "qpdf --static-id --qdf delete-and-reuse.pdf",
+ "delete-and-reuse.qdf",
+ 0);
+check_pdf("linearized and modified",
+ "qpdf --static-id --qdf lin-delete-and-reuse.pdf",
+ "delete-and-reuse.qdf", # not lin-delete-and-reuse.qdf
+ 0);
+
+$td->runtest("check linearized and modified",
+ {$td->COMMAND => "qpdf --check lin-delete-and-reuse.pdf"},
+ {$td->STRING => +("checking lin-delete-and-reuse.pdf\n" .
+ "File is not encrypted\n" .
+ "File is not linearized\n" .
+ "No errors found\n"),
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check multiple modifications",
+ {$td->COMMAND => "qpdf --check multiple-mods.pdf"},
+ {$td->STRING => +("checking multiple-mods.pdf\n" .
+ "File is not encrypted\n" .
+ "File is not linearized\n" .
+ "No errors found\n"),
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+foreach my $base (@to_linearize)
+{
+ foreach my $omode (qw(disable preserve generate))
+ {
+ my $oarg = "-object-streams=$omode";
+ $td->runtest("linearize $base ($omode)",
+ {$td->COMMAND =>
+ "qpdf -linearize $oarg --static-id $base.pdf a.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("check linearization",
+ {$td->COMMAND => "qpdf --check-linearization a.pdf"},
+ {$td->STRING => "a.pdf: no linearization errors\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+ # Relinearizing twice should produce identical results. We
+ # have to do it twice because, if objects changed ordering
+ # during the original linearization, the hint tables won't
+ # exactly match. This is because object identifiers are
+ # inserted into the hint table in their original order since
+ # we don't yet have renumbering information when we compute
+ # the table values.
+ $td->runtest("relinearize $base 1",
+ {$td->COMMAND =>
+ "qpdf -linearize --static-id a.pdf b.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("relinearize $base 2",
+ {$td->COMMAND =>
+ "qpdf -linearize --static-id b.pdf c.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("compare files ($omode)",
+ {$td->FILE => "b.pdf"},
+ {$td->FILE => "c.pdf"});
+ if (($base eq 'lin-special') || ($base eq 'object-stream'))
+ {
+ $td->runtest("check $base ($omode)",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "$base.$omode.exp"});
+ }
+ }
+}
+
+show_ntests();
+# ----------
+$td->notify("--- Encryption Tests ---");
+# $n_tests incremented below
+
+# The enc-file.pdf files were encrypted using Acrobat 5.0, not the
+# qpdf library. The files are decrypted using qpdf, then re-encrypted
+# using qpdf with specific flags. The /P value is checked. The
+# resulting files were saved and manually checked with Acrobat 5.0 to
+# ensure that the security settings were as intended.
+
+# Values: basename, password, encryption flags, /P Encrypt key.
+my @encrypted_files =
+ (['base', ''],
+ ['R3,V2', '',
+ '-accessibility=n -extract=n -print=full -modify=all', -532],
+ ['R3,V2,U=view', 'view',
+ '-accessibility=y -extract=n -print=none -modify=none', -3392],
+ ['R3,V2,O=master', 'master',
+ '-accessibility=n -extract=y -print=none -modify=annotate', -2576],
+ ['R3,V2,O=master', '',
+ '-accessibility=n -extract=n -print=none -modify=form', -2624],
+ ['R3,V2,U=view,O=master', 'view',
+ '-accessibility=n -extract=n -print=none -modify=assembly', -2880],
+ ['R3,V2,U=view,O=master', 'master',
+ '-accessibility=n -print=low', -2564],
+ ['R2,V1', '',
+ '-print=n -modify=n -extract=n -annotate=n', -64],
+ ['R2,V1,U=view', 'view',
+ '-print=y -modify=n -extract=n -annotate=n', -60],
+ ['R2,V1,O=master', 'master',
+ '-print=n -modify=y -extract=n -annotate=n', -56],
+ ['R2,V1,O=master', '',
+ '-print=n -modify=n -extract=y -annotate=n', -48],
+ ['R2,V1,U=view,O=master', 'view',
+ '-print=n -modify=n -extract=n -annotate=y', -32],
+ ['R2,V1,U=view,O=master', 'master',
+ '', -4],
+ ['long-password', 'asdf asdf asdf asdf asdf asdf qwer'],
+ ['long-password', 'asdf asdf asdf asdf asdf asdf qw']);
+
+$n_tests += 3 + (2 * (@encrypted_files)) + (6 * (@encrypted_files - 3)) + 8;
+
+$td->runtest("encrypted file",
+ {$td->COMMAND => "test_driver 2 U25A0.pdf"},
+ {$td->FILE => "encrypted1.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("preserve encryption",
+ {$td->COMMAND => "qpdf U25A0.pdf U25A0.enc"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+$td->runtest("recheck encrypted file",
+ {$td->COMMAND => "test_driver 2 U25A0.enc"},
+ {$td->FILE => "encrypted1.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+foreach my $d (@encrypted_files)
+{
+ my ($file, $pass, $xeflags, $P) = @$d;
+ # Test writing to stdout
+ $td->runtest("decrypt $file",
+ {$td->COMMAND =>
+ "qpdf --static-id -qdf" .
+ " --password=\"$pass\" enc-$file.pdf -" .
+ " > $file.enc"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ if ($file eq 'base')
+ {
+ $td->runtest("check ID",
+ {$td->COMMAND => "perl check-ID.pl $file.enc"},
+ {$td->STRING => "ID okay\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+ }
+ else
+ {
+ $td->runtest("check against base",
+ {$td->COMMAND => "./diff-encrypted base.enc $file.enc"},
+ {$td->STRING => "okay\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+ }
+ if ($file =~ m/^R(\d),V(\d)(?:,U=(\w+))?(?:,O=(\w+))?$/)
+ {
+ my $R = $1;
+ my $V = $2;
+ my $upass = $3 || "";
+ my $opass = $4 || "";
+ my $bits = (($V == 2) ? 128 : 40);
+
+ my $eflags = "-encrypt \"$upass\" \"$opass\" $bits $xeflags --";
+ $td->runtest("encrypt $file",
+ {$td->COMMAND =>
+ "qpdf --static-id -qdf $eflags $file.enc $file.enc2"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("check /P",
+ {$td->COMMAND =>
+ "qpdf --show-encryption --password=\"$pass\"" .
+ " $file.enc2"},
+ {$td->STRING => "P = $P\nUser password = $upass\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+ $td->runtest("decrypt again",
+ {$td->COMMAND =>
+ "qpdf --static-id -qdf --password=\"$pass\"" .
+ " $file.enc2 $file.enc3"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("compare",
+ {$td->FILE => "$file.enc"},
+ {$td->FILE => "$file.enc3"});
+ $td->runtest("preserve encryption",
+ {$td->COMMAND =>
+ "qpdf --static-id --password=\"$pass\"" .
+ " $file.enc2 $file.enc4"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ $td->runtest("check /P",
+ {$td->COMMAND =>
+ "qpdf --show-encryption --password=\"$pass\"" .
+ " $file.enc4"},
+ {$td->STRING => "P = $P\nUser password = $upass\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+ }
+}
+
+$td->runtest("non-encrypted",
+ {$td->COMMAND => "qpdf --show-encryption enc-base.pdf"},
+ {$td->STRING => "File is not encrypted\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("invalid password",
+ {$td->COMMAND => "qpdf -qdf --password=quack" .
+ " enc-R2,V1,U=view.pdf a.qdf"},
+ {$td->STRING => "enc-R2,V1,U=view.pdf: invalid password\n",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+
+# Test combinations of linearization and encryption. Note that we do
+# content checks on encrypted and linearized files in various
+# combinations below. Here we are just making sure that they are
+# linearized and/or encrypted as desired.
+
+$td->runtest("linearize encrypted file",
+ {$td->COMMAND => "qpdf --linearize U25A0.pdf a.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+$td->runtest("check encryption",
+ {$td->COMMAND => "qpdf --show-encryption a.pdf"},
+ {$td->STRING => "P = -60\nUser password = \n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check linearization",
+ {$td->COMMAND => "qpdf --check-linearization a.pdf"},
+ {$td->STRING => "a.pdf: no linearization errors\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("linearize and encrypt file",
+ {$td->COMMAND =>
+ "qpdf --linearize --encrypt user owner 128 --" .
+ " lin-special.pdf a.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+$td->runtest("check encryption",
+ {$td->COMMAND => "qpdf --show-encryption --password=owner a.pdf"},
+ {$td->STRING => "P = -4\nUser password = user\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check linearization",
+ {$td->COMMAND => "qpdf --check-linearization" .
+ " --password=user a.pdf"},
+ {$td->STRING => "a.pdf: no linearization errors\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+show_ntests();
+# ----------
+$td->notify("--- Content Preservation Tests ---");
+# $n_tests incremented below
+
+my @files = ("U25A0.pdf", # encrypted
+ "inline-images.pdf",
+ "lin-special.pdf",
+ "object-stream.pdf",
+ "hybrid-xref.pdf");
+my @flags = (["-qdf", # 1
+ "qdf"],
+ ["-qdf --normalize-content=n", # 2
+ "qdf not normalized"],
+ ["-qdf --stream-data=preserve", # 3
+ "qdf not uncompressed"],
+ ["-qdf --stream-data=preserve --normalize-content=n", # 4
+ "qdf not normalized or uncompressed"],
+ ["--stream-data=uncompress", # 5
+ "uncompresed"],
+ ["--normalize-content=y", # 6
+ "normalized"],
+ ["--stream-data=uncompress --normalize-content=y", # 7
+ "uncompressed and normalized"],
+ ["-decrypt", # 8
+ "decrypted"],
+ ["-linearize", # 9
+ "linearized"],
+ ["-encrypt \"\" owner 128 --", # 10
+ "encrypted"],
+ ["-linearize -encrypt \"\" o 128 --", # 11
+ "linearized and encrypted"],
+ ["", # 12
+ "no arguments"],
+ );
+
+$n_tests += (@files * @flags * 2 * 2);
+$n_compare_pdfs += (@files * @flags * 2);
+$n_acroread += (@files * @flags * 2);
+
+foreach my $file (@files)
+{
+ my $base = basename($file, '.pdf');
+
+ foreach my $o (qw(disable generate))
+ {
+ my $n = 0;
+ my $oflags = "--object-streams=$o";
+ my $odescrip = "os:" . substr($o, 0, 1);
+ foreach my $d (@flags)
+ {
+ my ($flags, $fdescrip) = @$d;
+ ++$n;
+ system("rm -f *.pnm");
+
+ $td->runtest("$file ($odescrip $fdescrip)",
+ {$td->COMMAND => "qpdf $flags $oflags $file a.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+
+ $td->runtest("check status",
+ {$td->COMMAND => "qpdf --check a.pdf"},
+ {$td->FILE => "$base.$n.check",
+ $td->EXIT_STATUS => 0});
+
+ compare_pdfs($file, "a.pdf");
+
+ if ($have_acroread)
+ {
+ # These tests require Adobe Reader > 7.x to work with
+ # encrypted files.
+ $td->runtest("check with Adobe Reader",
+ {$td->COMMAND =>
+ "acroread -toPostScript -pairs a.pdf 1.ps"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ }
+ }
+ flush_tiff_cache();
+ }
+}
+
+show_ntests();
+# ----------
+$td->notify("--- fix-qdf Tests ---");
+$n_tests += 6;
+
+foreach my $lang qw(C en_US en_US.UTF-8)
+{
+ for (my $n = 1; $n <= 2; ++$n)
+ {
+ $td->runtest("fix-qdf $n (LANG=$lang)",
+ {$td->COMMAND => "LANG=$lang fix-qdf fix$n.qdf"},
+ {$td->FILE => "fix$n.qdf.out",
+ $td->EXIT_STATUS => 0});
+ }
+}
+
+show_ntests();
+
+# ----------
+cleanup();
+
+# See comments at beginning about calculation of number of tests. We
+# do it strictly based on static values, not as a by-product of
+# running the test suite.
+$td->report(calc_ntests());
+
+sub calc_ntests
+{
+ my $result = $n_tests;
+ if ($have_acroread)
+ {
+ $result += $n_acroread;
+ }
+ if ($compare_images)
+ {
+ $result += 3 * ($n_compare_pdfs);
+ }
+ $result;
+}
+
+sub show_ntests
+{
+ if (0)
+ {
+ $td->emphasize("tests so far: ". calc_ntests());
+ }
+}
+
+sub check_pdf
+{
+ my ($description, $command, $output, $status) = @_;
+ unlink "a.pdf";
+ $td->runtest($description,
+ {$td->COMMAND => "$command a.pdf"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => $status});
+ $td->runtest("check output",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => $output});
+}
+
+sub flush_tiff_cache
+{
+ system("rm -rf tiff-cache");
+}
+
+sub compare_pdfs
+{
+ return unless $compare_images;
+
+ my ($f1, $f2, $exp) = @_;
+
+ $exp = 0 unless defined $exp;
+
+ system("rm -rf tif1 tif2");
+
+ mkdir "tiff-cache", 0777 unless -d "tiff-cache";
+
+ my $md5_1 = get_md5_checksum($f1);
+ my $md5_2 = get_md5_checksum($f2);
+
+ mkdir "tif1", 0777 or die;
+ mkdir "tif2", 0777 or die;
+
+ if (-f "tiff-cache/$md5_1.tif")
+ {
+ $td->runtest("get cached original file image",
+ {$td->COMMAND => "cp tiff-cache/$md5_1.tif tif1/a.tif"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ }
+ else
+ {
+ $td->runtest("convert original file to image",
+ {$td->COMMAND =>
+ "(cd tif1;" .
+ " gs -q -dNOPAUSE -sDEVICE=tiff12nc" .
+ " -sOutputFile=a.tif - < ../$f1)"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ copy("tif1/a.tif", "tiff-cache/$md5_1.tif");
+ }
+
+ if (-f "tiff-cache/$md5_2.tif")
+ {
+ $td->runtest("get cached new file image",
+ {$td->COMMAND => "cp tiff-cache/$md5_2.tif tif2/a.tif"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ }
+ else
+ {
+ $td->runtest("convert new file to image",
+ {$td->COMMAND =>
+ "(cd tif2;" .
+ " gs -q -dNOPAUSE -sDEVICE=tiff12nc" .
+ " -sOutputFile=a.tif - < ../$f2)"},
+ {$td->STRING => "",
+ $td->EXIT_STATUS => 0});
+ copy("tif2/a.tif", "tiff-cache/$md5_2.tif");
+ }
+
+ $td->runtest("compare images",
+ {$td->COMMAND => "tiffcmp -t tif1/a.tif tif2/a.tif"},
+ {$td->REGEXP => ".*",
+ $td->EXIT_STATUS => $exp});
+
+ system("rm -rf tif1 tif2");
+}
+
+sub get_md5_checksum
+{
+ my $file = shift;
+ open(F, "<$file") or fatal("can't open $file: $!");
+ binmode F;
+ my $digest = Digest::MD5->new->addfile(*F)->hexdigest;
+ close(F);
+ $digest;
+}
+
+sub cleanup
+{
+ system("rm -rf *.ps *.pnm a.pdf a.qdf b.pdf b.qdf c.pdf" .
+ " *.enc* tif1 tif2 tiff-cache");
+}
diff --git a/qpdf/qtest/qpdf/U25A0.1.check b/qpdf/qtest/qpdf/U25A0.1.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.1.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.10.check b/qpdf/qtest/qpdf/U25A0.10.check
new file mode 100644
index 00000000..0e0ed996
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.10.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.11.check b/qpdf/qtest/qpdf/U25A0.11.check
new file mode 100644
index 00000000..327d847a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.11.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.12.check b/qpdf/qtest/qpdf/U25A0.12.check
new file mode 100644
index 00000000..48b8e821
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.12.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -60
+User password =
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.2.check b/qpdf/qtest/qpdf/U25A0.2.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.2.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.3.check b/qpdf/qtest/qpdf/U25A0.3.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.3.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.4.check b/qpdf/qtest/qpdf/U25A0.4.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.4.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.5.check b/qpdf/qtest/qpdf/U25A0.5.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.5.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.6.check b/qpdf/qtest/qpdf/U25A0.6.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.6.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.7.check b/qpdf/qtest/qpdf/U25A0.7.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.7.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.8.check b/qpdf/qtest/qpdf/U25A0.8.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.8.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.9.check b/qpdf/qtest/qpdf/U25A0.9.check
new file mode 100644
index 00000000..547c43d5
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.9.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -60
+User password =
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/U25A0.pdf b/qpdf/qtest/qpdf/U25A0.pdf
new file mode 100644
index 00000000..f8b779d4
--- /dev/null
+++ b/qpdf/qtest/qpdf/U25A0.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/bad1-recover.out b/qpdf/qtest/qpdf/bad1-recover.out
new file mode 100644
index 00000000..1cd5b015
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad1-recover.out
@@ -0,0 +1 @@
+bad1.pdf: offset 0: not a PDF file
diff --git a/qpdf/qtest/qpdf/bad1.out b/qpdf/qtest/qpdf/bad1.out
new file mode 100644
index 00000000..1cd5b015
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad1.out
@@ -0,0 +1 @@
+bad1.pdf: offset 0: not a PDF file
diff --git a/qpdf/qtest/qpdf/bad1.pdf b/qpdf/qtest/qpdf/bad1.pdf
new file mode 100644
index 00000000..75891bc6
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad1.pdf
@@ -0,0 +1 @@
+oops
diff --git a/qpdf/qtest/qpdf/bad10-recover.out b/qpdf/qtest/qpdf/bad10-recover.out
new file mode 100644
index 00000000..905ca597
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad10-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad10.pdf: offset 0: file is damaged
+WARNING: bad10.pdf: offset 712: /Size key in trailer dictionary is not an integer
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad10.out b/qpdf/qtest/qpdf/bad10.out
new file mode 100644
index 00000000..935f5b24
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad10.out
@@ -0,0 +1 @@
+bad10.pdf: offset 712: /Size key in trailer dictionary is not an integer
diff --git a/qpdf/qtest/qpdf/bad10.pdf b/qpdf/qtest/qpdf/bad10.pdf
new file mode 100644
index 00000000..1f2be0c8
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad10.pdf
@@ -0,0 +1,79 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size (h)
+ /Root 1 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad11-recover.out b/qpdf/qtest/qpdf/bad11-recover.out
new file mode 100644
index 00000000..7dfac209
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad11-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad11.pdf: offset 0: file is damaged
+WARNING: bad11.pdf: offset 905: /Prev key in trailer dictionary is not an integer
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad11.out b/qpdf/qtest/qpdf/bad11.out
new file mode 100644
index 00000000..55705b73
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad11.out
@@ -0,0 +1 @@
+bad11.pdf: offset 905: /Prev key in trailer dictionary is not an integer
diff --git a/qpdf/qtest/qpdf/bad11.pdf b/qpdf/qtest/qpdf/bad11.pdf
new file mode 100644
index 00000000..4cf46e5a
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad11.pdf
@@ -0,0 +1,104 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+542
+%%EOF
+
+4 0 obj
+<<
+ /Length 43
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Salad) Tj
+ET
+endstream
+endobj
+
+xref
+0 1
+0000000000 65535 f
+4 1
+0000000750 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Prev [542]
+>>
+startxref
+845
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad12-recover.out b/qpdf/qtest/qpdf/bad12-recover.out
new file mode 100644
index 00000000..97dfb642
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad12-recover.out
@@ -0,0 +1,7 @@
+WARNING: bad12.pdf: reported number of objects (9) inconsistent with actual number of objects (8)
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad12.out b/qpdf/qtest/qpdf/bad12.out
new file mode 100644
index 00000000..d07d74bd
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad12.out
@@ -0,0 +1,7 @@
+WARNING: bad12.pdf: reported number of objects (9) inconsistent with actual number of objects (8)
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 0 done
diff --git a/qpdf/qtest/qpdf/bad12.pdf b/qpdf/qtest/qpdf/bad12.pdf
new file mode 100644
index 00000000..0fc8028a
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad12.pdf
@@ -0,0 +1,122 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+542
+%%EOF
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 7 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+7 0 obj
+<<
+ /Length 48
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Sandwiches) Tj
+ET
+endstream
+endobj
+
+xref
+0 1
+0000000004 65535 f
+3 2
+0000000750 00000 n
+0000000000 00001 f
+7 1
+0000000922 00000 n
+trailer <<
+ /Size 9
+ /Root 1 0 R
+ /Prev 542
+>>
+startxref
+1022
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad13-recover.out b/qpdf/qtest/qpdf/bad13-recover.out
new file mode 100644
index 00000000..5ea29917
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad13-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad13.pdf: offset 0: file is damaged
+WARNING: bad13.pdf: offset 753: unexpected brace token
+WARNING: Attempting to reconstruct cross-reference table
+bad13.pdf: offset 753: unexpected brace token
diff --git a/qpdf/qtest/qpdf/bad13.out b/qpdf/qtest/qpdf/bad13.out
new file mode 100644
index 00000000..12eedf08
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad13.out
@@ -0,0 +1 @@
+bad13.pdf: offset 753: unexpected brace token
diff --git a/qpdf/qtest/qpdf/bad13.pdf b/qpdf/qtest/qpdf/bad13.pdf
new file mode 100644
index 00000000..2fb59d2e
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad13.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something {
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad14-recover.out b/qpdf/qtest/qpdf/bad14-recover.out
new file mode 100644
index 00000000..26ee2ef6
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad14-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad14.pdf: offset 0: file is damaged
+WARNING: bad14.pdf: offset 753: unexpected brace token
+WARNING: Attempting to reconstruct cross-reference table
+bad14.pdf: offset 753: unexpected brace token
diff --git a/qpdf/qtest/qpdf/bad14.out b/qpdf/qtest/qpdf/bad14.out
new file mode 100644
index 00000000..82c58c22
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad14.out
@@ -0,0 +1 @@
+bad14.pdf: offset 753: unexpected brace token
diff --git a/qpdf/qtest/qpdf/bad14.pdf b/qpdf/qtest/qpdf/bad14.pdf
new file mode 100644
index 00000000..551fdfdc
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad14.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something }
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad15-recover.out b/qpdf/qtest/qpdf/bad15-recover.out
new file mode 100644
index 00000000..2d6d0cf1
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad15-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad15.pdf: offset 0: file is damaged
+WARNING: bad15.pdf: offset 753: unexpected array close token
+WARNING: Attempting to reconstruct cross-reference table
+bad15.pdf: offset 753: unexpected array close token
diff --git a/qpdf/qtest/qpdf/bad15.out b/qpdf/qtest/qpdf/bad15.out
new file mode 100644
index 00000000..19ffbfcc
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad15.out
@@ -0,0 +1 @@
+bad15.pdf: offset 753: unexpected array close token
diff --git a/qpdf/qtest/qpdf/bad15.pdf b/qpdf/qtest/qpdf/bad15.pdf
new file mode 100644
index 00000000..5578e1d6
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad15.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something ]
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad16-recover.out b/qpdf/qtest/qpdf/bad16-recover.out
new file mode 100644
index 00000000..22a49ee9
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad16-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad16.pdf: offset 0: file is damaged
+WARNING: bad16.pdf: offset 753: unexpected dictionary close token
+WARNING: Attempting to reconstruct cross-reference table
+bad16.pdf: offset 753: unexpected dictionary close token
diff --git a/qpdf/qtest/qpdf/bad16.out b/qpdf/qtest/qpdf/bad16.out
new file mode 100644
index 00000000..315f5203
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad16.out
@@ -0,0 +1 @@
+bad16.pdf: offset 753: unexpected dictionary close token
diff --git a/qpdf/qtest/qpdf/bad16.pdf b/qpdf/qtest/qpdf/bad16.pdf
new file mode 100644
index 00000000..b8bdb5f4
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad16.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something[>>
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad17-recover.out b/qpdf/qtest/qpdf/bad17-recover.out
new file mode 100644
index 00000000..bcaa948f
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad17-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad17.pdf: offset 0: file is damaged
+WARNING: bad17.pdf: offset 753: dictionary ending here has an odd number of elements
+WARNING: Attempting to reconstruct cross-reference table
+bad17.pdf: offset 753: dictionary ending here has an odd number of elements
diff --git a/qpdf/qtest/qpdf/bad17.out b/qpdf/qtest/qpdf/bad17.out
new file mode 100644
index 00000000..36c059d6
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad17.out
@@ -0,0 +1 @@
+bad17.pdf: offset 753: dictionary ending here has an odd number of elements
diff --git a/qpdf/qtest/qpdf/bad17.pdf b/qpdf/qtest/qpdf/bad17.pdf
new file mode 100644
index 00000000..5afb00d2
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad17.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad18-recover.out b/qpdf/qtest/qpdf/bad18-recover.out
new file mode 100644
index 00000000..2a4d2a06
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad18-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad18.pdf: offset 0: file is damaged
+WARNING: bad18.pdf: offset 753: unexpected )
+WARNING: Attempting to reconstruct cross-reference table
+bad18.pdf: offset 753: unexpected )
diff --git a/qpdf/qtest/qpdf/bad18.out b/qpdf/qtest/qpdf/bad18.out
new file mode 100644
index 00000000..5e319d9b
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad18.out
@@ -0,0 +1 @@
+bad18.pdf: offset 753: unexpected )
diff --git a/qpdf/qtest/qpdf/bad18.pdf b/qpdf/qtest/qpdf/bad18.pdf
new file mode 100644
index 00000000..96cf7935
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad18.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something )
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad19-recover.out b/qpdf/qtest/qpdf/bad19-recover.out
new file mode 100644
index 00000000..4fa46af8
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad19-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad19.pdf: offset 0: file is damaged
+WARNING: bad19.pdf: offset 753: unexpected >
+WARNING: Attempting to reconstruct cross-reference table
+bad19.pdf: offset 753: unexpected >
diff --git a/qpdf/qtest/qpdf/bad19.out b/qpdf/qtest/qpdf/bad19.out
new file mode 100644
index 00000000..57ffd7d2
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad19.out
@@ -0,0 +1 @@
+bad19.pdf: offset 753: unexpected >
diff --git a/qpdf/qtest/qpdf/bad19.pdf b/qpdf/qtest/qpdf/bad19.pdf
new file mode 100644
index 00000000..f95036f0
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad19.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something >
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad2-recover.out b/qpdf/qtest/qpdf/bad2-recover.out
new file mode 100644
index 00000000..142f10ff
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad2-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad2.pdf: offset 0: file is damaged
+WARNING: bad2.pdf: can't find startxref
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad2.out b/qpdf/qtest/qpdf/bad2.out
new file mode 100644
index 00000000..9179b774
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad2.out
@@ -0,0 +1 @@
+bad2.pdf: can't find startxref
diff --git a/qpdf/qtest/qpdf/bad2.pdf b/qpdf/qtest/qpdf/bad2.pdf
new file mode 100644
index 00000000..aa63b0b2
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad2.pdf
@@ -0,0 +1,76 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+farbage 542
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad20-recover.out b/qpdf/qtest/qpdf/bad20-recover.out
new file mode 100644
index 00000000..95fc3ca6
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad20-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad20.pdf: offset 0: file is damaged
+WARNING: bad20.pdf: offset 753: invalid character (q) in hexstring
+WARNING: Attempting to reconstruct cross-reference table
+bad20.pdf: offset 753: invalid character (q) in hexstring
diff --git a/qpdf/qtest/qpdf/bad20.out b/qpdf/qtest/qpdf/bad20.out
new file mode 100644
index 00000000..f70b938a
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad20.out
@@ -0,0 +1 @@
+bad20.pdf: offset 753: invalid character (q) in hexstring
diff --git a/qpdf/qtest/qpdf/bad20.pdf b/qpdf/qtest/qpdf/bad20.pdf
new file mode 100644
index 00000000..e42cfe08
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad20.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Something <abqd>
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad21-recover.out b/qpdf/qtest/qpdf/bad21-recover.out
new file mode 100644
index 00000000..7423fe4f
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad21-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad21.pdf: offset 0: file is damaged
+WARNING: bad21.pdf: offset 742: invalid name token
+WARNING: Attempting to reconstruct cross-reference table
+bad21.pdf: offset 742: invalid name token
diff --git a/qpdf/qtest/qpdf/bad21.out b/qpdf/qtest/qpdf/bad21.out
new file mode 100644
index 00000000..fb71b5ac
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad21.out
@@ -0,0 +1 @@
+bad21.pdf: offset 742: invalid name token
diff --git a/qpdf/qtest/qpdf/bad21.pdf b/qpdf/qtest/qpdf/bad21.pdf
new file mode 100644
index 00000000..4be5f0ef
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad21.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Som#ething 1
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad22-recover.out b/qpdf/qtest/qpdf/bad22-recover.out
new file mode 100644
index 00000000..823e8b96
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad22-recover.out
@@ -0,0 +1,21 @@
+WARNING: bad22.pdf: offset 341: attempting to recover stream length
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Qength 44 >>
+Raw stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+Uncompressed stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+End of stream data
+unparse: 4 0 R
+unparseResolved: 4 0 R
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad22.out b/qpdf/qtest/qpdf/bad22.out
new file mode 100644
index 00000000..40d92a45
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad22.out
@@ -0,0 +1 @@
+bad22.pdf: offset 317: stream dictionary lacks /Length key
diff --git a/qpdf/qtest/qpdf/bad22.pdf b/qpdf/qtest/qpdf/bad22.pdf
new file mode 100644
index 00000000..b0d42ac7
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad22.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Qength 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad23-recover.out b/qpdf/qtest/qpdf/bad23-recover.out
new file mode 100644
index 00000000..981766cd
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad23-recover.out
@@ -0,0 +1,21 @@
+WARNING: bad23.pdf: offset 341: attempting to recover stream length
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Length () >>
+Raw stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+Uncompressed stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+End of stream data
+unparse: 4 0 R
+unparseResolved: 4 0 R
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad23.out b/qpdf/qtest/qpdf/bad23.out
new file mode 100644
index 00000000..5cef84f9
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad23.out
@@ -0,0 +1 @@
+bad23.pdf: offset 317: /Length key in stream dictionary is not an integer
diff --git a/qpdf/qtest/qpdf/bad23.pdf b/qpdf/qtest/qpdf/bad23.pdf
new file mode 100644
index 00000000..0baead97
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad23.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length ()
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad24-recover.out b/qpdf/qtest/qpdf/bad24-recover.out
new file mode 100644
index 00000000..5e643eff
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad24-recover.out
@@ -0,0 +1,2 @@
+WARNING: bad24.pdf: offset 341: attempting to recover stream length
+bad24.pdf: offset 341: unable to recover stream data
diff --git a/qpdf/qtest/qpdf/bad24.out b/qpdf/qtest/qpdf/bad24.out
new file mode 100644
index 00000000..76baa51a
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad24.out
@@ -0,0 +1 @@
+bad24.pdf: offset 385: expected endstream
diff --git a/qpdf/qtest/qpdf/bad24.pdf b/qpdf/qtest/qpdf/bad24.pdf
new file mode 100644
index 00000000..7af8c7d6
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad24.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+enxstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad25-recover.out b/qpdf/qtest/qpdf/bad25-recover.out
new file mode 100644
index 00000000..f8a18758
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad25-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad25.pdf: offset 0: file is damaged
+WARNING: bad25.pdf: offset 307: expected n n obj
+WARNING: Attempting to reconstruct cross-reference table
+bad25.pdf: offset 307: expected n n obj
diff --git a/qpdf/qtest/qpdf/bad25.out b/qpdf/qtest/qpdf/bad25.out
new file mode 100644
index 00000000..11e3899a
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad25.out
@@ -0,0 +1 @@
+bad25.pdf: offset 307: expected n n obj
diff --git a/qpdf/qtest/qpdf/bad25.pdf b/qpdf/qtest/qpdf/bad25.pdf
new file mode 100644
index 00000000..a51974d3
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad25.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+x 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad26-recover.out b/qpdf/qtest/qpdf/bad26-recover.out
new file mode 100644
index 00000000..64b6f610
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad26-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad26.pdf: offset 0: file is damaged
+WARNING: bad26.pdf: offset 307: expected n n obj
+WARNING: Attempting to reconstruct cross-reference table
+bad26.pdf: offset 307: expected n n obj
diff --git a/qpdf/qtest/qpdf/bad26.out b/qpdf/qtest/qpdf/bad26.out
new file mode 100644
index 00000000..2b1b01e2
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad26.out
@@ -0,0 +1 @@
+bad26.pdf: offset 307: expected n n obj
diff --git a/qpdf/qtest/qpdf/bad26.pdf b/qpdf/qtest/qpdf/bad26.pdf
new file mode 100644
index 00000000..4a7e3b21
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad26.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 x obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad27-recover.out b/qpdf/qtest/qpdf/bad27-recover.out
new file mode 100644
index 00000000..be980b95
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad27-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad27.pdf: offset 0: file is damaged
+WARNING: bad27.pdf: offset 307: expected n n obj
+WARNING: Attempting to reconstruct cross-reference table
+bad27.pdf: offset 307: expected n n obj
diff --git a/qpdf/qtest/qpdf/bad27.out b/qpdf/qtest/qpdf/bad27.out
new file mode 100644
index 00000000..a0c47a7c
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad27.out
@@ -0,0 +1 @@
+bad27.pdf: offset 307: expected n n obj
diff --git a/qpdf/qtest/qpdf/bad27.pdf b/qpdf/qtest/qpdf/bad27.pdf
new file mode 100644
index 00000000..032b2125
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad27.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 xbj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad28-recover.out b/qpdf/qtest/qpdf/bad28-recover.out
new file mode 100644
index 00000000..3bf944d5
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad28-recover.out
@@ -0,0 +1,21 @@
+WARNING: bad28.pdf: offset 395: expected endobj
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Length 44 >>
+Raw stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+Uncompressed stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+End of stream data
+unparse: 4 0 R
+unparseResolved: 4 0 R
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad28.out b/qpdf/qtest/qpdf/bad28.out
new file mode 100644
index 00000000..a0809eb9
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad28.out
@@ -0,0 +1,21 @@
+WARNING: bad28.pdf: offset 395: expected endobj
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Length 44 >>
+Raw stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+Uncompressed stream data:
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+
+End of stream data
+unparse: 4 0 R
+unparseResolved: 4 0 R
+test 0 done
diff --git a/qpdf/qtest/qpdf/bad28.pdf b/qpdf/qtest/qpdf/bad28.pdf
new file mode 100644
index 00000000..c77a2069
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad28.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+enwobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad29-recover.out b/qpdf/qtest/qpdf/bad29-recover.out
new file mode 100644
index 00000000..bc6e38d5
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad29-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad29.pdf: offset 0: file is damaged
+WARNING: bad29.pdf: offset 742: null character not allowed in name token
+WARNING: Attempting to reconstruct cross-reference table
+bad29.pdf: offset 742: null character not allowed in name token
diff --git a/qpdf/qtest/qpdf/bad29.out b/qpdf/qtest/qpdf/bad29.out
new file mode 100644
index 00000000..9f279743
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad29.out
@@ -0,0 +1 @@
+bad29.pdf: offset 742: null character not allowed in name token
diff --git a/qpdf/qtest/qpdf/bad29.pdf b/qpdf/qtest/qpdf/bad29.pdf
new file mode 100644
index 00000000..a45151e2
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad29.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Som#00ething 1
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad3-recover.out b/qpdf/qtest/qpdf/bad3-recover.out
new file mode 100644
index 00000000..d205398a
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad3-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad3.pdf: offset 0: file is damaged
+WARNING: bad3.pdf: offset 542: xref not found
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad3.out b/qpdf/qtest/qpdf/bad3.out
new file mode 100644
index 00000000..22ee8fbd
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad3.out
@@ -0,0 +1 @@
+bad3.pdf: offset 542: xref not found
diff --git a/qpdf/qtest/qpdf/bad3.pdf b/qpdf/qtest/qpdf/bad3.pdf
new file mode 100644
index 00000000..3e078f37
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad3.pdf
@@ -0,0 +1,76 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+noxref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref 542
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad30-recover.out b/qpdf/qtest/qpdf/bad30-recover.out
new file mode 100644
index 00000000..95d194d4
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad30-recover.out
@@ -0,0 +1,6 @@
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Filter (FlateDecode) /Length 123 >>
+Raw stream data:
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+Uncompressed stream data:
+bad30.pdf: offset 629: invalid filter object type for this stream
diff --git a/qpdf/qtest/qpdf/bad30.out b/qpdf/qtest/qpdf/bad30.out
new file mode 100644
index 00000000..95d194d4
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad30.out
@@ -0,0 +1,6 @@
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Filter (FlateDecode) /Length 123 >>
+Raw stream data:
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+Uncompressed stream data:
+bad30.pdf: offset 629: invalid filter object type for this stream
diff --git a/qpdf/qtest/qpdf/bad30.pdf b/qpdf/qtest/qpdf/bad30.pdf
new file mode 100644
index 00000000..05c52764
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad30.pdf
@@ -0,0 +1,93 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj
+<<
+ % Comment
+ /Length
+ 123
+ /Filter (FlateDecode)
+>>
+stream
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+endstream
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+0000000556 00000 n
+trailer <<
+ /Size 8
+ /Root 1 0 R
+ /QTest 7 0 R
+>>
+startxref
+771
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad31-recover.out b/qpdf/qtest/qpdf/bad31-recover.out
new file mode 100644
index 00000000..313e2083
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad31-recover.out
@@ -0,0 +1,9 @@
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Filter [ /Oink /Moo /FlateDecode ] /Length 123 >>
+Raw stream data:
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+Uncompressed stream data:
+Stream data is not filterable.
+unparse: 7 0 R
+unparseResolved: 7 0 R
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad31.out b/qpdf/qtest/qpdf/bad31.out
new file mode 100644
index 00000000..2ad01536
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad31.out
@@ -0,0 +1,9 @@
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Filter [ /Oink /Moo /FlateDecode ] /Length 123 >>
+Raw stream data:
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+Uncompressed stream data:
+Stream data is not filterable.
+unparse: 7 0 R
+unparseResolved: 7 0 R
+test 0 done
diff --git a/qpdf/qtest/qpdf/bad31.pdf b/qpdf/qtest/qpdf/bad31.pdf
new file mode 100644
index 00000000..b3c986c8
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad31.pdf
@@ -0,0 +1,93 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj
+<<
+ % Comment
+ /Length
+ 123
+ /Filter [/Oink /Moo /FlateDecode]
+>>
+stream
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+endstream
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+0000000556 00000 n
+trailer <<
+ /Size 8
+ /Root 1 0 R
+ /QTest 7 0 R
+>>
+startxref
+783
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad32-recover.out b/qpdf/qtest/qpdf/bad32-recover.out
new file mode 100644
index 00000000..d0fe873b
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad32-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad32.pdf: offset 0: file is damaged
+WARNING: bad32.pdf: offset 307: expected 4 0 obj
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is indirect
+/QTest is null
+unparse: 4 0 R
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad32.out b/qpdf/qtest/qpdf/bad32.out
new file mode 100644
index 00000000..3212ea02
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad32.out
@@ -0,0 +1 @@
+bad32.pdf: offset 307: expected 4 0 obj
diff --git a/qpdf/qtest/qpdf/bad32.pdf b/qpdf/qtest/qpdf/bad32.pdf
new file mode 100644
index 00000000..25819933
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad32.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+9 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 4 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad4-recover.out b/qpdf/qtest/qpdf/bad4-recover.out
new file mode 100644
index 00000000..f7c56522
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad4-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad4.pdf: offset 0: file is damaged
+WARNING: bad4.pdf: offset 547: xref syntax invalid
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad4.out b/qpdf/qtest/qpdf/bad4.out
new file mode 100644
index 00000000..c29db5f4
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad4.out
@@ -0,0 +1 @@
+bad4.pdf: offset 547: xref syntax invalid
diff --git a/qpdf/qtest/qpdf/bad4.pdf b/qpdf/qtest/qpdf/bad4.pdf
new file mode 100644
index 00000000..ed833b92
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad4.pdf
@@ -0,0 +1,77 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+x0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+542
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad5-recover.out b/qpdf/qtest/qpdf/bad5-recover.out
new file mode 100644
index 00000000..44f76aed
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad5-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad5.pdf: offset 0: file is damaged
+WARNING: bad5.pdf: offset 591: invalid xref entry (obj=2)
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad5.out b/qpdf/qtest/qpdf/bad5.out
new file mode 100644
index 00000000..5a9d8a13
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad5.out
@@ -0,0 +1 @@
+bad5.pdf: offset 591: invalid xref entry (obj=2)
diff --git a/qpdf/qtest/qpdf/bad5.pdf b/qpdf/qtest/qpdf/bad5.pdf
new file mode 100644
index 00000000..d6b0871f
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad5.pdf
@@ -0,0 +1,77 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+000x000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+542
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad6-recover.out b/qpdf/qtest/qpdf/bad6-recover.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad6-recover.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad6.out b/qpdf/qtest/qpdf/bad6.out
new file mode 100644
index 00000000..26b50cb6
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad6.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 0 done
diff --git a/qpdf/qtest/qpdf/bad6.pdf b/qpdf/qtest/qpdf/bad6.pdf
new file mode 100644
index 00000000..50238b21
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad6.pdf
@@ -0,0 +1,122 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+542
+%%EOF
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 7 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+7 0 obj
+<<
+ /Length 48
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Sandwiches) Tj
+ET
+endstream
+endobj
+
+xref
+0 1
+0000000006 65535 f
+3 2
+0000000750 00000 n
+0000000000 00000 f
+7 1
+0000000922 00000 n
+trailer <<
+ /Size 8
+ /Root 1 0 R
+ /Prev 542
+>>
+startxref
+1022
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad7-recover.out b/qpdf/qtest/qpdf/bad7-recover.out
new file mode 100644
index 00000000..56b99f9d
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad7-recover.out
@@ -0,0 +1,4 @@
+WARNING: bad7.pdf: offset 0: file is damaged
+WARNING: bad7.pdf: offset 698: expected trailer dictionary
+WARNING: Attempting to reconstruct cross-reference table
+bad7.pdf: unable to find trailer dictionary while recovering damanged file
diff --git a/qpdf/qtest/qpdf/bad7.out b/qpdf/qtest/qpdf/bad7.out
new file mode 100644
index 00000000..aac77151
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad7.out
@@ -0,0 +1 @@
+bad7.pdf: offset 698: expected trailer dictionary
diff --git a/qpdf/qtest/qpdf/bad7.pdf b/qpdf/qtest/qpdf/bad7.pdf
new file mode 100644
index 00000000..f44c1e66
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad7.pdf
@@ -0,0 +1,77 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer 3 <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+542
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad8-recover.out b/qpdf/qtest/qpdf/bad8-recover.out
new file mode 100644
index 00000000..e9144d42
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad8-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad8.pdf: offset 0: file is damaged
+WARNING: bad8.pdf: offset 543: xref not found
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad8.out b/qpdf/qtest/qpdf/bad8.out
new file mode 100644
index 00000000..a3338ed4
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad8.out
@@ -0,0 +1 @@
+bad8.pdf: offset 543: xref not found
diff --git a/qpdf/qtest/qpdf/bad8.pdf b/qpdf/qtest/qpdf/bad8.pdf
new file mode 100644
index 00000000..9f424af1
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad8.pdf
@@ -0,0 +1,104 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000128 00000 n
+0000000300 00000 n
+0000000389 00000 n
+0000000424 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+542
+%%EOF
+
+4 0 obj
+<<
+ /Length 43
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Salad) Tj
+ET
+endstream
+endobj
+
+xref
+0 1
+0000000000 65535 f
+4 1
+0000000750 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /Prev 543
+>>
+startxref
+845
+%%EOF
diff --git a/qpdf/qtest/qpdf/bad9-recover.out b/qpdf/qtest/qpdf/bad9-recover.out
new file mode 100644
index 00000000..424b47cf
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad9-recover.out
@@ -0,0 +1,9 @@
+WARNING: bad9.pdf: offset 0: file is damaged
+WARNING: bad9.pdf: offset 712: trailer dictionary lacks /Size key
+WARNING: Attempting to reconstruct cross-reference table
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/bad9.out b/qpdf/qtest/qpdf/bad9.out
new file mode 100644
index 00000000..6799ccd9
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad9.out
@@ -0,0 +1 @@
+bad9.pdf: offset 712: trailer dictionary lacks /Size key
diff --git a/qpdf/qtest/qpdf/bad9.pdf b/qpdf/qtest/qpdf/bad9.pdf
new file mode 100644
index 00000000..a52b15fa
--- /dev/null
+++ b/qpdf/qtest/qpdf/bad9.pdf
@@ -0,0 +1,79 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Siqe 7
+ /Root 1 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/badlin1.out b/qpdf/qtest/qpdf/badlin1.out
new file mode 100644
index 00000000..8ad4bfd5
--- /dev/null
+++ b/qpdf/qtest/qpdf/badlin1.out
@@ -0,0 +1,380 @@
+ERROR: first page object (/O) mismatch
+ERROR: space before first xref item (/T) mismatch (computed = 11777; file = 11771
+WARNING: end of first page section (/E) mismatch: /E = 1827; computed = 3889..3891
+WARNING: page 0 has shared identifier entries
+WARNING: page 0: shared object 62: in hint table but not computed list
+badlin1.pdf: linearization data:
+
+file_size: 13103
+first_page_object: 63
+first_page_end: 1827
+npages: 30
+xref_zero_offset: 11770
+first_page: 0
+H_offset: 1211
+H_length: 203
+
+Page Offsets Hint Table
+
+min_nobjects: 2
+first_page_offset: 1414
+nbits_delta_nobjects: 4
+min_page_length: 259
+nbits_delta_page_length: 12
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 12
+nbits_nshared_objects: 2
+nbits_shared_identifier: 2
+nbits_shared_numerator: 4
+shared_denominator: 8
+Page 0:
+ nobjects: 16
+ length: 2477
+ content_offset: 0
+ content_length: 2218
+ nshared_objects: 2
+ identifier 0: 0
+ numerator 0: 0
+ identifier 1: 0
+ numerator 1: 0
+Page 1:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 2:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 3:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 4:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 5:
+ nobjects: 2
+ length: 261
+ content_offset: 0
+ content_length: 2
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 6:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 7:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 8:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 9:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 10:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 11:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 12:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 13:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 14:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 15:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 16:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 17:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 18:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 19:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 20:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 21:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 22:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 23:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 24:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 25:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 26:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 27:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 28:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 29:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 0
+nshared_first_page: 16
+nshared_total: 16
+nbits_nobjects: 0
+min_group_length: 34
+nbits_delta_group_length: 9
+Shared Object 0:
+ group length: 157
+Shared Object 1:
+ group length: 105
+Shared Object 2:
+ group length: 117
+Shared Object 3:
+ group length: 34
+Shared Object 4:
+ group length: 82
+Shared Object 5:
+ group length: 191
+Shared Object 6:
+ group length: 144
+Shared Object 7:
+ group length: 168
+Shared Object 8:
+ group length: 291
+Shared Object 9:
+ group length: 165
+Shared Object 10:
+ group length: 162
+Shared Object 11:
+ group length: 182
+Shared Object 12:
+ group length: 201
+Shared Object 13:
+ group length: 150
+Shared Object 14:
+ group length: 164
+Shared Object 15:
+ group length: 164
+
+Outlines Hint Table
+
+first_object: 66
+first_object_offset: 1827
+nobjects: 12
+group_length: 2064
diff --git a/qpdf/qtest/qpdf/badlin1.pdf b/qpdf/qtest/qpdf/badlin1.pdf
new file mode 100644
index 00000000..8539ac4b
--- /dev/null
+++ b/qpdf/qtest/qpdf/badlin1.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/check-ID.pl b/qpdf/qtest/qpdf/check-ID.pl
new file mode 100644
index 00000000..963b48fe
--- /dev/null
+++ b/qpdf/qtest/qpdf/check-ID.pl
@@ -0,0 +1,20 @@
+use strict;
+$^W=1;
+
+my $okay = 0;
+my $id = '31415926535897932384626433832795';
+while (<>)
+{
+ if ((m,/ID ?\[<([[:xdigit:]]{32})><$id>\],) && ($1 ne $id))
+ {
+ $okay = 1;
+ }
+}
+if ($okay)
+{
+ print "ID okay\n";
+}
+else
+{
+ print "ID bad\n";
+}
diff --git a/qpdf/qtest/qpdf/delete-and-reuse.pdf b/qpdf/qtest/qpdf/delete-and-reuse.pdf
new file mode 100644
index 00000000..53a89ae5
--- /dev/null
+++ b/qpdf/qtest/qpdf/delete-and-reuse.pdf
@@ -0,0 +1,1573 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /PageLabels 107 0 R
+ /Pages 2 0 R
+ /Type /Catalog
+ /PageMode /UseOutlines
+ /Outlines 95 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 30
+ /Kids [
+ 3 0 R
+ 4 0 R
+ 5 0 R
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ 19 0 R
+ 20 0 R
+ 21 0 R
+ 22 0 R
+ 23 0 R
+ 24 0 R
+ 25 0 R
+ 26 0 R
+ 27 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 31 0 R
+ 32 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 33 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+4 0 obj
+<<
+ /Contents 37 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+5 0 obj
+<<
+ /Contents 39 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+6 0 obj
+<<
+ /Contents 41 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+7 0 obj
+<<
+ /Contents 43 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 6
+8 0 obj
+<<
+ /Contents 45 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+9 0 obj
+<<
+ /Contents 47 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+10 0 obj
+<<
+ /Contents 49 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+11 0 obj
+<<
+ /Contents 51 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+12 0 obj
+<<
+ /Contents 53 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+13 0 obj
+<<
+ /Contents 55 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+14 0 obj
+<<
+ /Contents 57 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+15 0 obj
+<<
+ /Contents 59 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 14
+16 0 obj
+<<
+ /Contents 61 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 15
+17 0 obj
+<<
+ /Contents 63 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 16
+18 0 obj
+<<
+ /Contents 65 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 17
+19 0 obj
+<<
+ /Contents 67 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 18
+20 0 obj
+<<
+ /Contents 69 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 19
+21 0 obj
+<<
+ /Contents 71 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 20
+22 0 obj
+<<
+ /Contents 73 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 21
+23 0 obj
+<<
+ /Contents 75 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 22
+24 0 obj
+<<
+ /Contents 77 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 23
+25 0 obj
+<<
+ /Contents 79 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 24
+26 0 obj
+<<
+ /Contents 81 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 25
+27 0 obj
+<<
+ /Contents 83 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 26
+28 0 obj
+<<
+ /Contents 85 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 27
+29 0 obj
+<<
+ /Contents 87 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 28
+30 0 obj
+<<
+ /Contents 89 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 29
+31 0 obj
+<<
+ /Contents 91 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 30
+32 0 obj
+<<
+ /Contents 93 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+33 0 obj
+<<
+ /Length 34 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+34 0 obj
+46
+endobj
+
+35 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+36 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+37 0 obj
+<<
+ /Length 38 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+38 0 obj
+46
+endobj
+
+%% Contents for page 3
+39 0 obj
+<<
+ /Length 40 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+40 0 obj
+46
+endobj
+
+%% Contents for page 4
+41 0 obj
+<<
+ /Length 42 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+42 0 obj
+46
+endobj
+
+%% Contents for page 5
+43 0 obj
+<<
+ /Length 44 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+44 0 obj
+46
+endobj
+
+%% Contents for page 6
+45 0 obj
+<<
+ /Length 46 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+46 0 obj
+46
+endobj
+
+%% Contents for page 7
+47 0 obj
+<<
+ /Length 48 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+48 0 obj
+46
+endobj
+
+%% Contents for page 8
+49 0 obj
+<<
+ /Length 50 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+50 0 obj
+46
+endobj
+
+%% Contents for page 9
+51 0 obj
+<<
+ /Length 52 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+52 0 obj
+46
+endobj
+
+%% Contents for page 10
+53 0 obj
+<<
+ /Length 54 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+54 0 obj
+46
+endobj
+
+%% Contents for page 11
+55 0 obj
+<<
+ /Length 56 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 10) Tj
+ET
+endstream
+endobj
+
+56 0 obj
+47
+endobj
+
+%% Contents for page 12
+57 0 obj
+<<
+ /Length 58 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+58 0 obj
+47
+endobj
+
+%% Contents for page 13
+59 0 obj
+<<
+ /Length 60 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 12) Tj
+ET
+endstream
+endobj
+
+60 0 obj
+47
+endobj
+
+%% Contents for page 14
+61 0 obj
+<<
+ /Length 62 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+62 0 obj
+47
+endobj
+
+%% Contents for page 15
+63 0 obj
+<<
+ /Length 64 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 14) Tj
+ET
+endstream
+endobj
+
+64 0 obj
+47
+endobj
+
+%% Contents for page 16
+65 0 obj
+<<
+ /Length 66 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 15) Tj
+ET
+endstream
+endobj
+
+66 0 obj
+47
+endobj
+
+%% Contents for page 17
+67 0 obj
+<<
+ /Length 68 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 16) Tj
+ET
+endstream
+endobj
+
+68 0 obj
+47
+endobj
+
+%% Contents for page 18
+69 0 obj
+<<
+ /Length 70 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 17) Tj
+ET
+endstream
+endobj
+
+70 0 obj
+47
+endobj
+
+%% Contents for page 19
+71 0 obj
+<<
+ /Length 72 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 18) Tj
+ET
+endstream
+endobj
+
+72 0 obj
+47
+endobj
+
+%% Contents for page 20
+73 0 obj
+<<
+ /Length 74 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 19) Tj
+ET
+endstream
+endobj
+
+74 0 obj
+47
+endobj
+
+%% Contents for page 21
+75 0 obj
+<<
+ /Length 76 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 20) Tj
+ET
+endstream
+endobj
+
+76 0 obj
+47
+endobj
+
+%% Contents for page 22
+77 0 obj
+<<
+ /Length 78 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 21) Tj
+ET
+endstream
+endobj
+
+78 0 obj
+47
+endobj
+
+%% Contents for page 23
+79 0 obj
+<<
+ /Length 80 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 22) Tj
+ET
+endstream
+endobj
+
+80 0 obj
+47
+endobj
+
+%% Contents for page 24
+81 0 obj
+<<
+ /Length 82 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 23) Tj
+ET
+endstream
+endobj
+
+82 0 obj
+47
+endobj
+
+%% Contents for page 25
+83 0 obj
+<<
+ /Length 84 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 24) Tj
+ET
+endstream
+endobj
+
+84 0 obj
+47
+endobj
+
+%% Contents for page 26
+85 0 obj
+<<
+ /Length 86 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 25) Tj
+ET
+endstream
+endobj
+
+86 0 obj
+47
+endobj
+
+%% Contents for page 27
+87 0 obj
+<<
+ /Length 88 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 26) Tj
+ET
+endstream
+endobj
+
+88 0 obj
+47
+endobj
+
+%% Contents for page 28
+89 0 obj
+<<
+ /Length 90 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 27) Tj
+ET
+endstream
+endobj
+
+90 0 obj
+47
+endobj
+
+%% Contents for page 29
+91 0 obj
+<<
+ /Length 92 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 28) Tj
+ET
+endstream
+endobj
+
+92 0 obj
+47
+endobj
+
+%% Contents for page 30
+93 0 obj
+<<
+ /Length 94 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 29) Tj
+ET
+endstream
+endobj
+
+94 0 obj
+47
+endobj
+
+95 0 obj
+<<
+ /Type /Outlines
+ /First 96 0 R
+ /Last 97 0 R
+ /Count 6
+>>
+endobj
+
+96 0 obj
+<<
+ /Type /Outline
+ /Title (Isís 1 -> 5: /XYZ null null null)
+ /Parent 95 0 R
+ /Count 4
+ /Next 97 0 R
+ /First 98 0 R
+ /Last 99 0 R
+ /Dest [ 8 0 R /XYZ null null null ]
+>>
+endobj
+
+97 0 obj
+<<
+ /Type /Outline
+ /Title (Trepak 2 -> 15: /XYZ 66 756 3)
+ /Parent 95 0 R
+ /Prev 96 0 R
+ /Dest [ 18 0 R /XYZ 66 756 3 ]
+>>
+endobj
+
+98 0 obj
+<<
+ /Type /Outline
+ /Title (Amanda 1.1 -> 11: /Fit)
+ /Parent 96 0 R
+ /Next 99 0 R
+ /First 100 0 R
+ /Last 101 0 R
+ /Count -3
+ /Dest [ 14 0 R /Fit ]
+>>
+endobj
+
+99 0 obj
+<<
+ /Type /Outline
+ % /Title (Sandy (Sandy [Greek]) 1.2 -> 13: /FitH 792)
+ /Title <feff00530061006e00640079002000f703a303b103bd03b403b900f700200031002e00320020002d003e002000310033003a0020002f00460069007400480020003700390032>
+ /Parent 96 0 R
+ /Prev 98 0 R
+ /First 105 0 R
+ /Last 106 0 R
+ /Count 2
+ /Dest [ 16 0 R /FitH 792 ]
+>>
+endobj
+
+100 0 obj
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1 -> 12: /FitV 100)
+ /Parent 98 0 R
+ /Next 101 0 R
+ /First 102 0 R
+ /Last 103 0 R
+ /Count -2
+ /Dest [ 15 0 R /FitV 100 ]
+>>
+endobj
+
+101 0 obj
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2 -> 12: /XYZ null null null)
+ /Parent 98 0 R
+ /Prev 100 0 R
+ /First 104 0 R
+ /Last 104 0 R
+ /Count 1
+ /Dest [ 15 0 R /XYZ null null null ]
+>>
+endobj
+
+102 0 obj
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null)
+ /Parent 100 0 R
+ /Next 103 0 R
+ /Dest [ 21 0 R /XYZ null null null ]
+>>
+endobj
+
+103 0 obj
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null)
+ /Parent 100 0 R
+ /Prev 102 0 R
+ /Dest [ 22 0 R /XYZ null null null ]
+>>
+endobj
+
+104 0 obj
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2.1 -> 22: /XYZ null null null)
+ /Parent 101 0 R
+ /Dest [ 25 0 R /XYZ null null null ]
+>>
+endobj
+
+105 0 obj
+<<
+ /Type /Outline
+ /Title (Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770)
+ /Parent 99 0 R
+ /Next 106 0 R
+ /Dest [ 4 0 R /FitR 66 714 180 770 ]
+>>
+endobj
+
+106 0 obj
+<<
+ /Type /Outline
+ /Title (Trepsicle 1.2.2 -> 0: /XYZ null null null)
+ /Parent 99 0 R
+ /Prev 105 0 R
+ /Dest [ 3 0 R /XYZ null null null ]
+>>
+endobj
+
+107 0 obj
+ << /Nums [
+ 0 << /P () >>
+ 2 << /S /r /St 1 >>
+ 7 << /P () >>
+ 9 << /S /r /St 6 >>
+ 11 << /P () >>
+ 12 << /S /D /St 2 >>
+ 15 << /S /D /St 6 >>
+ 19 << /P () >>
+ 20 << /S /D /St 12 >>
+ 22 << /S /D /St 16059 >>
+ 23 << /S /r /St 50 >>
+ 29 << /S /r /St 54 >>
+ ] >>
+endobj
+
+xref
+0 108
+0000000000 65535 f
+0000000025 00000 n
+0000000145 00000 n
+0000000541 00000 n
+0000000746 00000 n
+0000000951 00000 n
+0000001156 00000 n
+0000001361 00000 n
+0000001566 00000 n
+0000001771 00000 n
+0000001976 00000 n
+0000002182 00000 n
+0000002389 00000 n
+0000002596 00000 n
+0000002803 00000 n
+0000003010 00000 n
+0000003217 00000 n
+0000003424 00000 n
+0000003631 00000 n
+0000003838 00000 n
+0000004045 00000 n
+0000004252 00000 n
+0000004459 00000 n
+0000004666 00000 n
+0000004873 00000 n
+0000005080 00000 n
+0000005287 00000 n
+0000005494 00000 n
+0000005701 00000 n
+0000005908 00000 n
+0000006115 00000 n
+0000006322 00000 n
+0000006529 00000 n
+0000006748 00000 n
+0000006851 00000 n
+0000006871 00000 n
+0000006990 00000 n
+0000007049 00000 n
+0000007152 00000 n
+0000007195 00000 n
+0000007298 00000 n
+0000007341 00000 n
+0000007444 00000 n
+0000007487 00000 n
+0000007590 00000 n
+0000007633 00000 n
+0000007736 00000 n
+0000007779 00000 n
+0000007882 00000 n
+0000007925 00000 n
+0000008028 00000 n
+0000008071 00000 n
+0000008174 00000 n
+0000008218 00000 n
+0000008321 00000 n
+0000008365 00000 n
+0000008469 00000 n
+0000008513 00000 n
+0000008617 00000 n
+0000008661 00000 n
+0000008765 00000 n
+0000008809 00000 n
+0000008913 00000 n
+0000008957 00000 n
+0000009061 00000 n
+0000009105 00000 n
+0000009209 00000 n
+0000009253 00000 n
+0000009357 00000 n
+0000009401 00000 n
+0000009505 00000 n
+0000009549 00000 n
+0000009653 00000 n
+0000009697 00000 n
+0000009801 00000 n
+0000009845 00000 n
+0000009949 00000 n
+0000009993 00000 n
+0000010097 00000 n
+0000010141 00000 n
+0000010245 00000 n
+0000010289 00000 n
+0000010393 00000 n
+0000010437 00000 n
+0000010541 00000 n
+0000010585 00000 n
+0000010689 00000 n
+0000010733 00000 n
+0000010837 00000 n
+0000010881 00000 n
+0000010985 00000 n
+0000011029 00000 n
+0000011133 00000 n
+0000011177 00000 n
+0000011281 00000 n
+0000011301 00000 n
+0000011388 00000 n
+0000011584 00000 n
+0000011730 00000 n
+0000011905 00000 n
+0000012258 00000 n
+0000012449 00000 n
+0000012659 00000 n
+0000012828 00000 n
+0000012997 00000 n
+0000013150 00000 n
+0000013319 00000 n
+0000013484 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 108
+>>
+startxref
+13801
+%%EOF
+
+% 1. Delete page labels
+xref
+0 1
+0000000107 65535 f
+107 1
+0000000000 00001 f
+trailer << /Root 1 0 R /Size 108 /Prev 13801 >>
+startxref
+16059
+%%EOF
+
+% 2. Delete outlines, reuse page labels.
+
+107 1 obj
+ << /Nums [
+ 0 << /P () >>
+ 2 << /S /D /St 1 >>
+ 7 << /P () >>
+ 9 << /S /R /St 6 >>
+ 11 << /P () >>
+ 12 << /S /r /St 2 >>
+ 15 << /S /r /St 6 >>
+ 19 << /P () >>
+ 20 << /S /R /St 12 >>
+ 22 << /S /D /St 16059 >>
+ 23 << /S /r /St 50 >>
+ 29 << /S /r /St 54 >>
+ ] >>
+endobj
+
+% Reuse object 1 with the same generation number. Leave outlines
+% there pointing to a deleted object.
+1 0 obj
+<<
+ /PageLabels 107 1 R
+ /Pages 2 0 R
+ /Type /Catalog
+ /PageMode /UseOutlines
+ /Outlines 95 0 R
+>>
+endobj
+
+xref
+0 2
+0000000095 65535 f
+0000016648 00000 n
+95 13
+0000000096 00001 f
+0000000097 00001 f
+0000000098 00001 f
+0000000099 00001 f
+0000000100 00001 f
+0000000101 00001 f
+0000000102 00001 f
+0000000103 00001 f
+0000000104 00001 f
+0000000105 00001 f
+0000000106 00001 f
+0000000000 00001 f
+0000016227 00001 n
+trailer << /Size 108 /Prev 16059 /Root 1 0 R >>
+startxref
+16768
+%%EOF
diff --git a/qpdf/qtest/qpdf/delete-and-reuse.qdf b/qpdf/qtest/qpdf/delete-and-reuse.qdf
new file mode 100644
index 00000000..14fbbdb5
--- /dev/null
+++ b/qpdf/qtest/qpdf/delete-and-reuse.qdf
@@ -0,0 +1,1408 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /PageLabels 2 0 R
+ /PageMode /UseOutlines
+ /Pages 3 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Nums [
+ 0
+ <<
+ /P ()
+ >>
+ 2
+ <<
+ /S /D
+ /St 1
+ >>
+ 7
+ <<
+ /P ()
+ >>
+ 9
+ <<
+ /S /R
+ /St 6
+ >>
+ 11
+ <<
+ /P ()
+ >>
+ 12
+ <<
+ /S /r
+ /St 2
+ >>
+ 15
+ <<
+ /S /r
+ /St 6
+ >>
+ 19
+ <<
+ /P ()
+ >>
+ 20
+ <<
+ /S /R
+ /St 12
+ >>
+ 22
+ <<
+ /S /D
+ /St 16059
+ >>
+ 23
+ <<
+ /S /r
+ /St 50
+ >>
+ 29
+ <<
+ /S /r
+ /St 54
+ >>
+ ]
+>>
+endobj
+
+3 0 obj
+<<
+ /Count 30
+ /Kids [
+ 4 0 R
+ 5 0 R
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ 19 0 R
+ 20 0 R
+ 21 0 R
+ 22 0 R
+ 23 0 R
+ 24 0 R
+ 25 0 R
+ 26 0 R
+ 27 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 31 0 R
+ 32 0 R
+ 33 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+4 0 obj
+<<
+ /Contents 34 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+5 0 obj
+<<
+ /Contents 38 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+6 0 obj
+<<
+ /Contents 40 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+7 0 obj
+<<
+ /Contents 42 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+8 0 obj
+<<
+ /Contents 44 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 6
+9 0 obj
+<<
+ /Contents 46 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+10 0 obj
+<<
+ /Contents 48 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+11 0 obj
+<<
+ /Contents 50 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+12 0 obj
+<<
+ /Contents 52 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+13 0 obj
+<<
+ /Contents 54 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+14 0 obj
+<<
+ /Contents 56 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+15 0 obj
+<<
+ /Contents 58 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+16 0 obj
+<<
+ /Contents 60 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 14
+17 0 obj
+<<
+ /Contents 62 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 15
+18 0 obj
+<<
+ /Contents 64 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 16
+19 0 obj
+<<
+ /Contents 66 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 17
+20 0 obj
+<<
+ /Contents 68 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 18
+21 0 obj
+<<
+ /Contents 70 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 19
+22 0 obj
+<<
+ /Contents 72 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 20
+23 0 obj
+<<
+ /Contents 74 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 21
+24 0 obj
+<<
+ /Contents 76 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 22
+25 0 obj
+<<
+ /Contents 78 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 23
+26 0 obj
+<<
+ /Contents 80 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 24
+27 0 obj
+<<
+ /Contents 82 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 25
+28 0 obj
+<<
+ /Contents 84 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 26
+29 0 obj
+<<
+ /Contents 86 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 27
+30 0 obj
+<<
+ /Contents 88 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 28
+31 0 obj
+<<
+ /Contents 90 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 29
+32 0 obj
+<<
+ /Contents 92 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 30
+33 0 obj
+<<
+ /Contents 94 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 36 0 R
+ >>
+ /ProcSet 37 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+34 0 obj
+<<
+ /Length 35 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+35 0 obj
+46
+endobj
+
+36 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+37 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+38 0 obj
+<<
+ /Length 39 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+39 0 obj
+46
+endobj
+
+%% Contents for page 3
+40 0 obj
+<<
+ /Length 41 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+41 0 obj
+46
+endobj
+
+%% Contents for page 4
+42 0 obj
+<<
+ /Length 43 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+43 0 obj
+46
+endobj
+
+%% Contents for page 5
+44 0 obj
+<<
+ /Length 45 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+45 0 obj
+46
+endobj
+
+%% Contents for page 6
+46 0 obj
+<<
+ /Length 47 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+47 0 obj
+46
+endobj
+
+%% Contents for page 7
+48 0 obj
+<<
+ /Length 49 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+49 0 obj
+46
+endobj
+
+%% Contents for page 8
+50 0 obj
+<<
+ /Length 51 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+51 0 obj
+46
+endobj
+
+%% Contents for page 9
+52 0 obj
+<<
+ /Length 53 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+53 0 obj
+46
+endobj
+
+%% Contents for page 10
+54 0 obj
+<<
+ /Length 55 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+55 0 obj
+46
+endobj
+
+%% Contents for page 11
+56 0 obj
+<<
+ /Length 57 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 10) Tj
+ET
+endstream
+endobj
+
+57 0 obj
+47
+endobj
+
+%% Contents for page 12
+58 0 obj
+<<
+ /Length 59 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+59 0 obj
+47
+endobj
+
+%% Contents for page 13
+60 0 obj
+<<
+ /Length 61 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 12) Tj
+ET
+endstream
+endobj
+
+61 0 obj
+47
+endobj
+
+%% Contents for page 14
+62 0 obj
+<<
+ /Length 63 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+63 0 obj
+47
+endobj
+
+%% Contents for page 15
+64 0 obj
+<<
+ /Length 65 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 14) Tj
+ET
+endstream
+endobj
+
+65 0 obj
+47
+endobj
+
+%% Contents for page 16
+66 0 obj
+<<
+ /Length 67 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 15) Tj
+ET
+endstream
+endobj
+
+67 0 obj
+47
+endobj
+
+%% Contents for page 17
+68 0 obj
+<<
+ /Length 69 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 16) Tj
+ET
+endstream
+endobj
+
+69 0 obj
+47
+endobj
+
+%% Contents for page 18
+70 0 obj
+<<
+ /Length 71 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 17) Tj
+ET
+endstream
+endobj
+
+71 0 obj
+47
+endobj
+
+%% Contents for page 19
+72 0 obj
+<<
+ /Length 73 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 18) Tj
+ET
+endstream
+endobj
+
+73 0 obj
+47
+endobj
+
+%% Contents for page 20
+74 0 obj
+<<
+ /Length 75 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 19) Tj
+ET
+endstream
+endobj
+
+75 0 obj
+47
+endobj
+
+%% Contents for page 21
+76 0 obj
+<<
+ /Length 77 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 20) Tj
+ET
+endstream
+endobj
+
+77 0 obj
+47
+endobj
+
+%% Contents for page 22
+78 0 obj
+<<
+ /Length 79 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 21) Tj
+ET
+endstream
+endobj
+
+79 0 obj
+47
+endobj
+
+%% Contents for page 23
+80 0 obj
+<<
+ /Length 81 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 22) Tj
+ET
+endstream
+endobj
+
+81 0 obj
+47
+endobj
+
+%% Contents for page 24
+82 0 obj
+<<
+ /Length 83 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 23) Tj
+ET
+endstream
+endobj
+
+83 0 obj
+47
+endobj
+
+%% Contents for page 25
+84 0 obj
+<<
+ /Length 85 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 24) Tj
+ET
+endstream
+endobj
+
+85 0 obj
+47
+endobj
+
+%% Contents for page 26
+86 0 obj
+<<
+ /Length 87 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 25) Tj
+ET
+endstream
+endobj
+
+87 0 obj
+47
+endobj
+
+%% Contents for page 27
+88 0 obj
+<<
+ /Length 89 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 26) Tj
+ET
+endstream
+endobj
+
+89 0 obj
+47
+endobj
+
+%% Contents for page 28
+90 0 obj
+<<
+ /Length 91 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 27) Tj
+ET
+endstream
+endobj
+
+91 0 obj
+47
+endobj
+
+%% Contents for page 29
+92 0 obj
+<<
+ /Length 93 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 28) Tj
+ET
+endstream
+endobj
+
+93 0 obj
+47
+endobj
+
+%% Contents for page 30
+94 0 obj
+<<
+ /Length 95 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 29) Tj
+ET
+endstream
+endobj
+
+95 0 obj
+47
+endobj
+
+xref
+0 96
+0000000000 65535 f
+0000000025 00000 n
+0000000124 00000 n
+0000000655 00000 n
+0000001052 00000 n
+0000001257 00000 n
+0000001462 00000 n
+0000001667 00000 n
+0000001872 00000 n
+0000002077 00000 n
+0000002282 00000 n
+0000002488 00000 n
+0000002694 00000 n
+0000002901 00000 n
+0000003108 00000 n
+0000003315 00000 n
+0000003522 00000 n
+0000003729 00000 n
+0000003936 00000 n
+0000004143 00000 n
+0000004350 00000 n
+0000004557 00000 n
+0000004764 00000 n
+0000004971 00000 n
+0000005178 00000 n
+0000005385 00000 n
+0000005592 00000 n
+0000005799 00000 n
+0000006006 00000 n
+0000006213 00000 n
+0000006420 00000 n
+0000006627 00000 n
+0000006834 00000 n
+0000007041 00000 n
+0000007260 00000 n
+0000007363 00000 n
+0000007383 00000 n
+0000007502 00000 n
+0000007561 00000 n
+0000007664 00000 n
+0000007707 00000 n
+0000007810 00000 n
+0000007853 00000 n
+0000007956 00000 n
+0000007999 00000 n
+0000008102 00000 n
+0000008145 00000 n
+0000008248 00000 n
+0000008291 00000 n
+0000008394 00000 n
+0000008437 00000 n
+0000008540 00000 n
+0000008583 00000 n
+0000008686 00000 n
+0000008730 00000 n
+0000008833 00000 n
+0000008877 00000 n
+0000008981 00000 n
+0000009025 00000 n
+0000009129 00000 n
+0000009173 00000 n
+0000009277 00000 n
+0000009321 00000 n
+0000009425 00000 n
+0000009469 00000 n
+0000009573 00000 n
+0000009617 00000 n
+0000009721 00000 n
+0000009765 00000 n
+0000009869 00000 n
+0000009913 00000 n
+0000010017 00000 n
+0000010061 00000 n
+0000010165 00000 n
+0000010209 00000 n
+0000010313 00000 n
+0000010357 00000 n
+0000010461 00000 n
+0000010505 00000 n
+0000010609 00000 n
+0000010653 00000 n
+0000010757 00000 n
+0000010801 00000 n
+0000010905 00000 n
+0000010949 00000 n
+0000011053 00000 n
+0000011097 00000 n
+0000011201 00000 n
+0000011245 00000 n
+0000011349 00000 n
+0000011393 00000 n
+0000011497 00000 n
+0000011541 00000 n
+0000011645 00000 n
+0000011689 00000 n
+0000011793 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 96
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+11813
+%%EOF
diff --git a/qpdf/qtest/qpdf/diff-encrypted b/qpdf/qtest/qpdf/diff-encrypted
new file mode 100755
index 00000000..64c0b2a8
--- /dev/null
+++ b/qpdf/qtest/qpdf/diff-encrypted
@@ -0,0 +1,7 @@
+#!/bin/sh
+lines=$(expr + $(diff $1 $2 | egrep '^[<>]' | egrep -v 'Date' | wc -l))
+if [ "$lines" == "0" ]; then
+ echo okay
+else
+ diff -a -U 0 $1 $2
+fi
diff --git a/qpdf/qtest/qpdf/enc-R2,V1,O=master.pdf b/qpdf/qtest/qpdf/enc-R2,V1,O=master.pdf
new file mode 100644
index 00000000..bac7eaec
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R2,V1,O=master.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-R2,V1,U=view,O=master.pdf b/qpdf/qtest/qpdf/enc-R2,V1,U=view,O=master.pdf
new file mode 100644
index 00000000..d5492134
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R2,V1,U=view,O=master.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-R2,V1,U=view.pdf b/qpdf/qtest/qpdf/enc-R2,V1,U=view.pdf
new file mode 100644
index 00000000..d99bf6f8
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R2,V1,U=view.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-R2,V1.pdf b/qpdf/qtest/qpdf/enc-R2,V1.pdf
new file mode 100644
index 00000000..dec9e6d7
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R2,V1.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-R3,V2,O=master.pdf b/qpdf/qtest/qpdf/enc-R3,V2,O=master.pdf
new file mode 100644
index 00000000..88585663
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R3,V2,O=master.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-R3,V2,U=view,O=master.pdf b/qpdf/qtest/qpdf/enc-R3,V2,U=view,O=master.pdf
new file mode 100644
index 00000000..9b95ae36
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R3,V2,U=view,O=master.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-R3,V2,U=view.pdf b/qpdf/qtest/qpdf/enc-R3,V2,U=view.pdf
new file mode 100644
index 00000000..a4efba7a
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R3,V2,U=view.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-R3,V2.pdf b/qpdf/qtest/qpdf/enc-R3,V2.pdf
new file mode 100644
index 00000000..80727887
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-R3,V2.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-base.pdf b/qpdf/qtest/qpdf/enc-base.pdf
new file mode 100644
index 00000000..bac51307
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-base.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/enc-long-password.pdf b/qpdf/qtest/qpdf/enc-long-password.pdf
new file mode 100755
index 00000000..ef064fe9
--- /dev/null
+++ b/qpdf/qtest/qpdf/enc-long-password.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/encrypted-with-images.pdf b/qpdf/qtest/qpdf/encrypted-with-images.pdf
new file mode 100644
index 00000000..dbceb445
--- /dev/null
+++ b/qpdf/qtest/qpdf/encrypted-with-images.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/encrypted1.out b/qpdf/qtest/qpdf/encrypted1.out
new file mode 100644
index 00000000..f3946c2f
--- /dev/null
+++ b/qpdf/qtest/qpdf/encrypted1.out
@@ -0,0 +1,578 @@
+D:20000914005716
+Acrobat Distiller 4.05 for Windows
+(hs[¨.<7µ¸"\205\020º~?ö¥zßù\220\024\203Þ#W\230\214\nBªH)
+(ó*Øý¢¬:F\027\21177\nov\007\031 I\235­\205\n\225ñw¹\b\233n Ê)
+1 g
+/GS1 gs
+1 i
+178.226 60.781 344.491 -11.279 re
+f
+BT
+/F4 1 Tf
+9.999 0 0 9.999 178.2259 51.9016 Tm
+0 g
+0.003 Tc
+0 Tw
+[(T)7(h)-1(e)-249(U)5(ni)5(code)-249(St)5(andar)8(d)-253(3)-1(.0,)-251(C)10(opyr)8(i)5(ght)-247(©)-221(1991-2000,)-251(U)5(n)-1(i)5(c)3(ode,)-251(I)0(nc.)-251(A)2(l)5(l)-247(r)8(i)5(ght)5(s)-244(r)8(es)8(er)8(ved)]TJ
+ET
+1 g
+72.035 60.781 15.119 -11.279 re
+f
+BT
+9.999 0 0 9.999 72.0347 51.9016 Tm
+0 g
+0.004 Tc
+(542)Tj
+ET
+1 g
+490.8 769.802 31.197 -15.959 re
+f
+BT
+/F5 1 Tf
+13.9985 0 0 13.9985 490.7998 756.9629 Tm
+0 g
+0.0057 Tc
+[(25F)8.1(F)]TJ
+ET
+1 g
+242.541 769.802 108.831 -15.959 re
+f
+BT
+13.9985 0 0 13.9985 242.5405 756.9629 Tm
+0 g
+0.0027 Tc
+[(Geom)12.8(etric)-247.6(Shapes)]TJ
+ET
+1 g
+72.035 769.802 31.317 -15.959 re
+f
+BT
+13.9985 0 0 13.9985 72.0347 756.9629 Tm
+0 g
+0.0057 Tc
+[(25A)7.7(0)]TJ
+ET
+0 G
+2 J 1 j 1.49 w 10 M []0 d
+202.104 727.685 m
+202.104 79.259 l
+391.928 727.685 m
+391.928 79.259 l
+202.104 712.807 m
+391.928 712.807 l
+202.104 79.259 m
+391.928 79.259 l
+S
+BT
+/F6 1 Tf
+9.999 0 0 9.999 209.0633 719.286 Tm
+-0.004 Tc
+[(25A)-1389(25B)-1377(25C)-1346(25D)-1370(25E)-1413(25F)]TJ
+ET
+1 g
+360.371 396.033 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 396.033 31.557 -39.597 re
+f
+1 g
+360.371 356.436 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 356.436 31.557 -39.597 re
+f
+1 g
+360.371 316.84 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 316.84 31.557 -39.597 re
+f
+1 g
+360.371 277.243 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 277.243 31.557 -39.597 re
+f
+1 g
+360.371 237.646 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 237.646 31.557 -39.597 re
+f
+1 g
+360.371 198.049 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 198.049 31.557 -39.597 re
+f
+1 g
+360.371 158.453 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 158.453 31.557 -39.597 re
+f
+1 g
+360.371 118.856 31.557 -39.597 re
+f
+/Cs9 cs 0 /P1 scn
+360.371 118.856 31.557 -39.597 re
+f
+0.248 w
+202.104 712.807 m
+202.104 79.259 l
+233.781 712.807 m
+233.781 79.259 l
+265.339 712.807 m
+265.339 79.259 l
+297.016 712.807 m
+297.016 79.259 l
+328.693 712.807 m
+328.693 79.259 l
+360.371 712.807 m
+360.371 79.259 l
+391.928 712.807 m
+391.928 79.259 l
+202.104 712.807 m
+391.928 712.807 l
+202.104 673.21 m
+391.928 673.21 l
+202.104 633.613 m
+391.928 633.613 l
+202.104 594.016 m
+391.928 594.016 l
+202.104 554.42 m
+391.928 554.42 l
+202.104 514.823 m
+391.928 514.823 l
+202.104 475.226 m
+391.928 475.226 l
+202.104 435.63 m
+391.928 435.63 l
+202.104 396.033 m
+391.928 396.033 l
+202.104 356.436 m
+391.928 356.436 l
+202.104 316.84 m
+391.928 316.84 l
+202.104 277.243 m
+391.928 277.243 l
+202.104 237.646 m
+391.928 237.646 l
+202.104 198.049 m
+391.928 198.049 l
+202.104 158.453 m
+391.928 158.453 l
+202.104 118.856 m
+391.928 118.856 l
+202.104 79.259 m
+391.928 79.259 l
+S
+BT
+/F7 1 Tf
+21.998 0 0 21.998 209.6633 687.6086 Tm
+0 g
+0 Tc
+()Tj
+0 -1.8 TD
+()Tj
+T*
+()Tj
+T*
+()Tj
+T*
+()Tj
+T*
+()Tj
+T*
+()Tj
+T*
+()Tj
+T*
+( )Tj
+T*
+(\012)Tj
+/F9 1 Tf
+0.2673 -1.8 TD
+()Tj
+T*
+()Tj
+/F7 1 Tf
+-0.3436 -1.8 TD
+( )Tj
+T*
+( )Tj
+0.2018 -1.8 TD
+(\015)Tj
+T*
+()Tj
+1.2491 27.0002 TD
+()Tj
+0 -1.8 TD
+()Tj
+0.06 -1.8 TD
+()Tj
+T*
+()Tj
+0.2127 -1.8 TD
+()Tj
+T*
+()Tj
+-0.1636 -1.8 TD
+()Tj
+T*
+()Tj
+0.1855 -1.8 TD
+()Tj
+T*
+()Tj
+-0.1418 -1.8 TD
+()Tj
+T*
+()Tj
+-0.0927 -1.8 TD
+()Tj
+T*
+()Tj
+0.2127 -1.8 TD
+()Tj
+T*
+()Tj
+1.2764 27.0002 TD
+()Tj
+0 -1.8 TD
+( )Tj
+0.1855 -1.8 TD
+(!)Tj
+T*
+(")Tj
+-0.1418 -1.8 TD
+(#)Tj
+T*
+($)Tj
+-0.0927 -1.8 TD
+(%)Tj
+T*
+(&)Tj
+T*
+(')Tj
+T*
+(\()Tj
+0.0927 -1.8 TD
+(\))Tj
+-0.0927 -1.8 TD
+(*)Tj
+T*
+(+)Tj
+T*
+(,)Tj
+T*
+(-)Tj
+T*
+(.)Tj
+1.44 27.0002 TD
+(/)Tj
+0 -1.8 TD
+(0)Tj
+T*
+(1)Tj
+T*
+(2)Tj
+T*
+(3)Tj
+T*
+(4)Tj
+T*
+(5)Tj
+T*
+(6)Tj
+0.2018 -1.8 TD
+(7)Tj
+-0.2018 -1.8 TD
+(8)Tj
+T*
+(9)Tj
+T*
+(:)Tj
+T*
+(;)Tj
+T*
+(<)Tj
+T*
+(=)Tj
+T*
+(>)Tj
+1.44 27.0002 TD
+(?)Tj
+0 -1.8 TD
+(@)Tj
+T*
+(A)Tj
+T*
+(B)Tj
+T*
+(C)Tj
+T*
+(D)Tj
+0.2018 -1.8 TD
+(E)Tj
+-0.2018 -1.8 TD
+(F)Tj
+T*
+(G)Tj
+T*
+(H)Tj
+T*
+(I)Tj
+T*
+(J)Tj
+T*
+(K)Tj
+T*
+(L)Tj
+T*
+(M)Tj
+T*
+(N)Tj
+1.4346 27.0002 TD
+(O)Tj
+0 -1.8 TD
+(P)Tj
+T*
+(Q)Tj
+T*
+(R)Tj
+T*
+(S)Tj
+T*
+(T)Tj
+T*
+(U)Tj
+T*
+(V)Tj
+/F11 1 Tf
+5.9995 0 0 5.9995 212.183 675.2496 Tm
+0.004 Tc
+[(25A)11(0)]TJ
+0 -6.6 TD
+[(25A)11(1)]TJ
+T*
+[(25A)11(2)]TJ
+T*
+[(25A)11(3)]TJ
+T*
+[(25A)11(4)]TJ
+T*
+[(25A)11(5)]TJ
+T*
+[(25A)11(6)]TJ
+T*
+[(25A)11(7)]TJ
+T*
+[(25A)11(8)]TJ
+T*
+[(25A)11(9)]TJ
+-0.04 -6.6 TD
+[(25A)11(A)]TJ
+T*
+[(25A)11(B)]TJ
+-0.04 -6.6 TD
+[(25A)11(C)]TJ
+T*
+[(25A)11(D)]TJ
+0.04 -6.6 TD
+[(25A)11(E)]TJ
+0.02 -6.6 TD
+[(25A)11(F)]TJ
+5.28 99 TD
+[(25B)11(0)]TJ
+0 -6.6 TD
+[(25B)11(1)]TJ
+T*
+[(25B)11(2)]TJ
+T*
+[(25B)11(3)]TJ
+T*
+[(25B)11(4)]TJ
+T*
+[(25B)11(5)]TJ
+T*
+[(25B)11(6)]TJ
+T*
+[(25B)11(7)]TJ
+T*
+[(25B)11(8)]TJ
+T*
+[(25B)11(9)]TJ
+-0.04 -6.6 TD
+[(25B)11(A)]TJ
+T*
+[(25B)11(B)]TJ
+-0.04 -6.6 TD
+[(25B)11(C)]TJ
+T*
+[(25B)11(D)]TJ
+0.04 -6.6 TD
+[(25B)11(E)]TJ
+0.02 -6.6 TD
+[(25B)11(F)]TJ
+5.26 99 TD
+0.0053 Tc
+(25C0)Tj
+0 -6.6 TD
+(25C1)Tj
+T*
+(25C2)Tj
+T*
+(25C3)Tj
+T*
+(25C4)Tj
+T*
+(25C5)Tj
+T*
+(25C6)Tj
+T*
+(25C7)Tj
+T*
+(25C8)Tj
+T*
+(25C9)Tj
+-0.04 -6.6 TD
+(25CA)Tj
+T*
+(25CB)Tj
+-0.02 -6.6 TD
+(25CC)Tj
+T*
+(25CD)Tj
+0.02 -6.6 TD
+(25CE)Tj
+0.02 -6.6 TD
+(25CF)Tj
+5.3 99 TD
+(25D0)Tj
+0 -6.6 TD
+(25D1)Tj
+T*
+(25D2)Tj
+T*
+(25D3)Tj
+T*
+(25D4)Tj
+T*
+(25D5)Tj
+T*
+(25D6)Tj
+T*
+(25D7)Tj
+T*
+(25D8)Tj
+T*
+(25D9)Tj
+-0.04 -6.6 TD
+(25DA)Tj
+T*
+(25DB)Tj
+-0.02 -6.6 TD
+(25DC)Tj
+T*
+(25DD)Tj
+0.02 -6.6 TD
+(25DE)Tj
+0.02 -6.6 TD
+(25DF)Tj
+5.34 99 TD
+0.004 Tc
+[(25E)11(0)]TJ
+0 -6.6 TD
+[(25E)11(1)]TJ
+T*
+[(25E)11(2)]TJ
+T*
+[(25E)11(3)]TJ
+T*
+[(25E)11(4)]TJ
+T*
+[(25E)11(5)]TJ
+T*
+[(25E)11(6)]TJ
+T*
+[(25E)11(7)]TJ
+T*
+[(25E)11(8)]TJ
+T*
+[(25E)11(9)]TJ
+-0.04 -6.6 TD
+[(25E)11(A)]TJ
+T*
+[(25E)11(B)]TJ
+-0.04 -6.6 TD
+[(25E)11(C)]TJ
+T*
+[(25E)11(D)]TJ
+0.04 -6.6 TD
+[(25E)11(E)]TJ
+0.02 -6.6 TD
+[(25E)11(F)]TJ
+5.3 99 TD
+0.0023 Tc
+(25F0)Tj
+0 -6.6 TD
+(25F1)Tj
+T*
+(25F2)Tj
+T*
+(25F3)Tj
+T*
+(25F4)Tj
+T*
+(25F5)Tj
+T*
+(25F6)Tj
+T*
+(25F7)Tj
+/F6 1 Tf
+9.999 0 0 9.999 191.4248 687.6086 Tm
+0 Tc
+(0)Tj
+0 -3.9601 TD
+(1)Tj
+T*
+(2)Tj
+T*
+(3)Tj
+T*
+(4)Tj
+T*
+(5)Tj
+T*
+(6)Tj
+T*
+(7)Tj
+T*
+(8)Tj
+T*
+(9)Tj
+-0.06 -3.9601 TD
+(A)Tj
+T*
+(B)Tj
+-0.024 -3.9601 TD
+(C)Tj
+T*
+(D)Tj
+0.024 -3.9601 TD
+(E)Tj
+0.024 -3.9601 TD
+(F)Tj
+ET
+1.49 w
+202.104 727.685 m
+202.104 79.259 l
+391.928 727.685 m
+391.928 79.259 l
+202.104 712.807 m
+391.928 712.807 l
+202.104 79.259 m
+391.928 79.259 l
+S
+test 2 done
diff --git a/qpdf/qtest/qpdf/fix1.qdf b/qpdf/qtest/qpdf/fix1.qdf
new file mode 100644
index 00000000..091372fc
--- /dev/null
+++ b/qpdf/qtest/qpdf/fix1.qdf
@@ -0,0 +1,111 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents [ 4 0 R 8 0 R ]
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato Soup) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+8 0 obj
+<<
+ /Length 9 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 648 Td
+ (and Salad) Tj
+ET
+endstream
+endobj
+
+9 0 obj
+0
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 8
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/fix1.qdf.out b/qpdf/qtest/qpdf/fix1.qdf.out
new file mode 100644
index 00000000..d436bce7
--- /dev/null
+++ b/qpdf/qtest/qpdf/fix1.qdf.out
@@ -0,0 +1,113 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents [ 4 0 R 8 0 R ]
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato Soup) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+49
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+8 0 obj
+<<
+ /Length 9 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 648 Td
+ (and Salad) Tj
+ET
+endstream
+endobj
+
+9 0 obj
+47
+endobj
+
+xref
+0 10
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000386 00000 n
+0000000490 00000 n
+0000000509 00000 n
+0000000627 00000 n
+0000000662 00000 n
+0000000764 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 10
+>>
+startxref
+783
+%%EOF
diff --git a/qpdf/qtest/qpdf/fix2.qdf b/qpdf/qtest/qpdf/fix2.qdf
new file mode 100644
index 00000000..c368523e
--- /dev/null
+++ b/qpdf/qtest/qpdf/fix2.qdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/fix2.qdf.out b/qpdf/qtest/qpdf/fix2.qdf.out
new file mode 100644
index 00000000..ccccaa9e
--- /dev/null
+++ b/qpdf/qtest/qpdf/fix2.qdf.out
Binary files differ
diff --git a/qpdf/qtest/qpdf/good1.out b/qpdf/qtest/qpdf/good1.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good1.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good1.pdf b/qpdf/qtest/qpdf/good1.pdf
new file mode 100644
index 00000000..55b7a764
--- /dev/null
+++ b/qpdf/qtest/qpdf/good1.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/good1.qdf b/qpdf/qtest/qpdf/good1.qdf
new file mode 100644
index 00000000..976ed2b2
--- /dev/null
+++ b/qpdf/qtest/qpdf/good1.qdf
@@ -0,0 +1,95 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good10.out b/qpdf/qtest/qpdf/good10.out
new file mode 100644
index 00000000..3c0bed95
--- /dev/null
+++ b/qpdf/qtest/qpdf/good10.out
@@ -0,0 +1,8 @@
+/QTest is direct
+/QTest is an array with 3 items
+ item 0 is direct
+ item 1 is direct
+ item 2 is indirect
+unparse: [ 1 (2) 8 0 R ]
+unparseResolved: [ 1 (2) 8 0 R ]
+test 1 done
diff --git a/qpdf/qtest/qpdf/good10.pdf b/qpdf/qtest/qpdf/good10.pdf
new file mode 100644
index 00000000..13a88101
--- /dev/null
+++ b/qpdf/qtest/qpdf/good10.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest [1 (2) 8 0 R]
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good10.qdf b/qpdf/qtest/qpdf/good10.qdf
new file mode 100644
index 00000000..c2e7a50c
--- /dev/null
+++ b/qpdf/qtest/qpdf/good10.qdf
@@ -0,0 +1,100 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /QTest [
+ 1
+ (2)
+ null
+ ]
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good11.out b/qpdf/qtest/qpdf/good11.out
new file mode 100644
index 00000000..676a0343
--- /dev/null
+++ b/qpdf/qtest/qpdf/good11.out
@@ -0,0 +1,6 @@
+/QTest is direct
+/QTest is a dictionary
+ /a is direct
+unparse: << /a (a) /b 8 0 R >>
+unparseResolved: << /a (a) /b 8 0 R >>
+test 1 done
diff --git a/qpdf/qtest/qpdf/good11.pdf b/qpdf/qtest/qpdf/good11.pdf
new file mode 100644
index 00000000..4e18be7b
--- /dev/null
+++ b/qpdf/qtest/qpdf/good11.pdf
@@ -0,0 +1,81 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest << /a(a)
+ /b 8 0 R >>
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good11.qdf b/qpdf/qtest/qpdf/good11.qdf
new file mode 100644
index 00000000..3d673b04
--- /dev/null
+++ b/qpdf/qtest/qpdf/good11.qdf
@@ -0,0 +1,98 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /QTest <<
+ /a (a)
+ >>
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good12.out b/qpdf/qtest/qpdf/good12.out
new file mode 100644
index 00000000..b75d27b1
--- /dev/null
+++ b/qpdf/qtest/qpdf/good12.out
@@ -0,0 +1,13 @@
+/QTest is indirect
+/QTest is a stream. Dictionary: << /Filter /FlateDecode /Length 123 >>
+Raw stream data:
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+Uncompressed stream data:
+This stream is not very interesting, but it is long enough that
+compressing shrinks it somewhat. Or maybe not. But it doesn't really
+matter that much.
+
+End of stream data
+unparse: 7 0 R
+unparseResolved: 7 0 R
+test 1 done
diff --git a/qpdf/qtest/qpdf/good12.pdf b/qpdf/qtest/qpdf/good12.pdf
new file mode 100644
index 00000000..8d91aef8
--- /dev/null
+++ b/qpdf/qtest/qpdf/good12.pdf
@@ -0,0 +1,93 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj
+<<
+ % Comment
+ /Length
+ 123
+ /Filter /FlateDecode
+>>
+stream
+xœ%11 û¼b;tà4| wXIDì Øå÷8G·«Í>rQ¨uŠ OÒ êEŒ:©IWìÃPlíµII)Ãr´p4~;§ÎAs/òÒ…jcúú¾÷Žs§åözû»žT.?®uŽæ§<Ž¼…Ð*6ä
+endstream
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+0000000556 00000 n
+trailer <<
+ /Size 8
+ /Root 1 0 R
+ /QTest 7 0 R
+>>
+startxref
+770
+%%EOF
diff --git a/qpdf/qtest/qpdf/good12.qdf b/qpdf/qtest/qpdf/good12.qdf
new file mode 100644
index 00000000..107f3d04
--- /dev/null
+++ b/qpdf/qtest/qpdf/good12.qdf
@@ -0,0 +1,113 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 4 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Length 3 0 R
+>>
+stream
+This stream is not very interesting, but it is long enough that
+compressing shrinks it somewhat. Or maybe not. But it doesn't really
+matter that much.
+endstream
+endobj
+
+3 0 obj
+153
+endobj
+
+4 0 obj
+<<
+ /Count 1
+ /Kids [
+ 5 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+5 0 obj
+<<
+ /Contents 6 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 4 0 R
+ /Resources <<
+ /Font <<
+ /F1 8 0 R
+ >>
+ /ProcSet 9 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+6 0 obj
+<<
+ /Length 7 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+7 0 obj
+44
+endobj
+
+8 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+9 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 10
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000287 00000 n
+0000000307 00000 n
+0000000389 00000 n
+0000000604 00000 n
+0000000703 00000 n
+0000000722 00000 n
+0000000840 00000 n
+trailer <<
+ /QTest 2 0 R
+ /Root 1 0 R
+ /Size 10
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+875
+%%EOF
diff --git a/qpdf/qtest/qpdf/good13.out b/qpdf/qtest/qpdf/good13.out
new file mode 100644
index 00000000..a75f68c5
--- /dev/null
+++ b/qpdf/qtest/qpdf/good13.out
@@ -0,0 +1,9 @@
+/QTest is indirect
+/QTest is a dictionary
+ /hex strings is direct
+ /indirect is indirect
+ /nesting is direct
+ /strings is direct
+unparse: 7 0 R
+unparseResolved: << /hex#20strings [ (Potato) <01020300040560> (AB) ] /indirect 8 0 R /nesting << /a [ 1 2 << /x (y) >> [ (z) ] ] /b << / (legal) /a [ 1 2 ] >> >> /strings [ (one) ($¢) () (\(\)) (\() (\)) (a\f\b\t\r\nb) <410042> (a\nb) (a b) ] >>
+test 1 done
diff --git a/qpdf/qtest/qpdf/good13.pdf b/qpdf/qtest/qpdf/good13.pdf
new file mode 100644
index 00000000..516774c5
--- /dev/null
+++ b/qpdf/qtest/qpdf/good13.pdf
@@ -0,0 +1,101 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj
+<<
+ /strings [(one) ($\242) () (()) (\() (\)) (a\f\b\t\r\nb) (A\000B) (a
+b) (a \
+b)]
+ /hex#20strings [<506F7461746f> <010 203 0004056> <41
+42>]
+ /indirect 8 0 R
+ /n#65sting <<
+ /a [1 2 << /x (y) >> [(z)]]
+ /b <</a [1 2] / (legal)>>
+ >>
+>>
+endobj
+
+8 0 obj
+(hello)
+endobj
+
+xref
+0 9
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+0000000556 00000 n
+0000000822 00000 n
+trailer <<
+ /Size 9
+ /Root 1 0 R
+ /QTest 7 0 R
+>>
+startxref
+846
+%%EOF
diff --git a/qpdf/qtest/qpdf/good13.qdf b/qpdf/qtest/qpdf/good13.qdf
new file mode 100644
index 00000000..c2f50c0f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good13.qdf
@@ -0,0 +1,139 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 3 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /hex#20strings [
+ (Potato)
+ <01020300040560>
+ (AB)
+ ]
+ /indirect (hello)
+ /nesting <<
+ /a [
+ 1
+ 2
+ <<
+ /x (y)
+ >>
+ [
+ (z)
+ ]
+ ]
+ /b <<
+ / (legal)
+ /a [
+ 1
+ 2
+ ]
+ >>
+ >>
+ /strings [
+ (one)
+ ($¢)
+ ()
+ (\(\))
+ (\()
+ (\))
+ (a\f\b\t\r\nb)
+ <410042>
+ (a\nb)
+ (a b)
+ ]
+>>
+endobj
+
+3 0 obj
+<<
+ /Count 1
+ /Kids [
+ 4 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+4 0 obj
+<<
+ /Contents 5 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 7 0 R
+ >>
+ /ProcSet 8 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+5 0 obj
+<<
+ /Length 6 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+6 0 obj
+44
+endobj
+
+7 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+8 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 9
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000495 00000 n
+0000000577 00000 n
+0000000792 00000 n
+0000000891 00000 n
+0000000910 00000 n
+0000001028 00000 n
+trailer <<
+ /QTest 2 0 R
+ /Root 1 0 R
+ /Size 9
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+1063
+%%EOF
diff --git a/qpdf/qtest/qpdf/good14.out b/qpdf/qtest/qpdf/good14.out
new file mode 100644
index 00000000..c8e5fc9b
--- /dev/null
+++ b/qpdf/qtest/qpdf/good14.out
@@ -0,0 +1,39 @@
+-- stream 0 --
+A %here is a comment
+B % here is another with CR
+A B
+
+one
+two
+three lines
+(string with \r\nCRNL)
+ and another
+ indentation
+(\001B%DEF)<01>
+<8a8b>
+(ab)
+<8c>(Ý) ) >
+<610062> (MOO)
+-- stream 1 --
+This stream does end with a newline.
+// tests:
+// bad tokens preserved
+// comments
+// indentation
+// CR/NL inside string literal -- changed to \r or \n, newline follows
+// whitespace in hexstring (removed)
+// strings normalized
+// newlines normalized
+// names normalized
+// trailing space (preserved)
+// final newline added
+
+/bad#name
+
+/good name
+/bad#00name
+-- stream 2 --
+(This stream ends with a \001 bad token
+-- stream 3 --
+<AB X
+test 3 done
diff --git a/qpdf/qtest/qpdf/good14.pdf b/qpdf/qtest/qpdf/good14.pdf
new file mode 100644
index 00000000..a6cd4bee
--- /dev/null
+++ b/qpdf/qtest/qpdf/good14.pdf
@@ -0,0 +1,142 @@
+%PDF-1.3 -*- coding: no-conversion -*-
+%¿›þ¢
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj
+<< /Length 9 0 R >>
+stream
+A %here is a comment
+B % here is another with CR
+A B
+one two three lines
+(string with
+CRNL) and another
+ indentation
+(B%DEF)()
+<8A
+8B><61 62><8c><DD> ) >
+(a\000b) <4D4F4F>endstream endobj
+
+8 0 obj
+<< /Length 385 >>
+stream
+This stream does end with a newline.
+// tests:
+// bad tokens preserved
+// comments
+// indentation
+// CR/NL inside string literal -- changed to \r or \n, newline follows
+// whitespace in hexstring (removed)
+// strings normalized
+// newlines normalized
+// names normalized
+// trailing space (preserved)
+// final newline added
+
+/bad#name
+
+/g#6f#6Fd name
+/bad#00name
+endstream
+endobj
+
+9 0 obj
+181
+endobj
+
+10 0 obj
+<< /Length 40 >>
+stream
+(This stream ends with a \001 bad token
+endstream
+endobj
+
+11 0 obj
+<< /Length 5 >>
+stream
+<AB X
+endstream
+endobj
+
+xref
+0 12
+0000000000 65535 f
+0000000045 00000 n
+0000000099 00000 n
+0000000171 00000 n
+0000000343 00000 n
+0000000439 00000 n
+0000000474 00000 n
+0000000592 00000 n
+0000000827 00000 n
+0000001263 00000 n
+0000001283 00000 n
+0000001374 00000 n
+trailer <<
+ /Size 12
+ /Root 1 0 R
+ /QStreams [ 7 0 R 8 0 R 10 0 R 11 0 R ]
+>>
+startxref
+1430
+%%EOF
diff --git a/qpdf/qtest/qpdf/good14.qdf b/qpdf/qtest/qpdf/good14.qdf
new file mode 100644
index 00000000..07ac0240
--- /dev/null
+++ b/qpdf/qtest/qpdf/good14.qdf
@@ -0,0 +1,189 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 10 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Length 3 0 R
+>>
+stream
+A %here is a comment
+B % here is another with CR
+A B
+one two three lines
+(string with
+CRNL) and another
+ indentation
+(B%DEF)()
+<8A
+8B><61 62><8c><DD> ) >
+(a\000b) <4D4F4F>
+endstream
+endobj
+
+%QDF: ignore_newline
+3 0 obj
+181
+endobj
+
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+This stream does end with a newline.
+// tests:
+// bad tokens preserved
+// comments
+// indentation
+// CR/NL inside string literal -- changed to \r or \n, newline follows
+// whitespace in hexstring (removed)
+// strings normalized
+// newlines normalized
+// names normalized
+// trailing space (preserved)
+// final newline added
+
+/bad#name
+
+/g#6f#6Fd name
+/bad#00name
+endstream
+endobj
+
+5 0 obj
+385
+endobj
+
+6 0 obj
+<<
+ /Length 7 0 R
+>>
+stream
+(This stream ends with a \001 bad token
+endstream
+endobj
+
+7 0 obj
+40
+endobj
+
+8 0 obj
+<<
+ /Length 9 0 R
+>>
+stream
+<AB X
+endstream
+endobj
+
+%QDF: ignore_newline
+9 0 obj
+5
+endobj
+
+10 0 obj
+<<
+ /Count 1
+ /Kids [
+ 11 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+11 0 obj
+<<
+ /Contents 12 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 10 0 R
+ /Resources <<
+ /Font <<
+ /F1 14 0 R
+ >>
+ /ProcSet 15 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+12 0 obj
+<<
+ /Length 13 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+13 0 obj
+44
+endobj
+
+14 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+15 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 16
+0000000000 65535 f
+0000000025 00000 n
+0000000080 00000 n
+0000000338 00000 n
+0000000358 00000 n
+0000000798 00000 n
+0000000818 00000 n
+0000000913 00000 n
+0000000932 00000 n
+0000001014 00000 n
+0000001032 00000 n
+0000001116 00000 n
+0000001336 00000 n
+0000001437 00000 n
+0000001457 00000 n
+0000001576 00000 n
+trailer <<
+ /QStreams [
+ 2 0 R
+ 4 0 R
+ 6 0 R
+ 8 0 R
+ ]
+ /Root 1 0 R
+ /Size 16
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+1612
+%%EOF
diff --git a/qpdf/qtest/qpdf/good15.out b/qpdf/qtest/qpdf/good15.out
new file mode 100644
index 00000000..884ea6ed
--- /dev/null
+++ b/qpdf/qtest/qpdf/good15.out
@@ -0,0 +1,5 @@
+/QTest is direct
+/QTest is a name with value /oink
+unparse: /oink
+unparseResolved: /oink
+test 1 done
diff --git a/qpdf/qtest/qpdf/good15.pdf b/qpdf/qtest/qpdf/good15.pdf
new file mode 100644
index 00000000..5981765a
--- /dev/null
+++ b/qpdf/qtest/qpdf/good15.pdf
@@ -0,0 +1,79 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+
+BT
+/F1 24 Tf 72 720 Td
+ (Potato) Tj ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest /oink
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good15.qdf b/qpdf/qtest/qpdf/good15.qdf
new file mode 100644
index 00000000..c60469c1
--- /dev/null
+++ b/qpdf/qtest/qpdf/good15.qdf
@@ -0,0 +1,97 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+
+BT
+/F1 24 Tf
+72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+43
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000474 00000 n
+0000000493 00000 n
+0000000611 00000 n
+trailer <<
+ /QTest /oink
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+646
+%%EOF
diff --git a/qpdf/qtest/qpdf/good16.out b/qpdf/qtest/qpdf/good16.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good16.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good16.pdf b/qpdf/qtest/qpdf/good16.pdf
new file mode 100644
index 00000000..1a468202
--- /dev/null
+++ b/qpdf/qtest/qpdf/good16.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/good16.qdf b/qpdf/qtest/qpdf/good16.qdf
new file mode 100644
index 00000000..b98326ae
--- /dev/null
+++ b/qpdf/qtest/qpdf/good16.qdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/good17-not-qdf.pdf b/qpdf/qtest/qpdf/good17-not-qdf.pdf
new file mode 100644
index 00000000..53eadd79
--- /dev/null
+++ b/qpdf/qtest/qpdf/good17-not-qdf.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/good17-not-recompressed.pdf b/qpdf/qtest/qpdf/good17-not-recompressed.pdf
new file mode 100644
index 00000000..b6e3a530
--- /dev/null
+++ b/qpdf/qtest/qpdf/good17-not-recompressed.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/good17.out b/qpdf/qtest/qpdf/good17.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good17.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good17.pdf b/qpdf/qtest/qpdf/good17.pdf
new file mode 100644
index 00000000..f0c66b35
--- /dev/null
+++ b/qpdf/qtest/qpdf/good17.pdf
@@ -0,0 +1,1550 @@
+%PDF-1.5
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /PageLabels 107 0 R
+ /Pages 2 0 R
+ /Type /Catalog
+ /PageMode /UseOutlines
+ /Outlines 95 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 30
+ /Kids [
+ 3 0 R
+ 4 0 R
+ 5 0 R
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ 19 0 R
+ 20 0 R
+ 21 0 R
+ 22 0 R
+ 23 0 R
+ 24 0 R
+ 25 0 R
+ 26 0 R
+ 27 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 31 0 R
+ 32 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 33 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+4 0 obj
+<<
+ /Contents 37 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+5 0 obj
+<<
+ /Contents 39 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+6 0 obj
+<<
+ /Contents 41 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+7 0 obj
+<<
+ /Contents 43 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 6
+8 0 obj
+<<
+ /Contents 45 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+9 0 obj
+<<
+ /Contents 47 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+10 0 obj
+<<
+ /Contents 49 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+11 0 obj
+<<
+ /Contents 51 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+12 0 obj
+<<
+ /Contents 53 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+13 0 obj
+<<
+ /Contents 55 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+14 0 obj
+<<
+ /Contents 57 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+15 0 obj
+<<
+ /Contents 59 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 14
+16 0 obj
+<<
+ /Contents 61 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 15
+17 0 obj
+<<
+ /Contents 63 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 16
+18 0 obj
+<<
+ /Contents 65 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 17
+19 0 obj
+<<
+ /Contents 67 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 18
+20 0 obj
+<<
+ /Contents 69 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 19
+21 0 obj
+<<
+ /Contents 71 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 20
+22 0 obj
+<<
+ /Contents 73 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 21
+23 0 obj
+<<
+ /Contents 75 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 22
+24 0 obj
+<<
+ /Contents 77 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 23
+25 0 obj
+<<
+ /Contents 79 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 24
+26 0 obj
+<<
+ /Contents 81 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 25
+27 0 obj
+<<
+ /Contents 83 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 26
+28 0 obj
+<<
+ /Contents 85 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 27
+29 0 obj
+<<
+ /Contents 87 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 28
+30 0 obj
+<<
+ /Contents 89 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 29
+31 0 obj
+<<
+ /Contents 91 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 30
+32 0 obj
+<<
+ /Contents 93 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+33 0 obj
+<<
+ /Length 34 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+34 0 obj
+46
+endobj
+
+35 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+36 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+37 0 obj
+<<
+ /Length 38 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+38 0 obj
+46
+endobj
+
+%% Contents for page 3
+39 0 obj
+<<
+ /Length 40 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+40 0 obj
+46
+endobj
+
+%% Contents for page 4
+41 0 obj
+<<
+ /Length 42 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+42 0 obj
+46
+endobj
+
+%% Contents for page 5
+43 0 obj
+<<
+ /Length 44 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+44 0 obj
+46
+endobj
+
+%% Contents for page 6
+45 0 obj
+<<
+ /Length 46 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+46 0 obj
+46
+endobj
+
+%% Contents for page 7
+47 0 obj
+<<
+ /Length 48 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+48 0 obj
+46
+endobj
+
+%% Contents for page 8
+49 0 obj
+<<
+ /Length 50 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+50 0 obj
+46
+endobj
+
+%% Contents for page 9
+51 0 obj
+<<
+ /Length 52 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+52 0 obj
+46
+endobj
+
+%% Contents for page 10
+53 0 obj
+<<
+ /Length 54 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+54 0 obj
+46
+endobj
+
+%% Contents for page 11
+55 0 obj
+<<
+ /Length 56 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 10) Tj
+ET
+endstream
+endobj
+
+56 0 obj
+47
+endobj
+
+%% Contents for page 12
+57 0 obj
+<<
+ /Length 58 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+58 0 obj
+47
+endobj
+
+%% Contents for page 13
+59 0 obj
+<<
+ /Length 60 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 12) Tj
+ET
+endstream
+endobj
+
+60 0 obj
+47
+endobj
+
+%% Contents for page 14
+61 0 obj
+<<
+ /Length 62 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+62 0 obj
+47
+endobj
+
+%% Contents for page 15
+63 0 obj
+<<
+ /Length 64 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 14) Tj
+ET
+endstream
+endobj
+
+64 0 obj
+47
+endobj
+
+%% Contents for page 16
+65 0 obj
+<<
+ /Length 66 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 15) Tj
+ET
+endstream
+endobj
+
+66 0 obj
+47
+endobj
+
+%% Contents for page 17
+67 0 obj
+<<
+ /Length 68 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 16) Tj
+ET
+endstream
+endobj
+
+68 0 obj
+47
+endobj
+
+%% Contents for page 18
+69 0 obj
+<<
+ /Length 70 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 17) Tj
+ET
+endstream
+endobj
+
+70 0 obj
+47
+endobj
+
+%% Contents for page 19
+71 0 obj
+<<
+ /Length 72 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 18) Tj
+ET
+endstream
+endobj
+
+72 0 obj
+47
+endobj
+
+%% Contents for page 20
+73 0 obj
+<<
+ /Length 74 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 19) Tj
+ET
+endstream
+endobj
+
+74 0 obj
+47
+endobj
+
+%% Contents for page 21
+75 0 obj
+<<
+ /Length 76 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 20) Tj
+ET
+endstream
+endobj
+
+76 0 obj
+47
+endobj
+
+%% Contents for page 22
+77 0 obj
+<<
+ /Length 78 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 21) Tj
+ET
+endstream
+endobj
+
+78 0 obj
+47
+endobj
+
+%% Contents for page 23
+79 0 obj
+<<
+ /Length 80 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 22) Tj
+ET
+endstream
+endobj
+
+80 0 obj
+47
+endobj
+
+%% Contents for page 24
+81 0 obj
+<<
+ /Length 82 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 23) Tj
+ET
+endstream
+endobj
+
+82 0 obj
+47
+endobj
+
+%% Contents for page 25
+83 0 obj
+<<
+ /Length 84 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 24) Tj
+ET
+endstream
+endobj
+
+84 0 obj
+47
+endobj
+
+%% Contents for page 26
+85 0 obj
+<<
+ /Length 86 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 25) Tj
+ET
+endstream
+endobj
+
+86 0 obj
+47
+endobj
+
+%% Contents for page 27
+87 0 obj
+<<
+ /Length 88 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 26) Tj
+ET
+endstream
+endobj
+
+88 0 obj
+47
+endobj
+
+%% Contents for page 28
+89 0 obj
+<<
+ /Length 90 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 27) Tj
+ET
+endstream
+endobj
+
+90 0 obj
+47
+endobj
+
+%% Contents for page 29
+91 0 obj
+<<
+ /Length 92 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 28) Tj
+ET
+endstream
+endobj
+
+92 0 obj
+47
+endobj
+
+%% Contents for page 30
+93 0 obj
+<<
+ /Length 94 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 29) Tj
+ET
+endstream
+endobj
+
+94 0 obj
+47
+endobj
+
+xref
+0 111
+0000000095 65535 f
+0000000025 00000 n
+0000000145 00000 n
+0000000541 00000 n
+0000000746 00000 n
+0000000951 00000 n
+0000001156 00000 n
+0000001361 00000 n
+0000001566 00000 n
+0000001771 00000 n
+0000001976 00000 n
+0000002182 00000 n
+0000002389 00000 n
+0000002596 00000 n
+0000002803 00000 n
+0000003010 00000 n
+0000003217 00000 n
+0000003424 00000 n
+0000003631 00000 n
+0000003838 00000 n
+0000004045 00000 n
+0000004252 00000 n
+0000004459 00000 n
+0000004666 00000 n
+0000004873 00000 n
+0000005080 00000 n
+0000005287 00000 n
+0000005494 00000 n
+0000005701 00000 n
+0000005908 00000 n
+0000006115 00000 n
+0000006322 00000 n
+0000006529 00000 n
+0000006748 00000 n
+0000006851 00000 n
+0000006871 00000 n
+0000006990 00000 n
+0000007049 00000 n
+0000007152 00000 n
+0000007195 00000 n
+0000007298 00000 n
+0000007341 00000 n
+0000007444 00000 n
+0000007487 00000 n
+0000007590 00000 n
+0000007633 00000 n
+0000007736 00000 n
+0000007779 00000 n
+0000007882 00000 n
+0000007925 00000 n
+0000008028 00000 n
+0000008071 00000 n
+0000008174 00000 n
+0000008218 00000 n
+0000008321 00000 n
+0000008365 00000 n
+0000008469 00000 n
+0000008513 00000 n
+0000008617 00000 n
+0000008661 00000 n
+0000008765 00000 n
+0000008809 00000 n
+0000008913 00000 n
+0000008957 00000 n
+0000009061 00000 n
+0000009105 00000 n
+0000009209 00000 n
+0000009253 00000 n
+0000009357 00000 n
+0000009401 00000 n
+0000009505 00000 n
+0000009549 00000 n
+0000009653 00000 n
+0000009697 00000 n
+0000009801 00000 n
+0000009845 00000 n
+0000009949 00000 n
+0000009993 00000 n
+0000010097 00000 n
+0000010141 00000 n
+0000010245 00000 n
+0000010289 00000 n
+0000010393 00000 n
+0000010437 00000 n
+0000010541 00000 n
+0000010585 00000 n
+0000010689 00000 n
+0000010733 00000 n
+0000010837 00000 n
+0000010881 00000 n
+0000010985 00000 n
+0000011029 00000 n
+0000011133 00000 n
+0000011177 00000 n
+0000011281 00000 n
+0000000096 65535 f
+0000000097 65535 f
+0000000098 65535 f
+0000000099 65535 f
+0000000100 65535 f
+0000000101 65535 f
+0000000102 65535 f
+0000000103 65535 f
+0000000104 65535 f
+0000000105 65535 f
+0000000106 65535 f
+0000000107 65535 f
+0000000108 65535 f
+0000000109 65535 f
+0000000110 65535 f
+0000000000 65535 f
+trailer <<
+ /Root 1 0 R
+ /Size 111
+>>
+startxref
+11301
+%%EOF
+
+108 0 obj
+<<
+ /Type /ObjStm
+ /N 10
+ /First 81
+ /Length 1806
+>>
+stream
+95 0
+96 75
+97 260
+98 394
+99 557
+100 899
+101 1078
+102 1276
+103 1433
+104 1590
+% 95
+<<
+ /Type /Outlines
+ /First 96 0 R
+ /Last 97 0 R
+ /Count 6
+>>
+% 96
+<<
+ /Type /Outline
+ /Title (Isís 1 -> 5: /XYZ null null null)
+ /Parent 95 0 R
+ /Count 4
+ /Next 97 0 R
+ /First 98 0 R
+ /Last 99 0 R
+ /Dest [ 8 0 R /XYZ null null null ]
+>>
+% 97
+<<
+ /Type /Outline
+ /Title (Trepak 2 -> 15: /XYZ 66 756 3)
+ /Parent 95 0 R
+ /Prev 96 0 R
+ /Dest [ 18 0 R /XYZ 66 756 3 ]
+>>
+% 98
+<<
+ /Type /Outline
+ /Title (Amanda 1.1 -> 11: /Fit)
+ /Parent 96 0 R
+ /Next 99 0 R
+ /First 100 0 R
+ /Last 101 0 R
+ /Count -3
+ /Dest [ 14 0 R /Fit ]
+>>
+% 99
+<<
+ /Type /Outline
+ % /Title (Sandy (Sandy [Greek]) 1.2 -> 13: /FitH 792)
+ /Title <feff00530061006e00640079002000f703a303b103bd03b403b900f700200031002e00320020002d003e002000310033003a0020002f00460069007400480020003700390032>
+ /Parent 96 0 R
+ /Prev 98 0 R
+ /First 105 0 R
+ /Last 106 0 R
+ /Count 2
+ /Dest [ 16 0 R /FitH 792 ]
+>>
+% 100
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1 -> 12: /FitV 100)
+ /Parent 98 0 R
+ /Next 101 0 R
+ /First 102 0 R
+ /Last 103 0 R
+ /Count -2
+ /Dest [ 15 0 R /FitV 100 ]
+>>
+% 101
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2 -> 12: /XYZ null null null)
+ /Parent 98 0 R
+ /Prev 100 0 R
+ /First 104 0 R
+ /Last 104 0 R
+ /Count 1
+ /Dest [ 15 0 R /XYZ null null null ]
+>>
+% 102
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null)
+ /Parent 100 0 R
+ /Next 103 0 R
+ /Dest [ 21 0 R /XYZ null null null ]
+>>
+% 103
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null)
+ /Parent 100 0 R
+ /Prev 102 0 R
+ /Dest [ 22 0 R /XYZ null null null ]
+>>
+% 104
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2.1 -> 22: /XYZ null null null)
+ /Parent 101 0 R
+ /Dest [ 25 0 R /XYZ null null null ]
+>>
+endstream
+endobj
+
+110 0 obj
+<<
+ /Type /ObjStm
+ /N 3
+ /First 28
+ /Length 636
+ /Extends 108 0 R
+>>
+stream
+105 0
+106 157
+107 310
+% 105
+<<
+ /Type /Outline
+ /Title (Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770)
+ /Parent 99 0 R
+ /Next 106 0 R
+ /Dest [ 4 0 R /FitR 66 714 180 770 ]
+>>
+% 106
+<<
+ /Type /Outline
+ /Title (Trepsicle 1.2.2 -> 0: /XYZ null null null)
+ /Parent 99 0 R
+ /Prev 105 0 R
+ /Dest [ 3 0 R /XYZ null null null ]
+>>
+% 107
+ << /Nums [
+ 0 << /P () >>
+ 2 << /S /r /St 1 >>
+ 7 << /P () >>
+ 9 << /S /r /St 6 >>
+ 11 << /P () >>
+ 12 << /S /D /St 2 >>
+ 15 << /S /D /St 6 >>
+ 19 << /P () >>
+ 20 << /S /D /St 12 >>
+ 22 << /S /D /St 16059 >>
+ 23 << /S /r /St 50 >>
+ 29 << /S /r /St 54 >>
+ ] >>
+endstream
+endobj
+
+109 0 obj
+<<
+ /Type /XRef
+ /Size 111
+ /Index [0 111]
+ /W [1 2 1]
+ /Length 444
+ /Root 1 0 R
+>>
+stream
+
+$
+endstream
+endobj
+
+xref
+0 0
+trailer <<
+ /Size 111
+ /Root 1 0 R
+ /Prev 11301
+ /XRefStm 16238
+>>
+
+startxref
+16808
+%%EOF
diff --git a/qpdf/qtest/qpdf/good17.qdf b/qpdf/qtest/qpdf/good17.qdf
new file mode 100644
index 00000000..ddd3a5ce
--- /dev/null
+++ b/qpdf/qtest/qpdf/good17.qdf
@@ -0,0 +1,1523 @@
+%PDF-1.5
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Outlines 3 0 R
+ /PageLabels 16 0 R
+ /PageMode /UseOutlines
+ /Pages 17 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /ObjStm
+ /Length 2179
+ /N 10
+ /First 102
+>>
+stream
+3 0
+4 100
+5 335
+6 520
+7 718
+8 1044
+9 1262
+10 1508
+11 1715
+12 1922
+%% Object stream: object 3, index 0
+<<
+ /Count 6
+ /First 4 0 R
+ /Last 5 0 R
+ /Type /Outlines
+>>
+%% Object stream: object 4, index 1
+<<
+ /Count 4
+ /Dest [
+ 18 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /First 6 0 R
+ /Last 7 0 R
+ /Next 5 0 R
+ /Parent 3 0 R
+ /Title (Isís 1 -> 5: /XYZ null null null)
+ /Type /Outline
+>>
+%% Object stream: object 5, index 2
+<<
+ /Dest [
+ 19 0 R
+ /XYZ
+ 66
+ 756
+ 3
+ ]
+ /Parent 3 0 R
+ /Prev 4 0 R
+ /Title (Trepak 2 -> 15: /XYZ 66 756 3)
+ /Type /Outline
+>>
+%% Object stream: object 6, index 3
+<<
+ /Count -3
+ /Dest [
+ 20 0 R
+ /Fit
+ ]
+ /First 8 0 R
+ /Last 9 0 R
+ /Next 7 0 R
+ /Parent 4 0 R
+ /Title (Amanda 1.1 -> 11: /Fit)
+ /Type /Outline
+>>
+%% Object stream: object 7, index 4
+<<
+ /Count 2
+ /Dest [
+ 21 0 R
+ /FitH
+ 792
+ ]
+ /First 14 0 R
+ /Last 15 0 R
+ /Parent 4 0 R
+ /Prev 6 0 R
+ /Title <feff00530061006e00640079002000f703a303b103bd03b403b900f700200031002e00320020002d003e002000310033003a0020002f00460069007400480020003700390032>
+ /Type /Outline
+>>
+%% Object stream: object 8, index 5
+<<
+ /Count -2
+ /Dest [
+ 22 0 R
+ /FitV
+ 100
+ ]
+ /First 10 0 R
+ /Last 11 0 R
+ /Next 9 0 R
+ /Parent 6 0 R
+ /Title (Isosicle 1.1.1 -> 12: /FitV 100)
+ /Type /Outline
+>>
+%% Object stream: object 9, index 6
+<<
+ /Count 1
+ /Dest [
+ 22 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /First 12 0 R
+ /Last 12 0 R
+ /Parent 6 0 R
+ /Prev 8 0 R
+ /Title (Isosicle 1.1.2 -> 12: /XYZ null null null)
+ /Type /Outline
+>>
+%% Object stream: object 10, index 7
+<<
+ /Dest [
+ 23 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Next 11 0 R
+ /Parent 8 0 R
+ /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null)
+ /Type /Outline
+>>
+%% Object stream: object 11, index 8
+<<
+ /Dest [
+ 24 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Parent 8 0 R
+ /Prev 10 0 R
+ /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null)
+ /Type /Outline
+>>
+%% Object stream: object 12, index 9
+<<
+ /Dest [
+ 25 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Parent 9 0 R
+ /Title (Isosicle 1.1.2.1 -> 22: /XYZ null null null)
+ /Type /Outline
+>>
+endstream
+endobj
+
+13 0 obj
+<<
+ /Type /ObjStm
+ /Length 989
+ /N 3
+ /First 56
+ /Extends 2 0 R
+>>
+stream
+14 0
+15 213
+16 418
+%% Object stream: object 14, index 0
+<<
+ /Dest [
+ 26 0 R
+ /FitR
+ 66
+ 714
+ 180
+ 770
+ ]
+ /Next 15 0 R
+ /Parent 7 0 R
+ /Title (Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770)
+ /Type /Outline
+>>
+%% Object stream: object 15, index 1
+<<
+ /Dest [
+ 27 0 R
+ /XYZ
+ null
+ null
+ null
+ ]
+ /Parent 7 0 R
+ /Prev 14 0 R
+ /Title (Trepsicle 1.2.2 -> 0: /XYZ null null null)
+ /Type /Outline
+>>
+%% Object stream: object 16, index 2
+<<
+ /Nums [
+ 0
+ <<
+ /P ()
+ >>
+ 2
+ <<
+ /S /r
+ /St 1
+ >>
+ 7
+ <<
+ /P ()
+ >>
+ 9
+ <<
+ /S /r
+ /St 6
+ >>
+ 11
+ <<
+ /P ()
+ >>
+ 12
+ <<
+ /S /D
+ /St 2
+ >>
+ 15
+ <<
+ /S /D
+ /St 6
+ >>
+ 19
+ <<
+ /P ()
+ >>
+ 20
+ <<
+ /S /D
+ /St 12
+ >>
+ 22
+ <<
+ /S /D
+ /St 16059
+ >>
+ 23
+ <<
+ /S /r
+ /St 50
+ >>
+ 29
+ <<
+ /S /r
+ /St 54
+ >>
+ ]
+>>
+endstream
+endobj
+
+17 0 obj
+<<
+ /Count 30
+ /Kids [
+ 27 0 R
+ 26 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 18 0 R
+ 31 0 R
+ 32 0 R
+ 33 0 R
+ 34 0 R
+ 35 0 R
+ 20 0 R
+ 22 0 R
+ 21 0 R
+ 36 0 R
+ 19 0 R
+ 37 0 R
+ 38 0 R
+ 23 0 R
+ 24 0 R
+ 39 0 R
+ 40 0 R
+ 25 0 R
+ 41 0 R
+ 42 0 R
+ 43 0 R
+ 44 0 R
+ 45 0 R
+ 46 0 R
+ 47 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 6
+18 0 obj
+<<
+ /Contents 48 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 16
+19 0 obj
+<<
+ /Contents 52 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+20 0 obj
+<<
+ /Contents 54 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 14
+21 0 obj
+<<
+ /Contents 56 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+22 0 obj
+<<
+ /Contents 58 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 19
+23 0 obj
+<<
+ /Contents 60 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 20
+24 0 obj
+<<
+ /Contents 62 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 23
+25 0 obj
+<<
+ /Contents 64 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+26 0 obj
+<<
+ /Contents 66 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 1
+27 0 obj
+<<
+ /Contents 68 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+28 0 obj
+<<
+ /Contents 70 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+29 0 obj
+<<
+ /Contents 72 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+30 0 obj
+<<
+ /Contents 74 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+31 0 obj
+<<
+ /Contents 76 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+32 0 obj
+<<
+ /Contents 78 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+33 0 obj
+<<
+ /Contents 80 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+34 0 obj
+<<
+ /Contents 82 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+35 0 obj
+<<
+ /Contents 84 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 15
+36 0 obj
+<<
+ /Contents 86 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 17
+37 0 obj
+<<
+ /Contents 88 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 18
+38 0 obj
+<<
+ /Contents 90 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 21
+39 0 obj
+<<
+ /Contents 92 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 22
+40 0 obj
+<<
+ /Contents 94 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 24
+41 0 obj
+<<
+ /Contents 96 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 25
+42 0 obj
+<<
+ /Contents 98 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 26
+43 0 obj
+<<
+ /Contents 100 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 27
+44 0 obj
+<<
+ /Contents 102 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 28
+45 0 obj
+<<
+ /Contents 104 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 29
+46 0 obj
+<<
+ /Contents 106 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 30
+47 0 obj
+<<
+ /Contents 108 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 17 0 R
+ /Resources <<
+ /Font <<
+ /F1 50 0 R
+ >>
+ /ProcSet 51 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 6
+48 0 obj
+<<
+ /Length 49 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+49 0 obj
+46
+endobj
+
+50 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+51 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 16
+52 0 obj
+<<
+ /Length 53 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 15) Tj
+ET
+endstream
+endobj
+
+53 0 obj
+47
+endobj
+
+%% Contents for page 12
+54 0 obj
+<<
+ /Length 55 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+55 0 obj
+47
+endobj
+
+%% Contents for page 14
+56 0 obj
+<<
+ /Length 57 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+57 0 obj
+47
+endobj
+
+%% Contents for page 13
+58 0 obj
+<<
+ /Length 59 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 12) Tj
+ET
+endstream
+endobj
+
+59 0 obj
+47
+endobj
+
+%% Contents for page 19
+60 0 obj
+<<
+ /Length 61 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 18) Tj
+ET
+endstream
+endobj
+
+61 0 obj
+47
+endobj
+
+%% Contents for page 20
+62 0 obj
+<<
+ /Length 63 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 19) Tj
+ET
+endstream
+endobj
+
+63 0 obj
+47
+endobj
+
+%% Contents for page 23
+64 0 obj
+<<
+ /Length 65 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 22) Tj
+ET
+endstream
+endobj
+
+65 0 obj
+47
+endobj
+
+%% Contents for page 2
+66 0 obj
+<<
+ /Length 67 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+67 0 obj
+46
+endobj
+
+%% Contents for page 1
+68 0 obj
+<<
+ /Length 69 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+69 0 obj
+46
+endobj
+
+%% Contents for page 3
+70 0 obj
+<<
+ /Length 71 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+71 0 obj
+46
+endobj
+
+%% Contents for page 4
+72 0 obj
+<<
+ /Length 73 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+73 0 obj
+46
+endobj
+
+%% Contents for page 5
+74 0 obj
+<<
+ /Length 75 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+75 0 obj
+46
+endobj
+
+%% Contents for page 7
+76 0 obj
+<<
+ /Length 77 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+77 0 obj
+46
+endobj
+
+%% Contents for page 8
+78 0 obj
+<<
+ /Length 79 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+79 0 obj
+46
+endobj
+
+%% Contents for page 9
+80 0 obj
+<<
+ /Length 81 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+81 0 obj
+46
+endobj
+
+%% Contents for page 10
+82 0 obj
+<<
+ /Length 83 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+83 0 obj
+46
+endobj
+
+%% Contents for page 11
+84 0 obj
+<<
+ /Length 85 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 10) Tj
+ET
+endstream
+endobj
+
+85 0 obj
+47
+endobj
+
+%% Contents for page 15
+86 0 obj
+<<
+ /Length 87 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 14) Tj
+ET
+endstream
+endobj
+
+87 0 obj
+47
+endobj
+
+%% Contents for page 17
+88 0 obj
+<<
+ /Length 89 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 16) Tj
+ET
+endstream
+endobj
+
+89 0 obj
+47
+endobj
+
+%% Contents for page 18
+90 0 obj
+<<
+ /Length 91 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 17) Tj
+ET
+endstream
+endobj
+
+91 0 obj
+47
+endobj
+
+%% Contents for page 21
+92 0 obj
+<<
+ /Length 93 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 20) Tj
+ET
+endstream
+endobj
+
+93 0 obj
+47
+endobj
+
+%% Contents for page 22
+94 0 obj
+<<
+ /Length 95 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 21) Tj
+ET
+endstream
+endobj
+
+95 0 obj
+47
+endobj
+
+%% Contents for page 24
+96 0 obj
+<<
+ /Length 97 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 23) Tj
+ET
+endstream
+endobj
+
+97 0 obj
+47
+endobj
+
+%% Contents for page 25
+98 0 obj
+<<
+ /Length 99 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 24) Tj
+ET
+endstream
+endobj
+
+99 0 obj
+47
+endobj
+
+%% Contents for page 26
+100 0 obj
+<<
+ /Length 101 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 25) Tj
+ET
+endstream
+endobj
+
+101 0 obj
+47
+endobj
+
+%% Contents for page 27
+102 0 obj
+<<
+ /Length 103 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 26) Tj
+ET
+endstream
+endobj
+
+103 0 obj
+47
+endobj
+
+%% Contents for page 28
+104 0 obj
+<<
+ /Length 105 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 27) Tj
+ET
+endstream
+endobj
+
+105 0 obj
+47
+endobj
+
+%% Contents for page 29
+106 0 obj
+<<
+ /Length 107 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 28) Tj
+ET
+endstream
+endobj
+
+107 0 obj
+47
+endobj
+
+%% Contents for page 30
+108 0 obj
+<<
+ /Length 109 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 29) Tj
+ET
+endstream
+endobj
+
+109 0 obj
+47
+endobj
+
+110 0 obj
+<<
+ /Type /XRef
+ /Length 444
+ /W [ 1 2 1 ]
+ /Root 1 0 R
+ /Size 111
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+stream
+
+endstream
+endobj
+
+startxref
+14730
+%%EOF
diff --git a/qpdf/qtest/qpdf/good18.out b/qpdf/qtest/qpdf/good18.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good18.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good18.pdf b/qpdf/qtest/qpdf/good18.pdf
new file mode 100644
index 00000000..7563574f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good18.pdf
@@ -0,0 +1,1538 @@
+%PDF-1.5
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /PageLabels 107 0 R
+ /Pages 2 0 R
+ /Type /Catalog
+ /PageMode /UseOutlines
+ /Outlines 95 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 30
+ /Kids [
+ 3 0 R
+ 4 0 R
+ 5 0 R
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ 19 0 R
+ 20 0 R
+ 21 0 R
+ 22 0 R
+ 23 0 R
+ 24 0 R
+ 25 0 R
+ 26 0 R
+ 27 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 31 0 R
+ 32 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 33 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+4 0 obj
+<<
+ /Contents 37 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+5 0 obj
+<<
+ /Contents 39 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+6 0 obj
+<<
+ /Contents 41 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+7 0 obj
+<<
+ /Contents 43 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 6
+8 0 obj
+<<
+ /Contents 45 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+9 0 obj
+<<
+ /Contents 47 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+10 0 obj
+<<
+ /Contents 49 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+11 0 obj
+<<
+ /Contents 51 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+12 0 obj
+<<
+ /Contents 53 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+13 0 obj
+<<
+ /Contents 55 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+14 0 obj
+<<
+ /Contents 57 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+15 0 obj
+<<
+ /Contents 59 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 14
+16 0 obj
+<<
+ /Contents 61 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 15
+17 0 obj
+<<
+ /Contents 63 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 16
+18 0 obj
+<<
+ /Contents 65 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 17
+19 0 obj
+<<
+ /Contents 67 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 18
+20 0 obj
+<<
+ /Contents 69 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 19
+21 0 obj
+<<
+ /Contents 71 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 20
+22 0 obj
+<<
+ /Contents 73 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 21
+23 0 obj
+<<
+ /Contents 75 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 22
+24 0 obj
+<<
+ /Contents 77 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 23
+25 0 obj
+<<
+ /Contents 79 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 24
+26 0 obj
+<<
+ /Contents 81 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 25
+27 0 obj
+<<
+ /Contents 83 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 26
+28 0 obj
+<<
+ /Contents 85 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 27
+29 0 obj
+<<
+ /Contents 87 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 28
+30 0 obj
+<<
+ /Contents 89 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 29
+31 0 obj
+<<
+ /Contents 91 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 30
+32 0 obj
+<<
+ /Contents 93 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+33 0 obj
+<<
+ /Length 34 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+34 0 obj
+46
+endobj
+
+35 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+36 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+37 0 obj
+<<
+ /Length 38 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+38 0 obj
+46
+endobj
+
+%% Contents for page 3
+39 0 obj
+<<
+ /Length 40 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+40 0 obj
+46
+endobj
+
+%% Contents for page 4
+41 0 obj
+<<
+ /Length 42 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+42 0 obj
+46
+endobj
+
+%% Contents for page 5
+43 0 obj
+<<
+ /Length 44 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+44 0 obj
+46
+endobj
+
+%% Contents for page 6
+45 0 obj
+<<
+ /Length 46 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+46 0 obj
+46
+endobj
+
+%% Contents for page 7
+47 0 obj
+<<
+ /Length 48 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+48 0 obj
+46
+endobj
+
+%% Contents for page 8
+49 0 obj
+<<
+ /Length 50 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+50 0 obj
+46
+endobj
+
+%% Contents for page 9
+51 0 obj
+<<
+ /Length 52 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+52 0 obj
+46
+endobj
+
+%% Contents for page 10
+53 0 obj
+<<
+ /Length 54 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+54 0 obj
+46
+endobj
+
+%% Contents for page 11
+55 0 obj
+<<
+ /Length 56 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 10) Tj
+ET
+endstream
+endobj
+
+56 0 obj
+47
+endobj
+
+%% Contents for page 12
+57 0 obj
+<<
+ /Length 58 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+58 0 obj
+47
+endobj
+
+%% Contents for page 13
+59 0 obj
+<<
+ /Length 60 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 12) Tj
+ET
+endstream
+endobj
+
+60 0 obj
+47
+endobj
+
+%% Contents for page 14
+61 0 obj
+<<
+ /Length 62 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+62 0 obj
+47
+endobj
+
+%% Contents for page 15
+63 0 obj
+<<
+ /Length 64 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 14) Tj
+ET
+endstream
+endobj
+
+64 0 obj
+47
+endobj
+
+%% Contents for page 16
+65 0 obj
+<<
+ /Length 66 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 15) Tj
+ET
+endstream
+endobj
+
+66 0 obj
+47
+endobj
+
+%% Contents for page 17
+67 0 obj
+<<
+ /Length 68 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 16) Tj
+ET
+endstream
+endobj
+
+68 0 obj
+47
+endobj
+
+%% Contents for page 18
+69 0 obj
+<<
+ /Length 70 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 17) Tj
+ET
+endstream
+endobj
+
+70 0 obj
+47
+endobj
+
+%% Contents for page 19
+71 0 obj
+<<
+ /Length 72 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 18) Tj
+ET
+endstream
+endobj
+
+72 0 obj
+47
+endobj
+
+%% Contents for page 20
+73 0 obj
+<<
+ /Length 74 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 19) Tj
+ET
+endstream
+endobj
+
+74 0 obj
+47
+endobj
+
+%% Contents for page 21
+75 0 obj
+<<
+ /Length 76 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 20) Tj
+ET
+endstream
+endobj
+
+76 0 obj
+47
+endobj
+
+%% Contents for page 22
+77 0 obj
+<<
+ /Length 78 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 21) Tj
+ET
+endstream
+endobj
+
+78 0 obj
+47
+endobj
+
+%% Contents for page 23
+79 0 obj
+<<
+ /Length 80 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 22) Tj
+ET
+endstream
+endobj
+
+80 0 obj
+47
+endobj
+
+%% Contents for page 24
+81 0 obj
+<<
+ /Length 82 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 23) Tj
+ET
+endstream
+endobj
+
+82 0 obj
+47
+endobj
+
+%% Contents for page 25
+83 0 obj
+<<
+ /Length 84 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 24) Tj
+ET
+endstream
+endobj
+
+84 0 obj
+47
+endobj
+
+%% Contents for page 26
+85 0 obj
+<<
+ /Length 86 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 25) Tj
+ET
+endstream
+endobj
+
+86 0 obj
+47
+endobj
+
+%% Contents for page 27
+87 0 obj
+<<
+ /Length 88 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 26) Tj
+ET
+endstream
+endobj
+
+88 0 obj
+47
+endobj
+
+%% Contents for page 28
+89 0 obj
+<<
+ /Length 90 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 27) Tj
+ET
+endstream
+endobj
+
+90 0 obj
+47
+endobj
+
+%% Contents for page 29
+91 0 obj
+<<
+ /Length 92 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 28) Tj
+ET
+endstream
+endobj
+
+92 0 obj
+47
+endobj
+
+%% Contents for page 30
+93 0 obj
+<<
+ /Length 94 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 29) Tj
+ET
+endstream
+endobj
+
+94 0 obj
+47
+endobj
+
+xref
+0 110
+0000000095 65535 f
+0000000025 00000 n
+0000000145 00000 n
+0000000541 00000 n
+0000000746 00000 n
+0000000951 00000 n
+0000001156 00000 n
+0000001361 00000 n
+0000001566 00000 n
+0000001771 00000 n
+0000001976 00000 n
+0000002182 00000 n
+0000002389 00000 n
+0000002596 00000 n
+0000002803 00000 n
+0000003010 00000 n
+0000003217 00000 n
+0000003424 00000 n
+0000003631 00000 n
+0000003838 00000 n
+0000004045 00000 n
+0000004252 00000 n
+0000004459 00000 n
+0000004666 00000 n
+0000004873 00000 n
+0000005080 00000 n
+0000005287 00000 n
+0000005494 00000 n
+0000005701 00000 n
+0000005908 00000 n
+0000006115 00000 n
+0000006322 00000 n
+0000006529 00000 n
+0000006748 00000 n
+0000006851 00000 n
+0000006871 00000 n
+0000006990 00000 n
+0000007049 00000 n
+0000007152 00000 n
+0000007195 00000 n
+0000007298 00000 n
+0000007341 00000 n
+0000007444 00000 n
+0000007487 00000 n
+0000007590 00000 n
+0000007633 00000 n
+0000007736 00000 n
+0000007779 00000 n
+0000007882 00000 n
+0000007925 00000 n
+0000008028 00000 n
+0000008071 00000 n
+0000008174 00000 n
+0000008218 00000 n
+0000008321 00000 n
+0000008365 00000 n
+0000008469 00000 n
+0000008513 00000 n
+0000008617 00000 n
+0000008661 00000 n
+0000008765 00000 n
+0000008809 00000 n
+0000008913 00000 n
+0000008957 00000 n
+0000009061 00000 n
+0000009105 00000 n
+0000009209 00000 n
+0000009253 00000 n
+0000009357 00000 n
+0000009401 00000 n
+0000009505 00000 n
+0000009549 00000 n
+0000009653 00000 n
+0000009697 00000 n
+0000009801 00000 n
+0000009845 00000 n
+0000009949 00000 n
+0000009993 00000 n
+0000010097 00000 n
+0000010141 00000 n
+0000010245 00000 n
+0000010289 00000 n
+0000010393 00000 n
+0000010437 00000 n
+0000010541 00000 n
+0000010585 00000 n
+0000010689 00000 n
+0000010733 00000 n
+0000010837 00000 n
+0000010881 00000 n
+0000010985 00000 n
+0000011029 00000 n
+0000011133 00000 n
+0000011177 00000 n
+0000011281 00000 n
+0000000096 65535 f
+0000000097 65535 f
+0000000098 65535 f
+0000000099 65535 f
+0000000100 65535 f
+0000000101 65535 f
+0000000102 65535 f
+0000000103 65535 f
+0000000104 65535 f
+0000000105 65535 f
+0000000106 65535 f
+0000000107 65535 f
+0000000108 65535 f
+0000000109 65535 f
+0000000000 65535 f
+trailer <<
+ /Root 1 0 R
+ /Size 110
+>>
+startxref
+11301
+%%EOF
+
+108 0 obj
+<<
+ /Type /ObjStm
+ /N 13
+ /First 107
+ /Length 2445
+>>
+stream
+95 0
+96 74
+97 259
+98 393
+99 556
+100 898
+101 1077
+102 1275
+103 1432
+104 1589
+105 1730
+106 1887
+107 2040
+%95
+<<
+ /Type /Outlines
+ /First 96 0 R
+ /Last 97 0 R
+ /Count 6
+>>
+%96
+<<
+ /Type /Outline
+ /Title (Isís 1 -> 5: /XYZ null null null)
+ /Parent 95 0 R
+ /Count 4
+ /Next 97 0 R
+ /First 98 0 R
+ /Last 99 0 R
+ /Dest [ 8 0 R /XYZ null null null ]
+>>
+% 97
+<<
+ /Type /Outline
+ /Title (Trepak 2 -> 15: /XYZ 66 756 3)
+ /Parent 95 0 R
+ /Prev 96 0 R
+ /Dest [ 18 0 R /XYZ 66 756 3 ]
+>>
+% 98
+<<
+ /Type /Outline
+ /Title (Amanda 1.1 -> 11: /Fit)
+ /Parent 96 0 R
+ /Next 99 0 R
+ /First 100 0 R
+ /Last 101 0 R
+ /Count -3
+ /Dest [ 14 0 R /Fit ]
+>>
+% 99
+<<
+ /Type /Outline
+ % /Title (Sandy (Sandy [Greek]) 1.2 -> 13: /FitH 792)
+ /Title <feff00530061006e00640079002000f703a303b103bd03b403b900f700200031002e00320020002d003e002000310033003a0020002f00460069007400480020003700390032>
+ /Parent 96 0 R
+ /Prev 98 0 R
+ /First 105 0 R
+ /Last 106 0 R
+ /Count 2
+ /Dest [ 16 0 R /FitH 792 ]
+>>
+% 100
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1 -> 12: /FitV 100)
+ /Parent 98 0 R
+ /Next 101 0 R
+ /First 102 0 R
+ /Last 103 0 R
+ /Count -2
+ /Dest [ 15 0 R /FitV 100 ]
+>>
+% 101
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2 -> 12: /XYZ null null null)
+ /Parent 98 0 R
+ /Prev 100 0 R
+ /First 104 0 R
+ /Last 104 0 R
+ /Count 1
+ /Dest [ 15 0 R /XYZ null null null ]
+>>
+% 102
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null)
+ /Parent 100 0 R
+ /Next 103 0 R
+ /Dest [ 21 0 R /XYZ null null null ]
+>>
+% 103
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null)
+ /Parent 100 0 R
+ /Prev 102 0 R
+ /Dest [ 22 0 R /XYZ null null null ]
+>>
+% 104
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2.1 -> 22: /XYZ null null null)
+ /Parent 101 0 R
+ /Dest [ 25 0 R /XYZ null null null ]
+>>
+% 105
+<<
+ /Type /Outline
+ /Title (Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770)
+ /Parent 99 0 R
+ /Next 106 0 R
+ /Dest [ 4 0 R /FitR 66 714 180 770 ]
+>>
+% 106
+<<
+ /Type /Outline
+ /Title (Trepsicle 1.2.2 -> 0: /XYZ null null null)
+ /Parent 99 0 R
+ /Prev 105 0 R
+ /Dest [ 3 0 R /XYZ null null null ]
+>>
+% 107
+ << /Nums [
+ 0 << /P () >>
+ 2 << /S /r /St 1 >>
+ 7 << /P () >>
+ 9 << /S /r /St 6 >>
+ 11 << /P () >>
+ 12 << /S /D /St 2 >>
+ 15 << /S /D /St 6 >>
+ 19 << /P () >>
+ 20 << /S /D /St 12 >>
+ 22 << /S /D /St 16059 >>
+ 23 << /S /r /St 50 >>
+ 29 << /S /r /St 54 >>
+ ] >>
+endstream
+endobj
+
+109 0 obj
+<<
+ /Type /XRef
+ /Size 110
+ /Index [0 110]
+ /W [1 2 1]
+ /Length 110
+ /Root 1 0 R
+ /Filter /FlateDecode
+ /DecodeParms << /Columns 4 /Predictor 12 >>
+>>
+stream
+xœcb
+ ÁÔbŒX$‰s â<Œ`8Â%B‚4m·Abé BÄ-±¬abŒÚpY‹Î"IŒQ. b1fÀX $ˆ1ÒA‘¦0^‰qÉ%þ›ÎþÂÄÀùŠ
+endstream
+endobj
+
+xref
+0 0
+trailer <<
+ /Size 110
+ /Root 1 0 R
+ /Prev 11301
+ /XRefStm 16113
+>>
+
+startxref
+16418
+%%EOF
diff --git a/qpdf/qtest/qpdf/good18.qdf b/qpdf/qtest/qpdf/good18.qdf
new file mode 100644
index 00000000..58e17b82
--- /dev/null
+++ b/qpdf/qtest/qpdf/good18.qdf
@@ -0,0 +1,1343 @@
+%PDF-1.5
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /PageMode /UseOutlines
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 30
+ /Kids [
+ 3 0 R
+ 4 0 R
+ 5 0 R
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ 19 0 R
+ 20 0 R
+ 21 0 R
+ 22 0 R
+ 23 0 R
+ 24 0 R
+ 25 0 R
+ 26 0 R
+ 27 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 31 0 R
+ 32 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 33 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+4 0 obj
+<<
+ /Contents 37 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+5 0 obj
+<<
+ /Contents 39 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+6 0 obj
+<<
+ /Contents 41 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+7 0 obj
+<<
+ /Contents 43 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 6
+8 0 obj
+<<
+ /Contents 45 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+9 0 obj
+<<
+ /Contents 47 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+10 0 obj
+<<
+ /Contents 49 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+11 0 obj
+<<
+ /Contents 51 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+12 0 obj
+<<
+ /Contents 53 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+13 0 obj
+<<
+ /Contents 55 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+14 0 obj
+<<
+ /Contents 57 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+15 0 obj
+<<
+ /Contents 59 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 14
+16 0 obj
+<<
+ /Contents 61 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 15
+17 0 obj
+<<
+ /Contents 63 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 16
+18 0 obj
+<<
+ /Contents 65 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 17
+19 0 obj
+<<
+ /Contents 67 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 18
+20 0 obj
+<<
+ /Contents 69 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 19
+21 0 obj
+<<
+ /Contents 71 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 20
+22 0 obj
+<<
+ /Contents 73 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 21
+23 0 obj
+<<
+ /Contents 75 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 22
+24 0 obj
+<<
+ /Contents 77 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 23
+25 0 obj
+<<
+ /Contents 79 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 24
+26 0 obj
+<<
+ /Contents 81 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 25
+27 0 obj
+<<
+ /Contents 83 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 26
+28 0 obj
+<<
+ /Contents 85 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 27
+29 0 obj
+<<
+ /Contents 87 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 28
+30 0 obj
+<<
+ /Contents 89 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 29
+31 0 obj
+<<
+ /Contents 91 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 30
+32 0 obj
+<<
+ /Contents 93 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+33 0 obj
+<<
+ /Length 34 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+34 0 obj
+46
+endobj
+
+35 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+36 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+37 0 obj
+<<
+ /Length 38 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+38 0 obj
+46
+endobj
+
+%% Contents for page 3
+39 0 obj
+<<
+ /Length 40 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+40 0 obj
+46
+endobj
+
+%% Contents for page 4
+41 0 obj
+<<
+ /Length 42 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+42 0 obj
+46
+endobj
+
+%% Contents for page 5
+43 0 obj
+<<
+ /Length 44 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+44 0 obj
+46
+endobj
+
+%% Contents for page 6
+45 0 obj
+<<
+ /Length 46 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+46 0 obj
+46
+endobj
+
+%% Contents for page 7
+47 0 obj
+<<
+ /Length 48 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+48 0 obj
+46
+endobj
+
+%% Contents for page 8
+49 0 obj
+<<
+ /Length 50 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+50 0 obj
+46
+endobj
+
+%% Contents for page 9
+51 0 obj
+<<
+ /Length 52 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+52 0 obj
+46
+endobj
+
+%% Contents for page 10
+53 0 obj
+<<
+ /Length 54 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+54 0 obj
+46
+endobj
+
+%% Contents for page 11
+55 0 obj
+<<
+ /Length 56 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 10) Tj
+ET
+endstream
+endobj
+
+56 0 obj
+47
+endobj
+
+%% Contents for page 12
+57 0 obj
+<<
+ /Length 58 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+58 0 obj
+47
+endobj
+
+%% Contents for page 13
+59 0 obj
+<<
+ /Length 60 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 12) Tj
+ET
+endstream
+endobj
+
+60 0 obj
+47
+endobj
+
+%% Contents for page 14
+61 0 obj
+<<
+ /Length 62 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+62 0 obj
+47
+endobj
+
+%% Contents for page 15
+63 0 obj
+<<
+ /Length 64 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 14) Tj
+ET
+endstream
+endobj
+
+64 0 obj
+47
+endobj
+
+%% Contents for page 16
+65 0 obj
+<<
+ /Length 66 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 15) Tj
+ET
+endstream
+endobj
+
+66 0 obj
+47
+endobj
+
+%% Contents for page 17
+67 0 obj
+<<
+ /Length 68 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 16) Tj
+ET
+endstream
+endobj
+
+68 0 obj
+47
+endobj
+
+%% Contents for page 18
+69 0 obj
+<<
+ /Length 70 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 17) Tj
+ET
+endstream
+endobj
+
+70 0 obj
+47
+endobj
+
+%% Contents for page 19
+71 0 obj
+<<
+ /Length 72 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 18) Tj
+ET
+endstream
+endobj
+
+72 0 obj
+47
+endobj
+
+%% Contents for page 20
+73 0 obj
+<<
+ /Length 74 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 19) Tj
+ET
+endstream
+endobj
+
+74 0 obj
+47
+endobj
+
+%% Contents for page 21
+75 0 obj
+<<
+ /Length 76 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 20) Tj
+ET
+endstream
+endobj
+
+76 0 obj
+47
+endobj
+
+%% Contents for page 22
+77 0 obj
+<<
+ /Length 78 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 21) Tj
+ET
+endstream
+endobj
+
+78 0 obj
+47
+endobj
+
+%% Contents for page 23
+79 0 obj
+<<
+ /Length 80 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 22) Tj
+ET
+endstream
+endobj
+
+80 0 obj
+47
+endobj
+
+%% Contents for page 24
+81 0 obj
+<<
+ /Length 82 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 23) Tj
+ET
+endstream
+endobj
+
+82 0 obj
+47
+endobj
+
+%% Contents for page 25
+83 0 obj
+<<
+ /Length 84 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 24) Tj
+ET
+endstream
+endobj
+
+84 0 obj
+47
+endobj
+
+%% Contents for page 26
+85 0 obj
+<<
+ /Length 86 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 25) Tj
+ET
+endstream
+endobj
+
+86 0 obj
+47
+endobj
+
+%% Contents for page 27
+87 0 obj
+<<
+ /Length 88 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 26) Tj
+ET
+endstream
+endobj
+
+88 0 obj
+47
+endobj
+
+%% Contents for page 28
+89 0 obj
+<<
+ /Length 90 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 27) Tj
+ET
+endstream
+endobj
+
+90 0 obj
+47
+endobj
+
+%% Contents for page 29
+91 0 obj
+<<
+ /Length 92 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 28) Tj
+ET
+endstream
+endobj
+
+92 0 obj
+47
+endobj
+
+%% Contents for page 30
+93 0 obj
+<<
+ /Length 94 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 29) Tj
+ET
+endstream
+endobj
+
+94 0 obj
+47
+endobj
+
+xref
+0 95
+0000000000 65535 f
+0000000025 00000 n
+0000000104 00000 n
+0000000500 00000 n
+0000000705 00000 n
+0000000910 00000 n
+0000001115 00000 n
+0000001320 00000 n
+0000001525 00000 n
+0000001730 00000 n
+0000001935 00000 n
+0000002141 00000 n
+0000002348 00000 n
+0000002555 00000 n
+0000002762 00000 n
+0000002969 00000 n
+0000003176 00000 n
+0000003383 00000 n
+0000003590 00000 n
+0000003797 00000 n
+0000004004 00000 n
+0000004211 00000 n
+0000004418 00000 n
+0000004625 00000 n
+0000004832 00000 n
+0000005039 00000 n
+0000005246 00000 n
+0000005453 00000 n
+0000005660 00000 n
+0000005867 00000 n
+0000006074 00000 n
+0000006281 00000 n
+0000006488 00000 n
+0000006707 00000 n
+0000006810 00000 n
+0000006830 00000 n
+0000006949 00000 n
+0000007008 00000 n
+0000007111 00000 n
+0000007154 00000 n
+0000007257 00000 n
+0000007300 00000 n
+0000007403 00000 n
+0000007446 00000 n
+0000007549 00000 n
+0000007592 00000 n
+0000007695 00000 n
+0000007738 00000 n
+0000007841 00000 n
+0000007884 00000 n
+0000007987 00000 n
+0000008030 00000 n
+0000008133 00000 n
+0000008177 00000 n
+0000008280 00000 n
+0000008324 00000 n
+0000008428 00000 n
+0000008472 00000 n
+0000008576 00000 n
+0000008620 00000 n
+0000008724 00000 n
+0000008768 00000 n
+0000008872 00000 n
+0000008916 00000 n
+0000009020 00000 n
+0000009064 00000 n
+0000009168 00000 n
+0000009212 00000 n
+0000009316 00000 n
+0000009360 00000 n
+0000009464 00000 n
+0000009508 00000 n
+0000009612 00000 n
+0000009656 00000 n
+0000009760 00000 n
+0000009804 00000 n
+0000009908 00000 n
+0000009952 00000 n
+0000010056 00000 n
+0000010100 00000 n
+0000010204 00000 n
+0000010248 00000 n
+0000010352 00000 n
+0000010396 00000 n
+0000010500 00000 n
+0000010544 00000 n
+0000010648 00000 n
+0000010692 00000 n
+0000010796 00000 n
+0000010840 00000 n
+0000010944 00000 n
+0000010988 00000 n
+0000011092 00000 n
+0000011136 00000 n
+0000011240 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 95
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+11260
+%%EOF
diff --git a/qpdf/qtest/qpdf/good19.out b/qpdf/qtest/qpdf/good19.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good19.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good19.pdf b/qpdf/qtest/qpdf/good19.pdf
new file mode 100644
index 00000000..3ffc2db0
--- /dev/null
+++ b/qpdf/qtest/qpdf/good19.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/good19.qdf b/qpdf/qtest/qpdf/good19.qdf
new file mode 100644
index 00000000..1716fc75
--- /dev/null
+++ b/qpdf/qtest/qpdf/good19.qdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/good2.out b/qpdf/qtest/qpdf/good2.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good2.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good2.pdf b/qpdf/qtest/qpdf/good2.pdf
new file mode 100644
index 00000000..535f369c
--- /dev/null
+++ b/qpdf/qtest/qpdf/good2.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest null
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good2.qdf b/qpdf/qtest/qpdf/good2.qdf
new file mode 100644
index 00000000..976ed2b2
--- /dev/null
+++ b/qpdf/qtest/qpdf/good2.qdf
@@ -0,0 +1,95 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good20.out b/qpdf/qtest/qpdf/good20.out
new file mode 100644
index 00000000..1d31025f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good20.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is direct
+/QTest is null
+unparse: null
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good20.pdf b/qpdf/qtest/qpdf/good20.pdf
new file mode 100644
index 00000000..91c3f2b3
--- /dev/null
+++ b/qpdf/qtest/qpdf/good20.pdf
@@ -0,0 +1,901 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+ /OtherStuff [
+ 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R
+ 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R
+ 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R
+ 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R
+ 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R
+ 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R
+ 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R
+ 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R
+ 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R
+ 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R
+ 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R
+ 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R
+ 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R
+ 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R
+ 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R
+ 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R
+ 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R
+ 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R
+ 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R
+ 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R
+ ]
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj
+[/Object-7]
+endobj
+
+8 0 obj
+[/Object-8]
+endobj
+
+9 0 obj
+[/Object-9]
+endobj
+
+10 0 obj
+[/Object-10]
+endobj
+
+11 0 obj
+[/Object-11]
+endobj
+
+12 0 obj
+[/Object-12]
+endobj
+
+13 0 obj
+[/Object-13]
+endobj
+
+14 0 obj
+[/Object-14]
+endobj
+
+15 0 obj
+[/Object-15]
+endobj
+
+16 0 obj
+[/Object-16]
+endobj
+
+17 0 obj
+[/Object-17]
+endobj
+
+18 0 obj
+[/Object-18]
+endobj
+
+19 0 obj
+[/Object-19]
+endobj
+
+20 0 obj
+[/Object-20]
+endobj
+
+21 0 obj
+[/Object-21]
+endobj
+
+22 0 obj
+[/Object-22]
+endobj
+
+23 0 obj
+[/Object-23]
+endobj
+
+24 0 obj
+[/Object-24]
+endobj
+
+25 0 obj
+[/Object-25]
+endobj
+
+26 0 obj
+[/Object-26]
+endobj
+
+27 0 obj
+[/Object-27]
+endobj
+
+28 0 obj
+[/Object-28]
+endobj
+
+29 0 obj
+[/Object-29]
+endobj
+
+30 0 obj
+[/Object-30]
+endobj
+
+31 0 obj
+[/Object-31]
+endobj
+
+32 0 obj
+[/Object-32]
+endobj
+
+33 0 obj
+[/Object-33]
+endobj
+
+34 0 obj
+[/Object-34]
+endobj
+
+35 0 obj
+[/Object-35]
+endobj
+
+36 0 obj
+[/Object-36]
+endobj
+
+37 0 obj
+[/Object-37]
+endobj
+
+38 0 obj
+[/Object-38]
+endobj
+
+39 0 obj
+[/Object-39]
+endobj
+
+40 0 obj
+[/Object-40]
+endobj
+
+41 0 obj
+[/Object-41]
+endobj
+
+42 0 obj
+[/Object-42]
+endobj
+
+43 0 obj
+[/Object-43]
+endobj
+
+44 0 obj
+[/Object-44]
+endobj
+
+45 0 obj
+[/Object-45]
+endobj
+
+46 0 obj
+[/Object-46]
+endobj
+
+47 0 obj
+[/Object-47]
+endobj
+
+48 0 obj
+[/Object-48]
+endobj
+
+49 0 obj
+[/Object-49]
+endobj
+
+50 0 obj
+[/Object-50]
+endobj
+
+51 0 obj
+[/Object-51]
+endobj
+
+52 0 obj
+[/Object-52]
+endobj
+
+53 0 obj
+[/Object-53]
+endobj
+
+54 0 obj
+[/Object-54]
+endobj
+
+55 0 obj
+[/Object-55]
+endobj
+
+56 0 obj
+[/Object-56]
+endobj
+
+57 0 obj
+[/Object-57]
+endobj
+
+58 0 obj
+[/Object-58]
+endobj
+
+59 0 obj
+[/Object-59]
+endobj
+
+60 0 obj
+[/Object-60]
+endobj
+
+61 0 obj
+[/Object-61]
+endobj
+
+62 0 obj
+[/Object-62]
+endobj
+
+63 0 obj
+[/Object-63]
+endobj
+
+64 0 obj
+[/Object-64]
+endobj
+
+65 0 obj
+[/Object-65]
+endobj
+
+66 0 obj
+[/Object-66]
+endobj
+
+67 0 obj
+[/Object-67]
+endobj
+
+68 0 obj
+[/Object-68]
+endobj
+
+69 0 obj
+[/Object-69]
+endobj
+
+70 0 obj
+[/Object-70]
+endobj
+
+71 0 obj
+[/Object-71]
+endobj
+
+72 0 obj
+[/Object-72]
+endobj
+
+73 0 obj
+[/Object-73]
+endobj
+
+74 0 obj
+[/Object-74]
+endobj
+
+75 0 obj
+[/Object-75]
+endobj
+
+76 0 obj
+[/Object-76]
+endobj
+
+77 0 obj
+[/Object-77]
+endobj
+
+78 0 obj
+[/Object-78]
+endobj
+
+79 0 obj
+[/Object-79]
+endobj
+
+80 0 obj
+[/Object-80]
+endobj
+
+81 0 obj
+[/Object-81]
+endobj
+
+82 0 obj
+[/Object-82]
+endobj
+
+83 0 obj
+[/Object-83]
+endobj
+
+84 0 obj
+[/Object-84]
+endobj
+
+85 0 obj
+[/Object-85]
+endobj
+
+86 0 obj
+[/Object-86]
+endobj
+
+87 0 obj
+[/Object-87]
+endobj
+
+88 0 obj
+[/Object-88]
+endobj
+
+89 0 obj
+[/Object-89]
+endobj
+
+90 0 obj
+[/Object-90]
+endobj
+
+91 0 obj
+[/Object-91]
+endobj
+
+92 0 obj
+[/Object-92]
+endobj
+
+93 0 obj
+[/Object-93]
+endobj
+
+94 0 obj
+[/Object-94]
+endobj
+
+95 0 obj
+[/Object-95]
+endobj
+
+96 0 obj
+[/Object-96]
+endobj
+
+97 0 obj
+[/Object-97]
+endobj
+
+98 0 obj
+[/Object-98]
+endobj
+
+99 0 obj
+[/Object-99]
+endobj
+
+100 0 obj
+[/Object-100]
+endobj
+
+101 0 obj
+[/Object-101]
+endobj
+
+102 0 obj
+[/Object-102]
+endobj
+
+103 0 obj
+[/Object-103]
+endobj
+
+104 0 obj
+[/Object-104]
+endobj
+
+105 0 obj
+[/Object-105]
+endobj
+
+106 0 obj
+[/Object-106]
+endobj
+
+107 0 obj
+[/Object-107]
+endobj
+
+108 0 obj
+[/Object-108]
+endobj
+
+109 0 obj
+[/Object-109]
+endobj
+
+110 0 obj
+[/Object-110]
+endobj
+
+111 0 obj
+[/Object-111]
+endobj
+
+112 0 obj
+[/Object-112]
+endobj
+
+113 0 obj
+[/Object-113]
+endobj
+
+114 0 obj
+[/Object-114]
+endobj
+
+115 0 obj
+[/Object-115]
+endobj
+
+116 0 obj
+[/Object-116]
+endobj
+
+117 0 obj
+[/Object-117]
+endobj
+
+118 0 obj
+[/Object-118]
+endobj
+
+119 0 obj
+[/Object-119]
+endobj
+
+120 0 obj
+[/Object-120]
+endobj
+
+121 0 obj
+[/Object-121]
+endobj
+
+122 0 obj
+[/Object-122]
+endobj
+
+123 0 obj
+[/Object-123]
+endobj
+
+124 0 obj
+[/Object-124]
+endobj
+
+125 0 obj
+[/Object-125]
+endobj
+
+126 0 obj
+[/Object-126]
+endobj
+
+127 0 obj
+[/Object-127]
+endobj
+
+128 0 obj
+[/Object-128]
+endobj
+
+129 0 obj
+[/Object-129]
+endobj
+
+130 0 obj
+[/Object-130]
+endobj
+
+131 0 obj
+[/Object-131]
+endobj
+
+132 0 obj
+[/Object-132]
+endobj
+
+133 0 obj
+[/Object-133]
+endobj
+
+134 0 obj
+[/Object-134]
+endobj
+
+135 0 obj
+[/Object-135]
+endobj
+
+136 0 obj
+[/Object-136]
+endobj
+
+137 0 obj
+[/Object-137]
+endobj
+
+138 0 obj
+[/Object-138]
+endobj
+
+139 0 obj
+[/Object-139]
+endobj
+
+140 0 obj
+[/Object-140]
+endobj
+
+141 0 obj
+[/Object-141]
+endobj
+
+142 0 obj
+[/Object-142]
+endobj
+
+143 0 obj
+[/Object-143]
+endobj
+
+144 0 obj
+[/Object-144]
+endobj
+
+145 0 obj
+[/Object-145]
+endobj
+
+146 0 obj
+[/Object-146]
+endobj
+
+147 0 obj
+[/Object-147]
+endobj
+
+148 0 obj
+[/Object-148]
+endobj
+
+149 0 obj
+[/Object-149]
+endobj
+
+150 0 obj
+[/Object-150]
+endobj
+
+151 0 obj
+[/Object-151]
+endobj
+
+152 0 obj
+[/Object-152]
+endobj
+
+153 0 obj
+[/Object-153]
+endobj
+
+154 0 obj
+[/Object-154]
+endobj
+
+155 0 obj
+[/Object-155]
+endobj
+
+156 0 obj
+[/Object-156]
+endobj
+
+157 0 obj
+[/Object-157]
+endobj
+
+158 0 obj
+[/Object-158]
+endobj
+
+159 0 obj
+[/Object-159]
+endobj
+
+160 0 obj
+[/Object-160]
+endobj
+
+161 0 obj
+[/Object-161]
+endobj
+
+162 0 obj
+[/Object-162]
+endobj
+
+163 0 obj
+[/Object-163]
+endobj
+
+164 0 obj
+[/Object-164]
+endobj
+
+165 0 obj
+[/Object-165]
+endobj
+
+166 0 obj
+[/Object-166]
+endobj
+
+xref
+0 167
+0000006875 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000001687 00000 n
+0000001783 00000 n
+0000001818 00000 n
+0000001936 00000 n
+0000001964 00000 n
+0000001992 00000 n
+0000002020 00000 n
+0000002050 00000 n
+0000002080 00000 n
+0000002110 00000 n
+0000002140 00000 n
+0000002170 00000 n
+0000002200 00000 n
+0000002230 00000 n
+0000002260 00000 n
+0000002290 00000 n
+0000002320 00000 n
+0000002350 00000 n
+0000002380 00000 n
+0000002410 00000 n
+0000002440 00000 n
+0000002470 00000 n
+0000002500 00000 n
+0000002530 00000 n
+0000002560 00000 n
+0000002590 00000 n
+0000002620 00000 n
+0000002650 00000 n
+0000002680 00000 n
+0000002710 00000 n
+0000002740 00000 n
+0000002770 00000 n
+0000002800 00000 n
+0000002830 00000 n
+0000002860 00000 n
+0000002890 00000 n
+0000002920 00000 n
+0000002950 00000 n
+0000002980 00000 n
+0000003010 00000 n
+0000003040 00000 n
+0000003070 00000 n
+0000003100 00000 n
+0000003130 00000 n
+0000003160 00000 n
+0000003190 00000 n
+0000003220 00000 n
+0000003250 00000 n
+0000003280 00000 n
+0000003310 00000 n
+0000003340 00000 n
+0000003370 00000 n
+0000003400 00000 n
+0000003430 00000 n
+0000003460 00000 n
+0000003490 00000 n
+0000003520 00000 n
+0000003550 00000 n
+0000003580 00000 n
+0000003610 00000 n
+0000003640 00000 n
+0000003670 00000 n
+0000003700 00000 n
+0000003730 00000 n
+0000003760 00000 n
+0000003790 00000 n
+0000003820 00000 n
+0000003850 00000 n
+0000003880 00000 n
+0000003910 00000 n
+0000003940 00000 n
+0000003970 00000 n
+0000004000 00000 n
+0000004030 00000 n
+0000004060 00000 n
+0000004090 00000 n
+0000004120 00000 n
+0000004150 00000 n
+0000004180 00000 n
+0000004210 00000 n
+0000004240 00000 n
+0000004270 00000 n
+0000004300 00000 n
+0000004330 00000 n
+0000004360 00000 n
+0000004390 00000 n
+0000004420 00000 n
+0000004450 00000 n
+0000004480 00000 n
+0000004510 00000 n
+0000004540 00000 n
+0000004570 00000 n
+0000004600 00000 n
+0000004630 00000 n
+0000004660 00000 n
+0000004690 00000 n
+0000004720 00000 n
+0000004752 00000 n
+0000004784 00000 n
+0000004816 00000 n
+0000004848 00000 n
+0000004880 00000 n
+0000004912 00000 n
+0000004944 00000 n
+0000004976 00000 n
+0000005008 00000 n
+0000005040 00000 n
+0000005072 00000 n
+0000005104 00000 n
+0000005136 00000 n
+0000005168 00000 n
+0000005200 00000 n
+0000005232 00000 n
+0000005264 00000 n
+0000005296 00000 n
+0000005328 00000 n
+0000005360 00000 n
+0000005392 00000 n
+0000005424 00000 n
+0000005456 00000 n
+0000005488 00000 n
+0000005520 00000 n
+0000005552 00000 n
+0000005584 00000 n
+0000005616 00000 n
+0000005648 00000 n
+0000005680 00000 n
+0000005712 00000 n
+0000005744 00000 n
+0000005776 00000 n
+0000005808 00000 n
+0000005840 00000 n
+0000005872 00000 n
+0000005904 00000 n
+0000005936 00000 n
+0000005968 00000 n
+0000006000 00000 n
+0000006032 00000 n
+0000006064 00000 n
+0000006096 00000 n
+0000006128 00000 n
+0000006160 00000 n
+0000006192 00000 n
+0000006224 00000 n
+0000006256 00000 n
+0000006288 00000 n
+0000006320 00000 n
+0000006352 00000 n
+0000006384 00000 n
+0000006416 00000 n
+0000006448 00000 n
+0000006480 00000 n
+0000006512 00000 n
+0000006544 00000 n
+0000006576 00000 n
+0000006608 00000 n
+0000006640 00000 n
+0000006672 00000 n
+0000006704 00000 n
+0000006736 00000 n
+0000006768 00000 n
+0000006800 00000 n
+0000006832 00000 n
+trailer <<
+ /Size 167
+ /Root 1 0 R
+>>
+startxref
+6864
+%%EOF
diff --git a/qpdf/qtest/qpdf/good20.qdf b/qpdf/qtest/qpdf/good20.qdf
new file mode 100644
index 00000000..f4c8cad9
--- /dev/null
+++ b/qpdf/qtest/qpdf/good20.qdf
@@ -0,0 +1,1075 @@
+%PDF-1.5
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Type /ObjStm
+ /Length 7271
+ /N 83
+ /First 686
+>>
+stream
+2 0
+3 74
+4 166
+5 2236
+6 2288
+7 2340
+8 2392
+9 2445
+10 2499
+11 2553
+12 2608
+13 2663
+14 2718
+15 2773
+16 2828
+17 2883
+18 2938
+19 2993
+20 3048
+21 3103
+22 3158
+23 3213
+24 3268
+25 3323
+26 3378
+27 3433
+28 3488
+29 3543
+30 3598
+31 3653
+32 3708
+33 3763
+34 3818
+35 3873
+36 3928
+37 3983
+38 4038
+39 4093
+40 4148
+41 4203
+42 4258
+43 4313
+44 4368
+45 4423
+46 4478
+47 4533
+48 4588
+49 4643
+50 4698
+51 4753
+52 4808
+53 4863
+54 4918
+55 4973
+56 5028
+57 5083
+58 5138
+59 5193
+60 5248
+61 5303
+62 5358
+63 5413
+64 5468
+65 5523
+66 5578
+67 5633
+68 5688
+69 5743
+70 5798
+71 5853
+72 5908
+73 5963
+74 6018
+75 6073
+76 6128
+77 6183
+78 6238
+79 6293
+80 6348
+81 6403
+82 6458
+83 6513
+84 6568
+%% Object stream: object 2, index 0
+<<
+ /Pages 3 0 R
+ /Type /Catalog
+>>
+%% Object stream: object 3, index 1
+<<
+ /Count 1
+ /Kids [
+ 4 0 R
+ ]
+ /Type /Pages
+>>
+%% Object stream: object 4, index 2
+%% Page 1
+<<
+ /Contents 85 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /OtherStuff [
+ 5 0 R
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ 19 0 R
+ 20 0 R
+ 21 0 R
+ 22 0 R
+ 23 0 R
+ 24 0 R
+ 25 0 R
+ 26 0 R
+ 27 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 31 0 R
+ 32 0 R
+ 33 0 R
+ 34 0 R
+ 35 0 R
+ 36 0 R
+ 37 0 R
+ 38 0 R
+ 39 0 R
+ 40 0 R
+ 41 0 R
+ 42 0 R
+ 43 0 R
+ 44 0 R
+ 45 0 R
+ 46 0 R
+ 47 0 R
+ 48 0 R
+ 49 0 R
+ 50 0 R
+ 51 0 R
+ 52 0 R
+ 53 0 R
+ 54 0 R
+ 55 0 R
+ 56 0 R
+ 57 0 R
+ 58 0 R
+ 59 0 R
+ 60 0 R
+ 61 0 R
+ 62 0 R
+ 63 0 R
+ 64 0 R
+ 65 0 R
+ 66 0 R
+ 67 0 R
+ 68 0 R
+ 69 0 R
+ 70 0 R
+ 71 0 R
+ 72 0 R
+ 73 0 R
+ 74 0 R
+ 75 0 R
+ 76 0 R
+ 77 0 R
+ 78 0 R
+ 79 0 R
+ 80 0 R
+ 81 0 R
+ 82 0 R
+ 83 0 R
+ 84 0 R
+ 90 0 R
+ 91 0 R
+ 92 0 R
+ 93 0 R
+ 94 0 R
+ 95 0 R
+ 96 0 R
+ 97 0 R
+ 98 0 R
+ 99 0 R
+ 100 0 R
+ 101 0 R
+ 102 0 R
+ 103 0 R
+ 104 0 R
+ 105 0 R
+ 106 0 R
+ 107 0 R
+ 108 0 R
+ 109 0 R
+ 110 0 R
+ 111 0 R
+ 112 0 R
+ 113 0 R
+ 114 0 R
+ 115 0 R
+ 116 0 R
+ 117 0 R
+ 118 0 R
+ 119 0 R
+ 120 0 R
+ 121 0 R
+ 122 0 R
+ 123 0 R
+ 124 0 R
+ 125 0 R
+ 126 0 R
+ 127 0 R
+ 128 0 R
+ 129 0 R
+ 130 0 R
+ 131 0 R
+ 132 0 R
+ 133 0 R
+ 134 0 R
+ 135 0 R
+ 136 0 R
+ 137 0 R
+ 138 0 R
+ 139 0 R
+ 140 0 R
+ 141 0 R
+ 142 0 R
+ 143 0 R
+ 144 0 R
+ 145 0 R
+ 146 0 R
+ 147 0 R
+ 148 0 R
+ 149 0 R
+ 150 0 R
+ 151 0 R
+ 152 0 R
+ 153 0 R
+ 154 0 R
+ 155 0 R
+ 156 0 R
+ 157 0 R
+ 158 0 R
+ 159 0 R
+ 160 0 R
+ 161 0 R
+ 162 0 R
+ 163 0 R
+ 164 0 R
+ 165 0 R
+ 166 0 R
+ 167 0 R
+ 168 0 R
+ 169 0 R
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 89 0 R
+ >>
+ /ProcSet 88 0 R
+ >>
+ /Type /Page
+>>
+%% Object stream: object 5, index 3
+[
+ /Object-7
+]
+%% Object stream: object 6, index 4
+[
+ /Object-8
+]
+%% Object stream: object 7, index 5
+[
+ /Object-9
+]
+%% Object stream: object 8, index 6
+[
+ /Object-10
+]
+%% Object stream: object 9, index 7
+[
+ /Object-11
+]
+%% Object stream: object 10, index 8
+[
+ /Object-12
+]
+%% Object stream: object 11, index 9
+[
+ /Object-13
+]
+%% Object stream: object 12, index 10
+[
+ /Object-14
+]
+%% Object stream: object 13, index 11
+[
+ /Object-15
+]
+%% Object stream: object 14, index 12
+[
+ /Object-16
+]
+%% Object stream: object 15, index 13
+[
+ /Object-17
+]
+%% Object stream: object 16, index 14
+[
+ /Object-18
+]
+%% Object stream: object 17, index 15
+[
+ /Object-19
+]
+%% Object stream: object 18, index 16
+[
+ /Object-20
+]
+%% Object stream: object 19, index 17
+[
+ /Object-21
+]
+%% Object stream: object 20, index 18
+[
+ /Object-22
+]
+%% Object stream: object 21, index 19
+[
+ /Object-23
+]
+%% Object stream: object 22, index 20
+[
+ /Object-24
+]
+%% Object stream: object 23, index 21
+[
+ /Object-25
+]
+%% Object stream: object 24, index 22
+[
+ /Object-26
+]
+%% Object stream: object 25, index 23
+[
+ /Object-27
+]
+%% Object stream: object 26, index 24
+[
+ /Object-28
+]
+%% Object stream: object 27, index 25
+[
+ /Object-29
+]
+%% Object stream: object 28, index 26
+[
+ /Object-30
+]
+%% Object stream: object 29, index 27
+[
+ /Object-31
+]
+%% Object stream: object 30, index 28
+[
+ /Object-32
+]
+%% Object stream: object 31, index 29
+[
+ /Object-33
+]
+%% Object stream: object 32, index 30
+[
+ /Object-34
+]
+%% Object stream: object 33, index 31
+[
+ /Object-35
+]
+%% Object stream: object 34, index 32
+[
+ /Object-36
+]
+%% Object stream: object 35, index 33
+[
+ /Object-37
+]
+%% Object stream: object 36, index 34
+[
+ /Object-38
+]
+%% Object stream: object 37, index 35
+[
+ /Object-39
+]
+%% Object stream: object 38, index 36
+[
+ /Object-40
+]
+%% Object stream: object 39, index 37
+[
+ /Object-41
+]
+%% Object stream: object 40, index 38
+[
+ /Object-42
+]
+%% Object stream: object 41, index 39
+[
+ /Object-43
+]
+%% Object stream: object 42, index 40
+[
+ /Object-44
+]
+%% Object stream: object 43, index 41
+[
+ /Object-45
+]
+%% Object stream: object 44, index 42
+[
+ /Object-46
+]
+%% Object stream: object 45, index 43
+[
+ /Object-47
+]
+%% Object stream: object 46, index 44
+[
+ /Object-48
+]
+%% Object stream: object 47, index 45
+[
+ /Object-49
+]
+%% Object stream: object 48, index 46
+[
+ /Object-50
+]
+%% Object stream: object 49, index 47
+[
+ /Object-51
+]
+%% Object stream: object 50, index 48
+[
+ /Object-52
+]
+%% Object stream: object 51, index 49
+[
+ /Object-53
+]
+%% Object stream: object 52, index 50
+[
+ /Object-54
+]
+%% Object stream: object 53, index 51
+[
+ /Object-55
+]
+%% Object stream: object 54, index 52
+[
+ /Object-56
+]
+%% Object stream: object 55, index 53
+[
+ /Object-57
+]
+%% Object stream: object 56, index 54
+[
+ /Object-58
+]
+%% Object stream: object 57, index 55
+[
+ /Object-59
+]
+%% Object stream: object 58, index 56
+[
+ /Object-60
+]
+%% Object stream: object 59, index 57
+[
+ /Object-61
+]
+%% Object stream: object 60, index 58
+[
+ /Object-62
+]
+%% Object stream: object 61, index 59
+[
+ /Object-63
+]
+%% Object stream: object 62, index 60
+[
+ /Object-64
+]
+%% Object stream: object 63, index 61
+[
+ /Object-65
+]
+%% Object stream: object 64, index 62
+[
+ /Object-66
+]
+%% Object stream: object 65, index 63
+[
+ /Object-67
+]
+%% Object stream: object 66, index 64
+[
+ /Object-68
+]
+%% Object stream: object 67, index 65
+[
+ /Object-69
+]
+%% Object stream: object 68, index 66
+[
+ /Object-70
+]
+%% Object stream: object 69, index 67
+[
+ /Object-71
+]
+%% Object stream: object 70, index 68
+[
+ /Object-72
+]
+%% Object stream: object 71, index 69
+[
+ /Object-73
+]
+%% Object stream: object 72, index 70
+[
+ /Object-74
+]
+%% Object stream: object 73, index 71
+[
+ /Object-75
+]
+%% Object stream: object 74, index 72
+[
+ /Object-76
+]
+%% Object stream: object 75, index 73
+[
+ /Object-77
+]
+%% Object stream: object 76, index 74
+[
+ /Object-78
+]
+%% Object stream: object 77, index 75
+[
+ /Object-79
+]
+%% Object stream: object 78, index 76
+[
+ /Object-80
+]
+%% Object stream: object 79, index 77
+[
+ /Object-81
+]
+%% Object stream: object 80, index 78
+[
+ /Object-82
+]
+%% Object stream: object 81, index 79
+[
+ /Object-83
+]
+%% Object stream: object 82, index 80
+[
+ /Object-84
+]
+%% Object stream: object 83, index 81
+[
+ /Object-85
+]
+%% Object stream: object 84, index 82
+[
+ /Object-86
+]
+endstream
+endobj
+
+%% Contents for page 1
+85 0 obj
+<<
+ /Length 86 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+86 0 obj
+44
+endobj
+
+87 0 obj
+<<
+ /Type /ObjStm
+ /Length 5430
+ /N 82
+ /First 743
+>>
+stream
+88 0
+89 56
+90 195
+91 249
+92 303
+93 357
+94 411
+95 465
+96 519
+97 573
+98 628
+99 683
+100 739
+101 795
+102 851
+103 907
+104 964
+105 1021
+106 1078
+107 1135
+108 1192
+109 1249
+110 1306
+111 1363
+112 1420
+113 1477
+114 1534
+115 1591
+116 1648
+117 1705
+118 1762
+119 1819
+120 1876
+121 1933
+122 1990
+123 2047
+124 2104
+125 2161
+126 2218
+127 2275
+128 2332
+129 2389
+130 2446
+131 2503
+132 2560
+133 2617
+134 2674
+135 2731
+136 2788
+137 2845
+138 2902
+139 2959
+140 3016
+141 3073
+142 3130
+143 3187
+144 3244
+145 3301
+146 3358
+147 3415
+148 3472
+149 3529
+150 3586
+151 3643
+152 3700
+153 3757
+154 3814
+155 3871
+156 3928
+157 3985
+158 4042
+159 4099
+160 4156
+161 4213
+162 4270
+163 4327
+164 4384
+165 4441
+166 4498
+167 4555
+168 4612
+169 4669
+%% Object stream: object 88, index 0
+[
+ /PDF
+ /Text
+]
+%% Object stream: object 89, index 1
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+%% Object stream: object 90, index 2
+[
+ /Object-87
+]
+%% Object stream: object 91, index 3
+[
+ /Object-88
+]
+%% Object stream: object 92, index 4
+[
+ /Object-89
+]
+%% Object stream: object 93, index 5
+[
+ /Object-90
+]
+%% Object stream: object 94, index 6
+[
+ /Object-91
+]
+%% Object stream: object 95, index 7
+[
+ /Object-92
+]
+%% Object stream: object 96, index 8
+[
+ /Object-93
+]
+%% Object stream: object 97, index 9
+[
+ /Object-94
+]
+%% Object stream: object 98, index 10
+[
+ /Object-95
+]
+%% Object stream: object 99, index 11
+[
+ /Object-96
+]
+%% Object stream: object 100, index 12
+[
+ /Object-97
+]
+%% Object stream: object 101, index 13
+[
+ /Object-98
+]
+%% Object stream: object 102, index 14
+[
+ /Object-99
+]
+%% Object stream: object 103, index 15
+[
+ /Object-100
+]
+%% Object stream: object 104, index 16
+[
+ /Object-101
+]
+%% Object stream: object 105, index 17
+[
+ /Object-102
+]
+%% Object stream: object 106, index 18
+[
+ /Object-103
+]
+%% Object stream: object 107, index 19
+[
+ /Object-104
+]
+%% Object stream: object 108, index 20
+[
+ /Object-105
+]
+%% Object stream: object 109, index 21
+[
+ /Object-106
+]
+%% Object stream: object 110, index 22
+[
+ /Object-107
+]
+%% Object stream: object 111, index 23
+[
+ /Object-108
+]
+%% Object stream: object 112, index 24
+[
+ /Object-109
+]
+%% Object stream: object 113, index 25
+[
+ /Object-110
+]
+%% Object stream: object 114, index 26
+[
+ /Object-111
+]
+%% Object stream: object 115, index 27
+[
+ /Object-112
+]
+%% Object stream: object 116, index 28
+[
+ /Object-113
+]
+%% Object stream: object 117, index 29
+[
+ /Object-114
+]
+%% Object stream: object 118, index 30
+[
+ /Object-115
+]
+%% Object stream: object 119, index 31
+[
+ /Object-116
+]
+%% Object stream: object 120, index 32
+[
+ /Object-117
+]
+%% Object stream: object 121, index 33
+[
+ /Object-118
+]
+%% Object stream: object 122, index 34
+[
+ /Object-119
+]
+%% Object stream: object 123, index 35
+[
+ /Object-120
+]
+%% Object stream: object 124, index 36
+[
+ /Object-121
+]
+%% Object stream: object 125, index 37
+[
+ /Object-122
+]
+%% Object stream: object 126, index 38
+[
+ /Object-123
+]
+%% Object stream: object 127, index 39
+[
+ /Object-124
+]
+%% Object stream: object 128, index 40
+[
+ /Object-125
+]
+%% Object stream: object 129, index 41
+[
+ /Object-126
+]
+%% Object stream: object 130, index 42
+[
+ /Object-127
+]
+%% Object stream: object 131, index 43
+[
+ /Object-128
+]
+%% Object stream: object 132, index 44
+[
+ /Object-129
+]
+%% Object stream: object 133, index 45
+[
+ /Object-130
+]
+%% Object stream: object 134, index 46
+[
+ /Object-131
+]
+%% Object stream: object 135, index 47
+[
+ /Object-132
+]
+%% Object stream: object 136, index 48
+[
+ /Object-133
+]
+%% Object stream: object 137, index 49
+[
+ /Object-134
+]
+%% Object stream: object 138, index 50
+[
+ /Object-135
+]
+%% Object stream: object 139, index 51
+[
+ /Object-136
+]
+%% Object stream: object 140, index 52
+[
+ /Object-137
+]
+%% Object stream: object 141, index 53
+[
+ /Object-138
+]
+%% Object stream: object 142, index 54
+[
+ /Object-139
+]
+%% Object stream: object 143, index 55
+[
+ /Object-140
+]
+%% Object stream: object 144, index 56
+[
+ /Object-141
+]
+%% Object stream: object 145, index 57
+[
+ /Object-142
+]
+%% Object stream: object 146, index 58
+[
+ /Object-143
+]
+%% Object stream: object 147, index 59
+[
+ /Object-144
+]
+%% Object stream: object 148, index 60
+[
+ /Object-145
+]
+%% Object stream: object 149, index 61
+[
+ /Object-146
+]
+%% Object stream: object 150, index 62
+[
+ /Object-147
+]
+%% Object stream: object 151, index 63
+[
+ /Object-148
+]
+%% Object stream: object 152, index 64
+[
+ /Object-149
+]
+%% Object stream: object 153, index 65
+[
+ /Object-150
+]
+%% Object stream: object 154, index 66
+[
+ /Object-151
+]
+%% Object stream: object 155, index 67
+[
+ /Object-152
+]
+%% Object stream: object 156, index 68
+[
+ /Object-153
+]
+%% Object stream: object 157, index 69
+[
+ /Object-154
+]
+%% Object stream: object 158, index 70
+[
+ /Object-155
+]
+%% Object stream: object 159, index 71
+[
+ /Object-156
+]
+%% Object stream: object 160, index 72
+[
+ /Object-157
+]
+%% Object stream: object 161, index 73
+[
+ /Object-158
+]
+%% Object stream: object 162, index 74
+[
+ /Object-159
+]
+%% Object stream: object 163, index 75
+[
+ /Object-160
+]
+%% Object stream: object 164, index 76
+[
+ /Object-161
+]
+%% Object stream: object 165, index 77
+[
+ /Object-162
+]
+%% Object stream: object 166, index 78
+[
+ /Object-163
+]
+%% Object stream: object 167, index 79
+[
+ /Object-164
+]
+%% Object stream: object 168, index 80
+[
+ /Object-165
+]
+%% Object stream: object 169, index 81
+[
+ /Object-166
+]
+endstream
+endobj
+
+170 0 obj
+<<
+ /Type /XRef
+ /Length 684
+ /W [ 1 2 1 ]
+ /Root 2 0 R
+ /Size 171
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+stream
+
+
+
+endstream
+endobj
+
+startxref
+13053
+%%EOF
diff --git a/qpdf/qtest/qpdf/good3.out b/qpdf/qtest/qpdf/good3.out
new file mode 100644
index 00000000..7982e109
--- /dev/null
+++ b/qpdf/qtest/qpdf/good3.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is indirect
+/QTest is null
+unparse: 7 0 R
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good3.pdf b/qpdf/qtest/qpdf/good3.pdf
new file mode 100644
index 00000000..068e7968
--- /dev/null
+++ b/qpdf/qtest/qpdf/good3.pdf
@@ -0,0 +1,80 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 7 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good3.qdf b/qpdf/qtest/qpdf/good3.qdf
new file mode 100644
index 00000000..976ed2b2
--- /dev/null
+++ b/qpdf/qtest/qpdf/good3.qdf
@@ -0,0 +1,95 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good4.out b/qpdf/qtest/qpdf/good4.out
new file mode 100644
index 00000000..7982e109
--- /dev/null
+++ b/qpdf/qtest/qpdf/good4.out
@@ -0,0 +1,6 @@
+/QTest is implicit
+/QTest is indirect
+/QTest is null
+unparse: 7 0 R
+unparseResolved: null
+test 1 done
diff --git a/qpdf/qtest/qpdf/good4.pdf b/qpdf/qtest/qpdf/good4.pdf
new file mode 100644
index 00000000..326d542d
--- /dev/null
+++ b/qpdf/qtest/qpdf/good4.pdf
@@ -0,0 +1,83 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj null endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+0000000556 00000 n
+trailer <<
+ /Size 8
+ /Root 1 0 R
+ /QTest 7 0 R
+>>
+startxref
+577
+%%EOF
diff --git a/qpdf/qtest/qpdf/good4.qdf b/qpdf/qtest/qpdf/good4.qdf
new file mode 100644
index 00000000..976ed2b2
--- /dev/null
+++ b/qpdf/qtest/qpdf/good4.qdf
@@ -0,0 +1,95 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good5.out b/qpdf/qtest/qpdf/good5.out
new file mode 100644
index 00000000..ff2e3fdf
--- /dev/null
+++ b/qpdf/qtest/qpdf/good5.out
@@ -0,0 +1,5 @@
+/QTest is indirect
+/QTest is Boolean with value true
+unparse: 7 0 R
+unparseResolved: true
+test 1 done
diff --git a/qpdf/qtest/qpdf/good5.pdf b/qpdf/qtest/qpdf/good5.pdf
new file mode 100644
index 00000000..0d9b55dd
--- /dev/null
+++ b/qpdf/qtest/qpdf/good5.pdf
@@ -0,0 +1,83 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+7 0 obj true endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+0000000556 00000 n
+trailer <<
+ /Size 8
+ /Root 1 0 R
+ /QTest 7 0 R
+>>
+startxref
+577
+%%EOF
diff --git a/qpdf/qtest/qpdf/good5.qdf b/qpdf/qtest/qpdf/good5.qdf
new file mode 100644
index 00000000..3ace3aa8
--- /dev/null
+++ b/qpdf/qtest/qpdf/good5.qdf
@@ -0,0 +1,96 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /QTest true
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good6.out b/qpdf/qtest/qpdf/good6.out
new file mode 100644
index 00000000..17b498d1
--- /dev/null
+++ b/qpdf/qtest/qpdf/good6.out
@@ -0,0 +1,5 @@
+/QTest is direct
+/QTest is Boolean with value false
+unparse: false
+unparseResolved: false
+test 1 done
diff --git a/qpdf/qtest/qpdf/good6.pdf b/qpdf/qtest/qpdf/good6.pdf
new file mode 100644
index 00000000..790f700a
--- /dev/null
+++ b/qpdf/qtest/qpdf/good6.pdf
@@ -0,0 +1,79 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest false
+>>
+startxref 556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good6.qdf b/qpdf/qtest/qpdf/good6.qdf
new file mode 100644
index 00000000..1602336f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good6.qdf
@@ -0,0 +1,96 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /QTest false
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good7-not-normalized.qdf b/qpdf/qtest/qpdf/good7-not-normalized.qdf
new file mode 100644
index 00000000..5c6e9caf
--- /dev/null
+++ b/qpdf/qtest/qpdf/good7-not-normalized.qdf
@@ -0,0 +1,95 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+
+BT
+/F1 24 Tf 72 720 Td
+ (Potato) Tj ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /QTest 16059
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good7.out b/qpdf/qtest/qpdf/good7.out
new file mode 100644
index 00000000..ab14fba0
--- /dev/null
+++ b/qpdf/qtest/qpdf/good7.out
@@ -0,0 +1,5 @@
+/QTest is direct
+/QTest is an integer with value 16059
+unparse: 16059
+unparseResolved: 16059
+test 1 done
diff --git a/qpdf/qtest/qpdf/good7.pdf b/qpdf/qtest/qpdf/good7.pdf
new file mode 100644
index 00000000..e5f2298e
--- /dev/null
+++ b/qpdf/qtest/qpdf/good7.pdf
@@ -0,0 +1,79 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+
+BT
+/F1 24 Tf 72 720 Td
+ (Potato) Tj ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 16059
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good7.qdf b/qpdf/qtest/qpdf/good7.qdf
new file mode 100644
index 00000000..c338e80c
--- /dev/null
+++ b/qpdf/qtest/qpdf/good7.qdf
@@ -0,0 +1,97 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+
+BT
+/F1 24 Tf
+72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+43
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000474 00000 n
+0000000493 00000 n
+0000000611 00000 n
+trailer <<
+ /QTest 16059
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+646
+%%EOF
diff --git a/qpdf/qtest/qpdf/good8.out b/qpdf/qtest/qpdf/good8.out
new file mode 100644
index 00000000..5087db3f
--- /dev/null
+++ b/qpdf/qtest/qpdf/good8.out
@@ -0,0 +1,5 @@
+/QTest is direct
+/QTest is a real number with value 3.14159
+unparse: 3.14159
+unparseResolved: 3.14159
+test 1 done
diff --git a/qpdf/qtest/qpdf/good8.pdf b/qpdf/qtest/qpdf/good8.pdf
new file mode 100644
index 00000000..f766dba8
--- /dev/null
+++ b/qpdf/qtest/qpdf/good8.pdf
@@ -0,0 +1,79 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 132
+ /Filter /ASCIIHexDecode
+>>
+stream
+42 54 0a 20 20 2f 46 31 20 32 34 20 54 66 0a 20
+20 37 32 20 37 32 30 20 54 64 0a 20 20 28 50 6f
+74 61 74 6F 29 20 54 6A 0A 45 540a>
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000518 00000 n
+0000000553 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest 3.14159
+>>
+startxref
+671
+%%EOF
diff --git a/qpdf/qtest/qpdf/good8.qdf b/qpdf/qtest/qpdf/good8.qdf
new file mode 100644
index 00000000..19c75991
--- /dev/null
+++ b/qpdf/qtest/qpdf/good8.qdf
@@ -0,0 +1,96 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /QTest 3.14159
+ /Root 1 0 R
+ /Size 8
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/good9.out b/qpdf/qtest/qpdf/good9.out
new file mode 100644
index 00000000..75c40bc9
--- /dev/null
+++ b/qpdf/qtest/qpdf/good9.out
@@ -0,0 +1,5 @@
+/QTest is direct
+/QTest is a string with value ¡Hola!
+unparse: (¡Hola!)
+unparseResolved: (¡Hola!)
+test 1 done
diff --git a/qpdf/qtest/qpdf/good9.pdf b/qpdf/qtest/qpdf/good9.pdf
new file mode 100644
index 00000000..881392e0
--- /dev/null
+++ b/qpdf/qtest/qpdf/good9.pdf
@@ -0,0 +1,81 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+ /QTest (\241Hola!)
+ /Z ('žyÔãjø׸B^Q\n‹9”\rD|kã¢JZm:½l™\\)
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/good9.qdf b/qpdf/qtest/qpdf/good9.qdf
new file mode 100644
index 00000000..c9c3d69b
--- /dev/null
+++ b/qpdf/qtest/qpdf/good9.qdf
@@ -0,0 +1,97 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+trailer <<
+ /QTest (¡Hola!)
+ /Root 1 0 R
+ /Size 8
+ /Z ('\236yÔ\005\037ãjø׸B^Q\n\2139\224\rD|kã¢JZm:½l\231\002\\)
+ /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
+>>
+startxref
+647
+%%EOF
diff --git a/qpdf/qtest/qpdf/heifer.out b/qpdf/qtest/qpdf/heifer.out
new file mode 100644
index 00000000..5a9bb975
--- /dev/null
+++ b/qpdf/qtest/qpdf/heifer.out
@@ -0,0 +1,4 @@
+WARNING: heifer.pdf: offset 0: file is damaged
+WARNING: heifer.pdf: offset 92741: xref not found
+WARNING: Attempting to reconstruct cross-reference table
+WARNING: heifer.pdf: offset 51: attempting to recover stream length
diff --git a/qpdf/qtest/qpdf/heifer.pdf b/qpdf/qtest/qpdf/heifer.pdf
new file mode 100644
index 00000000..a3c62422
--- /dev/null
+++ b/qpdf/qtest/qpdf/heifer.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/heifer.qdf b/qpdf/qtest/qpdf/heifer.qdf
new file mode 100644
index 00000000..0e20c934
--- /dev/null
+++ b/qpdf/qtest/qpdf/heifer.qdf
@@ -0,0 +1,1349 @@
+%PDF-1.2
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Metadata 3 0 R
+ /Pages 5 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /CreationDate (D:20020815124312-04'00')
+ /Creator (Acrobat 4.0 Import Plug-in for Windows)
+ /ModDate (D:20020815124312-04'00')
+ /Producer (Acrobat Distiller 5.0.5 \(Windows\))
+ /Title (geese_w-anchors.pdf)
+>>
+endobj
+
+3 0 obj
+<<
+ /Subtype /XML
+ /Type /Metadata
+ /Length 4 0 R
+>>
+stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d' bytes='992'?><rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'><rdf:Description about='' xmlns='http://ns.adobe.com/pdf/1.3/' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:CreationDate='2002-08-15T16:43:12Z' pdf:ModDate='2002-08-15T16:43:12Z' pdf:Producer='Acrobat Distiller 5.0.5 (Windows)' pdf:Creator='Acrobat 4.0 Import Plug-in for Windows' pdf:Title='geese_w-anchors.pdf'/>
+<rdf:Description about='' xmlns='http://ns.adobe.com/xap/1.0/' xmlns:xap='http://ns.adobe.com/xap/1.0/' xap:CreateDate='2002-08-15T16:43:12Z' xap:ModifyDate='2002-08-15T16:43:12Z' xap:MetadataDate='2002-08-15T16:43:12Z'><xap:Title><rdf:Alt><rdf:li xml:lang='x-default'>geese_w-anchors.pdf</rdf:li></rdf:Alt></xap:Title></rdf:Description>
+<rdf:Description about='' xmlns='http://purl.org/dc/elements/1.1/' xmlns:dc='http://purl.org/dc/elements/1.1/' dc:title='geese_w-anchors.pdf'/>
+</rdf:RDF><?xpacket end='r'?>
+endstream
+endobj
+
+4 0 obj
+993
+endobj
+
+5 0 obj
+<<
+ /Count 1
+ /Kids [
+ 6 0 R
+ ]
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+6 0 obj
+<<
+ /Contents 7 0 R
+ /Parent 5 0 R
+ /Resources 9 0 R
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+7 0 obj
+<<
+ /Length 8 0 R
+>>
+stream
+q
+/RelativeColorimetric ri
+1 g
+/GS1 gs
+1 i
+0 792 m
+0 792 l
+f
+q
+3.617 790.98 608.383 -787.92 re
+W n
+q
+610.995 0 0 789.113 3.0369 2.5269 cm
+/Im1 Do
+Q
+Q
+BT
+/F1 1 Tf
+16 0 0 16 112.495 255.964 Tm
+/Cs5 cs 0.78 0.275 0.157 sc
+0 Tc
+0 Tw
+<01>Tj
+/F2 1 Tf
+14 0 0 14 164.401 206.964 Tm
+0 0 0 sc
+0.0003 Tc
+[<01>-219.7<02>0<03040506>-24.7<070406>-24.7(\b)0.1<07090a06>-24.7<0b0c0d06>-24.7<0e0a0a0f06>-24.7<0203090a0f06>-24.7<030f06>-24.7<1007111206>-24.7<0f0c130a06>-24.7<0e1006>]TJ
+6.7492 -2.889 TD
+[<140c1006>-24.7<050b030d06>-24.7<0203040506>-24.7<070406>]TJ
+-11.7937 -2.4191 TD
+[<0e12030f0206>-24.7<10071106>-24.7<15071006>-24.7<0c0d06>-24.7<030506>-24.7<0e12030f020d06>-24.7<0b07160a06>-24.7<0c0f1706>-24.7<0f071112030d0b130a0f0506>-24.7<05>0.1<0706>-24.7<0c06>-24.7<040c1303081006>-24.7<03>0.1<0f06>-24.7<0f0a0a1718>]TJ
+/F3 1 Tf
+9.75 0 0 9.75 101.201 106.951 Tm
+0 Tc
+0.028 Tw
+[(Heifer International is a nonpr)30(ofit that alleviates hunger)125(, poverty and envir)30(onmental degradation )]TJ
+-1.5183 -1.3026 TD
+[(thr)30(ough gifts of food- and income-pr)30(oducing farm animals and training. These animals pr)29.9(ovide a sour)30(ce)]TJ
+-0.7968 -1.3026 TD
+[(of pr)30(otein, such as eggs and milk, for childr)30(en and generate income for families thr)30(ough the sale of animal )]TJ
+0.5957 -1.3026 TD
+[(pr)30(oducts. Since 1944, Heifer has helped over 4 million families in 125 countries become self-r)29.9(eliant. Each )]TJ
+1.2818 -1.3026 TD
+[(family Òpasses on the giftÓ by giving one or mor)30(e of its animalÕ)140(s of)10(fspring to another family in need.)]TJ
+/F4 1 Tf
+8.1749 -2.1231 TD
+0.031 Tw
+[(T)80(o)0( learn mor)30(e about Heifer, visit http://www)79.9(.heifer)125(.or)30(g)]TJ
+/F5 1 Tf
+16 0 0 16 48.2658 742 Tm
+/Cs5 cs 0.275 0.275 0.471 sc
+0.0002 Tc
+0 Tw
+( 666)Tj
+1.9556 -1.875 TD
+( 444)Tj
+12 0 0 12 140.128 286.264 Tm
+-0.0003 Tc
+()Tj
+-2.1762 -2.5478 TD
+( wwwwwwwwwwwwwwwwwwwwwwwwwwwww )Tj
+-4.6179 -1.9108 TD
+( wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwww )Tj
+7.1656 -3.6623 TD
+( 333)Tj
+0.0531 -3.4502 TD
+( 555)Tj
+/F4 1 Tf
+9.75 0 0 9.75 117.723 24.2689 Tm
+/Cs5 cs 0 0 0 sc
+0 Tc
+0.031 Tw
+(To learn more about the gift you've been given, visit http://www.heifer.org/gift )Tj
+ET
+q
+375 0 0 375 121 317 cm
+/Im2 Do
+Q
+Q
+endstream
+endobj
+
+8 0 obj
+2338
+endobj
+
+9 0 obj
+<<
+ /ColorSpace <<
+ /Cs5 10 0 R
+ >>
+ /ExtGState <<
+ /GS1 11 0 R
+ >>
+ /Font <<
+ /F1 12 0 R
+ /F2 13 0 R
+ /F3 14 0 R
+ /F4 15 0 R
+ /F5 16 0 R
+ >>
+ /ProcSet [
+ /PDF
+ /Text
+ /ImageC
+ ]
+ /XObject <<
+ /Im1 17 0 R
+ /Im2 19 0 R
+ >>
+>>
+endobj
+
+10 0 obj
+[
+ /CalRGB
+ <<
+ /Gamma [
+ 2.22222
+ 2.22222
+ 2.22222
+ ]
+ /Matrix [
+ 0.4124
+ 0.2126
+ 0.0193
+ 0.3576
+ 0.7152
+ 0.1192
+ 0.1805
+ 0.0722
+ 0.9505
+ ]
+ /WhitePoint [
+ 0.9505
+ 1
+ 1.089
+ ]
+ >>
+]
+endobj
+
+11 0 obj
+<<
+ /SA false
+ /SM 0.02
+ /TR /Identity
+ /Type /ExtGState
+>>
+endobj
+
+12 0 obj
+<<
+ /BaseFont /KPPLPG+Times-Bold+2
+ /Encoding 21 0 R
+ /FirstChar 1
+ /FontDescriptor 22 0 R
+ /LastChar 1
+ /Subtype /Type1
+ /Type /Font
+ /Widths [
+ 250
+ ]
+>>
+endobj
+
+13 0 obj
+<<
+ /BaseFont /KPPMKC+Palatino-Roman+2
+ /Encoding 23 0 R
+ /FirstChar 1
+ /FontDescriptor 24 0 R
+ /LastChar 24
+ /Subtype /Type1
+ /Type /Font
+ /Widths [
+ 778
+ 556
+ 291
+ 333
+ 326
+ 250
+ 546
+ 291
+ 565
+ 479
+ 582
+ 500
+ 424
+ 553
+ 582
+ 556
+ 603
+ 395
+ 883
+ 946
+ 234
+ 601
+ 611
+ 250
+ ]
+>>
+endobj
+
+14 0 obj
+<<
+ /BaseFont /ItcEras-Book
+ /Encoding /MacRomanEncoding
+ /FirstChar 32
+ /FontDescriptor 25 0 R
+ /LastChar 213
+ /Subtype /Type1
+ /Type /Font
+ /Widths [
+ 282
+ 214
+ 333
+ 565
+ 565
+ 830
+ 669
+ 195
+ 283
+ 283
+ 518
+ 565
+ 282
+ 243
+ 282
+ 401
+ 565
+ 565
+ 565
+ 565
+ 565
+ 565
+ 565
+ 565
+ 565
+ 565
+ 282
+ 282
+ 565
+ 565
+ 565
+ 453
+ 768
+ 582
+ 569
+ 616
+ 720
+ 536
+ 512
+ 733
+ 710
+ 219
+ 358
+ 520
+ 447
+ 820
+ 732
+ 788
+ 512
+ 788
+ 526
+ 457
+ 475
+ 695
+ 620
+ 926
+ 553
+ 497
+ 551
+ 285
+ 282
+ 285
+ 565
+ 500
+ 268
+ 511
+ 570
+ 461
+ 583
+ 514
+ 271
+ 595
+ 584
+ 205
+ 230
+ 440
+ 205
+ 840
+ 584
+ 572
+ 577
+ 574
+ 329
+ 376
+ 292
+ 579
+ 468
+ 816
+ 445
+ 464
+ 424
+ 287
+ 282
+ 287
+ 565
+ 0
+ 582
+ 582
+ 616
+ 536
+ 732
+ 788
+ 695
+ 511
+ 511
+ 511
+ 511
+ 511
+ 511
+ 461
+ 514
+ 514
+ 514
+ 514
+ 205
+ 205
+ 205
+ 205
+ 584
+ 572
+ 572
+ 572
+ 572
+ 572
+ 579
+ 579
+ 579
+ 579
+ 518
+ 430
+ 565
+ 565
+ 518
+ 565
+ 504
+ 545
+ 768
+ 768
+ 830
+ 268
+ 334
+ 0
+ 795
+ 788
+ 0
+ 565
+ 0
+ 0
+ 565
+ 579
+ 0
+ 0
+ 0
+ 0
+ 0
+ 360
+ 360
+ 0
+ 820
+ 572
+ 453
+ 214
+ 565
+ 0
+ 565
+ 0
+ 0
+ 398
+ 398
+ 1000
+ 282
+ 582
+ 582
+ 788
+ 1020
+ 934
+ 500
+ 1000
+ 333
+ 333
+ 195
+ 195
+ ]
+>>
+endobj
+
+15 0 obj
+<<
+ /BaseFont /ItcEras-Demi
+ /Encoding /WinAnsiEncoding
+ /FirstChar 32
+ /FontDescriptor 26 0 R
+ /LastChar 121
+ /Subtype /Type1
+ /Type /Font
+ /Widths [
+ 316
+ 316
+ 389
+ 633
+ 633
+ 883
+ 728
+ 212
+ 351
+ 351
+ 568
+ 633
+ 316
+ 261
+ 316
+ 412
+ 633
+ 633
+ 633
+ 633
+ 633
+ 633
+ 633
+ 633
+ 633
+ 633
+ 316
+ 316
+ 633
+ 633
+ 633
+ 494
+ 824
+ 695
+ 651
+ 649
+ 752
+ 616
+ 574
+ 759
+ 778
+ 296
+ 448
+ 666
+ 531
+ 880
+ 792
+ 835
+ 587
+ 835
+ 630
+ 525
+ 555
+ 752
+ 695
+ 1073
+ 628
+ 584
+ 619
+ 351
+ 316
+ 351
+ 633
+ 500
+ 339
+ 568
+ 621
+ 489
+ 635
+ 561
+ 352
+ 639
+ 644
+ 272
+ 312
+ 550
+ 272
+ 896
+ 644
+ 618
+ 626
+ 629
+ 389
+ 446
+ 373
+ 629
+ 543
+ 874
+ 560
+ 543
+ ]
+>>
+endobj
+
+16 0 obj
+<<
+ /BaseFont /Courier
+ /Encoding /WinAnsiEncoding
+ /FirstChar 0
+ /FontDescriptor 27 0 R
+ /LastChar 255
+ /Subtype /Type1
+ /Type /Font
+ /Widths [
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ 600
+ ]
+>>
+endobj
+
+17 0 obj
+<<
+ /BitsPerComponent 8
+ /ColorSpace 10 0 R
+ /Filter /DCTDecode
+ /Height 790
+ /Intent /RelativeColorimetric
+ /Subtype /Image
+ /Type /XObject
+ /Width 611
+ /Length 18 0 R
+>>
+stream
+ÿØÿî
+
+
+
+     ÿÀ
+ 
+ 
+„”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêú
+&6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ
+Ó~¸«±Wb®Å]Š»v*ìUØ«±Wb®ÅVÆüÐ7µìz⫱Wb®Å]Š´@"‡¡Å[Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÝñWbª²É,\¤^. R>F•ÈD¥_$‡aWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZR§pkŠ·Š»v*ìUØ«±Wb®Å]Š¸N*ÕWøâ­â®Å]Š»v*ìUØ«±WöÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*î¹UØHWaWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZU
+Žƒov*ìUØ«±Wb®Å]Š»v*ìUØ«»ÿ
+÷Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅV’=öÅWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®®*ê UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÐP #¾*Þ*ìUتÐ
+…Oߊ¶­U„W±ëŠ®$ Î*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å\qWb®Å]Š»v*±Wb®Å]Š»v*ìUØ«±Wb®Å]‚•£…Zb¢•4®Ã]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Õßov*êo\UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«YAÁê1W"ñ@µ­;œUv*ìUØ«±V»ôÛov*ìUØ«±Wb®Å]Š»v*ìUØ«±U¡TTŽýqUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»q½™»
+Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®®ôÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»Býv­‹QÈËND
+Ç‘N
+¡GAŠ·Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZR{Šb­øŠŸ£Ü`VÚ´ØT⮩ñuö­â®ÅV…¡&§|UÌái^øªá°Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*´- ð8ªìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¸Šâ®Å]Š¨ÃwÏ*DáÚá(²Ô CôiZ¹$8׶*·zÓµ:â­†´íŠ·Š»v* pn$WŒT/§%wb~ÖÝ€ÅUñWb®Å]Š»Zå
+»v*ìUJxRdàßf Ÿ£|‰¡Tb+²JìUØ«±Wb®Å]Š´¦¢´¦*Þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZÞ¿«ov*ìUØ«±Wb®Å]Š»pÅ]Š»v*ìUØ«±Wb®ô×Ôõ;ÓÑ×_Š»v*ìUØ««Š»pÅ]Š»v*ìU¡ZœU¼UØ«±Wb®Å]Š»v*ìUØ«±Wb­mŠ-¨ÜËn!tS*¬Ÿê·ÃúÎS’e²"ѹsªáºn<qUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZn]±VñWb®Å]Š»v*ìUØ«±Wb®Å]Š»q
+ӹ銮Å]Š»ZXLUΤ©
+¹*¶Ä*ì*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅTæ…&…¢UQ‡MËn(’(Ö8Å
+=†*¿v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WtÅZ
+ÔnLU±^ø«±Wb®Å]Š»v*ìUØ«±Wb®ÅZV®*Þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUdlç—%¥ zÔxâ«ñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W\UØ«±Wb®Å]Š»v*ìUت×jPPší¶*à
+»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*±}Q^T;íAM¾óŠ¯Å]Š»[U);žƒåŠ®Å]Š¸€zâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WbªIsÊñ+ƒ"}¤î>Œˆ’ªáV•Tt­â®Å]Š»v*ÖÜý銷Š»v*ê
+×¾*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«A¨þ¸ªìUØ«ºâ®Å]Š»k¿Ïov*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«\¾*b­â®Å]Š­å¹;wÅWb®ëÓv*ìUØ«±Wb®Å]Š»v*¤ÑBÎ%( §Ùjn1U\UØ«±Wb®Å]Š»ukßv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÓØWov*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*×*-N*Þ*ìUØ«±W UØ«±Wb®Å]Š¸â®Å]Š»v*ìUØ«±Wb®Å]ŠµÆ;õÅ[Å]Š»v*ìUØ«±Wb«JÕ­)ø⫱Wb®Å]Š»Zî‹ND
+|N*»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«‰ ®*ìUØ«±Wb®Å]Š»Y$jåkÑ,U~õöÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«TMMA; Uv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØªÞ Ë—zR¾ØªìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]ŠµŠ·Š»u:ûâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Jj:SÛov*ìUتÊý5ü0*ü*ìUØ«±Wb®Å]Š»v*ìUØ«±U‹êónTáû$uúr*¿$®Å]Š»v*±Ä„¯Eý¯U~*ìUØ«±Wb®ÅZ&¾ìU¼UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUg3êq§ÃJ×_Š»v*ìUØ«±Wb®Å]Š»v*ìU¥$ö¦*Þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«F½¶Å[Å]Š¸ì1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*â*)Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V'~Ø«x«±Wb®ÅV»*)cÐnqW+ƒÐ⫱Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت›»+ [‘¡§aâqULUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUhêkóÅWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتÖPÊAèqUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتÕUU
+µcAÜâ­ŠÆ*Þ*ìUØ«±Wb®5튻v*ìUØ«±Wb®Å]Š»v*Õ
+…OË^1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«¶Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb­
+šŸ¼â«À¦*ìUØ«¨+^ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÀªõŸPpcïZÖ™WÉ«±Wb®Å\kÛv*ìUØ«±Wb®Å]Š»v*ኻv*ìUhåÈ’vì1UØ«±WuÅ]Š»hˆŠb­â®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±¥RœÊ8zb¿ä?Éï•IUrÕSne‡8oʽ~ŒUSv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»»
+»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V‰s¶*µ%‰‰U`Jý LU}:{b®Å]Š»v*ìUØ«±Wb®ñÅ]Š»v*ìUØ«±W`]…]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZ«x«©½qWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Õ~*SéÅ[ÅZ•÷Å[Å]Š»h×ov*ìUÀÓv*ìUØ«±Wb®‚˜«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Kã㊶MqWb®Å]Š»v*ìUØ«{b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š´¼»â­â®¨8«±Wb®Å]Š»i–«LU¼UØ«±Wb®Å]Š»w¶*ìUØ«±Wb®¸«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»P–Ýžd“Õ‘D{úh@V?åm_ÇWÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®éŠ»v*ìUØ«±Wb®Å]Š»k~^ÝñW¸Å[Å]Š»v*ìUØ«±Wb®Å]Š»v*§ ˜ÇûàïP¦£ñÅU1Wb« j\?B;øâ«ñU[«{»t¸ùÅ'Ùa÷bªØ«±Wb­2ÕiŠ·óÅ]Š»v*ìUØ«±Wb®Å]Š´9TøvÅ[Å]Š»iZ¸«Jªµ ¥w8ªìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ë¸Å]Š»v*ìU ÛÓ¦*Þ*ìUØ«±Wb®Å]Nþ«±Wb®Å]Š»v*ìUØ«±Wb®ÅVs_áׄÒü(v*êb®Å]Š»v*ìUªÕj7ðÅ[Å]Š»v*ìUØ«±Wb®Å]Š¬Ž4"…QÑFÃ_Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V늷Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WSv*ìUKêð¾×¯.ƒ¯Ž
+ µ\(v*ìUØ«±WQ\UØ«±Wb®Å]Š»v*ìUØ«±WtÅ]Š»v*ìUØ«€¦*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V›¦Ý{b­!$EqŠ®Å]Š»v*ìU®#•i¿Ž*Þ*ìUØ«±Wb®Å]Óv*ìUÕü1Wb®ÅVSÐ׶Þ##Äš_Q’ mإث±Wb®Å]Š»v*ìUØ«½†*ìUÛ×ÛÃv*ìUØ«±Wb­(aÔ×ovø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±U¤Fô§Q㊮Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Ž*ìUØ«±Wb®Å]Š»u\UØ«±Wb®Å]Š¡­l ·yÞ GÖ$õdÛ•’jÓ#›DÓ$Ó±K±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ««^˜«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]ŠµŠ¬šOJ%â_€-Áw&ƒ ÅTìîâÚ9š'€È+éK@ãçBqTF*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®˜«C
+»v*ìUØ«±Wb®Å]Š»h×·ÑŠ·Š»i¹Sn¸«x«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«O.@·sŠ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÛ×ÛÇv*Öü©M¼qVñWb®Å]\UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUkóÛˆ}ëኮÅ]Š»v*ìUØ«\‡*W U¼UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«Qh V´ïŠ®Å]Ói]OLU¼UØ«‡LUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت’ÛB.à(õ™eÿ
+V©5
+nqU\UØ«±Wb®Å]Š»v*ìUØ«±V«ñRŸN*Þ*ìUØ«±Wb®Å]Š­ä¼¸÷ëLUv*ìUØ«±Wb®Å]Š»v*ìUÞø«±Wb®Å]Š»j›â­â®Å]Š»u1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتÞ•­6ûñUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»i–´ö5Å[ÅZ:×ßov*ìUØ«±Wb®Å]Š»v*ìUØ«±Wbª~´~=øý9M*dìUØ«±Wb®ÅZ ­{ô®*Þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š´Â½éŠ·Š»v*ìUØ«±Wb®8ªÉK
+Õ“jÕ|†*­Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»i–¸«x«±Wb®Å]Š»v*Ð5®*Þ*ìUØ«±Wb®Å]Š»v*ìUØ«MŠ·Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*µùÓá¥{W[”'ï;xAüqULUØ«±Wb®ÅV…´®çÜ⫱Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ZW ¥M~“Š®Å]Š»qÅ]Š»v*ìUØ«±Wb®Å\1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*íñWb®Å]Š»v*ìU¡ZoŠ·Š»v*ìU¦åQNð+xUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]€v%\M0«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅV¨"µ5ÅWb®Å]Š»v*ìUjÖŸ+튮Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Ž*ìUØ«±Wb®Å]Š»v*ìUتÄpÕ¥vÛpGëÀ«ð«±Wb®Å]Š»v*ìUØ«±WLUØ«±T£ÍêÍÇ£V/t#+‰fQ½²Æ늻v*ìUØ«±Wb­
+‘ҾتüUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±U6ç¨èG\U~*ìUØ«±Wb®Å]Š»v*ìUØ«A·#Ãov*ìUØ«±Wb®Å]Š»v*ìUØ«±W€š^j6×\B%…¹FI½ÔÐþ#mH¥l*Öõ銷Š»v*ìUØ«±Wb®Å]Š»v*ÐêqVñWbª~¤}kþ}26´©’Wb®Å]Š­
+h
+Rm[
+»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅVÐ-®É+±V¹)¨ð늷Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š´H§"M*ÈeY¡ISì¸ +àqÕS$®Å]Š»v*ìUØ«±Wb®Å]Š»v*Ñ uŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±VºñVñWb®Å]Š»v*ìUتÖ`´¯}±UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÛâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Ó("‡¦D‹W
+ƒov*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ««½1WUØ«±Wb®v*µ:†]ÁÅWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Šº›×v*ìUØ«±Wb­0¯zb­â®Å]Š»pÅ]Š»q­6늻v*ìUØ«¼1WSv*¥,Ü:¡=¶ÅUªµÅ[Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUm7&¿F*»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU®ÿ
+b«ñWb®Å]Š»v*´¡êø«jO~¸«xªÖ*)SJì1UØ«±Wb®Å]Š»k½qV߉ë×Û]Š©Ì…£*¦‡mþœU1
+ì*Ñ4ë튷Š»v*ìUØ«½ñWb®Å]Š»v*ìUØ«±Wb®Å]Š»¦ø«±Wb­{b­â®Å]Š©Ë,Q'9*Ô
+± ©4Ž*¨1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZŠ­~ø©O|U½¸íÓÛov*ìUØ«F´ÛowËv*ìU¥Å[Å]Š»v*ìUÛLUØ«±Wb®Å
+3ú\WÔåNKNë]ºv®¯?m|7ÀUyÂUØUØ«±Wb®Å]Š»Rç)”©Œ„¢JŠáN¹ª¹%v*ìU¦åÛov*ìUØ«±Wb®Å]Š»v*ìU§ãO‹¦*Þ*ìUØ«±Wb®ÅPšèÿ
+´9o_£ov*ìUØ«±Wb®Å\ißv*ìUØ«Mʆ{b¨~Wû§í×õeR®_k'ÿÙ
+endstream
+endobj
+
+18 0 obj
+18458
+endobj
+
+19 0 obj
+<<
+ /BitsPerComponent 8
+ /ColorSpace 10 0 R
+ /Filter /DCTDecode
+ /Height 375
+ /Intent /RelativeColorimetric
+ /Subtype /Image
+ /Type /XObject
+ /Width 375
+ /Length 20 0 R
+>>
+stream
+ÿØÿî
+
+
+
+     ÿÀ
+ 
+ 
+„”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêú
+&6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ
+⮥:ý'll}†*Õ?Ìâ­Ðtû±Zu1M:”¡ÔéOŠiªn6öÅ ë㊸÷Ëu+×æ6Å]M«Š´Gá×犺‡éÅiÀ}Ø«TÅZ¦ÞÕÅ]LU¯£j›ä•Ô5é×hß犼çóÇ^ú§–­¼¿Ïטæ4‘m¡e{†Û¨+E§zæ.§%F›°BËÓ¥¿±Ó–+ìÚÊÙ’ÞÞÙg>«D–bÌ#
+ÔýŸçæ;ÛÑÊ1Ú«¹•~Ofÿ
+¥-Wzb*<3y ‡A®ß1z úæ{ˆ°Œ)k‰¯O–*ò†ü´ó|×ú¢Ã“M%ÉšId0·Ãj¼[í?!˜RÁ##¾Í#­ÿ
+xíÕzÍÛ‹cÍ–üÓë…•­åX¨$d!APÕ>X¨?I¦^ÆCgùëTú¶¥oÕÍÖžn.m”éó-TÇÄŠ kcêÆY¸°vaÓ~Ù…9üÚˆ€eGŸõ¼¶î Ò,.¡×Ä1êPAwë´ºlWwj©YŠ=&Œ´–åw?|]J•oƒøý(…~¿Çâžý§ÞCr­wPÞzƯsÂÎîZ 4¼Y¸×ß}†fã&€l≺䊧ÜrÅlW·õÅ[ú~œ
+¡{
++ÅfÐs·š æÛ”…“<fØn`jâ ›st׶Ým…[Á ’Jm­åžó~0%xP‘¨;UœQsRo“µn@Ýèß–—úÿ
+<Çíd"AßÏÜ‚_Ë+gIïü»vå­Ã@ñܨŽ4Z+/îÀ1=i¸¨jó'&q ô…BÙW“åÖí!M#\ÓÎú8‰ý'oé˜/d%¿» Ç„|h¿<ž#FˆZ$2z‚+PG†^†Í?ϦpwnØQK-@åzq¹“¯AÊürêÌôaÚ÷æ1Ó5›:­¿Ñ„jÂêCÞ£§"
+òŸËN£|Äͪ”e@98´ñ"ÉKWó[Puc°ŒŸÛäì)^&•aöNTu“îf4ÐïO¼›çÍrúk{ˆÁèˆ.­ãa
+²KÁá‘É`†ä¾49vŸQ)Ê‹^|" ÊÏ\Ìq\iÓ ÅZ#3¨ ´tæ£öy
+­~cZ]áMÎ*×O–+N¯öáZw…0+ºáW~ª×¶wÏïÅZ­6=±R4ë߶ÍOÑ…Z4¯Ï­ð´ÕvÛéÅÑ ö¥2Ó”ãUšõ©Å\Tb@Uâ{žUåÛ¦U“·FØêËý:s#¬Ž÷qN]nE.ŒŽJÄ|J6¥A4ðÈ”i°JŽjTòU·—é$(>¶ü½KÙT#ª8¥Û¯á˜xtâõr5¯oáîýl‡„Ø%µÊ¤ð–v•
+™‹³ gâm©™"$¹¸†É,bòÛê×RÀ eFøþÒ0ä§î9— X¶’)Güü2h¥§ ððÅ/;˜—JD²@…>¬T@Ÿ½ÐÝdF4<~ÆaÇS¸ÛÞÑ,§zø1“ç-Yõ¸5Y¢Ô«L#RK~a‚2ƒÄŠ
+þ¼®YdM¬%BüÃ-‡ó)EäßZ´AlÄU‰Èm¯Úå»æéóˆ£ÇãÜ‘—Ÿãñæ²Ïó6O_ý2M¬Ž´(Ä2! <7<¿ÙwÁù“|¶üsXe?Äט<É \êq¼ÚÖa¶õÝÔ„™äp /' G““pèMK&Hšµ9H69ï_¬ý©.§hÚ”÷ó^¬Q]G5­Æ›w"ˆfy%b“C$z'Ó®àД;zoŠDŸÁl‰ë}…é‘jºwI§A<aø€#ˆú5Ø;ÔôUù÷ï™`ðÐIÉ4Œ~hycÕXý;¾&¾¤ž’ü
+Ž*ôcô 1È&Ñ QÊOvjP04Ünù+eKd¹¶‰¡I¥HZáŠ[¬¬Èê§*r?,lU±$îWÅ<RK,1¸imø‰£iyÖœ¾|q°•¬E«4R8GºŠˆ± n *>ý*,‡ñ~;ÓÓñÜ«nTKvõP­:ž~<¢Zoßa‚?QIä\ÝÛZÁ$ÓIÂ(©Ì€XÕP
+Ô““$ ì„O0h¦Ù.í!VBþ”ß‚ŒW‰Mêj½› L€C7<¶±ú‚éÆc é° Ng Oøde’"ì„  ¤·ÿ
+À/2Tôû;â òbd5¶,°=ÒÑÝÍ$±È¿e£JEàB~9oeœº*´Ð¤‘Ç$Š’IËÓV!Kzc“Ò¾ ×&ÂÔþ½aÍã7Púˆž¤‹ê%Uí^›bŽ!Þ²çTÓmnb·º¸H¤™]âg4Ž‘z‡á~•®6¦@snMKK’^À±°%]¥J0SŸšïB)ŠñŽö†±¤µ´×+{[ÁžiUÁ û,i¸­6Æ׈7§¦Í*CÔo4‘¬©oÓeæ¯Uñ¦*$_êú^šœï®£‡nJ¥ªì¨*‹V51S0ïh“ÔA¨A!²ãßü‚9bòG‰õ‰æBDWk#/:ª#·÷oÁ»7ß„ G[˜´9îšÒ+ÔúȨ¿$äV•àX
+Ò£@Ù ´\[1@²ÆLˆdŽŽ§’-y:ïÐxâ¶J?éô÷Å(}Bò )o.‰X ^L@©>}ÉÀdÒËcÓõÉ'’dŠ @„ÉqÅcwegÅ @µø›âÈ‚6F9qH›=V{m z‘ZÆYã*© ‘Ûaʼϼ¹¢¹PÜ—2Q¡L¥g.ü#u2*4Ž¤ÐÐR¾ÃvŨ—ÙÞA4'‘ -y+nÊ<0¦$§Všåµ[ggXíšô£Þ¬Cªõ¥·|æÛ
+8+M¤ããã„gžÌü3d ¼Ãç&ÕæHîµ G+‚)8¯ _Œòb@«ø׶øÏ<ååA#æúþ>K-üѨÚNaU)o]ášgy *‚{m•ñʹ–FI…Çæ½wnðê#×øÜq<
+Ÿål2G,ÿ
+=xÊbãû°›2³NMü2³–c«t1’”ë~hF½[[{ˆ Å9Jü“Ó†#ñUªÝwí¾Gy,eR¶“E<cQ)VVžè
+Ÿ]¢‹Ôø£ »ÕQSʧ Ä T­ZVÆÚwFf}žn;ÐÔlŸùTæc2Øžh”»¿¾´×, Q.£€XÉN)N'ö{Ž¹‘“^x>DS‰ƒAy<N#´¯íè–\Zz6?^Êb2ˆy­6•¾5¨4ðù£1t™ %ÅWN_h€qÐú­oæíBÒá·…L
+ª2ì¯É*€Õ@5ßÜæ|5¼?ÃÑÔ˜ñ]íº÷[¿¿1‹ô’xãæœJŽŽ%,´j>œ2í ;EˆÒØú¯îRYíÙ‘ÖÓÓ••Ü€U£’¡ÔŠu*~ŒF¶#ø~ÖRÓžðŠ{ëgÒmôùaybF˜ Ü3siñ.ËBv²_}%–#få¿I.Zá  xzqC"ÆÑFµcð­ü›—ûxN»þÃÀŸx´Lhp¥¤P·DŽ&fHØ°Šž˜‘ˆø»õÂ5¸ÿ
+~ mÁÉn>`
+GcHÈuK
+ÎËÇê·!!–¡h~!ܵrÈkqÙéðe,RîÝ«‹Ëid[‚-®¼y(b¦N+Ö§†Z¼w±ø€Ã†Drn×QŠÌÑ<¶ò´ÆG‘PÇÅQŠþÂ6jq’OͶù(Â`ýÚJœãŽÙ­ã‹˜(=Gv“ˆ#jß<6+æˆN¹uW±½žÖ脺»¹2¢¢‰$$hOIYƒ=g¶OÆ„ üÓ 9¸óî·jZÅÚè×>´s\³ÂÊñÄÄm²¯ù Õc”i³ò¹a¹3 ,ÊV¶÷#e½‘ 7oC(–#ÃÔ£*ªï²¨¦cž{9x€:Z]¤ÛÞ…¹½H^3<ËêK-
+7éQÛõäá´o½œ÷“.Ñ`™®žç„ „1 ®seßèúpÂföXÊ-®ÀF
+'+°
+þ#·^øm—0•j×·CÌÜ%g{{[(ÞÞ¢‚G’B‘OåP«ý¹Uú›#Jÿ
+!'©VF£SðÃG½Ÿ‚;‘I¦L$xítÁeæYaˆrQ±`iñSÛôøgù¿j.=RŽ&º:0$`úóq„Ü·°Ûcà×ðý¨È´0q+š8ªzƒ€Œ+)3öOуÃ%Ÿ‚@úBYëÆÝæ¾’ï$b¤T¯*ü<)Œ5¿ Qé^`’"RÍe %fˆ(jÐ)f ŽØ<4ør€CÏo²ÞÜé-œÁŽ)Ib€°Þ€°¦ô­0d1‰˜þM&˜}@æÒÖÜN(.%XcBÊ+Åå¦ÄòèÙ!YÈó¥=GËQ2êz…¢HÅ yØÆÅd?b9u¾Õìzáá˜ävYD]«.—,¶"hR%ƒÓõcI¾%ô8×’€½ïÁÊ1­ù,L¾umëË
+**À÷úpÑèÄbp?SVÓki9¶—÷¬ÜžÚ_OÔIaçASUâÜX{d Z#‚q4/Ésk©…<= "¢+-?ÝlÌÔ*ßÈÄŽMçÂÿ
+À…â#VÂpÇâ'’EÌðÇ™óü}¨ÿ
+Õ~~=pVìøöCëZšÃ®é¬-âr-d Ry#«Ž<@<výžUñÊÎÒgÜ>*^{ßÉ«)MµìNìǯ6h‰
+=ÈK+Ù^,Ö³™–DwXàk¥˜€6 8mÓî˶·_‹ ÏÞ…Ô¼¥i:ÜO0E"’<¬$Uè{rcZq¯^žøÕ2–ó(M#Ê w1‰X­âážCNM]ö¯!ôãv±À
+ilâ”<Ò\͇GŒJ –)((LÄ:îzm¾_ÊE§ù "’æÑgŒž&[ɨjGÂß÷n?NPÁÐ/·ò½•„Ô])eµ˜°õÙ„ñ©~›•ùk¶ F÷gF<‚2×Ë6r#Ëk*]Bü„ dxÅ
+@Ä4ÿ
+ü[.݀ɜ‘™ŒrKN“e$×M×½D|Ùäh@£ò‹à‹#r^ûwn‚ÉÄ`6I]£Gæ}:Þk3uss`ò3ÚÈÅm®cVQÁĵ47qð2õ^ØŒµÉ—$Q*Ó&­wjSR[?^Uá,±•‰f@A<㣞ü
+øâs2ü½Š–íiÉw¦I!†â#¸q$è$šUÇðòt4#í0ëÜo¼û™ÇŠÝKHÐuq!Ô£Žà:ݬb 8“º°‘J“]Îÿ
+Ú¾9
+-¶)³6œ²‚–à)ƒ É¡­7ø°€Pgt—±˜Â[ÙC;Üʤ¯ÅØ×
+íË&#¹E¢-¬î?zd•ž¦Š*E6§l”Açh4żçæhôMBÚ(¸´âfÕâe’o«
+~¯úJ(¦æEjž±J·FË8Å¢Ó¸ò{e·½›î"Ræß­UÃ@ìÃ~­·0.í”H)6¿Yµ.ÝP4ê”T°+@”tßí}9Xr =ÞŒó%­ßøS†PìÖñ¤ˆÌœc•%ø ê „ýôÊuTq”éèe,bà"½Cl7÷횧d·â-Ä¡¨5»S¸«_2%®¢²ÊÍn×-Å&åÀ-*+ÉOW;ïÔf_Û<Î3ê»f¼Ú¦Š$µŽãP*þŒGx¸nÊÈ8—ïû9e’2”Aˆ-ÛÍæ:Ék ‰ÈZ2‡Ž­B´‘I¡Û½7ÀÕ¢6¶y ä¿Vš6Hs4¬`õVJ•ëÓ$2lìxUžîÝ%lH`6©®Äáñ86·M; oåš³úvòª—‹aEVˆ•r;6Ƙ™ß0±ŽÜ÷PKc®ÏªÙÝú¶wpÒK7 ¦s§/zõÈ™uê‘
+%[S‡KÕ>«ªÚÆ‘êö©‘H3|>›²rMzøtœˆ8¯qÍtÐCªZÖþÂ5¼‘8HÜy¨?²Uä¥_o ‰ÞËÃK´»1Y™êåoQ#hä—KʨÅ4¢
+0ÿ
+{W “TBem£Þ²úqDJò,[¸íÐ{a'f ÚÓÊws02(UUûLEzצ]O90–@o(:3s‘xžÃ-ŽŠG™`s„Â-Z Ø×~´9|4q rÌ‹‹G³ŒÕWmë°¡lpD0–BUÒÊÝ:-Ë,‰’¯£Ú€ŸC“¤.TŒŸ†;!µXÕi¶Ûví„+„q”'[ôÓu®ÇîÆÖœa¨öü0q'… ó2jÞ¼P¾ŠÖ4ŒÑ…¬ÜØìõ­)N™ƒ¬É G s4¸ÁÃÔœÅ<ìO¨Îß¼šB¼¤”…¥¶
+’C|ªq°ˆÆ…]Øݽâ!AfÒ1»—Òô Up´ŽH,ìO£søå93Œ{–x0™šPòø‚ÇR³Ó4Ç h‘·©!DP‘URß¾aèòŸÌF7·_}9Z¼CÀ”Œhô÷_OØÈì,õK{«énõ'½‚æa%•©Š(ÖÚ €zJè9IV«rc\è#É.†R
+eíJt¹-˜L“ÕZ=Ìžc0ɧZ\ÜÚ.шGK fr‘°ÿ
+†RhHʼn„zΩ<émkhÓÞ?ºEgrHÜðZ±³ã=Û/"þcjDÑi†Ö ¡¹]N"/^áEYv>1 g
+ºåÇæD#›§Ž"
+:R™°Ðå90ƒÕ×ë± Yˆè˜ZØÞ[ZÚ¤ºŒ—ˆ³ÜÈ ™EÙ
+‘]ý²')™ØÖì„
+žeˆjžù«Ï‚Tg·»ð\ìÆR†þô—L‹ÌVúµ‘Ô `·uzL@T5¤htø€ý³V4&Gú~EÚËY â—ܶóø—¡Zù¾&¢N„?íØ ææ9âyº éHä·Y†×VÒ.Y`S=¸$Õ]àWÅv#2#!vÕÂG6$R¡Å
+aøÔ}¡™\$IÇ9@ÈÖÑ4>»ÊŠf…Ô<2‚ ~"Gü.l4úfˆÙúÖäÉnc­·«Fxä=96ü_v*ú&Þæ壆ÛQ25ÄqEº©ýýË2 Vk•`¾¶ýþØñlÕ
+qž.{KùÃî“MŠhÃzÔE,oQ%IߨUwÛc±ä7s0ÂPžãöþ;óFÑDÞŸ¨c?HÍ\r=‘¶mÎûÖ™`6çû”3õr^Rò/îÕ¹)RHmÇ-úøclkdâãHÓ¡
+n'™íʱ““±
+ †8ʽE–Ic'Ò1ù#KóMÕµõÐX/í¨¢êÙé$°T–·—o°NàõSÓ©Ã’Cd㘉LXׯ⹞×I±|b¶Í.¬òGÆ8ÏÖþ¤Ì 7g1òñ¦h'‹ÔD‰'­n~Úôå3
+JŠ¸£~6Á§_–‰yW™­¾¦.`ž6šK9ŠUÌÓÅhÙfP QuyµážêýJžfI
+LAñ5b|3X}E¼L®l zá«m,&HÅš°ªÑW§‡AL°Àsè‹kË–Ú„×*‘£’É'/js 7Å‘Ç)PI4-èšLW—EŒÇpT¼ªÅkÕŒj«øo™’Î1ÃŽh†#9T±5]@Áaq ±hʳ@ÒЖfZòPzwø¸ýžs”Ô唥)Œž‹œóáü[1‚ÃDÕ´M-5kHncU‚ê k…ˆæj® ×âZõ΋KY0ÀžçžÔñcË0;ÊatðËP8ɘòä®ëLËq€! ßæ2h´é˧}²j—ùÎÝ[Ë—É¡x¦¯P8¸ G‡ÂÇNû"wž—Še­ z úí„ ¶“×åAì´©
+]•Gòª÷ÊòLÆ$lá#V¯q®yÞ*A5Ì—'hÞúÞs><#WûóQ©×dþOØìph·õ
+ü~@G9"?§%!vÍq–éŽ.ð™Al"‚9bv9¢v³… êBò
+ðšôÈHÞÍë~„ÆHk"ðã0_Ò
+J’j
+råEÜV› ˆc-öéÏö¡ÒîÞ7)qš(÷P¬€Ü
+NÝó:yÍYupÅÅ m{äo.,–­q¯êvñ„2CMRÃPB«_å'1óqä1²ça†æ‡Ÿ_ÇÉŽ_yâ8g–a£\ÚÉ!ä÷)u#õþ`¼{.aËC0(ßãÞçGYÈ„ÛÉ~lÕ&ÔÖîÏG’òÌFê÷QE)ØuFçå\–‹NqOˆnÃ[š91ð³güÀº· žÒXŸù&FZ{ü@fÔç=Σòñ+¢üÆihQâè
+Ôí\„‹9Ê÷y÷æó ?0éó
++ÈŸÚ|[n?EFb
+% "¥ßŠÒ£Ç
+Ênü¡¤G¥Ád. ×Ò’M,gg&Œñðª
+:sCh&Ydôô‹Æ’K¦:rN(Y¸‹o—\Œ“mÈåÞõ¿'F”-X…I®]‘kÁO¨ƒ[¢×rzõÍŽ˜©ÄS» `o 4¨EžW©<•!O~ŽùwáŒÎÉæÄ“Eä-A!?¿™­âF$+zbhµø{í•jeQaŽ<Wîyg‘5Xôÿ
+
+úw’¼Ë}Ä­™¶‰·Ý7§·ücÞO¼ ‡2@ezåž™
+Ô®$º›©T>”cäXý'ËYŸry¦ùc@Ó”}ZÊ>u¯«"ú²u¯ÛjŸ»ìLËWözÍÜŽ¿^[[n‘Ç’í_çr¦U(Hžt!“Fâʦ¤A§# ™›«õ­~Öç©=ðãÂ!É–\ç"]28|/^Ûá©#2CQM,"W‘ƒŸ…V«CâzÔS#6 Ò`GôÀ® J~-ѧ¾¸Ÿó8±µ) ‚dã,k"ÿ
+ °Í)ì-´»$’Þ+‰®d)ih-4<èèU€¡QNÃ0õPÉÃ’¢mw“_—‘´±Á£g[‚¼ˆ&êAÔÿ
+2%—XÛˆæUãŸ*·Y·'sZåå¦FÃüè³K¯ËÛÕ’6’8æ·–E]¾–¬I§‡ã˜ú¥žwî|Í­ëwú|±½ ,öàM ”êÀ´-Ghªÿ
+ÀÑFyD“àIvR–¼›cšÏ¹Úä[)¶ÖãHÖxAweW¸‚µn+±ö@ïO|¾3¡cŸV…š<º2í1c–Þ+ˆþ(åEpÕ$:•Ø¨?Ç6p1:¬»H‚ŠÔ-ÄÖÄ
+FY½Šÿ
+r86·¢K§hú¼WW‰g±S,/VVB>!ЀÒֆ£.Œ€—sÄ`x‚O®d±kÔÆK^¡é\“[}Ø)KƒûdK0W,m^…ù{oMÖ"ŸXº“n„ª* ?ðUÈvÎGfyé¯NÀÓl²ÜBóÍ qþ8R=Hž6’‚Œƒ(-Ö£‘ú0MØŽì3È[s&òEÈK¹ã5âåŠlJ×íü¿^SÑ ° 1²ºš ¶µp£@~
+«ý€[u¯à‰ ÒÎ ‹ejËÅI5¨µœÈp›ªôï…Ñ54׹ŵÇs¾ß,mid°E"ñuä­+áã4ƒHk™u@¶*ОLÌ´
+?•A\«'z[1ˆ]È¥pó8
+ÅGįµj|i_»&%êdcéL0md*yÕK¨mÏ%í×'-âÓR DìJªUÙ9JœÔПòzý†2Žn|°”Ö9®§Uao(ÿ
+±'…~¾KÇGƒÕ€Ôü³kn±£°$ôÀca¹v
+¶¨y*•?h¹êrØ‚ãÎc§>ôbªªÐ¹©Éµk©¶v*Ùâ:¾ e±‹ÖŸ OBÄþ¬E!t>º™Ã´*Í"%(¦†œ€©ú2$ŽöB'¹(·TXêÌIZ*<Gq•DŽ®Dè‹‚ä£!UdRh*SÜ|²ØËf©Ác¦éöµ’ÞI\–iiÉÏ#R9éíÓ"1Ħ2Ë)lJ3~½~ycRqVi·^ر+d¯iN§·Ó†
+òú t,ÌMO€ÓÛrÎ02Ù†yËLk¿(뺡·/tÖí"[(Á#âÍSZé©®Ù“2­Ü““„pñ>ò¶QGi¨?Ö==)SU˜¬lÜ•yñ÷sÆ&1Èv²Rë»K;˜ÄR\ýv퇹·BÌ®Ƥ1
+dÝ*S¸d쎌1ȇԚl‘ÛúêÕÁ\4cP+µ7¦gÂB‚r@îœ
+Q÷åÍ$—÷‹a¨Ð‚Eõ@õ<Z•÷Êe1äã‡VË©éÓúÀ&ŸÝÆäªÔƒRÔ¦BsæʧH但 ^R…”9$@ 9'¯ûx8øB>)-ŸSŠ5UDnRT¤a~/pTe±Êaàyìë[œz·`цÑn*?ÊÂ<ØÊu´^Gù×ç-5¸t=?ÓKñ, ÈÍY® X€vŒu^§¶bç<Rò ¸òxpï‘Ý1ü·òg˜,¯^×(å’Í ²€sõKKÀI<ŠÀù$`ê*qƵ‰#ÍèRJñ”;“öO_‹u5ÞŸÇ/œ©œ" D%¬=»õ…ú¨wÐj{o€Ä™Ñ` —éLRHþÊ°¨è_ºÃI~Þ8U¦u®ì1¦*/s
+þدb;a¥¢–^ycËz3ßiVwS; Í,ÁÈûAøsåþUr³Œ6 ɿ˶‚XcÒ>¨!Ÿ”‚¾Ñ_ˆZTäY çŸV-ç« h¾aòÏ–¬áßjwpÅumëÉÇêsH"n|˜·9 ¢R‡©í”Oxƒ“$¸ '¦Ì?ÔÌÇÜÎH§‰¹ •NU5ï„–M†,›‘)ÎÇÓcìi÷aä¼ÞÍ¢ÇtåÌoQFZ¿´¨ouÈã#‡šrÄC+°¼[ÀŽKOµË°ãÊ.¿Óíµ )¬nÓ½Êä^‡Ø
+uÂQåÿ
+¨Ó1!ŠÕ”|4÷ï„@جw·MËãŠòèI?ü2$‚Û+ˆK?3ï™ä zá{s‘ªÀ=Ó¬
+†”¨ËYÕ&zd®Ñ†ˆI ¥.ý:m–@ØhÉ*ZÞ…mªÇM,°</Ê9à*eøÕÇï·lÆ&ŒyN>HkO)ZÛ78ï®ü\Âv÷ýÞU=OãàÝ-Q—Aøø¢¤Ñ¾?U&c7Bò¨pÂN9c½ÁÝ„sVÄlÕ¶­u¸{y*Œ¨¬¯Zü*ÈçÛÃ#ŽUåœ%Èx…ôÄýaÝÄ+fùÐ~9x'¹¦B#“Ó|‚ñþlkþmÕ9Í ŽÑtf%ýÏ ä"¤´‘¼|W—Ù OqƇ«tÌرÜÍeGw,Ƭ6À°‹Q°¤.½,PØ—d.Šñ×á!‚—™YwÊ5·é2N!‘^5en[Šœk·\¼rq¥Í.ÖêЬë@…‚ȧ¥OJe9O¶ì£Hh5ØØ* T¹¯Â6 tܶà 2ƒ²g€ó¦Œ–ÒIHËu%C•4*Ö»w¦ SÃ!܈6ÊHev «»šÐíA–Šä×Å%3v’8Z¡UWb=÷üp‰)… ,[óƒó=|ƒåÅ’Î8®¼Á}ÉtûI”øïgF á}«Ò¹ ζ Š¹äùfo6y¾(í¼Ò׬5ËÉÞâ}I£ŠIMÜ,D"úkð§Ù
+¯¦ÛKs{m·¨^XÃP
+á‹,›sNmíæñļ”PH =ÆÛå±ÜyHW4r+q©È
+n2MGšá¶(q>ØY:»ï‹XÒ¢Ò§¯†øiTýgfâ´þ<4´çykðŸpR„¶íþj
+ì7®G<€ °D’“"N’ú¢FŽ^A¹õz%)ðïQ]ó
+Û—µS(±º"DfRŒ´äNÍã¹ÜÕ™p‘¡nà Ù8YyPŠ/‰©í—´¸H• `I¨ #¨ÅP—·7@ð¶E’J€:÷Û!"G&Pˆ?R'V3]HSö"…=v!’=ÊdEP=KPDfk‰HEE$©LrHD3Ç ß¢3I€Y@Q˜bǃ Žù!šrNËüþÔ òîxšsmõ«Ëh…Š(ef›r*X7¥ö{åY¶ €Ø¾n±ÐëÙêAnæµ¼B¶$ñu'Ó!ÌŸ gý–¥)MÍ3 ä«o†8’>Ç þ]~^êy÷A½—O[8,&yŒ€íRÑh[vbý=²µœ„A¹9Y´s„x¤(ì{ä𹳎OSÓe‘DËZ±—ÙŒnGC^½FdjÚc-ÈN­ž49
+Ž+AÆ‘kšö¥¤È­ážÑ€ýè‘Ñ×ýe*Êà³.IÃz°åáà H(x¼ág;zsÅ<>˜'ˆ«Fá÷ÞÇc”þr$î qÑ6#⩳grüm$´kÎðH”#w‰‚· þÚì?¸jŽßÙæÖp7ü|{ü–j—êlÚŠ¤Ô`æ¼xµ ]þÏÄ´ÛÇ1óæ¾_Ùøè݃ûÿ
+)YZ´5¡¡PîžÇ›¸`¤v¢¯_£®BÒ&‚õYX†'tað²©?«"gMƒzè¡šcÎUdü@ÛÚ²@Ú$@ä¨e†1Á8 u~vcÂJâürd,]€­)ã჈6F
+0ÂnÙYܬ#â¤s#¿¯YO‡Þ‰¸u‚XЄZqO–HÔC\A‘Ý€ùËT–;gaP[“ü (5ëšÍTŒ;]4DE¯ŸZ†Gõ¡rñNªÀÊ‘µeðß1N{oi3µÖ¦·ˆ!S,Rî®4 µNeÃ!Åž Jqo«T5AZ–g4©ß‰Ù‘´K/ôÅ´J’´©€MûÓ,YÆJ‚êðÇ$—çpÕ&€²¢Ð<9{uÁ|Êx.‡à®·šõ¡Yš­FbK„ô îú2
+ÒÉ$EØ°°Ä%÷Õ™"N¬Â­ìI"Z]æMVÞ)ŽK^,£íG\£4€‹~Ÿâ·Z\¤7Í+3p¸£:Tå
+­A߈¦jˆ¢ ¶» žÙ,o ôÜ"žQº·F«# ÁËñÊ3ô´dŽã’Y.´Úm¤¶W³!g(–wD„c>2ÆùèÔ½|2¨úbc_ÙÖ›MJ@þ/¢oc­¬6ýt’•·—â^lÃìþÏ_¿%‹!€ç·F¼¸„/z­Ö§kª1ÑýZ¥äRÁpÑõ ":3¨ÿ
+¨^Á*ž=OL€•¦Ú±Vˆ¿óµ¥–‘u{¦Ç3•bi¥Þ!3U£~A° xµ“èsjÍ3gsÓñÜòë:Ç_­•ÝÚ\NªÍr3¼®ÁÁÚDõ6PÍñmÏb0ñîá r?Ђ›Ë·©—QÈ–÷ñÞé÷1ÜKÆŽ8U®³òYxší⢇%Æ:w~6l»5düyWédÏ=o¢‰M ±!¶ãÇÀ›"©ºüÆN&š¨Ùü{‘¶“ €Í2qH jÄÅqÊŒ/öäüQt=;¨ÝÎñ}hÄÑ¢±ã+´…˜?åðd7+ünâˆm–Í\\Þˆ"eŒI(U*€Ž5Ú¤tíMÿ
+ "µ÷ßlV˃‡«O«¢ºÄ3±ë^(
+4u}¸î9ì;W,¶§bÑCX…¼h¨ãmèjŸ†_”Òbä×cT&5©åàTíÓlËA …¦£(¸ê~_H©¾ÅFçl˜™¶<"“øoYÂËrÒ¼ƒd†Üì‡r8·FznÌÛ ‚÷9#3Ì°ƒ£Ôl­b`%’€²DˆÅûîU R0è;ùÌGñÕ²P2a~{ó¼M‘9p»VÙiê4‰´qÒ„W—Ú=†ä3,j8ÇË5 g]žÛœJ#–5õ,i V‹ûÉ$5–›Ö¼jUEÇɪ™ü~”.£­\¤vÖÒH%ô‘þ«4}B$P^¥›âŸËßµf¸²™ëº{ù_z¶^dŽB¤ú¬öPrR±H¦Fø¿¼R÷oÇ ãÛxe$ îÿ
+Lp‡ ϱ¨“Ç­s
+Wד¹åõ=OÕc’õ¸,Ρݨȭ1€÷'6xò­ÕdÄE×à&pjŠÀµU¤¹
+îßñÔ&w:”µq*±õ-ýx¨ˆ»»s¶B1îdg¸—Ÿè‰V{£=œrz‹ »2ò£?ÂôR­ñ!
+9=ðr5ÕœÏn¶¿†þ}<”_XÒ¤{·+4Ö‰Qˆ$d_SšŒÛâjüþüDÊrÈ“cñæ†[ÐìÃ
+FG cÓ4f>´eÉøCxþËc(‰.íÜì^âÒ5‘FC
+-P™t7øszí¿›d½ŽÎòæCÝÂVxã4ÙË"ñöQ‡¾P3Hÿ
+õcÛ+ÚFƒ9“ñx”ºýÍõÚÞM|fÔÈa¶ä V%ZTä
+šü]T‘ó̱
+ñ“âTúr‰ÄÇbíqe?±ŸéºÉú±ôçQ‹ÉEvó*­öiý‡3A”÷(ŸÓ¢£õ=PEPŠ_:xåÜ{5p£­|À‹9BÅhŒî(¿êü¾ü¶9Mµœa7¶¹¶¹‹Õ{–³£˜ácü…M¾&õ¯\²Ä†å;
+K¥jwµRœJÅ° x ÂŶ ú¸Q:¬’[i¯}HËë´ŸPLJÇP6äi”Ç7‘BÝ¥j¶–íXïlåŠð©FõWá‘)WcVÚ0
+«1Ù^ù<ãêu&9?æìÉpò„¶ÑL÷׉é…I#‰]qÈzôfÚ£‡ÃßqÓ,ã³³ƒâäêZF¥êYÃ$V¶–ñÛê+S' Ê~ê;o晥äyo÷åQÉ*ß™åûYb?ªŠÒ¼Ÿqc ³Þ¹º¶pÍÅ u©™@>¥;#/%45ärg7ÑØèôƒ,O ·îü~‹ ò¦‹oi«ÝX»™8;\Þ‘I¹‰E D<OJuÌ\ùL $–MÁ)Âdø¬­›\G åå¹úÍÂ*P$w2P èÁ‹§ÀíE?cö²Þ"wp#‚rwú|öR6:]ž–¶·—r¥ŒóÒÄÇ-£,LŒ$¸ôè¼ØwûL²\{Ý5$j¯õ$BúâKÓ,¯–­ žš•bãÓ ²3’/®ëZ÷ÌŽTŒkaðC$ÖrBó—¥¹‘£cFUÜqê8©ù“ØbAl…wþ>ÄM„m5èo­?ïU¥¢P¬¼¾©àÊWí$€–FNNP¯/Å÷üR»§ƒôµÕ½¿5pªÐ½}P­Ä
+©×¬¯½ º’#uoî0™w±t:ô@ŠF¡<V@Kí¾Ù.&²¨5ûg’²‘)û'Õ&6 ÃÄ”T¨d9•gá“™c_õ(Ë·†&H¸õW¶Š«>íEtˆcÖ‚ŒNøÝnž{Tj•`ån"†ª‹‡n,h~!Б„LÕ$e(Ô|ÒÒCp³\+Ç´”ªð
+h ø@&„m2$ógµraúÿ
+²\–vCÉ |GõÌ)@DC³2AâaóƒjZ½åØî,œ²D„31²F¢ ø¸’932èS¯Ëœ’B®—¢\ÜGmœž‘úÀ“êà3‡3G4 #„E>×½{`”€Ü¸i4&Òêw± v ‰ôýE¥@u:‚8«ï‘"ù·C`i¨o¦’%$¶‘Q¬{Ö6Eõû°¯ñrûüððµd—AÉÅÜ–qýy¡y^EyVÒJs§ ŒcOŠƒÛ}¶ ÙŒr|¿‹Ll%µý5 µÄ
+cšèAw0šHùN ˜Ñ·§.b8õ¦@­ÈÇ–òM©Þßh—<n´$ßžÛV¦¿ \ÇíÚÊTŠ´ó*In$u …hà©Û•GA€SëMRÝÀ’4RÃfãÜx•Â
+SË=g‘_ãqB Ä‘¾û‚>Œ´M®“ko1Ag˜}aÃ0Y;±'cU_€WöFù/DPýhàâ;°ÏÌO<Ø·”5ä¼æ§êßU´`x¼·2 -+·ÚjtÛ
+pš†’­i"~öæÞh¤ pä«ÉgnÕD_…™·~^9W¾ßw㣚5˜Á»ßmûû뿇©<ïÉ-ŸPkø.ši&´™Ø}IYUÚ'”0©~ª¡{ÐV£/úH¢y l‘#-»Ëà ˜¿Öî-"õŠ £ˆE{8hùxùðeåðu£6Oà?C#T$k¯ãξ il+ou[¹‘cÉ7¨„ñ
+Êåù?1BHMŸöO|»‰®P1;Ž_»ÿ
+ÍžƒÙHo‹–ß,ÅœeaË„£.Ewž<É©è:×=8ຽŸê–ðrÜ“”“Æ­èÿ
+ö5ªÊgo¨|7?&ˆÛ¨WÐáÕ¥/ ­œ÷r»^+Jeh`Š¢8P'ØYïBWâ¼Oc3¹¾öF@r;þ/ÓÜÈnõ“q,³Gõk…„LtÐìepTúHçí*58(]Ë|Mñu³†5M/ªïnôîXPÚ´ŸVI#pHhV¨fýÒ·.5ø£¡¡;ýœ«‹~nÇÀ< KééîC[Á©;#Ã|²ªG¶—1óTä¡„|Uh¼Õ»uíYY "ößîüBéóÜ1ƒQaéZ°ø£Õ•ÃR7›à'àáÈr@rnLjqQÝ««[Yf‚Ùî. Šä%‹oR¿Hùqv…HíZa‰<Ó<1½×.eõ†½šú8a‰£[‡VôbhX;Y&fAì?kgˆ÷1rË+g—Q‘âŠ;8ˆ’K˜ÉÔñ )ŒqUAðQM;npËíF1é»
+n’09šs þ•sJ­L ç¡;%—z=ŒVÒK-¡¬AY „ËëÈÄQ"¡ä£ÛÛ$$mªP5·ö¡'&Ú
+©37&B®ÒÈ$cýã1û'ímû8RK7ò½ýÃhr;×ÑI}(ÛØ(g5# nY…ž#ÛhrŸ÷[Ïn¯"¿šâ~k'ïe”:ÐenTåÔûü³4
+ÙÔÊ\D”•5]>ÛP€HÓz·S¢Ã:¨¬êÓ*vâõÈe‰!ÈÑÎ"@oišõÛ‡ÓÆ“)’8}QÅŠ™(~Q¸ü Õ¾ì†,`&Yõr1àîæ{Ò]&Öõež-âŠêEÖöŠL·˜j4j*wNdmJ¯¾_"9žN<éVòÞîH™%mKÌüd –…×cSÑä+FÄmgt,M*ØEÎ14Ï$ˆ¡¤íÇ`€À§
+áEî¾óKžeXªÆ+t+è¡^T/ȨÏþWÑ‘ŸçKbòo˜ol{m6Y`”1Y`^(Ò)¡ Hcuú>ÖFY  Ìx2J6#"m¼‘«Ý^ÁdºuÌw×l‘#Éo"D íê–§ã]ÿ
+j>ž\þÄÁ.ô3§ýrë¤C©þí`VnD/"jÃÇè
+e?— äú^Ÿ ooeq?ïÔ²úJU¤Šwû1C§CN'¾ûÔrpƒ'#b>óä?gÚõ=?BXøZ[Fc1¨A͸pEjGë½wîÇ5'%î^¬F10ûÐ6±ÃëÂí5èø¢’Bc‰š|#w~õ­>]ò©d÷·ÀJ÷`~l±–ÏQºiîuycÇkUhôˆå„LjXÿ
+–õ8ñGø‚Óâ4Èä‰nö·5ßøûz/oü½¬Ûiš}£/—]ø]ªƒÈÝÌ@wøOîÏÆ¿ü¾TʳiüH’O«ñø·aÙÚóŽB<ã"íof»¶·
+ÑßcR
+Ç“2qc_‡5uGw¨'éåÞÝÙÝ5Ì/)Â\,VÑŸ³·zðÚ
+¿
+õ¯Jû×]I1¥Ã ŒgÄ/âÅ|ͦ=ï›5 ëq-œJ’µ‰s*´L:4küì3'«]^¨ƒž@¢á°¾Ô¥kĽ‚Ù§¶”ˆÂ˜èbz™Â/'AÌ«©nÔÂhtp±ÊäAý›'G™Ý.N”–ñ5#W¸<š9¤’Ð’²$cÒçÑ[†Å¨)O‹*ËŠ÷¿Áe@œ•[^ÆÒýbÜÞ[ͨ³Itä%²,Qeô¾)DBAöQ¨y~Öù3†¶ø¢2 sÛ¯»™v®ùŽÚêTÞÕáL%–í/“%‘Ãñn¿f¹)ãƒ3=ãÉ2»¼&ñÌ‘²ªÃ$\•Fsâ=HH‚ðgëºî(B#oÇéc–¶ÁY§y‡R‹LÒ¹[±µŠd‘¤dk‡H!u|
+ËÇ“x Ÿ 4KPI
+´£–èQ¾zäg1
+T÷3FÑ<Ð3̶ÄUC8eåÈŸM½>.A}MÀ©Ë8{œc.þÿ
+ˆæŒúªñÍ+qતüMF¦Íµ2Q‘‚6-щoºi¤yÇórB+ ½ìDòA%ÃC4³*dx¸d–Œe >ôÊ2i°÷ü}ÎÇlä_¼~¦_cùðéÍ­ÝEíŒq¬õ7ô®Ú:ˆ^9hˆ7ç!gªŽTí˜ß“ŸW.¯#|QÛ‹nø}ÿ
+ñ­y¯ 0D†D^üøƒÉ.†Ìi‚9-=)¤…ÀŽxµys ëo€u—j ¶­2Ã+æÔc\ÿ
+
+ÌjÍñTmö²GnmÊãVÓ4âòa4Ó†25¼K$1!4‘]—â ÝiN¸8IäÛÇÃÕõÒp¢­´D}npy—ñäò(yT÷ÁÄjšFHñ“~ÿ
+ þÍ"§ìlJQXK!âæ–5ŒGs5ÁswÂIfœ*‰!
+þ—ãô|?T §ÂZÑ⻸æ¦_ï^¼!N/ÆF‘¢^NŒ?hrñoÍgˆŠþqûº*ÇúCM[«tÏ«›pnæ’YŒ±’褥THÿ
+<6®ƾ®lLAøø£ÞÛU†Â‚ØÜÉn¬Þ” eGn%L@ºý¦ø#¯JTÓ¾åLjÄÔ€âýß‹Dˆ®Vi⾬fÖæ!FÇJŒ­1Ç’+vçñý•"'—Ûøü{™O„
+'»ûUî &š+xÙȾ¬/Ì †.7Y@¯×âÜt$œ
+âãÓbÞPÌ™^?°i€K`O͉1÷õüròKc°ÓI–hµ&¥ ÂÇ5ôH(³¼¬"×íûýåœGŠ«fóà¡îý¯~ÿ
+endstream
+endobj
+
+20 0 obj
+45194
+endobj
+
+21 0 obj
+<<
+ /Differences [
+ 1
+ /g3
+ ]
+ /Type /Encoding
+>>
+endobj
+
+22 0 obj
+<<
+ /Ascent 0
+ /CapHeight 0
+ /CharSet (/g3)
+ /Descent 0
+ /Flags 4
+ /FontBBox [
+ 0
+ 0
+ 0
+ 0
+ ]
+ /FontFile3 28 0 R
+ /FontName /KPPLPG+Times-Bold+2
+ /ItalicAngle 0
+ /StemV 0
+ /Type /FontDescriptor
+>>
+endobj
+
+23 0 obj
+<<
+ /Differences [
+ 1
+ /g36
+ /g74
+ /g76
+ /g73
+ /g87
+ /g3
+ /g82
+ /g79
+ /g89
+ /g72
+ /g75
+ /g68
+ /g86
+ /g69
+ /g81
+ /g92
+ /g88
+ /g85
+ /g80
+ /g48
+ /g77
+ /g83
+ /g71
+ /g17
+ ]
+ /Type /Encoding
+>>
+endobj
+
+24 0 obj
+<<
+ /Ascent 0
+ /CapHeight 0
+ /CharSet (/g80/g71/g75/g73/g87/g48/g69/g81/g83/g74/g77/g17/g92/g36/g72/g3/g89/g85/g68/g79/g88/g82/g76/g86)
+ /Descent 0
+ /Flags 4
+ /FontBBox [
+ -32
+ -277
+ 923
+ 777
+ ]
+ /FontFile3 30 0 R
+ /FontName /KPPMKC+Palatino-Roman+2
+ /ItalicAngle 0
+ /StemV 0
+ /Type /FontDescriptor
+>>
+endobj
+
+25 0 obj
+<<
+ /Ascent 667
+ /CapHeight 667
+ /Descent -219
+ /Flags 32
+ /FontBBox [
+ -177
+ -250
+ 1141
+ 880
+ ]
+ /FontName /ItcEras-Book
+ /ItalicAngle -2
+ /StemH 44
+ /StemV 60
+ /Type /FontDescriptor
+ /XHeight 494
+>>
+endobj
+
+26 0 obj
+<<
+ /Ascent 667
+ /CapHeight 667
+ /Descent -224
+ /Flags 262176
+ /FontBBox [
+ -169
+ -250
+ 1247
+ 909
+ ]
+ /FontName /ItcEras-Demi
+ /ItalicAngle -2.5
+ /StemH 98
+ /StemV 140
+ /Type /FontDescriptor
+ /XHeight 497
+>>
+endobj
+
+27 0 obj
+<<
+ /Ascent 629
+ /CapHeight 562
+ /Descent -157
+ /Flags 35
+ /FontBBox [
+ -28
+ -250
+ 628
+ 805
+ ]
+ /FontFile3 32 0 R
+ /FontName /Courier
+ /ItalicAngle 0
+ /StemH 51
+ /StemV 51
+ /Type /FontDescriptor
+ /XHeight 426
+>>
+endobj
+
+28 0 obj
+<<
+ /Subtype /Type1C
+ /Length 29 0 R
+>>
+stream
+
+endstream
+endobj
+
+%QDF: ignore_newline
+29 0 obj
+85
+endobj
+
+30 0 obj
+<<
+ /Subtype /Type1C
+ /Length 31 0 R
+>>
+stream
+
+ "%(+.0369<?BEHXg80g71g75g73g87g48g69g81g83g74g77g17g92g36g72g3g89g85g68g79g88g82g76g86Palatino-Roman+2
+ˆŠªfŽsŒƒŽŒ†‡‘‡‘‰ŠªŠµŠ¶·÷ê÷~üx«D…Ž€Ÿ Àœ²–£™¬ ·¥Â÷=÷ôûúŠ6Š\„Št‰z‡…‡…†ˆƒˆ‚ˆt‰dŠlÕ»‹¡¦¹Š‰ÍªdŒsƒŽƒŒ…‡‘‡‘‰ŠªŠµŠ¶·÷vŒâŒ¹’Œ¢œ’“Ž•¢²ŒªŠZhŠusnŒŒi{cmG],û;ûòûNøt¼pÄnÌŠomŠlkkŒŒil±Š¢‰”‰¾Ûƒ²° {žž…‡žŸ‡¡¤ Ž‘›œ‘¡™¨¡Ó¾‘”–•š˜Ÿ–¢“¥”¤§¨¯„®|ª|§v¤oœ›ok”guu‡„ww„}ƒ‚„FIìŠ×´‹½Å›Œ‹ŽŠŒŠŒŽŠ‰‹‰ˆˆŠ‰‡o}XB‚o³¢Š‰Ž‰Ž‰ˆŒ†uŒdŽR‹SUûm}Šc‰D‰r‡b›…÷ø¤§”ª¤¤…~  ~œx—q—q‘keU~^rgfqgy\vxŽ’yy’{”}–‚”…‰‰–›÷K“¦›¡¤œÛ÷'Ž¬¯Š‰³§Œhy‹‰†‡ŒˆˆŽ‰ŠŽˆ“‰—Š›‘Š¹ŠàƯ¥”š”™™™Ÿ–– ¡‘¤¦£„~Ÿ~˜y‘u|iX9v‰X†;µ©Œ¡¥Š‰«§VŒƒ†ˆ‡Ž‰’‰•ŠšŠ¨µáÏŠ³‰š†¤„ ›šy™s––uqqrr†p2=Š²£Œ—‰ŒŠŠŒŠ‰Œ‰ˆ‡‰ˆ…l|\I‚o° Š‰‘Žˆ‡Ž‡Œ€ŒxŒlŒoqQŠ3Š\‡Šz‰€‡…‰†ˆ‰‡‰‰ˆ…Š„\oɸ¦‹îÙø$Š‰Žˆˆ‡Œ†Œ…kŒPŒPŒQSûAŠ3Š\‡Šz‰€‡…‰†ˆ‰‡‰‰ˆ…Š„\oŸ§°ÏÀŠ‰´§gŒwŒˆŒ†Š‡ŽˆˆŒ‰ŽŠ‡“‰—›’Š¹ŠÝÙŸœ„š‡‰›šˆ›¢žŽ‘ž‘›’¡–¡—Ÿ˜žšž›—”’“”•”™“—”›’›’š‘žŸ¯„ª~©}§v¤mžžlh”bgp‡‚y„hnTX¾•‹“Œ”Œ‹ŠŠŒ‰‰Œ‰‰ˆŠ‰‡€…y„t„t…v†xˆ‰x‰…oÇŠöûœŒ—‘˜•˜š™˜™œ•’”Žž¤¤„~¤£Ÿw˜q˜p’mhe„j}l|lxts||sp„mts•uu•w™z÷PÁø#øAz™x–w’“vvŽuifƒ{ccyovzqyrƒmjtw”x”y—|›€œ€¡‚©ƒhrry{~ƒl…{…‚„“ƒ‘ƒƒ¦‚y~o{cy|ƒ~‡~†‰}}q“rštšt£x«}}¨²„¸»•Ÿ¶·Ÿ¬¦¡®Ÿ®—­¬¤†¡‚Ÿƒž}šx•”wpf!‰gp|ƒƒ†‘†’‰’“’‘“™˜ œªŠ£¨¥–¤œ£žž˜£—¢’£¤œ‡„žå’“˜˜ž‡”Œk\‰NŠûytŸž¤•«©¥s¡ s–kbb€ovyyur‚ovw‘–z|•}œ‚¡„ †¢¢¯•¨žž÷fü1˜‡•†“…“…‘ƒ€‘€Ž|Œvr„t}s{svxo}nlƒi—¢pr£}¨­œŽž’–Ž‘ŽŽ˜•¥’‘’Ž‘ŒŒ™©‹»«ŠŠ“Œû Úù3€€†~||~–€–˜†šš‰˜‘––––˜šš†˜€–•€~‘||~†€€-þG£¡–žž—ž›œ¡› ™¥”¨™²‘Ëá‰÷”Œ®ŒÊŒ¸Œ±­œŒ™Œ”ŒŽ‹ŽŠŽŠŒ‰‰Œ‰ˆ‡Šˆ†kyXEƒo•™‹˜Š“ŠˆŽˆ‰Œˆ„Œ}ŒvŠhvƒû¦~ŠoŠa‰aˆl†y‡x„|‚‚€‚€…‡„‚‰†„ŒŒ€‘iŠ‹ŽŠÞꀅ}{|‘}–€~—™†›š™‘––˜—™›š…š€––€}‘{z}…€€Á¿û¥ˆ“•Š–  ”ž•›™˜šœšªžµ÷÷œ¾÷­Ô°°™¡”’”˜œŒ¨‰onŠnljŒeŒn¬ˆŸˆˆ‘†‡…‡Š‡Š†‡{|drKpMz_tqQ¨{°y¹kצ~®~³‡š‡–Œ“‘“Žž­§‰gfŠedcŒco¢ˆšˆ’‡‘ˆ’ƒ‘™mž`¢RØûUše—k•n~f{hzh€r{ƒ‚‚‚‚„‡†ƒ€‰‚ƒŒ††Œ†Ž‡Ž‡†…~s@•…•‡”‰÷¨÷ Ž§´Š‰Â¬mvŒŽƒ†Ž‡ˆŽŠ”œ•¡¾÷÷±Åû)‘„Š†Š‡ˆˆ‰‰…ˆƒ‰„Št‰gŠj÷2ž¯ˆ¾ˆ¬qz„„Ž„“…–€ t½iÛûcø~ja mI~mûû¨f<v]…uƒ~††…‡…‡…‰Š…{Šqj±®«Š÷øÉ÷ û»ûŠ÷÷»tø<ànzsw…„xwˆwmo’™pp˜v¡|¨z¦„²Šº÷1­‰¯®ŽžŒ Ž¢Œ˜Œ–”¯„«}¨~§u¢nœšmj”gmo†€qxƒw€w~x~|‚}{€vm€m‡jf‰Y–cžgŸg¦p®y{­³¶Ÿ¡Ÿž‘š’•›•¡™®‚“û£÷Ï¥¢©˜°¬¨s Ÿt–eX‡‹…ƒ‰|oŠ`yŒj‹ZqŒzŒ‚ŒÖ´¢¦Ê÷À†»÷§Í“»ï¨Ê®“‘–’“’‘™ŸŒ¨‰XlŠ€}lŒ[Šn®ŠŸˆ“‡‰‡…ŒˆŠ†Š……vn{dqH|gˆ„Zû…˜€¥{²}¬P÷)}ª…¡•Ž‘’Ÿ®ŒŒ¨‰ZfŠprdŒUnŸŠ—ŠŠŠ‘ˆ†Ž†‘’|îû}´.€”u˜j¾Š ÷$Ž´¼Š‰Ä§`ŽpŽŽ‡Œ‡‰ˆŠŽŠ‘‰‹˜ŸˆÅ‹² ½µ”ª ž›¡–¤›—‡„••…”“{ŸŽ­±¶†’€|}~}ˆ†~€‡„ƒ†…‚z~z~z|z¶Œ©ŒŸ‹ŠŠŒŠ‰Œ‰ˆ‡‰ˆ…l|\I‚o° Š‰’Žˆ‡‡€ŒxŠloqQ‰Š]Š4Šz‰€ˆ„Š†‰ˆˆ‰‡Š‡‰…ŠŠŠvŠfŠo²³‹µ‹‰÷ø”œ”™‘™œž¦¡…€žž˜|“z’zsla†a„a`€m‚x‚†€ƒ€€‚€|ƒx„z‡vug–p¡vu¡ª²ž›Ž‘——’³§Í½‰5«¥Œž¡¡Š‰¦§kŽ‚Œ„Œˆ…‰‰ˆ‘Š—›÷&䩇¥ƒ}¥yŸr™™ql’fquˆ„wpiybpƒ‹€}ŒŠ€„¥„–’š”žŠŒ÷aû“vrvxv~€tv„uux’™~|—…Ÿ£ž“›’˜‘’’‘˜” ”©”¨”¯“µ’Œûûg÷*Ž­²Š‰·§Œiy‹‰ƒˆŒˆŠŽˆŠŽ‡“‰—›‘Š¹Šà÷‘Œ×´Œ½Å›Œ‹ŽŠŒŠŒŽŠ‰‹‰ˆˆŠ‰‡n}XB‚o´¢Š‰Ž‰Ž‰ˆŒ†uŒdŽR‹SUû^Š/Š^‡Šz‰€‡…Š†ˆ‰‡‰‰‡†Š„Zo½¶«‹ðø ¨…‡ˆŠŒˆŽ‰Ž‰“‰—›‰’‹¢Š²ŠÏΟŒ®À«ŒŸŒ•Œ‹ŽŽŠŽŠŒ‰‰Œ‰ˆ‡Šˆ†lyXEƒo•™‹˜Š“ŠˆŽˆ‰Œˆ„Œ}ŒuŠjuƒbmŠoŠnŠƒŠƒ‰†ˆ…‡„„‚€~‚‚„€}„|†„{|‰{ux•|z”˜†›†›ˆ§³êŸŒ¯ÂŒ§Œ Œ•Œ‹ŽŽŠŽŠŒ‰‰Œ‰ˆ‡Šˆ†kyXEƒo•™‹˜Š“ŠˆŽˆ‰Œˆ„Œ}ŒuŠjuƒ7‹ŠŠ€‹€€tŽvzy“~•€—|›€„ƒš¢ˆ¥ ›Ž™˜™™“’Ž‘‘‘¥¨£Ÿž›ŠjŠmŠq¤£Œ£ «Š‰µ§Œgz‹‰‹·Â÷”w—w›xx {¥~~¤¬…±º¸–¡³µ¢©©¡²£´•¶»ÍuÃ`¶·aS GAPt]]\]tPBb’fšhŠö÷±¨¤¬™³¨¥ƒ|£¡{Ÿqše›f’^WN~\rmoql{emp•žrpxª~´~´„´³Ç—¸¤©ûgñù3€€†~||~–€–˜†šš‰˜‘––•–‘˜šš†˜€–•~‘|z†€€}û¤‰‡†Œ‚ŽnZ5Š3Š\‡Šx‰€‡„‰Šˆ‡‡‰‰ˆ…Š„\oƶ¥©²Š‰½§Œiy‹‰…ˆŒˆˆŽ‰‰Žˆ“‰—›’Š¹‰à䯌ÁŽÑ€“auV~L„‰o´ Šˆ=¶ËŠ}‰}ˆ}Š‰‹ˆ‰ˆŒŠŒŠˆ™ˆ¥†„¸±†§È»›¬¯±¬±·‰¡‡ž‚››—|’z’o”b•;Ÿ{‘€ƒ‘€‘…’†”‡•ˆ–˜ ” œœ›¢”¨žˆ†™—†—…”„”†‘„…Ž…Ž„„Ž„{t¥Ž°Œ°¯z“u’p‘psŽvjk„}nnvy~u|u…sq{Žz‘|’|“––™ƒ„˜†¥„´‚µ‚¥ƒ˜…˜†”ƒ’’~Ž€}n€rvyzvp‚ju}ŒŒŒŽƒ‘ƒ’ƒ’…”‡–ˆ•ˆ–‰–‰–ŠšžnŠaŠo~|šøì½÷ŽøŠ
+endstream
+endobj
+
+%QDF: ignore_newline
+31 0 obj
+5820
+endobj
+
+32 0 obj
+<<
+ /Subtype /Type1C
+ /Length 33 0 R
+>>
+stream
+
+(
+x
+Ñ  N © ä  J œ   > Š 士Ý/l¹]©Ãß";½hÆ!hÛ V®#™ë0™þKÒg¢ìN”Â(=£ò(–:QªãVl˜Ïð  € Ô ç! !@!a!•!¶!Î!ñ""M"š#Y#Á#Û#ô$$h${$¨$½$Ü%%^%„%·%Ù%ì&I&¼&ú'w'Ó( (Û(ù)1)­*K+
+÷ ødw÷‚÷(ÈÐ÷íøÐ=ü·à¹û«i¦kanmmm©m²³§§¬÷¬÷¸‹w÷;÷¢`øIøÐ- ¢û¸¼û,÷¸+¢û¸½÷ À÷7Áÿ
+Öû
+È­5÷÷RÁ÷¦Áø–÷RÁûN÷PUûPûQU÷QûPÁ÷Pû÷Ž÷I÷=÷ò÷ ,AûŽÌ÷qÂ÷÷Ôø_÷qÂûÔT÷ ÷~÷ø¹ªo©cekpjm¨nµ«®£­û#ùàçø0øŒù<\ üý˺vÂøzÂ÷Â÷§Áø„÷¾¹‡ãdÌÆh_§Hwwˆ†y8rg0€9‡lˆ^~+Ÿûa÷@÷M’÷léU‡‚&zû!û
+3pÖ£…¹„½½÷¦÷÷·²td ¦X‘NŒN‹Âø¥w÷­ÂøÂû?ø¥û{XT÷D¯ü_ûDT‹ÂøoÁíÁ÷¤Áør÷UDû¢÷?÷õẼÚ¨ƒ©~£Ìh?§NALpWYDÁÎÓ¨Ä×Ï[;|‡}†}j<DqwûtûDPÂ÷lÂ÷lÁøÁxÀèøl÷.ð=©i“𲧲¨Ù¬‚¤€ŸµsU¯HHPtiV_˜¡Ç­Ìá²VXYcM ˆT›訨‰„§®‚»mTIJ\.QO[}\¯}sÈÒ…¡èéöÀ÷‹ÂöÂ÷Ç»÷ãÂøxÂ-öéÂ-÷÷;ûûýZ÷¦ ûT÷ø ûÇûiÂ÷‘Â÷:Â÷Â÷ Áøˆ÷?éHáû]\yf÷X÷·ÂûîûŲ‚±ÊÀ‹šîÁLKCNU!MN T€TwÈÍxÎ÷?¸÷Î~Â÷‚Â÷UÃìÁ÷¡ÑRÀôøø~ø£ÄDGN{iX8SP4û*ûU÷NâôóÖÕïèLÜû5\\enŒ÷ºæÜ·ø ²¾™¸Œ‰‹ Œ ø•–‹Š’ôRüUiK(RY¬¼v…™§ˆ¢¾¦Æ³Ì··yg¢–y’rt vø™ÂðÁ÷µÆø‹ø–Åü&ûÁÝ÷µûXü™È~Ã÷pÃ÷fÃóÁdÂ÷ŠÁgÁòø€÷0äN®g™ì®·©ÞÎcèû#>Q#M§a»ròuFc16Ð;÷ò÷Ò×èìC÷ LWaCi3–çî蓨׻\Qòû¤9=pP\+šåí뜵ØÌbE~Ä÷IÃ÷ŒÂ÷ Á÷­ÁøŽ÷ÚÔ{âQ¿©j[›[û@7-0Å1÷ Æ˦À¬û7BL0rƒnj‡j„…„WRα²”²÷
+¨é÷
+÷õc¸ûû÷^ø6íÂû[T¹Åü™Ë÷÷ô÷
+ûôÈÃø™‹Âøb¡÷rû^÷`÷÷fûc÷PÔØøÍÂKûD÷‰Ô÷1÷mËÂûPTÉûûBû÷BÖÂû`TÍ÷1ûmèûFû‰JT÷rÂ-÷(÷]÷%û]7T‹Âøb®÷ZºÂ¸÷WøÓø™ÂûWTÐû"û„û$÷„ÑÂûZTÏ÷Eû»û;ûT÷ÂÂû÷;÷A÷»‹ÂøbÂ÷Á÷ÃÂø¢÷mTû6ûÏøøe¿ü/û^Á÷'÷®üücU*ÂùÂ÷ÉÂø~*Âûù÷ÂûIý}û"ùßçø/ø‹ûüùË]wøýË*ÂùÂ÷‚Â÷¹*ù}ûIT÷ýûTøy÷ïø%ø‰øz¹,Ö`¸eíXj.[T.D]֦ѻÃÃÅPÎ^Öqû¾‹øìøìû¾üìXøÐw÷t÷?ø÷Õ?÷,öûÂ`Â÷2Ã÷ÃÅÃ÷ÂÁ|ø¼Â9÷…¦‰§|¦²vY©6GFwsQ™UšªÓ¦Ï­¬ˆy¨¥{’hjl’_Z’[û8V4P¼JÄEñ×жÀÂ|7Š÷*¼OYH\:N`´±¦›¡Ÿ™¥°Áº·µ…„µÂ`Â÷åÂ÷ÂöÁ÷èÂ|¼øÀ÷m÷*ûÛ%!RMrz÷ŸûTÞ|ü™8T÷¼Ð{˜µJ÷¼÷ß÷ ÷T%:C6</Á÷ôáÎà÷¿-:Á÷ñÃÓÂ÷çÂø¨ÎuÂur=Q:û0`÷ÌäÓÝ÷ÄÀ}g¶FÂ÷CT[ª][œQûAFû0û(÷4÷èÒ¬¹ÆÂ`Â÷åÂ÷¾Â÷ëÁ|øÛÂ;øÐûRT÷û_ÉZG›Uû/'û¼ûØû÷&Ò̩Ų|?†÷r¼!FB'ûPãâçÐÝï|÷­&FÁ÷<Â÷ÃÊÄ÷óÆø¬¾zÀ_==y\\^‘£eg¢mÁÀ“ø.÷H÷û5û!/ûû
+Ðû÷CÜÞ¦¯ÌJ÷jûñÆ“ÆÎ÷÷ª&r‹Â÷ØÂ÷Â÷`Ãø›øùjB“cfûŠ8y‡|‹uxW!TõûØ!TøÂûl÷Ø÷lÂûl¿¹Œ²÷±Â……¯ûVÁ÷CÂ÷µÂa®Â÷ûÁìøÉøÂûÜQ±iH¬;û-;û,*Õ ÷2ÍÖ£¼´û.Xmû GI—V€U¿àyÞ÷ÙÃ÷ìø,ÜRû5=J'%?ÏÜæßÉë÷ ¯+T‹Â÷åÂ÷Â÷Á÷¢ÁøÚÂ9÷’ÊvÖûEIf^X÷šûTàü™8T÷pÂ8÷Ž¶ºÈ·ÌÝšYTû|9T‹Â÷ØÂì÷÷šÒTÂèð÷áø§÷Dû÷ˆü§ÂèûAøûcT÷,ûØûDTûUÁøšÂì÷÷ÇÒhÂèðøø§÷Dûèæü¹øXûÍT÷–ü|‹r‡}<xOˆi‚`\’’iƒV€»¸‡¼¦­–¢Ȩ¥»Ý‹Â÷ØÂ÷Â÷Á÷÷lûA÷hôøËÂ-dºbº`³BÏø÷/÷ëÂûlT¹ûDûøûTàü™8T÷÷Oĵô³jÝ<¼MTT‹Âø™Â÷¤Âø‰ÂûBøÐûuT÷>ü™ûCT‹Â÷ØÂ`ÃÎÂ÷2Â÷2ÂÜøìÂW÷š¼¶¼d£–yyŽwXdhgo°}i­X_momoܸ T¿üõÂX¼÷¥¨Ÿ£­¸ÍŽ?ûÅöÂW÷š•®Ì––‰…”¬t‹fdû±‹Â÷×ÃaÂ÷Á÷¢ÁØøÔÂ9÷”¸°„·m¤œvl˜[FHm]XØÊûSÞû×8T÷pÂ8¸÷“¹µÏ¯È¶Ã~Fû“9TÂ÷ñ¿ÂøÂø¾÷mãR÷"ûTû!û4û#ûí+÷0÷,ëí÷TŠ';BûûLçÜèÔÞ÷÷5­ûUûVÂ÷Â÷äÂaÂïÁ÷éÂìøº÷q°ƒ°|ªÜÞcA±>5Og\gìÑûTÞüš8T÷¶Âû-÷dcªÂbæì÷ìí÷ÜTŠû6I9.=ÒôæÌÝ÷
+ÂûV÷]°ó÷
+Á\ÁaÁ÷lÁ[Án¾ÒÉø}÷c¯r¦p ûk÷9tƒ”–ª¯ŸÊ÷:1Á÷%ûKhhŠmnyolk u¡wäŸylƒXjPhžl¤x÷iû7¨uŽ|€†ujÔûRåUû%÷\¥¨Œ ¦‘¬Ÿ¹¨z¨tžÑ‹{—„’É垌ȣX‡|€_Gáû/÷
+|—z›¡±¶£¥÷4û Éœ~Ÿyt÷!¼÷å¼Þ¼÷ã»ø¬÷-HΪ³š½¾½}¼k°ÎÎkªJI«d[šYWVzleIÎkjÐIf]\aW›W«eGHªmÏÍaû†¬¿¼œ©³ÌIe÷$:I5/?ÕêÞÌàóíÏ95øÐw÷ê÷ïøÐ,¡û¸¾÷Õ÷‹w÷*÷î` ø„÷Õ@÷+öûû@÷+õû©øàøCø˜ÙûL÷$÷L÷$z»û†ûT÷†ûTû/»ûM÷$÷M÷$z»û†ûT÷†ûT©ø÷9÷˜ø=ÙûM÷$÷M÷$z»û‡ûT÷‡ûT©ø÷?÷˜øC÷rû‡÷Tz[÷Mû$ûMû$œ[‹Â÷ØÂë÷8ÂõÁ÷“ÑUÁÚìøyø¦÷Eû÷Eü¦ÂÚ øÜûTÚÜûØ#Tƒøüq]xr\z„w‹uuS!TõûØ!T÷žÂ!÷ØõÂ!½À˜­Ó¡¢‡†Ÿ‹Â÷ØÂ÷€–÷À÷¤ÁìøæÂ"øÏû%Tæü˜!TÜ…øûìqn‘o1c[EA TöûØ!T÷Â!÷ØõÂ!·¾ŽµÝ¢¡†† ÷qÂÝøGø™÷qÂüGTø
+Â÷#w÷¥ÂøMø
+Âû÷#Tû#ûT÷ü:Âø:÷MÂ÷Â÷#w÷¥ÂøM÷MÂû÷÷Âû÷#Tû#ûT÷ûûT÷û}Â÷}÷o÷ ÷€÷ø
+÷©ªo©cekpjm¨nµ«®£­ùSµ÷Բбø’ùSµû&!n2Rui__3»û÷@oüF²ùíÐýí±ùí÷÷þ÷ ÷üøt÷½ï;Ü'';:''Û:ïïÛÜïû÷Ž÷M÷>÷÷÷,@ûŽËû÷è÷îøK÷+@ûÌF÷+@ûË÷Õ÷‹wé÷î`øLøÐ+ @ûÌF÷+@ûË©øßøCø—÷rû†÷Tz[÷Mû$ûMû$œ[Ñ÷Tû†÷Tz[÷Lû$ûLû$œ[÷ ¨÷Ò÷Ò÷pøÛ¹ªo©celpjm§nµ«®£­ûdªo©cekpjm¨nµ«®£­ûeªp©cekpjm¨nµ«­£­Â÷ Á÷Âw÷/Á¦Á~ÁðÀÀ Á÷"ÀÝ`-
+÷‡½÷¯w÷¨½ø7÷‡½.÷¯û$uYé˜ût.Y÷­Âø`Âø—é÷†üATø
+ûO~ÂaÃ÷×Â÷Â÷¢ÂxøÑÃ8øûTÞû&¸3g$ûIaºÈ÷°ûTÞü¶Â÷Yt ¬w¼¿Ù£Ë°x@øÍ‹w÷c·m©÷·÷
+ü~Â9÷…¦‰§|¦²vY©6GFwsQ™UšªÓ¦Ï­¬ˆy¨¥{’hjl’_Z’[û8V4P¾JÄEñ×жÀÂ~7Š÷*¾OYH\:N`´±¦›¡Ÿ™¥°Áº·µ…„µÂ`Â÷2Ã÷ÃÒ÷ÅÿàÊÞžÁ~€ø¼Â9÷…¦‰§|¦²vY©6GFwsQ™UšªÓ¦Ï­¬ˆy¨¥{’hjl’_Z’[û8V4P¾€JÄEñ×жÀÂ~€7Š÷*¾€OYH\:N`´±¦›¡Ÿ™¥°Áº·µ…„µ€x÷Ò÷8ûL÷6ûÂ`Â÷2Ã÷ÃÅÃ÷ÂÁ|øOøû÷&i>÷´'÷ ü~Â9÷…¦‰§|¦²vY©6GFwsQ™UšªÓ¦Ï­¬ˆy¨¥{’hjl’_Z’[û8V4P¼JÄEñ×жÀÂ|7Š÷*¼OYH\:N`´±¦›¡Ÿ™¥°Áº·µ…„µÂ`Â÷2Ã÷óÆ×ÆÅÃÝÆ×Æ¥Ás@ÀøøÜÁ`¶UU``UU¶`ÁÁ¶¶ÁPvzzvvzœ  œœ  œzvs@÷qüÜÂ9÷…¦‰§|¦²vY©6GFwsQ™UšªÓ¦Ï­¬ˆy¨¥{’hjl’_Z’[û8V4P³@JÄEñ×жÀÂs@7Š÷*³@OYH\:N`´±¦›¡Ÿ™¥°Áº·µ…„µÂ`Â÷2Ã÷ÃÒ¾¿}wÅÃ÷ÂÁ{€øxùY•q‚ocgptœt}€trœoXWeGu¾€šž½¯¡¢zz¤{€y¥¨z¬{€É»¼ÅžÏýÂ9÷…¦‰§|¦²vY©6GFwsQ™UšªÓ¦Ï­¬ˆy¨¥{’hjl’_Z’[û8V4P»€JÄEñ×жÀÂ{€7Š÷*»€OYH\:N`´±¦›¡Ÿ™¥°Áº·µ…„µûJ¸÷À÷ñÃÓÂÿ
+Ðû÷CÜÞ¦¯ÌJ÷jûñÆ“ÆÎ÷÷ª&rÁ÷<Â÷Ã÷-ÎÊÄ÷óÆøøû(÷3;û)û3´y÷(÷÷&ûâüKzÀ_==y\\^‘£eg¢mÁÀ“ø.÷H÷û5û!/ûû
+Ðû÷CÜÞ¦¯ÌJ÷jûñÆ“ÆÎ÷÷ª&rÁ÷<Â÷ÃÒ÷ÊÄÈàÊÞÆÆø¬¾zÀ_==y\\^‘£eg¢mÁÀ“ø.÷H÷û5û!/ûû
+Ðû÷CÜÞ¦¯ÌJ÷jûñÆ“ÆÎ÷÷ª&rP÷‘÷8ûL÷6ûÁ÷<Â÷ÃÊÄ÷óÆø^øû÷&i>÷´'äüKzÀ_==y\\^‘£eg¢mÁÀ“ø.÷H÷û5û!/ûû
+Ðû÷CÜÞ¦¯ÌJ÷jûñÆ“ÆÎ÷÷ª&r‹Â÷ØÂ÷ªÂøVøâj×ûžû%—l÷ëü~ÂûAøûcT÷,ûØûDT‹Â÷ØÂ÷:Î÷ªÂønøû(÷3;û)û3´y÷(÷÷&ûÕü~ÂûAøûcT÷,ûØûDT‹Â÷ØÂß÷÷8à¨ÂvÞèôøøš÷8ûL÷6û÷êüšÂèûAøûcT÷,ûØûDT‹Â÷ØÂ÷ªÂøMøû÷&i>÷´'×ü~ÂûAøûcT÷,ûØûDT‹Â÷×ÃaÂÒ¾¿}w÷Á÷¢Á×ø‡ùY•q‚ocgptœtÛtrœoXWeGu¾€šž½¯¡¢zz¤×y¥¨z¬×É»¼ÅžØýÂ9÷”·°„·m¤œvl˜[FHm]X×ÊûSÞû×8T÷pÂ8·÷“¹µÏ¯È¶Ã~Fû“9TÂ÷ñ¿ÂøÂøgøâj×ûžû%—lø
+û¥ãR÷"ûTû!û4û#ûí+÷0÷,ëí÷TŠ';BûûLçÜèÔÞ÷÷5­ûUÂ÷ñÂ÷-οÂøÂøøû(÷3;û)û3´y÷(÷÷&ûôû¥ãR÷"ûTû!û4û#ûí+÷0÷,ëí÷TŠ';BûûLçÜèÔÞ÷÷5­ûUÂ÷ñÂÒ÷¿ÂÕàÊÞâÂø¾÷mãR÷"ûTû!û4û#ûí+÷0÷,ëí÷TŠ';BûûLçÜèÔÞ÷÷5­ûU4÷Â÷8ûL÷6ûÂ÷ñ¿ÂøÂø^øû÷&i>÷´'öû¥ãR÷"ûTû!û4û#ûí+÷0÷,ëí÷TŠ';BûûLçÜèÔÞ÷÷5­ûUÂ÷ñÂÒ¾¿}w¿ÂøÂîø‡ùY•q‚ocgptœtötrœoXWeGu¾€šž½¯¡¢zz¤îy¥¨z¬îÉ»¼ÅžÂü,ãR÷"ûTû!û4û#ûí+÷0÷,ëí÷TŠ';BûûLçÜèÔÞ÷÷5­ûUÂ÷ñ¶ÍèÂ\Á÷¯ÁlÂôøùaŸû%ûû)÷bw÷*û0Ûê÷@ûûÞP FF/ˆ]¨|•€É㘶ìÂÂzpµPÁ÷2Uc¦^U˜SûCV5r’pžzÀ[ØÕ…ò·‡¿’¦e„{…AûƒfLTž°[ÆTû>¸t¼¼uÛê÷ÚÄáÁaÂ÷ØÂ÷Á÷¢Áxø^øâj×ûžû%—lø"ü~Â9øûTÞ¸û‡YcW_Kpn‘švm¡„¯¯÷©ûTÞûb—b®psª²‚³²¿‘Ô×xHÁaÂ÷ØÂ÷:Î÷Á÷¢Á|øvøû(÷3;û)û3´y÷(÷÷&û÷ü~Â9øûTÞ¼û‡YcW_Kpn‘švm¡„¯¯÷©ûTÞûb—b®psª²‚³²¿‘Ô×|HÁaÂ÷ØÂß÷÷Á”àÊÞ©Áyø'øš÷8ûL÷6ûyø!üšÂ9ø{ûT¹Þû‡YcW_Kpn‘švm¡„¯¯÷©ûTÞûb—b®psª²‚³²¿‘Ô×yHÁaÂ÷ØÂ÷Á÷¢ÁxøUøû÷&i>÷´'÷ü~Â9øûTÞ¸û‡YcW_Kpn‘švm¡„¯¯÷©ûTÞûb—b®psª²‚³²¿‘Ô×xHûVÂøšÂ ÷Sû&÷’æ÷Gèøgøâj×ûžû%—lø.ûÂûGTÃû:û¿û-÷¿ËÂûSTÎ÷Lûõ*û9ØûT÷’Â6÷¸øšûVÂøšÂß÷ ÷Sû&÷’ûàÊÞŠ÷Gæø0øš÷8ûL÷6ûñø-ûÂûGTÃû:û¿û-÷¿ËÂûSTÎ÷Lûõ*û9éûT÷’Â6÷¸øš‹Â÷ØÂÃÍ÷Á÷­Âø†ùaŸû%ûû)÷bw÷*û0Û÷/ü~÷'T/û£÷Ú÷ܾüû$Áä÷•ûØûÛWÂ÷5ÂÂÂ÷4ÂâÃøÁœ÷`Ûû¨ã.÷'Úب¸ÈsºdVHpG'9Åòm÷vŸÂû”–Š––’‹“Œ’÷¦ŸÂû±ê£ÓÌëÑÐqc±CÁ÷UUV®ZVCû--û pQwTÑz~ŒŒ~W}™øИû+™÷â ûE‹÷€’ð‹ü¯}™øИû+™÷â ûE‹÷€’ð‹ü¯ Â
+Â øì
+endstream
+endobj
+
+%QDF: ignore_newline
+33 0 obj
+19922
+endobj
+
+xref
+0 34
+0000000000 65535 f
+0000000025 00000 n
+0000000097 00000 n
+0000000331 00000 n
+0000001413 00000 n
+0000001433 00000 n
+0000001561 00000 n
+0000001673 00000 n
+0000004066 00000 n
+0000004087 00000 n
+0000004374 00000 n
+0000004670 00000 n
+0000004751 00000 n
+0000004936 00000 n
+0000005310 00000 n
+0000006925 00000 n
+0000007829 00000 n
+0000010054 00000 n
+0000028727 00000 n
+0000028750 00000 n
+0000074159 00000 n
+0000074182 00000 n
+0000074258 00000 n
+0000074496 00000 n
+0000074779 00000 n
+0000075122 00000 n
+0000075364 00000 n
+0000075613 00000 n
+0000075867 00000 n
+0000076050 00000 n
+0000076070 00000 n
+0000081988 00000 n
+0000082010 00000 n
+0000102030 00000 n
+trailer <<
+ /Info 2 0 R
+ /Root 1 0 R
+ /Size 34
+ /ID [<66be986488f3991cf47a7d3b19e355e5><31415926535897932384626433832795>]
+>>
+startxref
+102053
+%%EOF
diff --git a/qpdf/qtest/qpdf/hybrid-xref.1.check b/qpdf/qtest/qpdf/hybrid-xref.1.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.1.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.10.check b/qpdf/qtest/qpdf/hybrid-xref.10.check
new file mode 100644
index 00000000..0e0ed996
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.10.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.11.check b/qpdf/qtest/qpdf/hybrid-xref.11.check
new file mode 100644
index 00000000..327d847a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.11.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.12.check b/qpdf/qtest/qpdf/hybrid-xref.12.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.12.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.2.check b/qpdf/qtest/qpdf/hybrid-xref.2.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.2.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.3.check b/qpdf/qtest/qpdf/hybrid-xref.3.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.3.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.4.check b/qpdf/qtest/qpdf/hybrid-xref.4.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.4.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.5.check b/qpdf/qtest/qpdf/hybrid-xref.5.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.5.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.6.check b/qpdf/qtest/qpdf/hybrid-xref.6.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.6.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.7.check b/qpdf/qtest/qpdf/hybrid-xref.7.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.7.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.8.check b/qpdf/qtest/qpdf/hybrid-xref.8.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.8.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.9.check b/qpdf/qtest/qpdf/hybrid-xref.9.check
new file mode 100644
index 00000000..37ea00cf
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.9.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/hybrid-xref.pdf b/qpdf/qtest/qpdf/hybrid-xref.pdf
new file mode 100644
index 00000000..3ad97078
--- /dev/null
+++ b/qpdf/qtest/qpdf/hybrid-xref.pdf
@@ -0,0 +1,1538 @@
+%PDF-1.5
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /PageLabels 107 0 R
+ /Pages 2 0 R
+ /Type /Catalog
+ /PageMode /UseOutlines
+ /Outlines 95 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 30
+ /Kids [
+ 3 0 R
+ 4 0 R
+ 5 0 R
+ 6 0 R
+ 7 0 R
+ 8 0 R
+ 9 0 R
+ 10 0 R
+ 11 0 R
+ 12 0 R
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ 16 0 R
+ 17 0 R
+ 18 0 R
+ 19 0 R
+ 20 0 R
+ 21 0 R
+ 22 0 R
+ 23 0 R
+ 24 0 R
+ 25 0 R
+ 26 0 R
+ 27 0 R
+ 28 0 R
+ 29 0 R
+ 30 0 R
+ 31 0 R
+ 32 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 33 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+4 0 obj
+<<
+ /Contents 37 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 3
+5 0 obj
+<<
+ /Contents 39 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+6 0 obj
+<<
+ /Contents 41 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+7 0 obj
+<<
+ /Contents 43 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 6
+8 0 obj
+<<
+ /Contents 45 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 7
+9 0 obj
+<<
+ /Contents 47 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 8
+10 0 obj
+<<
+ /Contents 49 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 9
+11 0 obj
+<<
+ /Contents 51 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 10
+12 0 obj
+<<
+ /Contents 53 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 11
+13 0 obj
+<<
+ /Contents 55 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 12
+14 0 obj
+<<
+ /Contents 57 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 13
+15 0 obj
+<<
+ /Contents 59 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 14
+16 0 obj
+<<
+ /Contents 61 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 15
+17 0 obj
+<<
+ /Contents 63 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 16
+18 0 obj
+<<
+ /Contents 65 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 17
+19 0 obj
+<<
+ /Contents 67 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 18
+20 0 obj
+<<
+ /Contents 69 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 19
+21 0 obj
+<<
+ /Contents 71 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 20
+22 0 obj
+<<
+ /Contents 73 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 21
+23 0 obj
+<<
+ /Contents 75 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 22
+24 0 obj
+<<
+ /Contents 77 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 23
+25 0 obj
+<<
+ /Contents 79 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 24
+26 0 obj
+<<
+ /Contents 81 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 25
+27 0 obj
+<<
+ /Contents 83 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 26
+28 0 obj
+<<
+ /Contents 85 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 27
+29 0 obj
+<<
+ /Contents 87 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 28
+30 0 obj
+<<
+ /Contents 89 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 29
+31 0 obj
+<<
+ /Contents 91 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 30
+32 0 obj
+<<
+ /Contents 93 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 35 0 R
+ >>
+ /ProcSet 36 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+33 0 obj
+<<
+ /Length 34 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 0) Tj
+ET
+endstream
+endobj
+
+34 0 obj
+46
+endobj
+
+35 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+36 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+37 0 obj
+<<
+ /Length 38 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+38 0 obj
+46
+endobj
+
+%% Contents for page 3
+39 0 obj
+<<
+ /Length 40 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+40 0 obj
+46
+endobj
+
+%% Contents for page 4
+41 0 obj
+<<
+ /Length 42 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+42 0 obj
+46
+endobj
+
+%% Contents for page 5
+43 0 obj
+<<
+ /Length 44 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+44 0 obj
+46
+endobj
+
+%% Contents for page 6
+45 0 obj
+<<
+ /Length 46 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+46 0 obj
+46
+endobj
+
+%% Contents for page 7
+47 0 obj
+<<
+ /Length 48 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 6) Tj
+ET
+endstream
+endobj
+
+48 0 obj
+46
+endobj
+
+%% Contents for page 8
+49 0 obj
+<<
+ /Length 50 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 7) Tj
+ET
+endstream
+endobj
+
+50 0 obj
+46
+endobj
+
+%% Contents for page 9
+51 0 obj
+<<
+ /Length 52 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 8) Tj
+ET
+endstream
+endobj
+
+52 0 obj
+46
+endobj
+
+%% Contents for page 10
+53 0 obj
+<<
+ /Length 54 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 9) Tj
+ET
+endstream
+endobj
+
+54 0 obj
+46
+endobj
+
+%% Contents for page 11
+55 0 obj
+<<
+ /Length 56 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 10) Tj
+ET
+endstream
+endobj
+
+56 0 obj
+47
+endobj
+
+%% Contents for page 12
+57 0 obj
+<<
+ /Length 58 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 11) Tj
+ET
+endstream
+endobj
+
+58 0 obj
+47
+endobj
+
+%% Contents for page 13
+59 0 obj
+<<
+ /Length 60 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 12) Tj
+ET
+endstream
+endobj
+
+60 0 obj
+47
+endobj
+
+%% Contents for page 14
+61 0 obj
+<<
+ /Length 62 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 13) Tj
+ET
+endstream
+endobj
+
+62 0 obj
+47
+endobj
+
+%% Contents for page 15
+63 0 obj
+<<
+ /Length 64 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 14) Tj
+ET
+endstream
+endobj
+
+64 0 obj
+47
+endobj
+
+%% Contents for page 16
+65 0 obj
+<<
+ /Length 66 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 15) Tj
+ET
+endstream
+endobj
+
+66 0 obj
+47
+endobj
+
+%% Contents for page 17
+67 0 obj
+<<
+ /Length 68 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 16) Tj
+ET
+endstream
+endobj
+
+68 0 obj
+47
+endobj
+
+%% Contents for page 18
+69 0 obj
+<<
+ /Length 70 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 17) Tj
+ET
+endstream
+endobj
+
+70 0 obj
+47
+endobj
+
+%% Contents for page 19
+71 0 obj
+<<
+ /Length 72 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 18) Tj
+ET
+endstream
+endobj
+
+72 0 obj
+47
+endobj
+
+%% Contents for page 20
+73 0 obj
+<<
+ /Length 74 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 19) Tj
+ET
+endstream
+endobj
+
+74 0 obj
+47
+endobj
+
+%% Contents for page 21
+75 0 obj
+<<
+ /Length 76 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 20) Tj
+ET
+endstream
+endobj
+
+76 0 obj
+47
+endobj
+
+%% Contents for page 22
+77 0 obj
+<<
+ /Length 78 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 21) Tj
+ET
+endstream
+endobj
+
+78 0 obj
+47
+endobj
+
+%% Contents for page 23
+79 0 obj
+<<
+ /Length 80 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 22) Tj
+ET
+endstream
+endobj
+
+80 0 obj
+47
+endobj
+
+%% Contents for page 24
+81 0 obj
+<<
+ /Length 82 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 23) Tj
+ET
+endstream
+endobj
+
+82 0 obj
+47
+endobj
+
+%% Contents for page 25
+83 0 obj
+<<
+ /Length 84 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 24) Tj
+ET
+endstream
+endobj
+
+84 0 obj
+47
+endobj
+
+%% Contents for page 26
+85 0 obj
+<<
+ /Length 86 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 25) Tj
+ET
+endstream
+endobj
+
+86 0 obj
+47
+endobj
+
+%% Contents for page 27
+87 0 obj
+<<
+ /Length 88 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 26) Tj
+ET
+endstream
+endobj
+
+88 0 obj
+47
+endobj
+
+%% Contents for page 28
+89 0 obj
+<<
+ /Length 90 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 27) Tj
+ET
+endstream
+endobj
+
+90 0 obj
+47
+endobj
+
+%% Contents for page 29
+91 0 obj
+<<
+ /Length 92 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 28) Tj
+ET
+endstream
+endobj
+
+92 0 obj
+47
+endobj
+
+%% Contents for page 30
+93 0 obj
+<<
+ /Length 94 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 29) Tj
+ET
+endstream
+endobj
+
+94 0 obj
+47
+endobj
+
+xref
+0 110
+0000000095 65535 f
+0000000025 00000 n
+0000000145 00000 n
+0000000541 00000 n
+0000000746 00000 n
+0000000951 00000 n
+0000001156 00000 n
+0000001361 00000 n
+0000001566 00000 n
+0000001771 00000 n
+0000001976 00000 n
+0000002182 00000 n
+0000002389 00000 n
+0000002596 00000 n
+0000002803 00000 n
+0000003010 00000 n
+0000003217 00000 n
+0000003424 00000 n
+0000003631 00000 n
+0000003838 00000 n
+0000004045 00000 n
+0000004252 00000 n
+0000004459 00000 n
+0000004666 00000 n
+0000004873 00000 n
+0000005080 00000 n
+0000005287 00000 n
+0000005494 00000 n
+0000005701 00000 n
+0000005908 00000 n
+0000006115 00000 n
+0000006322 00000 n
+0000006529 00000 n
+0000006748 00000 n
+0000006851 00000 n
+0000006871 00000 n
+0000006990 00000 n
+0000007049 00000 n
+0000007152 00000 n
+0000007195 00000 n
+0000007298 00000 n
+0000007341 00000 n
+0000007444 00000 n
+0000007487 00000 n
+0000007590 00000 n
+0000007633 00000 n
+0000007736 00000 n
+0000007779 00000 n
+0000007882 00000 n
+0000007925 00000 n
+0000008028 00000 n
+0000008071 00000 n
+0000008174 00000 n
+0000008218 00000 n
+0000008321 00000 n
+0000008365 00000 n
+0000008469 00000 n
+0000008513 00000 n
+0000008617 00000 n
+0000008661 00000 n
+0000008765 00000 n
+0000008809 00000 n
+0000008913 00000 n
+0000008957 00000 n
+0000009061 00000 n
+0000009105 00000 n
+0000009209 00000 n
+0000009253 00000 n
+0000009357 00000 n
+0000009401 00000 n
+0000009505 00000 n
+0000009549 00000 n
+0000009653 00000 n
+0000009697 00000 n
+0000009801 00000 n
+0000009845 00000 n
+0000009949 00000 n
+0000009993 00000 n
+0000010097 00000 n
+0000010141 00000 n
+0000010245 00000 n
+0000010289 00000 n
+0000010393 00000 n
+0000010437 00000 n
+0000010541 00000 n
+0000010585 00000 n
+0000010689 00000 n
+0000010733 00000 n
+0000010837 00000 n
+0000010881 00000 n
+0000010985 00000 n
+0000011029 00000 n
+0000011133 00000 n
+0000011177 00000 n
+0000011281 00000 n
+0000000096 65535 f
+0000000097 65535 f
+0000000098 65535 f
+0000000099 65535 f
+0000000100 65535 f
+0000000101 65535 f
+0000000102 65535 f
+0000000103 65535 f
+0000000104 65535 f
+0000000105 65535 f
+0000000106 65535 f
+0000000107 65535 f
+0000000108 65535 f
+0000000109 65535 f
+0000000000 65535 f
+trailer <<
+ /Root 1 0 R
+ /Size 110
+>>
+startxref
+11301
+%%EOF
+
+108 0 obj
+<<
+ /Type /ObjStm
+ /N 13
+ /First 107
+ /Length 2445
+>>
+stream
+95 0
+96 74
+97 259
+98 393
+99 556
+100 898
+101 1077
+102 1275
+103 1432
+104 1589
+105 1730
+106 1887
+107 2040
+%95
+<<
+ /Type /Outlines
+ /First 96 0 R
+ /Last 97 0 R
+ /Count 6
+>>
+%96
+<<
+ /Type /Outline
+ /Title (Isís 1 -> 5: /XYZ null null null)
+ /Parent 95 0 R
+ /Count 4
+ /Next 97 0 R
+ /First 98 0 R
+ /Last 99 0 R
+ /Dest [ 8 0 R /XYZ null null null ]
+>>
+% 97
+<<
+ /Type /Outline
+ /Title (Trepak 2 -> 15: /XYZ 66 756 3)
+ /Parent 95 0 R
+ /Prev 96 0 R
+ /Dest [ 18 0 R /XYZ 66 756 3 ]
+>>
+% 98
+<<
+ /Type /Outline
+ /Title (Amanda 1.1 -> 11: /Fit)
+ /Parent 96 0 R
+ /Next 99 0 R
+ /First 100 0 R
+ /Last 101 0 R
+ /Count -3
+ /Dest [ 14 0 R /Fit ]
+>>
+% 99
+<<
+ /Type /Outline
+ % /Title (Sandy (Sandy [Greek]) 1.2 -> 13: /FitH 792)
+ /Title <feff00530061006e00640079002000f703a303b103bd03b403b900f700200031002e00320020002d003e002000310033003a0020002f00460069007400480020003700390032>
+ /Parent 96 0 R
+ /Prev 98 0 R
+ /First 105 0 R
+ /Last 106 0 R
+ /Count 2
+ /Dest [ 16 0 R /FitH 792 ]
+>>
+% 100
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1 -> 12: /FitV 100)
+ /Parent 98 0 R
+ /Next 101 0 R
+ /First 102 0 R
+ /Last 103 0 R
+ /Count -2
+ /Dest [ 15 0 R /FitV 100 ]
+>>
+% 101
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2 -> 12: /XYZ null null null)
+ /Parent 98 0 R
+ /Prev 100 0 R
+ /First 104 0 R
+ /Last 104 0 R
+ /Count 1
+ /Dest [ 15 0 R /XYZ null null null ]
+>>
+% 102
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.1 -> 18: /XYZ null null null)
+ /Parent 100 0 R
+ /Next 103 0 R
+ /Dest [ 21 0 R /XYZ null null null ]
+>>
+% 103
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.1.2 -> 19: /XYZ null null null)
+ /Parent 100 0 R
+ /Prev 102 0 R
+ /Dest [ 22 0 R /XYZ null null null ]
+>>
+% 104
+<<
+ /Type /Outline
+ /Title (Isosicle 1.1.2.1 -> 22: /XYZ null null null)
+ /Parent 101 0 R
+ /Dest [ 25 0 R /XYZ null null null ]
+>>
+% 105
+<<
+ /Type /Outline
+ /Title (Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770)
+ /Parent 99 0 R
+ /Next 106 0 R
+ /Dest [ 4 0 R /FitR 66 714 180 770 ]
+>>
+% 106
+<<
+ /Type /Outline
+ /Title (Trepsicle 1.2.2 -> 0: /XYZ null null null)
+ /Parent 99 0 R
+ /Prev 105 0 R
+ /Dest [ 3 0 R /XYZ null null null ]
+>>
+% 107
+ << /Nums [
+ 0 << /P () >>
+ 2 << /S /r /St 1 >>
+ 7 << /P () >>
+ 9 << /S /r /St 6 >>
+ 11 << /P () >>
+ 12 << /S /D /St 2 >>
+ 15 << /S /D /St 6 >>
+ 19 << /P () >>
+ 20 << /S /D /St 12 >>
+ 22 << /S /D /St 16059 >>
+ 23 << /S /r /St 50 >>
+ 29 << /S /r /St 54 >>
+ ] >>
+endstream
+endobj
+
+109 0 obj
+<<
+ /Type /XRef
+ /Size 110
+ /Index [0 110]
+ /W [1 2 1]
+ /Length 440
+ /Root 1 0 R
+>>
+stream
+
+$
+
+endstream
+endobj
+
+xref
+0 0
+trailer <<
+ /Size 110
+ /Root 1 0 R
+ /Prev 11301
+ /XRefStm 16113
+>>
+
+startxref
+16679
+%%EOF
diff --git a/qpdf/qtest/qpdf/inline-images.1.check b/qpdf/qtest/qpdf/inline-images.1.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.1.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.10.check b/qpdf/qtest/qpdf/inline-images.10.check
new file mode 100644
index 00000000..0e0ed996
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.10.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.11.check b/qpdf/qtest/qpdf/inline-images.11.check
new file mode 100644
index 00000000..327d847a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.11.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.12.check b/qpdf/qtest/qpdf/inline-images.12.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.12.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.2.check b/qpdf/qtest/qpdf/inline-images.2.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.2.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.3.check b/qpdf/qtest/qpdf/inline-images.3.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.3.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.4.check b/qpdf/qtest/qpdf/inline-images.4.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.4.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.5.check b/qpdf/qtest/qpdf/inline-images.5.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.5.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.6.check b/qpdf/qtest/qpdf/inline-images.6.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.6.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.7.check b/qpdf/qtest/qpdf/inline-images.7.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.7.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.8.check b/qpdf/qtest/qpdf/inline-images.8.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.8.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.9.check b/qpdf/qtest/qpdf/inline-images.9.check
new file mode 100644
index 00000000..37ea00cf
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.9.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/inline-images.pdf b/qpdf/qtest/qpdf/inline-images.pdf
new file mode 100644
index 00000000..e9c59e2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/inline-images.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin-delete-and-reuse.pdf b/qpdf/qtest/qpdf/lin-delete-and-reuse.pdf
new file mode 100644
index 00000000..a7b20ae2
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-delete-and-reuse.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin-special.1.check b/qpdf/qtest/qpdf/lin-special.1.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.1.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.10.check b/qpdf/qtest/qpdf/lin-special.10.check
new file mode 100644
index 00000000..0e0ed996
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.10.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.11.check b/qpdf/qtest/qpdf/lin-special.11.check
new file mode 100644
index 00000000..327d847a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.11.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.12.check b/qpdf/qtest/qpdf/lin-special.12.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.12.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.2.check b/qpdf/qtest/qpdf/lin-special.2.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.2.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.3.check b/qpdf/qtest/qpdf/lin-special.3.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.3.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.4.check b/qpdf/qtest/qpdf/lin-special.4.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.4.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.5.check b/qpdf/qtest/qpdf/lin-special.5.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.5.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.6.check b/qpdf/qtest/qpdf/lin-special.6.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.6.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.7.check b/qpdf/qtest/qpdf/lin-special.7.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.7.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.8.check b/qpdf/qtest/qpdf/lin-special.8.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.8.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.9.check b/qpdf/qtest/qpdf/lin-special.9.check
new file mode 100644
index 00000000..37ea00cf
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.9.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/lin-special.disable.exp b/qpdf/qtest/qpdf/lin-special.disable.exp
new file mode 100644
index 00000000..4c2173d3
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.disable.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin-special.generate.exp b/qpdf/qtest/qpdf/lin-special.generate.exp
new file mode 100644
index 00000000..a150957c
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.generate.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin-special.pdf b/qpdf/qtest/qpdf/lin-special.pdf
new file mode 100644
index 00000000..6dcff293
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.pdf
@@ -0,0 +1,354 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+%
+% This file exercises several special conditions in the linearization
+% and optimization code including various cases of shared resources,
+% inherited page attributes, indirect null objects (resolution of
+% which is a qpdf feature), null dictionary keys, and indirect scalar
+% objects.
+%
+% The page tree is
+%
+% (A)--- page 1
+% |
+% +---- page 2
+% |
+% +---(B)--- page 3
+% |
+% +---- page 4
+% |
+% +---- page 5
+%
+% Node (A) defines /MediaBox (direct) and /Resources (indirect)
+% Node (B) overrides /MediaBox
+% Page 1 overrides /Resources
+% Page 4 overrides /Resources
+% Page 5 overrides /MediaBox
+%
+% Page 5 provides the case of two levels of shadowing on a resource.
+%
+% The /MediaBox defined in node (B) is shared between pages 3 and 4
+% but not page 1. The /MediaBox defined in node (A) is shared between
+% pages 1 and 2 only.
+%
+% The document catalog has two non-standard keys /Moo and /Quack each
+% of which contains (directly or indirectly) an indirect null object.
+%
+% The /Moo object, which is a dictionary, is shared between the
+% document level and page 3 where it appears as a resource.
+%
+
+1 0 obj
+<<
+ /Moo 2 0 R
+ /Pages 3 0 R
+ /Quack 26 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Null1 27 0 R
+ /Null2 null
+ /One 1
+ /Two 28 0 R
+>>
+endobj
+
+3 0 obj
+<<
+ /Count 5
+ /Kids [
+ 4 0 R
+ 5 0 R
+ 6 0 R
+ ]
+ /MediaBox [
+ 0
+ 0
+ 576
+ 792
+ ]
+ /Resources 7 0 R
+ /Quack 16059
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+4 0 obj
+<<
+ /Contents 8 0 R
+ /Parent 3 0 R
+ /Resources 10 0 R
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+5 0 obj
+<<
+ /Contents 11 0 R
+ /Parent 3 0 R
+ /Type /Page
+>>
+endobj
+
+6 0 obj
+<<
+ /Count 3
+ /Kids [
+ 13 0 R
+ 14 0 R
+ 15 0 R
+ ]
+ /MediaBox [
+ 0
+ 0
+ 576
+ 396
+ ]
+ /Parent 3 0 R
+ /Type /Pages
+>>
+endobj
+
+7 0 obj
+<<
+ /Font <<
+ /F1 16 0 R
+ >>
+ /ProcSet 17 0 R
+>>
+endobj
+
+%% Contents for page 1
+8 0 obj
+<<
+ /Length 9 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato 1) Tj
+ET
+endstream
+endobj
+
+9 0 obj
+46
+endobj
+
+10 0 obj
+<<
+ /Font <<
+ /F1 18 0 R
+ >>
+ /ProcSet 17 0 R
+>>
+endobj
+
+%% Contents for page 2
+11 0 obj
+<<
+ /Length 12 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 322 Td
+ (Potato 2) Tj
+ET
+endstream
+endobj
+
+12 0 obj
+46
+endobj
+
+%% Page 3
+13 0 obj
+<<
+ /Contents 19 0 R
+ /Moo 2 0 R
+ /Parent 6 0 R
+ /Type /Page
+>>
+endobj
+
+%% Page 4
+14 0 obj
+<<
+ /Contents 21 0 R
+ /Parent 6 0 R
+ /Resources <<
+ /Font <<
+ /F1 23 0 R
+ >>
+ /ProcSet 17 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 5
+15 0 obj
+<<
+ /Contents 24 0 R
+ /MediaBox [
+ 0
+ 0
+ 306
+ 396
+ ]
+ /Parent 6 0 R
+ /Type /Page
+>>
+endobj
+
+16 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+17 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+18 0 obj
+<<
+ /BaseFont /Courier-Oblique
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+%% Contents for page 3
+19 0 obj
+<<
+ /Length 20 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 322 Td
+ (Potato 3) Tj
+ET
+endstream
+endobj
+
+20 0 obj
+46
+endobj
+
+%% Contents for page 4
+21 0 obj
+<<
+ /Length 22 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 322 Td
+ (Potato 4) Tj
+ET
+endstream
+endobj
+
+22 0 obj
+46
+endobj
+
+23 0 obj
+<<
+ /BaseFont /Times-Bold
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+%% Contents for page 5
+24 0 obj
+<<
+ /Length 25 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 322 Td
+ (Potato 5) Tj
+ET
+endstream
+endobj
+
+25 0 obj
+46
+endobj
+
+26 0 obj
+null
+endobj
+
+27 0 obj
+null
+endobj
+
+28 0 obj
+2
+endobj
+
+xref
+0 29
+0000000000 65535 f
+0000001161 00000 n
+0000001244 00000 n
+0000001319 00000 n
+0000001501 00000 n
+0000001601 00000 n
+0000001672 00000 n
+0000001829 00000 n
+0000001923 00000 n
+0000002024 00000 n
+0000002043 00000 n
+0000002138 00000 n
+0000002241 00000 n
+0000002271 00000 n
+0000002366 00000 n
+0000002526 00000 n
+0000002644 00000 n
+0000002763 00000 n
+0000002799 00000 n
+0000002947 00000 n
+0000003050 00000 n
+0000003093 00000 n
+0000003196 00000 n
+0000003216 00000 n
+0000003359 00000 n
+0000003462 00000 n
+0000003482 00000 n
+0000003504 00000 n
+0000003526 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 29
+ /ID [<ce9551b56c5a7e3b5b0ba6fa0d281296><a74aa55a69070b600e39f9ed1ed6c4df>]
+>>
+startxref
+3545
+%%EOF
diff --git a/qpdf/qtest/qpdf/lin-special.preserve.exp b/qpdf/qtest/qpdf/lin-special.preserve.exp
new file mode 100644
index 00000000..4c2173d3
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin-special.preserve.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin0.out b/qpdf/qtest/qpdf/lin0.out
new file mode 100644
index 00000000..a6e32e44
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin0.out
@@ -0,0 +1 @@
+lin0.pdf is not linearized
diff --git a/qpdf/qtest/qpdf/lin0.pdf b/qpdf/qtest/qpdf/lin0.pdf
new file mode 100644
index 00000000..a7e01f91
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin0.pdf
@@ -0,0 +1,79 @@
+%PDF-1.3
+1 0 obj
+<<
+ /Type /Catalog
+ /Pages 2 0 R
+>>
+endobj
+
+2 0 obj
+<<
+ /Type /Pages
+ /Kids [
+ 3 0 R
+ ]
+ /Count 1
+>>
+endobj
+
+3 0 obj
+<<
+ /Type /Page
+ /Parent 2 0 R
+ /MediaBox [0 0 612 792]
+ /Contents 4 0 R
+ /Resources <<
+ /ProcSet 5 0 R
+ /Font <<
+ /F1 6 0 R
+ >>
+ >>
+>>
+endobj
+
+4 0 obj
+<<
+ /Length 44
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+6 0 obj
+<<
+ /Type /Font
+ /Subtype /Type1
+ /Name /F1
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+>>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000009 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000307 00000 n
+0000000403 00000 n
+0000000438 00000 n
+trailer <<
+ /Size 7
+ /Root 1 0 R
+>>
+startxref
+556
+%%EOF
diff --git a/qpdf/qtest/qpdf/lin1.out b/qpdf/qtest/qpdf/lin1.out
new file mode 100644
index 00000000..d97842bc
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin1.out
@@ -0,0 +1,378 @@
+WARNING: end of first page section (/E) mismatch: /E = 1827; computed = 3889..3891
+WARNING: page 0 has shared identifier entries
+WARNING: page 0: shared object 62: in hint table but not computed list
+lin1.pdf: linearization data:
+
+file_size: 13103
+first_page_object: 62
+first_page_end: 1827
+npages: 30
+xref_zero_offset: 11776
+first_page: 0
+H_offset: 1211
+H_length: 203
+
+Page Offsets Hint Table
+
+min_nobjects: 2
+first_page_offset: 1414
+nbits_delta_nobjects: 4
+min_page_length: 259
+nbits_delta_page_length: 12
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 12
+nbits_nshared_objects: 2
+nbits_shared_identifier: 2
+nbits_shared_numerator: 4
+shared_denominator: 8
+Page 0:
+ nobjects: 16
+ length: 2477
+ content_offset: 0
+ content_length: 2218
+ nshared_objects: 2
+ identifier 0: 0
+ numerator 0: 0
+ identifier 1: 0
+ numerator 1: 0
+Page 1:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 2:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 3:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 4:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 5:
+ nobjects: 2
+ length: 261
+ content_offset: 0
+ content_length: 2
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 6:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 7:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 8:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 9:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 10:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 11:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 12:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 13:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 14:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 15:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 16:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 17:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 18:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 19:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 20:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 21:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 22:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 23:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 24:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 25:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 26:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 27:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 28:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 29:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 0
+nshared_first_page: 16
+nshared_total: 16
+nbits_nobjects: 0
+min_group_length: 34
+nbits_delta_group_length: 9
+Shared Object 0:
+ group length: 157
+Shared Object 1:
+ group length: 105
+Shared Object 2:
+ group length: 117
+Shared Object 3:
+ group length: 34
+Shared Object 4:
+ group length: 82
+Shared Object 5:
+ group length: 191
+Shared Object 6:
+ group length: 144
+Shared Object 7:
+ group length: 168
+Shared Object 8:
+ group length: 291
+Shared Object 9:
+ group length: 165
+Shared Object 10:
+ group length: 162
+Shared Object 11:
+ group length: 182
+Shared Object 12:
+ group length: 201
+Shared Object 13:
+ group length: 150
+Shared Object 14:
+ group length: 164
+Shared Object 15:
+ group length: 164
+
+Outlines Hint Table
+
+first_object: 66
+first_object_offset: 1827
+nobjects: 12
+group_length: 2064
diff --git a/qpdf/qtest/qpdf/lin1.pdf b/qpdf/qtest/qpdf/lin1.pdf
new file mode 100644
index 00000000..aac12916
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin1.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin2.out b/qpdf/qtest/qpdf/lin2.out
new file mode 100644
index 00000000..4be08814
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin2.out
@@ -0,0 +1,378 @@
+WARNING: end of first page section (/E) mismatch: /E = 1827; computed = 3889..3891
+WARNING: page 0 has shared identifier entries
+WARNING: page 0: shared object 62: in hint table but not computed list
+lin2.pdf: linearization data:
+
+file_size: 13103
+first_page_object: 62
+first_page_end: 1827
+npages: 30
+xref_zero_offset: 11776
+first_page: 0
+H_offset: 1211
+H_length: 203
+
+Page Offsets Hint Table
+
+min_nobjects: 2
+first_page_offset: 1414
+nbits_delta_nobjects: 4
+min_page_length: 259
+nbits_delta_page_length: 12
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 12
+nbits_nshared_objects: 2
+nbits_shared_identifier: 2
+nbits_shared_numerator: 4
+shared_denominator: 8
+Page 0:
+ nobjects: 16
+ length: 2477
+ content_offset: 0
+ content_length: 2218
+ nshared_objects: 2
+ identifier 0: 0
+ numerator 0: 0
+ identifier 1: 0
+ numerator 1: 0
+Page 1:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 2:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 3:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 4:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 5:
+ nobjects: 2
+ length: 261
+ content_offset: 0
+ content_length: 2
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 6:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 7:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 8:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 9:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 10:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 11:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 12:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 13:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 14:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 15:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 16:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 17:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 18:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 19:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 20:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 21:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 22:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 23:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 24:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 25:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 26:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 27:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 28:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 29:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 0
+nshared_first_page: 16
+nshared_total: 16
+nbits_nobjects: 0
+min_group_length: 34
+nbits_delta_group_length: 9
+Shared Object 0:
+ group length: 157
+Shared Object 1:
+ group length: 105
+Shared Object 2:
+ group length: 117
+Shared Object 3:
+ group length: 34
+Shared Object 4:
+ group length: 82
+Shared Object 5:
+ group length: 191
+Shared Object 6:
+ group length: 144
+Shared Object 7:
+ group length: 168
+Shared Object 8:
+ group length: 291
+Shared Object 9:
+ group length: 165
+Shared Object 10:
+ group length: 162
+Shared Object 11:
+ group length: 182
+Shared Object 12:
+ group length: 201
+Shared Object 13:
+ group length: 150
+Shared Object 14:
+ group length: 164
+Shared Object 15:
+ group length: 164
+
+Outlines Hint Table
+
+first_object: 66
+first_object_offset: 1827
+nobjects: 12
+group_length: 2064
diff --git a/qpdf/qtest/qpdf/lin2.pdf b/qpdf/qtest/qpdf/lin2.pdf
new file mode 100644
index 00000000..40cb0027
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin2.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin3.out b/qpdf/qtest/qpdf/lin3.out
new file mode 100644
index 00000000..468cfa59
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin3.out
@@ -0,0 +1,318 @@
+WARNING: end of first page section (/E) mismatch: /E = 3978; computed = 3785..3786
+WARNING: page 1: shared object 107: in computed list but not hint table
+WARNING: page 1: shared object 109: in computed list but not hint table
+WARNING: page 2: shared object 107: in computed list but not hint table
+WARNING: page 2: shared object 109: in computed list but not hint table
+WARNING: page 3: shared object 107: in computed list but not hint table
+WARNING: page 3: shared object 109: in computed list but not hint table
+WARNING: page 4: shared object 107: in computed list but not hint table
+WARNING: page 4: shared object 109: in computed list but not hint table
+WARNING: page 5: shared object 107: in computed list but not hint table
+WARNING: page 5: shared object 109: in computed list but not hint table
+WARNING: page 6: shared object 107: in computed list but not hint table
+WARNING: page 6: shared object 109: in computed list but not hint table
+WARNING: page 7: shared object 107: in computed list but not hint table
+WARNING: page 7: shared object 109: in computed list but not hint table
+WARNING: page 8: shared object 107: in computed list but not hint table
+WARNING: page 8: shared object 109: in computed list but not hint table
+WARNING: page 9: shared object 107: in computed list but not hint table
+WARNING: page 9: shared object 109: in computed list but not hint table
+WARNING: page 10: shared object 107: in computed list but not hint table
+WARNING: page 10: shared object 109: in computed list but not hint table
+WARNING: page 11: shared object 107: in computed list but not hint table
+WARNING: page 11: shared object 109: in computed list but not hint table
+WARNING: page 12: shared object 107: in computed list but not hint table
+WARNING: page 12: shared object 109: in computed list but not hint table
+WARNING: page 13: shared object 107: in computed list but not hint table
+WARNING: page 13: shared object 109: in computed list but not hint table
+WARNING: page 14: shared object 107: in computed list but not hint table
+WARNING: page 14: shared object 109: in computed list but not hint table
+WARNING: page 15: shared object 107: in computed list but not hint table
+WARNING: page 15: shared object 109: in computed list but not hint table
+WARNING: page 16: shared object 107: in computed list but not hint table
+WARNING: page 16: shared object 109: in computed list but not hint table
+WARNING: page 17: shared object 107: in computed list but not hint table
+WARNING: page 17: shared object 109: in computed list but not hint table
+WARNING: page 18: shared object 107: in computed list but not hint table
+WARNING: page 18: shared object 109: in computed list but not hint table
+WARNING: page 19: shared object 107: in computed list but not hint table
+WARNING: page 19: shared object 109: in computed list but not hint table
+WARNING: page 20: shared object 107: in computed list but not hint table
+WARNING: page 20: shared object 109: in computed list but not hint table
+WARNING: page 21: shared object 107: in computed list but not hint table
+WARNING: page 21: shared object 109: in computed list but not hint table
+WARNING: page 22: shared object 107: in computed list but not hint table
+WARNING: page 22: shared object 109: in computed list but not hint table
+WARNING: page 23: shared object 107: in computed list but not hint table
+WARNING: page 23: shared object 109: in computed list but not hint table
+WARNING: page 24: shared object 107: in computed list but not hint table
+WARNING: page 24: shared object 109: in computed list but not hint table
+WARNING: page 25: shared object 107: in computed list but not hint table
+WARNING: page 25: shared object 109: in computed list but not hint table
+WARNING: page 26: shared object 107: in computed list but not hint table
+WARNING: page 26: shared object 109: in computed list but not hint table
+WARNING: page 27: shared object 107: in computed list but not hint table
+WARNING: page 27: shared object 109: in computed list but not hint table
+WARNING: page 28: shared object 107: in computed list but not hint table
+WARNING: page 28: shared object 109: in computed list but not hint table
+WARNING: page 29: shared object 107: in computed list but not hint table
+WARNING: page 29: shared object 109: in computed list but not hint table
+WARNING: incorrect offset in outlines table: hint table = 1627; computed = 1547
+WARNING: incorrect length in outlines table: hint table = 1988; computed = 1936
+lin3.pdf: linearization data:
+
+file_size: 16937
+first_page_object: 93
+first_page_end: 3978
+npages: 30
+xref_zero_offset: 14999
+first_page: 0
+H_offset: 1142
+H_length: 210
+
+Page Offsets Hint Table
+
+min_nobjects: 3
+first_page_offset: 1352
+nbits_delta_nobjects: 5
+min_page_length: 339
+nbits_delta_page_length: 12
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 12
+nbits_nshared_objects: 0
+nbits_shared_identifier: 5
+nbits_shared_numerator: 0
+shared_denominator: 8
+Page 0:
+ nobjects: 17
+ length: 2434
+ content_offset: 0
+ content_length: 2095
+ nshared_objects: 0
+Page 1:
+ nobjects: 3
+ length: 339
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 2:
+ nobjects: 3
+ length: 339
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 3:
+ nobjects: 3
+ length: 339
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 4:
+ nobjects: 3
+ length: 344
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 5:
+ nobjects: 3
+ length: 344
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 6:
+ nobjects: 3
+ length: 344
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 7:
+ nobjects: 3
+ length: 344
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 8:
+ nobjects: 3
+ length: 344
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 9:
+ nobjects: 3
+ length: 344
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 10:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 11:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 12:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 13:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 14:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 15:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 16:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 17:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 18:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 19:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 20:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 21:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 22:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 23:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 24:
+ nobjects: 3
+ length: 344
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 25:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 26:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 27:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 28:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 29:
+ nobjects: 3
+ length: 345
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 16
+nshared_first_page: 17
+nshared_total: 17
+nbits_nobjects: 0
+min_group_length: 21
+nbits_delta_group_length: 8
+Shared Object 0:
+ group length: 195
+Shared Object 1:
+ group length: 80
+Shared Object 2:
+ group length: 189
+Shared Object 3:
+ group length: 141
+Shared Object 4:
+ group length: 167
+Shared Object 5:
+ group length: 174
+Shared Object 6:
+ group length: 163
+Shared Object 7:
+ group length: 160
+Shared Object 8:
+ group length: 183
+Shared Object 9:
+ group length: 202
+Shared Object 10:
+ group length: 149
+Shared Object 11:
+ group length: 164
+Shared Object 12:
+ group length: 164
+Shared Object 13:
+ group length: 132
+Shared Object 14:
+ group length: 116
+Shared Object 15:
+ group length: 21
+Shared Object 16:
+ group length: 34
+
+Outlines Hint Table
+
+first_object: 94
+first_object_offset: 1627
+nobjects: 12
+group_length: 1988
diff --git a/qpdf/qtest/qpdf/lin3.pdf b/qpdf/qtest/qpdf/lin3.pdf
new file mode 100644
index 00000000..e33c7019
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin3.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin4.out b/qpdf/qtest/qpdf/lin4.out
new file mode 100644
index 00000000..42c6282e
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin4.out
@@ -0,0 +1,353 @@
+WARNING: page 0 has shared identifier entries
+WARNING: page 0: shared object 74: in hint table but not computed list
+lin4.pdf: linearization data:
+
+file_size: 13055
+first_page_object: 74
+first_page_end: 1539
+npages: 30
+xref_zero_offset: 11488
+first_page: 0
+H_offset: 946
+H_length: 180
+
+Page Offsets Hint Table
+
+min_nobjects: 2
+first_page_offset: 1126
+nbits_delta_nobjects: 2
+min_page_length: 259
+nbits_delta_page_length: 8
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 8
+nbits_nshared_objects: 2
+nbits_shared_identifier: 2
+nbits_shared_numerator: 4
+shared_denominator: 8
+Page 0:
+ nobjects: 4
+ length: 413
+ content_offset: 0
+ content_length: 154
+ nshared_objects: 2
+ identifier 0: 0
+ numerator 0: 0
+ identifier 1: 0
+ numerator 1: 0
+Page 1:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 2:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 3:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 4:
+ nobjects: 2
+ length: 259
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 5:
+ nobjects: 2
+ length: 261
+ content_offset: 0
+ content_length: 2
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 6:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 7:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 8:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 9:
+ nobjects: 2
+ length: 262
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 10:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 11:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 12:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 13:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 14:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 15:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 16:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 17:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 18:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 19:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 20:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 21:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 22:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 23:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 24:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 25:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 26:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 27:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 28:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+Page 29:
+ nobjects: 2
+ length: 263
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 2
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 0
+nshared_first_page: 4
+nshared_total: 4
+nbits_nobjects: 0
+min_group_length: 34
+nbits_delta_group_length: 7
+Shared Object 0:
+ group length: 157
+Shared Object 1:
+ group length: 105
+Shared Object 2:
+ group length: 117
+Shared Object 3:
+ group length: 34
+
+Outlines Hint Table
+
+first_object: 60
+first_object_offset: 9413
+nobjects: 12
+group_length: 2064
diff --git a/qpdf/qtest/qpdf/lin4.pdf b/qpdf/qtest/qpdf/lin4.pdf
new file mode 100644
index 00000000..4778bd8a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin4.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin5.out b/qpdf/qtest/qpdf/lin5.out
new file mode 100644
index 00000000..b2261a1b
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin5.out
@@ -0,0 +1,318 @@
+WARNING: end of first page section (/E) mismatch: /E = 4213; computed = 4004..4005
+WARNING: page 1: shared object 170: in computed list but not hint table
+WARNING: page 1: shared object 172: in computed list but not hint table
+WARNING: page 2: shared object 170: in computed list but not hint table
+WARNING: page 2: shared object 172: in computed list but not hint table
+WARNING: page 3: shared object 170: in computed list but not hint table
+WARNING: page 3: shared object 172: in computed list but not hint table
+WARNING: page 4: shared object 170: in computed list but not hint table
+WARNING: page 4: shared object 172: in computed list but not hint table
+WARNING: page 5: shared object 170: in computed list but not hint table
+WARNING: page 5: shared object 172: in computed list but not hint table
+WARNING: page 6: shared object 170: in computed list but not hint table
+WARNING: page 6: shared object 172: in computed list but not hint table
+WARNING: page 7: shared object 170: in computed list but not hint table
+WARNING: page 7: shared object 172: in computed list but not hint table
+WARNING: page 8: shared object 170: in computed list but not hint table
+WARNING: page 8: shared object 172: in computed list but not hint table
+WARNING: page 9: shared object 170: in computed list but not hint table
+WARNING: page 9: shared object 172: in computed list but not hint table
+WARNING: page 10: shared object 170: in computed list but not hint table
+WARNING: page 10: shared object 172: in computed list but not hint table
+WARNING: page 11: shared object 170: in computed list but not hint table
+WARNING: page 11: shared object 172: in computed list but not hint table
+WARNING: page 12: shared object 170: in computed list but not hint table
+WARNING: page 12: shared object 172: in computed list but not hint table
+WARNING: page 13: shared object 170: in computed list but not hint table
+WARNING: page 13: shared object 172: in computed list but not hint table
+WARNING: page 14: shared object 170: in computed list but not hint table
+WARNING: page 14: shared object 172: in computed list but not hint table
+WARNING: page 15: shared object 170: in computed list but not hint table
+WARNING: page 15: shared object 172: in computed list but not hint table
+WARNING: page 16: shared object 170: in computed list but not hint table
+WARNING: page 16: shared object 172: in computed list but not hint table
+WARNING: page 17: shared object 170: in computed list but not hint table
+WARNING: page 17: shared object 172: in computed list but not hint table
+WARNING: page 18: shared object 170: in computed list but not hint table
+WARNING: page 18: shared object 172: in computed list but not hint table
+WARNING: page 19: shared object 170: in computed list but not hint table
+WARNING: page 19: shared object 172: in computed list but not hint table
+WARNING: page 20: shared object 170: in computed list but not hint table
+WARNING: page 20: shared object 172: in computed list but not hint table
+WARNING: page 21: shared object 170: in computed list but not hint table
+WARNING: page 21: shared object 172: in computed list but not hint table
+WARNING: page 22: shared object 170: in computed list but not hint table
+WARNING: page 22: shared object 172: in computed list but not hint table
+WARNING: page 23: shared object 170: in computed list but not hint table
+WARNING: page 23: shared object 172: in computed list but not hint table
+WARNING: page 24: shared object 170: in computed list but not hint table
+WARNING: page 24: shared object 172: in computed list but not hint table
+WARNING: page 25: shared object 170: in computed list but not hint table
+WARNING: page 25: shared object 172: in computed list but not hint table
+WARNING: page 26: shared object 170: in computed list but not hint table
+WARNING: page 26: shared object 172: in computed list but not hint table
+WARNING: page 27: shared object 170: in computed list but not hint table
+WARNING: page 27: shared object 172: in computed list but not hint table
+WARNING: page 28: shared object 170: in computed list but not hint table
+WARNING: page 28: shared object 172: in computed list but not hint table
+WARNING: page 29: shared object 170: in computed list but not hint table
+WARNING: page 29: shared object 172: in computed list but not hint table
+WARNING: incorrect offset in outlines table: hint table = 1710; computed = 1627
+WARNING: incorrect length in outlines table: hint table = 2124; computed = 2075
+lin5.pdf: linearization data:
+
+file_size: 27464
+first_page_object: 156
+first_page_end: 4213
+npages: 30
+xref_zero_offset: 24265
+first_page: 0
+H_offset: 1149
+H_length: 266
+
+Page Offsets Hint Table
+
+min_nobjects: 3
+first_page_offset: 1415
+nbits_delta_nobjects: 5
+min_page_length: 355
+nbits_delta_page_length: 12
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 12
+nbits_nshared_objects: 0
+nbits_shared_identifier: 5
+nbits_shared_numerator: 0
+shared_denominator: 8
+Page 0:
+ nobjects: 17
+ length: 2590
+ content_offset: 0
+ content_length: 2235
+ nshared_objects: 0
+Page 1:
+ nobjects: 3
+ length: 355
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 2:
+ nobjects: 3
+ length: 355
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 3:
+ nobjects: 3
+ length: 355
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 4:
+ nobjects: 3
+ length: 360
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 5:
+ nobjects: 3
+ length: 360
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 6:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 7:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 8:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 9:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 10:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 11:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 12:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 13:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 14:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 15:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 16:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 17:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 18:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 19:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 20:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 21:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 22:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 23:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 24:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 25:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 26:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 27:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 28:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+Page 29:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 7
+ nshared_objects: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 16
+nshared_first_page: 17
+nshared_total: 17
+nbits_nobjects: 0
+min_group_length: 21
+nbits_delta_group_length: 9
+Shared Object 0:
+ group length: 212
+Shared Object 1:
+ group length: 83
+Shared Object 2:
+ group length: 194
+Shared Object 3:
+ group length: 144
+Shared Object 4:
+ group length: 170
+Shared Object 5:
+ group length: 292
+Shared Object 6:
+ group length: 165
+Shared Object 7:
+ group length: 163
+Shared Object 8:
+ group length: 184
+Shared Object 9:
+ group length: 203
+Shared Object 10:
+ group length: 149
+Shared Object 11:
+ group length: 164
+Shared Object 12:
+ group length: 164
+Shared Object 13:
+ group length: 132
+Shared Object 14:
+ group length: 116
+Shared Object 15:
+ group length: 21
+Shared Object 16:
+ group length: 34
+
+Outlines Hint Table
+
+first_object: 157
+first_object_offset: 1710
+nobjects: 12
+group_length: 2124
diff --git a/qpdf/qtest/qpdf/lin5.pdf b/qpdf/qtest/qpdf/lin5.pdf
new file mode 100644
index 00000000..a41aa344
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin5.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin6.out b/qpdf/qtest/qpdf/lin6.out
new file mode 100644
index 00000000..3ed08aa8
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin6.out
@@ -0,0 +1,592 @@
+WARNING: end of first page section (/E) mismatch: /E = 2897; computed = 5005..5007
+WARNING: object count mismatch for page 0: hint table = 19; computed = 16
+WARNING: page 0 has shared identifier entries
+WARNING: page 0: shared object 93: in hint table but not computed list
+WARNING: object count mismatch for page 1: hint table = 3; computed = 2
+WARNING: page 1: shared object 98: in hint table but not computed list
+WARNING: page 1: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 2: hint table = 3; computed = 2
+WARNING: page 2: shared object 98: in hint table but not computed list
+WARNING: page 2: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 3: hint table = 3; computed = 2
+WARNING: page 3: shared object 98: in hint table but not computed list
+WARNING: page 3: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 4: hint table = 3; computed = 2
+WARNING: page 4: shared object 98: in hint table but not computed list
+WARNING: page 4: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 5: hint table = 3; computed = 2
+WARNING: page 5: shared object 98: in hint table but not computed list
+WARNING: page 5: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 6: hint table = 3; computed = 2
+WARNING: page 6: shared object 98: in hint table but not computed list
+WARNING: page 6: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 7: hint table = 3; computed = 2
+WARNING: page 7: shared object 98: in hint table but not computed list
+WARNING: page 7: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 8: hint table = 3; computed = 2
+WARNING: page 8: shared object 98: in hint table but not computed list
+WARNING: page 8: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 9: hint table = 3; computed = 2
+WARNING: page 9: shared object 98: in hint table but not computed list
+WARNING: page 9: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 10: hint table = 3; computed = 2
+WARNING: page 10: shared object 98: in hint table but not computed list
+WARNING: page 10: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 11: hint table = 3; computed = 2
+WARNING: page 11: shared object 98: in hint table but not computed list
+WARNING: page 11: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 12: hint table = 3; computed = 2
+WARNING: page 12: shared object 98: in hint table but not computed list
+WARNING: page 12: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 13: hint table = 3; computed = 2
+WARNING: page 13: shared object 98: in hint table but not computed list
+WARNING: page 13: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 14: hint table = 3; computed = 2
+WARNING: page 14: shared object 98: in hint table but not computed list
+WARNING: page 14: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 15: hint table = 3; computed = 2
+WARNING: page 15: shared object 98: in hint table but not computed list
+WARNING: page 15: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 16: hint table = 3; computed = 2
+WARNING: page 16: shared object 98: in hint table but not computed list
+WARNING: page 16: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 17: hint table = 3; computed = 2
+WARNING: page 17: shared object 98: in hint table but not computed list
+WARNING: page 17: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 18: hint table = 3; computed = 2
+WARNING: page 18: shared object 98: in hint table but not computed list
+WARNING: page 18: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 19: hint table = 3; computed = 2
+WARNING: page 19: shared object 98: in hint table but not computed list
+WARNING: page 19: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 20: hint table = 3; computed = 2
+WARNING: page 20: shared object 98: in hint table but not computed list
+WARNING: page 20: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 21: hint table = 3; computed = 2
+WARNING: page 21: shared object 98: in hint table but not computed list
+WARNING: page 21: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 22: hint table = 3; computed = 2
+WARNING: page 22: shared object 98: in hint table but not computed list
+WARNING: page 22: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 23: hint table = 3; computed = 2
+WARNING: page 23: shared object 98: in hint table but not computed list
+WARNING: page 23: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 24: hint table = 3; computed = 2
+WARNING: page 24: shared object 98: in hint table but not computed list
+WARNING: page 24: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 25: hint table = 3; computed = 2
+WARNING: page 25: shared object 98: in hint table but not computed list
+WARNING: page 25: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 26: hint table = 3; computed = 2
+WARNING: page 26: shared object 98: in hint table but not computed list
+WARNING: page 26: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 27: hint table = 3; computed = 2
+WARNING: page 27: shared object 98: in hint table but not computed list
+WARNING: page 27: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 28: hint table = 3; computed = 2
+WARNING: page 28: shared object 98: in hint table but not computed list
+WARNING: page 28: shared object 99: in hint table but not computed list
+WARNING: object count mismatch for page 29: hint table = 3; computed = 2
+WARNING: page 29: shared object 98: in hint table but not computed list
+WARNING: page 29: shared object 99: in hint table but not computed list
+lin6.pdf: linearization data:
+
+file_size: 24824
+first_page_object: 93
+first_page_end: 2897
+npages: 30
+xref_zero_offset: 22877
+first_page: 0
+H_offset: 1291
+H_length: 232
+
+Page Offsets Hint Table
+
+min_nobjects: 3
+first_page_offset: 1523
+nbits_delta_nobjects: 5
+min_page_length: 580
+nbits_delta_page_length: 12
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 12
+nbits_nshared_objects: 3
+nbits_shared_identifier: 3
+nbits_shared_numerator: 4
+shared_denominator: 8
+Page 0:
+ nobjects: 19
+ length: 3484
+ content_offset: 0
+ content_length: 2904
+ nshared_objects: 4
+ identifier 0: 0
+ numerator 0: 0
+ identifier 1: 0
+ numerator 1: 0
+ identifier 2: 0
+ numerator 2: 0
+ identifier 3: 0
+ numerator 3: 0
+Page 1:
+ nobjects: 3
+ length: 580
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 2:
+ nobjects: 3
+ length: 580
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 3:
+ nobjects: 3
+ length: 584
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 4:
+ nobjects: 3
+ length: 591
+ content_offset: 0
+ content_length: 11
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 5:
+ nobjects: 3
+ length: 583
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 6:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 7:
+ nobjects: 3
+ length: 583
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 8:
+ nobjects: 3
+ length: 591
+ content_offset: 0
+ content_length: 11
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 9:
+ nobjects: 3
+ length: 584
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 10:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 11:
+ nobjects: 3
+ length: 588
+ content_offset: 0
+ content_length: 8
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 12:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 13:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 14:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 15:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 16:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 17:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 18:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 19:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 20:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 21:
+ nobjects: 3
+ length: 588
+ content_offset: 0
+ content_length: 8
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 22:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 23:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 24:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 25:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 26:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 27:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 28:
+ nobjects: 3
+ length: 590
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 29:
+ nobjects: 3
+ length: 589
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 0
+nshared_first_page: 19
+nshared_total: 19
+nbits_nobjects: 0
+min_group_length: 34
+nbits_delta_group_length: 10
+Shared Object 0:
+ group length: 209
+Shared Object 1:
+ group length: 133
+Shared Object 2:
+ group length: 117
+Shared Object 3:
+ group length: 34
+Shared Object 4:
+ group length: 247
+Shared Object 5:
+ group length: 54
+Shared Object 6:
+ group length: 580
+Shared Object 7:
+ group length: 85
+Shared Object 8:
+ group length: 197
+Shared Object 9:
+ group length: 147
+Shared Object 10:
+ group length: 173
+Shared Object 11:
+ group length: 296
+Shared Object 12:
+ group length: 168
+Shared Object 13:
+ group length: 165
+Shared Object 14:
+ group length: 187
+Shared Object 15:
+ group length: 206
+Shared Object 16:
+ group length: 152
+Shared Object 17:
+ group length: 167
+Shared Object 18:
+ group length: 167
+
+Outlines Hint Table
+
+first_object: 100
+first_object_offset: 2897
+nobjects: 12
+group_length: 2110
diff --git a/qpdf/qtest/qpdf/lin6.pdf b/qpdf/qtest/qpdf/lin6.pdf
new file mode 100644
index 00000000..d76545f6
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin6.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin7.out b/qpdf/qtest/qpdf/lin7.out
new file mode 100644
index 00000000..c98d172a
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin7.out
@@ -0,0 +1,292 @@
+WARNING: end of first page section (/E) mismatch: /E = 1865; computed = 1655..1656
+WARNING: page 1: shared object 170: in computed list but not hint table
+WARNING: page 1: shared object 172: in computed list but not hint table
+WARNING: page 2: shared object 170: in computed list but not hint table
+WARNING: page 2: shared object 172: in computed list but not hint table
+WARNING: page 3: shared object 170: in computed list but not hint table
+WARNING: page 3: shared object 172: in computed list but not hint table
+WARNING: page 4: shared object 170: in computed list but not hint table
+WARNING: page 4: shared object 172: in computed list but not hint table
+WARNING: page 5: shared object 170: in computed list but not hint table
+WARNING: page 5: shared object 172: in computed list but not hint table
+WARNING: page 6: shared object 170: in computed list but not hint table
+WARNING: page 6: shared object 172: in computed list but not hint table
+WARNING: page 7: shared object 170: in computed list but not hint table
+WARNING: page 7: shared object 172: in computed list but not hint table
+WARNING: page 8: shared object 170: in computed list but not hint table
+WARNING: page 8: shared object 172: in computed list but not hint table
+WARNING: page 9: shared object 170: in computed list but not hint table
+WARNING: page 9: shared object 172: in computed list but not hint table
+WARNING: page 10: shared object 170: in computed list but not hint table
+WARNING: page 10: shared object 172: in computed list but not hint table
+WARNING: page 11: shared object 170: in computed list but not hint table
+WARNING: page 11: shared object 172: in computed list but not hint table
+WARNING: page 12: shared object 170: in computed list but not hint table
+WARNING: page 12: shared object 172: in computed list but not hint table
+WARNING: page 13: shared object 170: in computed list but not hint table
+WARNING: page 13: shared object 172: in computed list but not hint table
+WARNING: page 14: shared object 170: in computed list but not hint table
+WARNING: page 14: shared object 172: in computed list but not hint table
+WARNING: page 15: shared object 170: in computed list but not hint table
+WARNING: page 15: shared object 172: in computed list but not hint table
+WARNING: page 16: shared object 170: in computed list but not hint table
+WARNING: page 16: shared object 172: in computed list but not hint table
+WARNING: page 17: shared object 170: in computed list but not hint table
+WARNING: page 17: shared object 172: in computed list but not hint table
+WARNING: page 18: shared object 170: in computed list but not hint table
+WARNING: page 18: shared object 172: in computed list but not hint table
+WARNING: page 19: shared object 170: in computed list but not hint table
+WARNING: page 19: shared object 172: in computed list but not hint table
+WARNING: page 20: shared object 170: in computed list but not hint table
+WARNING: page 20: shared object 172: in computed list but not hint table
+WARNING: page 21: shared object 170: in computed list but not hint table
+WARNING: page 21: shared object 172: in computed list but not hint table
+WARNING: page 22: shared object 170: in computed list but not hint table
+WARNING: page 22: shared object 172: in computed list but not hint table
+WARNING: page 23: shared object 170: in computed list but not hint table
+WARNING: page 23: shared object 172: in computed list but not hint table
+WARNING: page 24: shared object 170: in computed list but not hint table
+WARNING: page 24: shared object 172: in computed list but not hint table
+WARNING: page 25: shared object 170: in computed list but not hint table
+WARNING: page 25: shared object 172: in computed list but not hint table
+WARNING: page 26: shared object 170: in computed list but not hint table
+WARNING: page 26: shared object 172: in computed list but not hint table
+WARNING: page 27: shared object 170: in computed list but not hint table
+WARNING: page 27: shared object 172: in computed list but not hint table
+WARNING: page 28: shared object 170: in computed list but not hint table
+WARNING: page 28: shared object 172: in computed list but not hint table
+WARNING: page 29: shared object 170: in computed list but not hint table
+WARNING: page 29: shared object 172: in computed list but not hint table
+lin7.pdf: linearization data:
+
+file_size: 27408
+first_page_object: 168
+first_page_end: 1865
+npages: 30
+xref_zero_offset: 23969
+first_page: 0
+H_offset: 905
+H_length: 235
+
+Page Offsets Hint Table
+
+min_nobjects: 3
+first_page_offset: 1140
+nbits_delta_nobjects: 3
+min_page_length: 356
+nbits_delta_page_length: 8
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 8
+nbits_nshared_objects: 0
+nbits_shared_identifier: 3
+nbits_shared_numerator: 0
+shared_denominator: 8
+Page 0:
+ nobjects: 5
+ length: 516
+ content_offset: 0
+ content_length: 160
+ nshared_objects: 0
+Page 1:
+ nobjects: 3
+ length: 356
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 2:
+ nobjects: 3
+ length: 356
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 3:
+ nobjects: 3
+ length: 356
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 0
+Page 4:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 5:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 6:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 7:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 8:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 9:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 10:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 11:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 12:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 13:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 14:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 15:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 16:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 17:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 18:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 19:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 20:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 21:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 22:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 23:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 24:
+ nobjects: 3
+ length: 361
+ content_offset: 0
+ content_length: 5
+ nshared_objects: 0
+Page 25:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 26:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 27:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 28:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+Page 29:
+ nobjects: 3
+ length: 362
+ content_offset: 0
+ content_length: 6
+ nshared_objects: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 16
+nshared_first_page: 5
+nshared_total: 5
+nbits_nobjects: 0
+min_group_length: 21
+nbits_delta_group_length: 8
+Shared Object 0:
+ group length: 213
+Shared Object 1:
+ group length: 132
+Shared Object 2:
+ group length: 116
+Shared Object 3:
+ group length: 21
+Shared Object 4:
+ group length: 34
+
+Outlines Hint Table
+
+first_object: 88
+first_object_offset: 12129
+nobjects: 12
+group_length: 2030
diff --git a/qpdf/qtest/qpdf/lin7.pdf b/qpdf/qtest/qpdf/lin7.pdf
new file mode 100644
index 00000000..011daa1d
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin7.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin8.out b/qpdf/qtest/qpdf/lin8.out
new file mode 100644
index 00000000..696b759c
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin8.out
@@ -0,0 +1,568 @@
+WARNING: end of first page section (/E) mismatch: /E = 2656; computed = 1768..1770
+WARNING: object count mismatch for page 0: hint table = 7; computed = 4
+WARNING: page 0 has shared identifier entries
+WARNING: page 0: shared object 105: in hint table but not computed list
+WARNING: object count mismatch for page 1: hint table = 3; computed = 2
+WARNING: page 1: shared object 110: in hint table but not computed list
+WARNING: page 1: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 2: hint table = 3; computed = 2
+WARNING: page 2: shared object 110: in hint table but not computed list
+WARNING: page 2: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 3: hint table = 3; computed = 2
+WARNING: page 3: shared object 110: in hint table but not computed list
+WARNING: page 3: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 4: hint table = 3; computed = 2
+WARNING: page 4: shared object 110: in hint table but not computed list
+WARNING: page 4: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 5: hint table = 3; computed = 2
+WARNING: page 5: shared object 110: in hint table but not computed list
+WARNING: page 5: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 6: hint table = 3; computed = 2
+WARNING: page 6: shared object 110: in hint table but not computed list
+WARNING: page 6: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 7: hint table = 3; computed = 2
+WARNING: page 7: shared object 110: in hint table but not computed list
+WARNING: page 7: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 8: hint table = 3; computed = 2
+WARNING: page 8: shared object 110: in hint table but not computed list
+WARNING: page 8: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 9: hint table = 3; computed = 2
+WARNING: page 9: shared object 110: in hint table but not computed list
+WARNING: page 9: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 10: hint table = 3; computed = 2
+WARNING: page 10: shared object 110: in hint table but not computed list
+WARNING: page 10: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 11: hint table = 3; computed = 2
+WARNING: page 11: shared object 110: in hint table but not computed list
+WARNING: page 11: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 12: hint table = 3; computed = 2
+WARNING: page 12: shared object 110: in hint table but not computed list
+WARNING: page 12: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 13: hint table = 3; computed = 2
+WARNING: page 13: shared object 110: in hint table but not computed list
+WARNING: page 13: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 14: hint table = 3; computed = 2
+WARNING: page 14: shared object 110: in hint table but not computed list
+WARNING: page 14: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 15: hint table = 3; computed = 2
+WARNING: page 15: shared object 110: in hint table but not computed list
+WARNING: page 15: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 16: hint table = 3; computed = 2
+WARNING: page 16: shared object 110: in hint table but not computed list
+WARNING: page 16: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 17: hint table = 3; computed = 2
+WARNING: page 17: shared object 110: in hint table but not computed list
+WARNING: page 17: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 18: hint table = 3; computed = 2
+WARNING: page 18: shared object 110: in hint table but not computed list
+WARNING: page 18: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 19: hint table = 3; computed = 2
+WARNING: page 19: shared object 110: in hint table but not computed list
+WARNING: page 19: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 20: hint table = 3; computed = 2
+WARNING: page 20: shared object 110: in hint table but not computed list
+WARNING: page 20: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 21: hint table = 3; computed = 2
+WARNING: page 21: shared object 110: in hint table but not computed list
+WARNING: page 21: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 22: hint table = 3; computed = 2
+WARNING: page 22: shared object 110: in hint table but not computed list
+WARNING: page 22: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 23: hint table = 3; computed = 2
+WARNING: page 23: shared object 110: in hint table but not computed list
+WARNING: page 23: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 24: hint table = 3; computed = 2
+WARNING: page 24: shared object 110: in hint table but not computed list
+WARNING: page 24: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 25: hint table = 3; computed = 2
+WARNING: page 25: shared object 110: in hint table but not computed list
+WARNING: page 25: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 26: hint table = 3; computed = 2
+WARNING: page 26: shared object 110: in hint table but not computed list
+WARNING: page 26: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 27: hint table = 3; computed = 2
+WARNING: page 27: shared object 110: in hint table but not computed list
+WARNING: page 27: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 28: hint table = 3; computed = 2
+WARNING: page 28: shared object 110: in hint table but not computed list
+WARNING: page 28: shared object 111: in hint table but not computed list
+WARNING: object count mismatch for page 29: hint table = 3; computed = 2
+WARNING: page 29: shared object 110: in hint table but not computed list
+WARNING: page 29: shared object 111: in hint table but not computed list
+lin8.pdf: linearization data:
+
+file_size: 24875
+first_page_object: 105
+first_page_end: 2656
+npages: 30
+xref_zero_offset: 22687
+first_page: 0
+H_offset: 1052
+H_length: 217
+
+Page Offsets Hint Table
+
+min_nobjects: 3
+first_page_offset: 1269
+nbits_delta_nobjects: 3
+min_page_length: 583
+nbits_delta_page_length: 10
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 10
+nbits_nshared_objects: 3
+nbits_shared_identifier: 3
+nbits_shared_numerator: 4
+shared_denominator: 8
+Page 0:
+ nobjects: 7
+ length: 1387
+ content_offset: 0
+ content_length: 804
+ nshared_objects: 4
+ identifier 0: 0
+ numerator 0: 0
+ identifier 1: 0
+ numerator 1: 0
+ identifier 2: 0
+ numerator 2: 0
+ identifier 3: 0
+ numerator 3: 0
+Page 1:
+ nobjects: 3
+ length: 583
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 2:
+ nobjects: 3
+ length: 583
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 3:
+ nobjects: 3
+ length: 587
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 4:
+ nobjects: 3
+ length: 594
+ content_offset: 0
+ content_length: 11
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 5:
+ nobjects: 3
+ length: 586
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 6:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 7:
+ nobjects: 3
+ length: 586
+ content_offset: 0
+ content_length: 3
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 8:
+ nobjects: 3
+ length: 594
+ content_offset: 0
+ content_length: 11
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 9:
+ nobjects: 3
+ length: 587
+ content_offset: 0
+ content_length: 4
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 10:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 11:
+ nobjects: 3
+ length: 591
+ content_offset: 0
+ content_length: 8
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 12:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 13:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 14:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 15:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 16:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 17:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 18:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 19:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 20:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 21:
+ nobjects: 3
+ length: 591
+ content_offset: 0
+ content_length: 8
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 22:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 23:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 24:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 25:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 26:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 27:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 28:
+ nobjects: 3
+ length: 593
+ content_offset: 0
+ content_length: 10
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+Page 29:
+ nobjects: 3
+ length: 592
+ content_offset: 0
+ content_length: 9
+ nshared_objects: 4
+ identifier 0: 2
+ numerator 0: 0
+ identifier 1: 3
+ numerator 1: 0
+ identifier 2: 5
+ numerator 2: 0
+ identifier 3: 6
+ numerator 3: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 0
+first_shared_offset: 0
+nshared_first_page: 7
+nshared_total: 7
+nbits_nobjects: 0
+min_group_length: 35
+nbits_delta_group_length: 10
+Shared Object 0:
+ group length: 214
+Shared Object 1:
+ group length: 134
+Shared Object 2:
+ group length: 118
+Shared Object 3:
+ group length: 35
+Shared Object 4:
+ group length: 249
+Shared Object 5:
+ group length: 56
+Shared Object 6:
+ group length: 581
+
+Outlines Hint Table
+
+first_object: 89
+first_object_offset: 20067
+nobjects: 12
+group_length: 2069
diff --git a/qpdf/qtest/qpdf/lin8.pdf b/qpdf/qtest/qpdf/lin8.pdf
new file mode 100644
index 00000000..388a21a2
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin8.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/lin9.out b/qpdf/qtest/qpdf/lin9.out
new file mode 100644
index 00000000..6fde8441
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin9.out
@@ -0,0 +1,104 @@
+WARNING: page 0 has shared identifier entries
+WARNING: page 0: shared object 19: in hint table but not computed list
+lin9.pdf: linearization data:
+
+file_size: 3316
+first_page_object: 19
+first_page_end: 1323
+npages: 5
+xref_zero_offset: 2849
+first_page: 0
+H_offset: 713
+H_length: 162
+
+Page Offsets Hint Table
+
+min_nobjects: 2
+first_page_offset: 875
+nbits_delta_nobjects: 2
+min_page_length: 221
+nbits_delta_page_length: 8
+min_content_offset: 0
+nbits_delta_content_offset: 0
+min_content_length: 0
+nbits_delta_content_length: 8
+nbits_nshared_objects: 2
+nbits_shared_identifier: 3
+nbits_shared_numerator: 4
+shared_denominator: 8
+Page 0:
+ nobjects: 5
+ length: 448
+ content_offset: 0
+ content_length: 227
+ nshared_objects: 1
+ identifier 0: 0
+ numerator 0: 0
+Page 1:
+ nobjects: 2
+ length: 221
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 3
+ identifier 0: 5
+ numerator 0: 0
+ identifier 1: 6
+ numerator 1: 0
+ identifier 2: 4
+ numerator 2: 0
+Page 2:
+ nobjects: 2
+ length: 234
+ content_offset: 0
+ content_length: 13
+ nshared_objects: 3
+ identifier 0: 5
+ numerator 0: 0
+ identifier 1: 6
+ numerator 1: 0
+ identifier 2: 4
+ numerator 2: 0
+Page 3:
+ nobjects: 3
+ length: 375
+ content_offset: 0
+ content_length: 154
+ nshared_objects: 1
+ identifier 0: 4
+ numerator 0: 0
+Page 4:
+ nobjects: 2
+ length: 221
+ content_offset: 0
+ content_length: 0
+ nshared_objects: 3
+ identifier 0: 5
+ numerator 0: 0
+ identifier 1: 6
+ numerator 1: 0
+ identifier 2: 4
+ numerator 2: 0
+
+Shared Objects Hint Table
+
+first_shared_obj: 10
+first_shared_offset: 2374
+nshared_first_page: 5
+nshared_total: 7
+nbits_nobjects: 0
+min_group_length: 34
+nbits_delta_group_length: 7
+Shared Object 0:
+ group length: 119
+Shared Object 1:
+ group length: 105
+Shared Object 2:
+ group length: 67
+Shared Object 3:
+ group length: 123
+Shared Object 4:
+ group length: 34
+Shared Object 5:
+ group length: 67
+Shared Object 6:
+ group length: 117
diff --git a/qpdf/qtest/qpdf/lin9.pdf b/qpdf/qtest/qpdf/lin9.pdf
new file mode 100644
index 00000000..40e76929
--- /dev/null
+++ b/qpdf/qtest/qpdf/lin9.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/misc-1.out b/qpdf/qtest/qpdf/misc-1.out
new file mode 100644
index 00000000..3cba139e
--- /dev/null
+++ b/qpdf/qtest/qpdf/misc-1.out
@@ -0,0 +1,15 @@
+page 1:
+ images:
+ /Im1: 5100 x 6600
+ content:
+ 5 0 R
+end page 1
+page 2:
+ images:
+ /Im2: 5100 x 6600
+ /Im3: 305 x 305
+ /Im4: 305 x 305
+ content:
+ 11 0 R
+end page 2
+test 5 done
diff --git a/qpdf/qtest/qpdf/misc-1.pdf b/qpdf/qtest/qpdf/misc-1.pdf
new file mode 100644
index 00000000..dec1d707
--- /dev/null
+++ b/qpdf/qtest/qpdf/misc-1.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/misc-2.out b/qpdf/qtest/qpdf/misc-2.out
new file mode 100644
index 00000000..139d64cc
--- /dev/null
+++ b/qpdf/qtest/qpdf/misc-2.out
@@ -0,0 +1,26 @@
+page 1:
+ images:
+ /Im1: 5100 x 6600
+ content:
+ 5 0 R
+end page 1
+page 2:
+ images:
+ /Im2: 5100 x 6600
+ /Im3: 305 x 305
+ content:
+ 10 0 R
+end page 2
+page 3:
+ images:
+ /Im4: 5100 x 6600
+ content:
+ 14 0 R
+end page 3
+page 4:
+ images:
+ /Im5: 5100 x 6600
+ content:
+ 18 0 R
+end page 4
+test 5 done
diff --git a/qpdf/qtest/qpdf/misc-2.pdf b/qpdf/qtest/qpdf/misc-2.pdf
new file mode 100644
index 00000000..a7a3a93c
--- /dev/null
+++ b/qpdf/qtest/qpdf/misc-2.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/misc-3.out b/qpdf/qtest/qpdf/misc-3.out
new file mode 100644
index 00000000..f9c89df2
--- /dev/null
+++ b/qpdf/qtest/qpdf/misc-3.out
@@ -0,0 +1,14 @@
+page 1:
+ images:
+ content:
+ 4 0 R
+ 6 0 R
+end page 1
+QStrings:
+No Special Characters
+These: ¿÷¢þ and no more
+πωτατω
+QNumbers:
+1.000
+3.142
+test 5 done
diff --git a/qpdf/qtest/qpdf/misc-3.pdf b/qpdf/qtest/qpdf/misc-3.pdf
new file mode 100644
index 00000000..6b9aa3c7
--- /dev/null
+++ b/qpdf/qtest/qpdf/misc-3.pdf
@@ -0,0 +1,127 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /QNumbers [
+ 1
+ 3.14159
+ ]
+ /QStrings [
+ (No Special Characters)
+ (These: ¿÷¢þ and no more)
+ <feff03c003c903c403b103c403c9>
+ ]
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents [
+ 4 0 R
+ 6 0 R
+ ]
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 8 0 R
+ >>
+ /ProcSet 9 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+%% Contents for page 1
+6 0 obj
+<<
+ /Length 7 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 696 Td
+ (Salad) Tj
+ET
+endstream
+endobj
+
+7 0 obj
+43
+endobj
+
+8 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+9 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 10
+0000000000 65535 f
+0000000025 00000 n
+0000000226 00000 n
+0000000308 00000 n
+0000000543 00000 n
+0000000642 00000 n
+0000000684 00000 n
+0000000782 00000 n
+0000000801 00000 n
+0000000919 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 10
+ /ID [<e017d8dc1fe53a81e40aa79bcb43fdec><76269ee0b6579446b731e060af8ef436>]
+>>
+startxref
+954
+%%EOF
diff --git a/qpdf/qtest/qpdf/multiple-mods.pdf b/qpdf/qtest/qpdf/multiple-mods.pdf
new file mode 100755
index 00000000..6370cd65
--- /dev/null
+++ b/qpdf/qtest/qpdf/multiple-mods.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/object-stream.1.check b/qpdf/qtest/qpdf/object-stream.1.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.1.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.10.check b/qpdf/qtest/qpdf/object-stream.10.check
new file mode 100644
index 00000000..0e0ed996
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.10.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.11.check b/qpdf/qtest/qpdf/object-stream.11.check
new file mode 100644
index 00000000..327d847a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.11.check
@@ -0,0 +1,5 @@
+checking a.pdf
+P = -4
+User password =
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.12.check b/qpdf/qtest/qpdf/object-stream.12.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.12.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.2.check b/qpdf/qtest/qpdf/object-stream.2.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.2.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.3.check b/qpdf/qtest/qpdf/object-stream.3.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.3.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.4.check b/qpdf/qtest/qpdf/object-stream.4.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.4.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.5.check b/qpdf/qtest/qpdf/object-stream.5.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.5.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.6.check b/qpdf/qtest/qpdf/object-stream.6.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.6.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.7.check b/qpdf/qtest/qpdf/object-stream.7.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.7.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.8.check b/qpdf/qtest/qpdf/object-stream.8.check
new file mode 100644
index 00000000..7284dd2a
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.8.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is not linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.9.check b/qpdf/qtest/qpdf/object-stream.9.check
new file mode 100644
index 00000000..37ea00cf
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.9.check
@@ -0,0 +1,4 @@
+checking a.pdf
+File is not encrypted
+File is linearized
+No errors found
diff --git a/qpdf/qtest/qpdf/object-stream.disable.exp b/qpdf/qtest/qpdf/object-stream.disable.exp
new file mode 100644
index 00000000..3b5e10fb
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.disable.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/object-stream.generate.exp b/qpdf/qtest/qpdf/object-stream.generate.exp
new file mode 100644
index 00000000..3f86a173
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.generate.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/object-stream.pdf b/qpdf/qtest/qpdf/object-stream.pdf
new file mode 100644
index 00000000..1a468202
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/object-stream.preserve.exp b/qpdf/qtest/qpdf/object-stream.preserve.exp
new file mode 100644
index 00000000..3f86a173
--- /dev/null
+++ b/qpdf/qtest/qpdf/object-stream.preserve.exp
Binary files differ
diff --git a/qpdf/qtest/qpdf/old-and-complex.pdf b/qpdf/qtest/qpdf/old-and-complex.pdf
new file mode 100644
index 00000000..74b8c255
--- /dev/null
+++ b/qpdf/qtest/qpdf/old-and-complex.pdf
Binary files differ
diff --git a/qpdf/qtest/qpdf/p1-a-p2-a.pdf b/qpdf/qtest/qpdf/p1-a-p2-a.pdf
new file mode 100644
index 00000000..b8256cba
--- /dev/null
+++ b/qpdf/qtest/qpdf/p1-a-p2-a.pdf
@@ -0,0 +1,138 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 2
+ /Kids [
+ 3 0 R
+ 4 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 5 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 7 0 R
+ >>
+ /ProcSet 8 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+4 0 obj
+<<
+ /Contents 9 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 7 0 R
+ >>
+ /ProcSet 8 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+5 0 obj
+<<
+ /Length 6 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (A) Tj
+ET
+endstream
+endobj
+
+6 0 obj
+39
+endobj
+
+7 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+8 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+9 0 obj
+<<
+ /Length 10 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (A) Tj
+ET
+endstream
+endobj
+
+10 0 obj
+39
+endobj
+
+xref
+0 11
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000171 00000 n
+0000000373 00000 n
+0000000588 00000 n
+0000000682 00000 n
+0000000701 00000 n
+0000000819 00000 n
+0000000877 00000 n
+0000000972 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 11
+ /ID [<36b07232d7657658c548006151d4c57c><6de1f48ca16def200b3b655a24fa1b48>]
+>>
+startxref
+992
+%%EOF
diff --git a/qpdf/qtest/qpdf/p1-a-p2-b.pdf b/qpdf/qtest/qpdf/p1-a-p2-b.pdf
new file mode 100644
index 00000000..4e05d88a
--- /dev/null
+++ b/qpdf/qtest/qpdf/p1-a-p2-b.pdf
@@ -0,0 +1,138 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 2
+ /Kids [
+ 3 0 R
+ 4 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 5 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 7 0 R
+ >>
+ /ProcSet 8 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Page 2
+4 0 obj
+<<
+ /Contents 9 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 7 0 R
+ >>
+ /ProcSet 8 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+5 0 obj
+<<
+ /Length 6 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (A) Tj
+ET
+endstream
+endobj
+
+6 0 obj
+39
+endobj
+
+7 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+8 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+%% Contents for page 2
+9 0 obj
+<<
+ /Length 10 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (B) Tj
+ET
+endstream
+endobj
+
+10 0 obj
+39
+endobj
+
+xref
+0 11
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000171 00000 n
+0000000373 00000 n
+0000000588 00000 n
+0000000682 00000 n
+0000000701 00000 n
+0000000819 00000 n
+0000000877 00000 n
+0000000972 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 11
+ /ID [<36b07232d7657658c548006151d4c57c><6de1f48ca16def200b3b655a24fa1b48>]
+>>
+startxref
+992
+%%EOF
diff --git a/qpdf/qtest/qpdf/p1-a.pdf b/qpdf/qtest/qpdf/p1-a.pdf
new file mode 100644
index 00000000..8cb349c5
--- /dev/null
+++ b/qpdf/qtest/qpdf/p1-a.pdf
@@ -0,0 +1,95 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (A) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+39
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000470 00000 n
+0000000489 00000 n
+0000000607 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 8
+ /ID [<36b07232d7657658c548006151d4c57c><36b07232d7657658c548006151d4c57c>]
+>>
+startxref
+642
+%%EOF
diff --git a/qpdf/qtest/qpdf/p1-b.pdf b/qpdf/qtest/qpdf/p1-b.pdf
new file mode 100644
index 00000000..833e8088
--- /dev/null
+++ b/qpdf/qtest/qpdf/p1-b.pdf
@@ -0,0 +1,95 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (B) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+39
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 8
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000470 00000 n
+0000000489 00000 n
+0000000607 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 8
+ /ID [<36b07232d7657658c548006151d4c57c><36b07232d7657658c548006151d4c57c>]
+>>
+startxref
+642
+%%EOF
diff --git a/qpdf/qtest/qpdf/show-page-1-content-filtered.out b/qpdf/qtest/qpdf/show-page-1-content-filtered.out
new file mode 100644
index 00000000..633a5c1f
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-page-1-content-filtered.out
@@ -0,0 +1 @@
+q 222 0 0 240 28.5 96 cm /Im1 Do Q q 185 0 0 200 313.5 296 cm /Im2 Do Q \ No newline at end of file
diff --git a/qpdf/qtest/qpdf/show-page-1-content-normalized.out b/qpdf/qtest/qpdf/show-page-1-content-normalized.out
new file mode 100644
index 00000000..32c115c8
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-page-1-content-normalized.out
@@ -0,0 +1,8 @@
+q
+222 0 0 240 28.5 96 cm
+/Im1 Do
+Q
+q
+185 0 0 200 313.5 296 cm
+/Im2 Do
+Q
diff --git a/qpdf/qtest/qpdf/show-page-1-content-raw.out b/qpdf/qtest/qpdf/show-page-1-content-raw.out
new file mode 100644
index 00000000..22440b51
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-page-1-content-raw.out
Binary files differ
diff --git a/qpdf/qtest/qpdf/show-page-1-image.out b/qpdf/qtest/qpdf/show-page-1-image.out
new file mode 100644
index 00000000..c2a3483f
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-page-1-image.out
Binary files differ
diff --git a/qpdf/qtest/qpdf/show-page-1.out b/qpdf/qtest/qpdf/show-page-1.out
new file mode 100644
index 00000000..f12237c4
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-page-1.out
@@ -0,0 +1 @@
+<< /Contents 7 0 R /MediaBox [ 0 0 612 792 ] /Parent 4 0 R /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /Im1 8 0 R /Im2 9 0 R >> >> /Type /Page >>
diff --git a/qpdf/qtest/qpdf/show-pages-images.out b/qpdf/qtest/qpdf/show-pages-images.out
new file mode 100644
index 00000000..6d54e9fd
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-pages-images.out
@@ -0,0 +1,11 @@
+page 1: 5 0 R
+ images:
+ /Im1: 8 0 R, 555 x 600
+ /Im2: 9 0 R, 185 x 200
+ content:
+ 7 0 R
+page 2: 6 0 R
+ images:
+ /Im2: 9 0 R, 185 x 200
+ content:
+ 10 0 R
diff --git a/qpdf/qtest/qpdf/show-pages.out b/qpdf/qtest/qpdf/show-pages.out
new file mode 100644
index 00000000..01e0ea0a
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-pages.out
@@ -0,0 +1,6 @@
+page 1: 5 0 R
+ content:
+ 7 0 R
+page 2: 6 0 R
+ content:
+ 10 0 R
diff --git a/qpdf/qtest/qpdf/show-unfilterable.out b/qpdf/qtest/qpdf/show-unfilterable.out
new file mode 100644
index 00000000..464ca2c3
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-unfilterable.out
@@ -0,0 +1 @@
+Unable to filter stream data.
diff --git a/qpdf/qtest/qpdf/show-xref-by-id-filtered.out b/qpdf/qtest/qpdf/show-xref-by-id-filtered.out
new file mode 100644
index 00000000..3ecf4ed4
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-xref-by-id-filtered.out
Binary files differ
diff --git a/qpdf/qtest/qpdf/show-xref-by-id.out b/qpdf/qtest/qpdf/show-xref-by-id.out
new file mode 100644
index 00000000..62faf0ce
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-xref-by-id.out
@@ -0,0 +1,2 @@
+Object is stream. Dictionary:
+<< /DecodeParms << /Columns 4 /Predictor 12 >> /Encrypt 11 0 R /Filter /FlateDecode /ID [ (ª&\237þÂ\226±?>ø5ª¡:\n\b) (ím\023\021OµUt\bµ\026Ê9'\025\033) ] /Info 3 0 R /Length 52 /Root 1 0 R /Size 13 /Type /XRef /W [ 1 2 1 ] >>
diff --git a/qpdf/qtest/qpdf/show-xref.out b/qpdf/qtest/qpdf/show-xref.out
new file mode 100644
index 00000000..a0bb72d9
--- /dev/null
+++ b/qpdf/qtest/qpdf/show-xref.out
@@ -0,0 +1,12 @@
+1/0: uncompressed; offset = 15
+2/0: uncompressed; offset = 64
+3/0: compressed; stream = 2, index = 0
+4/0: compressed; stream = 2, index = 1
+5/0: compressed; stream = 2, index = 2
+6/0: compressed; stream = 2, index = 3
+7/0: uncompressed; offset = 390
+8/0: uncompressed; offset = 521
+9/0: uncompressed; offset = 39802
+10/0: uncompressed; offset = 49559
+11/0: uncompressed; offset = 49672
+12/0: uncompressed; offset = 49880
diff --git a/qpdf/qtest/qpdf/test4-1.pdf b/qpdf/qtest/qpdf/test4-1.pdf
new file mode 100644
index 00000000..9f4f980b
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-1.pdf
@@ -0,0 +1,126 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+8 0 obj
+<<
+ /Title 9 0 R
+ /Subject 10 0 R
+ /A 11 0 R
+ /B 12 0 R
+>>
+endobj
+
+9 0 obj
+(Some Title Is Here)
+endobj
+
+10 0 obj
+(Subject)
+endobj
+
+11 0 obj
+[ 1 2 3 ]
+endobj
+
+12 0 obj
+<< /A 11 0 R /B (B) >>
+endobj
+
+xref
+0 13
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+0000000647 00000 n
+0000000726 00000 n
+0000000763 00000 n
+0000000790 00000 n
+0000000817 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 13
+ /QTest 8 0 R
+ /ID [<c61bd35bada064f61e0a56aa9588064e><c61bd35bada064f61e0a56aa9588064e>]
+>>
+startxref
+857
+%%EOF
diff --git a/qpdf/qtest/qpdf/test4-1.qdf b/qpdf/qtest/qpdf/test4-1.qdf
new file mode 100644
index 00000000..98f93d0f
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-1.qdf
@@ -0,0 +1,145 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 4 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /A [
+ 1
+ 5
+ 3
+ ]
+ /Author (Mr. Potato Head)
+ /B <<
+ /A [
+ 1
+ 2
+ 3
+ ]
+ /B (B)
+ >>
+ /Title (Some Title Is Here)
+>>
+endobj
+
+3 0 obj
+<<
+ /A 5 0 R
+ /B 6 0 R
+ /Subject (Subject)
+ /Title (Some Title Is Here)
+>>
+endobj
+
+4 0 obj
+<<
+ /Count 1
+ /Kids [
+ 7 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+5 0 obj
+[
+ 1
+ 2
+ 3
+]
+endobj
+
+6 0 obj
+<<
+ /A 5 0 R
+ /B (B)
+>>
+endobj
+
+%% Page 1
+7 0 obj
+<<
+ /Contents 8 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 4 0 R
+ /Resources <<
+ /Font <<
+ /F1 10 0 R
+ >>
+ /ProcSet 11 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+8 0 obj
+<<
+ /Length 9 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+9 0 obj
+44
+endobj
+
+10 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+11 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 12
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000251 00000 n
+0000000346 00000 n
+0000000418 00000 n
+0000000450 00000 n
+0000000502 00000 n
+0000000719 00000 n
+0000000818 00000 n
+0000000837 00000 n
+0000000956 00000 n
+trailer <<
+ /Info 2 0 R
+ /QTest 3 0 R
+ /Root 1 0 R
+ /Size 12
+ /ID [<c61bd35bada064f61e0a56aa9588064e><31415926535897932384626433832795>]
+>>
+startxref
+992
+%%EOF
diff --git a/qpdf/qtest/qpdf/test4-2.out b/qpdf/qtest/qpdf/test4-2.out
new file mode 100644
index 00000000..e5e51762
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-2.out
@@ -0,0 +1 @@
+attempt to make a stream into a direct object
diff --git a/qpdf/qtest/qpdf/test4-2.pdf b/qpdf/qtest/qpdf/test4-2.pdf
new file mode 100644
index 00000000..0acf592c
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-2.pdf
@@ -0,0 +1,104 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+8 0 obj
+<<
+ % stream
+ /A 4 0 R
+>>
+endobj
+
+xref
+0 9
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+0000000647 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 9
+ /QTest 8 0 R
+ /ID [<c61bd35bada064f61e0a56aa9588064e><c61bd35bada064f61e0a56aa9588064e>]
+>>
+startxref
+691
+%%EOF
diff --git a/qpdf/qtest/qpdf/test4-3.out b/qpdf/qtest/qpdf/test4-3.out
new file mode 100644
index 00000000..b0deab16
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-3.out
@@ -0,0 +1 @@
+loop detected while converting object from indirect to direct
diff --git a/qpdf/qtest/qpdf/test4-3.pdf b/qpdf/qtest/qpdf/test4-3.pdf
new file mode 100644
index 00000000..6e212619
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-3.pdf
@@ -0,0 +1,109 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+8 0 obj
+<<
+ % loop
+ /A [ 1 2 9 0 R ]
+>>
+endobj
+
+9 0 obj
+[ 4 5 8 0 R ]
+endobj
+
+xref
+0 10
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+0000000647 00000 n
+0000000699 00000 n
+trailer <<
+ /Root 1 0 R
+ /Size 10
+ /QTest 8 0 R
+ /ID [<c61bd35bada064f61e0a56aa9588064e><c61bd35bada064f61e0a56aa9588064e>]
+>>
+startxref
+730
+%%EOF
diff --git a/qpdf/qtest/qpdf/test4-4.pdf b/qpdf/qtest/qpdf/test4-4.pdf
new file mode 100644
index 00000000..e0856e3b
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-4.pdf
@@ -0,0 +1,123 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 3 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /A 4 0 R
+ /B 5 0 R
+ /Subject (Subject)
+ /Title (Some Title Is Here)
+>>
+endobj
+
+3 0 obj
+<<
+ /Count 1
+ /Kids [
+ 6 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+4 0 obj
+[
+ 1
+ 2
+ 3
+]
+endobj
+
+5 0 obj
+<<
+ /A 4 0 R
+ /B (B)
+>>
+endobj
+
+%% Page 1
+6 0 obj
+<<
+ /Contents 7 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 3 0 R
+ /Resources <<
+ /Font <<
+ /F1 9 0 R
+ >>
+ /ProcSet 10 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+7 0 obj
+<<
+ /Length 8 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+8 0 obj
+44
+endobj
+
+9 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+10 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 11
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000174 00000 n
+0000000246 00000 n
+0000000278 00000 n
+0000000330 00000 n
+0000000546 00000 n
+0000000645 00000 n
+0000000664 00000 n
+0000000782 00000 n
+trailer <<
+ /QTest 2 0 R
+ /Root 1 0 R
+ /Size 11
+ /ID [<c61bd35bada064f61e0a56aa9588064e><c893e7330be149468080ad6518819868>]
+>>
+startxref
+818
+%%EOF
diff --git a/qpdf/qtest/qpdf/test4-4.qdf b/qpdf/qtest/qpdf/test4-4.qdf
new file mode 100644
index 00000000..98f93d0f
--- /dev/null
+++ b/qpdf/qtest/qpdf/test4-4.qdf
@@ -0,0 +1,145 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 4 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /A [
+ 1
+ 5
+ 3
+ ]
+ /Author (Mr. Potato Head)
+ /B <<
+ /A [
+ 1
+ 2
+ 3
+ ]
+ /B (B)
+ >>
+ /Title (Some Title Is Here)
+>>
+endobj
+
+3 0 obj
+<<
+ /A 5 0 R
+ /B 6 0 R
+ /Subject (Subject)
+ /Title (Some Title Is Here)
+>>
+endobj
+
+4 0 obj
+<<
+ /Count 1
+ /Kids [
+ 7 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+5 0 obj
+[
+ 1
+ 2
+ 3
+]
+endobj
+
+6 0 obj
+<<
+ /A 5 0 R
+ /B (B)
+>>
+endobj
+
+%% Page 1
+7 0 obj
+<<
+ /Contents 8 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 4 0 R
+ /Resources <<
+ /Font <<
+ /F1 10 0 R
+ >>
+ /ProcSet 11 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+8 0 obj
+<<
+ /Length 9 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+9 0 obj
+44
+endobj
+
+10 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+11 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+xref
+0 12
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000251 00000 n
+0000000346 00000 n
+0000000418 00000 n
+0000000450 00000 n
+0000000502 00000 n
+0000000719 00000 n
+0000000818 00000 n
+0000000837 00000 n
+0000000956 00000 n
+trailer <<
+ /Info 2 0 R
+ /QTest 3 0 R
+ /Root 1 0 R
+ /Size 12
+ /ID [<c61bd35bada064f61e0a56aa9588064e><31415926535897932384626433832795>]
+>>
+startxref
+992
+%%EOF
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
new file mode 100644
index 00000000..7333cc69
--- /dev/null
+++ b/qpdf/test_driver.cc
@@ -0,0 +1,323 @@
+// This program tests miscellaneous functionality in the qpdf library
+// that we don't want to pollute the qpdf program with.
+
+#include <qpdf/QPDF.hh>
+
+#include <qpdf/QUtil.hh>
+#include <qpdf/QTC.hh>
+#include <qpdf/Pl_StdioFile.hh>
+#include <qpdf/QPDFWriter.hh>
+#include <iostream>
+#include <string.h>
+#include <map>
+
+static char const* whoami = 0;
+
+void usage()
+{
+ std::cerr << "Usage: " << whoami << " n filename" << std::endl;
+ exit(2);
+}
+
+void runtest(int n, char const* filename)
+{
+ QPDF pdf;
+ if (n == 0)
+ {
+ pdf.setAttemptRecovery(false);
+ }
+ pdf.processFile(filename);
+
+ if ((n == 0) || (n == 1))
+ {
+ QPDFObjectHandle trailer = pdf.getTrailer();
+ QPDFObjectHandle qtest = trailer.getKey("/QTest");
+
+ if (! trailer.hasKey("/QTest"))
+ {
+ // This will always happen when /QTest is null because
+ // hasKey returns false for null keys regardless of
+ // whether the key exists or not. That way there's never
+ // any difference between a key that is present and null
+ // and a key that is absent.
+ QTC::TC("qpdf", "main QTest implicit");
+ std::cout << "/QTest is implicit" << std::endl;
+ }
+
+ QTC::TC("qpdf", "main QTest indirect",
+ qtest.isIndirect() ? 1 : 0);
+ std::cout << "/QTest is "
+ << (qtest.isIndirect() ? "in" : "")
+ << "direct" << std::endl;
+
+ if (qtest.isNull())
+ {
+ QTC::TC("qpdf", "main QTest null");
+ std::cout << "/QTest is null" << std::endl;
+ }
+ else if (qtest.isBool())
+ {
+ QTC::TC("qpdf", "main QTest bool",
+ qtest.getBoolValue() ? 1 : 0);
+ std::cout << "/QTest is Boolean with value "
+ << (qtest.getBoolValue() ? "true" : "false")
+ << std::endl;
+ }
+ else if (qtest.isInteger())
+ {
+ QTC::TC("qpdf", "main QTest int");
+ std::cout << "/QTest is an integer with value "
+ << qtest.getIntValue() << std::endl;
+ }
+ else if (qtest.isReal())
+ {
+ QTC::TC("qpdf", "main QTest real");
+ std::cout << "/QTest is a real number with value "
+ << qtest.getRealValue() << std::endl;
+ }
+ else if (qtest.isName())
+ {
+ QTC::TC("qpdf", "main QTest name");
+ std::cout << "/QTest is a name with value "
+ << qtest.getName() << std::endl;
+ }
+ else if (qtest.isString())
+ {
+ QTC::TC("qpdf", "main QTest string");
+ std::cout << "/QTest is a string with value "
+ << qtest.getStringValue() << std::endl;
+ }
+ else if (qtest.isArray())
+ {
+ QTC::TC("qpdf", "main QTest array");
+ int n = qtest.getArrayNItems();
+ std::cout << "/QTest is an array with "
+ << n << " items" << std::endl;
+ for (int i = 0; i < n; ++i)
+ {
+ QTC::TC("qpdf", "main QTest array indirect",
+ qtest.getArrayItem(i).isIndirect() ? 1 : 0);
+ std::cout << " item " << i << " is "
+ << (qtest.getArrayItem(i).isIndirect() ? "in" : "")
+ << "direct" << std::endl;
+ }
+ }
+ else if (qtest.isDictionary())
+ {
+ QTC::TC("qpdf", "main QTest dictionary");
+ std::cout << "/QTest is a dictionary" << std::endl;
+ std::set<std::string> keys = qtest.getKeys();
+ for (std::set<std::string>::iterator iter = keys.begin();
+ iter != keys.end(); ++iter)
+ {
+ QTC::TC("qpdf", "main QTest dictionary indirect",
+ (qtest.getKey(*iter).isIndirect() ? 1 : 0));
+ std::cout << " " << *iter << " is "
+ << (qtest.getKey(*iter).isIndirect() ? "in" : "")
+ << "direct" << std::endl;
+ }
+ }
+ else if (qtest.isStream())
+ {
+ QTC::TC("qpdf", "main QTest stream");
+ std::cout << "/QTest is a stream. Dictionary: "
+ << qtest.getDict().unparse() << std::endl;
+
+ std::cout << "Raw stream data:" << std::endl;
+ std::cout.flush();
+ PointerHolder<Pl_StdioFile> out = new Pl_StdioFile("raw", stdout);
+ qtest.pipeStreamData(out.getPointer(), false, false, false);
+
+ std::cout << std::endl << "Uncompressed stream data:" << std::endl;
+ if (qtest.pipeStreamData(0, true, false, false))
+ {
+ std::cout.flush();
+ out = new Pl_StdioFile("filtered", stdout);
+ qtest.pipeStreamData(out.getPointer(), true, false, false);
+ std::cout << std::endl << "End of stream data" << std::endl;
+ }
+ else
+ {
+ std::cout << "Stream data is not filterable." << std::endl;
+ }
+ }
+ else
+ {
+ // Should not happen!
+ std::cout << "/QTest is an unknown object" << std::endl;
+ }
+
+ std::cout << "unparse: " << qtest.unparse() << std::endl
+ << "unparseResolved: " << qtest.unparseResolved()
+ << std::endl;
+ }
+ else if (n == 2)
+ {
+ // Encrypted file. This test case is designed for a specific
+ // PDF file.
+
+ QPDFObjectHandle trailer = pdf.getTrailer();
+ std::cout << trailer.getKey("/Info").
+ getKey("/CreationDate").getStringValue() << std::endl;
+ std::cout << trailer.getKey("/Info").
+ getKey("/Producer").getStringValue() << std::endl;
+
+ QPDFObjectHandle encrypt = trailer.getKey("/Encrypt");
+ std::cout << encrypt.getKey("/O").unparse() << std::endl;
+ std::cout << encrypt.getKey("/U").unparse() << std::endl;
+
+ QPDFObjectHandle root = pdf.getRoot();
+ QPDFObjectHandle pages = root.getKey("/Pages");
+ QPDFObjectHandle kids = pages.getKey("/Kids");
+ QPDFObjectHandle page = kids.getArrayItem(1); // second page
+ QPDFObjectHandle contents = page.getKey("/Contents");
+ PointerHolder<Pl_StdioFile> out = new Pl_StdioFile("filtered", stdout);
+ contents.pipeStreamData(out.getPointer(), true, false, false);
+ }
+ else if (n == 3)
+ {
+ QPDFObjectHandle streams = pdf.getTrailer().getKey("/QStreams");
+ for (int i = 0; i < streams.getArrayNItems(); ++i)
+ {
+ QPDFObjectHandle stream = streams.getArrayItem(i);
+ std::cout << "-- stream " << i << " --" << std::endl;
+ std::cout.flush();
+ PointerHolder<Pl_StdioFile> out =
+ new Pl_StdioFile("tokenized stream", stdout);
+ stream.pipeStreamData(out.getPointer(), true, true, false);
+ }
+ }
+ else if (n == 4)
+ {
+ // Mutability testing: Make /QTest direct recursively, then
+ // copy to /Info. Also make some other mutations so we can
+ // tell the difference and ensure that the original /QTest
+ // isn't effected.
+ QPDFObjectHandle trailer = pdf.getTrailer();
+ QPDFObjectHandle qtest = trailer.getKey("/QTest");
+ qtest.makeDirect();
+ qtest.removeKey("/Subject");
+ qtest.replaceKey("/Author",
+ QPDFObjectHandle::newString("Mr. Potato Head"));
+ // qtest.A and qtest.B.A were originally the same object.
+ // They no longer are after makeDirect(). Mutate one of them
+ // and ensure the other is not changed.
+ qtest.getKey("/A").setArrayItem(1, QPDFObjectHandle::newInteger(5));
+ trailer.replaceKey("/Info", pdf.makeIndirectObject(qtest));
+ QPDFWriter w(pdf, 0);
+ w.setQDFMode(true);
+ w.setStaticID(true);
+ w.write();
+
+ // Prevent "done" message from getting appended
+ exit(0);
+ }
+ else if (n == 5)
+ {
+ std::vector<QPDFObjectHandle> pages = pdf.getAllPages();
+ int pageno = 0;
+ for (std::vector<QPDFObjectHandle>::iterator iter = pages.begin();
+ iter != pages.end(); ++iter)
+ {
+ QPDFObjectHandle& page = *iter;
+ ++pageno;
+
+ std::cout << "page " << pageno << ":" << std::endl;
+
+ std::cout << " images:" << std::endl;
+ std::map<std::string, QPDFObjectHandle> images =
+ page.getPageImages();
+ for (std::map<std::string, QPDFObjectHandle>::iterator iter =
+ images.begin(); iter != images.end(); ++iter)
+ {
+ std::string const& name = (*iter).first;
+ QPDFObjectHandle image = (*iter).second;
+ QPDFObjectHandle dict = image.getDict();
+ int width = dict.getKey("/Width").getIntValue();
+ int height = dict.getKey("/Height").getIntValue();
+ std::cout << " " << name
+ << ": " << width << " x " << height
+ << std::endl;
+ }
+
+ std::cout << " content:" << std::endl;
+ std::vector<QPDFObjectHandle> content = page.getPageContents();
+ for (std::vector<QPDFObjectHandle>::iterator iter = content.begin();
+ iter != content.end(); ++iter)
+ {
+ std::cout << " " << (*iter).unparse() << std::endl;
+ }
+
+ std::cout << "end page " << pageno << std::endl;
+ }
+
+ QPDFObjectHandle root = pdf.getRoot();
+ QPDFObjectHandle qstrings = root.getKey("/QStrings");
+ if (qstrings.isArray())
+ {
+ std::cout << "QStrings:" << std::endl;
+ int n = qstrings.getArrayNItems();
+ for (int i = 0; i < n; ++i)
+ {
+ std::cout << qstrings.getArrayItem(i).getUTF8Value()
+ << std::endl;
+ }
+ }
+
+ QPDFObjectHandle qnumbers = root.getKey("/QNumbers");
+ if (qnumbers.isArray())
+ {
+ std::cout << "QNumbers:" << std::endl;
+ int n = qnumbers.getArrayNItems();
+ for (int i = 0; i < n; ++i)
+ {
+ std::cout << QUtil::double_to_string(
+ qnumbers.getArrayItem(i).getNumericValue(), 3)
+ << std::endl;
+ }
+ }
+ }
+ else
+ {
+ throw QEXC::General(std::string("invalid test ") +
+ QUtil::int_to_string(n));
+ }
+
+ std::cout << "test " << n << " done" << std::endl;
+}
+
+int main(int argc, char* argv[])
+{
+ if ((whoami = strrchr(argv[0], '/')) == NULL)
+ {
+ whoami = argv[0];
+ }
+ else
+ {
+ ++whoami;
+ }
+ // For libtool's sake....
+ if (strncmp(whoami, "lt-", 3) == 0)
+ {
+ whoami += 3;
+ }
+
+ if (argc != 3)
+ {
+ usage();
+ }
+
+ try
+ {
+ int n = atoi(argv[1]);
+ char const* filename = argv[2];
+ runtest(n, filename);
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ exit(2);
+ }
+
+ return 0;
+}