From 9a0b88bf7777c153dc46ace22db74ef24d51583a Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Tue, 29 Apr 2008 12:55:25 +0000 Subject: [PATCH] update release date to actual date git-svn-id: svn+q:///qpdf/trunk@599 71b93d88-0707-0410-a8cf-f5a4172ac649 --- Artistic-2.0 | 191 + ChangeLog | 3 + INSTALL | 216 + Makefile | 144 + README | 32 + README.maintainer | 69 + TODO | 68 + aclocal.m4 | 6672 ++++++++++++++++ autoconf.mk.in | 30 + config.guess | 1526 ++++ config.sub | 1658 ++++ configure.ac | 282 + doc/stylesheet.css | 284 + examples/Makefile | 1 + examples/build.mk | 26 + examples/examples.testcov | 19 + examples/pdf-bookmarks.cc | 262 + examples/pdf-mod-info.cc | 219 + examples/pdf-npages.cc | 61 + examples/qtest/bookmarks.test | 49 + examples/qtest/bookmarks/1.pdf | 1502 ++++ examples/qtest/bookmarks/2.pdf | 79 + examples/qtest/bookmarks/3.pdf | 1 + examples/qtest/bookmarks/4.pdf | Bin 0 -> 11561 bytes examples/qtest/bookmarks/5.pdf | 1573 ++++ examples/qtest/bookmarks/encrypted.out | 11 + .../bookmarks/test.-show-open.-lines.out | 22 + .../bookmarks/test.-show-open.-numbers.out | 11 + examples/qtest/bookmarks/test.-show-open..out | 11 + examples/qtest/bookmarks/test..-lines.out | 22 + examples/qtest/bookmarks/test..-numbers.out | 11 + examples/qtest/bookmarks/test...out | 11 + examples/qtest/mod-info.test | 93 + examples/qtest/mod-info/dump.out | 11 + examples/qtest/mod-info/files/1.qdf | Bin 0 -> 6842 bytes examples/qtest/mod-info/files/2.qdf | 1338 ++++ examples/qtest/mod-info/files/3.qdf | Bin 0 -> 6245 bytes examples/qtest/mod-info/files/4.qdf | Bin 0 -> 6252 bytes examples/qtest/mod-info/files/empty-info.pdf | Bin 0 -> 5802 bytes examples/qtest/mod-info/files/no-info.pdf | Bin 0 -> 5790 bytes examples/qtest/mod-info/files/source1.pdf | Bin 0 -> 5932 bytes examples/qtest/mod-info/files/source2.pdf | Bin 0 -> 157418 bytes examples/qtest/mod-info/usage.out | 5 + examples/qtest/npages.test | 23 + examples/qtest/npages/bad | 1 + examples/qtest/npages/minimal.pdf | 79 + include/qpdf/Buffer.hh | 32 + include/qpdf/Pipeline.hh | 73 + include/qpdf/Pl_Buffer.hh | 46 + include/qpdf/Pl_Count.hh | 34 + include/qpdf/Pl_Discard.hh | 28 + include/qpdf/Pl_Flate.hh | 53 + include/qpdf/Pl_StdioFile.hh | 49 + include/qpdf/PointerHolder.hh | 170 + include/qpdf/QEXC.hh | 119 + include/qpdf/QPDF.hh | 750 ++ include/qpdf/QPDFExc.hh | 22 + include/qpdf/QPDFObject.hh | 20 + include/qpdf/QPDFObjectHandle.hh | 221 + include/qpdf/QPDFTokenizer.hh | 141 + include/qpdf/QPDFWriter.hh | 243 + include/qpdf/QPDFXRefEntry.hh | 34 + include/qpdf/QTC.hh | 16 + include/qpdf/QUtil.hh | 45 + install-sh | 519 ++ libqpdf/BitStream.cc | 45 + libqpdf/BitWriter.cc | 30 + libqpdf/Buffer.cc | 79 + libqpdf/MD5.cc | 441 ++ libqpdf/Makefile | 1 + libqpdf/PCRE.cc | 365 + libqpdf/Pipeline.cc | 25 + libqpdf/Pl_ASCII85Decoder.cc | 131 + libqpdf/Pl_ASCIIHexDecoder.cc | 108 + libqpdf/Pl_Buffer.cc | 67 + libqpdf/Pl_Count.cc | 42 + libqpdf/Pl_Discard.cc | 23 + libqpdf/Pl_Flate.cc | 198 + libqpdf/Pl_LZWDecoder.cc | 229 + libqpdf/Pl_MD5.cc | 43 + libqpdf/Pl_PNGFilter.cc | 146 + libqpdf/Pl_QPDFTokenizer.cc | 179 + libqpdf/Pl_RC4.cc | 57 + libqpdf/Pl_StdioFile.cc | 48 + libqpdf/QEXC.cc | 67 + libqpdf/QPDF.cc | 1851 +++++ libqpdf/QPDFExc.cc | 20 + libqpdf/QPDFObject.cc | 2 + libqpdf/QPDFObjectHandle.cc | 637 ++ libqpdf/QPDFTokenizer.cc | 458 ++ libqpdf/QPDFWriter.cc | 2021 +++++ libqpdf/QPDFXRefEntry.cc | 61 + libqpdf/QPDF_Array.cc | 51 + libqpdf/QPDF_Bool.cc | 23 + libqpdf/QPDF_Dictionary.cc | 84 + libqpdf/QPDF_Integer.cc | 25 + libqpdf/QPDF_Name.cc | 46 + libqpdf/QPDF_Null.cc | 12 + libqpdf/QPDF_Real.cc | 23 + libqpdf/QPDF_Stream.cc | 309 + libqpdf/QPDF_String.cc | 178 + libqpdf/QPDF_encryption.cc | 441 ++ libqpdf/QPDF_linearization.cc | 2103 +++++ libqpdf/QPDF_optimization.cc | 490 ++ libqpdf/QTC.cc | 46 + libqpdf/QUtil.cc | 198 + libqpdf/RC4.cc | 56 + libqpdf/bits.icc | 149 + libqpdf/build.mk | 73 + libqpdf/qpdf/BitStream.hh | 23 + libqpdf/qpdf/BitWriter.hh | 24 + libqpdf/qpdf/MD5.hh | 73 + libqpdf/qpdf/PCRE.hh | 107 + libqpdf/qpdf/Pl_ASCII85Decoder.hh | 23 + libqpdf/qpdf/Pl_ASCIIHexDecoder.hh | 23 + libqpdf/qpdf/Pl_LZWDecoder.hh | 40 + libqpdf/qpdf/Pl_MD5.hh | 30 + libqpdf/qpdf/Pl_PNGFilter.hh | 62 + libqpdf/qpdf/Pl_QPDFTokenizer.hh | 40 + libqpdf/qpdf/Pl_RC4.hh | 42 + libqpdf/qpdf/QPDF_Array.hh | 24 + libqpdf/qpdf/QPDF_Bool.hh | 19 + libqpdf/qpdf/QPDF_Dictionary.hh | 35 + libqpdf/qpdf/QPDF_Integer.hh | 19 + libqpdf/qpdf/QPDF_Name.hh | 22 + libqpdf/qpdf/QPDF_Null.hh | 14 + libqpdf/qpdf/QPDF_Real.hh | 20 + libqpdf/qpdf/QPDF_Stream.hh | 42 + libqpdf/qpdf/QPDF_String.hh | 23 + libqpdf/qpdf/RC4.hh | 26 + libtests/Makefile | 1 + libtests/ascii85.cc | 36 + libtests/bits.cc | 177 + libtests/buffer.cc | 61 + libtests/build.mk | 40 + libtests/flate.cc | 110 + libtests/hex.cc | 36 + libtests/libtests.testcov | 18 + libtests/lzw.cc | 38 + libtests/md5.cc | 74 + libtests/pcre.cc | 30 + libtests/png_filter.cc | 84 + libtests/pointer_holder.cc | 81 + libtests/qexc.cc | 65 + libtests/qtest/ascii85.test | 22 + libtests/qtest/ascii85/base85.in | 43 + libtests/qtest/ascii85/binary.out | Bin 0 -> 2048 bytes libtests/qtest/bits.test | 17 + libtests/qtest/bits/bits.out | 59 + libtests/qtest/buffer.test | 17 + libtests/qtest/buffer/buffer.out | 11 + libtests/qtest/flate.test | 73 + libtests/qtest/flate/compressed | Bin 0 -> 147 bytes libtests/qtest/hex.test | 22 + libtests/qtest/hex/binary.out | Bin 0 -> 2048 bytes libtests/qtest/hex/hex.in | 70 + libtests/qtest/lzw.test | 17 + libtests/qtest/lzw/lzw1.in | Bin 0 -> 64355 bytes libtests/qtest/lzw/lzw1.out | 4299 ++++++++++ libtests/qtest/md5.test | 17 + libtests/qtest/md5/md5.in | Bin 0 -> 250 bytes libtests/qtest/md5/md5.out | 16 + libtests/qtest/pcre.test | 34 + libtests/qtest/pcre/pcre-unicode-classes.out | 2 + libtests/qtest/pcre/pcre.out | 68 + libtests/qtest/ph.test | 17 + libtests/qtest/ph/ph.out | 12 + libtests/qtest/png_filter.test | 63 + libtests/qtest/png_filter/in1 | Bin 0 -> 3985 bytes libtests/qtest/png_filter/in2 | Bin 0 -> 339564 bytes libtests/qtest/png_filter/out1 | Bin 0 -> 3188 bytes libtests/qtest/png_filter/out2 | Bin 0 -> 282970 bytes libtests/qtest/qexc.test | 32 + libtests/qtest/qexc/test0.out | 2 + libtests/qtest/qexc/test1.out | 1 + libtests/qtest/qexc/test2.out | 2 + libtests/qtest/qutil.test | 17 + libtests/qtest/qutil/qutil.out | 30 + libtests/qtest/rc4.test | 45 + libtests/qtest/rc4/test1.in | 1 + libtests/qtest/rc4/test1.out | 1 + libtests/qtest/rc4/test2.in | Bin 0 -> 8 bytes libtests/qtest/rc4/test2.out | 1 + libtests/qtest/rc4/test3.in | Bin 0 -> 8 bytes libtests/qtest/rc4/test3.out | 1 + libtests/qtest/rc4/test4.in | Bin 0 -> 10 bytes libtests/qtest/rc4/test4.out | 1 + libtests/qtest/rc4/test5.in | 1 + libtests/qtest/rc4/test5.out | Bin 0 -> 512 bytes libtests/qutil.cc | 199 + libtests/rc4.cc | 82 + ltmain.sh | 6964 +++++++++++++++++ make/proxy.mk | 10 + make/rules.mk | 63 + make_dist | 165 + manual/Makefile | 1 + manual/README | 3 + manual/build.mk | 43 + manual/common.xsl | 9 + manual/fix-qdf.1.in | 18 + manual/html.xsl.in | 8 + manual/print.xsl.in | 69 + manual/qpdf-manual.xml | 1964 +++++ manual/qpdf.1.in | 19 + manual/zlib-flate.1.in | 21 + mkinstalldirs | 161 + qpdf.spec | 93 + qpdf/Makefile | 1 + qpdf/build.mk | 26 + qpdf/fix-qdf | 352 + qpdf/qpdf.cc | 942 +++ qpdf/qpdf.testcov | 117 + qpdf/qtest/qpdf.test | 942 +++ qpdf/qtest/qpdf/U25A0.1.check | 4 + qpdf/qtest/qpdf/U25A0.10.check | 5 + qpdf/qtest/qpdf/U25A0.11.check | 5 + qpdf/qtest/qpdf/U25A0.12.check | 5 + qpdf/qtest/qpdf/U25A0.2.check | 4 + qpdf/qtest/qpdf/U25A0.3.check | 4 + qpdf/qtest/qpdf/U25A0.4.check | 4 + qpdf/qtest/qpdf/U25A0.5.check | 4 + qpdf/qtest/qpdf/U25A0.6.check | 4 + qpdf/qtest/qpdf/U25A0.7.check | 4 + qpdf/qtest/qpdf/U25A0.8.check | 4 + qpdf/qtest/qpdf/U25A0.9.check | 5 + qpdf/qtest/qpdf/U25A0.pdf | Bin 0 -> 67790 bytes qpdf/qtest/qpdf/bad1-recover.out | 1 + qpdf/qtest/qpdf/bad1.out | 1 + qpdf/qtest/qpdf/bad1.pdf | 1 + qpdf/qtest/qpdf/bad10-recover.out | 9 + qpdf/qtest/qpdf/bad10.out | 1 + qpdf/qtest/qpdf/bad10.pdf | 79 + qpdf/qtest/qpdf/bad11-recover.out | 9 + qpdf/qtest/qpdf/bad11.out | 1 + qpdf/qtest/qpdf/bad11.pdf | 104 + qpdf/qtest/qpdf/bad12-recover.out | 7 + qpdf/qtest/qpdf/bad12.out | 7 + qpdf/qtest/qpdf/bad12.pdf | 122 + qpdf/qtest/qpdf/bad13-recover.out | 4 + qpdf/qtest/qpdf/bad13.out | 1 + qpdf/qtest/qpdf/bad13.pdf | 80 + qpdf/qtest/qpdf/bad14-recover.out | 4 + qpdf/qtest/qpdf/bad14.out | 1 + qpdf/qtest/qpdf/bad14.pdf | 80 + qpdf/qtest/qpdf/bad15-recover.out | 4 + qpdf/qtest/qpdf/bad15.out | 1 + qpdf/qtest/qpdf/bad15.pdf | 80 + qpdf/qtest/qpdf/bad16-recover.out | 4 + qpdf/qtest/qpdf/bad16.out | 1 + qpdf/qtest/qpdf/bad16.pdf | 80 + qpdf/qtest/qpdf/bad17-recover.out | 4 + qpdf/qtest/qpdf/bad17.out | 1 + qpdf/qtest/qpdf/bad17.pdf | 80 + qpdf/qtest/qpdf/bad18-recover.out | 4 + qpdf/qtest/qpdf/bad18.out | 1 + qpdf/qtest/qpdf/bad18.pdf | 80 + qpdf/qtest/qpdf/bad19-recover.out | 4 + qpdf/qtest/qpdf/bad19.out | 1 + qpdf/qtest/qpdf/bad19.pdf | 80 + qpdf/qtest/qpdf/bad2-recover.out | 9 + qpdf/qtest/qpdf/bad2.out | 1 + qpdf/qtest/qpdf/bad2.pdf | 76 + qpdf/qtest/qpdf/bad20-recover.out | 4 + qpdf/qtest/qpdf/bad20.out | 1 + qpdf/qtest/qpdf/bad20.pdf | 80 + qpdf/qtest/qpdf/bad21-recover.out | 4 + qpdf/qtest/qpdf/bad21.out | 1 + qpdf/qtest/qpdf/bad21.pdf | 80 + qpdf/qtest/qpdf/bad22-recover.out | 21 + qpdf/qtest/qpdf/bad22.out | 1 + qpdf/qtest/qpdf/bad22.pdf | 80 + qpdf/qtest/qpdf/bad23-recover.out | 21 + qpdf/qtest/qpdf/bad23.out | 1 + qpdf/qtest/qpdf/bad23.pdf | 80 + qpdf/qtest/qpdf/bad24-recover.out | 2 + qpdf/qtest/qpdf/bad24.out | 1 + qpdf/qtest/qpdf/bad24.pdf | 80 + qpdf/qtest/qpdf/bad25-recover.out | 4 + qpdf/qtest/qpdf/bad25.out | 1 + qpdf/qtest/qpdf/bad25.pdf | 80 + qpdf/qtest/qpdf/bad26-recover.out | 4 + qpdf/qtest/qpdf/bad26.out | 1 + qpdf/qtest/qpdf/bad26.pdf | 80 + qpdf/qtest/qpdf/bad27-recover.out | 4 + qpdf/qtest/qpdf/bad27.out | 1 + qpdf/qtest/qpdf/bad27.pdf | 80 + qpdf/qtest/qpdf/bad28-recover.out | 21 + qpdf/qtest/qpdf/bad28.out | 21 + qpdf/qtest/qpdf/bad28.pdf | 80 + qpdf/qtest/qpdf/bad29-recover.out | 4 + qpdf/qtest/qpdf/bad29.out | 1 + qpdf/qtest/qpdf/bad29.pdf | 80 + qpdf/qtest/qpdf/bad3-recover.out | 9 + qpdf/qtest/qpdf/bad3.out | 1 + qpdf/qtest/qpdf/bad3.pdf | 76 + qpdf/qtest/qpdf/bad30-recover.out | 6 + qpdf/qtest/qpdf/bad30.out | 6 + qpdf/qtest/qpdf/bad30.pdf | 93 + qpdf/qtest/qpdf/bad31-recover.out | 9 + qpdf/qtest/qpdf/bad31.out | 9 + qpdf/qtest/qpdf/bad31.pdf | 93 + qpdf/qtest/qpdf/bad32-recover.out | 9 + qpdf/qtest/qpdf/bad32.out | 1 + qpdf/qtest/qpdf/bad32.pdf | 80 + qpdf/qtest/qpdf/bad4-recover.out | 9 + qpdf/qtest/qpdf/bad4.out | 1 + qpdf/qtest/qpdf/bad4.pdf | 77 + qpdf/qtest/qpdf/bad5-recover.out | 9 + qpdf/qtest/qpdf/bad5.out | 1 + qpdf/qtest/qpdf/bad5.pdf | 77 + qpdf/qtest/qpdf/bad6-recover.out | 6 + qpdf/qtest/qpdf/bad6.out | 6 + qpdf/qtest/qpdf/bad6.pdf | 122 + qpdf/qtest/qpdf/bad7-recover.out | 4 + qpdf/qtest/qpdf/bad7.out | 1 + qpdf/qtest/qpdf/bad7.pdf | 77 + qpdf/qtest/qpdf/bad8-recover.out | 9 + qpdf/qtest/qpdf/bad8.out | 1 + qpdf/qtest/qpdf/bad8.pdf | 104 + qpdf/qtest/qpdf/bad9-recover.out | 9 + qpdf/qtest/qpdf/bad9.out | 1 + qpdf/qtest/qpdf/bad9.pdf | 79 + qpdf/qtest/qpdf/badlin1.out | 380 + qpdf/qtest/qpdf/badlin1.pdf | Bin 0 -> 13103 bytes qpdf/qtest/qpdf/check-ID.pl | 20 + qpdf/qtest/qpdf/delete-and-reuse.pdf | 1573 ++++ qpdf/qtest/qpdf/delete-and-reuse.qdf | 1408 ++++ qpdf/qtest/qpdf/diff-encrypted | 7 + qpdf/qtest/qpdf/enc-R2,V1,O=master.pdf | Bin 0 -> 17146 bytes qpdf/qtest/qpdf/enc-R2,V1,U=view,O=master.pdf | Bin 0 -> 17134 bytes qpdf/qtest/qpdf/enc-R2,V1,U=view.pdf | Bin 0 -> 17137 bytes qpdf/qtest/qpdf/enc-R2,V1.pdf | Bin 0 -> 17143 bytes qpdf/qtest/qpdf/enc-R3,V2,O=master.pdf | Bin 0 -> 17144 bytes qpdf/qtest/qpdf/enc-R3,V2,U=view,O=master.pdf | Bin 0 -> 17139 bytes qpdf/qtest/qpdf/enc-R3,V2,U=view.pdf | Bin 0 -> 17142 bytes qpdf/qtest/qpdf/enc-R3,V2.pdf | Bin 0 -> 17140 bytes qpdf/qtest/qpdf/enc-base.pdf | Bin 0 -> 16937 bytes qpdf/qtest/qpdf/enc-long-password.pdf | Bin 0 -> 17144 bytes qpdf/qtest/qpdf/encrypted-with-images.pdf | Bin 0 -> 50219 bytes qpdf/qtest/qpdf/encrypted1.out | 578 ++ qpdf/qtest/qpdf/fix1.qdf | 111 + qpdf/qtest/qpdf/fix1.qdf.out | 113 + qpdf/qtest/qpdf/fix2.qdf | Bin 0 -> 1227 bytes qpdf/qtest/qpdf/fix2.qdf.out | Bin 0 -> 1232 bytes qpdf/qtest/qpdf/good1.out | 6 + qpdf/qtest/qpdf/good1.pdf | Bin 0 -> 813 bytes qpdf/qtest/qpdf/good1.qdf | 95 + qpdf/qtest/qpdf/good10.out | 8 + qpdf/qtest/qpdf/good10.pdf | 80 + qpdf/qtest/qpdf/good10.qdf | 100 + qpdf/qtest/qpdf/good11.out | 6 + qpdf/qtest/qpdf/good11.pdf | 81 + qpdf/qtest/qpdf/good11.qdf | 98 + qpdf/qtest/qpdf/good12.out | 13 + qpdf/qtest/qpdf/good12.pdf | 93 + qpdf/qtest/qpdf/good12.qdf | 113 + qpdf/qtest/qpdf/good13.out | 9 + qpdf/qtest/qpdf/good13.pdf | 101 + qpdf/qtest/qpdf/good13.qdf | 139 + qpdf/qtest/qpdf/good14.out | 39 + qpdf/qtest/qpdf/good14.pdf | 142 + qpdf/qtest/qpdf/good14.qdf | 189 + qpdf/qtest/qpdf/good15.out | 5 + qpdf/qtest/qpdf/good15.pdf | 79 + qpdf/qtest/qpdf/good15.qdf | 97 + qpdf/qtest/qpdf/good16.out | 6 + qpdf/qtest/qpdf/good16.pdf | Bin 0 -> 792 bytes qpdf/qtest/qpdf/good16.qdf | Bin 0 -> 1106 bytes qpdf/qtest/qpdf/good17-not-qdf.pdf | Bin 0 -> 9893 bytes qpdf/qtest/qpdf/good17-not-recompressed.pdf | Bin 0 -> 9147 bytes qpdf/qtest/qpdf/good17.out | 6 + qpdf/qtest/qpdf/good17.pdf | 1550 ++++ qpdf/qtest/qpdf/good17.qdf | 1523 ++++ qpdf/qtest/qpdf/good18.out | 6 + qpdf/qtest/qpdf/good18.pdf | 1538 ++++ qpdf/qtest/qpdf/good18.qdf | 1343 ++++ qpdf/qtest/qpdf/good19.out | 6 + qpdf/qtest/qpdf/good19.pdf | Bin 0 -> 1032 bytes qpdf/qtest/qpdf/good19.qdf | Bin 0 -> 1105 bytes qpdf/qtest/qpdf/good2.out | 6 + qpdf/qtest/qpdf/good2.pdf | 80 + qpdf/qtest/qpdf/good2.qdf | 95 + qpdf/qtest/qpdf/good20.out | 6 + qpdf/qtest/qpdf/good20.pdf | 901 +++ qpdf/qtest/qpdf/good20.qdf | 1075 +++ qpdf/qtest/qpdf/good3.out | 6 + qpdf/qtest/qpdf/good3.pdf | 80 + qpdf/qtest/qpdf/good3.qdf | 95 + qpdf/qtest/qpdf/good4.out | 6 + qpdf/qtest/qpdf/good4.pdf | 83 + qpdf/qtest/qpdf/good4.qdf | 95 + qpdf/qtest/qpdf/good5.out | 5 + qpdf/qtest/qpdf/good5.pdf | 83 + qpdf/qtest/qpdf/good5.qdf | 96 + qpdf/qtest/qpdf/good6.out | 5 + qpdf/qtest/qpdf/good6.pdf | 79 + qpdf/qtest/qpdf/good6.qdf | 96 + qpdf/qtest/qpdf/good7-not-normalized.qdf | 95 + qpdf/qtest/qpdf/good7.out | 5 + qpdf/qtest/qpdf/good7.pdf | 79 + qpdf/qtest/qpdf/good7.qdf | 97 + qpdf/qtest/qpdf/good8.out | 5 + qpdf/qtest/qpdf/good8.pdf | 79 + qpdf/qtest/qpdf/good8.qdf | 96 + qpdf/qtest/qpdf/good9.out | 5 + qpdf/qtest/qpdf/good9.pdf | 81 + qpdf/qtest/qpdf/good9.qdf | 97 + qpdf/qtest/qpdf/heifer.out | 4 + qpdf/qtest/qpdf/heifer.pdf | Bin 0 -> 93593 bytes qpdf/qtest/qpdf/heifer.qdf | 1349 ++++ qpdf/qtest/qpdf/hybrid-xref.1.check | 4 + qpdf/qtest/qpdf/hybrid-xref.10.check | 5 + qpdf/qtest/qpdf/hybrid-xref.11.check | 5 + qpdf/qtest/qpdf/hybrid-xref.12.check | 4 + qpdf/qtest/qpdf/hybrid-xref.2.check | 4 + qpdf/qtest/qpdf/hybrid-xref.3.check | 4 + qpdf/qtest/qpdf/hybrid-xref.4.check | 4 + qpdf/qtest/qpdf/hybrid-xref.5.check | 4 + qpdf/qtest/qpdf/hybrid-xref.6.check | 4 + qpdf/qtest/qpdf/hybrid-xref.7.check | 4 + qpdf/qtest/qpdf/hybrid-xref.8.check | 4 + qpdf/qtest/qpdf/hybrid-xref.9.check | 4 + qpdf/qtest/qpdf/hybrid-xref.pdf | 1538 ++++ qpdf/qtest/qpdf/inline-images.1.check | 4 + qpdf/qtest/qpdf/inline-images.10.check | 5 + qpdf/qtest/qpdf/inline-images.11.check | 5 + qpdf/qtest/qpdf/inline-images.12.check | 4 + qpdf/qtest/qpdf/inline-images.2.check | 4 + qpdf/qtest/qpdf/inline-images.3.check | 4 + qpdf/qtest/qpdf/inline-images.4.check | 4 + qpdf/qtest/qpdf/inline-images.5.check | 4 + qpdf/qtest/qpdf/inline-images.6.check | 4 + qpdf/qtest/qpdf/inline-images.7.check | 4 + qpdf/qtest/qpdf/inline-images.8.check | 4 + qpdf/qtest/qpdf/inline-images.9.check | 4 + qpdf/qtest/qpdf/inline-images.pdf | Bin 0 -> 300684 bytes qpdf/qtest/qpdf/lin-delete-and-reuse.pdf | Bin 0 -> 13382 bytes qpdf/qtest/qpdf/lin-special.1.check | 4 + qpdf/qtest/qpdf/lin-special.10.check | 5 + qpdf/qtest/qpdf/lin-special.11.check | 5 + qpdf/qtest/qpdf/lin-special.12.check | 4 + qpdf/qtest/qpdf/lin-special.2.check | 4 + qpdf/qtest/qpdf/lin-special.3.check | 4 + qpdf/qtest/qpdf/lin-special.4.check | 4 + qpdf/qtest/qpdf/lin-special.5.check | 4 + qpdf/qtest/qpdf/lin-special.6.check | 4 + qpdf/qtest/qpdf/lin-special.7.check | 4 + qpdf/qtest/qpdf/lin-special.8.check | 4 + qpdf/qtest/qpdf/lin-special.9.check | 4 + qpdf/qtest/qpdf/lin-special.disable.exp | Bin 0 -> 3138 bytes qpdf/qtest/qpdf/lin-special.generate.exp | Bin 0 -> 2757 bytes qpdf/qtest/qpdf/lin-special.pdf | 354 + qpdf/qtest/qpdf/lin-special.preserve.exp | Bin 0 -> 3138 bytes qpdf/qtest/qpdf/lin0.out | 1 + qpdf/qtest/qpdf/lin0.pdf | 79 + qpdf/qtest/qpdf/lin1.out | 378 + qpdf/qtest/qpdf/lin1.pdf | Bin 0 -> 13103 bytes qpdf/qtest/qpdf/lin2.out | 378 + qpdf/qtest/qpdf/lin2.pdf | Bin 0 -> 13103 bytes qpdf/qtest/qpdf/lin3.out | 318 + qpdf/qtest/qpdf/lin3.pdf | Bin 0 -> 16937 bytes qpdf/qtest/qpdf/lin4.out | 353 + qpdf/qtest/qpdf/lin4.pdf | Bin 0 -> 13055 bytes qpdf/qtest/qpdf/lin5.out | 318 + qpdf/qtest/qpdf/lin5.pdf | Bin 0 -> 27464 bytes qpdf/qtest/qpdf/lin6.out | 592 ++ qpdf/qtest/qpdf/lin6.pdf | Bin 0 -> 24824 bytes qpdf/qtest/qpdf/lin7.out | 292 + qpdf/qtest/qpdf/lin7.pdf | Bin 0 -> 27408 bytes qpdf/qtest/qpdf/lin8.out | 568 ++ qpdf/qtest/qpdf/lin8.pdf | Bin 0 -> 24875 bytes qpdf/qtest/qpdf/lin9.out | 104 + qpdf/qtest/qpdf/lin9.pdf | Bin 0 -> 3316 bytes qpdf/qtest/qpdf/misc-1.out | 15 + qpdf/qtest/qpdf/misc-1.pdf | Bin 0 -> 18204 bytes qpdf/qtest/qpdf/misc-2.out | 26 + qpdf/qtest/qpdf/misc-2.pdf | Bin 0 -> 16022 bytes qpdf/qtest/qpdf/misc-3.out | 14 + qpdf/qtest/qpdf/misc-3.pdf | 127 + qpdf/qtest/qpdf/multiple-mods.pdf | Bin 0 -> 60960 bytes qpdf/qtest/qpdf/object-stream.1.check | 4 + qpdf/qtest/qpdf/object-stream.10.check | 5 + qpdf/qtest/qpdf/object-stream.11.check | 5 + qpdf/qtest/qpdf/object-stream.12.check | 4 + qpdf/qtest/qpdf/object-stream.2.check | 4 + qpdf/qtest/qpdf/object-stream.3.check | 4 + qpdf/qtest/qpdf/object-stream.4.check | 4 + qpdf/qtest/qpdf/object-stream.5.check | 4 + qpdf/qtest/qpdf/object-stream.6.check | 4 + qpdf/qtest/qpdf/object-stream.7.check | 4 + qpdf/qtest/qpdf/object-stream.8.check | 4 + qpdf/qtest/qpdf/object-stream.9.check | 4 + qpdf/qtest/qpdf/object-stream.disable.exp | Bin 0 -> 1250 bytes qpdf/qtest/qpdf/object-stream.generate.exp | Bin 0 -> 1526 bytes qpdf/qtest/qpdf/object-stream.pdf | Bin 0 -> 792 bytes qpdf/qtest/qpdf/object-stream.preserve.exp | Bin 0 -> 1526 bytes qpdf/qtest/qpdf/old-and-complex.pdf | Bin 0 -> 335662 bytes qpdf/qtest/qpdf/p1-a-p2-a.pdf | 138 + qpdf/qtest/qpdf/p1-a-p2-b.pdf | 138 + qpdf/qtest/qpdf/p1-a.pdf | 95 + qpdf/qtest/qpdf/p1-b.pdf | 95 + .../qpdf/show-page-1-content-filtered.out | 1 + .../qpdf/show-page-1-content-normalized.out | 8 + qpdf/qtest/qpdf/show-page-1-content-raw.out | Bin 0 -> 61 bytes qpdf/qtest/qpdf/show-page-1-image.out | Bin 0 -> 39109 bytes qpdf/qtest/qpdf/show-page-1.out | 1 + qpdf/qtest/qpdf/show-pages-images.out | 11 + qpdf/qtest/qpdf/show-pages.out | 6 + qpdf/qtest/qpdf/show-unfilterable.out | 1 + qpdf/qtest/qpdf/show-xref-by-id-filtered.out | Bin 0 -> 52 bytes qpdf/qtest/qpdf/show-xref-by-id.out | 2 + qpdf/qtest/qpdf/show-xref.out | 12 + qpdf/qtest/qpdf/test4-1.pdf | 126 + qpdf/qtest/qpdf/test4-1.qdf | 145 + qpdf/qtest/qpdf/test4-2.out | 1 + qpdf/qtest/qpdf/test4-2.pdf | 104 + qpdf/qtest/qpdf/test4-3.out | 1 + qpdf/qtest/qpdf/test4-3.pdf | 109 + qpdf/qtest/qpdf/test4-4.pdf | 123 + qpdf/qtest/qpdf/test4-4.qdf | 145 + qpdf/test_driver.cc | 323 + qtest/QTC/perl/QTC.pm | 26 + qtest/README.txt | 3 + qtest/bin/qtest-driver | 798 ++ qtest/module/TestDriver.pm | 1566 ++++ zlib-flate/Makefile | 1 + zlib-flate/build.mk | 22 + zlib-flate/qtest/1.compressed | Bin 0 -> 193 bytes zlib-flate/qtest/1.uncompressed | 5 + zlib-flate/qtest/zf.test | 26 + zlib-flate/zlib-flate.cc | 92 + 531 files changed, 79083 insertions(+) create mode 100644 Artistic-2.0 create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile create mode 100644 README create mode 100644 README.maintainer create mode 100644 TODO create mode 100644 aclocal.m4 create mode 100644 autoconf.mk.in create mode 100755 config.guess create mode 100755 config.sub create mode 100644 configure.ac create mode 100644 doc/stylesheet.css create mode 100644 examples/Makefile create mode 100644 examples/build.mk create mode 100644 examples/examples.testcov create mode 100644 examples/pdf-bookmarks.cc create mode 100644 examples/pdf-mod-info.cc create mode 100644 examples/pdf-npages.cc create mode 100644 examples/qtest/bookmarks.test create mode 100644 examples/qtest/bookmarks/1.pdf create mode 100644 examples/qtest/bookmarks/2.pdf create mode 100644 examples/qtest/bookmarks/3.pdf create mode 100644 examples/qtest/bookmarks/4.pdf create mode 100644 examples/qtest/bookmarks/5.pdf create mode 100644 examples/qtest/bookmarks/encrypted.out create mode 100644 examples/qtest/bookmarks/test.-show-open.-lines.out create mode 100644 examples/qtest/bookmarks/test.-show-open.-numbers.out create mode 100644 examples/qtest/bookmarks/test.-show-open..out create mode 100644 examples/qtest/bookmarks/test..-lines.out create mode 100644 examples/qtest/bookmarks/test..-numbers.out create mode 100644 examples/qtest/bookmarks/test...out create mode 100644 examples/qtest/mod-info.test create mode 100644 examples/qtest/mod-info/dump.out create mode 100644 examples/qtest/mod-info/files/1.qdf create mode 100644 examples/qtest/mod-info/files/2.qdf create mode 100644 examples/qtest/mod-info/files/3.qdf create mode 100644 examples/qtest/mod-info/files/4.qdf create mode 100644 examples/qtest/mod-info/files/empty-info.pdf create mode 100644 examples/qtest/mod-info/files/no-info.pdf create mode 100644 examples/qtest/mod-info/files/source1.pdf create mode 100644 examples/qtest/mod-info/files/source2.pdf create mode 100644 examples/qtest/mod-info/usage.out create mode 100644 examples/qtest/npages.test create mode 100644 examples/qtest/npages/bad create mode 100644 examples/qtest/npages/minimal.pdf create mode 100644 include/qpdf/Buffer.hh create mode 100644 include/qpdf/Pipeline.hh create mode 100644 include/qpdf/Pl_Buffer.hh create mode 100644 include/qpdf/Pl_Count.hh create mode 100644 include/qpdf/Pl_Discard.hh create mode 100644 include/qpdf/Pl_Flate.hh create mode 100644 include/qpdf/Pl_StdioFile.hh create mode 100644 include/qpdf/PointerHolder.hh create mode 100644 include/qpdf/QEXC.hh create mode 100644 include/qpdf/QPDF.hh create mode 100644 include/qpdf/QPDFExc.hh create mode 100644 include/qpdf/QPDFObject.hh create mode 100644 include/qpdf/QPDFObjectHandle.hh create mode 100644 include/qpdf/QPDFTokenizer.hh create mode 100644 include/qpdf/QPDFWriter.hh create mode 100644 include/qpdf/QPDFXRefEntry.hh create mode 100644 include/qpdf/QTC.hh create mode 100644 include/qpdf/QUtil.hh create mode 100755 install-sh create mode 100644 libqpdf/BitStream.cc create mode 100644 libqpdf/BitWriter.cc create mode 100644 libqpdf/Buffer.cc create mode 100644 libqpdf/MD5.cc create mode 100644 libqpdf/Makefile create mode 100644 libqpdf/PCRE.cc create mode 100644 libqpdf/Pipeline.cc create mode 100644 libqpdf/Pl_ASCII85Decoder.cc create mode 100644 libqpdf/Pl_ASCIIHexDecoder.cc create mode 100644 libqpdf/Pl_Buffer.cc create mode 100644 libqpdf/Pl_Count.cc create mode 100644 libqpdf/Pl_Discard.cc create mode 100644 libqpdf/Pl_Flate.cc create mode 100644 libqpdf/Pl_LZWDecoder.cc create mode 100644 libqpdf/Pl_MD5.cc create mode 100644 libqpdf/Pl_PNGFilter.cc create mode 100644 libqpdf/Pl_QPDFTokenizer.cc create mode 100644 libqpdf/Pl_RC4.cc create mode 100644 libqpdf/Pl_StdioFile.cc create mode 100644 libqpdf/QEXC.cc create mode 100644 libqpdf/QPDF.cc create mode 100644 libqpdf/QPDFExc.cc create mode 100644 libqpdf/QPDFObject.cc create mode 100644 libqpdf/QPDFObjectHandle.cc create mode 100644 libqpdf/QPDFTokenizer.cc create mode 100644 libqpdf/QPDFWriter.cc create mode 100644 libqpdf/QPDFXRefEntry.cc create mode 100644 libqpdf/QPDF_Array.cc create mode 100644 libqpdf/QPDF_Bool.cc create mode 100644 libqpdf/QPDF_Dictionary.cc create mode 100644 libqpdf/QPDF_Integer.cc create mode 100644 libqpdf/QPDF_Name.cc create mode 100644 libqpdf/QPDF_Null.cc create mode 100644 libqpdf/QPDF_Real.cc create mode 100644 libqpdf/QPDF_Stream.cc create mode 100644 libqpdf/QPDF_String.cc create mode 100644 libqpdf/QPDF_encryption.cc create mode 100644 libqpdf/QPDF_linearization.cc create mode 100644 libqpdf/QPDF_optimization.cc create mode 100644 libqpdf/QTC.cc create mode 100644 libqpdf/QUtil.cc create mode 100644 libqpdf/RC4.cc create mode 100644 libqpdf/bits.icc create mode 100644 libqpdf/build.mk create mode 100644 libqpdf/qpdf/BitStream.hh create mode 100644 libqpdf/qpdf/BitWriter.hh create mode 100644 libqpdf/qpdf/MD5.hh create mode 100644 libqpdf/qpdf/PCRE.hh create mode 100644 libqpdf/qpdf/Pl_ASCII85Decoder.hh create mode 100644 libqpdf/qpdf/Pl_ASCIIHexDecoder.hh create mode 100644 libqpdf/qpdf/Pl_LZWDecoder.hh create mode 100644 libqpdf/qpdf/Pl_MD5.hh create mode 100644 libqpdf/qpdf/Pl_PNGFilter.hh create mode 100644 libqpdf/qpdf/Pl_QPDFTokenizer.hh create mode 100644 libqpdf/qpdf/Pl_RC4.hh create mode 100644 libqpdf/qpdf/QPDF_Array.hh create mode 100644 libqpdf/qpdf/QPDF_Bool.hh create mode 100644 libqpdf/qpdf/QPDF_Dictionary.hh create mode 100644 libqpdf/qpdf/QPDF_Integer.hh create mode 100644 libqpdf/qpdf/QPDF_Name.hh create mode 100644 libqpdf/qpdf/QPDF_Null.hh create mode 100644 libqpdf/qpdf/QPDF_Real.hh create mode 100644 libqpdf/qpdf/QPDF_Stream.hh create mode 100644 libqpdf/qpdf/QPDF_String.hh create mode 100644 libqpdf/qpdf/RC4.hh create mode 100644 libtests/Makefile create mode 100644 libtests/ascii85.cc create mode 100644 libtests/bits.cc create mode 100644 libtests/buffer.cc create mode 100644 libtests/build.mk create mode 100644 libtests/flate.cc create mode 100644 libtests/hex.cc create mode 100644 libtests/libtests.testcov create mode 100644 libtests/lzw.cc create mode 100644 libtests/md5.cc create mode 100644 libtests/pcre.cc create mode 100644 libtests/png_filter.cc create mode 100644 libtests/pointer_holder.cc create mode 100644 libtests/qexc.cc create mode 100644 libtests/qtest/ascii85.test create mode 100644 libtests/qtest/ascii85/base85.in create mode 100644 libtests/qtest/ascii85/binary.out create mode 100644 libtests/qtest/bits.test create mode 100644 libtests/qtest/bits/bits.out create mode 100644 libtests/qtest/buffer.test create mode 100644 libtests/qtest/buffer/buffer.out create mode 100644 libtests/qtest/flate.test create mode 100644 libtests/qtest/flate/compressed create mode 100644 libtests/qtest/hex.test create mode 100644 libtests/qtest/hex/binary.out create mode 100644 libtests/qtest/hex/hex.in create mode 100644 libtests/qtest/lzw.test create mode 100644 libtests/qtest/lzw/lzw1.in create mode 100644 libtests/qtest/lzw/lzw1.out create mode 100644 libtests/qtest/md5.test create mode 100644 libtests/qtest/md5/md5.in create mode 100644 libtests/qtest/md5/md5.out create mode 100644 libtests/qtest/pcre.test create mode 100644 libtests/qtest/pcre/pcre-unicode-classes.out create mode 100644 libtests/qtest/pcre/pcre.out create mode 100644 libtests/qtest/ph.test create mode 100644 libtests/qtest/ph/ph.out create mode 100644 libtests/qtest/png_filter.test create mode 100644 libtests/qtest/png_filter/in1 create mode 100644 libtests/qtest/png_filter/in2 create mode 100644 libtests/qtest/png_filter/out1 create mode 100644 libtests/qtest/png_filter/out2 create mode 100644 libtests/qtest/qexc.test create mode 100644 libtests/qtest/qexc/test0.out create mode 100644 libtests/qtest/qexc/test1.out create mode 100644 libtests/qtest/qexc/test2.out create mode 100644 libtests/qtest/qutil.test create mode 100644 libtests/qtest/qutil/qutil.out create mode 100644 libtests/qtest/rc4.test create mode 100644 libtests/qtest/rc4/test1.in create mode 100644 libtests/qtest/rc4/test1.out create mode 100644 libtests/qtest/rc4/test2.in create mode 100644 libtests/qtest/rc4/test2.out create mode 100644 libtests/qtest/rc4/test3.in create mode 100644 libtests/qtest/rc4/test3.out create mode 100644 libtests/qtest/rc4/test4.in create mode 100644 libtests/qtest/rc4/test4.out create mode 100644 libtests/qtest/rc4/test5.in create mode 100644 libtests/qtest/rc4/test5.out create mode 100644 libtests/qutil.cc create mode 100644 libtests/rc4.cc create mode 100644 ltmain.sh create mode 100644 make/proxy.mk create mode 100644 make/rules.mk create mode 100755 make_dist create mode 100644 manual/Makefile create mode 100644 manual/README create mode 100644 manual/build.mk create mode 100644 manual/common.xsl create mode 100644 manual/fix-qdf.1.in create mode 100644 manual/html.xsl.in create mode 100644 manual/print.xsl.in create mode 100644 manual/qpdf-manual.xml create mode 100644 manual/qpdf.1.in create mode 100644 manual/zlib-flate.1.in create mode 100755 mkinstalldirs create mode 100644 qpdf.spec create mode 100644 qpdf/Makefile create mode 100644 qpdf/build.mk create mode 100755 qpdf/fix-qdf create mode 100644 qpdf/qpdf.cc create mode 100644 qpdf/qpdf.testcov create mode 100644 qpdf/qtest/qpdf.test create mode 100644 qpdf/qtest/qpdf/U25A0.1.check create mode 100644 qpdf/qtest/qpdf/U25A0.10.check create mode 100644 qpdf/qtest/qpdf/U25A0.11.check create mode 100644 qpdf/qtest/qpdf/U25A0.12.check create mode 100644 qpdf/qtest/qpdf/U25A0.2.check create mode 100644 qpdf/qtest/qpdf/U25A0.3.check create mode 100644 qpdf/qtest/qpdf/U25A0.4.check create mode 100644 qpdf/qtest/qpdf/U25A0.5.check create mode 100644 qpdf/qtest/qpdf/U25A0.6.check create mode 100644 qpdf/qtest/qpdf/U25A0.7.check create mode 100644 qpdf/qtest/qpdf/U25A0.8.check create mode 100644 qpdf/qtest/qpdf/U25A0.9.check create mode 100644 qpdf/qtest/qpdf/U25A0.pdf create mode 100644 qpdf/qtest/qpdf/bad1-recover.out create mode 100644 qpdf/qtest/qpdf/bad1.out create mode 100644 qpdf/qtest/qpdf/bad1.pdf create mode 100644 qpdf/qtest/qpdf/bad10-recover.out create mode 100644 qpdf/qtest/qpdf/bad10.out create mode 100644 qpdf/qtest/qpdf/bad10.pdf create mode 100644 qpdf/qtest/qpdf/bad11-recover.out create mode 100644 qpdf/qtest/qpdf/bad11.out create mode 100644 qpdf/qtest/qpdf/bad11.pdf create mode 100644 qpdf/qtest/qpdf/bad12-recover.out create mode 100644 qpdf/qtest/qpdf/bad12.out create mode 100644 qpdf/qtest/qpdf/bad12.pdf create mode 100644 qpdf/qtest/qpdf/bad13-recover.out create mode 100644 qpdf/qtest/qpdf/bad13.out create mode 100644 qpdf/qtest/qpdf/bad13.pdf create mode 100644 qpdf/qtest/qpdf/bad14-recover.out create mode 100644 qpdf/qtest/qpdf/bad14.out create mode 100644 qpdf/qtest/qpdf/bad14.pdf create mode 100644 qpdf/qtest/qpdf/bad15-recover.out create mode 100644 qpdf/qtest/qpdf/bad15.out create mode 100644 qpdf/qtest/qpdf/bad15.pdf create mode 100644 qpdf/qtest/qpdf/bad16-recover.out create mode 100644 qpdf/qtest/qpdf/bad16.out create mode 100644 qpdf/qtest/qpdf/bad16.pdf create mode 100644 qpdf/qtest/qpdf/bad17-recover.out create mode 100644 qpdf/qtest/qpdf/bad17.out create mode 100644 qpdf/qtest/qpdf/bad17.pdf create mode 100644 qpdf/qtest/qpdf/bad18-recover.out create mode 100644 qpdf/qtest/qpdf/bad18.out create mode 100644 qpdf/qtest/qpdf/bad18.pdf create mode 100644 qpdf/qtest/qpdf/bad19-recover.out create mode 100644 qpdf/qtest/qpdf/bad19.out create mode 100644 qpdf/qtest/qpdf/bad19.pdf create mode 100644 qpdf/qtest/qpdf/bad2-recover.out create mode 100644 qpdf/qtest/qpdf/bad2.out create mode 100644 qpdf/qtest/qpdf/bad2.pdf create mode 100644 qpdf/qtest/qpdf/bad20-recover.out create mode 100644 qpdf/qtest/qpdf/bad20.out create mode 100644 qpdf/qtest/qpdf/bad20.pdf create mode 100644 qpdf/qtest/qpdf/bad21-recover.out create mode 100644 qpdf/qtest/qpdf/bad21.out create mode 100644 qpdf/qtest/qpdf/bad21.pdf create mode 100644 qpdf/qtest/qpdf/bad22-recover.out create mode 100644 qpdf/qtest/qpdf/bad22.out create mode 100644 qpdf/qtest/qpdf/bad22.pdf create mode 100644 qpdf/qtest/qpdf/bad23-recover.out create mode 100644 qpdf/qtest/qpdf/bad23.out create mode 100644 qpdf/qtest/qpdf/bad23.pdf create mode 100644 qpdf/qtest/qpdf/bad24-recover.out create mode 100644 qpdf/qtest/qpdf/bad24.out create mode 100644 qpdf/qtest/qpdf/bad24.pdf create mode 100644 qpdf/qtest/qpdf/bad25-recover.out create mode 100644 qpdf/qtest/qpdf/bad25.out create mode 100644 qpdf/qtest/qpdf/bad25.pdf create mode 100644 qpdf/qtest/qpdf/bad26-recover.out create mode 100644 qpdf/qtest/qpdf/bad26.out create mode 100644 qpdf/qtest/qpdf/bad26.pdf create mode 100644 qpdf/qtest/qpdf/bad27-recover.out create mode 100644 qpdf/qtest/qpdf/bad27.out create mode 100644 qpdf/qtest/qpdf/bad27.pdf create mode 100644 qpdf/qtest/qpdf/bad28-recover.out create mode 100644 qpdf/qtest/qpdf/bad28.out create mode 100644 qpdf/qtest/qpdf/bad28.pdf create mode 100644 qpdf/qtest/qpdf/bad29-recover.out create mode 100644 qpdf/qtest/qpdf/bad29.out create mode 100644 qpdf/qtest/qpdf/bad29.pdf create mode 100644 qpdf/qtest/qpdf/bad3-recover.out create mode 100644 qpdf/qtest/qpdf/bad3.out create mode 100644 qpdf/qtest/qpdf/bad3.pdf create mode 100644 qpdf/qtest/qpdf/bad30-recover.out create mode 100644 qpdf/qtest/qpdf/bad30.out create mode 100644 qpdf/qtest/qpdf/bad30.pdf create mode 100644 qpdf/qtest/qpdf/bad31-recover.out create mode 100644 qpdf/qtest/qpdf/bad31.out create mode 100644 qpdf/qtest/qpdf/bad31.pdf create mode 100644 qpdf/qtest/qpdf/bad32-recover.out create mode 100644 qpdf/qtest/qpdf/bad32.out create mode 100644 qpdf/qtest/qpdf/bad32.pdf create mode 100644 qpdf/qtest/qpdf/bad4-recover.out create mode 100644 qpdf/qtest/qpdf/bad4.out create mode 100644 qpdf/qtest/qpdf/bad4.pdf create mode 100644 qpdf/qtest/qpdf/bad5-recover.out create mode 100644 qpdf/qtest/qpdf/bad5.out create mode 100644 qpdf/qtest/qpdf/bad5.pdf create mode 100644 qpdf/qtest/qpdf/bad6-recover.out create mode 100644 qpdf/qtest/qpdf/bad6.out create mode 100644 qpdf/qtest/qpdf/bad6.pdf create mode 100644 qpdf/qtest/qpdf/bad7-recover.out create mode 100644 qpdf/qtest/qpdf/bad7.out create mode 100644 qpdf/qtest/qpdf/bad7.pdf create mode 100644 qpdf/qtest/qpdf/bad8-recover.out create mode 100644 qpdf/qtest/qpdf/bad8.out create mode 100644 qpdf/qtest/qpdf/bad8.pdf create mode 100644 qpdf/qtest/qpdf/bad9-recover.out create mode 100644 qpdf/qtest/qpdf/bad9.out create mode 100644 qpdf/qtest/qpdf/bad9.pdf create mode 100644 qpdf/qtest/qpdf/badlin1.out create mode 100644 qpdf/qtest/qpdf/badlin1.pdf create mode 100644 qpdf/qtest/qpdf/check-ID.pl create mode 100644 qpdf/qtest/qpdf/delete-and-reuse.pdf create mode 100644 qpdf/qtest/qpdf/delete-and-reuse.qdf create mode 100755 qpdf/qtest/qpdf/diff-encrypted create mode 100644 qpdf/qtest/qpdf/enc-R2,V1,O=master.pdf create mode 100644 qpdf/qtest/qpdf/enc-R2,V1,U=view,O=master.pdf create mode 100644 qpdf/qtest/qpdf/enc-R2,V1,U=view.pdf create mode 100644 qpdf/qtest/qpdf/enc-R2,V1.pdf create mode 100644 qpdf/qtest/qpdf/enc-R3,V2,O=master.pdf create mode 100644 qpdf/qtest/qpdf/enc-R3,V2,U=view,O=master.pdf create mode 100644 qpdf/qtest/qpdf/enc-R3,V2,U=view.pdf create mode 100644 qpdf/qtest/qpdf/enc-R3,V2.pdf create mode 100644 qpdf/qtest/qpdf/enc-base.pdf create mode 100755 qpdf/qtest/qpdf/enc-long-password.pdf create mode 100644 qpdf/qtest/qpdf/encrypted-with-images.pdf create mode 100644 qpdf/qtest/qpdf/encrypted1.out create mode 100644 qpdf/qtest/qpdf/fix1.qdf create mode 100644 qpdf/qtest/qpdf/fix1.qdf.out create mode 100644 qpdf/qtest/qpdf/fix2.qdf create mode 100644 qpdf/qtest/qpdf/fix2.qdf.out create mode 100644 qpdf/qtest/qpdf/good1.out create mode 100644 qpdf/qtest/qpdf/good1.pdf create mode 100644 qpdf/qtest/qpdf/good1.qdf create mode 100644 qpdf/qtest/qpdf/good10.out create mode 100644 qpdf/qtest/qpdf/good10.pdf create mode 100644 qpdf/qtest/qpdf/good10.qdf create mode 100644 qpdf/qtest/qpdf/good11.out create mode 100644 qpdf/qtest/qpdf/good11.pdf create mode 100644 qpdf/qtest/qpdf/good11.qdf create mode 100644 qpdf/qtest/qpdf/good12.out create mode 100644 qpdf/qtest/qpdf/good12.pdf create mode 100644 qpdf/qtest/qpdf/good12.qdf create mode 100644 qpdf/qtest/qpdf/good13.out create mode 100644 qpdf/qtest/qpdf/good13.pdf create mode 100644 qpdf/qtest/qpdf/good13.qdf create mode 100644 qpdf/qtest/qpdf/good14.out create mode 100644 qpdf/qtest/qpdf/good14.pdf create mode 100644 qpdf/qtest/qpdf/good14.qdf create mode 100644 qpdf/qtest/qpdf/good15.out create mode 100644 qpdf/qtest/qpdf/good15.pdf create mode 100644 qpdf/qtest/qpdf/good15.qdf create mode 100644 qpdf/qtest/qpdf/good16.out create mode 100644 qpdf/qtest/qpdf/good16.pdf create mode 100644 qpdf/qtest/qpdf/good16.qdf create mode 100644 qpdf/qtest/qpdf/good17-not-qdf.pdf create mode 100644 qpdf/qtest/qpdf/good17-not-recompressed.pdf create mode 100644 qpdf/qtest/qpdf/good17.out create mode 100644 qpdf/qtest/qpdf/good17.pdf create mode 100644 qpdf/qtest/qpdf/good17.qdf create mode 100644 qpdf/qtest/qpdf/good18.out create mode 100644 qpdf/qtest/qpdf/good18.pdf create mode 100644 qpdf/qtest/qpdf/good18.qdf create mode 100644 qpdf/qtest/qpdf/good19.out create mode 100644 qpdf/qtest/qpdf/good19.pdf create mode 100644 qpdf/qtest/qpdf/good19.qdf create mode 100644 qpdf/qtest/qpdf/good2.out create mode 100644 qpdf/qtest/qpdf/good2.pdf create mode 100644 qpdf/qtest/qpdf/good2.qdf create mode 100644 qpdf/qtest/qpdf/good20.out create mode 100644 qpdf/qtest/qpdf/good20.pdf create mode 100644 qpdf/qtest/qpdf/good20.qdf create mode 100644 qpdf/qtest/qpdf/good3.out create mode 100644 qpdf/qtest/qpdf/good3.pdf create mode 100644 qpdf/qtest/qpdf/good3.qdf create mode 100644 qpdf/qtest/qpdf/good4.out create mode 100644 qpdf/qtest/qpdf/good4.pdf create mode 100644 qpdf/qtest/qpdf/good4.qdf create mode 100644 qpdf/qtest/qpdf/good5.out create mode 100644 qpdf/qtest/qpdf/good5.pdf create mode 100644 qpdf/qtest/qpdf/good5.qdf create mode 100644 qpdf/qtest/qpdf/good6.out create mode 100644 qpdf/qtest/qpdf/good6.pdf create mode 100644 qpdf/qtest/qpdf/good6.qdf create mode 100644 qpdf/qtest/qpdf/good7-not-normalized.qdf create mode 100644 qpdf/qtest/qpdf/good7.out create mode 100644 qpdf/qtest/qpdf/good7.pdf create mode 100644 qpdf/qtest/qpdf/good7.qdf create mode 100644 qpdf/qtest/qpdf/good8.out create mode 100644 qpdf/qtest/qpdf/good8.pdf create mode 100644 qpdf/qtest/qpdf/good8.qdf create mode 100644 qpdf/qtest/qpdf/good9.out create mode 100644 qpdf/qtest/qpdf/good9.pdf create mode 100644 qpdf/qtest/qpdf/good9.qdf create mode 100644 qpdf/qtest/qpdf/heifer.out create mode 100644 qpdf/qtest/qpdf/heifer.pdf create mode 100644 qpdf/qtest/qpdf/heifer.qdf create mode 100644 qpdf/qtest/qpdf/hybrid-xref.1.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.10.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.11.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.12.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.2.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.3.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.4.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.5.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.6.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.7.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.8.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.9.check create mode 100644 qpdf/qtest/qpdf/hybrid-xref.pdf create mode 100644 qpdf/qtest/qpdf/inline-images.1.check create mode 100644 qpdf/qtest/qpdf/inline-images.10.check create mode 100644 qpdf/qtest/qpdf/inline-images.11.check create mode 100644 qpdf/qtest/qpdf/inline-images.12.check create mode 100644 qpdf/qtest/qpdf/inline-images.2.check create mode 100644 qpdf/qtest/qpdf/inline-images.3.check create mode 100644 qpdf/qtest/qpdf/inline-images.4.check create mode 100644 qpdf/qtest/qpdf/inline-images.5.check create mode 100644 qpdf/qtest/qpdf/inline-images.6.check create mode 100644 qpdf/qtest/qpdf/inline-images.7.check create mode 100644 qpdf/qtest/qpdf/inline-images.8.check create mode 100644 qpdf/qtest/qpdf/inline-images.9.check create mode 100644 qpdf/qtest/qpdf/inline-images.pdf create mode 100644 qpdf/qtest/qpdf/lin-delete-and-reuse.pdf create mode 100644 qpdf/qtest/qpdf/lin-special.1.check create mode 100644 qpdf/qtest/qpdf/lin-special.10.check create mode 100644 qpdf/qtest/qpdf/lin-special.11.check create mode 100644 qpdf/qtest/qpdf/lin-special.12.check create mode 100644 qpdf/qtest/qpdf/lin-special.2.check create mode 100644 qpdf/qtest/qpdf/lin-special.3.check create mode 100644 qpdf/qtest/qpdf/lin-special.4.check create mode 100644 qpdf/qtest/qpdf/lin-special.5.check create mode 100644 qpdf/qtest/qpdf/lin-special.6.check create mode 100644 qpdf/qtest/qpdf/lin-special.7.check create mode 100644 qpdf/qtest/qpdf/lin-special.8.check create mode 100644 qpdf/qtest/qpdf/lin-special.9.check create mode 100644 qpdf/qtest/qpdf/lin-special.disable.exp create mode 100644 qpdf/qtest/qpdf/lin-special.generate.exp create mode 100644 qpdf/qtest/qpdf/lin-special.pdf create mode 100644 qpdf/qtest/qpdf/lin-special.preserve.exp create mode 100644 qpdf/qtest/qpdf/lin0.out create mode 100644 qpdf/qtest/qpdf/lin0.pdf create mode 100644 qpdf/qtest/qpdf/lin1.out create mode 100644 qpdf/qtest/qpdf/lin1.pdf create mode 100644 qpdf/qtest/qpdf/lin2.out create mode 100644 qpdf/qtest/qpdf/lin2.pdf create mode 100644 qpdf/qtest/qpdf/lin3.out create mode 100644 qpdf/qtest/qpdf/lin3.pdf create mode 100644 qpdf/qtest/qpdf/lin4.out create mode 100644 qpdf/qtest/qpdf/lin4.pdf create mode 100644 qpdf/qtest/qpdf/lin5.out create mode 100644 qpdf/qtest/qpdf/lin5.pdf create mode 100644 qpdf/qtest/qpdf/lin6.out create mode 100644 qpdf/qtest/qpdf/lin6.pdf create mode 100644 qpdf/qtest/qpdf/lin7.out create mode 100644 qpdf/qtest/qpdf/lin7.pdf create mode 100644 qpdf/qtest/qpdf/lin8.out create mode 100644 qpdf/qtest/qpdf/lin8.pdf create mode 100644 qpdf/qtest/qpdf/lin9.out create mode 100644 qpdf/qtest/qpdf/lin9.pdf create mode 100644 qpdf/qtest/qpdf/misc-1.out create mode 100644 qpdf/qtest/qpdf/misc-1.pdf create mode 100644 qpdf/qtest/qpdf/misc-2.out create mode 100644 qpdf/qtest/qpdf/misc-2.pdf create mode 100644 qpdf/qtest/qpdf/misc-3.out create mode 100644 qpdf/qtest/qpdf/misc-3.pdf create mode 100755 qpdf/qtest/qpdf/multiple-mods.pdf create mode 100644 qpdf/qtest/qpdf/object-stream.1.check create mode 100644 qpdf/qtest/qpdf/object-stream.10.check create mode 100644 qpdf/qtest/qpdf/object-stream.11.check create mode 100644 qpdf/qtest/qpdf/object-stream.12.check create mode 100644 qpdf/qtest/qpdf/object-stream.2.check create mode 100644 qpdf/qtest/qpdf/object-stream.3.check create mode 100644 qpdf/qtest/qpdf/object-stream.4.check create mode 100644 qpdf/qtest/qpdf/object-stream.5.check create mode 100644 qpdf/qtest/qpdf/object-stream.6.check create mode 100644 qpdf/qtest/qpdf/object-stream.7.check create mode 100644 qpdf/qtest/qpdf/object-stream.8.check create mode 100644 qpdf/qtest/qpdf/object-stream.9.check create mode 100644 qpdf/qtest/qpdf/object-stream.disable.exp create mode 100644 qpdf/qtest/qpdf/object-stream.generate.exp create mode 100644 qpdf/qtest/qpdf/object-stream.pdf create mode 100644 qpdf/qtest/qpdf/object-stream.preserve.exp create mode 100644 qpdf/qtest/qpdf/old-and-complex.pdf create mode 100644 qpdf/qtest/qpdf/p1-a-p2-a.pdf create mode 100644 qpdf/qtest/qpdf/p1-a-p2-b.pdf create mode 100644 qpdf/qtest/qpdf/p1-a.pdf create mode 100644 qpdf/qtest/qpdf/p1-b.pdf create mode 100644 qpdf/qtest/qpdf/show-page-1-content-filtered.out create mode 100644 qpdf/qtest/qpdf/show-page-1-content-normalized.out create mode 100644 qpdf/qtest/qpdf/show-page-1-content-raw.out create mode 100644 qpdf/qtest/qpdf/show-page-1-image.out create mode 100644 qpdf/qtest/qpdf/show-page-1.out create mode 100644 qpdf/qtest/qpdf/show-pages-images.out create mode 100644 qpdf/qtest/qpdf/show-pages.out create mode 100644 qpdf/qtest/qpdf/show-unfilterable.out create mode 100644 qpdf/qtest/qpdf/show-xref-by-id-filtered.out create mode 100644 qpdf/qtest/qpdf/show-xref-by-id.out create mode 100644 qpdf/qtest/qpdf/show-xref.out create mode 100644 qpdf/qtest/qpdf/test4-1.pdf create mode 100644 qpdf/qtest/qpdf/test4-1.qdf create mode 100644 qpdf/qtest/qpdf/test4-2.out create mode 100644 qpdf/qtest/qpdf/test4-2.pdf create mode 100644 qpdf/qtest/qpdf/test4-3.out create mode 100644 qpdf/qtest/qpdf/test4-3.pdf create mode 100644 qpdf/qtest/qpdf/test4-4.pdf create mode 100644 qpdf/qtest/qpdf/test4-4.qdf create mode 100644 qpdf/test_driver.cc create mode 100644 qtest/QTC/perl/QTC.pm create mode 100644 qtest/README.txt create mode 100755 qtest/bin/qtest-driver create mode 100644 qtest/module/TestDriver.pm create mode 100644 zlib-flate/Makefile create mode 100644 zlib-flate/build.mk create mode 100644 zlib-flate/qtest/1.compressed create mode 100644 zlib-flate/qtest/1.uncompressed create mode 100644 zlib-flate/qtest/zf.test create mode 100644 zlib-flate/zlib-flate.cc diff --git a/Artistic-2.0 b/Artistic-2.0 new file mode 100644 index 00000000..bb2cfbd2 --- /dev/null +++ b/Artistic-2.0 @@ -0,0 +1,191 @@ +Artistic License 2.0 + +Copyright (c) 2000-2006, The Perl Foundation. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +Preamble + +This license establishes the terms under which a given free software +Package may be copied, modified, distributed, and/or +redistributed. The intent is that the Copyright Holder maintains some +artistic control over the development of that Package while still +keeping the Package available as open source and free software. + +You are always permitted to make arrangements wholly outside of this +license directly with the Copyright Holder of a given Package. If the +terms of this license do not permit the full use that you propose to +make of the Package, you should contact the Copyright Holder and seek +a different licensing arrangement. + +Definitions + + "Copyright Holder" means the individual(s) or organization(s) named + in the copyright notice for the entire Package. + + "Contributor" means any party that has contributed code or other + material to the Package, in accordance with the Copyright Holder's + procedures. + + "You" and "your" means any person who would like to copy, + distribute, or modify the Package. + + "Package" means the collection of files distributed by the + Copyright Holder, and derivatives of that collection and/or of + those files. A given Package may consist of either the Standard + Version, or a Modified Version. + + "Distribute" means providing a copy of the Package or making it + accessible to anyone else, or in the case of a company or + organization, to others outside of your company or organization. + + "Distributor Fee" means any fee that you charge for Distributing + this Package or providing support for this Package to another + party. It does not mean licensing fees. + + "Standard Version" refers to the Package if it has not been + modified, or has been modified only in ways explicitly requested by + the Copyright Holder. + + "Modified Version" means the Package, if it has been changed, and + such changes were not explicitly requested by the Copyright Holder. + + "Original License" means this Artistic License as Distributed with + the Standard Version of the Package, in its current version or as + it may be modified by The Perl Foundation in the future. + + "Source" form means the source code, documentation source, and + configuration files for the Package. + + "Compiled" form means the compiled bytecode, object code, binary, + or any other form resulting from mechanical transformation or + translation of the Source form. + +Permission for Use and Modification Without Distribution + +(1) You are permitted to use the Standard Version and create and use +Modified Versions for any purpose without restriction, provided that +you do not Distribute the Modified Version. + +Permissions for Redistribution of the Standard Version + +(2) You may Distribute verbatim copies of the Source form of the +Standard Version of this Package in any medium without restriction, +either gratis or for a Distributor Fee, provided that you duplicate +all of the original copyright notices and associated disclaimers. At +your discretion, such verbatim copies may or may not include a +Compiled form of the Package. + +(3) You may apply any bug fixes, portability changes, and other +modifications made available from the Copyright Holder. The resulting +Package will still be considered the Standard Version, and as such +will be subject to the Original License. + +Distribution of Modified Versions of the Package as Source + +(4) You may Distribute your Modified Version as Source (either gratis +or for a Distributor Fee, and with or without a Compiled form of the +Modified Version) provided that you clearly document how it differs +from the Standard Version, including, but not limited to, documenting +any non-standard features, executables, or modules, and provided that +you do at least ONE of the following: + + (a) make the Modified Version available to the Copyright Holder of + the Standard Version, under the Original License, so that the + Copyright Holder may include your modifications in the Standard + Version. + + (b) ensure that installation of your Modified Version does not + prevent the user installing or running the Standard Version. In + addition, the Modified Version must bear a name that is different + from the name of the Standard Version. + + (c) allow anyone who receives a copy of the Modified Version to + make the Source form of the Modified Version available to others + under + + (i) the Original License or + + (ii) a license that permits the licensee to freely copy, modify + and redistribute the Modified Version using the same licensing + terms that apply to the copy that the licensee received, and + requires that the Source form of the Modified Version, and of + any works derived from it, be made freely available in that + license fees are prohibited but Distributor Fees are allowed. + Distribution of Compiled Forms of the Standard Version or + Modified Versions without the Source + +(5) You may Distribute Compiled forms of the Standard Version without +the Source, provided that you include complete instructions on how to +get the Source of the Standard Version. Such instructions must be +valid at the time of your distribution. If these instructions, at any +time while you are carrying out such distribution, become invalid, you +must provide new instructions on demand or cease further +distribution. If you provide valid instructions or cease distribution +within thirty days after you become aware that the instructions are +invalid, then you do not forfeit any of your rights under this +license. + +(6) You may Distribute a Modified Version in Compiled form without the +Source, provided that you comply with Section 4 with respect to the +Source of the Modified Version. + +Aggregating or Linking the Package + +(7) You may aggregate the Package (either the Standard Version or +Modified Version) with other packages and Distribute the resulting +aggregation provided that you do not charge a licensing fee for the +Package. Distributor Fees are permitted, and licensing fees for other +components in the aggregation are permitted. The terms of this license +apply to the use and Distribution of the Standard or Modified Versions +as included in the aggregation. + +(8) You are permitted to link Modified and Standard Versions with +other works, to embed the Package in a larger work of your own, or to +build stand-alone binary or bytecode versions of applications that +include the Package, and Distribute the result without restriction, +provided the result does not expose a direct interface to the Package. + +Items That are Not Considered Part of a Modified Version + +(9) Works (including, but not limited to, modules and scripts) that +merely extend or make use of the Package, do not, by themselves, cause +the Package to be a Modified Version. In addition, such works are not +considered parts of the Package itself, and are not subject to the +terms of this license. + +General Provisions + +(10) Any use, modification, and distribution of the Standard or +Modified Versions is governed by this Artistic License. By using, +modifying or distributing the Package, you accept this license. Do not +use, modify, or distribute the Package, if you do not accept this +license. + +(11) If your Modified Version has been derived from a Modified Version +made by someone other than you, you are nevertheless required to +ensure that your Modified Version complies with the requirements of +this license. + +(12) This license does not grant you the right to use any trademark, +service mark, tradename, or logo of the Copyright Holder. + +(13) This license includes the non-exclusive, worldwide, +free-of-charge patent license to make, have made, use, offer to sell, +sell, import and otherwise transfer the Package with respect to any +patent claims licensable by the Copyright Holder that are necessarily +infringed by the Package. If you institute patent litigation +(including a cross-claim or counterclaim) against any party alleging +that the Package constitutes direct or contributory patent +infringement, then this Artistic License to you shall terminate on the +date that such litigation is filed. + +(14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT +HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED +WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT +PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT +HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE +OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..6e527002 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,3 @@ +2008-04-26 Jay Berkenbilt + + * 2.0: initial public release diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..afe32aaf --- /dev/null +++ b/INSTALL @@ -0,0 +1,216 @@ +These instructions based on the generic INSTALL file from automake +1.10. However, qpdf does not use automake, so not all of that file +applies. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + You can also define the variable DESTDIR when you run make install +to install the package in a separate subdirectory. This is useful for +packaging. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..5f3db8b7 --- /dev/null +++ b/Makefile @@ -0,0 +1,144 @@ + +# This makefile is inspired by abuild (http://www.abuild.org), which +# was used during the development of qpdf. The goal here is to have a +# non-recursive build with all the proper dependencies so we can start +# the build from anywhere and get the right stuff. Each directory has +# a build.mk that is included from here and is written from this +# directory's perspective. Each directory also has a proxy Makefile +# that allows you to start the build from any directory and get +# reasonable semantics for the all, check, and clean targets. + +# Our "build items" are directories. They are listed here such that +# no item precedes any item it depends on. Therefore, each item can +# safely reference variables set in its predecessors. + +# For each build item B, you can run make build_B, make check_B, or +# make clean_B to build, test, or clean B. Full dependencies are +# represented across all the items, so it is possible to start +# anywhere. From the top level, the "all", "check", and "clean" +# targets build, test, or clean everything. + +# Although this is not a GNU package and does not use automake, you +# can still run make clean to remove everything that is compiled, make +# distclean to remove everything that is generated by the end user, +# and make maintainer-clean to remove everything that is generated +# including things distributed with the source distribution. You can +# pass CLEAN=1 to prevent this Makefile from complaining if +# ./configure has not been run. + +# The install target works as usual and obeys --prefix and so forth +# passed to ./configure. You can also pass DESTDIR=/dir to make +# install to install in a separate location. This is useful for +# packagers. + +BUILD_ITEMS = manual libqpdf zlib-flate libtests qpdf examples +OUTPUT_DIR = build +ALL_TARGETS = + +.PHONY: default +default: all + +CLEAN ?= +ifneq ($(CLEAN),1) +ifeq ($(words $(wildcard autoconf.mk)),0) +DUMMY := $(shell echo 1>&2) +DUMMY := $(shell echo 1>&2 Please run ./configure before running $(MAKE)) +DUMMY := $(shell echo 1>&2) +$(error unable to continue with build) +endif + +autoconf.mk: + +include autoconf.mk + +endif + +# Prevent gnu make from trying to rebuild .dep files +$(foreach B,$(BUILD_ITEMS),$(eval \ + $(B)/$(OUTPUT_DIR)/%.dep: ;)) + +# Prevent gnu make from trying to rebuild .mk files +$(foreach B,$(BUILD_ITEMS),$(eval \ + $(B)/%.mk: ;)) +%.mk: ; +make/%.mk: ; + +include make/rules.mk + +DUMMY := $(shell mkdir $(foreach B,$(BUILD_ITEMS),$(B)/$(OUTPUT_DIR)) 2>/dev/null) + +include $(foreach B,$(BUILD_ITEMS),$(B)/build.mk) + +ALL_TARGETS = $(foreach B,$(BUILD_ITEMS),$(TARGETS_$(B))) + +TEST_ITEMS = $(foreach D,\ + $(wildcard $(foreach B,$(BUILD_ITEMS),$(B)/qtest)),\ + $(subst /,,$(dir $(D)))) + +TEST_TARGETS = $(foreach B,$(TEST_ITEMS),check_$(B)) + +CLEAN_TARGETS = $(foreach B,$(BUILD_ITEMS),clean_$(B)) + +# For test suitse +export QPDF_BIN = $(abspath qpdf/$(OUTPUT_DIR)/qpdf) +export SKIP_TEST_COMPARE_IMAGES + +clean: $(CLEAN_TARGETS) + +.PHONY: $(CLEAN_TARGETS) +$(foreach B,$(BUILD_ITEMS),$(eval \ + clean_$(B): ; \ + $(RM) -r $(B)/$(OUTPUT_DIR))) + +distclean: clean + $(RM) -r autoconf.mk autom4te.cache config.log config.status libtool + $(RM) manual/html.xsl + $(RM) manual/print.xsl + $(RM) doc/*.1 + +maintainer-clean: distclean + $(RM) configure doc/qpdf-manual.* + +.PHONY: $(TEST_TARGETS) +$(foreach B,$(TEST_ITEMS),$(eval \ + check_$(B): $(TARGETS_$(B)))) + +.PHONY: $(foreach B,$(BUILD_ITEMS),build_$(B)) +$(foreach B,$(BUILD_ITEMS),$(eval \ + build_$(B): $(TARGETS_$(B)))) + +.PHONY: all +all: $(ALL_TARGETS) ; + +check: $(TEST_TARGETS) + +install_docs:: +install: all + ./mkinstalldirs $(DESTDIR)$(libdir) + ./mkinstalldirs $(DESTDIR)$(bindir) + ./mkinstalldirs $(DESTDIR)$(includedir)/qpdf + ./mkinstalldirs $(DESTDIR)$(docdir) + ./mkinstalldirs $(DESTDIR)$(mandir)/man1 + $(LIBTOOL) --mode=install install -s -c \ + libqpdf/$(OUTPUT_DIR)/libqpdf.la \ + $(DESTDIR)$(libdir)/libqpdf.la + $(LIBTOOL) --finish $(DESTDIR)$(libdir) + $(LIBTOOL) --mode=install install -s -c \ + qpdf/$(OUTPUT_DIR)/qpdf \ + $(DESTDIR)$(bindir)/qpdf + $(LIBTOOL) --mode=install install -s -c \ + zlib-flate/$(OUTPUT_DIR)/zlib-flate \ + $(DESTDIR)$(bindir)/zlib-flate + cp qpdf/fix-qdf $(DESTDIR)$(bindir) + cp include/qpdf/*.hh $(DESTDIR)$(includedir)/qpdf + cp doc/stylesheet.css $(DESTDIR)$(docdir) + cp doc/qpdf-manual.html $(DESTDIR)$(docdir) + cp doc/qpdf-manual.pdf $(DESTDIR)$(docdir) + cp doc/*.1 $(DESTDIR)$(mandir)/man1 + +QTEST=$(abspath qtest/bin/qtest-driver) +$(TEST_TARGETS): + @echo running qtest-driver for $(subst check_,,$@) + @(cd $(subst check_,,$@)/$(OUTPUT_DIR); \ + TC_SRCS="$(foreach T,$(TC_SRCS_$(subst check_,,$@)),../../$(T))" \ + $(QTEST) -bindirs .:.. -datadir ../qtest -covdir ..) diff --git a/README b/README new file mode 100644 index 00000000..ea947b9f --- /dev/null +++ b/README @@ -0,0 +1,32 @@ +This is the QPDF package. Information about it can be found at +http://qpdf.qbilt.org. + +QPDF is copyright (c) 2005-2008 Jay Berkenbilt + +This software may be distributed under the terms of version 2 of the +Artistic License which may be found in the source distribution as +"Artistic-2.0". It is provided "as is" without express or implied +warranty. + +To install this software, you can run + +./configure +make +make install + +For more detailed information, see the "INSTALL" in this directory. + +The QPDF package provides some executables and a software library. A +user's manual can be found in the "doc" directory. The docbook +sources to the user's manual can be found in the "manual" directory. + +The software library is just libqpdf, and all the header files are in +the qpdf subdirectory. If you link with -lqpdf and your system does +not know how to read libtool .la files, then you will also need to +link with -lpcre and -lz. + +To learn about using the library, please read comments in the header +files in include/qpdf, especially QPDF.hh, QPDFObjectHandle.hh, and +QPDFWriter.hh. You can also study the code of qpdf/qpdf.cc, which +exercises most of the public interface. There are additional example +programs in the examples directory. diff --git a/README.maintainer b/README.maintainer new file mode 100644 index 00000000..49e6a175 --- /dev/null +++ b/README.maintainer @@ -0,0 +1,69 @@ +Release Reminders +================= + + * To create a source release, do an export from the version control + system to a directory called qpdf-version. From the parent of that + directory, run make_dist with the directory as an argument. For + internally testing releases, you can run make_dist with the + --no-tests option. + + * Make sure version numbers are consistent in the following + locations: + + configure.ac + qpdf.spec + qpdf/qpdf.cc + manual/qpdf-manual.xml + + make_dist does this automatically. + + * Each year, update copyright notices. Just search for Copyright. + Last updated: 2008. + + * To construct a source distribution from a pristine checkout, + make_release does the following. + + autoconf + ./configure --enable-doc-maintenance + make build_manual + make distclean + + * Remember to update documentation in the "files" subdirectory of the + website on sourceforge.net. + +General Build Stuff +=================== + +QPDF supports autoconf and libtool but does not use automake. In +addition, there is no header file generated by autoconf. The only +file distributed with the qpdf source distribution that is not a +controlled file is "configure", and it is generated by just running +"autoconf". There is no need to run autoreconf, automake, autoheader, +aclocal, or any other autotools programs beyond autoconf. + +A small handful of additional files have been taken from autotools +programs. These should probably be updated from time to time. + + * config.guess, config.sub, ltmain.sh: these were created by running + libtoolize -c. To update, run libtoolize -f -c or remove the files + and rerun libtoolize. + + * Other files copied as indicated: + + cp /usr/share/aclocal/libtool.m4 aclocal.m4 + cp /usr/share/automake-1.10/install-sh . + cp /usr/share/automake-1.10/mkinstalldirs . + +The entire contents of aclocal.m4 came from libtool.m4. If we had +some additional local parts, we could manually combine them or we +could run aclocal. For now, the simple copy statement above is +sufficient. + +If building or editing documentation, configure with +--enable-doc-maintenance. This will ensure that all tools or files +required to validate and build documentation are available. + +If you want to run make maintainer-clean or make distclean and you +haven't run ./configure, you can pass CLEAN=1 to make on the command +line to prevent it from complaining about configure not having been +run. diff --git a/TODO b/TODO new file mode 100644 index 00000000..d705187e --- /dev/null +++ b/TODO @@ -0,0 +1,68 @@ +General +======= + + * See whether we can do anything with /V > 3 in the encryption + dictionary. (V = 4 is Crypt Filters.) + + * The second xref stream for linearized files has to be padded only + because we need file_size as computed in pass 1 to be accurate. If + we were not allowing writing to a pipe, we could seek back to the + beginning and fill in the value of /L in the linearization + dictionary as an optimization to alleviate the need for this + padding. Doing so would require us to pad the /L value + individually and also to save the file descriptor and determine + whether it's seekable. This is probably not worth bothering with. + + * The whole xref handling code in the QPDF object allows the same + object with more than one generation to coexist, but a lot of logic + assumes this isn't the case. Anything that creates mappings only + with the object number and not the generation is this way, + including most of the interaction between QPDFWriter and QPDF. If + we wanted to allow the same object with more than one generation to + coexist, which I'm not sure is allowed, we could fix this by + changing xref_table. Alternatively, we could detect and disallow + that case. In fact, it appears that Adobe reader and other PDF + viewing software silently ignores objects of this type, so this is + probably not a big deal. + + * Pl_PNGFilter is only partially implemented. If we ever decoded + images, we'd have to finish implementing it along with the other + filter decode parameters and types. For just handling xref + streams, there's really no need as it wouldn't make sense to use + any kind of predictor other than 12 (PNG UP filter). + + * If we ever want to have check mode check the integrity of the free + list, this can be done by looking at the code from prior to the + object stream support of 4/5/2008. It's in an if (0) block and + there's a comment about it. There's also something about it in + qpdf.test -- search for "free table". On the other hand, the value + of doing this seems very low since no viewer seems to care, so it's + probably not worth it. + + * Embedded files streams: figure out why running qpdf over the pdf + 1.7 spec results in a file that crashes acrobat reader when you try + to save nested documents. + + * QPDFObjectHandle::getPageImages() doesn't notice images in + inherited resource dictionaries. See comments in that function. + +Splitting by Pages +================== + +Although qpdf does not currently support splitting a file into pages, +the work done for linearization covers almost all the work. To do +page splitting. If this functionality is needed, study +obj_user_to_objects and object_to_obj_users created in +QPDF_optimization for ideas. It's quite possible that the information +computed by calculateLinearizationData is actually sufficient to do +page splitting in many circumstances. That code knows which objects +are used by which pages, though it doesn't do anything page-specific +with outlines, thumbnails, page labels, or anything else. + +Another approach would be to traverse only pages that are being output +taking care not to traverse into the pages tree, and then to fabricate +a new pages tree. + +Either way, care must be taken to handle other things such as +outlines, page labels, thumbnails, threads, etc. in a sensible way. +This may include simply omitting information other than page content. diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000..cfa57323 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,6672 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, +## 2008 Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This file is free software; the Free Software Foundation gives +## unlimited permission to copy and/or distribute it, with or without +## modifications, as long as this notice is preserved. + +# serial 52 Debian 1.5.26-1 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +_LT_REQUIRED_DARWIN_CHECKS + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# -------------------------- +# Check for some things on darwin +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[0123]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac +]) + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +m4_if($1,[],[ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognize shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognize a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) +case " $_LT_AC_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac +])# AC_LIBTOOL_POSTDEP_PREDEP + +# AC_LIBTOOL_LANG_F77_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) +AC_DEFUN([_LT_AC_LANG_F77_CONFIG], +[AC_REQUIRE([AC_PROG_F77]) +AC_LANG_PUSH(Fortran 77) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + return + end +" + +# Code to be used in simple link tests +lt_simple_link_test_code="\ + program t + end +" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +_LT_AC_TAGVAR(GCC, $1)="$G77" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) +AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], +[AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# ------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) +AC_DEFUN([_LT_AC_LANG_RC_CONFIG], +[AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +AC_DEFUN([AC_LIBTOOL_CONFIG], +[# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + _LT_AC_TAGVAR(compiler, $1) \ + _LT_AC_TAGVAR(CC, $1) \ + _LT_AC_TAGVAR(LD, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ + _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ + _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ + _LT_AC_TAGVAR(old_archive_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ + _LT_AC_TAGVAR(predep_objects, $1) \ + _LT_AC_TAGVAR(postdep_objects, $1) \ + _LT_AC_TAGVAR(predeps, $1) \ + _LT_AC_TAGVAR(postdeps, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ + _LT_AC_TAGVAR(archive_cmds, $1) \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ + _LT_AC_TAGVAR(postinstall_cmds, $1) \ + _LT_AC_TAGVAR(postuninstall_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ + _LT_AC_TAGVAR(allow_undefined_flag, $1) \ + _LT_AC_TAGVAR(no_undefined_flag, $1) \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ + _LT_AC_TAGVAR(hardcode_automatic, $1) \ + _LT_AC_TAGVAR(module_cmds, $1) \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) \ + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ + _LT_AC_TAGVAR(fix_srcfile_path, $1) \ + _LT_AC_TAGVAR(exclude_expsyms, $1) \ + _LT_AC_TAGVAR(include_expsyms, $1); do + + case $var in + _LT_AC_TAGVAR(old_archive_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ + _LT_AC_TAGVAR(archive_cmds, $1) | \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(module_cmds, $1) | \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\[$]0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` + ;; + esac + +ifelse([$1], [], + [cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + AC_MSG_NOTICE([creating $ofile])], + [cfgfile="$ofile"]) + + cat <<__EOF__ >> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([LT_AC_PROG_SED]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=no + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + + +# Cheap backport of AS_EXECUTABLE_P and required macros +# from Autoconf 2.59; we should not use $as_executable_p directly. + +# _AS_TEST_PREPARE +# ---------------- +m4_ifndef([_AS_TEST_PREPARE], +[m4_defun([_AS_TEST_PREPARE], +[if test -x / >/dev/null 2>&1; then + as_executable_p='test -x' +else + as_executable_p='test -f' +fi +])])# _AS_TEST_PREPARE + +# AS_EXECUTABLE_P +# --------------- +# Check whether a file is executable. +m4_ifndef([AS_EXECUTABLE_P], +[m4_defun([AS_EXECUTABLE_P], +[AS_REQUIRE([_AS_TEST_PREPARE])dnl +$as_executable_p $1[]dnl +])])# AS_EXECUTABLE_P + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +]) diff --git a/autoconf.mk.in b/autoconf.mk.in new file mode 100644 index 00000000..eb213ff2 --- /dev/null +++ b/autoconf.mk.in @@ -0,0 +1,30 @@ +PACKAGE_TARNAME=@PACKAGE_TARNAME@ +PACKAGE_VERSION=@PACKAGE_VERSION@ +top_builddir=@top_builddir@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +libdir=@libdir@ +includedir=@includedir@ +datarootdir=@datarootdir@ +mandir=@mandir@ +docdir=@docdir@ +htmldir=@htmldir@ +pdfdir=@pdfdir +CC=@CC@ +CFLAGS=@CFLAGS@ +LDFLAGS=@LDFLAGS@ +LIBS=@LIBS@ +CPPFLAGS=@CPPFLAGS@ +CXX=@CXX@ +CXXFLAGS=@CXXFLAGS@ +GENDEPS=@GENDEPS@ +LIBTOOL=@LIBTOOL@ +DOCBOOKX_DTD=@DOCBOOKX_DTD@ +FOP=@FOP@ +XSLTPROC=@XSLTPROC@ +XMLLINT=@XMLLINT@ +BUILD_HTML=@BUILD_HTML@ +BUILD_PDF=@BUILD_PDF@ +VALIDATE_DOC=@VALIDATE_DOC@ +SKIP_TEST_COMPARE_IMAGES=@SKIP_TEST_COMPARE_IMAGES@ diff --git a/config.guess b/config.guess new file mode 100755 index 00000000..f32079ab --- /dev/null +++ b/config.guess @@ -0,0 +1,1526 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2008-01-23' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.sub b/config.sub new file mode 100755 index 00000000..6759825a --- /dev/null +++ b/config.sub @@ -0,0 +1,1658 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2008-01-16' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure.ac b/configure.ac new file mode 100644 index 00000000..b1c5e567 --- /dev/null +++ b/configure.ac @@ -0,0 +1,282 @@ +dnl Process this file with autoconf to produce a configure script. +dnl This config.in requires autoconf 2.5 or greater. + +AC_PREREQ(2.59) +AC_INIT(qpdf,2.0) + +dnl No AC_CONFIG_HEADERS. If this changes, update README.maintainer. +AC_CONFIG_FILES([autoconf.mk]) +AC_CONFIG_FILES([manual/html.xsl manual/print.xsl]) + +AC_PROG_CC +AC_PROG_CXX +AC_HEADER_STDC +AC_PROG_LIBTOOL + +AC_CHECK_HEADER(zlib.h,,[MISSING_ZLIB_H=1; MISSING_ANY=1]) +AC_SEARCH_LIBS(deflate,z zlib,,[MISSING_ZLIB=1; MISSING_ANY=1]) +AC_CHECK_HEADER(pcre.h,,[MISSING_PCRE_H=1; MISSING_ANY=1]) +AC_SEARCH_LIBS(pcre_compile,pcre,,[MISSING_PCRE=1; MISSING_ANY=1]) + +AC_MSG_CHECKING(for gnu make >= 3.81) +make_okay=0 +if make --version >/dev/null 2>&1; then + v=`make --version | grep 'GNU Make' | sed -e 's/.*Make //'` + maj=`echo $v | cut -d. -f 1` + min=`echo $v | cut -d. -f 2` + if test $maj -gt 3 -o '(' $maj -eq 3 -a $min -ge 81 ')'; then + make_okay=1 + fi +fi +if test "$make_okay" = "1"; then + AC_MSG_RESULT(yes) +else + dnl Don't set MISSING_ANY=1 -- maybe user calls make something else + MISSING_MAKE_381=1 + ISSUE_WARNINGS=1 + AC_MSG_RESULT(no) +fi + +AC_SUBST(GENDEPS) +GENDEPS=0 +AC_MSG_CHECKING(for whether $CC supports -MD -MF x.dep -MP) +oCFLAGS=$CFLAGS +rm -f x.dep +CFLAGS="$CFLAGS -MD -MF x.dep -MP" +AC_TRY_COMPILE([#include ], [FILE* a = stdout], + qpdf_DEPFLAGS=yes, + qpdf_DEPFLAGS=no) +CFLAGS=$oCFLAGS +if test "$qpdf_DEPFLAGS" = "yes"; then + if ! grep stdio.h x.dep >/dev/null 2>&1; then + qpdf_DEPFLAGS=no + fi +fi +rm -f x.dep +if test "$qpdf_DEPFLAGS" = "yes"; then + AC_MSG_RESULT(yes) + GENDEPS=1 +else + AC_MSG_RESULT(no) +fi + +qpdf_USE_WALL=0 +AC_MSG_CHECKING(for whether $CC supports -Wall) +oCFLAGS=$CFLAGS +CFLAGS="$CFLAGS -Wall" +AC_TRY_COMPILE([], [int a = 1; int b = a; a = b;], + qpdf_USE_WALL=1, + qpdf_USE_WALL=0) +if test "$qpdf_USE_WALL" = "1"; then + AC_MSG_RESULT(yes) + CXXFLAGS="$CXXFLAGS -Wall" +else + AC_MSG_RESULT(no) + CFLAGS=$oCFLAGS +fi + +AC_MSG_CHECKING(for whether to use -Werror) +AC_ARG_ENABLE(werror, + AS_HELP_STRING([--enable-werror], + [whether to use werror (default is yes if -Wall works)]), + [if test "$enableval" = "yes"; then + qpdf_USE_WERROR=1; + else + qpdf_USE_WERROR=0; + fi], [qpdf_USE_WERROR=$qpdf_USE_WALL]) +if test "$qpdf_USE_WERROR" = "1"; then + AC_MSG_RESULT(yes) + CFLAGS="$CFLAGS -Werror" + CXXFLAGS="$CXXFLAGS -Werror" +else + AC_MSG_RESULT(no) +fi + +AC_SUBST(SKIP_TEST_COMPARE_IMAGES) +AC_ARG_ENABLE(test-compare-images, + AS_HELP_STRING([--enable-test-compare-images], + [whether to compare images in test suite; enabled by default, enabling requires ghostscript and tiffcmp to be available]), + [if test "$enableval" = "no"; then + SKIP_TEST_COMPARE_IMAGES=1 + else + SKIP_TEST_COMPARE_IMAGES=0 + fi], + [SKIP_TEST_COMPARE_IMAGES=0]) + +AC_ARG_WITH(docbook-xsl, + AS_HELP_STRING([--with-docbook-xsl=DIR], + [location of docbook 4.x xml stylesheets]), + [DOCBOOK_XSL=$withval], + [DOCBOOK_XSL=/usr/share/xml/docbook/stylesheet/nwalsh]) + +DOCBOOK_XHTML= +AC_SUBST(DOCBOOK_XHTML) +AC_MSG_CHECKING(for xml to xhtml docbook stylesheets) +if test -f "$DOCBOOK_XSL/xhtml/docbook.xsl"; then + DOCBOOK_XHTML="$DOCBOOK_XSL/xhtml/docbook.xsl" + AC_MSG_RESULT($DOCBOOK_XHTML) +else + AC_MSG_RESULT(no) +fi +DOCBOOK_FO= +AC_SUBST(DOCBOOK_FO) +AC_MSG_CHECKING(for xml to fo docbook stylesheets) +if test -f "$DOCBOOK_XSL/fo/docbook.xsl"; then + DOCBOOK_FO="$DOCBOOK_XSL/fo/docbook.xsl" + AC_MSG_RESULT($DOCBOOK_FO) +else + AC_MSG_RESULT(no) +fi + +DOCBOOKX_DTD= +AC_SUBST(DOCBOOKX_DTD) +AC_ARG_WITH(docbookx-dtd, + AS_HELP_STRING([--with-docbookx-dtd=FILE], + [location of docbook 4.x xml DTD]), + [DOCBOOKX_DTD=$withval], + [DOCBOOKX_DTD=/usr/share/xml/docbook/schema/dtd/4/docbookx.dtd]) +AC_MSG_CHECKING(for docbook 4.x xml DTD) +if test -f "$DOCBOOKX_DTD"; then + AC_MSG_RESULT($DOCBOOKX_DTD) +else + AC_MSG_RESULT(no) +fi + +AC_CHECK_PROG(FOP,fop,fop,[]) +AC_CHECK_PROG(XSLTPROC,xsltproc,xsltproc,[]) +AC_CHECK_PROG(XMLLINT,xmllint,xmllint,[]) + +AC_ARG_ENABLE(doc-maintenance, + AS_HELP_STRING([--enable-doc-maintenance], + [if set, enables all documentation options]), + [if test "$enableval" = "yes"; then + doc_default=1; + else + doc_default=0; + fi], + [doc_default=0]) + +BUILD_HTML=0 +AC_SUBST(BUILD_HTML) +AC_ARG_ENABLE(html-doc, + AS_HELP_STRING([--enable-html-doc], + [whether to build HTML documents]), + [if test "$enableval" = "yes"; then + BUILD_HTML=1; + else + BUILD_HTML=0; + fi], + [BUILD_HTML=$doc_default]) +BUILD_PDF=0 +AC_SUBST(BUILD_PDF) +AC_ARG_ENABLE(pdf-doc, + AS_HELP_STRING([--enable-pdf-doc], + [whether to build PDF documents]), + [if test "$enableval" = "yes"; then + BUILD_PDF=1; + else + BUILD_PDF=0; + fi], + [BUILD_PDF=$doc_default]) +VALIDATE_DOC=0 +AC_SUBST(VALIDATE_DOC) +AC_ARG_ENABLE(validate-doc, + AS_HELP_STRING([--enable-validate-doc], + [whether to validate xml document source]), + [if test "$enableval" = "yes"; then + VALIDATE_DOC=1; + else + VALIDATE_DOC=0; + fi], + [VALIDATE_DOC=$doc_default]) + +if test "$VALIDATE_DOC" = "1"; then + if test "$XMLLINT" = ""; then + MISSING_XMLLINT=1 + MISSING_ANY=1 + fi +fi +if test "$BUILD_HTML" = "1"; then + if test "$XSLTPROC" = ""; then + MISSING_XSLTPROC=1 + MISSING_ANY=1 + fi + if test "$DOCBOOK_XHTML" = ""; then + MISSING_DOCBOOK_XHTML=1 + MISSING_ANY=1 + fi +fi +if test "$BUILD_PDF" = "1"; then + if test "$XSLTPROC" = ""; then + MISSING_XSLTPROC=1 + MISSING_ANY=1 + fi + if test "$DOCBOOK_FO" = ""; then + MISSING_DOCBOOK_FO=1 + MISSING_ANY=1 + fi + if test "$FOP" = ""; then + MISSING_FOP=1 + MISSING_ANY=1 + fi +fi + + +if test "$MISSING_ANY" = "1"; then + ISSUE_WARNINGS=1 +fi +if test "$ISSUE_WARNINGS" = "1"; then + echo "" + echo "" +fi + +if test "$MISSING_MAKE_381" = "1"; then + AC_MSG_WARN(gnu make >= 3.81 is required) +fi + +if test "$MISSING_ZLIB_H" = "1"; then + AC_MSG_WARN(unable to find required header zlib.h) +fi + +if test "$MISSING_ZLIB" = "1"; then + AC_MSG_WARN(unable to find required library z (or zlib)) +fi + +if test "$MISSING_PCRE_H" = "1"; then + AC_MSG_WARN(unable to find required header pcre.h) +fi + +if test "$MISSING_PCRE" = "1"; then + AC_MSG_WARN(unable to find required library pcre) +fi + +if test "$MISSING_DOCBOOK_FO" = "1"; then + AC_MSG_WARN(docbook fo stylesheets are required to build PDF documentation) +fi + +if test "$MISSING_DOCBOOK_XHTML" = "1"; then + AC_MSG_WARN(docbook xhmtl stylesheets are required to build HTML documentation) +fi + +if test "$MISSING_FOP" = "1"; then + AC_MSG_WARN(apache fop is required to build PDF documentation) +fi + +if test "$MISSING_XMLLINT" = "1"; then + AC_MSG_WARN(xmllint is required to validate documentation) +fi + +if test "$MISSING_XSLTPROC" = "1"; then + AC_MSG_WARN(xsltproc is required to build documentation) +fi + +if test "$ISSUE_WARNINGS" = "1"; then + echo "" + echo "" +fi + +if test "$MISSING_ANY" = "1"; then + AC_MSG_ERROR(some required prerequisites were not found) +fi + +AC_OUTPUT() diff --git a/doc/stylesheet.css b/doc/stylesheet.css new file mode 100644 index 00000000..abaf226f --- /dev/null +++ b/doc/stylesheet.css @@ -0,0 +1,284 @@ +/**************************************************************/ +/* Custom style-sheet for the QPDF manual in HTML form. */ +/**************************************************************/ + +/* + * This file is the CSS for the QPDF manual. It is based heavily on + * the CSS for the Subversion book. That file contains the following + * copyright and attribution: + * + * Copyright (c) 2003-2007 + * Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato. + * + * This work is licensed under the Creative Commons Attribution License. + * To view a copy of this license, visit + * http://creativecommons.org/licenses/by/2.0/ or send a letter to + * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, + * USA. + */ + +body +{ + background: white; + margin: 0.5in; +} + +p, li, ul, ol, dd, dt +{ + font-style: normal; + font-weight: normal; + color: black; +} + +tt, pre +{ + font-family: courier new,courier,fixed; +} + +a +{ + color: blue; + text-decoration: underline; +} + +a:hover +{ + background: rgb(75%,75%,100%); + color: blue; + text-decoration: underline; +} + +a:visited +{ + color: purple; + text-decoration: underline; +} + +img +{ + border: none; +} + +h1.title +{ + font-size: 250%; + font-style: normal; + font-weight: bold; + color: black; +} + +h2.subtitle +{ + font-size: 150%; + font-style: italic; + color: black; +} + +h2.title +{ + font-size: 150%; + font-style: normal; + font-weight: bold; + color: black; +} + +h3.title +{ + font-size: 125%; + font-style: normal; + font-weight: bold; + color: black; +} + +h4.title +{ + font-size: 100%; + font-style: normal; + font-weight: bold; + color: black; +} + +.toc b +{ + font-size: 125%; + font-style: normal; + font-weight: bold; + color: black; +} + +.screen, .programlisting, .literal +{ + font-family: courier new,courier,fixed; + font-style: normal; + font-weight: normal; +} + +.command, .option, .type +{ + font-family: courier new,courier,fixed; + font-style: normal; + font-weight: normal; +} + +.filename +{ + font-family: arial,helvetica,sans-serif; + font-style: italic; +} + +.property +{ + font-family: arial,helvetica,sans-serif; + font-weight: bold; +} + +.classname +{ + font-family: arial,helvetica,sans-serif; + font-weight: bold; + font-style: italic; +} + +.varname, .function, .envar +{ + font-family: arial,helvetica,sans-serif; + font-style: italic; +} + +.replaceable +{ + font-style: italic; + font-size: 100%; +} + +.figure, .example, .table +{ + margin: 0.125in 0.25in; +} + +.table table +{ + border-width: 1px; + border-style: solid; + border-color: black; + border-spacing: 0; + background: rgb(240,240,240); +} + +.table td +{ + border: none; + border-right: 1px black solid; + border-bottom: 1px black solid; + padding: 2px; +} + +.table th +{ + background: rgb(180,180,180); + border: none; + border-right: 1px black solid; + border-bottom: 1px black solid; + padding: 2px; +} + +.table p.title, .figure p.title, .example p.title +{ + text-align: left !important; + font-size: 100% !important; +} + +.author, .pubdate +{ + margin: 0; + font-size: 100%; + font-style: italic; + font-weight: normal; + color: black; +} + +.preface div.author, .preface .pubdate +{ + font-size: 80%; +} + +.sidebar +{ + border-top: dotted 1px black; + border-left: dotted 1px black; + border-right: solid 2px black; + border-bottom: solid 2px black; + background: rgb(240,220,170); + padding: 0 0.12in; + margin: 0.25in; +} + +.note .programlisting, .note .screen, +.tip .programlisting, .tip .screen, +.warning .programlisting, .warning .screen, +.sidebar .programlisting, .sidebar .screen +{ + border: none; + background: none; +} + +.sidebar p.title +{ + text-align: center; + font-size: 125%; +} + +.note +{ + border: black solid 1px; + background: url(./images/note.png) no-repeat rgb(252,246,220); + margin: 0.125in 0; + padding: 0 55px; +} + +.tip +{ + border: black solid 1px; + background: url(./images/tip.png) no-repeat rgb(224,244,255); + margin: 0.125in 0; + padding: 0 55px; +} + +.warning +{ + border: black solid 1px; + background: url(./images/warning.png) no-repeat rgb(255,210,210); + margin: 0.125in 0; + padding: 0 55px; +} + +/* +.note .title, .tip .title, .warning .title +{ + display: none; +} +*/ + +.programlisting, .screen +{ + font-size: 90%; + color: black; + margin: 1em 0.25in; + padding: 0.5em; + background: rgb(240,240,240); + border-top: black dotted 1px; + border-left: black dotted 1px; + border-right: black solid 2px; + border-bottom: black solid 2px; +} + +.navheader, .navfooter +{ + border: black solid 1px; + background: rgb(180,180,200); +} + +.navheader hr, .navfooter hr +{ + display: none; +} diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 00000000..90899055 --- /dev/null +++ b/examples/Makefile @@ -0,0 +1 @@ +include ../make/proxy.mk diff --git a/examples/build.mk b/examples/build.mk new file mode 100644 index 00000000..eab2744c --- /dev/null +++ b/examples/build.mk @@ -0,0 +1,26 @@ +BINS_examples = pdf-bookmarks pdf-mod-info pdf-npages + +TARGETS_examples = $(foreach B,$(BINS_examples),examples/$(OUTPUT_DIR)/$(B)) + +$(TARGETS_examples): $(TARGETS_qpdf) + +INCLUDES_examples = include + +TC_SRCS_examples = $(wildcard examples/*.cc) + +# ----- + +$(foreach B,$(BINS_examples),$(eval \ + OBJS_$(B) = $(call src_to_obj,examples/$(B).cc))) + +ifeq ($(GENDEPS),1) +-include $(foreach B,$(BINS_examples),$(call obj_to_dep,$(OBJS_$(B)))) +endif + +$(foreach B,$(BINS_examples),$(eval \ + $(OBJS_$(B)): examples/$(OUTPUT_DIR)/%.o: examples/$(B).cc ; \ + $(call compile,examples/$(B).cc,$(INCLUDES_examples)))) + +$(foreach B,$(BINS_examples),$(eval \ + examples/$(OUTPUT_DIR)/$(B): $(OBJS_$(B)) ; \ + $(call makebin,$(OBJS_$(B)),$$@))) diff --git a/examples/examples.testcov b/examples/examples.testcov new file mode 100644 index 00000000..5a19b7c5 --- /dev/null +++ b/examples/examples.testcov @@ -0,0 +1,19 @@ +pdf-bookmarks lines 0 +pdf-bookmarks numbers 0 +pdf-bookmarks none 0 +pdf-bookmarks has count 0 +pdf-bookmarks no count 0 +pdf-bookmarks open 0 +pdf-bookmarks closed 0 +pdf-bookmarks dest 0 +pdf-bookmarks targets 0 +pdf-mod-info --dump 0 +pdf-mod-info no in file 0 +pdf-mod-info in-place 0 +pdf-mod-info -key 0 +pdf-mod-info usage wrong val 0 +pdf-mod-info -val 0 +pdf-mod-info usage junk 0 +pdf-mod-info no keys 0 +pdf-mod-info has info 0 +pdf-mod-info file no info 0 diff --git a/examples/pdf-bookmarks.cc b/examples/pdf-bookmarks.cc new file mode 100644 index 00000000..98bff7fe --- /dev/null +++ b/examples/pdf-bookmarks.cc @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include + +static char const* whoami = 0; +static enum { st_none, st_numbers, st_lines } style = st_none; +static bool show_open = false; +static bool show_targets = false; +static std::map page_map; + +void usage() +{ + std::cerr << "Usage: " << whoami << " [options] file.pdf [password]" + << std::endl + << "Options:" << std::endl + << " -numbers give bookmarks outline-style numbers" + << std::endl + << " -lines draw lines to show bookmark hierarchy" + << std::endl + << " -show-open indicate whether a bookmark is initially open" + << std::endl + << " -show-targets show target if possible" + << std::endl; + exit(2); +} + +void print_lines(std::vector& numbers) +{ + for (unsigned int i = 0; i < numbers.size() - 1; ++i) + { + if (numbers[i]) + { + std::cout << "| "; + } + else + { + std::cout << " "; + } + } +} + +void generate_page_map(QPDF& qpdf) +{ + std::vector pages = qpdf.getAllPages(); + int n = 0; + for (std::vector::iterator iter = pages.begin(); + iter != pages.end(); ++iter) + { + QPDFObjectHandle& oh = *iter; + page_map[oh.getObjectID()] = ++n; + } +} + +void extract_bookmarks(QPDFObjectHandle outlines, std::vector& numbers) +{ + if (outlines.hasKey("/Title")) + { + // No default so gcc will warn on missing tag + switch (style) + { + case st_none: + QTC::TC("examples", "pdf-bookmarks none"); + break; + + case st_numbers: + QTC::TC("examples", "pdf-bookmarks numbers"); + for (std::vector::iterator iter = numbers.begin(); + iter != numbers.end(); ++iter) + { + std::cout << *iter << "."; + } + std::cout << " "; + break; + + case st_lines: + QTC::TC("examples", "pdf-bookmarks lines"); + print_lines(numbers); + std::cout << "|" << std::endl; + print_lines(numbers); + std::cout << "+-+ "; + break; + } + + if (show_open) + { + if (outlines.hasKey("/Count")) + { + QTC::TC("examples", "pdf-bookmarks has count"); + int count = outlines.getKey("/Count").getIntValue(); + if (count > 0) + { + // hierarchy is open at this point + QTC::TC("examples", "pdf-bookmarks open"); + std::cout << "(v) "; + } + else + { + QTC::TC("examples", "pdf-bookmarks closed"); + std::cout << "(>) "; + } + } + else + { + QTC::TC("examples", "pdf-bookmarks no count"); + std::cout << "( ) "; + } + } + + if (show_targets) + { + QTC::TC("examples", "pdf-bookmarks targets"); + std::string target = "unknown"; + // Only explicit destinations supported for now + if (outlines.hasKey("/Dest")) + { + QTC::TC("examples", "pdf-bookmarks dest"); + QPDFObjectHandle dest = outlines.getKey("/Dest"); + if ((dest.isArray()) && (dest.getArrayNItems() > 0)) + { + QPDFObjectHandle first = dest.getArrayItem(0); + int object_id = first.getObjectID(); + if (page_map.count(object_id)) + { + target = QUtil::int_to_string(page_map[object_id]); + } + } + + std::cout << "[ -> " << target << " ] "; + } + } + + std::cout << outlines.getKey("/Title").getUTF8Value() << std::endl; + } + + if (outlines.hasKey("/First")) + { + numbers.push_back(0); + QPDFObjectHandle child = outlines.getKey("/First"); + while (1) + { + ++(numbers.back()); + bool has_next = child.hasKey("/Next"); + if ((style == st_lines) && (! has_next)) + { + numbers.back() = 0; + } + extract_bookmarks(child, numbers); + if (has_next) + { + child = child.getKey("/Next"); + } + else + { + break; + } + } + numbers.pop_back(); + } +} + +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)) + { + std::cout << whoami << " version 1.5" << std::endl; + exit(0); + } + + int arg; + for (arg = 1; arg < argc; ++arg) + { + if (argv[arg][0] == '-') + { + if (strcmp(argv[arg], "-numbers") == 0) + { + style = st_numbers; + } + else if (strcmp(argv[arg], "-lines") == 0) + { + style = st_lines; + } + else if (strcmp(argv[arg], "-show-open") == 0) + { + show_open = true; + } + else if (strcmp(argv[arg], "-show-targets") == 0) + { + show_targets = true; + } + else + { + usage(); + } + } + else + { + break; + } + } + + if (arg >= argc) + { + usage(); + } + + char const* filename = argv[arg++]; + char const* password = ""; + + if (arg < argc) + { + password = argv[arg++]; + } + if (arg != argc) + { + usage(); + } + + try + { + QPDF qpdf; + qpdf.processFile(filename, password); + + QPDFObjectHandle root = qpdf.getRoot(); + if (root.hasKey("/Outlines")) + { + std::vector numbers; + if (show_targets) + { + generate_page_map(qpdf); + } + extract_bookmarks(root.getKey("/Outlines"), numbers); + } + else + { + std::cout << filename << " has no bookmarks" << std::endl; + } + } + catch (std::exception &e) + { + std::cerr << whoami << " processing file " << filename << ": " + << e.what() << std::endl; + exit(2); + } + + return 0; +} diff --git a/examples/pdf-mod-info.cc b/examples/pdf-mod-info.cc new file mode 100644 index 00000000..cd2bd034 --- /dev/null +++ b/examples/pdf-mod-info.cc @@ -0,0 +1,219 @@ +// Author: Vitaliy Pavlyuk + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static char const* version = "1.1"; +static char const* whoami = 0; + +void usage() +{ + std::cerr + << "Usage: " << whoami + << " -in in_file [-out out_file] [-key key [-val val]?]+\n" + << "Modifies/Adds/Removes PDF /Info entries in the in_file\n" + << "and stores the result in out_file\n" + << "Special mode: " << whoami << " --dump file\n" + << "dumps all /Info entries to stdout\n"; + exit(2); +} + +void dumpInfoDict(QPDF& pdf, + std::ostream& os = std::cout, + std::string const& sep = ":\t") +{ + QPDFObjectHandle trailer = pdf.getTrailer(); + if (trailer.hasKey("/Info")) + { + QPDFObjectHandle info = trailer.getKey("/Info"); + std::set keys = info.getKeys(); + for (std::set::const_iterator it = keys.begin(); + keys.end() != it; ++it) + { + QPDFObjectHandle elt = info.getKey(*it); + std::string val; + if (false) {} + else if (elt.isString()) + { + val = elt.getStringValue(); + } + else if (elt.isName()) + { + val = elt.getName(); + } + else // according to PDF Spec 1.5, shouldn't happen + { + val = elt.unparseResolved(); + } + os << it->substr(1) << sep << val << std::endl; // skip '/' + } + } +} + +void pdfDumpInfoDict(char const* fname) +{ + try + { + QPDF pdf; + pdf.processFile(fname); + dumpInfoDict(pdf); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + exit(2); + } +} + +int main(int argc, char* argv[]) +{ + + bool static_id = false; + std::map Keys; + + 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")) ) + { + std::cout << whoami << " version " << version << std::endl; + exit(0); + } + if ((argc == 4) && (! strcmp(argv[1], "--dump")) && + (strcmp(argv[2], "-in") == 0) ) + { + QTC::TC("examples", "pdf-mod-info --dump"); + pdfDumpInfoDict(argv[3]); + exit(0); + } + + char* fl_in = 0; + char* fl_out = 0; + char* cur_key = 0; + + for (int i = 1; i < argc; ++i) + { + if ((! strcmp(argv[i], "-in")) && (++i < argc)) + { + fl_in = argv[i]; + } + else if ((! strcmp(argv[i], "-out")) && (++i < argc)) + { + fl_out = argv[i]; + } + else if (! strcmp(argv[i], "--static-id")) // don't document + { + static_id = true; // this should be used in test suites only + } + else if ((! strcmp(argv[i], "-key")) && (++i < argc)) + { + QTC::TC("examples", "pdf-mod-info -key"); + cur_key = argv[i]; + Keys[cur_key] = ""; + } + else if ((! strcmp(argv[i], "-val")) && (++i < argc)) + { + if (cur_key == 0) + { + QTC::TC("examples", "pdf-mod-info usage wrong val"); + usage(); + } + QTC::TC("examples", "pdf-mod-info -val"); + Keys[cur_key] = argv[i]; + cur_key = 0; + } + else + { + QTC::TC("examples", "pdf-mod-info usage junk"); + usage(); + } + } + if (! fl_in) + { + QTC::TC("examples", "pdf-mod-info no in file"); + usage(); + } + if (! fl_out) + { + QTC::TC("examples", "pdf-mod-info in-place"); + fl_out = fl_in; + } + if (Keys.size() == 0) + { + QTC::TC("examples", "pdf-mod-info no keys"); + usage(); + } + + try + { + QPDF file; + file.processFile(fl_in); + + QPDFObjectHandle filetrailer = file.getTrailer(); + QPDFObjectHandle fileinfo; + + for (std::map::const_iterator it = + Keys.begin(); Keys.end() != it; ++it) + { + if (! fileinfo.isInitialized()) + { + if (filetrailer.hasKey("/Info")) + { + QTC::TC("examples", "pdf-mod-info has info"); + fileinfo = filetrailer.getKey("/Info"); + } + else + { + QTC::TC("examples", "pdf-mod-info file no info"); + std::map vacant; + fileinfo = fileinfo.newDictionary(vacant); + filetrailer.replaceKey("/Info", fileinfo); + } + } + if (it->second == "") + { + fileinfo.removeKey(it->first); + } + else + { + QPDFObjectHandle elt = fileinfo.newString(it->second); + elt.makeDirect(); + fileinfo.replaceKey(it->first, elt); + } + } + std::string fl_tmp = fl_out; + fl_tmp += ".tmp"; + QPDFWriter w(file, fl_tmp.c_str()); + w.setStreamDataMode(QPDFWriter::s_preserve); + w.setLinearization(true); + w.setStaticID(static_id); + w.write(); + QUtil::os_wrapper("rename " + fl_tmp + " " + std::string(fl_out), + rename(fl_tmp.c_str(), fl_out)); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + exit(2); + } + + return 0; +} diff --git a/examples/pdf-npages.cc b/examples/pdf-npages.cc new file mode 100644 index 00000000..53074d05 --- /dev/null +++ b/examples/pdf-npages.cc @@ -0,0 +1,61 @@ + + +#include +#include + +#include + +static char const* whoami = 0; + +void usage() +{ + std::cerr << "Usage: " << whoami << " filename" << std::endl + << "Prints the number of pages in filename" << std::endl; + exit(2); +} + +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)) + { + std::cout << whoami << " version 1.3" << std::endl; + exit(0); + } + + if (argc != 2) + { + usage(); + } + char const* filename = argv[1]; + + try + { + QPDF pdf; + pdf.processFile(filename); + QPDFObjectHandle root = pdf.getRoot(); + QPDFObjectHandle pages = root.getKey("/Pages"); + QPDFObjectHandle count = pages.getKey("/Count"); + std::cout << count.getIntValue() << std::endl; + } + catch (std::exception& e) + { + std::cerr << whoami << ": " << e.what() << std::endl; + exit(2); + } + + return 0; +} diff --git a/examples/qtest/bookmarks.test b/examples/qtest/bookmarks.test new file mode 100644 index 00000000..4cf4abcf --- /dev/null +++ b/examples/qtest/bookmarks.test @@ -0,0 +1,49 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("bookmarks"); + +require TestDriver; + +my $td = new TestDriver('pdf-bookmarks'); + +foreach my $show ("", " -show-open") +{ + foreach my $style ("", " -lines", " -numbers") + { + my $out = "test.$show.$style.out"; + $out =~ s/ //g; + $td->runtest("show:$show, style:$style", + {$td->COMMAND => "pdf-bookmarks $show $style 1.pdf"}, + {$td->FILE => $out, $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + } +} +$td->runtest("no bookmarks", + {$td->COMMAND => "pdf-bookmarks 2.pdf"}, + {$td->STRING => "2.pdf has no bookmarks\n", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("bad", + {$td->COMMAND => "pdf-bookmarks 3.pdf"}, + {$td->STRING => "pdf-bookmarks processing file 3.pdf: " . + "3.pdf: offset 0: not a PDF file\n", + $td->EXIT_STATUS => 2}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("encrypted, targets", + {$td->COMMAND => "pdf-bookmarks -show-targets 4.pdf user"}, + {$td->FILE => "encrypted.out", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("bookmarks deleted", + {$td->COMMAND => "pdf-bookmarks 5.pdf user"}, + {$td->STRING => "5.pdf has no bookmarks\n", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->report(10); diff --git a/examples/qtest/bookmarks/1.pdf b/examples/qtest/bookmarks/1.pdf new file mode 100644 index 00000000..2003cf97 --- /dev/null +++ b/examples/qtest/bookmarks/1.pdf @@ -0,0 +1,1502 @@ +%PDF-1.3 +%¿÷¢þ +%QDF-1.0 + +1 0 obj +<< + /PageLabels << /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 >> + ] >> + /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 97 0 R + /Last 96 0 R + /Count 6 +>> +endobj + +96 0 obj +<< + /Type /Outline + /Title (Isis 1 -> 5: /XYZ null null null) + /Parent 95 0 R + /Count 4 + /Prev 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 + /Next 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 1.2 -> 13: /FitH 792) + /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 + +xref +0 107 +0000000000 65535 f +0000000025 00000 n +0000000434 00000 n +0000000830 00000 n +0000001035 00000 n +0000001240 00000 n +0000001445 00000 n +0000001650 00000 n +0000001855 00000 n +0000002060 00000 n +0000002265 00000 n +0000002471 00000 n +0000002678 00000 n +0000002885 00000 n +0000003092 00000 n +0000003299 00000 n +0000003506 00000 n +0000003713 00000 n +0000003920 00000 n +0000004127 00000 n +0000004334 00000 n +0000004541 00000 n +0000004748 00000 n +0000004955 00000 n +0000005162 00000 n +0000005369 00000 n +0000005576 00000 n +0000005783 00000 n +0000005990 00000 n +0000006197 00000 n +0000006404 00000 n +0000006611 00000 n +0000006818 00000 n +0000007037 00000 n +0000007140 00000 n +0000007160 00000 n +0000007279 00000 n +0000007338 00000 n +0000007441 00000 n +0000007484 00000 n +0000007587 00000 n +0000007630 00000 n +0000007733 00000 n +0000007776 00000 n +0000007879 00000 n +0000007922 00000 n +0000008025 00000 n +0000008068 00000 n +0000008171 00000 n +0000008214 00000 n +0000008317 00000 n +0000008360 00000 n +0000008463 00000 n +0000008507 00000 n +0000008610 00000 n +0000008654 00000 n +0000008758 00000 n +0000008802 00000 n +0000008906 00000 n +0000008950 00000 n +0000009054 00000 n +0000009098 00000 n +0000009202 00000 n +0000009246 00000 n +0000009350 00000 n +0000009394 00000 n +0000009498 00000 n +0000009542 00000 n +0000009646 00000 n +0000009690 00000 n +0000009794 00000 n +0000009838 00000 n +0000009942 00000 n +0000009986 00000 n +0000010090 00000 n +0000010134 00000 n +0000010238 00000 n +0000010282 00000 n +0000010386 00000 n +0000010430 00000 n +0000010534 00000 n +0000010578 00000 n +0000010682 00000 n +0000010726 00000 n +0000010830 00000 n +0000010874 00000 n +0000010978 00000 n +0000011022 00000 n +0000011126 00000 n +0000011170 00000 n +0000011274 00000 n +0000011318 00000 n +0000011422 00000 n +0000011466 00000 n +0000011570 00000 n +0000011590 00000 n +0000011677 00000 n +0000011873 00000 n +0000012019 00000 n +0000012194 00000 n +0000012377 00000 n +0000012568 00000 n +0000012778 00000 n +0000012947 00000 n +0000013116 00000 n +0000013269 00000 n +0000013438 00000 n +trailer << + /Root 1 0 R + /Size 107 +>> +startxref +13603 +%%EOF diff --git a/examples/qtest/bookmarks/2.pdf b/examples/qtest/bookmarks/2.pdf new file mode 100644 index 00000000..a7e01f91 --- /dev/null +++ b/examples/qtest/bookmarks/2.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/examples/qtest/bookmarks/3.pdf b/examples/qtest/bookmarks/3.pdf new file mode 100644 index 00000000..a1c0d954 --- /dev/null +++ b/examples/qtest/bookmarks/3.pdf @@ -0,0 +1 @@ +potato salad diff --git a/examples/qtest/bookmarks/4.pdf b/examples/qtest/bookmarks/4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9d25f2f7fe54fea87de7f20be66cfdc973ec5e3b GIT binary patch literal 11561 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 +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 + /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/examples/qtest/bookmarks/encrypted.out b/examples/qtest/bookmarks/encrypted.out new file mode 100644 index 00000000..4ad63b76 --- /dev/null +++ b/examples/qtest/bookmarks/encrypted.out @@ -0,0 +1,11 @@ +[ -> 6 ] Isís 1 -> 5: /XYZ null null null +[ -> 12 ] Amanda 1.1 -> 11: /Fit +[ -> 13 ] Isosicle 1.1.1 -> 12: /FitV 100 +[ -> 19 ] Isosicle 1.1.1.1 -> 18: /XYZ null null null +[ -> 20 ] Isosicle 1.1.1.2 -> 19: /XYZ null null null +[ -> 13 ] Isosicle 1.1.2 -> 12: /XYZ null null null +[ -> 23 ] Isosicle 1.1.2.1 -> 22: /XYZ null null null +[ -> 14 ] Sandy ÷Σανδι÷ 1.2 -> 13: /FitH 792 +[ -> 2 ] Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770 +[ -> 1 ] Trepsicle 1.2.2 -> 0: /XYZ null null null +[ -> 16 ] Trepak 2 -> 15: /XYZ 66 756 3 diff --git a/examples/qtest/bookmarks/test.-show-open.-lines.out b/examples/qtest/bookmarks/test.-show-open.-lines.out new file mode 100644 index 00000000..ea66669c --- /dev/null +++ b/examples/qtest/bookmarks/test.-show-open.-lines.out @@ -0,0 +1,22 @@ +| ++-+ ( ) Trepak 2 -> 15: /XYZ 66 756 3 +| ++-+ (v) Isis 1 -> 5: /XYZ null null null + | + +-+ (>) Amanda 1.1 -> 11: /Fit + | | + | +-+ (>) Isosicle 1.1.1 -> 12: /FitV 100 + | | | + | | +-+ ( ) Isosicle 1.1.1.1 -> 18: /XYZ null null null + | | | + | | +-+ ( ) Isosicle 1.1.1.2 -> 19: /XYZ null null null + | | + | +-+ (v) Isosicle 1.1.2 -> 12: /XYZ null null null + | | + | +-+ ( ) Isosicle 1.1.2.1 -> 22: /XYZ null null null + | + +-+ (v) Sandy 1.2 -> 13: /FitH 792 + | + +-+ ( ) Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770 + | + +-+ ( ) Trepsicle 1.2.2 -> 0: /XYZ null null null diff --git a/examples/qtest/bookmarks/test.-show-open.-numbers.out b/examples/qtest/bookmarks/test.-show-open.-numbers.out new file mode 100644 index 00000000..3680c2d4 --- /dev/null +++ b/examples/qtest/bookmarks/test.-show-open.-numbers.out @@ -0,0 +1,11 @@ +1. ( ) Trepak 2 -> 15: /XYZ 66 756 3 +2. (v) Isis 1 -> 5: /XYZ null null null +2.1. (>) Amanda 1.1 -> 11: /Fit +2.1.1. (>) Isosicle 1.1.1 -> 12: /FitV 100 +2.1.1.1. ( ) Isosicle 1.1.1.1 -> 18: /XYZ null null null +2.1.1.2. ( ) Isosicle 1.1.1.2 -> 19: /XYZ null null null +2.1.2. (v) Isosicle 1.1.2 -> 12: /XYZ null null null +2.1.2.1. ( ) Isosicle 1.1.2.1 -> 22: /XYZ null null null +2.2. (v) Sandy 1.2 -> 13: /FitH 792 +2.2.1. ( ) Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770 +2.2.2. ( ) Trepsicle 1.2.2 -> 0: /XYZ null null null diff --git a/examples/qtest/bookmarks/test.-show-open..out b/examples/qtest/bookmarks/test.-show-open..out new file mode 100644 index 00000000..46667ef7 --- /dev/null +++ b/examples/qtest/bookmarks/test.-show-open..out @@ -0,0 +1,11 @@ +( ) Trepak 2 -> 15: /XYZ 66 756 3 +(v) Isis 1 -> 5: /XYZ null null null +(>) Amanda 1.1 -> 11: /Fit +(>) Isosicle 1.1.1 -> 12: /FitV 100 +( ) Isosicle 1.1.1.1 -> 18: /XYZ null null null +( ) Isosicle 1.1.1.2 -> 19: /XYZ null null null +(v) Isosicle 1.1.2 -> 12: /XYZ null null null +( ) Isosicle 1.1.2.1 -> 22: /XYZ null null null +(v) Sandy 1.2 -> 13: /FitH 792 +( ) Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770 +( ) Trepsicle 1.2.2 -> 0: /XYZ null null null diff --git a/examples/qtest/bookmarks/test..-lines.out b/examples/qtest/bookmarks/test..-lines.out new file mode 100644 index 00000000..a6de7db5 --- /dev/null +++ b/examples/qtest/bookmarks/test..-lines.out @@ -0,0 +1,22 @@ +| ++-+ Trepak 2 -> 15: /XYZ 66 756 3 +| ++-+ Isis 1 -> 5: /XYZ null null null + | + +-+ Amanda 1.1 -> 11: /Fit + | | + | +-+ Isosicle 1.1.1 -> 12: /FitV 100 + | | | + | | +-+ Isosicle 1.1.1.1 -> 18: /XYZ null null null + | | | + | | +-+ Isosicle 1.1.1.2 -> 19: /XYZ null null null + | | + | +-+ Isosicle 1.1.2 -> 12: /XYZ null null null + | | + | +-+ Isosicle 1.1.2.1 -> 22: /XYZ null null null + | + +-+ Sandy 1.2 -> 13: /FitH 792 + | + +-+ Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770 + | + +-+ Trepsicle 1.2.2 -> 0: /XYZ null null null diff --git a/examples/qtest/bookmarks/test..-numbers.out b/examples/qtest/bookmarks/test..-numbers.out new file mode 100644 index 00000000..7ff9e2aa --- /dev/null +++ b/examples/qtest/bookmarks/test..-numbers.out @@ -0,0 +1,11 @@ +1. Trepak 2 -> 15: /XYZ 66 756 3 +2. Isis 1 -> 5: /XYZ null null null +2.1. Amanda 1.1 -> 11: /Fit +2.1.1. Isosicle 1.1.1 -> 12: /FitV 100 +2.1.1.1. Isosicle 1.1.1.1 -> 18: /XYZ null null null +2.1.1.2. Isosicle 1.1.1.2 -> 19: /XYZ null null null +2.1.2. Isosicle 1.1.2 -> 12: /XYZ null null null +2.1.2.1. Isosicle 1.1.2.1 -> 22: /XYZ null null null +2.2. Sandy 1.2 -> 13: /FitH 792 +2.2.1. Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770 +2.2.2. Trepsicle 1.2.2 -> 0: /XYZ null null null diff --git a/examples/qtest/bookmarks/test...out b/examples/qtest/bookmarks/test...out new file mode 100644 index 00000000..31a1cf45 --- /dev/null +++ b/examples/qtest/bookmarks/test...out @@ -0,0 +1,11 @@ +Trepak 2 -> 15: /XYZ 66 756 3 +Isis 1 -> 5: /XYZ null null null +Amanda 1.1 -> 11: /Fit +Isosicle 1.1.1 -> 12: /FitV 100 +Isosicle 1.1.1.1 -> 18: /XYZ null null null +Isosicle 1.1.1.2 -> 19: /XYZ null null null +Isosicle 1.1.2 -> 12: /XYZ null null null +Isosicle 1.1.2.1 -> 22: /XYZ null null null +Sandy 1.2 -> 13: /FitH 792 +Trepsichord 1.2.1 -> 1: /FitR 66 714 180 770 +Trepsicle 1.2.2 -> 0: /XYZ null null null diff --git a/examples/qtest/mod-info.test b/examples/qtest/mod-info.test new file mode 100644 index 00000000..83cc3ba0 --- /dev/null +++ b/examples/qtest/mod-info.test @@ -0,0 +1,93 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; +use File::Copy; + +chdir("mod-info"); + +require TestDriver; + +my $td = new TestDriver('pdf-mod-info'); + +my $prg = "pdf-mod-info"; +my $qpdf = $ENV{'QPDF_BIN'} or die; + +cleanup(); + +$td->runtest("usage #1", + {$td->COMMAND => "$prg -in target.pdf"}, + {$td->FILE => "usage.out", + $td->EXIT_STATUS => 2}); + +$td->runtest("usage #2", + {$td->COMMAND => "$prg -key abc -val def"}, + {$td->FILE => "usage.out", + $td->EXIT_STATUS => 2}); + +$td->runtest("usage #3", + {$td->COMMAND => "$prg -key abc -val def abc"}, + {$td->FILE => "usage.out", + $td->EXIT_STATUS => 2}); + +$td->runtest("usage #4", + {$td->COMMAND => "$prg -in source1.pdf -key /date -val 01/01/01 -val 12/12/12"}, + {$td->FILE => "usage.out", + $td->EXIT_STATUS => 2}); + +$td->runtest("dump #1", + {$td->COMMAND => "$prg --dump -in files/source1.pdf"}, + {$td->FILE => "dump.out", + $td->EXIT_STATUS => 0}); + +$td->runtest("dump #2", + {$td->COMMAND => "$prg --dump -in files/no-info.pdf"}, + {$td->STRING => "", + $td->EXIT_STATUS => 0}); + +$td->runtest("dump #3", + {$td->COMMAND => "$prg --dump -in files/empty-info.pdf"}, + {$td->STRING => "", + $td->EXIT_STATUS => 0}); + +run_and_cmp("modify Subject", + "$prg -in files/source1.pdf -out out.pdf -key /Subject " . + "-val \"Export Business\"", + "", "out.pdf", "files/1.qdf"); + +run_and_cmp("add Subject, remove Producer, modify CreationDate", + "$prg -in files/source2.pdf -out out.pdf -key /Subject " . + "-val \"Tammlin\" -key /Producer -key /CreationDate -val 12/12", + "", "out.pdf", "files/2.qdf"); + +run_and_cmp("add Subject (empty-info file)", + "$prg -in files/empty-info.pdf -out out.pdf -key /Subject " . + "-val Tammlin", + "", "out.pdf", "files/3.qdf"); + +copy("files/no-info.pdf", "no-info.pdf") or die "can't copy no-info: $!"; +run_and_cmp("in-place Producer added (no-info file)", + "$prg -in no-info.pdf -key /Producer -val \"Obivan Kinobi\"", + "", "no-info.pdf", "files/4.qdf"); + +cleanup(); + +$td->report(15); + +sub cleanup +{ + unlink (<*.pdf>); +} + +sub run_and_cmp +{ + my ($dsc, $cmd, $out, $fout, $fexp) = @_; + $td->runtest($dsc, + {$td->COMMAND => "$cmd --static-id"}, + {$td->STRING => $out, + $td->EXIT_STATUS => 0}); + $td->runtest("$dsc output", + {$td->COMMAND => "$qpdf --static-id -qdf $fout -"}, + {$td->FILE => $fexp, + $td->EXIT_STATUS => 0}); +} diff --git a/examples/qtest/mod-info/dump.out b/examples/qtest/mod-info/dump.out new file mode 100644 index 00000000..a453f9dd --- /dev/null +++ b/examples/qtest/mod-info/dump.out @@ -0,0 +1,11 @@ +Author: Yours Truly +ContentTemperature: 100F +CreationDate: D:20040212104653-05'00' +Creator: Adobe Acrobat 6.0 +FormerlyKnownAs: target/branch/leaf/leaf.pdf +Keywords: 40, 128, public, encryption, ignition, primarily prime +ModDate: D:20040212112832-05'00' +Producer: Adobe Acrobat 6.0 Image Conversion Plug-in +Subject: Of The Matter +Title: My New Car Title +VeryImportantNote: pordofor stands for portable document format diff --git a/examples/qtest/mod-info/files/1.qdf b/examples/qtest/mod-info/files/1.qdf new file mode 100644 index 0000000000000000000000000000000000000000..2b63f6ae0ab6f2ba3eb6dc5eef1a2eb58a1e5dde GIT binary patch literal 6842 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 +endobj + +2 0 obj +<< + /CreationDate (12/12) + /Creator (Writer) + /ModDate (D:20041221113239-05'00') + /Subject (Tammlin) +>> +endobj + +3 0 obj +<< + /Subtype /XML + /Type /Metadata + /Length 4 0 R +>> +stream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +endstream +endobj + +%QDF: ignore_newline +4 0 obj +3154 +endobj + +5 0 obj +<< + /Count 1 + /Kids [ + 6 0 R + ] + /Type /Pages +>> +endobj + +%% Page 1 +6 0 obj +<< + /Annots 7 0 R + /Contents 8 0 R + /MediaBox [ + 0 + 0 + 612 + 792 + ] + /Parent 5 0 R + /Resources 10 0 R + /Type /Page +>> +endobj + +7 0 obj +[ + 11 0 R +] +endobj + +%% Contents for page 1 +8 0 obj +<< + /Length 9 0 R +>> +stream +0 w +q 0 -0.1 612.1 792.1 re W* n +q 0 0 0 rg +BT +90.1 615.3 Td /F1 80 Tf (abcd) Tj +151.2 0 Td (-) Tj +26.6 0 Td (efghjk-) Tj +ET +Q +q 0 0 0 rg +BT +90.1 504.8 Td /F1 80 Tf (mn) Tj +102.4 0 Td ( ) Tj +20 0 Td (o) Tj +40.1 0 Td (p) Tj +39.9 0 Td (-) Tj +26.8 0 Td (q) Tj +ET +Q +q 0 0 0 rg +BT +90.1 394.3 Td /F1 80 Tf (rs) Tj +58.7 0 Td (tu) Tj +62.1 0 Td (v) Tj +40.1 0 Td (w) Tj +57.8 0 Td ( ) Tj +20.1 0 Td (xyz) Tj +ET +Q +Q +endstream +endobj + +9 0 obj +404 +endobj + +10 0 obj +<< + /Font 12 0 R + /ProcSet [ + /PDF + ] +>> +endobj + +11 0 obj +<< + /APEX:Id (353) + /APEX:Label (1) + /APEX:LabelAp 13 0 R + /F 4 + /Rect [ + 63.461945 + 339.112457 + 525.003418 + 700.653259 + ] + /Subtype /APEX:Zone + /Type /Annot +>> +endobj + +12 0 obj +<< + /F1 15 0 R +>> +endobj + +13 0 obj +<< + /BBox [ + 0.0 + 0.0 + 9.199997 + 12.399994 + ] + /FormType 1 + /Resources << + /Font 16 0 R + /ProcSet [ + /PDF + /Text + ] + >> + /Subtype /Form + /Type /XObject + /Length 14 0 R +>> +stream +0 0 1 rg +0 0 9.2 12.4 re +f +BT +1 g +/LABELFONT 12 Tf +1 2.32 TD +(1)Tj +ET +endstream +endobj + +14 0 obj +70 +endobj + +15 0 obj +<< + /BaseFont /NimbusRomanNo9L-Regu + /FirstChar 0 + /FontDescriptor 17 0 R + /LastChar 255 + /Subtype /Type1 + /ToUnicode 18 0 R + /Type /Font + /Widths [ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 250 + 333 + 408 + 500 + 500 + 833 + 778 + 333 + 333 + 333 + 500 + 564 + 250 + 333 + 250 + 278 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 500 + 278 + 278 + 564 + 564 + 564 + 444 + 921 + 722 + 662 + 667 + 718 + 611 + 556 + 722 + 715 + 329 + 389 + 700 + 611 + 883 + 722 + 722 + 552 + 722 + 662 + 556 + 611 + 722 + 722 + 944 + 722 + 722 + 611 + 333 + 278 + 333 + 469 + 500 + 333 + 444 + 500 + 444 + 500 + 444 + 333 + 500 + 500 + 278 + 278 + 500 + 278 + 778 + 500 + 500 + 500 + 500 + 344 + 389 + 278 + 500 + 500 + 722 + 500 + 500 + 444 + 480 + 200 + 480 + 541 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 333 + 500 + 500 + 167 + 500 + 500 + 500 + 500 + 180 + 444 + 500 + 333 + 333 + 556 + 556 + 0 + 500 + 500 + 500 + 250 + 0 + 453 + 350 + 333 + 444 + 444 + 500 + 1000 + 1000 + 0 + 444 + 0 + 333 + 333 + 333 + 333 + 333 + 333 + 333 + 333 + 0 + 333 + 333 + 0 + 333 + 333 + 333 + 1000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 889 + 0 + 276 + 0 + 0 + 0 + 0 + 611 + 722 + 889 + 310 + 0 + 0 + 0 + 0 + 0 + 667 + 0 + 0 + 0 + 278 + 0 + 0 + 278 + 500 + 722 + 500 + 0 + 0 + 0 + 0 + ] +>> +endobj + +16 0 obj +<< + /LABELFONT 20 0 R +>> +endobj + +17 0 obj +<< + /Ascent 1098 + /CapHeight 1098 + /Descent -281 + /Flags 4 + /FontBBox [ + -168 + -281 + 1030 + 1098 + ] + /FontFile 21 0 R + /FontName /NimbusRomanNo9L-Regu + /ItalicAngle 0 + /StemV 80 + /Type /FontDescriptor +>> +endobj + +18 0 obj +<< + /Length 19 0 R +>> +stream +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo << + /Registry (Adobe) + /Ordering (UCS) + /Supplement 0 +>> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<00> +endcodespacerange +100 beginbfchar +<20> <00A0> +<21> <0021> +<22> <0022> +<23> <0023> +<24> <0024> +<25> <0025> +<26> <0026> +<27> <2019> +<28> <0028> +<29> <0029> +<2A> <002A> +<2B> <002B> +<2C> <002C> +<2D> <00AD> +<2E> <002E> +<2F> <002F> +<30> <0030> +<31> <0031> +<32> <0032> +<33> <0033> +<34> <0034> +<35> <0035> +<36> <0036> +<37> <0037> +<38> <0038> +<39> <0039> +<3A> <003A> +<3B> <003B> +<3C> <003C> +<3D> <003D> +<3E> <003E> +<3F> <003F> +<40> <0040> +<41> <0041> +<42> <0042> +<43> <0043> +<44> <0044> +<45> <0045> +<46> <0046> +<47> <0047> +<48> <0048> +<49> <0049> +<4A> <004A> +<4B> <004B> +<4C> <004C> +<4D> <004D> +<4E> <004E> +<4F> <004F> +<50> <0050> +<51> <0051> +<52> <0052> +<53> <0053> +<54> <0054> +<55> <0055> +<56> <0056> +<57> <0057> +<58> <0058> +<59> <0059> +<5A> <005A> +<5B> <005B> +<5C> <005C> +<5D> <005D> +<5E> <005E> +<5F> <005F> +<60> <2018> +<61> <0061> +<62> <0062> +<63> <0063> +<64> <0064> +<65> <0065> +<66> <0066> +<67> <0067> +<68> <0068> +<69> <0069> +<6A> <006A> +<6B> <006B> +<6C> <006C> +<6D> <006D> +<6E> <006E> +<6F> <006F> +<70> <0070> +<71> <0071> +<72> <0072> +<73> <0073> +<74> <0074> +<75> <0075> +<76> <0076> +<77> <0077> +<78> <0078> +<79> <0079> +<7A> <007A> +<7B> <007B> +<7C> <007C> +<7D> <007D> +<7E> <007E> + <00A1> + <00A2> + <00A3> + <2215> + <00A5> +endbfchar +49 beginbfchar + <0192> + <00A7> + <00A4> + <0027> + <201C> + <00AB> + <2039> + <203A> + + + <2013> + <2020> + <2021> + <2219> + <00B6> + <2022> + <201A> + <201E> + <201D> + <00BB> + <2026> + <2030> + <00BF> + <0060> + <00B4> + <02C6> + <02DC> + <02C9> + <02D8> + <02D9> + <00A8> + <02DA> + <00B8> + <02DD> + <02DB> + <02C7> + <2014> + <00C6> + <00AA> + <0141> + <00D8> + <0152> + <00BA> + <00E6> + <0131> + <0142> + <00F8> + <0153> + <00DF> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +endstream +endobj + +19 0 obj +2311 +endobj + +20 0 obj +<< + /BaseFont /Courier-Oblique + /Subtype /Type1 + /Type /Font +>> +endobj + +21 0 obj +<< + /Length1 1346 + /Length2 145230 + /Length3 0 + /Length 22 0 R +>> +stream +%!PS-AdobeFont-1.0: NimbusRomanNo9L-Regu 1.06 +%%Title: NimbusRomanNo9L-Regu +%%CreationDate: Thu Aug 5 23:43:46 2004 +%%Creator: frob +%%DocumentSuppliedResources: font NimbusRomanNo9L-Regu +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development; Cyri +% Generated by FontForge 20040703 (http://fontforge.sf.net/) +%%EndComments +FontDirectory/NimbusRomanNo9L-Regu known{/NimbusRomanNo9L-Regu findfont dup/UniqueID known{dup +/UniqueID get 4162059 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /NimbusRomanNo9L-Regu def +/FontBBox {-168 -281 1031 1098 }readonly def +/UniqueID 4162059 def +/PaintType 0 def +/FontInfo 10 dict dup begin + /version (1.06) readonly def + /Notice (Copyright \050URW\051++,Copyright 1999 by \050URW\051++ Design & Development; Cyrillic glyphs added by Valek Filippov \050C\051 2001; Numero, infinity and Omega made by Dmitry 40in \050C\051 2001) readonly def + /FullName (Nimbus Roman No9 L Regular) readonly def + /FamilyName (Nimbus Roman No9 L) readonly def + /Weight (Regular) readonly def + /FSType 0 def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def +end readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +o4…>£ö‰à‡Ã¬`0˜šB‰ÆCTà£ÿ&5. + +Svî‹ik úˆœkA¦ ëÙ£¨7ñ¢F`üôƒ$àyJU4ú¢ßÊÀºNLŸõ·^¼§“ +ÈVöÙ.èÐ+´¢Y¼ÂÒÒ4Û³\ºs‰mã'v­Í½=@R3GIJ¯z°ÉvŸô®N1€§ÍŒdð²Õ°¾©f~žð ÷e:^ŒÑ/’:0部Ï(}æÄl^?ô¬ˆ¬–2¾-ª*Йu3KÛ65g*ß Jµ(Ø]»<ßMÓ¶»Áͺï·”D®ŽÖcqÙÀ|ìÿùdyPËâFb°ß+h;p#Š]Ô +Õ#!v'«Ë…ˆÕ:m(Üî^¾ä^¹Û ç ïòô±mzTG´ó9‹~^¥ê@ªs?;†V¤lñ1ë ¢¹`vóQ¦L¼aïÔÒXîìj¶p¤¾¸ô›êÌâ†`Mïÿ `ÔjïýQhì|?M'ÒÑÇUHÑêäçj=¶Î^ý+t‰í½òLÒ©u¿¸ÖŠ$£ÇV´®Z‹ ýÆ8=˜Ýh^I|ùR2Ž‘…š•šiTéMBí"² Ï,0\ ïm`Æ3ßõi6ç\8s'‘kÂ##Dcá{sZû«;B–0–d€±ßi÷aÚûwÿ¯)ÛòÇÀTSSBõ0Cß]G3gª9dò¸gƒ%Êžà[ þÏ;]éµqÍwº¯êª¤{.Õᥠ_ºHˆž{æÌd\RŒUœ“yx5E<ózμ<©üˆìÅ÷ <ÞÉÕWÄ©`:§"b¶AYÜ·ÝqUÇO¥¿+¡—DÏr;Œ«œe‚ÎÕt ’¨Ü(³¶9üÌÃŒppæί`¤™ÑÌ"¯æù¨=²Cð÷¬ÔcÚ¿›UsÙuIµøiä½2$﹚¶»Àz$ÍØl†¥b˜‰Áñ,®õªy:a§C8®yÖåtÕnVfíEWP$ÎuÏÜZÀQlÅ!ê^e¿¬ÂQÇ×äÒ¿¾Š´ªµ][«<Æíh Þë;=‰±¸Z*䀵Y— Ï“ ªårHø þ¼w0;lÞÉý.ðXÜP†Ãú­Ooð)'ÛQ¬R9ag–èù}„bºwvlTkÖ¥*Ì¢Ò÷€³Îó!BuÅ]‹ø×&NXøwG~¨R‚Å_P9*6'õÅ‚fTã™Ð/f¤L©C¢òÉц2ÇÅÿ1aš§qõ¥rýÄ~׈ò:˜±«^¸’º£T+É*/ÓS´ÞOÛ/›VÔÅFçsÚsl­~Øè9½k_%SX¤V3•RC>ÊEpïòº¥ÔÃBãpö{ŠÚ‰âÏàØ#Ùb(¦Ñm)È©Ä̺48Ń/]=MçNEð¥àgÓE.ú+¬ –ëÀéb³(®pp–p9n¦L¢þŽ¼Êt •Dæ3—øÒ÷(WÓ•Ä›­G?ìó5a^…oÇn‰7ÝÎÁSßÚáÃ^c•ÁͶ[Gêcþ-k™yöê…,g»uuy6ì£Çæý‚:ñÌ”S$Ùe¡TOáË‘Å @ü0;7¯ÁŽõFZƒžÎÀ·îÀÞíq®Sš°`ÓîòrÖ÷°ƒu,–²š£!B>á¢Ì„ÎáçÀ¢7c"ñ\·©#´"y½8¥ùK5FyéÙBÄ ¤ŸÆvÁÖ]t]%w¥ÁhÊŸÚdúˆ/­º‡—›m¤³KËk.H‚W ¾I Åüvd߀¥ý 4šæ>ªÌËã!ßÒïn&}¤‘%—•Ñ«;µwCHBbp6ÔB¿¢ÜJ­¹¿ÏæF·bG—¼Ùß^´š¤fšÌ@½Î^ut[”7Ä”“Í5N?>žf£ÚßÃÕ«@ã‚€ QÖ‘# € ›Ø‘ú’ˆÍØ5 +Iè#"Lbûþ:çT­Ì£*fë}tÊËý‚àgxÀ½yW¨ŸGûŸñxVVÀF0ɘévǦ>—;ê 4ò¯ÖwÇÅsž¢ßOüðEó©ÃÌhiåEº¢/17ñ¥±²YY$ãd5x:¥8/); +¨D%Ø¢(צ†Sù¶s¹bø¥ w¹b!“ô«GP7:8Þ<Ü󖯇PÔ¬ÕTîÖ{ÿ½Î“ú|¦Š·<Ê2&ÇäR†Þ‘`°†û?l0T¢é%uNùæ~ +ÓØ-°‰ +P–Ѽ+IEs›´PŒ›7f†’ª&ûµÍÿ8òùؽO]ŠÐèÕž²ÜV}_ˆ2ôR•5‡É:8`”ĺ1îÅÅIŽ^Å8 £‰Rs¹L‰‹˜8¶ÞÏn$û4ÉüWf“î=p.‰ Õz|ÝìçU¸­¤ƒrî½~Hø Ö&žn¤×òãT¹<•å³EÉ“ì‘ÏßoƒmWàô‰ Œ2‹U÷¨_íѨÅÊï>:Yúož;-kGˆû¹p#Ùõçœd¬Ý¢0Že³E£¥Ñv®®0ÎFä!øNì˜]ˆì¹œ ë)Ä€8”êéýó‚ç¬8ìÝzKú•¶ËG¢’7uÉôpž©$ú|kS5vβâŒR*ùÔé±ðÄ°…Ê?’pIѼªúT³Ÿ²£úM6%ט̛ þ´:Q5·*¤ÚÒ¸$ü»ÓHGJ`±Œ1°ÒWîcÌàá¹çm]¸E^ÃCH¦¥\¯Š ?Ó"b±7Z¾zu‡$+ÔLqJèÁ9‚²ôŸvu ·:!¥ô¶§ !–·¹¬cÎa̧gb‘¤›Á²…#~Ýjq­ÿ&2Ѻ+>·4!b$Ú3-Fl§˜'‡±÷{yݩ皟ÇÞSåÆ#\sM|Ÿ›X9©›;wQªÇ¡† iÂ>Ñ„znP¬zò1ôaSÒ`-W̉ fõÞTo¶°¸À õë0ï~gXÆÏ~ÅFÜd(Ùî›™*áI][Æö;ª´êù@»’°ìMÁº‚R‰1ùBös½üZ¬ÈÛÊÎ Ô hÐc`S‘^3|u›¸ædôÖ¨É'©ùûÀQ»®ò$òÜ„µ“4g»x Ò†ƒxßOú½'´O4žþ¾ùI¬–33:Šáº’d÷€‡Ý½JÞ^KÍÞÝdí° $*¥-[P„³p÷7.ˆkó&%„wÂ$RØÝ¥‚çȤ'ÓÑ7NôËñ9­–‰jzìœd·9þ'ÒÞ Y)g)#…£âQÊ@ÛñÿíŒ_ Üå5`O)BÊÑVÕr YoµµçiÞ¾³b»lŸÄ ÍÀŸ½Ž»·F‡‘:<ËÓ9}z.ðg¼Sí‰@cræÜ:p-莭øJåkšÓBŽ#ŠTŠ…bØWrbÀ0hþ;V©Ñ9;ÃÎ8UÀ]=©’ð-p·W‹8{î[LKa½«˜Gíº@;ã&©ù°åü5Fþ¯$‡ +´mZ\ÉZp4ü0e ' f¢®‘¯…(#)B:ÉÅð Y¡±îвAì]rÛ›®ÑNUÁöñ£Ù <ÿL¾NÅÓ¢q±Žõ¯åWrÄ ƒ´¸+Å’¸0±““È{ãQi¢}”ˆÀBú“ }íáÿ*²ÕPª†ÒdΆ"%î^v“`-œøï—<[ª¦_ G¤€èÞ¾ äeÐÇNtœ]Ê%ê&ë9α©­å˜d´]}B‚W üÆlýv—¾æç8Ä—Ct#ÝÝ[ó{Ì·´)§±ãl{#é¿óŸèÖh{‘üUå‘S ésh¡Z3ÆK%æÊs—²Ûè¼±˜Î ¯ÎsWª|Œ¦”ë|fFýÁEäß=åw|±Â¶˜õžŸ¤x¼†HŸ'ÙG^aš––2]bϽ¸Ó÷bÁ*á±;çþþi½¯B´å¶€@3æÃ̾µàuÂT¦ ¦5GîIÔ—4uIwŽ âOÙ6QH0¼ +ÝÒ“i…FÊV¥y9ö7íp}¦ƒ6Û‡þÚÖAίâì¼ÝÓ Çí$*|µ³r A1GW¯ìårY³Ó 9õkËë_Ô¯­£ ’›2Ý*:#­5•Õf+êsÓ0Û=ò÷_1ñ [ú€‡XLMÑB›wŸó³Æu(Œzo_~K°ºúRñÚbCþ*ü:Y7ΊICÈäCÏ´¥uK ¥KW™Õ²–ŽµªÅßÓA´ ¨ü?Ö¯*èP3­\䛿'ß_‹6ƒP ·MÐEéçRHõQ‹­z¾.ÖÄ{7!¾® I¬âk1Ô÷ãëR…:zÙ 1²íGªØBîæœoÖس•RT.D@ÙfŽW›ìO1ž=²MNezŽÝ|]ºlvú¦8`ù‚-Èë´‚1Ö,²ÕßÖÎFŒ+4`TJ"}fŽx¹û´WŒÉ¤º_ú‹ççܦs79µnÜS8kT”:ùsoL8C‹X×v‡:Aãlpå˜É”õ²ã'Ûk•>õš¾7 ïnð +ŽJ;;Ä¥úê#ý _µ‚Bˆ°‰´>.îˆyÀå½Þ oÍ ÷ÆÏ퇜‡·ÜñÙú¨ Í•².B±ÇQ¢” u[²Û¹5G âîqUÎÁ‚rœÚ×”}lô¨¶œwãÓã`½È£r`3dq„×&xwT +ølÄRY+R“‰¤”—fÀÄþÎ}„Hÿ$4pm›æ1<úlÒ4eÕ†ª«¾J#0 ì,øé÷M„³ë^Ö~UÒ +:j`-µ{ k +m"庖Ö/²®x°B‹Fd8©ùÚªû ÅÓD[L€aÃÌ@ñ‰¡È&ïJšRñ’ü“»RîÇ,âŠCuØ`ªMxÌAVl¯àÞ¦QȈèÅòÖ\²Î®›%œµË# }ù‡AÊ5j¯k9†PâÖ‹?u&†[km»…Yý¹|¡d°Ñ†…×á{ïÉXeÚ»H”`›À‚@gdÁS…­¯jÜG(ÑðR‰iÉ”aÌ•ãÔ E3§Ñ%È8w™LæšÞ¥±‹â÷‰¢1:$ wµ´¡ê;$&àOSJ€s÷Þóž)vzO²Ö 2P¢X\`bÈ ææ2_|À Évt^®¿KzBÇ‹>µý:Ó—Mg",{41™ù¡‚‘"8ö½r€Â0t+Ì&É×7ºo"š«#„³±†vcxaË°é4¿ˆ1™kÇN¤#ÓsLŸúøòBXúi’„Ý„qGè`Ö„¨-’(É“C9ìuáIN; ODܪèF‰kõäˆê~SydL½÷&G©õ»ˆ—VÌçɈÅÇÀNTåý@*ÉPz¨¾¯¹ÊY!Fñ©ÛÑ]À@{ËV'ú% +sxôú6÷k®/£¼‰½rU„™Š³ ŽsçmëÔ`Ž æ6pr:Úi—š"!yÐàÓÒ–Ÿ„w±’FTä|`²_<êTÛíE¤˜Úº<ƒ ¸ìîdß°žC;:ûBœj9rÍT¼V\¨¸/ñ=!ï.z÷ƒ +8"ÜcÃÉ»–Á-õ(É^È!Ëž*eÂ8´Ïþ õø*^øÄ'”+>Zâo1EœT©/Ú’ÖNx¿¥¶ ]b¬WP¼ J b ¬0 `ò/ò9²Î¼CÔ·y{|ˆO${–9AÈ£Õ‘*7Í(þ•a¶F‚B—âQÜ¥ýÅÕ–‚€Hô ”Mç½ +×Oãõ´~\EfqÑ·¯ oÛoÒL9 ÆøóXQÙ÷ßCÄ0¿ââËÒS/ílAÓ‡þ\¹¼*‰®® †Óõ7…^IüŽÈQ“æløYü³õF˜¯¤G:E|â±õVTG78{ ï3õŒâ¸ã0ïÕ"7·Šû"g +V3ÀTÜÏÁ/\ÂddAËæDÆV®Þ T³ÞÉ´éâÜK;Öªõ/«rØ-ʈêî Ô±¤®;:þ‰6Tò  +¯$6âà¼Â}¨dúÏŠå©OéÕ/1‡ßÙå¢,÷¾—´Ú¢GÄFì Uqf€0YÆÈ9\°ŸÙdUIg=_>H‘jL6ŸPÈÄ—CcÙ4±}–ÚÌ+ö7ÍLæÖå +Ê‚ÀÃ>@<ü‘nzFUàô+š:©ÆÐ_ókÞ¿ðía|j”ÚGAe%úWÃêÌÓC^ž»Ô!Q>]¯R6Ùø áeÐàfõîßaýôàimÆÉœ:Œñ±_6.GZ€¯Þþ£Ë79Ùÿ­¦ºAf—ÞØwÇ?C›! 0‰4«‚ƒ‚,øRàÿÁiÉ+$…ÿ ÅMIA,p¼ôÕ˼~VÓ]‚Ç×-´<†5(Ûrñ˜›»÷ÇÛUo‚gÚÉhðTxm¼îdþ‹:ïu\equµeÒ´¢Q$`¡Å <­ó‡¸Çípï(ÓW„Ì.¸3Ë'ØS€Ü·® »nÔ”úXï˜^…q Xà7­4ÜÓÙQíÝè¥r•àø§Æ‹¥G?~ýÍ3üB±O$ïíGÒS·û{€À쉗… £qäuC™0ÑhÖÓ\´&¿‹`û•¢ÍÉ6AQе°˜‹µ“½í£×A}Rš0ì3Ì +öÏCêǸR¦Gr…ÍßzÙú%‹Q+˜p…´?‹æ£)—;F%œ8€0*­+gÖ‚@ŸŒÁ³ûÜ}G­æ5y»`tì‹ú)qíÂ#¼«¦ÜM¿r}z¼xádô¿â¸š>gPsÀh 1¨Ï rAé Dª +’AÐFƳƒ÷H‰Ãt^Ý÷ ›j&:€mVO¿oµÈªÜ)Œ³×7É—QSFûõVÐ=¶#?Þm ‡Ü#!x ~ù f£÷l›m¡‰@XôyuXÍN¶`éâÈyÓܽkºgÞGƒ¦9¦Ú‘éÐÒ uùS<–stÍ:tñ_ÒšGž÷[!š—?Mi 1èöâ~œLîzJ[9)÷Mªï¯ÕÈ„IµÃ7”˜ÁKXŒàÞ‰¾åçCä¼u(r`®  m)¬©BDyáBóÞUöµ’ÊeòÛ5¬Ý:Ý‘r\2@¡ 1( Zó]Ø’¾õ½Rpü€šÜ.EÝ;ðô±D†Ä‘òü fÿq§¥hͦæ›=‰Ô›æ—áÇp>1#X \.~~‘Ao~•ª—Æ9uÛ¢¥ÊZ³¸²±•é?K6:vÍ?Ö/yRíÛ©¹}t¢‘ ¤*ÞT–e»o·-½šµ"À2?;ãrŠ}& oÅ£6r8®B^¾ìuôƒ-Ågø×òÆþ> x¬…Ý`®JÌÁA™ÍÙæ¯z™¯¥s˜«•iòy´nÀö:ìüàæ;âq!ÉÒUÒ~ê×ý®~rbdATÎUlŹUÛètó_óÆ'@<¿i.È àUþÄWk~­:xØ`Ti©çÚ¹w¥àͱg„Q +ÎIÌC†/¨Ê¢+›q;l=‘Ö<èãŒó?ÅÕ’%Çú¼M÷‡ò|<ÙyŸuÌ.8ÁÔ,yæRÿa›1qµæEÜJSë%¦ "¥ƒ¢ý×0³q°”™s¡Â¯D=»Ãc…¯\'"Wù£ÎÈo¾htp(ÏMcÍs`º-hŠ0nÏÇ¿„þIñ⌲Ûl†ù0×YG…û€wíåöŽ•¿%Á'ßòä@rÛ5èMúC41×v]y윊OèàÃrÏ[}#¬ˆO}¨7H¾=YÝÌIÄa‰¦¨ï`Ÿ 8Â,ª}Ã2['Ø,­ ÕJ60°ì¾[æá7=ÈÀTT‹¿Ö‡ëm rűX¤ )Žƒý±Y,âþàM’‰–8À?pû€Ÿæïú'ÊŒŸ1;FEØ1—~̘±ÃøAÐ87ôQXþ¾O7·d‘Fcºß+·˜}G˜Ë_CÚíXWÑ|µ–Š8M:8‡V½;¥ñÿ^CKÓÐ="wuCÂqâ#?´z•J<]!¾ïý¦ð·œéx¬Žf€¼Üà=̲)ÄFxN4¤ñüÚåÆLÚѱ脖:Žùÿ©–9vÊÐF=úA+Y7¿CháœY/%U±¨7D(t²_˜"ZârLõ$ßÓHAAbŽ½ÉÝÙts݇,?‚ÌÎ:%ížr;Vºx åÞ%ú½„9ýŒ" ¸ˆæ2 +B,p%ЀDý§àmàÌ¢…]z5uTzŠÓ3Eû3h 4™ð¬9º²„MYfå~]â2KÕö#Å—òÙôû‡Ø‰^ o–S“–­¨/Væ¼›mkbpó¼.¨l@à4ÿªñc_•1þÉ“/ÅY@Àðn‰çÆ´ˆÔ{t½4Ò +§@˜¼BâÓ? ‹žù7Ò¿§å‚°Pè ç8±c©wÙ¶R=‚í>pomƒ Ó|6fWáùÑ6$Q˜"AšœŽ¾3 +Ú»­_EÙjè“[²•U ~ydæ†ûž€bÑ»{Lõvòvß'î³2X²f–‰Ò‚ÁnSâ_~¸¦g†o‰3‹û7{|ó›ýÂI[¤uØL0ÈncüÝ$Z0Z9$óŒAÌsÁÉöh“ºŽãa¡à™½o["´òÉHl[¿ùŽóÈÊò$U‹ÐÂýÄŸ”á0üžð´\àžòp=bô )÷àh|àiÛœzN ý4n`Ïn²;Àõ6(ãTËЀaóUUål+Küd¼ÏjJ3(I=»b>òèæô.yEÞè:B›V;þŒ¦sÌX´Æ¢4DÂ7µ<¦[…÷­d!þYæÿlg÷²ZùŽ©ç–\N¾qslúsù‘jm‰ý‘³8ÿ›ƒ7–o×Ûi†zÔJDñn¥hkÌ©^ºy·E+‹`ö…ˆÇ™.Q5 ñ¢$ÇQÐüTÖ€j œ#›po]L]WûÑ23f\"W/÷u…ô¡¦llO)Ÿ’‘¿+§Ô›´ïké–Åé„ûwCµ÷>ߪlq²‡ …Çj”…êÄpnQ3\AþÒê¦ú˜)\Í«Š¬@‰_ñlÞÆâ;þ¿W,í+¥¢Ž¸Ö´ºXPjô­Óç{þ*ðÈñ)ÔŒ’&‰ÿ¤ ÜND0üÃ~BU“>ÑÙî¿ÛÉáÝçħvK)§QDç¿%Âh4Ò /¥9 *¥Õ7¥ž¢ÝzÓËl Çðí­µ=t&[ŸMV ýÜÁŠ¸PÔ([¢EÀ+&kΞÄíƒ ‘A*ßÖ>@rOgù.|s…´·Ž‚¯.T¡çzÁÇE¶ï´gxd¼m¢?³è¾bûäµAWÉ?‰ÕÝ¿ú¨LQw«“lhK$·sB#_“1´±[»ó`®Õ/,MË–âSÐ+Ò·¯¨ÀÒH“×uNÉ;Ù‰§7ÄJ( I¶VçVhC”v´r¾¤ÿz»ÿ*ý®»'Õ§åDk1;É®+½"îš@n§¬>ŽªQa÷›©»îú=È~°_nÍÔgòέˆq9*sP}r~‰Œ×ëøgšÝ³Îí¶àuÎ}v6k[(£›Ræ®BÚÍŸÃ? ³¾ò¬:¿l³ÐI·¥„êPt«¦œƒ(Íú8Ð ÚÄ.ÿmiýUÜ.kN¢˜íf0!<#5ìÒžUjƒ-^ÀFãuè“_Ú‰1œ W~#N¼ çPz AÝYk¦MªdÇ-rˆOM:õG’$ïOÝÚ>¡¤4÷M'K¦*Ö¹­Öü_/4ÓEù{D£`q§*mÕUP]ÆÞúáä%A2.ŽpY)±%|ŠïÂvã¥R3¸È@jd„âÒ]ƒÁÛ1o]±’rîŽã8~„M)M¡Ê5Ægvf½ âRà^ž®-·0t^ÙŠA^¤¾ˆ%?ãj‹‚!~¢q¿=“ú7ˆ™6ø#ШÞù[LÊ‚@ßÝ€ · êa£ÄÎÄ13C2îã6Ö +OŠ?oóWÏÊ÷?•÷'úqïBq¡Áµ­‚ç÷„à˜–eí—mãa½we¯@Ô† ¾ˆ +ûDóßý”•ê}MQ¨ìÝä¿°8®–0‘Ï\ªôf3R(|L{ãKùrFp`TÙÛÆ&(¢J/Ãk )NÔˆVÉXw²çTaÒ‰ fÄy‰J¹i·x­ I/%Ínt_2”ß–êÕó×kTÄ/^J´rð6ÓTcwÉ©¾Ü¹äÎ@t‰?‹yî^ïEÃHoo¸Bž,ïëÎçXŸÈæÔ¨·—œNvÙ³)ã+(]½±”bÓU!ì88*îAGΟ;P ø’.<»Õ_ÍcL vä°hgãʧ™ÁåaƒÖ&ˆ=] +Òj湆ô³¤oòiª·.¼R#6!0騱®ÊÖ n{’@W´ÕùýAjÖ¢=H¥Ì\Ÿhpñ‘;íaá»»3`v_êÚŽïR1â¬1V×1¬ê¦I <ºÈ#zH€CAHGÿ'ÂuŒZƒ’ð¯ü< +µS‚EòÍóëÔÒ=\Žî)šdU2™ ¾Ü¨䔜º7ë <×CxžCR:œUQfÀ3»ÇäH¶ãYK……¯îè·Ñ¹Ì6„Á&\‘ +ò—Íî=©§Ä’n_Y\­õW,üäx– s~¿lÏÂî¯Iy‹—Ö+³=r‘0òÖM¶xÜ`p> (dLÓÿŠª kiÇð†ù&ºVÂUó8˜¤¢`P•g*÷Q„AFÇÚ¦Ý]y‚›Ìg¨é)iji¹ŠŽá)nïÄÌ!º‰aåhz«b3ˆ,‘å3’=?Ò ©òçËMRVç*6ýßšâb6¬ýêh¸'Æ¥‘ªö¾º$Ó7„xâ ¥Üw›Dç –#h÷ÁV‰ÍD1‡ÿ#O£…ÃÅÕŽ ¿üªæŒ*ÛZ\<ʨ6è²Ö% +‘D í´Þ)ª^×úhX)¤{ätFNiÐPðM-\|1îQ]n3G’®ÂÅp t“È…›}`-¼!*õ²º­ÎužÙ«¼ì’{Û/÷Æçå°&ÐxíÚQyr{Tº¼ÉWÏÐG^µÀ·©PÄ ‰*¨,‡gÙÌ’t‘BUeöÖöCÝo„Ú¹cõ!1F‡”lŠçFø,ÅÝ’óõoƒî®°vR>À2)H¦–¥ºÐ­äl¤KìrvX𳧅ñ¢ØFáòmvR*o ¨«¾B{{&'ö:!rÖÐ ª:í_–D”z“j9.ÕMãÆFÆÛÜŽ+Ù3†ÂTμô˜ìàÚ¿F*¾àgâÞm»:ÍnÅf’ØÃ]¶OÑã¹f…ãé +ãœÙô•'¬¿\õp¢MydÂŒKé{Rp1ªÏÚ½ÝÌÐ::q8°K¿ ùdy¯»Ù6ÎY³mÇWVþÌjG]î#C÷Üâ?FZüªŽ¨f’dE9•UX';î3ºî ˜¹µí©+àïpœ{­¿]bZú)’½¯´31ß a F?•¨¬Õ`Jæ£ɹu«]-…S|Ák|$ùÅî©õiñâ åzUoÑ[Tk¢£Jq71±r¿g+KùtÏ"ó@Ù‡×Ã2A3¦9ÂÔíÜ 8þ` qO](ÚƒW[SúõÆã}Ÿ n27UwÙN)Î.Ý$y½¸¢Žwóë—$skÎ)§u©¦~w/ƒ›aM‰iä]a¢“Øäf9H‡I¿Í2 Vk–Ò¤Y&VõX@„³6U*°ªf§Œ#O¢àu¹þèù§ÜX¨?¼©‘KÙæQŽhçýϻ¿p­À”ÖÉè 4õå\ý™·äЩzªég Pz’7Êÿrsë¸l"#ðK™QïÁ{.!È/q6d“¯Ó*Ñ›A1¢‘y5ù»‹b'׉eÉOàEfÙ@2Í‹Þ u;F•µµS¯è¿¡žß=¿>§Žf‚Hã]Q+[–|Ú…bÄÜ=ˬ|¹U#×’b²l&P†@ŽSÁK“Йu[%©#Ë€æÐí;åÕ†ýQ5ñ*Mò ­Uª;.ø—Ž„„^=rÕëÞǹBÈ—òn° ¶Çgœ$l®O¯±‘ :ŸKßö‚ZŸ#Ó—ÂÐw}ߥ8ü›Bù>JÛ±¨ü¡È›³ò¬/cQßÆPkro‹®1Y¯΃¸÷”Ô¨_ý!Ñp5^%4Õð•*²-¤Òß)v-èE¶Ú˾T½þVRÿžÕðÒë·M ´Ì‹@ÚNüuGv‡S= +q5]AŸY«Û\a⼎1Y:T¬ùn\‘Î#PÅîIðÁ=YÃq½öPçxû\.ß”V˜úÁgEù‚ÈÌNÛØñ)Ù…¡?4ÄâªÏà’*<Õ×ß4um›[–5`²×¦üs¶À²yØ–ôæ‡bw¦Hý +ž×ñÝéÓ°Žµr²¹x%ôAüm9Œà_Õ~HƒoÇaËT¸°êÓÁÚ›!N A%ѹ 4Øâ! Œ¼>ÃEÁšÜkãýU‘qµZÏÉXdÈé¼¥,{žSÙDèƒÑ¼^`ÍËO±7w(Cã2ŽB}¹M1û§ì<ÝO7´db¢*ZíU8Ô`ÓÜ‹¾ñ~íýÎEPÒã0âŽÜËNÕÎ~À@p¼ +Áòµˆ»Èó Vˆ º/寿Hü„?VfY„CÜ? §B]«W1 ¼Þj¬ð, +ûo³.ü5ÂUsj”‡m¤lQ³êÅèb¿Í CTky¨u3Öºö±Üùl-/n¨†ÔøðvÜíL¥@‚ K΄mÙûQºí8D¸ÙZŸdÚ¹¤kÕsß(R`_Öx©‚Ý£%ÔÓK0Ê/ÌF«ÔAŒ¡?Í7‰»@I§fÙÈZ ø}¬@‚SŸ»Ø\à¿@ô‚ÌS„ZQ®Î„éM‹F=;-¤/só4¢ÚÈd_È9¢v^æíØ@³À¦s’%gÊç%Zó$·¬¼0ö±`ùÇš‡êWë¸õCk¸¨8w… /Uné +›JÇ]ý#€Jδښ€[•Í8ÌCÃTûKrT”0¥q›´ðî½WîãÉžâÑÒIý½,e )¨¤Ð…Cªÿtó†\½ó¸ž³u8£ºØgºaTˆBƒtÄÏŸÑXhí ¯(Ü*Òü¿,ÜPüìK]cÒ7mL!zzË<˜+®Að9>Çåu¹Ëmð¼ï ¬ +àÒ”Ó…-hrn€MågÛÓJÅé¬9hYþí r€@ùYἜ>f»”¥ë +vlhœT_Ý#â,°%Õ|lxóAÀTl½çóqæ»”XÜmš…βz|j}oÆC›œv6˜øŸó[žc$ÕJ¬û"ìaï}Ùt›U^ØÈèÙ§ãEÐX™ ‚ÜÖ6ÉÄÒþwî°¶¨}eõmB†%µ,n§Qû³TâÔ¹ÔLœ’÷A¢Î#p}7Í Šˆ«’ ˜˜å!áDÓ/ò1¥`˜Tç…ðûIi¦nþÖ'Ó2\ØþÄï’¦*î½ûñ{;žÌ Þ·õÑíÖƒBÔêx@9÷S/.›¬KůD’±jùàŒZjÒ‘ÊØ¡‹„ü±úƒÎ¹ÅÀ&^1Š¨LÂÕáçz²h-ö6eARw0)fRq€‡’ý¶dš¢7>tÍ(â…I&—¹c³ä̪‘þ¤ì)ñÜ(ÖàÇk††™ íÒê!Z¨ªµ±Ö™q[c×¹áXðçA–Ï%«)…]ûŸªÜ1x;TRa¾þ^°q${¢« RÌ°¡Ø¥¨ÄHž#œãOÀ«1™dø9·)É)OV ]Z¬*$âãzÅóÖ@dW›Á¼#&*8F¨”¼Ù÷Œ‡¯}ÕYÂ7½OÙUGõm +¹A"£KDÃ%’ºµÇ•(A,u«ÁŠs± ÛÅŒUiz«ò^9¬|¡k£IJN€ÿMí²"®½ï‹¥V“&iÖ"@ÜDf B¨5S¬¸O½;#ü•Åð–_’ &W{ûá1¼…¹õõk.ªQúãëp½ÂqU‘‰÷v{Ô]¯EêÿÁ0Ûek“=uçÀÀå„•ŒƒNªÊ‚Éùæ nÉPë÷} ev2´†ÑüF±þÝG$;?S$ÞMÛ¬<”Ñáó“G°‘´k ¯b˜z9Åó?».q-ï_ö¤{…^µFÔà«aò)µÌç„æ‰^gLM4æÛd]Ðì2;P-¸‡ +JÕˆ¦IÚÝÕžzñ ÈÞë¯ß z+7FŽd#àB½êÅí¢ûiüé^í¾ëËA© 0ÅØL¤£6OÛ5ª Ûšja Xªo(-áÆü—c{7íUäÖYòè¦WLuꤩtuÿ›åm×Bt °T‡È°n1àWcà³äR€²\Ö-ÜÈ|‰?ìâ1‚5«½Þzmây—Oœ~kZzäðt‚ +Ü ìà +WÞÒã&tøÐè$ÎFnýûÒ½‚±·³Ë׸‚ùmËï”ÊÉÁÔ­©1ШlS{°dþýÛ¸¾U¨YÜ +MòIÈáÒ˜ÛÞ”ÔAå;>ßg7Âä*÷]{ 9îF&ùtYu+íI+¸}ÛÈ@D_7žnéÉ.¯£ïZŒ¿·Þœ Å_;Lò} ^|¹ +ß0ô¦ÀãŽÛ9ÚEZ#‹»‰h}ÅbÙð€˜ÿm05Ñ*\1»âŒ¥@±Ö¼—§ßVû³Œˆ¶k›ÌòZÙ`¶ðç6à¿C1ŠÈsèâëwÂù~à*Ùp´Þã%{íñ‡t V¯u;ûwP“>-_¦ýCãW4(.…k¢ÇþUì4!ñmÐ>¨ovòÎI}Êéa˜õœÒ#cã2°t`?çÔ‡ÞÀE›¹t¦ä%ðÉ_°oÓ:n½RµYAɾ¸rÂ@&ÍÌŒØ$ä¼aÉ:{AÊÎß&ë®*•y }NôBù‚Q€SêÞ=q«U•»[Á”ŸŽsn¬c¢%&8äLáª0æu 0ׯj¿WÞªtÝÂŒ„ ~< ­DºEÅ€5ï»°0¬Ù÷Ù@Î%Cå#ÍfçÃ*)p³ñŸ´`‚ p”µñÙô ùèïßøL Œ+ßë ØJ"rpÑ?öyÆáÏvŸŽyp±óc¹èË_á†{|%f ÓûuZúž§±UûD0 •O1Ø°L0íœ Û´ ®À¯ 4ÒÇOMÈM)¢íÑ}áPúÆ_Û«cÊ;j™>®x{+u ÏëD䩦3hÁÔžsaÚXûÂošò2¾R#0ÅÁ >ã1<ýùø4‘‹ô­Qf°«F¼õê|¦IN$i.†@ )ÀB4®b^ðü\‹;©–. wíFT5cŒ’Yîôã6Üùð„D |+⩾ۓK‰ÉÂÅÿøݯÑU3’ÐiظH´\L˜7‹ #eŒäùT?jëžj5Rv¢v¨ ólðÑçAlö‡€zlþ!Žê—Ó–îW/‰»¥.‰óh+,ÜÐœ¨âöTSòDÊò'·”0¡è«EIcϳ‹L¸5É;üã[êŽß%Ni—óÛŒÍÞE±j9¶®ë¬]‰±ì0ÛÓ'¶L(­{š<<žøÄe +ê0:Θs„"»ƒö\ +ß$o éDÙšb°¡ñL[ˆÑx4±¥D±/“t’\k)ÔCµó?ðl¢ µd'5¸Öß ‹˜Ä•&IBo½Fû´D>†­¯èجå©]é+mžÔÐV/gÊJ,zëuIt‘^\Â:0ûNß,ýT ö%Ü`8ýñ¢bôÏÄCŠG•Í—û*œ(²–èÄÅl¢îA‘7™™÷yåä‡-ô +`³’m=)žŸõ² +&ÅÌÄ«cDsÈ£šÓ€ØԦȉ ׇ}ãÁÄ]¸oQ^J4P Ðßr¶Ö1Òt am½j”‚ßEŠöd\FH×jt!v%à¤ÈY=ép²Èƒþ`ó-“ï¯ïa¿ý™<¤ÉåŠÂ +¸y€;_NF`ç6Ù‡îýF˜–G‚…1†}ÀYæv=CA­¦¦óUp³6·¾„1gtvªàL:昃6/‚§7»5u¤'ï\ÖéaõxÔ/º@¤Ÿ[ŠÆ—ti„?>Z˜êaG. +OëóØÒŃ˜.¡–Î,É‚QëUH…>Ñ-ÖÁ½6$£svŸ.ÝV‹>œx¶ÅRGÄûçTh:Re¶ô!?ýxˆ!±L#Å¿<YCîM`’넨tmº½È@ÄÑkÛÑ~ JÂm¼+Îò + ‹üG +µ*2Ãõ§ YvÓ‹é+çéÕê¦Í^.žr5ç÷Æ3(N'¿x뙨è #èåŠw,4—N'_#>¶¿>§*†­ä‰ù,• PôM0%ÐEe}G\”]ûž¢ÊÅöÍ›4öÐI´ãX¾oÎä’ÀÐ3±!KÝè±|$Ú§ +Õ°RñX‰6Ç»0í‰3@skO»HßæŽVîB÷þÈí#«Zaˆ9A8ð41‹”~Z^gïA¸3oã—)üé±<¨®y§Û—qe$Ñê,W»MÜêáœ@~8ºñ8”)mºVËiM'V`V4{ú3mK^žƒ- +“Ö.Êwj*t¢M‡eö®NMI¢ë|Í”}Ø*ü'`š¢|=xDϳí@–´÷OŽÂO–Ëik±P9W¹Ëò1àLåR#GË÷¼™ a—E9i•Ÿ,Ð~°dú + +Ä% )C¹fƒ.AF´‚±¯eÀ…Šw{ÕhV“²iÈZ'Cê‘M}﵃êÖƒ.[¾óS:ŠÙ·Y­_3©ÙUÎÕYäˆèø›»Ñ_ž/Ý«*4+ã,FIwœ¯ßoF¢Ù«þ|Û^å±òhrÉ|¾ÄM›Kz< +E({¯Èñ‚×Í"‰µ|ýlÿÁóp!2ö»sÊI åËØzeX‘ƒ¼‚ΖÃGh:¦^ÊóIeÓ½¡œîè$SLÁ‰úºS`¹‚~nÄDHH+\°2Îíá­2êÕŸK>³õ »£+ž¶ã<¡SëqÆæë_F3œölsò\hfßà)Nb>èewÆfþ)¦âª+ÙRñ Ç)ªõ³;© €´ Þ]qZÞoà 4ÐwäîíPÀD8¥óQÎrqý‰Û£Em…Sê¨TgHê0ÁÄþU\–‹-ÄŽz0ÞEl + ù_óA-CDÍ*µ°æIå”I }·ïy½×Ì–ú’ÒV5¹í|x=8*$ßIÁà ,^mŸ;ØOy¿·†'ýþIÆ,•3oÀ`%’´Æ°r ЕMTƒãÎiÈEN]  †GMÕÂÔxÛ* ž±º üjÁ+z²îóî–ʵÑ“Æ]¸ÇÕBð©øWw!9aE•þLÉq¾øÔ½ti€Š+ü7šH¡ +7.“ôª´BɦaapÅ\ãZ°ÀZÖÐdCï6Zðfö¸z+ãæPCw—‚ŽàgÙо1cE äLöa’ƒÚmZw°Ä8!ðDG×âã(a‘öÄd=âpR÷ø—Q½&‘VÐ:Ö ™WdõìµéÇœÊ)ÓyL^Ñ”Å%]ÚV¶fÚ½ ˜æQOŒèËg¼wÿ›<Àà­Ë0Ù , ™ ¸Æûø²¨M\Ã+TE±¥:§ .™bŠêÑŽƒƒ2¬}¦Ýzí*³&[­BCÉÔîË®a×êt™jƒ—ù3ùL[Tmý¹ÿ±öä>g”±’ +a6ÖáTw@H*ž¤cz,vÚdºl¸–0„ˆáÒ!Ñ´ôŠ„¡cÏì,áC—ÇÜXà}”±xç)»C*À•Ògv2nÎ(h 8†zñXôüU4§šrñÒú‚Çúù+Þtf>•#.¥êÄfç2– TŒÐuËÖÝÝ» òCÒÚ2rœðûßolâ+0ÛU æ ¹êghÅw5­¼ñZ+ ÐLÐ-`†3‚*wí©g(¸äÜ©øÑ£Uc ßög > +AÑ´¶þi†Ö4UÖnm1q•,yÆ5Šb)‹ ßvÊ]?(fÂgûT‚ç …ÑO ?†Ù1G"Iˆ¢cíŠ2ŠN{M@ì¼4n<!M[}°¤`s +«¶31& ^òG]³œ–ãŠua<†ñ*˜vNtœTsC"öÌ;›0)šô“,„¿7}#ÊPH*ã¯%)2$àÔ)޼ū:*9ã8yÐXhå1Cr%Ý«ßþ•®Ùñ̳‰ª¸O¹3ãÇÄ,[åtʉFÉeÚDz·n… ÿÕ[wÅ¢­,Ú°yQðáõ)Gž^«Ü”úŸ“¶úݧ`ƒõŠÇ´±¾áu€•Z¦}Õø–ô¼=–€ƒ8Uif¥ºÜÐ5S¥–Se6XAÈõÞ¡ð‹ZTÜZuÚõ¬\+“pIL¸šS°Ÿm°Ú^þZ]©$Ì¿ƒè¶ ùêmµ=æöÚÓ=N¦ ™ôͧû,Õ´‹™Ü*JJ¡0ÆʶH[–š)…åùP_ZõÎhÔuè„gÏÒŠ··îÒà²ç™”¤°øçq<&˨ܴ±¹ aôcˆA†1RmÍÉ(vî†<¹M~„Ê íK[²süYÜ –V|(HÉí jß–T‚ÖûÔ· ™#”ý6ƆÑÙ™ÅD½1ø êèÔÅ-˜àÁÓ V^†øc.Kj´fÒHØ"ñVeùvÔÇê/¦Á‰%gÊHÝ´¡a@ØhöÖG@L”;Û%±¹UØ6kïØ‘ƒO‘ãרˆ12ÇI‚³e²4eCü.w—™$ÊxÄúe#T™NÔ +kf¥BÞ¿ÎÞ©´V·Hx-aDpJÓ(‡Ðxç÷Ü×ß4#ép>’;0 (fa ½ò¶RIMŒwë[ªª~YP®QlUçBõ˜±`¶¨ü5¸†³˜"•]ï縵9ˆêm—æ9†Š¿ ¡Ç"1ðÄè^$eË,Èú gÀãQs} M’ÓíúH ! >P˜ï¾S>ΚôÙ‰åIÒ»= ·‘fšÛÎX;=ˆžï߸ão4âð c<ÕY`B3¿Åú×:_€^úH౤Ps±ÖFTPyøn€è¨Ëûøû•d÷Ní· `h›f¬Þ˯A‹ëݸÖAÔ\$íP¿qÓ´ +ÒbXxÖ¨Ÿ–\ô*ª™KIÊ5hžÛ2^Oçï&+w1H¢:L0›cYE(€ñ|mæ!SLZV´2Åñ!Ic#qvÇàDÃ%–€ñ‰x*X/_Éy®Ë·Ä +Ea˜È·A…aa{uŸ#Ì£!%š­X­¿[ÿ1=¿"{¥²ÊÆ÷*w\ŠiXª†€í£s'äè8ǵ-!‹F5¸þ{ þ—&0<òÑ´¯Ò6hs§þõö@xt”ŠµÁÕÆâgŘ07»nžÀ…·ãÄ—²ÚõsÞµH‰S4ÍQo½ƒßv‹°ÝžÙÆùv¾õŽ! ‡Sý˜•׺ÞØ·o“fŸé2`Á¯l®ç ó¥~¦¸N· ÕÚ£@jœXkNgA1%7ñ²×vÍœ 6~ZXÔÁ¨a§ÝyùÜÏ*'KŒA¥ÖfFL—",ha“óŽmz¬H†z%i¢ñ¶X>I€}.;Ñ„2KŠ%-爠¹f¶¹¦/ d_¿`Û˜¡~wDÜU˶0²ƒ6¥T<GNR'Bˆ:±2íÕoÑ2ü“Tù`:,}u|'ýa«]Çï’©W¥âßë$³hðÚ§þt÷…œôª5Wø2ÞÈ€J ûãL¥9äP¢}4¼+se'ZBS¤Mm[l@Ó$=bb̾T5?6ôà«#5ÑÄÕI"8ˆbûK×ܲ½xQ+|šå.ÝÝiahwm?sZ}Ò¶þ‡ @û ý“Cí$æÂãdY»ÝTñ™T:ªêȸ(GÏT)¯©Œ…½|7z5m +°¯Þ‚Kt4:,“¶EïÒl…®ˆ«|lFêwÂøb¼+È+æš­[ö+ƒ¦W¯gnHeñã+#‰t=XîŒ-œñó/•ñ}7—JMú7”bàÙ'!"Îc Qq—`Âpî|ÐtõÌÐs;pŽ¾x! }ß@x,s3·õKÕu»ÍɶþhhµîèI;3Ük”ÇkF,4"pêÆê@5Ö†­˜˜S?L[xbÇÔxUüµ[ÔÁxûº o·ê¼{®a¥M0ÈËŸ[š›š«¾¥ˆD,:voíJ <ضbY –0Çé +ì÷ijP‚,«ÖiUœ÷š'ü8e¿b‘7^(‹AèT«ª‘‘Ô}ö¢n1ò9¾ˆ•oˆNë!’f)pK¼…ÖÚ\÷ÔïºIÔyg{Ô“øB¯U#0‘9¸ÛL'&W³gF$Ó¡ÒJŽ8©@«î¾w42 $µ°–ýpŸÒšÆykójÃN°…è0ì¹Äo7~Èî3;èp.'®£â Ÿï¨sšëÐ +s+#N|zÀQÊÍ€'ñ9^™Õp.·}zŽÀJ¶‹R LyªOÅéáªÅˆÓ†t½}.”ƒÜ ·kz§Ae;¬Írš“ÐÒ^ß@G»gÓ}ðQu–Tf‹ÙyÐá‹÷‚‘µ +—&xf¤Ç¹ð ?I’˜ºsµÕÏ¡R¦ž5„$ô ss©¯(?Þž’ž çN HÀÙ‡ÓåAaÐoïÕRMìãFs½v1æ^çÛcèB©#!Ž>Ôë²= Uë€@~Ìeª®?Q[„/×fQM/ˆó®Ù G\¡ïlð´ÇÑ}!U_˜ÕÎÖHk)+4$AZn%†(ã[ê¿/¦º ÂòæÞŽKâ2ñ‹ÜÖùèÞ:–Ë\C!‘¾Ìh7š9£í˜°É¿¸5ðñ¯©ïëÉ™sÕWQÒ­OêLàlÝàÿ0€W’ÇújP¸¸]_z:Øïr½©ï‰ê7MB+ý®Ä’$ ÿt¢ëßÚ|M8,ÕÉŽC}‡V’¡ q¤éxlz~œÚ†³Xï4êŽSšO 6W2s9‘#¸‘)á>iê|ŒVPIè‚FKÎÄ–쎢èx¾’»¤ÿ< bÔÞ}ÊÂF<®άmÀß¼êjH>vïð"~v‰½¨?²õ:ÙSš5àÜeuäísFiÛe÷/£_ŸNëC3~ÿ+w¾KºZè«Š‡™sbÉ>HÊCº³àÔ¼Ú$B0*:dx¶†d¸à÷Œ Ð*âÌÅ…Á‹ÆQÌ—fK0(©Þímr'†U‰ÁnUÕïÆmz‹í`D É€Ë@ÎÿÞ$‹6H¼lfkš âz·ìqâÈ#Ý3‰WŸóD m¦î‹»TònP½p>_½Ê¿ÖÔÀª’#sgÁå(N™s‘WjÕšx7¯1Oøv«4'›Ç&ãêC¹ÉÏÛ“¼$97J4.uteºlßæ,<§§¤K]YloÓÈ8Å+w[–ôŸ^ÿäø¨ã#G~EýÏ:žviÅ—ÚÌv”ú‘Òœ»CzǺWôPÄF¥#LA~³Y´à”ñ°a{:‚G¯0Érç༕fÜfRÌXlžy!÷}3øÓ\,Ãï[ziÒ›Ç+„"3Ä2~]¥ d›€ ¬µ'šC +ùÇ¢kàÆIäþÎvo«ùLi¦t¾›ýEÇŸe“Iãl|áÈ>bS…ãŠpBa÷¡ú«*—“"A ÁÑ‚¿c¯ @ÿ®# ï²N 4énßç×4ÚˆT°¦-Ï‘ß<¡7œ7§4À„=žW.æ+PæË+7õê…c¨æM” :Õº·é^K«©>€»Þ5’Õýn}Äk{ûJ9|t·ÅÂWœW{mo­—rð%áÞ,­¨|"sï|Ø o‰ÞöIs\,@Ìã'úîb,G4¡â7 ´K'?¿#²{>4·RyWO GÔîÉàU3z¬äFî[ê|ëu½‡ìŽ,f+/ÏøVÚà% è* ¨™ªW™„Ù³—_ª‹¡Ù\û“ÏkC’ù‹µÕ~,àÆ3ø{1AÙQ_Ì5¦°ƒðe‹áΠY`ˆ^=Nxƹ4L6g…¥3‘´ŒÙÝü K¢2V©8@¯ž@¦ë±G8»Š¥Wà‰›Ñ›ª»ÜºÚ£˜#ö¯­”úˆ=#Þ˦Õ3é`zAeM·˜áãv`8ÁP·%[˜rNèv¶$)þ$9"aÅ£„)ä›se©Éž±^éÔ½Ñß2Ðx¹Rï‘žA{p†%ÐþÅLþÏJáe=ó ¸Šq‚€ßq´‡jMÔÐñÈtwâ>È[*{!D\c+iRG:_„ ²pï#â¤÷øWp "(² ¤Æê,ĸ±žoÈã‚o:ˆåk‹Ö¼eyˆo Å«ÿˆ¨ÈIá¢ò©ˆ]‡ +¨ 2£öÇ2ø(UqÈ/äéK úµr>g +Þ3¤¨¡6‘«Nç9¦ûÏ–mqœ÷r•â"ò*¸½¸”¬KàÚ¡KìåÆTv²àïÒ³»ÝMŸ +|®ŽˆK{~ÝB€Ô·$CUUvÅÿ)k. uÚÀ!z7‹\ì‰L8‰)‹]:L,Û Þ¶2e†!íå"d´BI×Äâ pð <¤^îBMîBÏ£¿¾EŒ”r߆ö±è7 B)ü$KâL +^§•\Û.ôgÍÍJ²?|EÐë¸ÖG)úØ뙳ÊÝ@j~ÐãÚJsÁ^ ¦Õ~âíÓ~¾å¹D„Ó˜ÀDË2øš~vèªÌì¬È³"˜ Êü²a)XÝ´ +ˆó fƒSÝS‡Â›ˆÆY½{ÌÏä(ù¸ŒÞ¼ñ”nÇt5 Ía¯èuœNàëbÍ€_Ö˜ü°…à‰!C£nŠ#}, Gú¨÷=æ3‚0•Â §ÎÖ!yXêúí,øÒoo¸W˜‘Cî´¾"¬ØÏÊ׬Ί›AžX‹Aïz|ln\“¬pƒ5ª¯Vä=iXjIø±!û4é6ºfÞMŠ¬ ­8?›MHlÐôà +³‘èvEÄ„9»ºÖKœˆ¤ )ÜÉd;‹u¥ +¹î^æn9.™_½SI~¦¼áŽ*í–ú >2ëp0qäÓÂ#ŽÎ +ÜŽÀœþ9é9Pèá’ñ8õ^;‹ »èJ´iR)¡=þh@HÄ B ù†pên‰{ޔџnÆQDE£ßôVUÜ)†Ø+Ô×ö)F-.©Ù_¿«Ÿj”úÞ@ +î ZsAo™Å.Õý€», 5͉ò¶ò=èÙD„g¶–&áŒRJïÆï3±ôðÑB©?Ø›ìùT"¢¼º^vÆ—¢V^y[©­½Ð“•“ØÝP¯´ß‚}óÄ,G^ŽÜƒ3Da7«OXÊ¡M‹å¾a¤}j_s—%Íe äËCW½a×Ë–,N¦³—.6šÒ #!Â0äÞªbk9ÂGŒò¹SÒƬÁ|¶¥(YòuØ3ËsmŒÝíècyå¢Æåå#ð·b%TKX šàõL J»àÓúêý J½ +RUö+&ãj +…!ÏgÄ‘›¾ÕÑT[”²jcŽа[¸n±¾ƒVA‚kG\+Mrèf|Ͼ|¶¾ì:,„®8ŽV8´­ð@„§guÏ¥%m¿ìI2‚E &Ù¶s–ÅäWô¥kA®ñCÉÞ¢Ìæ[FF·á¬ By±M`€«•vÊ®.¶Cƒ·'BÅõ\ÉÇêDqdc}ä¹0›k_éÊÓÄ#™‹ïxº9S'”Ô(óá‰î{¯d¥n¦âÓÓ÷1Æ}êÝí’~Œ¸¾Óõ¾(§B g\Ìçd®škøÁû4EU}Œ|ìÆ”ïIÚz*‚üó1xühâüÈÕÛÁkDÔÃ2îðÖ{“ë&#ך“­3pA˜c(Ö0 $Ôiű {ésì,+C_Ò%g‘zoz¥Ü²@'\ñ^¢M£Ä‰Ê[£Åáîjìq/Û_­7ü{u¹¢¤b^I –.©ÅV›³Æö®sõXãøv~ÈåÏÈ]íúvz ƒWq>:·Zo§¹cÈE째6^øƆBÆåñß<Ó "ŸîE¸Á‡>Ù7Ë0mâøÕ,¼·0‰ú+]¶Rn{IåE«Àuæô#ÕD ¤Nh6 ö‚ð_j 7L=û”ÔK…)YhÐΧ2±j³Fmt#àô?&íúéÏx×Rð,5xðÍŒh¸HRq%Øz>b.3;F> g#eL¶ü|áQiØ~Åñ™üÊ9g3qè6Ÿ³X­äõ¡}ë÷°f¹çÃÁíÛókü*wË]Kï.¬7éós}™C„ùu}Ecuê¸u9ÖHÅÓ'¡é˜Ãªê•ÄŸÑ:æ †/,¦à%…µVò—¦k.,„lH[ + åp¬C9òðçŽ0²­9ŠàhÆ;-åÏ;13røÐý$U& æ"Æ;³tٛΛùzg·<”Ü઼ØåÃr›˜…Ïm€Kåx¬`EÓÿM»o4’O{Ùžy°M4=tÁÛ:kì'‚â DhuàJƤ ñw‹ËÕ&+„Ü#ã ²9 s+ãyËtþ$ vÒÇmq8Á“©¿I¨øf +ßW™'‘×JÛ™ç]µ·õ©3a†)»W? +ßõŽm‰ë´HvõʱãÜmücƒw´–Re¡êöððˆÄÂ…•˜/wìP3‡sšMâÖ T×Ãœ™#+…û÷¡ý³ð¿»uk’:ãK‚¼ô¶óÔ¨ È©·ùÀðtÇË) +&½Nþk·G£ ·þM$³‘EWwlC¬M9»›’Æy çÛ®éFâ›…î÷K÷ÿRN)ØÚæÐ!F´é‘;Åiд¿ +µjNßJà:Û#Ã=RE%¬+ª–žÚÌ›(uÏ”@;#²·ˆx«c¼IÒ¦¯ûG~Ï~Ñl~ µVâ‚êÄ{¾œîÜÃý¼0êõõo§ñšLˤ“¶ÂXŸÒŒgÔNªÎƒòÄ–NRm‡Ó±1ø6b‰!#\¨öiÄ»”inÀí„ç$)b 뺯7’2Œiwª†"Fn£#ë–×ÿ°þ˜ñ)Ô±”AÆÎt }Û«Ù¬!I‹fä[=¸Žwz½Tl—#œh¸öåQT“PË£ºïÈ[­Žg]ZÂ-…Í]äZ¥—5r)?;×[6+ð J ‰†mf‡$êÚ±ê-éñ¶ ÞYØhÈö‰Ôª öc8 ®¡yÃ$í¯Ø¼6±Š´{­o¨éØ\GG€ÆLã(5ó6 ¥)-J—zÆL$¥ñ‚ZÔQ_ÛP—u"P>ýYc\2O4À--5ŽØ›’XàG¸gðù™¡Žd¿7M¤¢Ïs%Ë®úIvÐ%|M÷ÿD‘È¢f$-8ašÎê^süÎ?¥ƒdû9•×öˇªD%A… öv‰9EÕÜäeãÏ<̱Q7ÒÌ¢n^HÌJð¢Né uJœÀÔjŒL%uóNïyÎzÄèƒN¥áò Ûøc4ÿ2¾ê×dhΚ'Ó‡Û‚œÖÑn]ÂYãõ0¼iÜÝØ÷ã¨R¹þ‡4·“Á:»Æ@h´•éîåýýBLòrÖÝýXBuÌCN3¦'É•G 3¯¶ãû¼Uú?>ÎòÀtV#×EŽïEËëvnô„'VÉÏø0R!<Ζ–§s,_9ÖÞ’œOÍy1fa×UÃpMIJ/Ësœ‚<±_¹èÑ(ˆÿ&Ó&; !Þ@(‡¶ê¸•F³ÐU®X&è±Hî°ÏYrúD!=´(Æ]ZÑÕõœ²ì¶“BÒwJW·; בbÀP”z†jŠÎc»…âÜõMôý¼p¤‚ésV}Œ8Ê2ofJJ|Qåë]}®Çÿ\4_Q|-þ#ôƒ-[ðSvCIsÆO¡Îf Î2…ü-šòcmž’ú£§í±šUˆßIñìÑ/ °¼&`*–ÞÕpáƒß~¹$¼³È,¢GX-õ• ½Šw¤D %¹;Þ"ú^¹ÈºùM Ûh@¤Þñ8¿pŸ( ìŠ2»„ãèäÍ\éøÚr“à³·Q†ë´Ê)¼×ãÀz{*´d†ÏicoF ;¾}]Í€y.Qíuzîqú6Ÿº=¢¬ˆBtñV¨·‘ÕÙ94‘á­Ø¬KsÝAÃèUvEÉ´j–NlìóãXÐKòÕ$.L…ÂU¢áÚçÆVÅ þwV‚QÉ…ßóœŽòkxÙ=§ß×Ä“ûƒñjMÓÛa{ ·ñõ¹e¾A:{Ïóµÿ©yŸe¦õDõŨ賀Ê鸰§«ÅN;Oò6O½OrMà=C]aOv¥ãEß­ÌýøU¾ÇÀÂÂö'ïbÔ­ƒ²­–^ŠÑ™ŸÓ†¼º£FI•@éðº&1/÷ÛqAëéùêhFÛæaQ@•ƒmSu›Í¹ÆûØ^7QAc3T 1d)*KÛjÈö–+‰©à=aøŠG%7…f£ææóÞ Å0Bn'dÞsIz‰ùÔ‹Næ¤Ø`Îk¡C&GÜ@1·@Œ‘¼Û ;—/)ãé‡4ãk]¢*ŸÄX(B²ÞÖx|[aäŒæõpI1W¬d- a pêìÏ3­ê…¡Æ&ܸi£¶W&&±_å&ðÆ/&¾it³VŽíCÈcIt[Ö°Ön J²áa±ØˆMO&3âóϬ†TŠÖÑïôjÐÕ-Ù¢þë “"7[ž11ÙAÔ_˜•KåÜsväh¢ñÃ@o™„ ,Ë…ï9ÐùvuƒÜ‰FÇ´ÀbBq³ …q«\æx+–w»øëÌhQYû|Q©F k^.w}öÊUÿ€ÖÊÖŒqà:Sbº„·4Q.ÕÝ…ÈVoŠçF}÷cµ³‡q`­ÐØ3¦LczÆ ‹Ÿ²’ËÒ½Š~î9´½Ö5ýÏ.:aìôWîÃÞ4/ N=›–-\/ãÿL>­èØ•Cw›å¤ù¢w0D¸ªÐ±¥ÎuJ™"s»Û…Õ:M°3I•ÁPãŠÌð.$K›Ñ3’f‹4Üúßʱnmf\,…!9o-õÖ!ñ¢Ñô‰åDŽ‹ªˆ°O"Œéúuá }i Yq¨Ë¾QšWÆn.éCR/›ö–±„ÀGN}nýÝoˆræ fÒϵî}ŒÖªü¡møm;Êy4—«¨Ý¿ Ðr}émM‚>SžÇiéK".Qw'‚µ#%\3—³ˆBEemã„•ô˸W]ÚOÚ·öÑe~£Uóz ¹ïŠlÁYØÙOúpåК–zi¾évÛ.ÓIcbwÚ[SIs Ò¿ÔaÓ„¥æ¶zUŒÅ,{AÞ—º>9~'ìµ(ç!¹kuÊUnªl'±!Ù$ÆþëyÖ2àkm¸MïÐÇòøºlš”„ˆ‹«Y}@e,MÆýnU§MïŒ-¢˜:e8 ð>€Xµ àš žBë ´‘ Ë÷Y}P É“K tô~r­”Yç¾ð|ÂäOVnˆ€ÒHcß›!7»°hš-Ì$#HV VZÏd‘Ǫߓ«0q£@ÇW#…Ùd¾/£ßø²9ÂP6å~£Ñi9\Ú Œ)À—®>UlaÓ´¶°ûö?O›ítt+vœ{©§\yºìã3þ¾‚r„HšÐ”åUh ¼Mþ“Ix (Æ ŠÃ’CmÇPß)õ~“¤,š×玲{Î  ö麰ÿ³,A¾³K#K¡}ËÔ§A zè®#çlª +ÌQšû¹¹´#%œnáÙD{௱>}ZÞ¾c'7øo$W¼4è–úŽhQ¾ŽÀ¤² T®mþžš7ÈËÆá‹D}Ò_²hÉøA9¯UÝe3Uj(‚æqËš”d‘ +²8`×\æ—Nn!y–uܶ–¸k€Š[1·\6lË_…‘6¹Â¼\¶ñŠÒ¸‡,Ùå[.:åã#Ìïkź¤ë2°hJ)Ù7Ôœr4§?ÇðVßW./؆€´¤‡2vI>²s{Ž›³.ö¹¶KݸIÔNvaÓè‰%$Cõá¿¢myf$…°ü “C Ã’Ä\%‡ŒÌ.“±ï7j~ØŸ›Ô,"-ìÔ¯ÄX#îAÃÀè†Ô½^'-àŸÐX°©äøÂAÁ‚X_—k?¤à)÷  ûÄÿ¥Yû«ç\Ç×?ÿÏ”ÂG’ +Õ”Bx%o_`ï• ¾Š.v¤{íE"j೓eÏFŸÒÊA Pá4ºKµ&Ƽ\sƒ4œü‘M~-R¢ÍPñÕ`ïLS£Éƒ…:\-ò]ôë¦þ)¶c®†-Kgõ‘B•Ò;óYò åÏ?\u(ç¥~ƒÌU_ëgZ°¯£ÜÇ‹1ÑþǃàV†:{vsÀ¹S¼hŒýZ±g$²0W?Èyqîad’t[¯èõÄÉ$ ë^ž~ù© U ®^ª™,´ê§Å ¯ÖÅ°p†í}]¹¾”8ßxéPà·×ø ó"Œë­º% †^%Í­¤Îûwú*tp3ý‹êÚ‘Ј'20•xJêÌʯ´sà·žùeÝÇ¥¼ª‡ª,É ¥Ó\IÏBa¼#¹i•+R ò†NH÷«<ý`Š:Á«é󄲌‡Ÿäð¿Y†¢”î¿{ü;ÈdÆá{zS’ʬ4 m®^‹»ê4é¬0òaŽ¼ö*tæÃn1S «‘Ç@`Æ¥GìqÞµ†8--ÏûÒšõóY&TÝÇôt˜&(ú°äŽkÿ–\¼6 Zó~B6iå_¥}¸ó1Lñ"¦÷ E-ØKŽô±ÙUmc¨ÏŸ,ïµlbèvwŲÍ48©Q²…Ð +ÿ”Š¯øöKb@ô!{¶ïE@<;€è+î§ÅbUárÞþ[ˆ4¼ü¹­"ŽS`:v-Ëbã É§l2 Ü51Dñu·”“o#,y»RÞå +T̺1û¯wˆ\èòÔrécÄÿ•wê³¢H ¬&õáî­¬Û¹V=s øwS^°­!×0”fÈ +3!„c|k›]BHVˆ|g¹Š)§öÿ¾U‡jÃáMßT›ò%ûÑ#ŽA»Ü}úóf¹‚±ç›Šä&^6kko‘W¶{8yRÛäÇæef€¥Å¥ø£±gŽ8!c]‰½*ÄF3jјýrcY§¤7ʈÏÂÿø%€AŽ‘à«%w±¬fÒµÒ£® 5ÔY0J¥¿FF×qK|O¤÷xÿä@µÂ@U²S2Äò¯É9È ¿B2?ÁÃ[¨÷¼ TMoZºˆ±<Ÿð)Í,`l¨QÍ2“Ej9>wŽá§KH*<.*¸…ïÙw¢ïÞ¹ÚYGu>líSãg‹„·[‚®°=²‰ „ ÃT‘'ãÖ² /é÷ؽ6®Ðáõ{í£ß4„~CÅZS𴬳‘33›9‰MfoêÑUÒ¥|) òæ@ù•/ ÙŠ„x ü¢æY-&t35¾Vx‹]uËØ‹ë ñ2©¨A<¬m’)€#;!‰õ¼pØØjT;"Ã4vFƒód¦ƒEwW±·IÇb8ºÔDÑ)ÚƒH±nŠV¨ +Ûí]œq–îJÁ»%t•Œ 0Gÿþ£Úí¬!žmÝ2Uâà¥!—@RÇØø’‹TÈžŸÊ!lÜ3èÐ[AEÑå>D @Èò]°OÙáü2¾ô! WI;¸Vˆt;Ü 'Ç((ÌÛ¤Bõɼ'*!gíØÓñ•Žè$¥¾Ã…sQi%uÛŸ³9Hï‘Ì: ß½a>¯|ïcóûi¨-6ð¤Ü’ýGr‡lÙ’»k]ir ªÀA¿¿¸OØæg ÝCõØØñ›†^f¶ž¾ŸwWˆ®˜oKG8r¦Ÿš=a/cеWÐꩦ\ò¯²î€GyD"ó˜LÆ + WEEtUþ»¼8z… Â_1³Ëå­ÔNè‡NTÞ:GÆüx_Ä#Ùä< PÂÈ·K÷Œð‰–3òÎùF ±¤ †ëÿ/ÌþH°@Ô‘=è’_áïv< JöXŒnyy…tEÅ Uj1n2ö{ÁNÍ+ÇQÑÌ™!êe:3p³„É.°Lµ¥1wEÍ 6TÜV•8å£8eÌÈ(,¡‡p[Í. ]硳u´É‡g]rºë®Ç$«2mضˆ ¦ž- ÿá/a"]ç´êOá?TŽ4N=£às$Ö]@ÞÓržd¡üø9!Êksš¸4¨1Ãôc·TݬzƒG׬îú&I“Ô’N©iÚ†)"¨} "X$L2ØBè#°1SøiΖÖB˜*~«â«„QÛh1Y£”yð3­Ì?DÁ ¶Îxo8^>‰nƒ½ÊÂÙ3†ÂTμôœ#….}”R£èˆÏP6 ÞZúØdßí‡ÿQ$„Ü}½YF@ŸdXr#˧ïy Ô‘ü"Ò²Iú‘ ½Ò_"ªsxI†C…¬+XwµäÞ!jJMé£ m,ËK«Ïæ¯×>Âûòs3UÅÆÈ:…c +UªQJ1]ï$tË×ñ˜B D;„],¨G'Ês2›vAªÔŠDW3†ÞösS0~¤Å]\™ðµ|ðúPðmË=T|»[,öŸâÒp—J³ûýîz3»A@Øã5Kióï t@‰:ËQWc¹ä|(ÏJ¾C›¥å—¦ÀñÀÝNvÈ6ÙVE=®ÄØÒG½—ûì†ýב³8”o ñŽÙ¼©=‘Y¿%'å?bÁ¯ašË?IfÄ"ò3CCànMúì)!›ë2”Ír1?bqÇR ï[÷µä][H÷´–r‘ØôÁÌhðCKåÖ’ÓÇ‚óíÖ|;ÍR >Šø +.wâ5æÆsjÀ'ǪŤ+BhÀë/b)ëâô,éoÖ{,Ž¥pÜJ×.ÍpýÞßD~óœPÈ‚”~ÞÄxAÀfobÈŽyùÌuþYÊÖžFC®=¡Ù™z ­ø áßæ y; V7D> +á\7P kÄ «øÿF<(Ü´aƱÃO*¡Þ™ì‚‰SÍTàFùÓ…,ëÜ¥ë Ä¢[Ž)ÛRo9U4:±hг"_­ZñäÍÙµÊü·˜ÉÕ¹öØŒ}>ÎJ€¡…ÒXý¬&=Ãyöìtu´„Bz§yÞÀvçÓ„Y©0&›ö[„jÈj’I­ú¬±¬OøɨK;‰Ý`bªB¤•M̯•;ô À\U3W7AbΙs8¸yö}Aà{–ð‡K˜ +ë²oUZuºø-Ó¢e<úôë®ÈàÉ=‹W7ý_SòE©I ¤§db€1QE,ÂîsãkM2ùÃ"xööÉIKÜþ}JÒÉG°{A-+šÜÑaõ¤ùò·éã±Wø¾aÀpAσÔrÊkÿ,µŽ)¯†nÀ†«B¤j p8¹jChååЄ`Ýô‘_fþ0Ðð4.Zÿ ¸Agí/õõ,yÇ r*.$ {Ö`Ü0´‘(.Û¤ã$‚°*ìFÚõA‚w®¬Ç%š^ó“Ü÷ßSƒD›3¬žsP—µÐx®Æ ÈÈ-¸̺ÀÍ)«|¾ÐŸ¾z„S!ÖatÓõ&Cs‰EºfOÆâ°T‘ÊÙ„BÉýOxtcH±ÄÞ²kà7='|¤iæÛ£SÕ®T.LýMVµ'AˆZ~b¼gŸå ^¾q¨GбÊÎÚÏ¿—IÏK[ç‡$±maÙkóc”‘ý)½¥/)7ûá¼aßÏ¥±çl©Nu³‰KM­’V6ßôl“¬ xYxܬ¶° Š127Ç,Í_ÊÑS‚kä õVF +§ö £N‹´W( é§ïªÿTۑሪ;ûs‹ÌƉ9‡6œ~kZzäðt†[’osÖÛç8bµ©uv5X÷ƒH¬+÷‹4ÖŒ + KÍxly·J—Š¡W»Äø QÛд†-øºû2Ž†7Í=f—d9ùúo'÷cbžï›Ú§Wð³ô’ÈÏx²Ðu×ìkÏ\åfIòOt‡ÙG´K?ËS€ŽEÈ%× pàˆ:Jua'Ìä=ÓQ3Kô™@ý{bÌ_þ +,vEˆ‡©J³-:Jy‰œÁ³ÝØbÓƒuãED»±_ƒ|¯Ô¢©SuåŸ4BÙ<í_›wòÉL!ûñ/¤<°{'‘}b‘íþÙÄ[söîÀ çe¿o+}éÓD’$ÚΆ_£7@ŸÂNŇf×(#ü¡˜‹ëÌX²  k€£þQ>ÆV\»¤~æÅîwx# 9u\ȪÉfF‰L *Ÿ%:$[hñü¥ÕŒ•%n-eY–\a.³R}œÏï™­N¦}þ/\f;oå1ö¾b÷Œe†B ôŒs:´êÁŒO`tñ8©ƒ\—Ÿ¸µû'{u;à Þ`¥?µÕˆ¾Çâ㉯¨i_†îדN©E»Vù:¯€8À›ÕŸ—²AòÑ`iÉ»ƒÑðåM/Û" · +õ.q_€ÃSo‚á.{à Ò:íÜhª.Eç7[³•¡ü¤’ îîÃ^uæCîSÌ‘‘åUÇ9=1ãw:£ã)F[c¨Žb™å?êÈï._23º™;õ¼;ÜpoçLÆŸ‹§¯ßÑvÌ‹ËüâÏ°Rö^ zéûì’Zæ=ë˜ió °S.ÜÉÛg­O\—/ƒ‡½ ºŠH; õ¦n,«° ÂzQãy«^þn–Õƒ)E-•1üŸôV$ ½[­²?A"¶~çU©S»ø©KZœÓä rBÅ!)%œ|P0ÕÚˆu«ñ‚ýMKÓòoKíþÿA÷ñ*K\uÙûwZzÛCFwŒägú­3Î(Ö2ßáû5Žì¡MmÏè4|åÑ€¶SÊ’ù| +JçjSO(&aOuY矗ÂÄ%ZM(ZªôrÝD‰vHŽœJ«Þ´¹òm"­¥\Ó ž!BRâ÷µï“3ÚyáŽ!Z™²+sÐø‹<ÏV¦rb_¬Õu훤¯ë£ ÁªïFÆêò“]…”š[uýÎÙɨŽ\T5¡øá”é¡ú>":y&¨<ö=Á.ÙP4BÚ½e„à„q-þ›˜MOµ•‚( $ËC¨¼Íù.`ß¿Œ|Tiè–çj<×"·áxnKàc ÔŽ˜.zJj™UÎ.ŸEwA£ø6}˜˜y!1¢Ÿ”gvu'@¥ù’Ý#§' ˆ‚üȾ¥ñt©jÅÙ)']Iµ—8Jÿ¥¡ôñú|ÜoU.ª_4ºÈÄÕ•|R4dkâô‘¢d«¤vh±¸´Ãî‡ïÄàAGD÷ƒTÛtX*Ó7a9œ¬‡¡,%8¬»>äVŠÑ;¡­†:l4 f‰¿-¢/'\·ÛÛLH««läé{uÊ1G.'J$=kö šð=½õD_”X^”SÝÀÛ¢IÈ–V²‘é²Ð˜#Zº±{5@5ñU†€gÆkEìI©Ho—¥Ãq”µr·º©d•‚Î)éàõÿ¿ƒºñLÞt“a’¥´ú¼}ÃDñuÆ_܇Ȼˆ|ÏPÅ…Í™{ÁÔã5ºA¸}Ê ¿Û öÏ?EþCt$£û¼ ÐÉàÙûŠâ4}8¤å—ûÜmÆÉO3§[L¶SãóMUSb‘gzÚ•­¼9<ñ©÷I‹´ +ü…–&Ÿ5þ¸3è(–¡y9a”Ö“ßì j¸ø>™ Vâì ×£yÉ<’13‹Îà5þ¥óÑ>ˆN²nÔß»÷ ìRãÑÞÏŒuè\Ó¶ýí€Þ§qÔAïCt–6rE:w‹*|LÎcúE¯>î×=Úᦂ|(õèĈiú¡Ó ÑP+Ïl¬$Ø»ŒcÍã3NeÐ ïÕ¸ë‡Z[„Åq´SpŽ©3c•ˆ:CšhŸ”[ýµé{B&ÜOkSE_ý_˜,ðWw +f&Þ±ÉÍ’ŒÅ ¸”ÀÅõó‹_Z`s€E{HÛ‡Tª,&°Ý:¾ ›SÎé!l–2 ûLét䚟ò¨¿C«µ_ ÿ.Í®ìÁ•ô7²«^nÉÂZ# Yk7©–È°¼=¨ÂÈŠRDb³fµÒk‹*÷Õ°€|2Y0 +‚ÍC‘ ñšÈ‘øúëa"’3e4I.¡ŠS—¨ÎÁHâÕQjÓµ!ÊzÚ ëþcsgEatßù›]¢FÑR Œf,:Š…vkTŒ!CV)‰ïzÄ ß´‘I`8)ýMY_äIm*R|÷m|’ÍùP¨ÈSÇÀÕæ8W’¦5g ñA¿ ÁÃY¯Å»”¼9ŸÔº·Of]O÷t½F¦UûZ‰Ðž|¡§¾94$ôŠ[cJÌ¡Yïõ¾tmÛ%NJœGÿ0aù7ëCh@–øHk~““ÎÌ >Q¼fJνÓm`…ûbÔÉÛ\×±ˆ9ÿÉ—9Åï õ„¾ºˆŸ¾&Cëž1Ίҗ@iE}ø3ˆÉÉÃBÇ ôXZÿΈ”:  QÅ.3VìQº[ªp7+Vi§½è!«-vf¬­/Y¿f¿¬"n>ДZÎ*”F°óŸWWG¤ÿó²u…E€˜O+{_´UI —A̹hº²§«ð_H0@þ@¼5©¶y_\àɪpbJâ8€ÒU0` ÚL“k­²^«²’ÕW^™zEÿ4£Ä³f÷§™§èÝHû@x/Dö0Èú¶ù%3ůX} •Äü:QIÞµeÞHXg,©0¯0uoôºmá®z7œJôé©uª·á¥®‡t¢„ÿáwQÕ$8½æMBùK‘‹‰¿ÿ+‡ ‡ƒ TpC¦Zs¬8áÚyy‰bàÕ7*änrRìÝ×¥]}eà~•Q4âîú™÷z¥†§úŒP©ä1¾:tÄy®K=å~-ï\SÅÆ“Ë—#u +¢ôº[çV>—ßN–0LX&dIÿÌ:q˜>¸–”Ýuæxo½žkà=–”€ zâ—ŽvDCߨSä@þš¥]»Jíõ­']“Õ {EP Y=mú’;w:(H5Ó _EðTÃE˜Qc„5„HøG8ÁU†ßAÞž +czNÌ'Àò}?Êx9Ü1`ÉsÎܳߵERà¥Þ ’y62"Ž#ôȹRѲƒ»#á²Ï:#€‡* rª¯T>Å ÷ü ®ûdÌC\ÆÙÛ´@‚âý±Wô™âýËUÁøfŠ©Ù_Œd1οZ [€sží…@Ÿ¹Æ·œ ^ÎÕ!ÌO1uºŒZŠøZÇøž¾ž^ÿ@žžb<ÁR£k eŸ¤7†2’€áÏõ8Ýv ]úø5ŠÖÈX…—á40Çr¾mýyNJ:Ü儯Ù¸³‚ý!@뀋•0ÿç”]%*3p½|AÐþ£–ÔSf¦“g’`6Ÿ| ØH£ ƒŸ(‹eüÈú—Wɳ‰$6>jY$ûa2¥XPŸ¢ ‹ù©Éú—¢f/H“¥(P¸¿0ISœvFè77ž7n¹«f'¬¶.d¸+é,°­¦ÓY‘Ç’º¿’IÉbÓß2Õ·É ¯¼ŽCy­£a]¿8|ÛëÝÁŹùÇ ]¤¶ðÛí<ËZ7¹lBiÓñ[ÞÞ–õÒ1$/95qLL³Òb£™¾F³£GþJ 3‰ø}ýN„ÒÇçø7å‘ÄLj¡J}Aýÿtµpe>ºÆĬ"M£»íÊùmÌ´{³âë¡ùùk8›¼ðR5ÞÓWúÅ—¨3ž i”}ÎÚç‹qh¶ƒø5ñ#­´þÀxb&Gf];Dtãû^@¿+æ^H‰ž+›&H_tlŸ2¡|È|ì ¹âWïYûÑü‰v‰E°øTê‡ +¯{Båé{æ÷>i†GÇþíùº¥û”²Žá?M9èÍã6êë nã´8¢ÁNª•}¢éìSט¼²- P@-j4,œH¬wK‚ÃvºU19ÞzücGIN + èS4=–ÒÐ ¬»¡cB⬴€Å¨°rµ’-y*j‡~õ}}ñÞ€Ø]iïG“ jyu~‰ \öl [ÌiÕ¹yÙ& J.=’uتŽY6M2 æ´ÕÞÏ0ÿªüì—Ài½äÓU1ëŒ&¿ @¤Y&OâéÈ3£ÉÖþ0%Ÿ Þ¶Ë ðÔ)ïI»& ú©P³í@çAPŒ–j¯ÓŠ¹™fþȉýW¶˜¡<{òyÒ^¬”øÝ;uË*c`î’1¨®Y/cÜÝ‹/ òôàòc.½þ\©ê¯×ý}UU£)(O.Í\„Wȵ¡$FþŠI<Ä‘ÎOºvú1fÅ>ÏÿmÀTÕUr‡å4uíS£e)ŸÆ֧Ǝ ,+A[6¯:_žáÄ;–º@ +cýšhñLvÐçôÚtSþøÉ›T¯ËBºm;|ÃYž‰"uæ±Ö9IS"2øShÔ£ •¥*ƒ%ª»``äФ6Û+Ç [ïk—÷{¢ŽN°ÉÝÏ¢Þ€I1”üõ­u×9ø½9,>“ %&nŒébÞ" H=Ö¨G¶ƒâ™4ÉTû«P¤©*‹ýF¼Œ5r+í8…ï°cÇÔ±HY5´¯,z(¾²t:f‰§¤KÃVQAóâÿ|(Í¿0‚£ó€…‰ãðÐüìÍ‚4wiÁÒ!Á‘ß@cRÞ‘³3>)¿;¹V£):ï'›B ô=Ù4ªBŒ X€Ÿ!¶þ»‘°,Ãîüˆ<äŸÙ‹ /¡à á·¹KÖ¿D¥!Î 6FeÙ)kÌE»‹oƒµÚ^×ßîÆͽcš¦`IMb¹ŸEûÔ½«}àKhŽú[”nSè·´/k™}Jàvé­é^öBY8%SƒJzÌRÌceJî¦Ì¦óÏ b“§dûBôªºSˆ@Éý<¤ wÚ»‡pÙ2™Avùxêl be¨±±»4ˆ’K…‚ /MÖ*§Îˆ´!ç?OdÔbf©e$*­5Ki4ÕhÙ!ý… +à_gqÄþ’ö¿½o~n·çXZ>®­+ûv[*Üó.uÙí!!¡2GÄ ŸCð{ +Dú´Wì(E»Ë'1~!¼nN§šŽ7¡Zq¡Žn@÷òüXð^‘DNÞ“WÔ˜ò‰þCÛR “¿2|QN»f!E“}ã$™¸cð—v8ÆÀbU¯rðÚ msÛó1L_o= Û^~”«NuºéíMÏa~Þÿ^i¸³Ï*d®=[mOÌpœô·@Êzþ×Ò 6AÝÏʱÌøñfòØ¡2é­XcR9UŽÞ·÷öy…L ± +ðåx›þ&äŒW;Õ_®ÃfýC&-[7©b@?i†‡™ºþA1¾¶ÙrO%–C‚s0ð™É¥‡1ÒHN$œÅpìg) s†ŒÅÉI`= +~1³Ð†ÝÍæûɘ”&fÅÁ߬Ù:ŠÂ¹jË™ÕF(0šôá4Ù?pJƒÅZÚÜùÁbm vK|² +Þ_Ñ‘ò×_艽<1_-xÞQÍN°x06ßZóÌí\ +ãã¿y¡˜èX&‹ü¾5˜1iFúÓ¸ ²÷jsÜ:·x-¯–41Ót’w\Å­¸oPo¬ÓÜCn'ktâ`ÜZÌým¬ÿrŠ->6lh+*l1t… éár(…çþJ¬–}Çwh|ËÐ7›÷©4Ú«sèBÝoÆ÷ñ@j9?š Îß9ýw?D9.[N2Áøk-Ò}—Þ{¥yÆuµá];öRî7¡²‹éSp’´u¹ÚXob±UÄ%dób”<’[ øÄ<Òá zd÷C’o^cñu |üz¥ûGèVW‰¬«óû™pùfi¸‚}søÍÔ©«$†îÅgš]^@%ð4õ»‹›cüÚˆ~\¬?TÿpÞ+êÉM«¶Ïû:h÷{SÚ“[µ0×Û+68ŒhóÓnª$¦y%½§ÚÖ9ã +wë»æ°ŸôªçÉ‚îzú;vÉRvS¹©5°ø.*K¶µ:T 1ã+냮KŸ_vkΕ⩴ þ› ­…Z’JX¦p•Í5 +ûs&‚·†#ýšõÿ$0d"…†—¡<‰>-‚©U·•=Íð[°ƒÉ|@Ðd²ª ~EPz‡¿p1øQÁ,ZÒÖîT?â¤óŸfÿ„Àñ¹N0QmfGí½Ù¬¸€Ä#`{ßGyêç“ÇÀ“” $Ö¥c ¯DgÂï®às$H‰³ÔÔX,Âçä²õ®ËbôÔöW§¤ÔØé5œŸnj̔!¹à`~?$‹1÷ÞUªpTxJÞìÅýŸ£Æ‹}¤Gà·í}$árGÇ<ššÌá.†'Иr(ÛôGMЮ³BòT¥ºÔ¾'_¡OUÉô'ÉúË–,(.Ÿ\" ‡ D¡J€(IS‚ÈìØV™q–«Bè÷? /1f__Êê!$ñ$Ö” ­‡ruÓ1&¹& ¿ Çër¹ÁÒs:ŒR Á¨Të¯Òl|7üü8¾ƒeÿé) ,¦¼az3ÃP:ߟj¦X1X98rýô|yàìŽÀÝÛ ±‡2°Å%YZ¶èÈ=a{zºº‚#:"a£ú7p>ר1r¤j“_»6¤ŽSyp#ý¹·²X½pù)R¿ôúŠªýW‡‚ƒaÃD€˜˜ŽÃç›Ò2<ŒÕ°½[^*Séû€Où†I9¡áZñâ†æžûP­X” ÖÍg›*?J€Ö‹ƒ£ŽLCp;¢ª8®œg¤`$LRšrîT)P% £‚ÉÊÖ:ED-Ê+¢@²Ãl%J‹èdŠZ1JM8´ápÎ#¦BÛþfê÷õŒiØ@™6OL¯‘¬Gß* )ƨàöÜÅHÄ»i×j9 Š²ÂÒ’·˜ª±G0¥— K 8ewúÞ:Ñ<ì™VQJˆ&ubÆc!‰c9å;'(žÓ0·~ëyé¼,­·výQ]—/è-9˜û÷$Ýæs'*й륊·œ(ìõDìÔ«<(:+/ËR0Kj–Ûc «ñFšcœ¹Dn’ÜähWå0AõœAÈ£ŒÀÑŠåHé¿Õfá3 <|.ã|rý ÿªÅýfà2‹O”_çG0žÉrÕOk»8è11'•=ãfÊ»ùŠÙŠA±(V•»á[úS·Yá'§³o‚>›K_,xÿ[ØÖ¢ŽAf‡¶dQT¬Kº˜–þTèöƒ­¬õö£ydTÀŽ˜÷PÝ2k/êu*õ÷æeŸf7wx÷…Ûh|åÞp–RÄ…uÅŸtJ×Åp£Ÿò·H«æEµ)r\7Ãë¥'ì$þH÷6·ö\E¢Ï»Ë7ßq"Æm}ô™Æ+ÁS , +VMHîAõ•²uשd„Ú‡çËJ¨cQ³E]€†ea_LÓg*t¸J¹¢¾=ZXdÏy&ÇSY¤S”vÃÇg¯¾Ÿ]KÙc‹UÍÆBE£cûž…Š·wÌ”/2Hh0ù'æ'øjRfÇù&£¥ŽXwý¯É¸(®¢êz’î¹ÉÄ—‰ûÇ–Û/õ+?ý[{ÐÅɸÉmÁèszÈ?R›Yth ›y.s8«1i\_ŽŸ ±X³î&ÿ459>“²Ånj©fæЕ”°é³Yùôxù€^XBcÇ41ˬ{%Ø( ©|¡Nž1Æ*LÇòŪºW¡(ÔÃ|™MœÇÛô„dµ¯-&ém8zä`¹zUug´[$\ß{'YŒ˜ÿÉ»Ž=eZßOPÖ<ƒ½ +ÅãGµ’’IÊFëé{a aè[P¾à+ñmøDöoª^ØÚ ÕyIH† +Ó·ÖtËìô.¢1ù)f?•ü6ƒ$Ǻ²4ç’8ðàFã‘÷óÁ@b=Gô2×ÿ;b^Í•ëœc*‹øžŸáýšÎT¦Ïm… ûgìèÊl1k«æ»ÖÓ+±-ïbh)Z,Ö­t2õ¦ÔËIòMì_°¿ã° s+©Ääœ^Ú‹¹}Š¥æebQ“ HsÔb_Ëc‰wBÿŽ¶›‘€ÝW‡DM€]ƒûæñz‰ø”«\NNÒÒ¯ª¶²al +ìK*éΣ}Ý’ó¦>S$Z¼°Çòô§ +˜ô(µônƒ‹ ô…QÖ觯dHW2FÒÈUd2⊚9Å’L1"Lj-`¤bÜä «Ø逖¾'<†¡âŸ¼»ÛÙdþðzá´q,—3$g¶E HŒ¥wºô€Ôö#ñ‰@ž—Õc.âh'c³I}AuÕ´u^N¬·2#¦(¹ìRc=HW¿ìÅBSy4׫¶ÊR0Ë/”Ó(°±²ùƒ†&ѯY†)ÎÈ×°,.è ¤|Ñ}qü5Öa#áûÕ„‘3~(¼<Ú ûñIIá’iÚ€¾<œãë àšÃÍ0à µ§gŽ½*-§‡N²¢õ]ÂSã¹(ºé XFÌ’Ý°6a¦¶ü5 -=ã”íQX,Üb%_œÓ.UVC'G©onËBn¸Ò>+~aÖÒ.ê¯.çdä9ØD{’UÄlŒyßuDQWì×%áÑ\ÿ©ù“w¼»©ïœ?Ž¥ÒSp)óY~(¯§$Öð£äú¹ëËåÐà?b!ýʺ‚¥E÷(H wÈG®β0/}Z˜4Ÿ*¡KÆMÑc`a]]ã°¦¤±¼ß›vÑò…žöO´…Ðh$%§šÆ ©Rp‹CÆ<Õ¼{ð9#í¨âÅ“ÅÛd^j|ßµ•ó…ŠôÍ §ÏŠq#Ú>z½úê9gæúòŸIG²FÍ+ž9SE¢;}U=<?Œˆ¦\šñ1ž­å-DižFCæ\Œ­ tªÉI…q‰{ +¶—†(b³¹EŽ³_QR¿±~Ì÷ô›© vÍÄæ3XÖ3ã¾^I— >È5b¼iÒlƒ•x†H>Ú×1EÈ~ œEØêO÷`‡Å— ãÈ«á0ÎñÑPþÐ%wö²|ä¹wq=c;5€e)ªòŠÌÍ}ê_KÇeJóGø"Šzã^ ºsv£Bš wsœ¼u9Ë9T2·Ðš®£¤ŽÞ…ö{õÿ=äu².rÍ}×c¶M+å=2NÏ¢4‰«ÓÎRx3½¢µ-ؤâãs4zá9fܘ¯í‚y#K¥L秽±Sa ›=@€‚In"î;Ÿ ¼ª¿ VJ åCd+»û«Ø•E-˜Hâ].‹®àŸÚÝÙM²òË,ÆÿTy=Ú¼¼^w¸$Š>¼Â(ùŸîÙLRæ+j…®dJNÖd3ö¾Nct; ÈÖDx¨ü?•¤,â•^¥òˆG¯Õ÷_‚çØ—úIi¨÷.4¯ŠæÒ}óD?ufž78Iýàƒ´mƒÂ¤‹´DòL’2m¾Çû\ÜΡïûxM‰êÖ pÈ_žÜjκNbÎ+HÜåz¸Tö§m¡­‰·Šð ŽÆŸ/B”„€Ps‘º7›„ôÕ&þéVtØxV`Û `¹à\É8¯ü÷”bìÆÈpz˜Ñk˜ò?]% ç"˜pØV8â¹ìc׋¶Ö°³ÍŒ%B½_:¹wŸxxrRÓCÿp)÷…SêX~Øýå ŸÑÂ%” 'rcÛߣLëe,ð=OôKŠdWNr+xø±#ü…@XÈŸ—ÞƒeúZ Ouç¥jбfüov×Í+Âp¬e[[t%^BèSØâ$.šø”¶·¯žÑž’î3 Q>I«†– Áª@ბQò)MOÇ”ï£ÑÈëZŒõ +xlLâ#¾!«™„ŸÇe_eR;•–ÏòfC“ #þ“‰ÁAÝQß¿À²P3~’<;tõ†nŠªÁÔADQa¿íÄP õXÖš!=ºœ†ÎE ˜Fž;Íå„ËŠ=[VŒGÎÍ®‡ÐKÆ}ž3¶Ÿ¿ÒyO4¯Âž§Út›ý\ÐBéûg£xñ¨”β†HÆ|ìŒÞ÷.£E 4pPfü.ÉéçÛØ}3>V~úÓ+?5Yì&ÔËq¹N3<çÇ’C7[¡´·$«’8(³jdÃÙƒÈ{çiÎ¥`UðµZýxHiÎùá´1Íý/}µ M³w‚I›ñÁçžÔ½ØÒ cŒQóFpÔÕ—&õ…°ôÖ¹¼õÂ8¸nd˜ kšùJ“ªïãƒ|ÎC½Àn"UÀþìYÒôìùf¡5.xæ}ŸB`º²Älán3 pÇ_„Q±÷.IŽÌ–é±ÞzèÉ€¿g—_ùÏd}óûIäXI(™kßJú湈ŠŸ>Ó™ÚîÁåLÏ¡U¨î ¬B®Â4Ï[ÅI¨¦”: ^}Ã@¿Üºª¹X'–ÙdûÆÒè€:*$$2¹A¨–û¢Á”²0ÈŸt"ÂCUãX5;Ì~íð®'ÞAúÙ²Ôh²ÂîÀ¸öN–èn<‰q¦zEµ/¡(´V]w¬?8#vͱ!ï*ßjtª2c]âC^´¸]hyûÌ÷hAƒâkÑûÉ ¢¡˜Šf•µq£i௠•ÎµÍŠ±Ù8ëª8dÖ4sçWVBÁ²P8Û³OvZ­wïõIÑ64´Ÿ°4°Ôt…¥ž³Áºµ ú¡q– Ò8Â~xqP”ž0ª8‘Ç–în—àiÛ‡ÂV€ZyÐGa½åÛ"¹Ý…½•Üå×€‰‚£ˆg’œ•™PÅç<ʨ­'UWhëT²à¾·'‹ØSÊ{¬–§©U77$“’^dKÖ)a!v×4ÁõÂŒZ.Fi)b„1 µ«Yu+óÖ¦w!¯'Âe`i¥Ru.ë4FŸ‚ÚÐxðMi˜x)“}°@ºò§ÓÆ9¨_›‚)i=Nqæn‹põòØïÛPLÍc•¾Çí¼ºëÿ.jwŒƒ"o÷€ž1@d!» ªx±)›í`¼’ƒå#è€…Ì ‡fD4~n„r9 øèU¡‰¸yÎV¥ †z‚Ñ ®'>!ߨ¾Ò¶G˜«Ç?»œË·‚]¤ÙcуŒÛ„z‡ÿ9yê'Ó¹–Ûn9,à°ea91¹ŸË;š¿ö(ƒ—ªSçKˆªIãÔçžN ç[úU{ÑKí ™ÄaUlp_ ö:µÁY©’çú}EZP©ì˜6ÅÅL3Rzë{Ï7xF»…¢E)ʸ§5kþ2€“ eÅþìò 4ãp.Ño9ݦ>/ûvþ´ ÔùéKº{®f®Ql±ì*ùù63mÞŽÿUr‘ÚãÈ4ð¾Ðm¬ðS‘³âÉZ0ÝÉ7ºK8fŸfL®ôÅÑwKšõí†}Ðjñ-XÔ~Žv‚Úß“…hg|oua…°±Þ¿!nºkÉyçQ‹c:uÀaÚ/_¾2«öSˆ!,ÇY°Zµ¯ÕÅ™ÀXÙ‡AÔDür5¸Àz«9ÈÈ¾Ì p1¤rÍÊLUa«7,9ë/Á=;ûú”y¹$L¿@4àŽÕ"'&C"}赓B-Ðз˜'Š‹ý‡Ã…åïÒ¬ü‚ÑûÙ*†Ã òþ¼+ç%ž÷ªU$VyÖd]UBt§í[–*\¶ 9)š8‘ÔBwÔ/†±Y¸,qC¾BÅŸlŽ³áúì îõŠy=ü[?ÿ¸ĵ˜åîïòEòÊ?îÊœÇì^ÉQŒ£r¾’Ô„Õæ%  &BA¯ý±€"»Œ^ñ•Ìçyº9Îw rËÜ•í£´^­IÃmr8É=ªl>¿† ²o¢™~:r”èE) »]:¸¥kã㯸HÑóļ{1Ç¢Q ƒþ±òŽÂMíºDj[¬“‡æÖÁ[οì…_Uæ + oŒÿ¡Ëp ÁµÝ¬"Újfµ³¬Ø Ó­¤»Ü ñWœ¾ùJîlÙAÓ]¯bøšgd‡w‰"ñrq¿ô6Šñ9éLä«/Ò9Çw%;=J«-b·3ÔF\-‡’*ËÙA§çxž’ñËU!ôÖ˜QŒâFi/™¿3‰9eÓé[²]C»Û‰ÍÍ­!Ùr{WG¿Ÿ©ÐÄ8”Û¾³s0Žõ{D`jÖÀ];d:¦¾ô{m¶ÀÊ»|@k Dlev¯žxXi Ô™„¤“,½3Ò*\FzaýL"ï(f5ðòV:?gXë.Và/-Ši%vü¢Èûµˆ¤K¬/ûŸŽÖÜ >‡ð“ ŽúžìãÇ ñäÇÕRÌUÈ£Ž°ó²6M×îNú·¹¦ˆR)߬ì–ߟž[ãÞ; *WNH¬›ÿ¯ß¸ý¸(?t eVÛ«A‹±'÷ôI!o<á¼êëÔyèIŽÜ| + ZÐ\Ð<þsKá4KQÌŒâ{_µmL£¤Qª™»c›-ð*ìýbïÀ¡Öµ'¾Ÿv؇‘¾½‡øS¦Y÷z5ù;dÂRæ ¸¥'ƒdùÕnzFßî~ûáËa|™2è z$™ÍÌ|B~6Îÿ§„ó}Ùc42ÄÈÁÏ_Ê{ÌdS¿h ªÔ<_)¶A¿ÙsØÙ#ÇJ¤üò+W~ËUtl +4àêˆÚkQùlÿÙî'¼³” o:Ï{Yd)7£ÌÙ*WWËìR›­u(Én%2,°ïÞÏ….¿ë–Jš…Ï~ lœž-Úåwù¬.¼oŽsUs2û½ÀÀZs_ð1ÙÓ'ÑŠ§³ŒÊ‚?Š'¿kËL¯„r,@CœªLÞ¾dÖ_ÙŸàÂÖ„ÎO¿ØEY|צ`lЯè›F>NŽ£W罘¢­|6‘¼¼ˆk9à4ÕzgŒ*2àÝá·é°ÛÏœ·œ€Y"§ .>¼‹â´»9rÙï&¯˜ð „ûû— —:…±7h:ª[ê:ÁK[‹[)5‹× Ì{À›Ý%†f5\Ú%MvÏã—È«Á`8Ãv§Ù¤""N?ç•óp;´;„žzè7/˜1úRÃ3šswÕ3)×_`ÞëÙš¡ˆ1H¥¼5=EÀ„»V£0Š¤?ª+$‰) ˆ¡hUÙLK(j`d)!N-zk®Á &Å»ë[³ëqQZ,ì«<ÙÔo©–_ÿ°ªs˜Þ€3K£GĘ³ËPâքؤ@üÉB^xæU `UçkY¸/ãFR´r‡ÀôŽÁ€¢›Òi‚¬ÖçÞd0a×^MxÍf O‰Ð[îWð¿ç‘²lƒpÞÚqêè¥Ñ·Óp .9–Âw ìXo•wó‘îg´hæJÙzðW þø ƒV‡ ŒÏŽ8)U“ Fß·qýãº;$+φ 4ŸKA¨öÝH¶@ª| +)E)åõ;¾1 dFÏ:kaÞixšù5,?{ú?#¥+ÚšÍI¹jOfF™§w¾á:ªzâίGoqÈ5õÇ»øº +ë¾ Ôv86ÖVt¿2â EPe‘¢ûWqtXÌNå°i.ÿjɨÅùÐÊEßU À¿®Sš]Ì•5wãM²£ñHáÁv'C§1ñJ7m—¥S…øW.o1^à¡Gò#ê’ \Î+U7ʧRä>ðǦRMã2½ñ9€„t;bé8z+Nm0÷vÜüžÈÝ= )ßò=ÆÜ3òHnwÌôR¥ÿ£½±ÀU€”5û¢ÊIõ L#7¦;ŠKèÛI÷< êïDEÎ5i¦þ´sV{lœgÉHã•(“%ª_ñç€ÑtÐs³‡>vÆxuFaV{Œ!çm@²EX¶ŸáŠÔú]H&ø$#@ª¤ÆušWØ)1f|óR¯‰À[Lç:“ˆW/1hJû•W$  qëƒè»sÙóZ¦CÔ§hmíK–DuxÙ1w—‡ògOß\Ó†ÆÂ’7®TڮǦûsˆÆ»ê¤·f›œ´Ä[Çq­OÃ|DZ¥\€QDxÃýn„D²ÈT<×c¼xk¨ñAT6¾êï¯øqòcyÒhÓ³•@ð† Þ¥*¸¦û:ƒÎ‰˜ÑŸnKÉêôDŒO]ïÐ*óÅU8š(ÉyDöœô0µÙ62’kÍõ#¿Ð²B= +áéE²€ï¡çˆvÔ“´Ãë×=&¼Ïv0î»^À4Ê5;ÕX명r£¹â%Ï(s"¯¼=-LÙNýø|õ¦õCt–k„y\¼Vë.Æ=ŠaÔ†[£ÏÔïv¹L^vÞ³ç#UÂãÒJ‘p¿ zË•ï©+–mÁT¸ɪÐíC¿Þè¥úóßôσ=úö‰FVŒ^TÌùþ‹’j.YZÂÕàðéô2lz^Ds}÷|'ö½_WÈÓŸ[tѪªLê_.]ù‚õmS}·ºãvÅv§Åƒ<¹)Ò\,1¶ã ¼B‹À\,ØŒl¼mH€œž;WqœóÝIÛ’]¶u¼ïû‚zîº|ǸY¢æÁçy¨‘ ð~+œJ!:ÜH¼™]8“|_X0kÇF§ªÆeûå~ß{Á Îþ@5HŤÚæ&Õ€ßß*Ž¦öÊoH ûp‹Æ…|ü᥂ÝîeqKÕŸ!Ï1$ö:CåU/JHK™WáÛâÍ™u¾"Z¾†Ý»·ÂiAáþ<8ôEõ¬7¿)<•Þ7xt7ÏàrJ¸.†ê•ý?î“ Ä1 +Ë3NJvQðN/׶¥æ¯n[æwYÞ8à‚¢ikËxúûü=¢ïý1ä¨ ÉšÎQÕ™P±…¾Ùu9t\J£šÉ6V·lfçdȪB‰HC¸æýÜQ°Åb/ž×1Å:;N(ÉVÉìƒA76Ô}IfÊmø +÷ÿ\´’¸]¾_LWÞ:ÏâÍÓÑ÷?ÓªbaºA7_u©Í¼Â> +Tþ›³s;µ#d8!‘Œ§¥4Ê«e|Jî™Õy¥ûú¤eF¶’Ù†˜ƒßþÇ1Nö¢?UíyOÑk’Kw)NöÿD0Ÿô+yM; §kSÕ‘ÙõE¬DÍUŠZ¯;ÑÜ®ëÛóöFçeŸWyò M»Dã–H㺭3RCnIe¤¨q5•?¶ 5ˆu­^¶§ 2圆š·±·2’·kðjvf·ÂôaÙ 93ÎæÛm‚g’}¸‰}jà˜ ÍN‰fopNâ-`qWåM1è2¦ñˆUýó¤9SA­Ý2f‹2OD )ŸÏ>«·yÙÔ£¨feÈ7N¤M©)æw^‚Óà;•àl·(nº)-BÓ2>|÷°ŽGJ¹ä[N­*1ÚÔ ý´,¿Ëå'ŧÖ„¡¡š;¤7ت„Þš„¦œä8`^d*/¿ì±r¹5 +Ùµ˜®FLowa°÷ÙX +iÏVqþöAÔ¡ž¯Þ'úÐh)ëÛŒšƒ`—æx™ö$Ã…Á CàäÓ,8_üOdÊÇä×)Tq!"¨™(å2µr*ˆY—§¯Ì¢æ9‰f¢Ãòéê3B¼µUè@«¨×ÂØ.5ô¡æê¥îã­ãe|“÷RÚ*ÜíÆr•õ#©WÛeãcàé^°ûëâ6À]PS}#œJV«s?äÎR ¿R>UV‹¸ ò´ŠBÊ]:KzŸ¯|8éÌv“Rc@¸ûyúÉZ¹{1¢P?H*wóó†¶8ãĄ̃Ѽ¿nØö¿Ø4|“ÖhŸf°¶‚šÙ˜Ø«Ã ¿—9\ίD¨Âˆ»ŽJÜìÑöõ|CP¾¢Ä¿Ǽ¬ÑÞzúS»D³¹»à|-8îbèúÃ(”é ‡¹ä?E'c˜pÕÆ.R*TA*No΋.%ñ•dì"4Ç«Heíœ+\2aôϦÐëzÂ:Mh0j6ü¤{}$‡[@”Ÿd¹-ZÐìbEû¥#B0ÕuHd\_jL‰Ö46pjZo|k[p¯“•÷@K9ªÏfG¿ÆE¡C³Ÿà²r‰ze¨æO<”ö’þAð-Šö}{#\€9õËb‚¾ÖòA@¢½ÃÕÄY¡íömšÊ3A½yg®æ•gÎYRþH¼mÄ]¯!ÛRÑ@z>»J«/LOƲLUœÌdrù‹Ž—¬iǸÁ>›4õÐÏhôöØ\î”T‹|S#”î Ñú ½îD]k‘¶Ä6Ñ(~ø7ÙT¯‘„¶‡!¢‘çòWu°§%çµzæðiü´v[æ™ú¦XÇð;q«C·i‚’þ{žúáµàÃr&¨n6-óoµ|Í"Áª©ƒ*\@ÓÉf´Ë?jœÀ'úÒi:Äæä‘ã—ô¢Â­JÒœmâõA +ŽÚZx7 +SîLü²¸ð€»-ˆuJ'¼p1^(Nv]Îß/ÚçRÂoT¾F‚˜á,`wŸýXeè¬OÇýnnÌͲjågøÔ,€ü¸ e‘D2®¾ ùª¤ìšµÀ5ƵÏ!Ðáð8Ô—A ÍÔT‰ä}ù’VR¤fø­f6½©Œd;Iœåg £øO¶VÏ_´†í‹<{´¡ë"…ÿR¼Õ#‰µm±)w åºAþ?x +þzrÂb–e8m$ê6¡{"JžWÈNqq&½™¡°:Š0"™ß{5e´èc&X3>ÝŽí¶udÂÑP(ű¥‹s®霳`9è)ÞGã•z‡ –®xñ«`0ue7ñl=áÞ²”d »äŸ}«>ûƯLüFÕu$7)-™Ø’(ì_ ¼ ÒÄÖ·£÷«Ñ²b|vWàÃÚ •k‹ð‰‡R<5~8X7>­_£Ž‚·£E@«­½N­×88½îaíG 6*ÐÔcò«HúäÃvÞ×-£©Ù»ßx¿ÉÕvpRæ¿,’ªäDãÙ³¹“xu B·%hÙðmÛ$ù]Íu“­¾ðﻈ”ßøBƒ¯YÀ.3`,¢ÚÉQhÐÌ +í/L%±%q&töÛáãR™¶é›lyCQ´ Y|ZÙj ÙϨÚVY-Nj,;Ü„WŒÉ$±ÖÄû£ŸTY6UñåîúêͶâJtä²\š¥Iß·m#`œ‰Ÿ¡äÔÚ\ñ±ÅÚ +ŠòøU˜?¶nêžä/ãåõ¯l«&¾üg›ˆ¥;òNÓ¦D-¦bI6ò)&ìœ ípÌ÷~_h^ËŸaeLå[ ®¯ø)×C8·Küäh ì¦^ ÑÁdB˜ç/4ǸÎòá_R¼§dqèà=N|jÑ<&…°êe–f÷ZŸ‚þã¾£É x+ =˜ØÔ….)Yˆˆ©]šÂ»÷Ò{}º&Ô\6û²JIÎý AlfUø,&¿¿Œ'IÁyZÐâžå€ {å‘YŠ»¾¼´u>ïk?Í‘L‰3&pÑÌ=P’Ô“4<¢²Æk£a½0’¡À…ì¶Â>ôEgÌ‘F°ÂÉS$e ¶E=–|¦PÃ0°SFAIÜj= 4%¯›†gíYóƒîeìeWŽÇøê1Ö5ÿëÚ?gÁøÕW».|ìE»"´ }ì'¤É œv³âümõÙ™ï’e ™VåÚÓ,€oä®Ù®fóÙ6r?för´¬_ÿxÇ<ÔWHÒFÏG ¼ä–Yùû V—jЭd ©HÄ‹â_gpMf¸ðE6H·PxÙ.··¸gúÚ 7êªRèœÁðPºsàÍzÙÿm²8Þš‡hOIt:U·h®Ãa‰)i‹9è.Õ®°bÏU¯i›ðUõ«~%ê"CI9]Sœƒ°©ÀÒõ7Ð= #fô+çÅyAƒé¾úú ¬éxòcf,ȳfdÃ"oÀqaG ×MkãÛéÅ6“+…cüˆøŽ°â; +9`]ídjÙ¿ˆ,¡½Ê“ôOéwiȤº¿‘5ß +Þ¢]I{ô”öb§#8‡  +ûúOU'²8²¼›+ÀeôŸæÞ i,@xj"t<0TÃ…ï0äm” Ô,fm%g®>{ +Õë±ÆáhÏÜ~Ÿ gÆ6šfVÛ‘Á~ ËU‘,Öº-¨<Ímíf‹ øñ„=–¯€½êuN @ÿÀQæ;|ܸg¿Cl@ó™ê@–B)‘/q>C•z ·à›¿’Xœ ‚ 5‘ ŒÂ¼˜›ôH!ë SÛ7²q#æRùŸòÚm„ñü@ álÀ ãó›óYr/c1ÂØyðî#¥%#“EX[‚–ªÓ™š†ß­jROH•¦9†D«¢š#¬·ú›b:\näõê$/ +½m[aÁPsõ‡µŽ’ê¸NÌ*'y³zÞäÙ £]v]ÓGŠv6Ës„÷˜šŸAŠ:ïTʺ©þÚØ};¥zQ=Òy€c®Qù-©^F×#h‰Ëø@ ïˆÝÈ¿ÞU¥~X•ªü9ý†‡Y9¥{AžóÕÿªâxšÝg¼uà Fivš‰§1¸Ó ÿG‘jÑ=µÑ²ÔŽlëo:ñc Âß×cö¡^záL®ÙyÕdL]ËJÞ C±áPîïÆ,⬦3‰ÀáŸb3žÃ6 †¿àÜb> ìü«š¶òMYV}]$_Ró|ª1PÀX”À<8äy&eYÛPñ^Ô¸£ñ%ð<„õƒ™”™(ºb½Îðp¡øÈ,O'+‹¿üÿ3Í–6üàn¿ÿ¿¤^¾Ÿ;–èh©1(R¯ÍNñQ/GåzH†Žrï˜Í˜ǯÖ3Û„²”þGÍF¹P°·üYöµT`~d(müK®8!PzwWV_iÁÕÂÔ…U$¥ÚŽ†¸¤ ¨vÚ+|¾ÔÛ0 1EÊÕiom-(Ûh:1}ÿÉàÖ»@h¯Ðünø ±ã*4½…qÝ1àHúá"Q,ýM€Ë¨´érlñÞ8 |ÊDš“ÊfÉn‹ømBÕ$Ÿ_´­:J§q1.ÁIÌëéÿƒ²<2‹ ‚æƒÞEQ¼[OážÇ¡Aí£—kæáÏòEãÕ€üKVdÞì(âúcGçkkó™ÚýuîKHÀj‰Ÿ»¯–â0+0•'TU¤öv~z²kß)FÝ=VE ÂKlÏË‹w„¡ïÔ`w5’Á¨“:ÏSó?ê<Í…©­®wˆz'ðŠ<±Õ`çΟ<¨3/Î[@ðÍ"õP"&Ɇ y‡æ—¢gÁW(o +ìPÃëáîY’­”<È@5ž,_ð8,5§’¾í¼3|¬µÓp ›uUàØuž²‡éÿ—>”aT÷VæìP´Ü,äk|Ôú.ÌÌeiôúŽïùµHÉÐgÉ´¬à0¿²À'Ÿ:4út_ž=B~§Y*ÔŒu?iÇäÞð óÏ<—È€<Ï{“Ÿ{$m?t³”4ŽÉÒŒàM„Ä0š«ÝJÁã0¼¥XYö8Ë‚Yà¢ô¿“8H£9tkYqõ†!9åæT{kaÕÛ^E‰ò4–¶@õlh–‰Œì3çÓŽ””ë’F + ~ "‰öçôÛÕ—FùÙ²²T* Q+œuˆÈáŸeBÙY¥ë3Èm,{½W;ÑÂ%X%€1 êüLÌDqsºŒà;uUër/Ø÷ÜLh Ò½õ˜œ³ ˆ™ÎtrµYîÂG¢ÿ!<¥}(2ózoFXpbŸÑzÕ^Š'“iŸâ8ûLGxÞÞÒhE€³(öÄƽS¼JÅ¥ â~ ÁðÌGƒP­Á3!…S},6Á¤ûð&Yô”vQà‚Ü:jtÀ5!˜`b]{»×;*[¿cQY%Yzþü>4lISD|çN'Q€q_ÏþŒUòÁLµÎè@I%làŠ£ÚŽ¹Tu(X,¢ÈKß¾aÄO2ÔFàðÙÁdžüYaþž§d± ¨¢…Iþošg¯¿g î`p·N{kWš(¥û˜EY^=¥œ]DžQ,åÏšØnâµj|¤{<«2%ýý—\—&}@æJë³pˆãñ~=!ë²a8B˜K/Ey†#n¶¡T'B |YFX¹»7ïÁ]]Äd­TñÄGñ ‘Ò ¢ÌÜE,öJ¿»LÎéÏ¡Ï­RÓ,ζ,tž/¤zõ»'9©És5PN˜a˜fiÙÞ蹊UÙvQšÄtkþy™­kß˲ÉÍIïv·­Ãÿ'Þô:h ™çý±q,R*øíeÎ#3µ®n^:áÕ¡GEιOl†5'It¥¥L}FŽënæƒá–JІ®nÐ!Ëø×Í:òq|'&>xIoqÚÎ=ÛÆD§±ø¿ ÚJ•C¸æ.C~@Ú.†—ãýömšãRú[c'jÐð!BHwÁpjÄ40`3ââ¹—ìÑ)¯ ¡zªªø¬bóéDîðÌpÁcþVçÕ¹‰(Jéʶ?ðóÀ鲞ùÏMä¶NTnýtœö¿‡YÀÄ ãÛõü*q wÆg ªøY°yjº3Õ`êÈ=O¸ºcü„ŽRÍSÑXíÙÚƒ +w¢2K „ÕIøõbÅ#™Ui_§®Ù¡þí¶Ó£ß:”šuŸ¸i}š#œxÌÌtÈŠµ^Ây`4ÆVh‰ÉÁ´ç°väqàõNºã%}è¿âméô’hÎpÂÓÌšœ/bˆ¥d÷R’g’X›³œp¥A962w+zÞ¶ý˜ IźS¥Ùs™$K iòÌ FÅR“Á|¢›žH03|ÁÏi ½­ +%A»{+HxaÐãëY7ü$C¬M,|µ¢ïWÕN^ô ¸tðœ"b:ðg°’"Î74º²­·£†ð¤^mäõa©žÄ³|ý66ZG–<ý˜»a;x|[Žî»Õ繑‹ç?à/B\KL“ÿûñ +-…8\F7Bäòf`¸cW#¹R„gc\öÕ€%ѹ×F÷½dÓ ‘†ŠÒ™œ¿ßðé›t±_€ÍEMÀ8¢Äa$ϬîdhUQsÓ+A›—éø¤¯Ý?ÏÚÖøìS·*Ú?ÌZWŽøƒå C?Â)m©ïOz~ÀÂïíú »e6è*Ç4×6”˯ވ¸¯ÿ~ªÍ ÷ŒtSÏ3Øä¯|l̺ϣþøôàÁçnæÛí© µëó…Îø<ˆÚ›ðÒ¥ún½gÜ™™L–Q‘EË£ûÈ’ÃPQ„>êp9ë÷¦®-,ìà)õS7žM¿¡TkJõg"WšýÌMîâ W73Wx™±¿¡W3ˆ®î7ºâÅMÔyµÝ¾ôª®q»³€¬2zI’Ç t¹Ð:š;ÊF¨èo–SíÀ ä2ý<ì“´HÄdV0ið%ɧà9þFøIÙKhÖÄhC€[κl)W§4º>ørî{“v t~˜L­p§ ~|ø¨ +%_5hiT[ÛÔþNR§©•šíåRœ¢0óJ k«¹˜IøøãË”«ÌZPÈ Õz€–ÅŒ]y$ß~2d}ŸF¶†'â\,`®¿–Noš€zÐX®…Œ,uM$[a»æG7¸’EÑ4]¸Ô°T’¨áê·Ä×Nˆ³cA^D˜Éþâ.ÂM¦ÉÀùg%94fϳQ˜×i±^†`‘ypÕÏ‚./*"ÒÐ÷,zòþKqUÙO§¹²Ôº³«žHah F qÂYe -am%äç¹G"mƒ†axŸe¯–_Ëôk–ŽÅÐ1 ¾š-ÐùLÆ')åÎþÃppòzgÖÃêÈÂÁá¾z¥U=ŠÖƒ¨eÿSAB\þˆ¥KójHÍ@o 'òÔ[ 7îKÕ†ÈyÎÃïä.ÏV`îÙÖ¶‚-+Q;¤ýh²£~–°”‘Eç5ó&]ßX~ðLnË}“M·~ÐE«ã2 +”Œ”/#×ôÏ|‚SfßÂèÚbi´ÓK#°]ë¨!dá>%K)!|fôâúbqAÝÒ Oõ¤uXz<ö±Æ õ—óì‚lyùôœËæ\Ò¡î“Œ·“©JÖ:ÇÌ÷ý˪Á%ŒÁÏ7±ÆCPòïýÄŠnqe÷ºæþK”W µè‹-nÚ„ Õ ¶éHíDsž~`½W]“ !š>ãrÔ€×Ó²—Í6ð7H±š¶ÇÖ•31 Cxuò³iP ªN`ÐìÒ›~\¸)Óg-g~Ñô5¥×íÖX0-µ€ú•ö¼8¼ÆI‡ pæÃež)ÁËv(æu£Š…s&ã¾Ê>Ô‰ý¹aëéë÷ ž +¶7íâŒT5§:µ7‡–UK~é²³a,DG^À§‹¸}ÆÓ¹G˜9”/bãYgÆíázãSeñrµâo„@OúB gùüý–5œ¦Æ*?0Ô¾¤Êî>ГŸHÇî}"rÅÀWºßTÒ‚ +J9û à½Ã™°ËÌrOwc&ø +` +Û&5…³uü„·ÿo$¯Ïø[Gÿþ‡¥í¤` l™YÔî{Aál +à‹"7d»¡éÔdàg¼ßú ÀYÖI<"Ø×^) D±l«sãÁ×ì¡,ßZ%c\_t©\\åáÅI3­l𷚊±óËY 4kM¼æh”LN­j.aĽŒÚ Œ™E¢} 8>êÙ§ŠÀN j¡`n¢T?©¢]‚‹EEéØ}Qêf•ü˜q-Ìj¶oœuövNœ×l„ê«Ó³ÜdXœ²¦ û@‚Äz1ÜöáörÐUs¢¡\[®ƒb[Btä·)ðVX³óð;%§®x©^³ìA›ˆz†z?£IÔŽäDh,bQ8ÉU2û÷åž¼›­ÉC ¼‰ Á{}˜ãʈ_ÌPŠÀ³ñƒÎŸ8¸n4Ÿ°±;£oíËú¶ç’™ÁeÂägŽWú§N½Þfâ•¢¶Êh&e½í­z퉿ƒù)¼-‹»AÅ\GGb í½áä÷ ]a#x¶Á'ÑþÆ9!Íl *¦ÄþNáñÓDiyV\<ƒf5\À$;+;ë³Ú!(#œž¡×Žb} )X£âbT¾ŠÌ–UƒÚú蔋A{<›÷Ì]&ké1i®ƒÞîºÊ$8÷͇M1MáŸmƒÒ&‹Å>*iYk±x·ò1uÝ0lK²ój˽qY´½½Z£¸"Çü¹SäF¸è×Èu˜ßm³cöçžSLÔ~Â\‹#Âg[?«²ž™aÜÅÌB¥ø}íwWIQUñõ¦ò°PUÂ=¼ùä95?‘îãÿg©qB“/˜èø¯†¹XQáK´~Ù‚™1˜ Ë´¾­í'œ¶ê¾~à ‘ßtµÏ_á×Ï’Z„«ò«#äÞ¶D#ØþÜ_™·žy‡>L'-³PJ > û±§l²•?»BùAjH®Á0&.Œ2U(Α âi¡n)¡6¦?_B×Ó Ýrr¤y$ Óçdfˆ5ìÒ¯m憜5]¿ÆAŸ[ 0&úᤞF¥Ù.ç^‰½yé » Dw¶ìÅzÈJÁ·9ù­I”s!L­ZC#€7‡¿ƒ³vmMlö~늎üÈd&쉻|jm8³ZÑ ^_¶S“\Ĩ îÒ¯&]ë‰5¿bç½¼p>.ÖRv2&´/ĉYªÒÇššižP?ìDȲ•ñuªí¿i +V(ü†V?õØ\t&UÕ¸yïŒ.&kûÀãW»Úä”ölêCñxcü]º“Íß ;éU<*²œK`2ò©h *“ºÆcSQ§©'½Â[÷ŽÄ¾@ø"º&Yû;ÐþÐÌjÕz<1(¦È¨©Ïx}z7n‚0]>íâédAaMŸÕÂKš9ód8Zà…UØ‘ÇØÇ`ŽY¬:ܶÞ½ˆ´Ï_áhmó¹e—åQ*Œ•nwkù²2 ýÔЃ¼B’ˆÕª¨ñã›#ås¶У¶:,cây‡ëÇ~¸1…"èÔLmU³?×LdgtE¾jHt îL¡…o¦Td&¦å~sJ±øÔ)‚w§õs7v Á€iîÆz˜z]o‰¨„†¿ß9ßpµÙð-´$u]?$"->¿‚µæbæ©fOùA{ŒÊ f5ã´œÕåû¯HÒíµ•ûµŒRtZFB>+Óˆ˜Õnò0ÖVtùkVdTÈ•33òa¹Г mH.ÿ3€ë/Qa_¿0ˆklgÎ{Â¥´\õîÆ­‚GãT'|k4Fúì)!è÷Ÿ±d£AG꣢Ú=Î?#‡Œ;¿Ð;ëšRÅônÆà8Ìé!ç02c=½ï™èœ@ŒñÆ?kDVºá>“- ù˜¡ø©9ßba›µ€ØÎ|SžÆ™¡ QÍ«æóeWüãYwÇÌ“‘ƒp¡R!ö™Eé‘ÑKÖ*‡™•½Œ¹ÿÒNŠ‘[1EýÍ*•Î‘îiòÁˆê#¤$vÌ_æ¼ik¬·Å%ÐxÇ ÑDBˆÕÆåR/ +-…µs:9=—}Dü§ŒlÎJÌÝSˆRêŽüûŠW +qUÆ?ñúiŽòQxtþÝ¢´àé+˜Àiûb’iP)ÌûÁ×È9QdÒ{p™…„™žfäw#‚GO/4¨8ÑY«ë90µ·RŶ´!NÚÆçüeþ»ž¶…R™­Xýñ•ÕÍOÆYƒF¡—¸Õ0ĶÓ½<¬–SÓÔy?¦3.ÀN ' ü¹ð¶±Å‡xPqE¶ãñà¡oF|‡t%Ù¦~ýùöñÖx{ba}IÝò^ Œ»~Ͳûɪe†JfÁÃŒ…\ç©mÂVöX˜‚«gòû?X…XÂ×Þö‡ÃX‚X%ä~X×AuŸUÓÇ4}pû‚‹Ï{·Bb‘E )ô"OwÝpk@î‰pmùƇº#bcÛ#·+&–Ú¨°OFƒ ÁÚVTŸç­ ·D¥3ÄzŠ‘QR]‘T€î`” O©) +|°üZw<Îb8@ŒÕèH¢˜Ì4ìàJó÷ê™ì23¯îU‹³¿}ï8m8­×uÏÍ ïŒ.³÷±ˆ 0E•ŸÔ~rÍß;ÞSŠUvÀ€ÈK|ö}±5ê%K'ÜA‚ɲÚ#Hû9ÛVîµçé2¢µ*˜9;(õc©ÈŸÊŸ\öÑLãóéj†< ‡î‘¬˜4ö¯O-LõìÕ{ Æ®Ÿ.Ë2Õ[O©xÌ Î H×n40bBd8žlÈvh0WÚÄd¿6 qnKˆpR~Z¿ñ(ÇÇíW]ÓJh?{GÑ0Ž“Á"8_]½Öø¦Ó×]ó‘ !»bfX‘§u³ šô\ðq„Ãi• k»9%&sÙò–³[ð<‰ÅPµðyŸ3…GÁ¯¢Ìõ€kãs‚]L¬a+DÄñ¸ »ºŸöˆô"Œ $~[+œ`Δ0Ôo‹.ú(̵Á &[? +ÄwÚ0—±ªç©†ÉÞ&×?¤T{s=ñUÑPi|Êû 1tHËûkªÉË¿T¢*ñ˜&°ü¹¾ÄF¶2ž+ú§@3z…5¼”¤ƒì3ô*6Kåªv'þ¢Ãz­')ù“€†ÁáÄ8¦·q>à¶P‰ð{÷$Y"GˆËsw¡(V@ŠÙ¹:@ ¦.&’Ô†“쟃å SŒ¿Ôï ù-v$$߈NfTÒGQZÌ%~c­]»¬däÐ<ôÎ6òÞ!ˆ”å%LÖBÔEV ×%Çp#†(ÖÐÝ}ïg +Müt$žŒ#3¥„ñ, 9÷38`ŽŒÈÿäÅO«þ‰†¢6r*ä@)yKõKVè4Ù]zû®)ÒŽi2Ó„äô›Á™™Áɼ² ö©éßx3k;X q.aØuê©f(ª2 c>¦}í•F‘˜I:$u$fB8Q,ãWG¨.DÐG¼û<࿤Ž—´’)½¾?4’/;“¥Âë†dEËÅ:{x’Ül¹¤˜ÿ^!ðüÐN»ßÆ—ÒP°püãÜR fø}°>\*ã1ͼ›x?QÄùgù[ácKkŸ`¯O¸¼Ã~CíàI×+(ø˱MJù í!Š®¢Ã@²Èí—¥ÿ}]šN…NºcBÍ°´Ef•=Lºú_œ8<½«O(gçßÚ_ŸÕ]» È1~{ªÌóvfXÔÎpÔô«ûÉK4Tt˜´Èê(®³‡DÕFtíq¬"уþÐCò)îj[RÞgÖ`ìî<¤ðMŸ!?‚—/JG+é¼2ÁÇõ6xb¢ÔÙLNwÀ¹Î왹©w¾“½t’ÈÎíIÛ.ó#Ñ×8À;ñ*3˜{O y_OÊq×dœ³ìéź3Züï5o/EaI»¯—†NW]zA£’«ÏD ™œ2¡74%ò²Ë]Ón—ÃsÂÌ+Åt\Ò/ûzÇ$%xµêž,s]B‰—ï‹wÑòshø•Á‚S*”xùlû·ÿÍÆïˆþTÎtÁšd¶÷¡ž'˜‡™‰ÿͪ*záLÙ­9ºOFu€€ Õßy0ùgåÀ3E`’·7–Å~ô¢k@¥†¯0Ë ›𿼠H!.â b u…cm&©‡²OÕÄÇóºR#ÑVR(ÞŽûð+Aý÷Fáx“K"þ,ë‘éô0YEÃxê‚N Çkü/ÖùʇRi|ÀwÓ5}ѼVø2ê¤# ,fèd7  ŠÂb‚‚Â7-|:0Yba7㣊s3º Ñ6³‹Ù‰¬´>)÷VŒ( T÷Ο z÷ˆÖaïdxŸ`z6‹YWDA~(š•ßÈZ UìÜÀÀÎù0Ê…|ãg ësŒúl%õg“§WD:ã¿T•h¸=ºÖ¿ão>~ŸØqlÁ½èÑIX˜ÇŸýöð<¸¯Z]è‚Vè¢Î¼@kÓ:Ö\MW·»ÏlJmGÿäGÞ×{©¶JB#œÊ¡û*[ ’˜Ï´pýZÛïF±µñòü-JîHðõü[EXöR%S)Ì4êO ûj a¯ d²#ðŠùˠ飼(Ô12œzµ¦áÓ”ñ”Ïœ¨j¼V›«ø`Ÿ03¿>xDXê öî)5uQâ曧÷¹úxKXóë›èÑRž8΀¯¥›`v¶…@¼.v»0#TåœïOv76ýV8¢G*œ+J½hÃÿâë8ZÓ~BþÏ!Á!‡¬vý‹(m\´ë•>6PŸai‡#7Ov$ÿÉî6 þcήRÖ–íXxþq‚ûëènþ¯p}³ ž#Ÿ ¶A3)‘‚†q¹z „6ï<-qquOÒaß:D¾P1ƒÊ>ñH(È5 ú:UÀ¤GGLíT™÷]2Ûè#01QtÚ©>ýûoB…ïÔÁ‹EK¹ Eâ UâƘ£T‡B]M6ù€Œ /65[\öMŠI‘˜X+ŠöDUVYçM5}Äǘ®GÓìý5ú?ÌÛ8odv$,ÓKoGP¦ÃSpPþKRRà•–uå¡0å˜]öÐo†çVï3Ñ^Üe­“È$þŸ¦k«ë­¨znúÃøØð ¢ô=MÒHZ­õ¯Ýˆˆ7ÌÝ+ÐÝßMè|KÍ÷  +DRCr4·+éÕÜèÍøWñ†Xê¼bu\Ó“$ÈÒÿê’H¦‰V0•Ûd3' {¢¦Õʱ/ ¬Ê¸A3¤…ÐB‘4öqÒkÞìvc¯zzÀ`í°`˜k¢fØÞaò/Ÿ[ßKHl°ÓLâ=ý¥‘aú;xPs»9W³M‚hínˆ@(Ï8ƒZþšÄÛרZ< ìvý°ñÍrýëŒÃ©Óñ +­O¤[BnQc?ÿ`žˆØk¥•â¾w![„ø2x„ÜïPù>RfvX½Äëé#ÕQªâx©ªL²Ù)l”Y uDN2MKèÝÊD•¨boႾÁY£ì¡GHÚ4#2Ìš¶•t8 íCx˜mSFò΋W$¨RÔRԞΡc ±½CŽ.¢•[ù6Ò¹´9V¼¼ +gÍÊê°0â¿%ESÇÝ¥Iþ\¬‰fóoèlî¸ÐȱK cè¹z·.•Ç€ï³é O\»qré_¶“‹穆e0Ú_Ö`g¿º8+g[¿%tI»ÓgJäÿ„'€ÝŒW:št… ãA½R“ÿ’¿zP”Ý?|]…”_cñïÁ£#ä¯=046Oü7héÕÓ¾d§-løÈ®3v+ªìÙ1eãmuk•6G–­Ž—»↑†y034K«Ü)!žŸQ/5é^™AÔuö2»¤0R¢mÃvŸ3õb† Œb5~£7Ÿ -þƒ€ ¥~2Ô¢öß“j"h¨¬¼õˆšWYL“ö£Z³Ì€—ÞÄ&þ2"Ѩ¾ Ç€¡v†Þ¶±u›'k¨*/?¾ºC9–Ç1ñ‡¥ÛcþÚ胛ÁcƒvñЪB£×ßbN›ZçV{üetöœ{44ž" +²ï^æý÷Š´˜yÙ² ÜË9°‰.¦–€ª¯Ï%p¦tÍævS¶ªF9ºGqô±ÌP:²I0ï¢à=™E,¿PsÈkUŒÚàÚm$Kgü$\ൂºÍõLÅå!ÄÎѽ¡fÞ-~W­‡Í~ò6ƒ+§_ %þü3•ôaT»rM[T›¥»<û À-¶ó¸~n;SdÍ"Š¨wVá¾j-ž£XßýðÔ ÞìHeQB#£ã¶>aÙ˜ÔßüYlÓÃè¦/ÉW–ÅÉX"S«:ÎÓožè-‘bºÁ¦ ¿,©‘’cä•Úr*MÛëä×Ny^z¼#™!Ë—ŽŒ”WY>£°{Š¯bUÊWég#Ê"íÙ!÷Ï õ>ød×X3Rnz~ñ^¥¨Í¿¾¢_¿`]o¶‰–úßµƒ£ê§7HÎÁ¹Ú>§Å•R¢Ù7Äà3Y¡E.ØÂÙ1ô“ëôf½Ù> "=ù°ÖÇÄVcö^ÀŽ²Ê1ŸÀþP[؃}!©"Égd½ãÏš6] §ÁPwÓì«>͈_FçϨ<¯Üà½@’Äaçñ±Þ€)ëÜ>¼P™]¥^?ëxãÎÿ\&½ìA‡®úuøŒ®n£Ïpµ«<¡Ùzb™ñ¾“?~Ò]¹†0¥‰ €Zý>¦K剧²© +)³”ò‰¼âl¢KhN?÷ª'r‹n0ÝTÐ:É6æ‚OÝLâh5dX’p+UŒÜÂý|7_ÉñMõ»¥OköÊÑ­ñZcƒäÐtûÐ…›…±ÞE^VÜ!é=uÅ"‚ MÂÝ5^å8?6àÉ +Ý/ +¸Œn4žŠ›¬kãøÃgÒu½ã%%Oäú/^3GQË]R{ø¢® 4Þ›‚ÍìÁ§ÿIñATÕL¿º†Ù»µY»1J©`–æ_¨—®ÎêûŠè;–ƒ8<ȹGŸÌñî7dÆvÞj¥ÐDO‡ˆ ÎdîO1z S]ÂZ–‘ âAwvÂ[-ö(hA{¦Qjo½2äR¦öD{¦ŠQ)…‡“èN¿7§‘9: %ÔìÑàQ^FúØðEÛm‘8b0s|³æ¿Æ•¬¶¶wøR@ûîw€HÐüM_‰}2ž–¯µç:SÚ¨WFyz$ÌèJ‘½{©ºàï8s[AÑòô]9‚ëµ «`WsTR`cJ#êïãœk´Yª¡èwY?*ráÒTEzþ.“ïÀs9l8ME{ý›Óu@©©k¸ûÖ1ûzv$Iö%.øw?§ñ(% €q]±Ý%ÝýN×`ø}ïú99»†*ÏÕŠ®@lRë¦ôÝ´ö%…ÁˆÝ~7bl­wl wD[‚ì¼ç1ã93É­2F¶*©ÀíÀR#BØIA÷Uº¯ã”¹Š$÷tbwFäÕ…`h…ͼãn_îÆÖ+2±óW©^û!7#Rçá–«Ð!ƒƽYÁKh£)Ò-7MÙPôÉùTÁâfOÍ—rÜ~z!{»µõÙâË^—­÷OÅwÍïâÏòñE¡_ðÌÑðÄ0fÏ"ÏŠû+ãb{,OPéDÉöª0Ûöv¨Å»i¼0K <þšÖJsãwòè”e$é»Ã£‘e +e TOw¼>üÀm +´ôÚ#2u_Hv)æÄ….Èwd/T-íàäâþFoHŸ¬X¬„\"U}^§GÙ³XêÏ4ÎùMEëpÅè´`1ëvïتÜòi önEoÖx½8•X›N”m‡A=XéÕ8}òÓL|*Gˆ)ò¬âè÷÷· ®ÁµZOÑæï:6‹¶1eý=݆¹²Eb¶GCUwÃÖÜðm¥z7Ù9Mvr®ò!iDðÖUWªu=:Áíñ…pJ(ÿ_±ïýúª§¨Ý*ìËÍ*kJ4F£aˆ(¸2a= ªüq·SWêJà´4ù•MIîÍÍÜ°âÕ•tè@«¤¡eRkL.Cg·B'¡¤¨D$<ãÆÍ6¯²”0†ŠŸ"ãYèÕK#×I LÈg>„.ú ˆEúu¾Å§þ*tÃé +í;ù†ÿåþ¦#=5²FTuDõE‹opó€äNašvìFp`_³‹uÏzBRúéÿ˜üdxÙ|ÙîlˆD.¼í«ê6¶5CL'gmzÐmpœ “Ð2osÈ,C›NÜsgìì‡oH4W*ŒpR’ kø¼—?õ.–xjÂ*àZ“OÉ»½QìqöG>†.ø… ίPI¤±€0y%/'OmUtR>&yI$Di©uK¤¸Ð¢J›µEìä„Çñ‡óaÒ’§àíuó¶X(L_Û =×࿺î©c¯7IPÆýÕ5½ßï6ª¼Æü¼çnË ^=CÎZ¿_'Í™ñáåøDøgœœæÂSt¶ƒ…Áƒ¦]¨{í!§ú—þ•˜¢ÂÒ=¢oGX4ücëúüù2t@Vç‰Éi­£²~,Î@æ­ô÷6§ì^=Tà‚ 'ÃÈa„}âkà\D'l­ÿ íûÈKHK_ ïJÕ>6¤ì<öIú(¦{‹„Õ/§Æâx®®èáæ Z¨FˆÉØ5ÓþpéN¦òÃŒú†³ +wíÏ ›~)¤Î'Žq ż;W.†kÏÖ·hVÉ´Ù‰GJTWiÕJI>äúQJÒ!. £iAðÅ…û˜Ï{öõj„Ñ`u$»gk®êŸ–ž'úâ`Tpb-éì…V"<+½å½{á{-ô¾Ÿ_§§bßWÃKúá,k>Ïp^ ®8¨ç'amc#µQBá⃲‚(8•†èäÄ~¤ÂQôñùA"˜&q(°¡6 „ÈV5·#ˆ9·G†1ÆÂàQz&%®2߉mhSÔ‘V©bi»í?mb‚?ŸÖ‚ªÔXsë"Ç–}»ãŽ‘ÙPÄ°+eìÖ\ÁöÏh{âF>øµ ™6›ãn|ɃŸæ{af;jõ‰×¢ö6ÉÏ^ ™öˆ½U|)Ég`Oª›¢êÈï·:嘼v?®Õjõ„»œÅB)Ô±ÒÅo{º––.)êèý×`óÄ»ëÊÍ ˜`¶KúæC“¡çKGC~ ˜1ùÇW[S¤ºÙp] ­ìîAE+Äü:Õ†{@øa3åÉdzažï-FëÚ"ñh°ó…4;èǤ™‚­>‡hšñïq¯s3Ð<ñO¾D¬+Æù¥Ó$"(Ó÷ƒÍѾÒø´¦ÔÆñ¾{aÍí\D¾ð9ùê@n“¿hå¯,c楨å Fb¼ 4¯ûŠÓ<ÿª1UË”z(ê݉°ª¦O—çþ²·{3ù¾dØ+¥ +XÏÆúï„Œ™‘>à]DsÅ{¦`±òÔX&Ò£z*š˜©± yõÆߦÔØÿ«™×’b‹`=ÚÐ* ÑU J•¿ÿŸÕœû·a`•Ï­–œ·ø¼j¤<Ô§Â+uÂBVµQS‹qˆäøYÉÝY™»‚áý{ Ó;0­Ÿ_ +Í ê?(ß ÚÒ”ü>Ÿ?ªu¢¾>y`CD­Ï:µý,Œ|?|ÜÅçÕ9ƒ²9‰­‰ }p™’¾\Áóê‹Ûø5œ6b A0“Hud@ù¤Ý¿–Œz1òæÑHöx'M˜.·4O8ã)EQ‡Z.A`΃ïÄߣ—Ûê/7òxÒ[¥%°ÿYõ*ï|/ùЋ/ÆUýÒ•rb{ „ÚÆîÑ1¨¸.r­ЗyH14N Òç&‹ŠºóíÔÆ}YÞ8F„vò®Zò8yA8ω½w+FB¦ñøR _\õBµX ˜cÉ7 åJWN´­jù× Ždï§Hvš‹!³óz' Kbw9Ç}dÎÍɳ·V N…¥Ì=–3nWáT>!Šp:™^AL~åšì|P¸l -ñÜuÊV抰3ŠÃ¦ÍõRŒäG‹QUX³}.z;qøn»¦=âxN´M*pÇVRp×=p Ê©¹—º£ . +×z ɃsÒ>a>• d…7Fä•ÐõÆÒˆì„ /¹JšËäûóùTDLD°Y# Lþ7Õ¶`mÌcxgvì8A¡ñ§$$ž×8/™¤×õ5éùè“­wÖät\‡ ž%.ÖHÙ â/›ì.,ïzŒÒð©Ë+Ö;mÈÊUp˜›ôH@löW>O]ìÕùØDnƼ^á[ŒH-µÎßö¯…vAFojü51d÷(ÝûˆûE#zeŒ4 š­ãúóR +€ +\Œå‡“pþ´fˆ¦*µ5$x-Ûñ”öDádô#ÖgôDö>~G¤Dà ;Ì´“u½¥în8±@ÎùÁx®òõ%Ÿõ*j‘>!Ä¡[£Ûزvî}쿊󲊟$‹âJÆ%F*ª+Ü÷ÂS~fåÔé³}Eu°êfE3ˆÚ À6ÐN80ýÜ?ž"¯?¨úË–¸[dV^pÓN‹µj4ÂM%"Š°€—SMŒ=£¬˜lçîTZîPƒ +ýf­F“§-ʪœÈëÕÂèqˆ…WÈ€÷.á·s=‹fx~2ÏþxÀS<ŸbA[FqYBëÂí—Ÿ¨öþËËä¤6ïvq{74Ϙê¬?t±º~|mHTÒÁ\àUh1N”éœ\Þ»ãÃ7ËžGyÇâhópŠå»­Êýµ™‘¡ÂÊ/Ÿjk²½ä¤²2Äÿ.þ ¬VtÙ;¥NÚyE,ÝÆ‘=ŒÙå!Ó»:6_µæB¥Wp¶@¸[³gŠs¹ /ÖÜa:öM¼ÙßF¼ÎýYG8$…Ì 3Iº·F|SèÁª'£k¹ ÑÒ1)V =Ę¢D_S(ÀÕrÜOÇGŽsÇgëNWL<ò +»ù„â´ ×3F0Á>ÄJ‚ŠÅ°#D¡nID¼—2††ˆnŒÌó`ë8“¿0”ºû T ¼ï •¹œÕ þÜþ—³Šz\/•X>û-:‹ùŸÊ~e*˜ƒ·€¨¡ì¦,mÚÊ—Õòœ³Ñø¡g÷Èuˆs¨ŸÆÙ‘»àÂ[l]rÄÙ4mm¶~ƒùpfõ§vp[²4èÃÇÅWŠpæO“„Æ 9÷$=áé¡£¬Å”ú–æ"úQª}âŸ2û`ײrf,EH·–¸Dׂ~MrPÑ=‚Þ/¹|ãàM¥«ÿ¸ÞEG*rØ0$4D:@BíxÑïCÔêpÙ0àÌ_+ çh“—×JŠè½/™ò,Rk:¦¿‡»4“`[¯Wð;ðŒlƒz±2ge +iKýk”½œ›ƒ4f¬+xfÍ}'€’ÂÓìúÊàáÚè-RM>e·Ú¼;lëºM\›$ÕˆÁ5vðçééIa¸º;vºyärì]Im ²oߘ[ ®äÏFæ·S u±4ÿ~aÖ••4à +C rº¨dõŸ…’¡‹ß-D…-µ²U®é×Æ5È”ØÖœçÛ–l‡Œ™´ãÁi±‹&… pÕ‘sÆYaH»Sc‹Ño­x(~ üžŽñöpín=³òê"N;¤©›pÎŽ/ÿ­¶i‚çS†ë'ꇋþ–géy6^;öî &ìvIµ`ö®ôg+¼Ôç¨T ‚k^sS$ŠÓµœ%ÆO™†2Û° +‘ þíâNp¬Içÿ$ZmβØb¦ f[Ô?ú͜㽈z¯mFØÀS3¢D,šõœ—d,u”‡Í†¾ ›YEÕ]õj¿¿ñúyUË(`œ`¼™9OœœƒÝÖŽ¹#þs@äßjpÇâÞÒ.Kh¹žµÜ¾Ïµ‹TÒz_î¯ò€¬D HNSDå)†Ýü« …'ƒ¨éĹb^'ôé‚F­óU÷º 8õg]¨—#»Îȳ4ÐUV ÞëØ‚f:œº#‹J™rø%{ºÎiË4<Ód*½Ú4¯[JßÓ5“”qivú'+ÕTÁSÁ¾ÖÖÓ#Ì‹-øB‹bÔ¿ª”ˆb¡TQ\íÆ_´,v•puçc”ikŒ¸_úÍ”^s„Â|bÑF:Žç,¨¥@1a°¹flˆm?˜ëð¿“š• ß )+ÇÚô ÀIXÝpÑmû®o +œÝ +VÿQs +apþã¿pEh% jøm;F\ šÝ¡hrxM†}ðXý‘±Q×bß!ñö¼ÔØ3º1;ÆÓvš»¯5RÁʯ¶à¸/€‹Ù }çèÛ¾Ù~ü¸c=(+F¤žÌöéÄÍÔyý¸Y?î#T>Fäî¤enÈ7]VÅÀ™yAþ°¶û°SÉõäT<‘þrïü§èë†p³H|¦è§z½¶•tˆþƈüî$¿µq9cR4ÂÖ¤]·£ác<1XÑ¢ °·¤6òyMx\Ô‘a81U6®öæÂf666á©+'¼p§>\'Á +¥(º»uÉ#5 …ÜI˜Î. @Å刞O§;"0¾·¹I’ ôäÕgbT =JrÞ¢ÔÌÉâ9ˆÃ”ðÃ{'ÓŤësp›Ÿö½V™ JÔ¤†dJÍ +šu£Í3¦”ºÍq4@×/òG‘³R}÷¢¤=6ésO%d"½[•Þ„| íÏIªÚFìÊYÔgÒ úb8w„Ô¯ú±ÊØïKÉ|”Šì^m¢.ݦÖîŠï÷ÈáÚm*ÌQê´ ˜‘Hk`ˆµiÂ#zs{÷‹ó¦€O µ·KlHo“Y`äXï]óo%xÅ)ɜ쇙ãÍp)¿„jç¾%•w“6qÄ ísžè’_5wJI8¨ø`¿ÑŠ>²Yñ7)ÇÈ ˜›ø÷~µ«n±~¾èœÔŽÓh¼ÃÖÏ8dž©^ÃAò„}æ²nTfÕµ]z%ÿTÍ4ôk]¼ú# óÈðΣèkùŠO$ÌÏÛƒ^æ|ˆ,§WtW? +E~‘ò|b'µŽG¬g߈÷í-#óÔª¾ZVcº,/TÚ¨Oãÿ «C’Ï„%¸kÜÐ öÃUô ÍuÞYô +ia'^×ïQË´ÄzÁÚ`Œë˜Á—¾ö8JÑBöãHÀ‚§Hêý+¨v¦a×ùè\ºžx$øf¨¶—˜l8.¥„œ´‹‰dœ;o¢}ÁAB`"Œÿ¬âþþ“uî9gùê|ŠGwßZÐù ­RÙ¢³cUBdËü»…•!b ’+ðöŸíiÐgâ/cGþö¨¦ ±±]–GÅ’ˆqKÒ=«…BI¡fãqh:È.¨°jÏŒ‚½"üß½½ùñÉ¿œUÀ®ú1r?xGük·Uò×ÅFQö™Í¨Ô…Ís;®«XÊàf’F›øž @Ù¸#”"`Ú€u.ãdÃŽÚZ„eÀ@Ç󿣤¸ÇffcÙò€MAJ™F_”õ±0Éé¾ +\ÇÃBìG+ÙîÇ^r\Å⛺;\` è=­~C6ŠøjhÓEÝT¾Y6íO~þLJã%GÂÁïuƒ ó> GÍeš[Ìa<îÎÇ&¦ïZËVÏ©XÖk]UŒ‘àæIknÆ’_®Q!¥Ïf¥ð¸7Ò~ˆcºÞx̽7Y‚~¬FL9–ºƒ½¥”lÍSMlc”a†NxǬK·Åµ÷§ôq´?é“á1&Þ¶óéR4Ö÷½Wÿ›Òü±#1€¨œ«çLÕ¯Óõ¥`¶æè zÙ+kb¬‡X'zÏçïäÉæýQ’‘®+qzÍYCìuÃû{iM>›¼Í,’%Ý™AýSñ'Ÿ¤A½0øx$p||¿¬”Éý‚D½æ²q§² ‰çëƒþx\p§k#žÑª Œï3Ï ­ö³öµ÷>S×i#~)f`âX[U(ä|8 ¿þfÖ×#êNuBÃO ÏÏ»²×´Ê4©z†”¼ˆiݾÛRó×t¿c‘ÄÉÕŸvý´Ø/3Ed¶ z·õOš’#ì ¤8Çáõž²ü +/ëúMû´¯'&À¨(`põÓÄUjlQr;J^k¯áøM ËÙ¹n0”sféC0¿yÙT}ÐAÝB$1”[¨XÄlÔTî­ýfÆ©]w‚Zv·”¥’¨ÏÕ"Ü,ÉKû›Сk=BÝÖ”,šG ¢]—ciÅ~'ÃÁ^T·Ò±f·ùè©GqOÈe½]SÓ–\ÏKE±;¾N…tŒtNrõœ€þ$©Zye6¶ãQú™=b–@?XŽÎ84Xlj>*7®J Y.¡r0¶öð•„ÅšîZKmôçîhçø>BñŠæÀŠy$†+«áš.!‡Øןƒ÷ñ¹ÜùÍÆè.*ê'Wó +kܦMõÐg¢2BF105ù%Í’ t䨰{'Rm†-fï.9,i&pDéâ„Æ;d: Tº¨3¾ÆðÒI&q˜u–d3¹ûÝp +°¿ñGëÉ>‚}ÔTêŒwo+…¨É°)u¸vÃ7é>êнž†¶h˜™Q|f –¤šž×$ÌD¤ÃÙRïù`+Ê£¬âi êf÷˜á¦ Áÿ/Ãó¹VýoÌê²tö…Ù +õ\¸ä{`óæsÕ%{·<Ý(§éeI¦Œ¾^ïÎ:yÛ{¨#2êè¿Ù8®r×Éwð¨}LÁ þÞ„HWñ» p¢áb*üI „Ou>­x¦ø|ë ÝS£‚xNÓU î~…Â"Âjâª"»ÒEæ£o ÁUÇ1í0ÖÔAªAAöæJh›½‚ˆµöèåi)Z.^ò3…¾9ý'¡YŸo6ÈA‹ºN'c1ß'«´ÿGœÔ×ÚÑ~^E2pT¥òàd˜µ¹6ýÔ¨@%ƒÚ)rð0Ég}áŒLŠjÐîBq„FûLE¼ç{xkI~®k‘îÈ‹M…n(@në2Q¦bô‰ÁUJƒ¤>8 Ò eNÞ6¯QãÞËú””x'YâZzý…˜&Xu+ÔetT‘HòÇqLFF pw;çÝ +-УÂÃOïD:7ó÷Èû÷!ÇTDBÐvKwq”ý:gÑ2,øýšN þ+9õüN¶£„ï-c´±ÊÊìØgTYð<éZ:Ú6§_½«} BÚºK 0§…mj„Vn£‚ ¤"黬ǚ´yzR—ß°°(ó>œ ²sP;íýäíÑçÁjS¼bÔ¶Ñ"*ït2Žü° JÐöÉûèÃ`iRñå¹ÔwpÛˆëø¾Âª_ªÑù €öŸù¹pÕ“h€µ”Fž=^ævþëð‰ém„*6qÇ’F¥Í<ãÌ„œeèªÌî ëØÿ½/­ØŒqjõ~„Ñ_5âlKá…6šâ†ÆȾãÂzô™1ùÕ?ý;AÅàª+,9?éM‹sé ûµJfl,ÅÀ¤#Í}L"L?R±YàÑ;2PõiÓ”;.±7¯Ò6ý ¡éü¤´å£J×…•JÒ+°. +E{N‘™ôƒSì'”Ã#pxðÜÈNg¹õ" `õÌ+ánÚ ¸5úžWæü-6[Á¶·UýÿŸ­Kâ•´a¡"O±³Þª˜V…º×ªà«G¬ +÷AýÂQø´Pîšý¹h`äŽ^ «¿ry{¬ž…bQ»}=°æÑÉú‹—rˆÕ>tD©èa¨HúügDŒC{ãc” +ÕÚàfö¼“pñVÅ2„QL®î½ý:4%L8¨ +¶¿©TÛvzNj €xAµþ?…4VÖ¬O™àx’ŒË+›þú·‘¬\ ¬…šºkß`ŸåÖâ·IÀ]`¬%ç¯^¦¥¦nEtBYYäßûE/†(BâØ~)¸UPÏOÿþw»Çd¿Gm±>†ø‡¼P¯G|¨o1³rÈE]][Gé©ß1J!ÛPˆF*¯>ñ±–ð#«2KdùÀÚÅyP° ÜaÉÈquÏ(«Eê}Îa„Š´¬b=RXÔ¬Ul<² ï-¤,O÷T…÷wJ“šóMeÐðYŠ‡¥vHî¦,K¾€WÇsu'— 6WŸ]Òp0UQ8®*” +/“;Ÿ9y°cßnªéUÊEµ¼m˜ÂßBt |e&ÿÄñžLXO'´î<éMôáM'–ü +/j¥ºB§¿Ül D±!ô °FFaXó÷ù «–+…„“K^,M_Iò|ƒßNJ2÷%µ§wá¡R¢ÃaÕ÷”Œoƒž5Ï ¤Ä¬QkTwRä}ÏÒp'ÃäðE´àÔ¡>I¤“KHâÑZðÞKå– Gð<¡Ð¦oÏOÉe|ë4)Ø)­·û°wÀ*D–"tüœ³c¥è¯Í[H;074iˆ/;IÌйQ»Xvq.æ®×b‹tQ¼¸0$lÔ]Iþ&1ˆñàÁUäYƒáCª×OãˆÕGuð 9ìEKè¡–gà6vÀ[sµ%oª4KÐ9@,iqy|ƒX'Š&m2üâ/³^Á»¥=~"6P°¡y†·ò븙þzX@–ŒtÛ1AËÍlG9¢O’!Ç]ÿÑä@ ß^Ø8ÜàQ¢ÕÇ¥TëhØ(_†ýyÓ´nhý‚m’|OR–C0Z 2qjµ,xûsÇeù…?Ôฒ(ecŒ¾„G|÷x{Ÿ” íÐúŸO¬ªÖ€šüHi̯õ»Îòp ;ìþ +$ ¿Ó$¥ pO¥@ý7ÜÁ[ðük¦sNÆ…^pÆ‹8c½¡Ð/cQÿWë¥pVÃâRƒö‰P‚D¹šö W ¾à¾SßÚ»@æà»Û5…;žÈ^´ªì•4'-7Ý¡äº$NŒ±—ËŽ?ú>ÎŽšØP{üþ0æÂy4j™×Û·z¦aÍ–îy`MXP¬©‘ eiù\ ¤ÃéØ,óX#cS)i8ZÄÌ7PÌ›uxT€@Ìwïý3‚L~Gbu¢ƒýð¨Õ·ÓÇ¡]B2»¹½Âj»Í5dr& ¦™=žÑs±Ä„dåB¡UK¡Ô«òË~ÝâÓzuM²°ÞjõÌo'QÈ9Ô^.åÚZ±¨%üØyZ(ÐOôOÔ&°¶v%°¶‚µ³5èFé=¨æ+*•&K}Òo…1 v—­Âï—§kh9‡ûye™EÏN!Ô[V˜GdEÖV' ŸõJõsüN‚7Csf£øa™aú”ï öŽÍåEC§L¯ùˆÐù‰ íJD±á½ 4œ]õ0|‘à^rgßÿGO™9ª€ÀWí“KÕßPŒ)»ž}ŠßÅH|VË™"U•’H§Möæ$½¢ï@ãC¡ìÖ·Vkä[lôñây®8¨ÎXKÍoÎýl*Š¶ã1¬@kÁã6¸™éêþöžht½i—Gh´]ÇnþœcŠIMàØt¤; ƒž¯ŠÃH¯1Ñ«`>–íÉÖŒ9®K•ZÂmf¤‡Ë$™ëãQ_îd¦’h'EH•£X¾y6 ³-F$~»CÇ–sÀðÿ«AKÄ,n¢èƒ»[ Ê'ñb˜ ÁrÜAÙ;«òûœõ¾bNÔ7àð¥ôµ £Ž×¡KLd­ßíŸcÍu0iþ†rhQ¶²³¬ +]Ò-îlÞŒzmñó“n]I3´ÀüÚ²M…芩ýÎ¥%†Ós[L*Pë”Æñÿ-žÅGÁ'y~4“ºÒèÎä}Òª^½’BT/å \ðZ›G%fO»ÄC !ÿ&MÊ&“×ã|)ÛÚ‡ŽÚÒq XãnØÑÜJ ŒåG-:;tʼ¯ |gè1ùƒCWÈ­ßnP}p¾ºí,Šö½]¹,ü©Wû) 5‰Â´ÀlðU]¾—`^ö(ßWµKàš=yolž+› r×¥UÿÒüŠ V”4‚Çá²ÜÃ-ÊŒÓ +nXqkýšžÆn ®Aršh©ìèœñS^äþùÃñƒidl“»_8NÆMdÔYäg§)Cûš58å6¶9+P¾;Îqͨp3F ýÚŽœ£#~´T—²u»#áÃ Ò ÐÙž~|Jò࿸ßõð]aŒŒ~¤/×;èÊÙ¸õ«›ºúîË•Ö(³ÆŸ+ÁDT¯x?S¢^Á]ÝßÓ¶Ž5°JJciTí]¨««8/wrýF͈Π+O…æ#4sãYM3B´{°¢i_ ƒ§®˜L^ã†c­PPªêÊš9Ö@bðÇî\åäÚ´ë§ëüÔ£nƒŸDžãQÊ„Lh¹• ýùêô˜í  r|ZVz–ó÷¾Î‡-ÄÔñ²Pþ’-7™©QLuˆ¼‚©!9MýN­/€K¶ÿNÈ© q)T +ÜŸ­)C¹457®0ºÒH?nNƒApPÉz”éf*òÝ^X ¦à-­ÄvSUMÆ¢‘·vÖNhµ€ã¼IÒbuBX¬_Is‚ÝÁX¦k .Û/PzeñüNß»0OgŒŸp}§&"˜Ì2¹œ¢Tw×J£ûÓú(¿QüÍIA"ð CƒYH„~¿kï¾xTì‘·jýAA+¥Èù®ÿÌ‚j2/£jÏTþ*ß ö ʽ‡Ir°Ù¤^£{xc¿tZÏ5~Á2äÛÁÑöØ„‰I‰Íà™¼ÞOgÔ¾gXOáÕ³÷Áë ‹¦@…Çï¨Ý€òÝ¿xé¢ï/!<‰·ÇØU|¬”³ÕZ€w@ÒÔy$Ÿ÷Ô¡$)}8šgÜ–{‚¡—&¬Ùî—üêö÷–õÉ)¯Ö]z’à9Yˆ—hwCL‘>Ã"íüÅsD÷ð©–›dä³4£D;ÙPÏ m—ã)a§Í£ùök³4«ÂwÃÃ4{óuŸ kï„ì-™ÒÕU -£õôàÀÿË?øËÓ%‘‘8÷DŽˆ1èW¾‘(FÄ¡_3ý顧¨ZZû'ufäÞàþ²?²²)Aùxè‘è?}³]fgáÿëÝé[xQ#·ÿ¢]§2ÿ s(žjGÊñ‚ü ḩË* äHløÝzË%©«WœÅd] Naæî`HES– ÉæO¨“½½Ú¡% +7îᑉ3¢,eKtöNXÜæœRG½Ëù(PÒôy=²qA9bчüÃѯIMO±Efj áçŠO¡ÙK7iht›’`Õ6yj¥Ç:ÉÞÍI^,ÃVIý×ñ?Ôœd׳rrìÊA`Ù¡MK©»àU?ô®OlgexzþñÒ‚j’ ·”‘ö•BhÑ+ ½xâ@òñJ6"_ÆñÖr³âÎÑVÇÙÅîàu’žòêòl È’JŽïPñocÐùš´¾¥ô²âê¢pÆRV`pj¹®Ò– Û¶!kùË€Bm7r[W±û¨á`´õ¦¿‹3—Çv|ä”›PÕбêIR"QáÞ½ÀèK;d‚,I’×TÖ†þ†õèƒÓz–h3œdÖ1nyßÈ—.‡r ŽÇÑR™Ó]b[¯³a +–< 8©)ð-w0µWë°h㺠QÙÉ3 Ã=)ˆöé!ò>q¦óüº»E;‚­ìœÜ”ÐvMª7©T‘—“ u@k9#ʲXJ¨©¢³A¡;·—{Õ|~ƒQÅãŠ){ ÜÇ[šúïû– Ý°vFáÅm‹ÚgÀM‘kA4yø ÛVØ`F®7`$*‡Ž~݆öôî8‹LÔî•T¶ÏÕ4$x¿Ý®AIPZ>åÑD‚|äëztºw-yá×éÇJÙz«2¤•:ú Xîö§ý?`o¥ÙXÉ'æ‡6ê§õÀ5Ï–üVœÎ’Š(e)}6uÊ?Sü™ò3 à+ªÓ7W—k{öý¥0`Å1VÞ)ŸáÆÑE\ÂÑ̈Ç.¼c ‘™ôzV …$g)QW¢]Ãå‚ÚÝš÷¸.‹êwáI òž¼#€m¹Vu-ö—I1Küºó&´Ýﲬ¨1­?‰(¶;)û‘E©7R7 õÈ?Š*«Ôcä&ƒŸÌâ4<±œÑ &Çw\Ìó\¯«…ÓýáçÀd'Á8–ÃÖ¤çSJPh ™Ês¦Áo…‰]ûqè9Ïic&¡þ†ÃÄVD¹¸Qj „JÊ--I’÷… ˆúN³PIj˜sÐ,Ú“ŠœÊ>T©$µå'ؽM›—Rw’9KG—æbCqܤ0ÚIKV©Ý¹Z +±at½²‡½ò®½í‰ ÞÇ€ŒMs¼¢ÆîÐm«gÚ\hú"fÁ±m½%‡fþ/6ïNÑŽ/K2Ø8G“P¾si)& ¸/„ݯ| +ùž|œÂH¡$oÌW» õùôE]½ö÷|E3î LÉÇ-?7÷˜j¿Œ&§ùÛØsaÉ:Z•uÖPë`Ï1 Óe4Є¨:ÈDf@wSV5ÉÝešòÞv»Fd"ûŒ÷ _ÈaY¦ö90Í\ˆRl@®kк âEƒ -âýÔT¼ÈaÖe2é™Íq±Ï¢‡ru`ð¨ºäÝ£&UÕáÅu¡LÚ„Y“‘ð|z9Ýå‘ÂÚÎzž©Šu‚‰¯DŸN‹ýw‹eªXkJО\øŒH3ÎÞÜ&ʾ½2ù=J+Â7B…^RÙ†óƒ?Ý£^±p‘kì²æ=å"¨5ˆJ¼ …µ¼®”Ép•Ò@ÉÀH,Ö§Ã8Ю`«¦#ªÃŽS˜ïÞðw­8µŠ›mgZ…~žWkpÆT .ŒŒbnOÄTÜ@B×k Äþ¡3·.ó–·Lƒ˜ÀŦ€ÙŒóƘeÐ +&ÚÊ°t·]^ÏÌÃ||úwÒVýÆ®?ˆ9»Öðf—ô@•:§íj#Vþqµ”mÛ +àþK´Ræº÷KàQÐE…ø—/ÚÃd‰ÑÇz&ý‡öë øÜjxÀ·wCl%Ðûè/R«½*öÁï¨t–ÚÛrÌíÏ]ôû6 g\֮Ěe^…KTha¶ŸìÌáQ{:xžý¾zz4ï¢èƒ)GŒ$‹HînDwÕx§ `úM‰]¦"ÑPöÁ¥¦?ý([ÝÕëx5&þÿHµì4Ø°¥t ¦ÆpZà4äìl;Ÿˆ*qX¼räÉ0±­NóœX¼“‚? y9xoš{Ë ‡À¨œnô=L Ë=©å^/ïs/ÅÒ~6 TÙ)„ó]y>\t)Á“ ‚ê +ì*‰¸qÅ´å’í‘CXÐœÿ!K62&÷™õ;#"Uj@ÈÌ3Èú8tëfe¼š_\P7÷`®ß€?R0MH>r?ôˆžV4KÉ•ÔÙ"úÐNÂj=dVÖ W2pé&Å5Ì® ‹ï +x3ØkðñWž²?)cÜì¼ÍF°¥¾>íÇ> +@Á #31¬X×ûá/Z( áW¾Éž‡"Ycùj#uu‰Û²hÀ§‰&4 Pµsÿu%>¯+9Â+P8;IàæÖÞ–ˆ—‹P:ü8дû ÉgËg#Du÷þ•#V(êp¥5!€1¨ÖªeN.zì嶯Éb»lýò¾ØlÈ2)¿Ëþ–Sðù‚H·PpøÚðð·Å€M“{ vv¼°Wû2=åç·g»ÕÔã5d×7;ç¼@U ¶u¹¬Ú°Wòdyã÷á–G @çÕ®þ8`Hé5*ÞSÒÓeL{  KÄæƒ&-odc:Ëpi¯@Ï i¹˜gƒ{èfB5ç‰î8àúQ +Þ co5_‘~  ØÑKYèÉFÛ#¼˜ÆU2Ák\án +ýÞ5^}’÷‰D´‘qFŒBÇŸ_ĺlg”ûàføµœÞa>|èÖú!<ºrTHe` Û‚4P³–ƒ”¡ÚÑyRæAD'Àþ5Ø­`¤£·Ñä`èû鬫Œ³ù aÈ”8¥XÑ)„œ©©À$ýo\¥'j9#åd(%¦'OÝ{YÏÕ|µ-4UêPæ1øz¥~ùÎñ[*>UåLª¦/íåÖЗÄe¹.Ï™ª½ †? ¿¯Ú櫾ÄÞw3÷²·@Ì·ìöyX™îwkÛŸiùmF*yƒÄ¸hk9À`ïåÚ„äÁõl¾¯êýìÿcjX9Q ­ Ä9 +þI7Âþix+´‘°ÅèAB{ÕùE–Wßû½[ï7ëºÔ ‡Ê-ë?·³^B uO[ô( +Œhè Ö”Eî»BÖßÍ´·âjtŠ(MRYmé¡U¶§Š&ÈhC­Øl¶GºÂ Fq>M’‹/&p£}„Ëaºê$†>äz8—Üi‰/8ŸÒðGò”¿×Wµ©Õ±mM¬ª¯´ŒÊ ´VËÃ=B"¾­$¶VTG Q- G$¼GFêx²-<öýlwäÑØ".µØÿ‡ ò”åh%Ì‹±˜ÌÜTÍ5”· vŠå¢ç«o,GW÷kAMÉLÁÔÁbqJ(@:®2ÏþÄŒo§Ô1§LE…“olKø)O„æÿšzTÑ“«5Ç +‘œ§®íZ®Å|ìœG-ãW‘GLŲ3o¹êPˆ´ïç£cÉäÉ'ª9 0ÎÌCŸîö¦çAÅ72MF篵瑚„¨”Žhð)E„r´êµ(2·ÅÚ±LÜ0I0 ½çd°•/#ëÍn”øÓ…-æújëñEš=Œï_Œ”ÔÍ;YJXËœ•Îbª8,yêÉFbr¥!ÀðΰW­6À}÷ØØò¥Ü¸¿lª6µ!;âOä•­2?BñÄX/(³*² f5@XŸèü„e ºvñEí& +Û,Hrü/Á:5$ÁGß¡ù¶’zîòåJ:øÊ%x ˆ¨sïY–t>†¿‘‚–˜x¯-ã*Uò4Z4ýç!à°a¡å¿¿|,1¡°Yžk·pt—•Îœõ‚^eMžÝÙ c¥Ðè§-Ú“Êu‘>ƒ›v™ìI.¨’šYž3ñT¹kH{U¸y‘å_IeG/3t#˜ÖäjÃ=T8ª‰P2}[ÓYŸãNNÕµ'qÆ×™’C£fF+öx‚w×O^òÐ÷ùu«ÅáMK$Ð/ +š»ßþ 6ÉÁXã‘áþ ÍêMù>Ì/Ð9ÎshvøI½íZ»É2é¶>ËŠˆù_&~0œÛ|‹Rºmûȃ­l'_Q:û™   ±ºÝ[v‡âûhAèE5c½ÀIìÆLÑ*ÒmíåÎ!½ÿ"³¥m’€;ßôe@}ÔTùú‘È=ξ Ã&°Êp6T¿¿˜ÖI !1üâ„ûG»éçŒ!L;6¨§³¥‚E^Nœw‡M‹Åݽ RrDQd’çxϹ‰c +%µPÿjŸÓ½!û©_ù´²IÊÖÌ3*Š¤[¡ ê59Ôì¼F·lFÇs“¢¹*À¦q>o³³sÕ†…\i;éÒ%òìuóÍÿkhtœ!T¬ÒËN· õLVq¬x3ݸÚÞحĹ¯¢(ŠÁ¯—«‘-s›ƒÉâ³x÷ÎàdÐM ºo(ºnq÷ë—dM-¬¦7ïñ¿Š˜sÁ5Ç+|äɦŽèª¦ídësêG|ã:üDïk|»ßCaùrTˆ"ü\œûé_ÌwÐË]2›/—f†è‹'/ÄD¤w’"‚ɸpM4Ì•©Õ·¦‚’EõÈàÌ$lp¾ˆÈö´v®’öæÏÓX{¦—×°¶ý5ý†8¡½è’´î²„âú÷«ñ•Ýœ®£âm:RióŠ+ß2iز»ÑÆ(}Š>nÆ’ο2J™q9pZ"kÕZŒšË5]é5ŸH1 €ôªQ“¡ÆN©@Û;€/¿Q;¯ÁÂõ©n°ÝRü>ì[R*Žh†¯Ò!΋`ÕfL5“ÜÏæ1jš·‚M[«ÔÍßÅåÊÓ©ÊŠO’N,±+…€B~Ãpx„U‘ÖÁ +2Mí̸S8¯öõœRÉqñÍ®ÀŸ6~XNÖŸ37nŸGݘTÓçU@0Å¿èE(¿fº9:Šðpðº¿RµÅ¥þ{Þ±¾‰mœn¸K( Á‹%áátæTb“‘Nóó³7<˜†¼N»”t]Î|­ô+™²¡ÓM¶£¶%ýn“†oA¡ó°0¼¬e'Åq–gEʞPru2²F1Öœ$<'¡!¸}±Ð3YÌ›î>YKh.CÆZnjáì®dßJëqeˆ„w±>Cý&«¹èíX8 çØÁòËòµÄ H÷òLÈ8~¡#oj +Χ·ÃôØ› ½dcUzýŽ½[_‘VŽÜòÝFS(ìâ/öéÚ.“’yAù@ÐèìÚÒ(¼ÿ§Qømêœf¤å”Èxf½Û6©i¨_ µ„,Œõ§tªh0‡ŽÝôsÃ/CNFN6¢“ĵØä·¶stztkÿ¦í*ÔÝVí΃ãÂúÎûõ k+¹v¦ F:·€Y%DDZŸ©ßäìk².!ŽÜi®JhbX©ÂO¤WŠ|„€ŠT/âˆ9´.Ñ­ î¤F@&óÎÖïÅ›óƒàÙ©é8 ¢.'b$e¸Æ[4Ì+Èðµ]¬ÃgQðV&¥þJL1d˜Ø»ú–Õºƒ5i{³&t`8 1F@4öXU†l•~J<Î9×ì³»âëQiÓŽœÛ^ëÚãs˜ô’ ª[üXƒý_‡‘ +BÎ-×Ý”2—püýRR¥U“„]«ê'{°1™?ŠWô¥1Ïîј lÖP“k‚ ÇÆìÝ„ëp.œ¯\’Ö™VØA6­G+‡=ã~t_wÒ¥Ÿ =ßà2p¬ yÔG¡„Oo§4ú0axH]‘6ûry¯˜×äI6‡’«ÁfÝy ó-Á0º kúšî™ö +eÒûI;”Zì§ÔA©_ÚˆPî%R`ªoŽŒ\¸sîVù†àQvEšs³›»lW +fh¯Ÿ˜ ‹¨KÙ5¢7r 1=)-ËÙªÏ·ÿLÅŒ³ÁÚOfìæŒ éø|œ›7’¿í€oê…Û¿ŽÝå^4ëZH8Oí>¨9Hf°çõŽë.ËÞ'µ©’¹5V¶SV•dq¸`.×i“亘¿5¦ˆ¾Óê&PI ʳï6ùÕŒVø‹C>å-žÆ2^ø›±8ÖЀӺ½ç½}öÉž»Ê^>0DlÑZ¬ ¡mùΣ@Ó‹¯ˆuÛ|º‡-`ƒÓðÞšA* ÅbÈ©æ“’oÀ„Õ'aw¬T_?xTž€¼£OàbŠÙ•ñ†üpK€¬b¦§O™›#Iuâ-øûÙêí «wÈFöÙ‘1`fÆ…HïDËdðþP­6i4ï!l²ARÌ|eå?a.Á ¸ò•!zËì¡ó3t¤$v%êŒï¢µ¼¶iK‚¤¨lÿ±þ’ÆÎÓn¦ës»­ŠÎ};“Øç"jû±ï)‰"µ ð;¹ÂãˆçSð‰Ëe–z9«: Ë'{sOï§)€ðSg3|•| Çð§òÂB]ÓÛ»8ú=KPuH=o›[ +%‚NÈ“9°‡'˜ð$̸yEÒÊžMûu%ÐG—U­Bìú­ÿ¼¿ý‘Á°×r$¶C‡6Î8N´FP¢Ï 0óšH bvOÄ]Tèñkn.ûk‹"Ù…[Çî1’+rEU°9Ó¼ŸtðUÆd]›x$­k‹H$‚»rÇ<ÓúöÍæտͶã JiÄ-™2ŽŸ=AõCÁég/øÝ·GHhîHúÓœŒ€¹ãn‰*8ŠÓf~ý騥È~œñìýý°M{Ãæ„Ø÷ñæàÅF+žuÌ +fQjœMØÚÁ€Î.Å[füšëZ6 +^ÛÿAä×BÕäüùäQKG\Huh¶ÖŽŽPœ¥\A4é6vàï(fŒØw„-!ƒoå.HÞÔ¸óNëÕ7á¼Äu- â‘e"‘„¼Ú÷>°ÓÚÅm×<—Z#LGaË{rèN ìܽðT{¶þ Dƒ]?c:1à™ Œ íˆà[“ªnŸnŠ¼S”çç¥Ì`ýn X.ºÛ¶üC`R‰”ŒåW&7þtq¡çÌy•÷'}kŒc~Ëo¥~eµX×ú1¤kÓ¥qBÍÕXªK<¸ÇÅéëþòúÌÄJ*!¦§„G¢/ †+d­ÉLÒ¹*g·³ýã„Fxn±\ +¦nâaâ›#n4µ»[º¶:oWúS–ö«§•'6™öѾê+|Uë¡mÊz¿\¹6ï +¦¬x´ò÷÷`¾„A“ügß|€Ê¬Î b³.ñQ8ðûò»EòÚ|ÊH¢Ï{UnÆ )ÜêûðùÔ´â8|K\Íê ®iI·GJ¤‡ ©Îu…;†Åu„°´ŸGÚ$ 2vR—;“š¹ÿ¤ßú½SŠHù2ó¿óBšªÉRñlG‹ÿ‹UáM/¶±0(ƒd†5¤Ö·óñõ7~4ÈÅp£à²ÛCÜâyô‘u +-gåØPWC`io`ÀXýyÔRµÔÛ£ŸÂóìð.çtwV´NêÇ…QÞÝ•œ´Ÿãc䥞7ƃ‡Òkd£3®§|N‚þodŽ¯¬JU®ê4Æ£©Îti,"dbŠR +RNN¢ žRÊÞ<¢:o8 O¾öíÅñkÿÏ®/Ô¹±ýG8áMp`Ž,ÎPD¡ìÕùîŠÇé×ÀZEïÌ€-€ôyõ/‰W5Øù ÊjÎ+¸Æ)Ñe‘‰Ì¯±Fˆ«WqæŠWÎiæt¦˜h#úD/ ³‰¢Ë"*ª{©PÇ“ºÛöƒòÀºÐ¹ƒ10ÒÙgë'@Á`µñj)Û2ãôÖèÒ«ßÎø< ‰ˆð¡ Hf|?¦«rCç›ÚwAYÇ[Y1*ƒ/ó¾4^¯Èñ²*]£)>À†vú­ë,Ö‡‰i°OÛÍÝξ:ô‡þe7@2£‘Çé^7ݱAžêœsÑIqx%¬È`î·Z¶#ëz‘ +wÉý¼û™^)±…;"£6¡ÉîÞz®kgpýDh¶Ã¨HD`6«UG(1·|H•Î×T•>i”Xå†âl9AC IYXÂFV.¹1˜Ê$¥7h—,ú@÷V^O·A JO8ý,ïoT/ËNu_¦5ªŽûˆ{»ŒŽâÚÞÌœ%1ˆš•ñ^V¦Ç$ŽdÜf¹V> NipjuªÇý瘝B£bŸÍ'þ3·ÂE¬•”‘Àí[*læ «Q1G€]B0bE]}fXs²þNJö_y*O Áh+´5ê6‰×<ò@OËq(Y‰Çr ²2{{”Õä?£ªÛì“-h¢Ä¿@ýùCG ½áâï ¢Ÿ…¾Î¡Ï{™lx_æ¿ñ§r8î‚Ôö‰ÊÐÏÂÜùínè)¥¥¡â iJììáC|[¶ã¯Kç»9EœQ5W0lz8¼i·ž'Q»ã;᤮ÞÝY…Ìa½"¯jè–f]ß–áÉh±Ìwœà)ŽËýG¯à\d=´ðµp5½n«þCùÚ§“¿X×´•Å›"È>ó]Õ4@ô÷¬ˆA‹4dh-–vΖ8H“[J'¾ é%…½„·róš,c*Òƒîd£Ò§̇˜êC[=/i›È]æä¾À_&,öÓg÷¨1Y¯,w¦àÛ¾tD€4qîžÚ€ÕåP/S0⡦é%S¢Â0¦øÆAH°U‘MPHÏÚkÅ6÷ª»àI(5úI’ÈøÈßxS +Nƒp}‡&fæÉiTèÞÎãtßs{±y¼„.'ËIQWzÓ[¹·¹lhå×m +)ÏÀ« f)Ñ£­<ì)F-zæ($ÕA7BkÖà›¯ºŠ¢”¸•Þ¡ôèZwÒ[Û¾ÕðuÙWÇéH¼½”9±}0`ýð½4CýÊ:Å âÞMóþ™Gš³×.¬ÚÎ4{î=Æ19"=ìÇg}ጆãÚí±ÅÌP}Qºÿ ß‚Ë>‚!9ýŒÞLékü1—V^ü”4åò !¡uŠ@W +Œf0ÜÝ¥žÁ’.ퟴp’¯[¨eÂ45È@fr²‘ËÒnflÄH}†ö ]õæªKÌ» âÄÑ·Å%\ÕóecçldÁã­×µI©¾ãLRw|€5Ü7ƤoÚoá°yâCr ¥siü—E͸áà ¡ë‚Þ¨ÙK“-@Úïi½šc›"Í—ŒºÈ¸v¥'ùìZMȉù¿â!Ó «;â;…ž¥Mí +¯z®(œ+±D +1oI>ɱ˜ Ü/©ÑBßp¡áËiþPäxŸ‹š÷§¤'à­³ëPÓ›ÖÙ®€` ¡°GaÃ!Ä®ÊSG²˜ DÞþ>!ü`WÇ`F`´„ãV×Ð¥š…ÿD“Äd‹/nÚ’«$¼=*žL}ʳã_€¦‹*1eíB[#g4èCbš_4_,ïz¶–í¥¢VÀ癵òõ=ù-™åœêØ¿”êÊ’‰ŠE'”’£E;&|¹î]×é#Ú^Ë/mv—ûffÔGBí!|J.=¨<u†RÎéB½Ofƒn¶@õnøM”Ùù+x ½òqâ²êóz °zùð-C>¤-AnÑòd+(Ï ©æ+'bÊñM¥‚ÌP¶Øé{ÅP<áüDöÚk¼ƒ$ƇÖ¬ŠÜ÷±˜ë—KKdA‡yj7³^59Ö• Œ§§ÌþsShðžå±¦ÿÒ„Ð{ðï ØI„ošêøÊnQ˜'ݧœÂLñ¿ÍuÀL‡[µ¥é»ez8A'ÑÀ…ÐÈ1á¿$ñÄ)aEŽÌ; ͪ;8#·­7ÂÇj9ý¯?¹¼Ä’âDÈÑ"ooÆ|µÜ²£Ý.î[çÁr⬅'¶ŒFZ¦ôNn׃`Ú·[A½£•)©^X F£zaþ'"S¹9à˜„¶C.k¹¢¤Öà²ABY^ŒÚÌ a˜·Ï6¬ù zEH’x³ÖÍ€Gc\C[e¸X) '«lá®Ù.È3Ò ™ kü¢¯ 㖫ƺñ–fâñ3k…©H1,­7.ø½¯s’É9­ +XüŽ6Q–&åòÑßl)b}uÁ[Φ8"-«I½.{ð&oOå(ñüW¼7X©¾×ªüum~¨„Á§Yóž¨?÷ï7ÍÇÃz›ÂàrÖ#ùó÷¦§ý©ÏìpÝ-Õ÷ 30µûâùê™)Ûu‘ _òg`dx3 ?5¦œ•ÙØ~ùÜûIôÞ…©—qÕÂÕÅ:a7Ÿ¸DØèeÎœW§  ÿìšy êe^²ÄÄÆrGƒ ë Ñ飬ôX âÓ½ö …p—H_·GB/ÿkÑô¿_` B]¾OÖÁîS82ƒÚZ°À†Ð¹™Æóm(›®dZE6³ +êxÈ ‡í¤e*Íüáɶ µ»nκ…§K)Õ ÝáZí9UMæ=d^®Ã”e;LFÙg9þm×ÄÖ¿™å}¥f“hL|xÄ«H» çoŠ³ß§*° 3µúô»µãû%º”G`-w/¿@¶eKš‘›ºZ{*-ZK:hOŒ¥Gq£îüù̯+~9E0‡Ÿö=Ü0&¢f ['ë<ÝÒ&Ù áû#1 Ëg³GyN@&¤U?×NÊþ÷t`B.;v¦Øv¹T=ñ­ã5ý“á±CçŽ"R”rã¥^KVŸ¿‚¡Å€¯¦hSrl¥¿‘C]^ô\! pAÛ¢O¿*xf¸¢¨Ð­Ø:¨ûL³•@.tqOƒþÒyÝfx0·;tò¾o¬Ó¨ùö³£ðñ¡›_*.YµåçxzŽ,Ev{KI5…Þr@’ ÇÚØ`W͈r¨£<ë™°%ú ¥6ƒ¯5búü&‚77¼*+ŠÑ6.zDª!öа³ÀEr •@ÿ¶î&ú測x³¹ºFw-(/•œàÍ!è,ðͪ>¶ÿ=!47¥c¹ç Æ›•aé¶ Ó­w.¦œ+\S£³Ñ˜t-? õêâss¯˜¼³¿Eä'å…F€†å*ò>+Ð}h}ÕH#BAdü}C M€¿qïúq³héÌ%³%×-××ç÷ï¦ ùJá £D¡¬¤œ2FfD˜ÌƒSvÈz‰3©¨ÒþÛX¼å¿õÆÿÇØõõOÖõwawø]ý.]qt•:‡ÁDëIëÿÝŸD¨R b‘ì ZIDÚH½Ø:Рºò¬T—öP9ÎjÅ%÷ìl¼&¿A™oC™eúëÏ»$(å7A; +¬L eßVϺ«CÁ/â{)sœp6~ªé$/2÷²é»Þ†®Òñ$.Ú¶óǬ,U¨AØú:ó¨›!Ø'5BG|Çœ´­aÊ#‰1È]Ú@Êòe§Ý¨þá]‹ùBɪ”¶H"Áb-$åûî°r-¯·ÿ‡æËÅõsiNïÿ÷ÒN<'y/ÿëFº—¯ë± ÇL<°O4šxb[¦}hu–è}q•~Šß'BWH¹chøy†·mtîû¬þ\XãNÏ„L¸¢Ù6[r*À« G=3ã´´S­!­nŒÿûÒvÅÛ&XnÃüÚ5=¶jI4YCT«3¬µ§A¼üHzt&o<Ë»¯p^ËX1ðfr°+6|-ÇåœY9cdnyòX˜Q(‡6ׇ¥¡‚£Ø2À½u¹±ãJã•gâg·uZS“?0ÕÆPd“fù}V(ðg‡¾|ç”%åUp±¨–s h—–Õ£ ߬Wâ+ÊŠ)’‘‡ÅHÅúº1£Þ\š¿çd=«€K±H+\¤“3ÿ7ÑZnjãƒ@žxOG,k~óÌîàŠ¶´‰D +§(S™úÎÃÎDn—Dä×Ëä©<²}<Ýù¿jÒâ+wà»0J‹kôðèýº¨+îS›$šÚ'_ÉçgÌP4ÌðókUìú%Ga±¿ó‰CSÁMÎÊQ†”¤X¼F¦B*DüÜ >¹Q¬ÏvH¿¸·ð“;ºD½³~4ÓÀW9KGwtß-fçe:¹+¨KÙ±;”6m]ð¡÷gaUï=|¼‘è¬ìœµa´ídͦ¨3%–„!C¸…-¢¬b—9Ónl‰¢¹c¨dä4ãꤠÿlRÕ›[¹4 ; (‚LðÓðùÌ$TJb¢Ôb‘ƒ£—MÏ¿jKÁ2ôC`§¶ÌŒ¶¸ÖâÅë¾ñ@ÜÌLJÌ 'úçÕÄ/ \}@–IP6Ìì-¨¯>QZ9€¹Å«læ>&ðÛåɃӲ"°:G&T\ݘçbhi“+´ôje Ž±Éž£Ì¡‘Š QFýµíbU4k?¸W«;”mÑ5˜Ù²gÎS%úúïis4ð?¶šo\…ï©=ÛAÙ*Væ+õâ›éF\¶r)äŠBEMôä~¨1)ö7sˆ6ê Ïè0Î!ö=–]›OÔÙk(}°óü} 3°a2»o}ýµùEÍAé±öOö6¬ȲëÿIÀÚ›-×~ê|ÉLÁÇêX²fŠzæý̓séa¾/ÄLÛ~!1úÏ~€-ÊHP4AWKk'8³#äÀºtÎ'¥Íõ] $Ñ„xôZ=’]”)œ‰ð³z9ö±4âK@ÖŒg{Þ+X–ÁÉóŸîáÚ@Ð)ø«4’DJã²|æ:>‡T/,šòNhÐG’jæ(I[õ51kã¡åc”¾“zSÈDMUóµ"¿ÞƒAq[_AÖ˜ó)f„¥äŽSÕ¸‹¹ãP5Ûƒ)™=c†×Øh+¹PŠYÓgWœcgÁÿë ǹsÝ”.|þ@6‘*´Ëá·†s%Œ¯´|ä ùvÄŽ„rÞ­¥B®Ü¡àˆ§ 8FØSs‹Ëös1ÙâÙž,³ìodjn#q÷Ô^…dá…–ùáàÏŠ âQùßWã‡QŸãˆCí±Pñ'íeø~PÙ}“Û.Ó~þf‚ .ÏmÕ9™‰7Ÿ>^ÝÂÝ"Ó†«V3²§=r&C×ÕwÂøèó2u{š&Ü[Ïs=2-x ^å¸{z˜ö‹ˆ«yÂð–Š8_7)çì#øižÝFD tÚpƒW¦¨‡ÿÓ¢ý[ÙQ9}uZJJmí¯­EÃ…àö×'ßáÉA·v&É,ôuOòi¼ 2 +ˆ@ÙÚ(…ð² RH]ç*óøÂÆ1í³|xà–b.jÔø)Gø“‘!`[nwDDªçÞ´[0z+îzSZ+Ïê¹RÉ5uÞbˆatÆlÃÉõ!s-_x»»i¼0K&|#K×E—–«êtz¤òÙEƒOÄ:T ê­ãv®û‚Ûôì~º± |êi!ÞüC$€ö!ï&¯DIGm¾fý$í¨T¦åuáèÛ2M¨fàŠßHÛ€#˜x<‰Uüº,»˜ÝÖ¨?F£ köº9ÅÈDéM4.a·¶þeù6orGGx7ÏrÔų64*8j|(•ˆZG¯>ÜOdãÐQD•”GÅS‘ÌtKþZs¼Pù]Éó9Ž¬/¨,$Þè,‚â8éºÕŠÜMòzAe½¨–íÚäðŽÀ{¯Nõô¢)âGn¯Ì·¶³Æ›1xi1ÂGGèâ#l\ÙK¨îöƒf]´Fä ­ GtãÆä£n(Îtc`2 Ï[p†•/™H÷ضʓ@¢h[&!Võsdÿþ‚"°¥O³üfþ é‚ÓÌìóŒåÑU?b¦€r +Ò +,oÖ*g¤_þ%ñœGú¿ù¹i`Â-P2Ý”µ‡#­­¾¾aOIK^廈ͼaÜ8^²Áf+Ïý‹3‹§ÿäj“ì]DhåýÅéer[ÉË%v7÷ÄÐ'Ü:ŒL³9żê=äüšTkŸøhºFƒU†VMšsÜ¡×v¿I˜=ÿä;¿‡Ó_ðŸ¸ÚF†*òQ¼××{J+ÄÂ8?p@~ZÒ/±µ—u…ÿ;0*|0jâáaäÊÒ*]Y“¤³øs›Z­?…¨ÏäDîŽ;_x1”eœs< ¤ÌÓ‘–֜һXŸ†+ZÀÓ^î*—ñ–cÿi57MÇO]Ðglì »{vqÕsȺh \hz×7‡ÚÎü`×Å–=Ž²ÖòTáü22æ¤F@Ÿð2f…|4VÑ¥Ú‰ÙtH2’<á˜×K/­z§òWÑ|L^øØÓR_Tu#¢Öå„ Ÿò0±íáñªCB‡Þ¾šôõ¯ ¨W Ë‹.‡ÉçT^b_OÖ ÅÓ Ä/­á{­XÔõܪ¦”*ˆÀNφ …9PÖèF·)3Áâ3ò"aur–ÎrçÁÖÖl%— /*Ë ZŒ$'Ô¤@1…nºŸ Lؘê1þîUÀÛaðëžÕ^ù[<µêÑÿjfzˆ]¨ŒnÙCòÖ°^EJ‘38ÞƒæÞ[àÀg›Qç)˜Múv‚>OBßì/â]Ù°v¥k ã:mL`<=È¢ë¼u/ãì—QîCêä‚2XL€:©ÀäO/4Ø…ÑeÄ¿Èà º>ÿmh·!^LXNÉPÐǽ¤e¶-)³9b-ˆ® +”ê@X™÷DÀ¯‘©R|±_÷qÔt5•(í¼W鈦5‚ÑݳÖ:—wKÝN- NDóª«^&q>qÁ£Öp ÊB9ž[+ý%y:Ï40_þT蘭Þ*šCuõ’š4Ö¸0ÒúÔ{ÖJföÂ[³z‡±Øà¢|‡p×S8öíÖ{ÍqvÔ 1 Õ4‡&‰#?úÓFMºÖë¡Y¾§ÃÕ¡Âõ‹ÊlèýÎ"ØE÷ට¬yè™ëNÐ~Á§-AÝb˜ Kžµk'hölR/«]÷ÿN-RrÌ6$ŽºrÍSšø•…îM'?ý:Oü«õp7IR›€_åUöm†ÓXr“‹äùSj9ðQhCÖ¢›HœË~‡Cèݪð‚­7•.È2´piÁþŸ87¿Öˆ ñô^ˆ…"=XêÄìíõy;Y +üp¾¸ÿXiBqÑ ñ­Ö¢Ï\?8Œ[ÊÙÒòßØ9[–åcôüÔ·ýW þãÍUKŒÿÔuÄaóK´®fÐÁ&û\ŠW\ÎЮämOZ·ö{üª”x‹Šž H_Ë»±ZK¨²Ù@ÐÁf Gv÷ÑE\˜×”,Ô8&Dûf#½o˜:íçožW×ɯã%f=òÒ[§ÈsfžYñmw(úT–--D^ÉÔlx’#C…5ÏwÞ~Vì!Û—~Ï‘ü,ÜÙM£¨ S SÌЬ¢ØÂ;°JÑH3³à2Ež’ù‡ ¼À·X–‘‘‚õŸºÚ¤Ÿ­ÔΙ­ï¾ÓúŒÕ] ²“µ**X%]™ó#%tßííë­ø•!Ì‚lÎü+?×Q–Z`Š.1›_C juá>ïøÉjâEßx©¸j.wø8obp|˜@éy#ÞT÷%þ]™÷¶ go›í².ñ–@Ák«ë™^…K-Tè<Åb[U Qý ÑTÇ”²&2L.F‚û3K÷˜¥ø©Ÿ1ª@d”Ì#æ¼X?ΰeÈð¤´WôÒQñZž5c¾‚Í©…¦ï\=Û¨çîS|³yÚüàJ2 L×J¤M•É¼qÅ®0UàïV§jc]þòYñÓ1Ë…Êè=wÙ£è•bæÊTºb;Ü›ð!QseŠ½f\N2Ô¯D÷L +]§°]/%ƒ[*Iç³½kÖ@î{–Áv;[ü”=M¿ÀÁ:d½R%Q«`êAù«ò­W‘Ã+= ö-ó¨ Ò²^¼ aÏÜ‚Ju/xh_êãL“ëgÏ‚GÄûÀÄZ=!Á°Ž|Çö);ÖOFô ‘@N‡UÓ<Œp¨'8[ˆ‘¥ð"Òìïž¾ªìŠ)ÜóîuãÛ /Ýg›ƒ.+µUŸßíwÞ¿]¿Dàè«[2£è)Ó_­äîæJ¿ ‡Sö!Úˆ[{ÛyÙ¦3¶‹p \òç‹Ü¡¡ŽÓµŽ[W¯H[? 5 9©Á®oK¶uŠ¾2.TºöËeHÎw¤â›Ãè*Ê®F2ùï:ÁBG‰D>ÚîE­¨ «¤17—\Š_§›P“/ÇG}±—·å{ŸCXK!àØ%Œ1¢¥WvBš1 ßºìŒsç “ªéÈìî/àr³áTÞi5ç곌¦'“µKøäqÝ! ÈF.ÁÉ\DË©]—š²±_Rù‘~Ô”>Ï-xß’lA_;h$û*¢ ÙúN!U^Ï3yš‘÷¤Íé/±?²ååp¬ðÍëË^wÂùNæ#V[¸+·¹Õî*Ž„Ô©–Os¨ñ"Rz‹+VO2\W}_1Æቖ”Ò¯¿«÷ysžr“Ÿ'ð¹r§ ö1réq"žÐ.‚ÆÍÔÙcЙ -ûöþ3gq%÷ÕÑÕß¾rø¥`Œ[n³cÇ…ìÜ%Ê…Ê„dŠÄŠ× +"BŸâA 7P7‰Æ²EzXq †¿¶ûìmô†øÑ3#Ñbp%]¾ÌlgÅÁœ+G!;ÒÄöÓáös9,"ai,1;Tõðéé)¾ ˆ*E´™­ÐÁû-‹üÜØW«-žpÌývl²v86m©ÅÙ{Ì9Ð +BKrc¡·¿–8q2ÚŽi­»`ðX)9çö‡Ü†•+HÙ‚F:ðòL%w5ÓýœTN–“ˆY4EökAf‹eÕk ;E) x3F#ýóDa_z§¡»œ¸ÊŽ0 ò–ÑÌæ3½ßŸÛZ"«þZ_C‚«Ø`ùò>ßÀ5°òß<• +5òi>Š&¬¤/›BLÌl— ];øx–%+÷?"kûÚ-t¥ÁŠ„ðÑÂjêàŒ:÷dg"p×4¢Òl;RœÕìUø­.e# èBèaŠxé;Xz ISmDÂs• Öÿ%m"&4¹=Ù(£ÌW„áQ^·D +l$–¼„ê]‘FCqA¤fW£ÈPšç¡™¢zÀwKfcºÔvc5‹ uå$™¶fQI:e¶;À´·9‡0Q¥r: R„±‚Â[l3í±”®±è•ž@\ e©$: çhT®§µ?êÄÚ tõ¹¿tƒ¾ôä0ÿÜ,ëzÞ(€çƒ5ÚrF ¯Y„¥‚ô@áTÝ%Сß% lxƒAnÐÞã^X`NÃüov÷Îë”gEº{zÛv;ê=]¼]g8µ·kŒ-¡åƒ§ùlÜ6HJã5Ûx·6Ãpõåå>:§øL5©~{šq½sp[ 6ê‹kZ¨=Dr`(–`Ó´G‡£8M7hÏèíLÐ)1ù‰:û™¶** ©PChÉnèÌÉÄWþo\KRµêýdæí=iƈÀ¦K£Woò’Œidh¤ÚRýN} \âWßö«#óãìüõŠD'¥Þqaå—ß0yó@­Ên +®…?#ÊìfÃÐyè¼{;€‡UfþäfåÕ í&<çàæM¼o~™СלvéÜÄAÞUÁü‚ɾŠ?(ÿd 2IñQþKa aZü5$ªém@þ@ +Ìþžs×]aì‰lQ7Q^'<–=>µ‹KR‘+‚n4IÈ¢6åšþP*ô¤±2bª-$u2Mü”L4Ù`ÝÖr×aY:ê¡2,Øå5“ü„!v‘ÀP±©„'C©¸í/2Æ_‚}‚¿_øpV@mP;H=[€Ûcq5ɳH[9H“̾גRÁ ٘ȸ<ôúu~²Ü(˜¯V Òè³ p÷WQ¶€|ÿ/°Â ónâ70îƒå²šèÀnºì8P—wμÖB~*¡“X z½›UºôDºéµ ì4£ÏikÔ€iÐ)Û®àá,¼¦36„l2°ÕX:+ÊrX\V + +l¡8ËË⭤ŷM`+Ê.QñÀ 4ÊT±qφB› +|B…ÅÎOÖ¬Ãp5ÒyÕê{¿»^·³µÄ¡éE¥ `„ >—û¡gÅÀö˘4;¿¯éŒoŸûö‰´[Áè!Ȳ8p6GI§ja¾áy½Ü¦Ò·Ö¦¿Œ¢aL82IÜ!‹Ò4*Ù–ù¼üªenb‘2 ¯¼$HD! +ôªñžBîºv9„Îó=ýr)9çUÍü,aÅ[EҥΥ¹1™rí5"׉ƒ÷ÔO½{©•Bª¸HB}I_ ¹ô{^*Ï  þ†÷8÷5‹þÒV£Q¥1È­ºq§}α׉֩îz¯jMúæ-ü^ c)$ÿ81 +¸Ô‘ÑCxÖÈ|lJqdD¿Í„¹@û¡›„—Ìkøsmœ‚±¥,îÑA©ª®ä=zIûV¸I«O´ö¢…PMÑ€ Âcˆ™ZƒÂ»ÊÌ[à ‰]SÊ6¸–¿+ 7,&Ðœ +뛂Énòè(QyÇ4¨dˆ¹—uÝ´m”±&ªÜ5²[¶èŸ6ïõÞMWÙäø‰ë0^¨•Kf…€càÙΨxæLiiÿ`.T®›yI:]hÎYŸx*±³7¾Šn`¢$ŸêÖ&"Š©œo3ýüȼ£_UŽ6 +¹9WÍŽ ø¢Õ\¶»À®i´{ÑêëÌ›&m\+ñ®_.ÊÁãÃ?©/Ê.X^?jÜ÷ñzŽpzÒ†mnkçn¯¶ª½ûr¸Ø_¡|HסˆÐÉÃäÔ¥}ÌŠr4Çj¤ð}çvzÇ|'$:ÇFPʳœCÆtÓ•»°­4ÈÎanlÓ^ïXˆ Ðn;?Í&(›‰™})§ÜÙÑ(ðWó½î)92œò©Ê|Ô-#­ö7r&§ú×ÆÆEקˆWõç`ˆÑÜ1¡Õ±’¡·lØÙ’¸t¸¸B5¡“愤ê{üÏDÚ Ç§ÌΓ­´3˜ûZ yàz³ED<¤t~gôñYÐËûâ>×ngÙn”h…ÃK.t1þ&‡Ã‚óžBqy—¢ßâè7Øq•\U¡XÄø“£6x†oj¼ˆaÂ…¥ DuùCžˆP»«?•2šþ“‡ÑÖk/X“‘º€·ó’È NÉÄ÷³ø1Ë9’RÐãuú)ˆÌ€‡Ò¡P¯Že¤*wM×ÊÅAÔ!T¾IæâÌsíf¯–O¯ÖŽ ðkvâÞV%ÜÅ£§*T¦*ØjÌ1§}µi¬z”*h×´(“§oÌ€.#‚K(?”0/+óÎ8Xßçœ ªf£‘EÙéÔ‰òǦH=ó·³”AyQüÄ!Ÿ _M‰4r.<ÿ1þ¯bÕÉßE©ëû ô¬l Þ™?f 6{Ú¨³#ž¼97>ÞÈVIgë>µˆÝ®ò" F\<Ɖ·ÿE+´'ÐíGÿX»q­\¢pThdDp›OÝxeÏz؈®ë +î%"ÊË}¬[L7øàäN»×©6ÿé« þ©JÆŒEoU>µÕh¡úÌ;½¬×îpg•W90®Ð¿L þ Âj[y¡¢ÍP`‡ Ý0üBó0nñ|âŽ1ª,kåíiƒ0€¬u': SN—Ú|Ed<­Nõ>óŸÏJÓË'änVö‡SÔVÓM¬ +“y‹ +`Å߯*uïî‘tùH +“EóÃÓß #¼$b­ òj ÈÒ¤Òh¸ë‘Š¡ÈÄ?€½3 cY$_Hx.¼PÆûZQN¾¦æ[jÿÍ6¨¥*å¿éN-tß„mÅ(žaV÷ØEHím +·wX7k…Ͻ–£hFÓ»“á‰Ö‚<£óP7Ï$ܳ "¼çKO]À)1ø—0¼T$¯. p*)»y| L]¯6kdfǪíÝðc€çr\&¤½øP¦¦ ˜B9Ë°ü*QVõ"æHBÂZ ÷G´tlÒº—ªµ®È s‹Kd﬿ŠY4Ææ-½Ô>V³îuM›‹Â½îæsô½„gG|âîáÀ +›Ñm!}e-«£é™ji™tÒ`'èÚ¢ÛÚ›l¤‰H±d0õRZ8 +x)‹õgȨʪ’YTõ_g !IÚš ¦Vw{Õh¦p«Ï(§‰8&p¶ =Z§üùj6A¼­0ËåÓí™Ùd6õˆÞK~Ž%“»gALø´± +C):4FFØqîCX¦.‹TþA=í5ì‰Âfóø¶œ&Šn&y\AÙwÞàyJ|·þE·W úß²ª‚AèAnÛQÏñû±´*4ƒ ôû­³¼/l—¬šfÖòå$†T˜n1dä*FcÅ9(4ò”Ø“ZÇX$i2ÅÓŽl‹+ʷѶ EÀÅ;ÁfÉ Mi¦!$m#-˜C®o yOŽ³öèñà‚þnåRJ[N§9+²áàÕìlž²lsêÿ‰VãWœg;þÄCÚظ×Ô 73ò‚©œ±Y^É ’1ÍJɺžÂ³¶ÛT—¾£Ü°ÿº5­®=8Q®aÎë¾×pU7ÓᡘŸÒ“D%ëêø ¢FûY㥜ãÌRe†•¦5„ ÷VŽUa RóŸºÒdu6*wÄF#ñ]2…ωŒT´=ÇŒ#yÊ›'R:‡-t4u§c¶h°/-áüSô¼/O°C=D63à8qÕ–Y át( ôœ©ÛfK/™0º#_ËÌ1Ý`Éå$‹ò)†H‡ô·8¢ˆuB´¢ƒóáñvÌõàxòNBe§âúB †“I·¸»Þû£I™>e•‡ÎÊM®§‘íÔBÅñ©$Ke¶›nfúá:ÜG*‚;ý¥ä®Ò`ÝE–Í’+Ô4¼ Omjo¯6Xš­@‹ruÉÞ( ȺcŒ“zã7±²À·VMÖ¡§[¹æoªÏ ëvB|]gÁîxq ‘Ãß’æã†ô +MXÈ%ŽW~VWƒ|·Úr‹ãžd«cB­] ûÅÎýXä˜j-T‰`.ÍN +-e]zÔØíƒB˜à u!*ãþOÝís£½4w@QU‹ÿ{ŠK;üõ¼­Ç×àÇ0Àý—Ð1Úù1³»ÁBªzˆ ŽøP _¾ìOÑWóœ³õ¤Î‚Vq—†M Ú +D¹ó™>ËcVø/“¹ì=ê^ÔŠœg}¾ždÞÇõ ¼©òÇŸtD,ßiÜUåÆ_Þ;ù"/ÓhšÛºû}TûˆO ‚gŠhnÆ‹Þ™/—eߎä²á"ò6÷¢äß2l.°@„ï`€aŸì.ö«Êóå&ööÌáwÙ‘ý‹bW:¨Dqا€I¤$Ž M•^)B¹ŽMrC¯' Q“Ø®)U}OÌ„{Ni’; ›íUQĆ‘°“XÊ´+‡†—SqVÞÔ>ÓÖÕqÌmб MSbIæó±ÍUíqñR3‰.Å€‡èvúÔdƒ'Wbj°¬Hýá‹<š‘Hó'‹;'Ë´R˜&Ê>½¶ÕU ²Z ‹Ïß·þ¥r቉A#%ŒOrôØY°é0O¦R!ëYÄ5pë°å4K»ÈeÝÄÓ{ªÒîÏ+CµL0`Û—Ùeî€jrîÜvÿ¨yåbkêuÜCÎCŽŒª˜s«8˜(›4ÿîT!ë1°ö{GØæÇó‚“^jiBRÄ“ +­ÓÃ"¤®\ ÃcÕ ;AÏÃJ쬟;–S€A¸êÞŽ÷ %wèVGž i¬VgU°5 0ÛÚÓ‚6TÜ—”Œ›¬m¾"RDúRb±Åô_]7ú>dܘb~o“‚w•'Øý »Ò†öÙQÆ+¨}Š›çIþ4£mU6|Äk–1M+³^ ‚F—j“ªb¦=ô˜ïBSŸenB*ðX`¡ðÔé!eIÂ2ÑA`ºV æ¾ÐI$o[z”¢Únð‚Ãz”MÞÉŒ¸8Ä©šë¶ÛÙž*Ôص¡¹àó¼A ÁñSI)VAˆô˜zç'Þ…B¹Œ?óÐW;EÛ½jbQá’ôa!ùõE…R“Ëéå¿›К¹ÿ&6DŒb@°wuó}&M‰‚&E23|E +ì­ïÖ IïXo¢œ²‚Ÿž<,7êvl葼 Ù¬ùúTyÔµ"û³<€V°ð°žÍž#à9ÿlT–ëú®.B˜ïÅ +ÀˆÑØ1qk_dn|žš1hß,{îÔ»Ë%G9·æâEöÚç4ÆbÞz­Aßõ´]ßgã\…®^Ñ¥ C]°0æ†XIÃöºM{|${l.2¯9½Wuœž?(hTáY-!nl^\̪°iMµLɨ{WÈS¨Sö-Ä}XžZx:Sõº &ÚIrhå-æ&uÙ©½S»Âë›ÄÃâ…ÇAèô@ÿy.ó$³’çŠÒ„¦BÍ1q:Œ8b.ÔŸÈÄáö λ/¥ j°ŠÄKle7’@ÈØ} +QÝI'{?çX¿ úl[?›V ’‘¼,áô®°€Ö[ÓÉ)5Gc‹Æ ¨½zT×E­›Ëd²šì¯N>©ŠH ùšƒ²nÿ—Gs×I}yhHn•óë-¿û}Ê^pRÌYþFÁÙ‚1(3Q|¯æ©•)"Q ï€×Eƒ#Æx­Šp}M ¡×- ÎíÝ2á&ƒeV‹Ëùâç|Ųê^ÊI’eˆö$„«à?ɪ%.¬Ãu59]ùùÚO³týòQ5ÛuZrî>[ÖØ2B6xvJîˆ×¶}mJ&áðâwU5Ϙo\wïÄfäØÇ'Ñ)ƒpY>OYZ×æÖ ÁŽº„)X¾Œ–6©éý”O© î.2û lìåp)T„#Åðô +„MìfÆ rž<üÔEœÊö$‚Óüš +wŒ,f+¶G×|´:V}ê~'T °ëÃv zZ÷Hg9½yý´c¹ïðþ’2î%JÑEQ[ƒSàS`é]Ê®"`¯Mv"¢dÄÁXÒ]ã¤ðd5É_£ƒxÒÚò]‰†‘E+ Ó'§JÑž³…·:(qßIq`7DÉñonÏ[#Ö òJ¨6Ç)Û`^»$;½õ³í¸C5àiJxöà]ò«òL€(_W,²Zdy°j.è¨&oxõ1‹é³b8s<^ ÔÞx´:yt0ç>ê,ùçU“ûùŶÑÄæ«[ÕAŸ8«Ïs>¥êIMfMÊóùÇÔOéÅšµÆÔÇXä,Ó}QɯºQnßÄ9ûÔVjÒX¡´ ‹2$•A·‹—n|ÊéÖ‡•œÅQÓéØ*N[ +J÷3˜ÆµŽÓ0œ°ÞŠ¯Á=¢Òßß®[oÂÿµQEñ­E[ù8H#$*„fü€¾pGÎôÝ"XùÁ4æÏp»Z%Žgù̽sΧõ—i©uJ vFÜù€gr^ƒßä]CJÀ°PI.m ¡™fu¬Oàš\Q^!‚YIIe¬ñ™~PO*Rr¢ˆ¥©´‚'ÃÎq×T?]ÂÚéŽã°•{ MŠò< ÆB•"\•/ö[@’R%ë ¼7øäŠÂpâ9Çç¶)F‚qൢOn%~ËA@#³–(‰QšqÐyû«ƒ e¼²É±¸ìßY¨¿›R«¼P–/Ä\p`„NìC·„ÜMä5g[üðÆZ@]O›E°?ETJó¥cI&6c©ßm9—Ã8 ®{2Š‡ŽÛ8Çå+©¨kÔ²R ’dû3©EƒÕVAvíÉRÖÚs/èwöœkä›RîÔ ÙC™Êu©Eu +ðr±žB¥UfÁ×:Ö‘-ÐPNÝg•9x9˜)”˜ãѱªÆºÒ·‡‡ÙlpRÁQÍ7áç^e¡2-Ì|aŒ 뺃X;_œa¹HZhðÄñ®&yK8u9èYº«;-¦fnC¿ïÕAYÎËËã’h1ÚÉw~‚ÙÑÑ6àHŽ/ÊA¢fŠ‚š!œ‘“ŒV¢1§z‰3˜ b(˜E¾»MLÝQh ¨nQ©óåŽ×k¬Û÷0Z\Æx¿jŠ 㙜Է7<Ša÷*Hfæ#æ.¿uUÉ °ŸOéKëa]ó(‹¢˜TëÈöŒØfùR±5N5ªä4|F®ûÂ[€ß2èã$ ëó(ýÿô~Çtô®·`ùÁ+cÙf8µ3åkÔ9ÿùc?‰0'_)ÅÙ±Ÿ)¼çQ\.ÜühUq¢çYX+[ËÐk[oô^|™ëqhÞÁÓ%Y´l´ÃÌkü8TëkNJ°HÛ¤(‹žg!LŒ<±zÖ!žÝ†ØךÌiVÈ=B†DÍöô¡#£ÏÏ:*‘4t‹0j"A(ëÝßötÄJ=¿O~` +˜ÌóôpJN?oøû·d¶Ù«)©7h™&;‡îð¦îÔ\&„¯¥ÌNóV¼Y G€î]þÿ€•¨Š¸¾ìß¹y2È%}ÀÒ¿—q;ÎEHEÁ—¤Ðvª“ßÜ¿<_ãªZÊÙ¾òúo8ûÐd%¬¢dD®ÇÛ Jalè6’ðíÑù'Äs^eí8nR¶ž5½0] )Åú:6cþýÆÆ‚^ Ù†#VJœ]£‹ÖùÒ9½»ax_`lR†Ø o¾«ÚÎìüXϬú¥¼OZl„I8$J”ëgûJößeN‹mz1èÍ6œz?›è)å­ÐÈ Q³È o/ïpÈJz/!»sHÌéÀïªüf zðZoÀ¨âÖ’@YÛvLy—“bD3óÑûT§Qlª˜Œ:Å¥oM,«sÆÞ¤ £ñ«øïFüµõN7¥ÑŽh$âg +ô†$f \W$®¤:¢Æµ¨¦mj§B“pùAR*=²‚È1´•_Ô—“Å×gØD&üÖ¦S¡ÍÆ•Œ"ÉTL;®ŽŒóøÊ»C³°EMQ–lR«Ö®ÜÀL&]öÀG¨åÚ¯Ò>¢&£ G ³c/:ô¨¨)°rÁ¢$½3, çt­Ôlö®ßïž÷Íu>˜Úê©€÷>ÞMšm¬?Q5‘ÀŠê‡ +UÈfä!¼ñ}·"Žôu¢ÔÍŽÿa4ãÐĶYzîzdiŸJŽÕ›Æ'CR@[°wË5 Ñiˆâøù~·Ž£©‘²ièXEJ0¯´–@±”•D»SN€ôp×ò?™Âktå<^]—!o€Mñýµ×Ú²°#”'åÔa_¸ªKV™iŸ’ún§‹'Ì$t‡Ý–šõäŠøÚJz%Ši­?"1®ž×Çl‹A'É"9Lì…ˆæk+³2Qnï–IÓ•ªØâDLÿd8ëFò4Fÿåçþ¾n5zd¢_“C¹iŽøÇï7øŸÓ¹¡B}ÅŒŒñLhôHaW¤–·Á73u +¶½Â•;ïZÍCaÄáù®jmvÒÙÏ#SäÎåÕÔÉo·ÊGgSØ[{ò!£«Ë Ýœ½¾ƒ¥ï¡$=æ”4ÅíC96q®/G«Ž§†Iå¹YYàAÜ—ÐJÜó„ 5kx´'–*˜=œeÎΙib„¤ìý[:¯ŒRÑ»¸ó]§¤¨‹'ÒG"λŠ6BiÀO ¯]æ¾ú3+Ä9Êf1M)·˜áåô³¿ÔJžp§_Ñ»²ÐŽ&L¨ÈÝ|xáS‡<“˜ü®ö§ñù㇦8œ©‰§C*Wó$PWøu +†½q¬ºúü.pVÜ‘ìbmˆ5wÔ¢@ví|âðÓ„,ï¾f¡!Ü9öŠ‰±<¡ºãÁ«Óç̲‹^¹cý¡´mìÖ{[Å‘òw%VîúÇeD2í¯0áˆÂ¨³û­Þò49.U«ì÷4Íb9mà®ç£TÎÞwMyu;g\ w!v3ÝJ{ÿƒÞ¤SV±úÉä¤q쥽m‚ ŽÉúƒ¦E]õ7 ~ÝÛŽPX2:±ßÈ'?êÏÌhÏRY=!FæH°È +æ„å-b³E•‰I½B‡2í£K-üüü¾¸³U^Eð§Õ¸šã¹Ä¯þ_']5Z˜#B¸ÙϦÕéØnˆoŸæPb  éEè|BÁ&9’$-šñk]V6XcÖêÄЄˆ _>s{»“Øb57?ƒq)vœ‘otÞ©]*Ž:} ô$AhëÒ :nÍZ‘+Z–Ç0Ûa«È]^ឺI™Äæs—×Zàâ/ƺú +(Z½Àÿs~P`¡Ão>rÍt”Ô™ŸumŽJëTÄ“\í=>UŸ`OëBÐN¾ÙkÉ$P’ùšh«2鋪L2-¨Ê«õ”wr/'QzÝ#{ZdZËw +ÞþHu雥i “>­ ®_?QáÐË°ÿ"¾ õr¼¶  ~q¡³äE ÞV•·Œ¬]ó7¢{Kk¬y1óAÏÛÌù›ïY¡yÙèo 7Z9;ª©0L©z“w%›Cn×^ŸNZÊêÞŒDJ–ëM­ï—åµäY&Åh%\4ßÄ¥ýOk á¡€’ÎO3ˆM^uˆV"ŽLÒ‰Ÿ«[ éÆ{žœ šÍå¹BWš‰0ƒ•³’}æk?@NxbrÓw/›u¾¼’ß–šùs +¹ï²bŸLªét}ò2B@¡KŠt!²1Ê´m-IG0Á;íRÂ4tú˜Ô×Z?4¹æ‹•Þ1"S°¹¸AEµ™‰Ÿw¼><…;wle +0¹€€æ ÂÏvPîÄl~á9ÕíHþ$8ˆëñΠ¤­x†þCN`0;·ªíS©-èUŒ’ 2Ø(Óo{~‡šg¤3uh®LÊ\FÚÞ·z݆Xl<îÙëðÙŠ¡™Ê5FL4¯Zoî³.x›;9¹4Ï€rDBjK‰ávÐ +š¹è”¶Cauñ +£!"I[º \çô²®‡­‹,íýÂX}G@Q Ç÷åÕû ¿$ë´ûÓµrªåÞád]ç¿ÀkÚ’ — ñüYó’Ø&õ¶c—-54-q ‹b(œ1=üóÙ;§äŽ~!‡ÉÚµ‰»AŒÌœäý¹…§¾¼x1ýE7§ðí©g;³š^#óAÎÀUÎ?˜Ä~ÿÆâ(; [ËÈÕ—_´5ÂãsFÝu¦7n9§’§L‹E©Îrr/-¶Ø²xWy—1¥Â}%pËû»Ž¥ë£·<­ëŽ!ÒôÃLG™ÂpÄGiŽm†¸?O(SGL“ÌØ&"ó¿ÙÇg˜]/<ÜI$¾P~ëÐâ:Éw9 ¾¯Î@ËR¦Uãh#U2–p¸›]šá@€Že ¼Q(›óÖÛÕKì鳧¬¢7ÕÏùR, š¾Ë,`€Ïþÿ2òb›ˆ1pIÛÍ„¢æ³ybµ)¦T +$àAÔ¢Hÿ¯§»‡œoÇorh= ­“·+Ø ¹øë2÷Ê^-L0‹U­«+Ä¢öÚé Ê Ð12 ³ì+ ìvJî$[mN¾îCf=ì=¿ƒh· stõ½æ@KgÒV_EöV…”h‘T`‚"÷ ¾5°±*øßBŽWÒdÎ`ã^Ž[!Þ£~ÿÑ÷F¶Jäp†w³¨Ø¢$Ätô¸˜ècÕõŸ×ˆx°9Ç?[Ï?‰Û“(’pcÜ9ïlhýÝxí}à‚ÍUbјa°®¼n¨‘ßôÿ_#|Ò¢Âm€3ÝÏyqé!Îæ´+*ߟ9DÎ'ÊЋøúÜ2=ìEIß/žJ'«#¤Z(!ŒZÔ—!}êØdÓW§L¬ž‡7Žß¤øø•¯o‡ø*U¸ÇjÔƒG€™BÓ›ím€Uaj ­ž-š/¼.Kr×l…sô;›,ƒ IPA +•‰sîUýœç%Â\åwåØ+Ó´˜_Î 8çÉöMg[Ú ë“ÅÅ™ÿ¹³é?äÄ+»Äñ6{$:E\—œÜÕ¢ø˜~ðÎR—6P#&°P.W1¤Å¬˜•É!ÒçGV÷‹9P}ó]@[uTÉc+·*Â?\ò¢xÇOª^ÓK3ø˜‡H‘¬t†sðc02€EG…¤)r¿õ0?s-©ÛIùjøíàŽôx²òiŒÀæA¾Ú³I2D9Ñž×`t¼=剖zÉVC¯¬Ú¬½ðþĨ³LáeûÀP<·*\#| +ä,ÝžîÂÂ8U»%v GoįÃÈ›ÿÀ¶Û yxƹ'^)Tãšã®Ð—äFÞòÂmf{þTûƒ3ØußRƒ2ÌÖ©A‹€ngݬpj”=z¨%õšŽï-‡úº¿„Ùˆ‡}‡œÌk‰l‰î ›fn–°óV|Í]úϳ¿›k±Y˜°(·O”´ÅÊ$»gÙ‚äFHÐ yjªN)ÜryLÎÎÝFÌ\]:Ð +ûÛRô•l3ÿ$\'…1r@Oü)„ŽQ‰veä,æƒE:_oÛ`7ê5(ž%lpD3w<Ê^9™"…zÁäŬPú7V4ÇÊ…€—6Žo)•#:O]æ¤Éó/ñ7`ºúŸ™k8ýH3ë¯vNWŒò‡xÉ­˜ï<Ï!þ´—X„ó:°ñúŒŒ«Wl}^Äå³[Hv·2›lhhq;?›Ã=E}6nñ3Ô›ÎrHçµ÷çÏÜ,2Ò^/{ªdg8Aè'¨KÁcJiqÕw(À?>߬qô„üQVõø£QîÒó(/ z CåÄõ¨]ã¢ñªÓøZŸpßϲEaÿxÿµh'ÑA#çQä© +=Ä”XgÔ{›±Z°®î@üMÐ_Èþ9åMsçpò3¤§¿ì{.³èm½WÔ >oÙÔ:[þFzoGŒE‘gž:¼¦Ì¿ä2a‚¦Ümòp€0¤>y„ŠÃ¹½EãÔ¤¾Ž É;ôÁÛéÑTbZÍŠ››WIò™n2:½÷<—á)¿ú|WÉþ‚Þ¿=¼©òh~J…Zïq ìndb-S»¶â4Ág[Èsw(TòØÎ +'ʉ'ׄ`ýnÕB¡Pƒ™ìâ4†ù„"²=X‚ü&øø.䱧Щ¯ÂŸAÖ]ǧ÷²˜ZÎZC´Óżø ±2ÜCçðgFöë‘m4«92¨¯/÷cØf?`z¨–¥ë^Ú^¤góAÀ¿öÞ›p7ˆ“iN;fÌ’2ëáõ5u ñ¤¹Ý=`§çÚªl®šwã²êœ·bâר/Õ­™?ÌOyç ›'Í+¥\ÿõýU2ê9!ñBÎ_0½ !7ž1á¼-ì÷À¯o8O\Û85úÝËÑ|zßJJÔn@«+Ì°ª)øb + ×Mo'÷…-H%¯ºLˆé–*Uª¡ÕÍï/ÛÙÞ8@†½\ ¥SÕÙìõ‚Ý6fþ[ûŠÇ'Fxg8B,ü4ž‹èû_0K Ní¶Ÿ:L/œŸ +øR±.¯6hV:x”«‰Ø9Ë‘Epb_ÄÖlºìLçiˆ‘b0)¹°R©íAhÉwŽèrYèK¹w 0r‘C4Á.vú‰JiKÑ_ÑËN=‘§ã¯•t¼ˆnIUJà¡û­H R˜6 ^~ë±eó(j³(  êfšfêÅ€P?E`ÒÞ<ñBÑ°+Š$[º¿¹b;àLøbz:Ãm$éªHQyã|r$åFÏA‚&b‘ª›Œ:®#ÅR¯FË»D¬½§ $;¼è`o>œ¾lwBOÃ'ØÿÞ ,Ÿ²…IJ2»@3ÖÌy¥‡ì¦É‰°ŒÊÿ• wµ%/ЯD#ÐäóÉczÈj°•tMÝ°Ó—­·ÖŒ² ùDf ÉƒI¤2®^ÿÀ¨ÆšfúŒ)¹‹`“TO\L;:¤kÕØ°m™f(âx`?”*(søñQ¾óõ&ª‰/ú;¦ñòyô´ÞL‹A\çlrW[ oc·'L¡ ‡µÌ:P½ÏÓ•CpßZ•ᾆÂíG€)5äýÕÁVЕEŠ×£–ÙžaÉMÞ.MÆÙûÑ«Õˆùûg’ÂkÏ{¹O 9Ç4åŽAŽÜ„É9²sÙš%Få’®înÊë"Ẽâ*’‘y;Å´ÆwŒ’[119À숸í²]ƒ’ÌO«á…:o0pµ’¥ºVIçR›˜à¦bü6›—¿ŒÄÙó÷»/Ž¥8§[\é¶"@°Mxž™zD #’Ò”¢+ã“-Ç»8 Y´zйè/ÕyåÅ/²Ì +ˆ<ñ‚ˆ6G­¨€â”Tq ÞÁÓTf>¹°+<É 6M)· ¬„r¢ VO˦— wŽ_Ñš÷Jéà‡ïéæø7v,yšL4Õ\Êí1ÛÉvÆ,n\qôÅ¡¾,foH2R0<¼ä`§A8¬ÜHm2œv˜VgËùíæöÙunº O 3v§þýL­n3“>±˜ë-(ÍCªX#`„ÎK…1=O€YÞ˜ä¬Ma‹ô{›ú!W@ÏÑñZšk>MŠ ×,Çl5¡#Üv ‘>\d(æxrHÍ +?rŽ„˜EËPÔörxóºâQÉ1IɪÌQµèÉ°a }l°…½(åk.8(¤eÉÀrâÄɳÄDºO¹ÍL®M™±ýðg2>M|ïÀD¤Â{1!>ód{u"¦ ÄSå±hZW2ð€»@#&wÖýÛë¹›RíØ7m¦XAjÿwÌB:’ô¿´ÔʽÐ[»TpÜ–Éöª8d©‚/LÀPÑìzÉûbK%`†w”§3áñ±@Ûqær¯Ô:Û˜Ÿöe NæÚŸÖ(XksKAeû‡{×òÅ2Ù]¢Æɹ®žº]r©¿õNseê‚ñuíƒV³µZòE9åƒiц[GÇP:€mF×·÷þµ Ǿ:—±œ!ò¥Á}á¶ÿèò»¾ö£ö—uíc¯í€õ:taîu¿ž&RäÛéø²çqŸ¥|ggSfÕ¨»Äbt a0€Iã÷U)è·ÐáÇsp†ñXy9h$Õ&ÿÊöeHfšaÅ$±lN¼KU +YyÚ(ó·åcÎïf3Å­¯é_>’¶:©hsÏ ØÁe‘v;ûÁ( ¾¯ Áïµ»oÕü<ÑG„Û¡ +&ò²Áx*¨Ë˜œwâ‹a +ñ…ü•Ç‹;Ã#C¤ÿmýøÛ¡Þ®éhíØTÀàÅ>nBõ1”9ºÆÈÑw2x\­õóÞwê½ ïnL6›þR´ÿE>2O´¢Hm6äbð€Ò á2ë¸ë˜þjGÌÆœï¼ÆM“á©ò?ˆw›¿›(m–N‹ˆ­ÉˆY`W3ºÒ“ˆßÕfÕb›x …a?Ôè¢ý4I'hœÏo‹ŽfWT{!²õ>f+¢.¥È¦Çƒ+’}Ϭû"??´sê¿ -9TÍížô}Ú‰‘С/OůƒÌS´3>·L tŒâ¥ã µ¤ÿ â+¦g"§°„úç5~S'Ú™¡ö‡ìL»MÓ®ã‘í€4 »ÍP’7Ûýó55­«á2Þ›jøˆﳆâšÜB„opIÈŸdù^S`û(¯Ð6hˆ48ôuŒ/oŸCPx1;ÈÖ…YlªèâÇì’½¥5›äì¢Äÿ7}‡,z Ÿðøº!ÀÎØåÜ(SØ_Ó¡6¡žÅ žãø’A +qøÇØ=ðBU<ô~àÛôË0YPçz9¥x`!G¤Ì°àSŽÆ P•oÔ周arrξ €ÎHt[Êö«Ýe1òöº +)WX1N$‚Ò*DïÿÃGWSGR+îø ì ŸQ¼œØç°B‚à³ÐjûÌ)åp)Š}³åÙŸŒ¸ 5£ ì‘eýG¨b º‹>æ™Ðk&39Ým¶”nPÞÚ’W ˆ+`.¥‚NC˜(BcŠ²ì^Ôgÿýå:ÇRc|¶Õ"GÙH¸b·/¥|À‰é\KSªYó(¦Å­þH n@âG³˜\l¯b\&$vþ“Ç…ÒaØLJJ®aS:¿ØÜä™JsÎ-ËÄ‘rW"¿ÄÒ6ÝÂO/† S˨€:#ÿ@Là6:¢Ñ¦Ú®¬Àù=¦K¹$¡¡g_Ç9ÏÜ^ä4WqnenÚ÷å÷+gÙÊ8ZœáäãÆÎ"Ø +Þ+vA -RÙ'ð4Ç8ƒV…`“dR+ ¸Ù¶U:k‘ÓCˆnXžµÅ!å’a7u+¿3Ó‡4™Û&.h¤ÅúÃú³8P®©îÏl. +2þÅ +4v±aßç)±›ûϤir| Ÿ€Æo¾+²Ûs;\£k½¨ü9Ë[sÚ€ÝHh81[Y WN©ET¤‡€< +>¡÷í£¥ÂS.ˆQ ìè!;ƒ +ÅÁÔ×ຠýs)¤7ðƤ÷ ’9êÍL%šäáQÿº}' +:|sAÅâcõËÔ«a’£ _hj« ±k7[ÂïŸÙÝò]8 +Wvä@ÿrîÃðŒMŸš9E4ø!ýã[J4iô\ϸ:©ïtP”@ËúOY«’ÌJ|ZË£*]DÍùWbÀUp;gfD¬¿ªí{Ý>ZJƒ‡²¢J$ÓÂ+}e´V×p·iåÂaµƒ9ëFq ®ŒÙŠéŽ®n9ÆQ.2Ǩ²ÓÙÏú&T™ªÉ©r:Ý#0/ŒsÛ› +av'•C5ZNÒ[¿¶#š <âÖhŠ¯#´NoDɵm¼Þ¿—É«í n`ªòžjFs|ÇÕsÙà×'×é|+’³—uWH'YP ± ¡³ÓTË÷ÞH`G²Êi‡¡fñ¤‰ëQ€2Ü”Ät&9…·uÒe/xNº†Ëò”%¹ÊHë°7xW½™Z‘.*øæpUO¡êÈúôqFÙ¬+P ¤„ñÆÊ{0Ïý˜xÆ-ÈÊ ¾y-¢Ã ‡ i:SëÜý÷"™BØXÛµW§@¨rg'2­¤KZ3ôhα& +y\nAR}òc‡ËÛÂ=àÅ6 +Ÿ`ï€å‰þT®·Ê?=è#ß2ɸ8þ¯¢tŒvúÇ“«/‹ÀæqïÍ÷¬SfÏž;'iFãÈ•¤iDj@'ˆ­z/,íâ$xìU EäZ‹Ê6 ÷ƒwf)«LÈr8Y9mKîBX9ãóIbÃA)9oÓ4 ö+»šÉ*J}ŒÀø“äSâŒdÿ¦›Œ ÷Ãä™ÇﯚWÿiEµ¥¤á1YΑ¢ÃÐaÒV¹û&G +× +*ëkpäË.ÞÏÁÓ Ö„äù•Öóy¶q˜¦0AÚÙÐ_KÏp*£Î¼ÿ°wûêŽL(Ò”Î+?µXp©Ùû· ê-âlIÃsBk!#3lÃ3Bn¾òŠ(9ý}”1×ó¶aò+´U2©k»B]fø( û¨¥:zá)gUÉ› Ëè‡&ܪG‚ÞäëïøÝú÷- 2÷äýEû£ך¦Ÿ¶­AS€&åb€BO”wq5òõ„cî¤GuÑTCÄ,jzQdÕ~!yúu¶×ÏIý­ñªÚÚÜáPÕù§É¯ +Cy{(›•º‚Â:â5ÒL-¸}PUÉ“ â‚lê·‘G²AÛ}JôÙxõŠµ&(9ËtDãìbª|™î¶žÝ=ÞJbr§Übb.ùuñ’ΤâÊ›Ýî‡0ê÷Þ7´6Ç÷•'…kº ƒñ›Ž„‚CÇïÓ¡Òè’ôÐÍtK縢¶_»QwVÛ¦€”Lžhr 7 -£ñš³|Ÿ`f5ŸüŽøç¤ñ»²ëŠh&Ä +÷Hê÷ô•DÈTþ¦zt=PWþdrÛ3"›šÿÑQè pŽ:ƒyŠj¾{í$â¼ZîÏé»~bÞ}ÑC 'ˆ@¤:Ljoc8.‰Žëf0[fW‹„Û8I5ÕH·«8Íå_åصw1 ™YÕý)±PtÖ†ñÀÈf³®­Ÿ‡ôÑ‘+·_½™èU$)^wöè¯4ï/³ák™¨¸1P¶4Ïye ®Á­ù]™ÕbßS{š c3'ŸéœœœC©r²ÓI÷JrìÈ[Ì—R t\©þ•Ðèo«m¡x·â½×¿tN»»wòÂÈJñ:ëú"‚Iý³y ~Àm÷Ð[ó¹f7b‚Ò:¦g|<AR6Æù@OUêTØ«Lý¢¿ZÊ£Š +TrðÐœà)MŸ“[ijµIŽ»æœðµHFLKäm™¾½OTR¾„´K nð›vÁ¯¿öhwî(þ\ßÑ\õ‹øêR®~àØ{©)b™^Pˆx&^ ðË_vŒ#wŒ–W›IÜ¡––a„Zš)€gÝv×P ñ3Ó¨\dÜîþ‹ŽæýI7šÐ§q 3 ,ˆœ\X®ÀÛÃírØ͉èÚÓH!­ú=Ó vý=4†UsÚˆÓ¢M1LÝýrŠæUÄÙäØ`¢Í©~ÜQ¾@Q.4`•sC¡æ×¢#¶iÐ'{Ú”Ocy*¿a`•î%_Oº®yâ[‚a,øÂíp~Öÿ•Ï¬}î7ƒÊÿ©3jRÒü’!=Œ[&}èwŒõh‡èI5D¯Ëy4럪FZZuŒXÇCoÿ½Ô€Aw¨ùÌš”s¼“É Œ$÷²âgKOóè^^[­Þžá¨*¼Âp¹Ð™ Ên`ËlWåÿè–! QÑ8ÆÍKš î›d³;wè¸)›ô°cp¢±ßhœÞCžà”§€Iø/]RÀ§í-ü‰‡ƒ:MúãÙ×%Ý«¸-¸´¶Ñ}ŠÞ©Q ±©s`ªÀ‡§¾´â¾ Nw¦G±éS\þÇÚ®˜£«¨;o"îÛ¯ëžúþV»ù1ƒ¾Ñ0ÝŸ‡}8+~4”+²øÄ´ä?yº÷QŒ;Ћ +Ìò~%&v' iÑþ«îY$êƒhÕø0L?GèaºPœáe>=6ß!9sÚ<%Òýë$T_s»gÑm»ñä¤`›ï§B#@5—_@Íeðž Bâî>i;!vöÍ9¦³¦Éz÷ƒÄl”¡”(Aç9\,ï\[%ÒF€M¥iåÑ@ä‹¡{DaË’³GsªûÛÑïhdÄÇÅ®¨Çžc]ùgÖøl ¤œáDä$ÜÌ’)¢?„ò˜Zwèh$¿N`Ô5¡3ÎßÊq»ÅdînìLp¸¤sí à¶j¢ÜË1© [Ýèn ¼ãs,ø"/4¸„íΟÁ$g™¥lÊÕ’Ü­’«¯’uú"Õ‰§V„àÔ)“àfƒŒÍ«ª«ér<ÕÙ—¨Å#·hß^’ª73P S‹ÏdÝwvsWKrÖ¾.’Í@­yÖ»­ É&j\gà"½Á¦»®eÕ:s´8Û™¤Æ-ý¡}eE ñ©>z1ĽIt+¼¸xC¤&]fìC`9ºZÛêEë›Ó¢Pó þ|Àš4I½ûiß&׳¾Qײ‰B™ë¥F0¬™¨¤ŒÓÑ÷„±QÔsˆùuÏ[I…á®ZF>ënãMEœÏ›ÿñI#”¾d…Ü>LìÙAU&˜;"ÊÛ!ŸNWÇ‘ŸÙàØ”}×ýŽÙ²ž.¡± ¾ÊÜZrÇF £Ø$·žMg7RûRw¦»FVŽ;PçH1N©p¶ÂcÈ*‘TšƒuFÉ|™Ô‰tüG„YÛø£‡M ¯YðÌá.c4ñNcžMgˆmΛH3Š‹Tâ Ö}bô ˜¢3c­ÞÏtÖ¨?‡ºìäM{y×l€ƒš.ý ’„öÈÉœ¦uÚìê3±»lzi9)M%)›h~2ófTé…úÔkâ†3Êo™œ¹D›¯™Ìì¡#¨(×¾¹Í!õúáb¶Ì4hn¸9¥b­­|ü.­Tž™.IB@L%¿Ú,›\’ÒEûsÎÅ­áÒzȹ=³å‚¢µb®^³—7‘“€ )“|¡¦Ò4¤ˆ3ÇMq.bÕ ÿßæ½Cd!mé®ù3Aé\aýGí”âê~HTUO¡qR%Ø28^Uçp3â¢dˆÊR(O~U‹æb‰6?oðÚ´¥ÝÈP‘Êô« º˜¬39«*±B)^çi™ÿ®bQË A¢lÊRì9é”ÚÓò„­äbÄ«XŸ+¸ºFÑäô)R$òŒæccâ"d¤7:ºsjBïòïÇd9…x÷'TyV…F†“=?Í’Ê©ˆ¸Û5 B Zõ õ•nðæâÜà$ró±ŠÜð=·£¼ö׈=mŽAÚV[çº2‚ïqºŒº& ÜZËáƒzT[M—¥¸úÓ«7Ý}e\x¶Ÿ‹¥L”¦Ú¦ûñUÜáºx& }!Øoò­º?ØyàøDlŸG©9‰>þxøÿÁ.ŲjÍ ±—ìɵÐnŽ_2 %–wÚÐsQùì%•‹«MS¦}üU´ã®!¶Ç +OÒcŒxê:†GŒV;‘:T9jj"„mï΂æ|gÍÜ¿fûž  Fó†1Ö*#—ÃäØÌڕ˵©r¨7Âë×Þ×ó7jÅõ¥8rí¢y ‚5ì›–gd¿ï_µlôIo8 ++LóøK6̸ìÞüò_Jé‚h¾°ŒGk#ÉÓ°](ÒdÒ×`HGj#ǯÖådÔÈ¡Þ6’‡}D$Ò©÷p“duá=®§ì<ˆÇ†ÙtÂ<"o…—ø«Üc›œ)bX¹à7ª~JëíA\¯b8ÖÄ’.£Z$["ë\ z["nôJ$›ðTÇ* ø¡œ…++'ô ÝBÅG#Ÿ¾‚ĶŒZdõž‡E!Ô4½ÏÒþ cH"åÞ7èx –Wkns‘Õä¿,‰šXxXå8žX.îįFË`gö…ÝÊ2®í}Äxή.…{È[†h-´2•Ñö¤Û¤ûϸ)¢É8òÓUk.RÏÈ€öBãj ­3èýíÖ’ÿ\y½`îUÑí Ü;+óMâCžTóHÜÝwLSÒǹiÙËœ÷ ø^ZÕ¹Ûìéãºïðµ£I3pÊ™ÍnDʶElŽîJ‹¹ÓÄh‚1ÃV^f3œlí®½ÀBÕoó/ɇÑóí 9s8×ä”z#Ô]ùž‡¯Óþ^ŠX¾|åzÚõþš)+ÅâKãø3 OÉÎ>$WðèÇtû‡=›½„Sý§‡]5Š—1˜£Üj€ÏW€Ã^»M®r¼ÝêÑ#y@Ü ;6{nœÚ‡íÄö“п%dà®sAPQ‚dª‰§"û›¤ª »¶u›Íßsµ:vÚ *¾¥$0Þý‘ØQAp®t„TiÑ&]“û‚ÄI%pC?l9~p•”þ©€JÃ(”Ó­ó_©™ì»Ïm®:)ì3¸LEºsþ–9€I¹áDºép[Þág}§Å¢ 0{¶Ø[¢ÕBÆ]™ìDòð†oZvH¶{µ¾7/P(q=›hRØÚç¶O÷^¼•¶èÈ–£PCPËÑ +g í}B-b ÿcá=z ósþ![mwi„1Dõ¸¡é-RNo‚ß~šÆá KG`8)ëfëryzé?ݱiUÁ•!N- ói°zkçË‚jÏYÞa›·Èìè+©ZjJ,‡Ö`ò†Ôáuïù²>H Oó?ŽÌ.g’úÊ .ý\<˜iÂvjíϘÆsFñÂé6<’%G»Æô'tj௟tq…ÕC~Øÿ6ÆIŒ)3‚@fD²æåž~q `F½I¥oÞ0«ðÈ[hë°~Fù¿Ý]1OµhNëèQ¡—z£±€…œˆr¶S{4™í¢sGnFÊÃÒ-¿#Èêö»¤¯/̾ׯ¢+æÚFt‹ÃÝEÎ%Ð6îq2ð_«ïpÇI€We·Àw¥ù\8º˜•á ÿ{ˆwÍŽÂÑm¢0§¡Xtƒ>ƒJô™M÷ÜÞ¢e³‰hȺ‡iDŠFêMddp[AFºt¸oO¸,|¦˜f€+a0ïhFüQP²Á ŽÆoϲ‰ÝÌôiÊŠA–J1Ö± ê"‡Wé f1„Í—NÚÚ=Ü·KTE!‚iC„iÌ¥ïãfGÖh÷*¿û{– ¸2UôõzÞ¦{_INíÀ5ã¿À^4ïÁ{ñK«‘¹ý¼$m™-4€w¿ ÛOçO[É°0ìX½ðF³fÝcNŒ»AfŒqçDi5бcK}WB±.4#ÓŸ®0>\„‚ÍP“Ê2>òñ·€Œ\}vØЊo7^|œïÄÿâí<¹­ƒŽ½ÝB‰)3J¾Š­ÂOŠÔ$¬ºwÇW’ø9ƒë?+Žx„ zaA: + Idä¹Ö ¿Œ”ŸýˆD/ôóÊY +ª3‰¡ÿR1‚ x­v?Úi…˘’í”Lت¡apœñKŽ·€W©ÃtáÄË ‡|+6//•'7­j¢:LìcpÕ‘Á•†Èäû¸Ç‰39ÒÛpß™gUmø®faµlÅîr˜«$ŠÎ€a»Ë«‹ãhÊ«‹+*sè#*)V`vÔ)bhjþªÌ,ÕrýsK™Ø“ëøÖxÞ˜ºÆ·ö÷,IS`R€T’ý~]ž± ¦+Aý +GÛ˱lT+ÄßÆø ½l&4^)†¤s^û;¡ÚRŽ«Ò»ˆýY»+éÌ› _)¶>µ†\‹Þp€#Ú—@ž5ÛÇ<ût¤ï¼Ý³z8*]!H¾»§5dàú‰—‡Q¤ie*¬/òò¯}/òs‡Bó˜.äÓ(BÅ”Ïе!bjˆã<è2­Tï>˜bœLt—Š›²=>ÀÕ‘ŽäC¿=8è6)c!5XÏÌW®¦Y€Ê|u=-*$^B‚K<úa{'î!(WãÒ+IýŠw¼x/¿å]Òà3rf®èp¨qá¾c‰ šÅuõEE°7¿)m²@/êI$å>Ñ@‰'˜•?"yõxbBU$?à •eà²e@èຳ0áØUˆ3îÅã™ ÎlûKS]õîÛÐì\!þ-LMƒ»›à¢ûâéc žŽ¯ 'kÑ¿oO„òGIJð!—,èŸáùNÕ& +qÇH+mÊ(¯ ^µ,âWǯÜú4Ìß-¢\±â>Å„4ó]¼ ¦¯Vµ,útaÀ×ÐÏ~¾,} €ãÂû¸äaÌq¾önþ5"ª“Ÿ¤lù‰±Tùcc®b·+û&c´Åô¡cY?é|Õ“ö)©b¨ì©"›ž©ÓCt\ :òãÍ„wsS¾&w¯ùÉ!vÎ캹—ÕžíÈËêõMóþßZ€(t˜¼-ƒ£ø}*A=öý’ýc¥‡ÊaáœÓÓMÃé¬Ý•í¾OÈ­ |Ù³´™ ìSYãlEÉÿdänZeYµ™ìQ‘a9o1š=Yæ´ÄUò/m·xÑK¿ÅšO›…ãÊÿ¹¡ÜÚð†(Uü{âjfzˆIÃCÓ«¯ÇVdŽ¦„P½_àï‡ä¾ðåyùkAúBtÐiå,Ø]Ú‡¥ïŸ ÚûÈ@7 ¥NÆÝÁg\C"{¥ÁŠ.7$´{‘G×Î(ò¸ñi­ÜðÆý¾ÓÖ´Öv)>1lGwIoÿ\ùD>ÅÄ/x¢ï¦7˜ÎrS Öq÷ßT5<@úy­Ïƒ9k=ìÏÁK¼†d0Ø"ª¦™ífê³qP)Óî­Ô cP ø6ÚüK8´Kbµ‘ÿwTs‘ßXgºVQ£'ŽÂ[ðÛcì?ãѽËØ©Réh Qw  +lB¥š´ž6L¡²Ø£Wô:7¬£† ¨˜Ý&'¤Ñ´p¹ï˜&FV/cfòô[T´Z½A_™•>ÈôßÓ :ò?^Cܼ@ºùÇîy½Wä»b·x¹ +Ìô/Jnô}½Z’œ÷*\µ·…Òi~–Ái™¥¶ r$¾–ø`?!î.ªDÑ̈ŸÑqÛÜ7l¥}ÐIEK'0Ê&e§þ¢â9T7‹š…,oV<ÃæÛ0 ®lrgþ±Û;9fuÉ@ó™0”k* +»-ü¦¡Â“|ŽçwüePÁu"(‹7™½•9u¡ËT_x0 +ëJ䜥áí{?:ë%ÚKhÑtàúý½µò ]­¤†ÓÝé/n½$¹@ü¢A±äL»lž°³wRôØ;3ÊÆë3œHŠx1,BŸ0Ÿô¥ÒìHþ›[”"!pFEhAÆnÇ.ý}ç;ÄœÆNÆq¶$3)Ž½xæO-qNœÆ¢MWC ÈX“»&lrê¬2æÉQÚÒEóœ-]é™12²–Rç¿ 0v,7ˆT´»ìå˜Ê'ÒQ´ÂufŠZTg»A¹Ý°ÞyÙTkF»8IÊ@¾¢ûC»¥¶þâéÛ0R§ÔOžŠï¦Ö-bÀDÛ0¨ÊµŒ©uQƒØ‰›Â]x¬ŒØºÏ,„ÀLU<…ͬꇗ"2æŠC˜–FYp¤Û*®¹3çxâFZ ˆ)ŒSð³ †«Œ¢ŒZ·Áð˜©ïÞ·’o‘“„ãiú†i}Ï–láßTnlÚ%ÀÉ´}§`ßqQøô<¯Ž“„v%¤…³¬™?ñG‰HðôÈõa;%vþ_ÑÂL¼4FÐ6oäÖ¼2í+{Ž‚ŽU|EFcÙ5Áë*0¡YÔ±eß®óÏIóçä÷œÉ”ÒÂJCq{/¤žŒ´Õ|*†Çâ¦"’hª i +—ö~/Nc›îà1ßí]èóAY¯MÖûLÏ"@S˜•úà¬xh¨L–þQ!B_,nź!iVe6LzÇ%2ÞZ‹C"ípòX…Å.þäŒyMsÐ ÄšWÇÕDâšãKCÙ41~ãÕ@,(°ÃC§ÿ4Ü®æûòù÷Eí?¥7@}Mó¦yÅñϯ©6 Ð1š2ƒexUBŠfÑûÙ{Û/áé6½3‹É}e0—â’ZPý¤á>ʧECƒ†¨øA^‡!6";|Òi*Bo-¶RعÐs._( êì«¢ÿi¼ùºyþê>BÔbÞæÓ‡°¯3ŽüҬ腎rZMkÙàF}¬Q¶ a# @ëß~#¥6íõ2¹€Ì ·Ÿµ|hýŽ ¿h5¾ýC0BÝmQ—•ÿ¤F%´©·qQ±bÿ¹8IøÆE¥háŽUs6Y ¶:ÜÖsUütØÄCG#Bħ¢Z&ãõqÿ*R¬Þ[çX‚@SŸ„s(S<è}0¸ÚÚ’!Q[‘ ]#+‡ä&= ]Ÿs’øž÷æÙ ™v!ôÄ4Ö¡? ðß¿YìRSái/ðÐÕk=)t¿‚Ú·:‡M`trs' ÔᇬêÁ(±†FhË°wKW·Â¢¡·gÓX%óÓëvÊESÒ)PKa‹çCJnXáaävôNÓ6åFû?JÔû4FÔ‘ 6ˆÈÐø´*s»ÊýPœ_(·š¾e®_ÌoÏ€´Mm›7}P,½ëõc»òJÒF¾_CŠ\IPÓ#¸ü¬Y iÏ<Ì(ž¥ÖFŠ+Cx ëJÒ`Þf~ÏÓ,âÐûzc…o²*}AG/«¨Úãc< ¢§ ç ?ÕÕ^ÇãO€ ?Ûa´¦ÙŸŸŽ¬à >Û]ªQ"•”>ÀYѵ¥…Ž¾g+…ô*Rý¾# +Ú@$ë$Q{/Sç¶p©!ˆÎ,Jÿö×…cðu º{8ÜœrbÂIZ:?X2ÜeXf~…oB~PWJ%9¬pÀOˆvWhj):ù«ñÍ›%ѾD45zRnÇWà3l)"QXo¸ªyeíw— µ/QlF$]õ¬¼ØbUžˆÔ™ÒØ+ýËCëh]µ»‚+ß^ˆýèÁÕ-  ™ Ê;`¡ Év+uä¦çÿȘÏUêbšwåÙܲ/k-K× B([ðZc’ø;8¹æáY{û¬æËp3ë +AË‹,¿’_>‹¨Ä°þ/Bûé¢|«¥r¸Þ—™ÀnnJ\å·u¢ +G8g¬{¯&˜µÜ¥RªKáx2ŠÜì72Z7%Ÿ±s£™ß ’M·uÕh¯ªWÿB˽箬ǘó G¸½ýÎDµ|ßu›…‹óãyßû¬ìÑ<*š_c Ø-ùpŠ W0"*!ýº&H–yNb)F¬ŒÀZè+Ȥ€uOZOs‰SíMÍ‘ªÐñŒ!ËÚ)ïs•ñ þm½z¤€‰å9¢sFQÚÓÖD;-V4ì&šÞ›Akq$Ûèë05ç¡í^„Pc©øøJ#Ý`׬CÙâ%GOFPúÞnÇAx[JilìWŽ”ö`\;¶^\ef*Q ÷éÝDµC<ýj‹Ä–þ£ÇÃK¤¬ˆ»äIJÀJu s–HçöúâÑ.*|dIÛe…k<3?¨8lXŸ£~Ô¦Éø¿¥F‹*£gÉœYäHôosÐÃ;„~òc3*‡Q6›ãVœGbµma“²þõÿÞFíõÐñÉôL¨œˆÈ_bl„q›='‚TfãÿÙ/SM‹÷•ŸÏ×ל¼ŸRÏEâ;2¯©+ÞXþšÒGzñ4Ø[äÈ=WD}Hˆ}PUÉ“ â‚l—§šRB‚€xÇKç´\RÍ„{…Õâ9Ë%8²’Ö ÌgæXȬ|À„IWD¼DõŸâ3nµõ@æ]Y“Ú…Ò·J´©qéà+Ñ& ú)ƒá—(üÊ¡N6Ž ¼æ­sú£)WÒÞéS;Bú®“±+`3åþMA|žt»_¼kK«èAròòîM¿›ZîöÀùÒtp÷Y{êœf7û×å}Š K0à> Aâÿn¤À¼'ÒhO„W šr­˜¹ªu )ž…ŠCEšg„$·}e»;–Çw)¾Ì"TÚC?ÛԻTqŒ4vsΉõúWO‰‘b„ø˜\˜Nnðœ€bìKPš³ÉR¹vÖ·j0§YÁzìyÅÿ%Ç8JÛ1+1ñ‚ ›:;™„é_Gû „¡'ahžðjºz¥7¦|ãÈ_ÛÖÿoÐ&™Ú½Úñ« íʃ¶”Ÿ«sÆ +|ÓœÓÐ+îÌÞ÷ˆYE½ZM˜;cÊ°€§’ø£gሺuï½¾Ò›¿–c¤0çios[0¦Ÿ+œ3„Ó>#()EÇ~ÐÆw`I´Â&lŠÂ¬©¢ -{z«/g8SMÏE@)•@¬ +-\²êf|haÆ5q ÕÛ¸ +¥'膄ÝРчO­oÓÞE¦§ýšD$CdÇô) YŸI'Ì&äc² EË~{2BE&œR∹É6,ˆá;M¾œr…6°î—æºgL]±÷alõ}›>rUíÿ so‹ÚD`óÍÍEy¶àÂêÛiÛÜû ´C›Ê‚§ZÄ6‡9Ź¯HKÝРM~ËkŠ×ížþ>þÓûSõR”CúøNH‘gSm|ó;0Ív@Wé"û}°;Žf!YXÅQ6ë Vø)o±…|¤DꊼŽtÄàÃì=^Ú¶‰.>iÒ+ëÅÚ:õ¿ t£ q`bÜg=ÒL#±¹x_ +Œ‡}ñÖÑ¡¿zgžTË5ßjø vˆ%6yñ²6õö”ì…¸;°±ø⡪yrOj ñX;"Ú?šqý»Flô¾ªÁÀÖ0¡È<Œõà>DA®é,-ïC6•tŠ\̲z”«‡•J”TÀÀ!y¤Î¿R¢nŽ”¾çonš.| +ŸA[äl"eèÏ Y´qPÝ 1b!û¤ÿ'ãäzàŒaQ_«6­N?˜K$–^H£¿áïµ)ÙKo£¼Ã-&ÈïÜE_7nþi‚x‘8TZGPÝC ¬¾î°ó¢ƒ?„Ï«Ýkc)>3ˆùÏ ™†¹!`]I7I%›P®RZ˜NÓãi?N–¤xÛÄ×£y«ø°Z7ý±ãØ›ÄÔ >sV=œC”¿e}¥@Ke(+¾à.YN](*íco^gb#ÐX¤†ÙÞíA‰½jQ/‰˜2­wÈcê/WØÂÀ‹SËî·«,5 1w¹$éÊÀðÁ6t@C`ꇭMÜL5 ʻ金 Çã <º)þÿä@rE•:ÜÂ/Õ€ÌHe“š=ð”sð¸E³ñLÀæÿ×ç[ÁEÒ{bËJQ…Ñ×δ?™#—Á`³Uwyõ"wý¬@¾7N€©Ïh›ÏgPzV['mô«@½2¼¦u²|oGÔA +<å­¸§ëJ¦ùQDSÀ-­Ó€a1Ý‘îÜÓ%a|×^Ÿ/<8âêt1fæª.ô¢T£‚9‰ü¹Œ“M{yo¦Q|ÆìpØ K| ?]ÿ¸Ÿ]Läu½Íp1Oè|–UÝZŠ G2|§ê‚´E„?¦s˜‹ ©OSæLû0\hJ¡A…ó"çê22x”# ôš-ªøªÂ ÚöUÒçús`Ÿte»å¸ã_ Øøl#ž{$Í€V¿Gú $1Ñâ“MØ"%?ͪ–ƒÓ9íÅ~Á©¤5«ˆÃCR_”9ÔU×»LxÈ–çHPµðæÝèÃ74NYĵե¼·ê5«ÝH*Ì–¸øá›Pè™êEjjúD˜ü Vsï`«îð[fvè†4ò[›5Üwé¬7yxŠJ|\Q)½ìJ.Õ±.ו)KzClU¬±’®žü•hÿ“q5†„¸¬Î{Ǻr aŸ/Èe+¡¿eeŽ:¹ôÒîù|£ä´>¶Èבf"õrŠÁËk|‹XžÍʼn—LtCÐS~S™C +QÏc®ä׿ñŸæW${0[™®qͱÛÚ†Ó×_€´8; ìi›­ëi £åQœÎuüÑ3¹î7hv ÷ݯ¦–HE²®E²ËƒùE·~«Ö°Øÿe(¥†ÎŽÖÎ,mñ¸4H~7ݪ1yº…Rßuˆ“3±%Bâ Ž@ut³ùgòtH›·ë;Ãå–Ü˸VïàÓvØæ O]I>Nwr¯aÇlÈĀѤ»ÙC‘Í?ç„'11Æ«HGNͦp×â>kÚVŒ0Ó(O¿êÔKú°=OW¶ ÃÚéf3Ï£ùö ‘ææ´;ö’¢“¤ˆÅ­‘‚†¿ÊQË+3>ˆ–ž0•ÝÛÇàg~ +ÛTÃÔtRóçc8Ø#¤Wã #¬o.7»Kß’ eQ/L‹ +£NÆí“ Ü{q0¸ÑÍ}?3O®~[ #aSª2ÃÜá¼zèÕClZj‰+÷;íS=]שX¹#­ Ö#9™øÀ:á‡9i`sñÎ1?äĺ&O;Sš•Ü€€ÚÑ™ü‰¾÷xnC¶ÄÛA™}ÕÏ÷ °]xzïÓ°øöÔ¹¬ _Þe™Æüéw;[È× ƒ9†!¬ã³j …¼pr[™Í9UëUµÿ^6T®Æ£ûb“çi°ü‡hŠmÊùšŸM{b¹íM4¥±§~±¤ÆÖ¿bôüJ &pA8â1£™çæH¨gS}Ö“m‰þbЪÀim@>»ž§TÞöN’8!¡ÿïŸÂ…!à#v¤ªq0XGW~ýGöB³V«»ú•|‡hðÄvX@Ò†¤gm€Çv®u ZôóKžU|¾¨hÑÉ.í3 O2šq+»|ó›ÁnÍÓœzÇ=M¥°yCÚOL™Æ&ϸ|…§qâô»=_ 3)¸¾Å/Íþ­ñ'˜¸×9î{düM*tÜ饌…eªwy&6—`)$R'¾uƒi4zæãÄ3Ö™–Y¤TÃ_4I[Jt}”ÒÊðÁ•†¾—‡m ¦Ni¡=°Î$9îsÆ¡ÆGÒ[îI ²gäÛâÎÑ@6KiÚêÀêÆeL˜ÇL–‘’ࢉ™¼j´|n³ä  Y[Ì‘Dåò™ËOJkaÊ!šÙ–É”L—ìLMŠ¿‚G~ÊC¥ŽvL‡ªÒÃ^ +ˆ9ΕKp‡LwZ”¥žcü£Öø°)´0xS>#q/4C%Mî².ˆ…X»QÒz»$9"4ógÕG#½×°ù ÔH~‹‘W;¥’V¬šÍ¤(d‰wÕ6©h{Ug™r^Å™©Þ~éò/*?Û{k y—‘ƒ¾Zleã?hɇµM…«˜ªÑnÙŒ¤Üaߥ7ÕFdR; ´ ´4¾°ÜÈø‚/ÏU@¸â6jÓÛØcã#æìô»» »Û¹ÇXø€±›‹u¦X®Ëˆ&ŠþqQÝ\RZÉPÆÖjM/‚ýÁŸØÀ,ä>Eè(|Ø3ÇéZQ®‘£Ôá©éwÍžyèüy»'?b‘7óì¥2¥Ùæ·º¬¯§;%à"žËÀ«ýÏÃáÙ°ˆ¶•³ŸúŠíÑ…ÖUõÖ®;`†¯*§ÌHÔûr²Zj,j± Éæj¾ Rç±{1zñ7€²uÅ넼ý"£WÆ Ð7™bhï$³e·^t⺠·óª®h6ÿÊ„…)uì@¬ìE•=ÎLÌŠ(,3”Þ=ÂQfSŒ?ùP[ÓŒQåâûž&0¹£áÄ7ÿÂfìò¨í ›gÆñŒþÙL=%[ÐS%¸ácý³c¡Í™*óywcÁåâWõnªô¾“2tÒ÷/oR2¥Zè§Ç™H“BðÒ}X/fAÁ¦ÍÝé9Âa¤}Õâ‹ý_Š ñ'ü`NûÙ­ôדµ‡MÇ ‘ß‘)óKÍÙfOÄÑ#Ìu­œTû5O\Žüf90SÊVå‹ÿcA=÷•9¢§!h=ªÍ°œÌ +8øoþ––Ê‹w8È=¶DRæë2&v9«¬ùŸÃVR쳨_ˆi7ƒ…¼×‡×ܾÆ–ùúO<5Fƒå;æÆ%›’lƒT{Ã(߸}ŸU +ÞúÂßânÍÕýÇÔèødnÀ*›è´Šþö{dpNÆY!RúEמe„}™x2¼IóÎb=w{­° ý³—­¦:‰÷Î ¢ ƒtê«F<™~O-{d¶áêãBá[.Í~‰®XñÞ°7÷@î‡eP=¡¦i¹jæ¸RÊùlzW–}ÀIÊtÑV*Õ^Nìû[ ­`¨í&÷8ɈԹöV2¿íjðåNÑuÕÿ_Ç—k_­•;+¬aUUù(<Ò' çU­rþΗêºÅrÃ)±öE"ÐÁe©ÀÙÞU2ÁîhýƒszOuiˆ»XtõÄÏ3OŠzWËh3d‹æ€ô³©‘ nn襉:.ß"¤òd­½ÉróÆ:%fÊNω¿Q1ÖG÷ë yñ‡¯ÙÍ_F_ßT›­™”ÿ%¤Ë4··{„Qñ+ä="ºæ¸ˆ“drgnXù˜å÷»ãìzá?»v&ÃÙp/ñ· BÜÄÒ‰„T¼òȧòCÑck¡Šjà|›ôÃR;¬öé‚J3$Ë,ªXª«»œ$‚Yëd~@]Â’ÚSOá^iï)Ûòܾ·¥žxÕñð‘ê€|õt‘¬}„ÕÞ~ ÐE;'-â/ÔÐè¥x^7㙪 J@|z=:Ö²0ÌI³Ê¹¾ v\<ñKžS=¡Ü3¿´tDÓì=SÀH°¥ÞÉ6Š +8v|Áp sÑòÑöØp©Û‹V+U«£ ªp+{GkÉ–•À¼ø7h?C=UÅŠo|ÕŽ/uô ‹„H‡ >káÐ @XôÓžB%εWÝÙeIƒzƒn=/¹uüåÀÊkZ+%­ÃF®Ë©K%¡ä1}ªo›¨"z9S$,ÇA%ÀmdÀ²jy˜6m-üL%±8•˜]ä6äÛ‘ü„_ͦے†&æhˆ8"®¾U}·®—ÇâçÔÖŠ‚M»¤@gÝ9â’ŠQß=Ž{BÐÏ1J¤WÖró a¾úVM>&™M©Dïjihq Ù­û"ÇI^Ïœ1–õɸvb\ÃüvÁÍ(ZkôË ÏýSr,h‰sÎN|¶œÒ¢+²W²g§%[‹¶êU de-=·LP¦{§´wò´&Sk^qÖmë”æ,ø"ÈãR:_!œjÅ`~8ûð +nÓa-,`wót{Xc¼õY­ãÜ+jÛƒh:hB¢¯=2ÔHÖ2™q¯òKï@Ë—1£ÐtÞÌdÍÁ•¡¢6å×ò©QœßÐ7Ñf¬(áù3gÕ³BýÃ[þ‚§ÀqæJl¾µÖ¨xmѵqAýšgïCz³Äåíwrªc¬¥ óMÐ œÚdVKP¡{PÐkvà ’ÍÊeüÂ;a€¶`«Í}.Xe-•Q‡#¤ÍŠ9¥ØrüéÀµsÞåméÇN€¡Õt”åØèFZ Æ%Æ"T(âmÕ…íˆÈë,ŸW›¨ÎBÛEy÷Kr£ÜZžû΃ájG-ãc·ÜpíFÂ+ª>ÚºýÏ:Ï2ç¤ Ú=œøe+«ŽËBcSÖ ©å°UÎ"òg™ BáX~ŒÀªÒa\¡üØÖ»¼ óËi󥩀·¶òdüù°Þi†g’øˆeäsë¸bŸY#ÏÉF‘* w>f»i^Œ¸yø`Å´Qph±^K\6–˜77ïL׈,¸û «-sºHε~IJuä·—9ùÏ—¾‚ÞI*WÓ U«ÞžÀjìXÇm|ÇcdG1ì–³.¤NÛ³ž¬Ì¾zŠÙËåcè +P<|½—e¹«1«)ƒÌÂÊ“¬ hñrù ÊÙøÍKwÔÌ Empì˜ú~»0„°’‘ûz¤¬Ë5€ ñèPfΨCÿÔ‰B4gz¿ZþžzIEç#˜e&·±BXö#Á6á6:0ë’Ãó\zF'3‰í t$™ƒuÀ/©P"–8¼JéÀC Jëq![[öÉXMˆ$#à&ŒT:€Å6­M§·¡F[¶Œ¯º'•E˜û‘Ït—jä:ƒ2Ñ“)Z¬×©óëÓÏD“²4qÒFƒ£Æ'sI,ûI:Aw ‰Å0a $ªËªjk,öŸÙ8©ù×M¿qÒ¿Š·… ú0UÙ¡b£\Üô]SeŒÈjåè';G|J¡Ùæýäæ ïµÖgšÉ[ø1–L‹ýÍ —Ü°Œ+ ÝÀć†"˜fQÆÜE‘ÍbŽL¤7"yàô8\XoNÇ“Tȯ §Q!mäÔX—¯slZÕ_m¹¶oS´k‹ø*¤Ùr#•üÒ»¹ —s–Jr¼KuÛaG{h& äP+}àJdN +ô~Í®àãö\OBcî&UX}ü4¯ ¿ºvzƈÖzUã›Ù‹Û$$I’*"˜ÝR8LF oƒZ‡UÉÞúŽ”×¥”2t™Zº z+¬ +ç |ëΆ¶¥ÙWb“Ñàøo¹¾ dGgúpfë…VŽëjÙÄ+OïJTbÀû«‡(¨Þ'+8Ff×Lºû4M¾¢£Bãì„qÿ†ÅxS6Ù C¥\7‹âYÙR­L’¸hqó×À¥Æ#ò.K…àV±¶óT•K¾î8èÖŠÓÞ&ìµÁð•+Õ&0ö¼[ô„E’¹Íé¹Ñ™‘-Ý£oñ€Èó¶1/¬qþ ŽB´ˆ¤·G‹MˆKHH$îEhÇg‰µ›ì”€‘ðd÷߸<÷Ç“ƒ—úKpÌL;#ð½ø ÿ²w¢ç$úáDùÙ$¸òÇ”­L ôSªÄØçì”ÄbÇw·'œ•²ºÒÎ;›M[Øç¸òüX!.b‹§Í8§Ë+ASèQma¬Õ¬1ˈºÇ&Ⱦbin@˜¬²3#Ë;¿Fá¡Ÿój¹ ÒHÑúq"éyTTŽ^ãïÙÜŽ¨XÉÐ;/@c-H2Ì +LħW·d[ªÙ€;ký ê^,Uÿhö9§Õ|0Y¬_±V#å$ñ‘|8È!E·AKw7¹ºÇÚ£·èb+5¶Êy±ß?د¬ÜÇ2Ú0o6è§hÒ1P£`ç_z—}Ñœnu¤Ä#¶ÊÀ¯>ŒŠN†5¯¨­W]RZÎ^AM(Gz®ñÄëV9–)}–¤é£»ýGXæF ÃëÔá¥] Ï.Þ»â¯ÐùtoúŸV¡T‰Ñ ™H1A Ë1Øo6+ÎP$†w™#,y,ÎRHú2󽺬ØV˜u¾†±Ã²½)N*ð,®¤…+BòDŒ¹ñ[ž¼W ŒÝmPÓ³ƒ«ÝpµQ9[f£I¼êlplRK½ké‚Øc™%\ågIî¶[hÆ^[x ôÁTn™Žv’Kº€t¥šw¨óùÎ)ÞL`Ç'Ä’2L¿ûœ°í@l„i>X¨Z…±?bQÄ|$šÕÎrµä;°\X?È+¸–0‡JܾúÃwÐa{÷x#º¦¬‰™»¿‚JðÚÏR2 3d÷„2\ 0¸ÌQ+MiÙ‡à(£ÙƒD¤k½èo@lS奣惌ê©•¾Ï2"ù 䦔ªÇ ˜À~ ׶Ñ8³¡•õ4ÌPÿN 0#¨¡i L{Ee5{Ù¡ý¶íñÁ?¥NyCã¬üYô! —F"â’îŠõûÐí·±.µáÎ¥WÑö.ä1í0{ÂÀGŒD9äDµãkêya((¯@6ù—!Ý{|—y‰p¦kH1­âÀ5ªËÂC·Ž²ÒhÎæõ\€œ¿àžöBÝ aˆ¯3¢æ‘d+B%ŠÐ×~Ù˜ïLå;_Ò\Ù¬Þ0U¾2z³~»&mk‘ÿ,¼Pm¶‰.’8úiÇa…×[Ÿ?ÜB‡©wð7@F€]´‚#qˈZòþ‰Yõk„˜[‡2°gEâÉ0$khÎʦؒ®’*š‚{¼Ý·\È”ŽªX˜¦Jåþ!Í!/Ò¿#¤˜o)?àT '†ÚÁ½/$ù $²Ü¹ +$ë^3°h]ñ´ÚÏ> Ú’ aZö“·¦:Å ‰…M 3(ÞL–¬TÞd¡Ï%¶úƒIé f?I£l(è/%Ròï2Až'Ò´‘ìºÂ^*÷Š“t&¾¥ž1P¥b¦–)þ«Ò „ë©8ZR2I1{,¡“¥·„3Æ4ŽZXC¼B¢óÏ«ùÊäÊô[—ÌÐ7»’Œ‘›^ôx|I[ã nÍL#[d±¢á [r3GS( Êk}+_‹<áH2½#u Ž¡lÛü†ö ÌÝEVö´¸R½æ÷]¨ÿ,¹z¸\á¬ôµN\2G“ëu›Jžâ¤`¥OŸcŽ—f¡-ˆë]44f6ÄMVÄÚ·JUDz+Ü+§ +"‹¢Žá¼M†í¥ÒÓ±ç^ÓMÓdï:W@¯ ·ÐDEÜ\ Àÿâp]²Ð‹/ðl7ÌÖ,_`OØí:RÌtgæaa–YŒ˜?@ôvÚšè2‡iï†ZòÀJ#º×­»^uo9§0ž•²VåÞïZ¤í+ +^ìy \Ýü¯íP´™vŸ^&UþÁ‚ëAèaDÞ+³ðñOX,ÔZqúˆsóÜʵ ì“2bÛ«ä+¿Æªëίêª×Ik±É¢žOåûl>Š íx+ßç‡&g@qJPwCú7uHhfObM¾I,5Œ>÷!ÌíÇ°L"]ˆÑ–÷Üq«RE¼Ôï=LxP'åpA#5'M< žucÄï¤7° 5‡ £ -¶™j…HEŽ…5æÇ̪º© ŽƒŽ¤¡ŽÂk£s–ù ™›£XÀD^IÖ<*À?ÚA«1ÏpÂÍÙ­Òÿ<Úà`GÀÅI€¹„lËÔÑ/V¤¤Á£TD#âÚ„%Úð¥ŸKVoõÔ\¼íà²BJúËèûégø0ËãËDb¢xcfMç€4†Üôº®iûu¢›ß ê,RÕÁ[ßÌG`äÝöÁVLúŠ!÷ZjW:3¢Ví0T3³`û~ô)t0çú›³ø%€",ha²d¤Û“ÛVcñ»ã˜Vg¬p]‡˜{²ãQ§Wªòôá…¢°;6—Ú!Õo™¬u¨kÀÍ©Å’£}3[Ê;rG0žÐÎÁÑt>Âj×O·ùù*š²jMÿÚªWÑB„u[)WMrÜÎâû/øÁÏt^Zì§>]eŒz®)6†äÿ£2ht½)—šù"b{eÁ]×oÀTz·nÏÈo¸€ÖNzÜRjPtô2äêü—ˆ LçpbÏüš?—RyÞ.ãýìójé|/ºèsÚžoÓ^^u¤fjó:§ÿÿ­ ó­ýÿp +ŸÛsò(u}8i@òYµ—D3ª•¯n>LžÄb±shÍB'R^pKÚEÜŒž æ3òÞÇE,ëI>*'´¢²ˆª!®4ƒ'êK^í&Á{KÙ1ã:ðQyn‡Ç­têˆû^üMó‹L¡øEõ~{O‰Ð3n…Àz`>Kïri0u%·ûÃÃkcÆÞ=,ÏxŒ­ûáã}LRÖZ¿ÆO«núÄ[Á{£MJ– qhO¶¦bøÊAV'Oé­˜‹¯ˆ.þ瘬<5\bJ=Á¥NAÄ!¬Ué6^ÔÑM^Îä$ûÕWœf*wúËŽhžK”Ge;ÿ®Í;: Š&T_qÒê°å è=Š‚Γì=¨Úïy¨A}4™V–ŸŒZ(*¯êq¥P±‚ïpÛÇŒ‰¬Þz¢64“Vx#!å=¨í©}«žg/Eê m¨B‘˜^Ê nuºÒüõõ.y8ÁJ¢™EN»  çþ +m³:G¤ +ƒ&-Φ‘^ge íöÄäþ*~ù7û¯a¦@Âml`¥U,÷¸ö_ÙvT( è o§õ@’S0`¾¬ˆÛköî5ïI5õhÍ8xgi‡>z1êŠ[Pt¤cºt¢kíK0t²úfÌÕl˜•—õß;ßrl>F¹ôu­ˆÊÄMùŸð]‰Ìoâ oà H¬¤ÏRDø$:tQ¹MÆ .#O °e ÷’þµ»d‹è/®Þû ÀäÉ † +n,4ô àkP×7!²Å˜`7ÓâSfs/ö*©7¼n–óD3/‹ ¾Þó0–Úì‚ü‘å'Eò´‚Ò¯øÖ¬É-î Ý©6–†¸ÔÛÇÑÄÈÈ.á· dþ•“Åý˜à[½•üž5e¥|cc¦ŠËòLqŽhR¶øŠfFZ@‚¯²Kz;ºržÊÓÿ5ÃÀUžÊ}!Ĉáå ™ËÈ·×ÖêSh,$<;™Åßã-Do08b’ŒxRon +×ïVìŽ{»CœƒI©ë‘câb<ÊÛûPvâ¹nÌï!®+"*kóUÎ$Õw +Sù©ä†$+G–™e‰$¸ã’Xãàù‚TH7ÿK"DË!$õ¸©÷ßäCi”»ˆq??BÔrˆÝO5ûÑ…<(»ç µ‰PÑu‡š‹9AþH´Àrv^~cµ±|w•möÛQØæŽÏÜj̸~×í¬”µa€¬Ó‰€î׸ªÓìvc +™‰¾üpYš•Ê¦ù÷óæ¸%¨áÖ¿F¼öF¿×2ÙØžìWŽFC0¬JükWë' îbO&’J=cUq‰ßO/“Jã^øYÃD=رq'fg.G6y8íÄDB_áÆø¾®ë;k/|Ä+]Û"ªÝÝT¦¾ƒwñîÒ/4}s‚Զ͹çÝ7)‚ukg gRžyÝÕ¬%{¶BŠ˜Çc&2û5töÙCЊ³ˆ±áüJVØ›Ðײ´Ñ=ð_ˆÏëݪ_”ÿ–óµP^øX®xßiž0µŽ³ +o‹QŸÀ’{ÖÜùÖNF8¤‰Àd'Em à½7+/`Ñãzü*芮¹%öt%fd§ðÝÕÿ‚E±­zŽìָݡAz=-uú%ëûiH¥à‰_è ÖŽ ºU1ÌAn” +J#™ŠB1† ÷©i üôG§ …U vÔ!µ@ÜÙ€dHú ýÙ*AbŽšV÷™Eð|SWZoqƒÔ¶f—O„j‰­ùžùƒ4¨y:µ0û'­Åüo*iŒ©Äv¯_rYŽ;täs…áÓ$iZåÊu'ÞPâ6ü칄™ –êüà\8i< ?£i6ñc#§ö®ÎÈf»fjÜ ¾56?€®sÿ"ö!ê~ä8VÇc·¤ÉJZô›[òÕMqWþÿí'9ÿX0î@ií ôú¾el«êQíÁ#î+pºÅ]c‘ñ‚ϲ8­71³ÅMÔ=ûªs„z“íÝN¥„[Ú‡"õe Ó¡‰×š¦ãaµäþ ñê.ÛýØ"Iͯ[4ºx,k’øàì "豶߹£ïy‹ÏkG€HD;éJQšnA¼’ì}+š’V®…FF€>}&*h#‹Žà›¤¢Ã''x³›Ä`‰à·S.Ê06IôŠ·dÜIÝ^!‘o´dWí]È,¯¯¨*>r ásÞVÜr^KÄœêç|ÖddrVC™?ùd.G‡‡È‡Ó ãx^c­t%¬ÈM«¢ó:ôãïtNÁª‰Ê =ä…™œ‹°/%¾ËUœ‹°wH6¼U°ø(þÇMûŽvc8ä A´t0ê?©°Žÿ–~.óò›‚û…W®Åˆßë˜î +Ó)ÞÝŠëëÌ×FÇ·î€c€®3=Ni+ŽKgôúܘÂÙ ^olÃâm29,|S¹N(/y¿;4kNlSã>àk_…€Àn—ø‰Oj^ea!w3³™ƒR]^=r8sýµ²· yé£Öª©ŽÏ°’Z¥ÞV$¸CZ¹Ë®.1Bš¨®Ü¿)ú‡Ü_%Â!#ÁRÝs¸>ˆxº~È*€ÄvÜ$‘«ü+:Ù !+ +x†ÓÐæ‚œ\W0Û#LhÁƒ¸ ÁG˜<ßË~›H,ÁV9ûÿ¸çxd~ä:/PÂʉ)/¼ã åŸIònâKª~ª^¹ Óÿfü‹0n5—¶Ÿæò¥»Ò·!¶$Õ#5’Ÿe*T‚X.f_1YÂ$.ñ÷ifì—¦O?BÀïÇ6J”K£ê°Ùq!Ó_Šägæ£ZªÒ<àø·—ê7Fòfùt?[þË|’ÐN9f÷|ÉÛN’€&‚f&4Îd¢q™!ê+M}]ÕrÓ ¹©3õ×­?áûÇû1 /Üìÿ¹~ãeâS˜Èn¯¹¡#IÁ£Ãšq'wÔS \C_„à{´YÚƒóÖ¦Š 4.NÄ2öÖ© +”ˆfFY~ÍŒ¾ xÇ>§ïÃnúŽäŒ`okÄÑá ñ]HôÏ¢cIiËæ)g'úžœ¤7•™‡¶§ a¼O¨w§e[’¬B\ÓŸÚžµ¾ )O~#ÏLµ™öm½øNòÂ$(ôO]£„øY‰hÜDÁ¸°[#eª>¨Ý©é­{m¶¡Ã°ã~Ð~[÷8ê]˜<è²U`-¬Ey¥®Éñý2˜°K(ô +SM’ùœ·†£ÕYWåf"غ ¹Óòø¹è´ (ä$3×.|1wG…Û„Õœ¶ssÌ`1tȽS×ÿ˜ I=Ã…¯š–œ¨î- VNŒr|õß™xý”Ï¥®Y<êª;ƒÛ¾¯€"â»å¬—©¯p‹|ñ¦Ïãý®3[½1®h¡é4®…Þ%Ü”"öæò…¤¡ÂãKá„ +Ëmà~,H˜+BS'Wt† TOPòû‚ððÔÛ¾qróãÅØÒößO²R4Š€ÓqLZµŠä`÷¢qZ'¯,̃K¶G¶¶èâÓâµk@é'¾3J‡tKñý pâ4û%ìﮞJÜðe ½‘7üvƒ°ðJ!ðFçCÙñÿ¦ +Cf¾îö­ÚVs_º®ô+$¹PUò?å'*ö€á/óÎTÖÛ÷“µ÷yìž4ñÉ{.L$8!A¤‚LÛ¶ŸT©äéY:ÖuÛRaÓêØÓQbù/ÑBëÝ +îÿM:NüÉW/kñ#K@svE¾Kïý⑵×Mžc˜—¦‡ôƒ¤ÉT„åiùšj‡Š§Ø÷b` JV0ŒKR¯i™ ;F¶Ìž +Î`ö‘á aÊŒ¶8©’›Ô;Ö¥&¡@Ò¹åïkô­„—ÿ£*…l‡ïªöŸÆöpjQËãÿu”€£Ù]×j‹¢í¡ø²ˆ ËâÏêÖou•T)gËŒ‡ba};ô‡çFLq¡°S@@H½i —’.útÛžÒаè]-^*r l×â"/ìü@‹xýð¾–M•™We+ÿjxŽ$ðT`P¯"S‡Ík!w–8ØkŸ+íC4Š•tmÚõ%3ÿØ|âkˆaÈy(¯Â¢óžádëëÉœ`v€˜Å±ûnô/ý_ ,kÄŸ¦{o‡ª’29©¨Ó%Þaü 3ƒ‡FÉ£x9>¯g0$•/§…19¹þ +Q®n0ó1^ÒG¸”x»lw¯K*aÈàKeÅooy˜_ÄȤ5_fäʨÚÿ‚غ˜ +ÒÜ;Ç#MÆ®+üo¬ 2QÐeM…f«„Ç«^í­—‘³MÅ©‡â8Ÿ)ØQŠœãü‡ö˜7\àµí>›†{¸ª»ÇS¡Xÿ9ã“ Öš™_˜’Vº‘ú‚„K“V©*…Ij¶®ó´²kV!‡C,­§eËG‘/ãS9Àdh:U5 ˜À¶ž§tÁlZ©¤rHÁÇD}‰TðŠr‰«=b;È÷³~ÀGðÇOœ¡ÞœjU‘-ÚÃyËLì—ö kUñ ×8PQî×0¹YæŸ"o° + }ñf*·Y=æäu§TìC1·›´ _ƒðG0*ݺLd<²2\å,ýj]øßÛX…Ûƒ¨©zbÑ ÷K‹”ß;+9íü`¯1ã$CÕJýž8ůj®ž%U75FH}]¶aïtÛ1ç/…½xú¤Ó,ôÀÜ#$sâÀ8Q/É´ a7…æø«È|rÃU¬¥jÆx¼ÏZG†ââ.$ +Ã.ñ·u./èa~í9ß?¢é°9aG!p¨ÊVì)I nø1¤"+¥ôÿƒdI\ð±>[U—y¾à¡ê,²ÄèôïßY‡¥yP©òqEtPåXŠŽ^Å€jÃÉñzë ô}ßYp…5¨ ˜ê9ü²Ó öÓ+™ƒÆñ¯s<;ò=¿?A>("¤~y‹p›Ü)%V¬WF )¢¡×»³E— ÞvdKª`Δì×vÔñÚ¹ÓØÛl­AöøŸyŒÒjo +IÓ-Z=È')Wõ¹d!q¹½«£LÙg¥J1›c}FÀ<”Šà@ñœ¹i¿³Ï#MMµTºQöŸX”ˆSÓßdÜR¦oÊRð¾csËÔOÑ+ß'F˜¡!fÜyš"wÑŠ¬=]la<AéWÚ'\zF?ët¼hÚQFB[²¾2ÛÔÑ(I0þ„«W:…¹fˆÙo–ž:ë^ûõÒ˜'ÐÑý^67³½ÖÚF$A†@(Ÿ.vÙçㆀ~dìÓp*‰íÃì$‹âeFÊGâvËT6+ë%2…†1ªËaÜsI«5/¿õ˜RSqH—JÑ߬ +„4\S13cp¹6ŒàŽl#6Ò—´íÑ%yø¦h†§^¸) ÒüÓ\²ë[Ô’²ÐÔ•£=ÒÍ/2Y¯Åµ5“S)iq;Ofi±¿þ®´5öo÷qüq3Ò£Šº®šUUAhÏB5v.»’Ók’ýgEO}Û”1Þþ¸¤ÓDõ£~ÓÄ0¦!ÞÄw€8*M¸zЩëY¯žúàÍKŠ^mGÔô;¨»=i|²?8±_‹ºÿðEÙ #:p“¥š„T,ìCÃÛooÀrsƒ‡›l-¸ò²ùRåý:\ïmØðnz¬ÃêÐoÀ ´•PÂ×è<”s½r°¦,¥puX#¡çÌ BBî–¤EäAƒZ§ff^ +Âîj¤SÍÿÊPªš?ÉÞà~xägsæ‘Øsqô†ýMï“ w($›¢·Ð>œPùÜá Ž=Ö.¢¨WT›„äÌ$%é÷=„ൊÿF}tx½l¯þJzm¹`nÏYÖcÉ·[—ÇÇc°õ ¹=!‘¾µ TuùzLuIo9ïïr9«9rfeº7‘ð3ã½L~}Z¯öóÄ-iÑÑêø£¶â㉯¨rzC¢›Ó£xɪ¾~vÕçÇ€¶ëó8»uo$¹ÆÆD†$å6­EÓµÕ–ó*ýÛEÇγ‡cGw@nRé5ý†ÈÀZ*Ççú8ŒGç©©¦ÑÛŒngÞŽg|,Lß{Õ7,Ÿ¢e‚ìùÍ[“1NoF‡†-/ß6»z:ˆÍVU>îÖ·”`x}W;-¡ñ„Ôë~ƒl.ÐÌ&ÑaÄ=âu‚¯8D—r¶Øòü9®äëZ†©dg†w%pƒ=4—~¸ø­-]RŠ´ÒÆn Ê7xB±6mÅÎÜ‚Ö9 ð9¼tjÁPXw숰ãwÒõÒ°+T\k=¡€›ýÿk×>¶ãËÝ;ò¬>ÍOk2 s¶1cÜ0>sv7¹ŽòU`G{ ¾:¥dKЯ&x¾Ì‰[N€q‰r«'¯þñåå°•…^¬‡BøU–ç"¿Ìð.ÖðL¸C ‡Xg‹JýN±|«=,ˆÞô9 ô°pï{À…–9.°)"DÐgØ‹¾ú¼` ,ð˜õÒêLà·ÆQx$¬ïû™ß\ájŠ´-}óîJò kÇ0A%gë¥ldkóÆ ì…Ÿæ¨Š…™n…Ð2Ôü’>÷6._ `­¦³ÙÖO:$vБùk’'{\8wÀc•„Ïÿaÿ5'do•uáI M‹š±Ϧx–+‰^8”¦Ø]Ï®B0d…£Çæ+¨¶ôŽWò)7ܹ˜:—£‡PLâÿ}œo„t[X.|ÐJL ”5>¤Ë¥ejIÊ@7bQý¤ï>µ¤‚h¿ LG/éŽ2Úó6¹ž1áðÛ—ýÀжC&àüVe¸Jœ'×±£ú7òùÑîr y{×\:$<ÿ&$MbÇ®ÁžNÝ4ÿÔ@uËD#®=&ôÑ•h “Ä{œ(_©Nê‰Àê¼-xút ÜM)ö°É¤Y–ô2±ݱ=écǬPœpò†uø¿bÜãé*øÒÜÀwû +²®ÖÛµÍ27g’ÓdŽf¬î‚NÅdWr‡Ñmt™N-_i¹ôÕÚÉ{"ƒ;½:>`¶‰jpÑCêsöÛ–AµÀ|ÕJ§£Wð³ôºà~øq×4ÝúˆÚ¯ˆ8ß0>ì{—mžvå°½‘P`·šŸÙÿc} É8uÏ1¡È‹õ6¥›KÅέ•èšŒ‘hx/¼Þ«P¹<ý +"ÈÞþº;J¬†‡¿“ék+¥ Ô³üÿ’íÎ@}–ÜÉöiØhh>ÉÌ%4™!«2‡G0”y7öå¾^ó=¼°NÞþ0©dñÐ’é­ãÉѼͿµÝn3»8œ¹bÏ«‡GŠw‚ÎdÈ&Ïþï,ò|ízwv¾a?ŸSÜäz>¬X±Ó x +éT!ﵡR¾*ˆi}gJîैI^‰“Ëh*Û芗=43j>’ä¼£k(Þ{暣±0BŒ}¹`ØaݸZ€sóJ„IÚzzµ›‚™P¼ o¡;ë#ïd +ù]C© ¸»N‚¯1ÞvÀŒÈé”Q=jÿÿî ¤·Ç h3µQ^ïkSÍDW‰úì ˆ:îŒÀ‰¯žÛ¬TžóªPÍÕVU¾ ¢n%ÕÚ²9Ý×£^ûÿŸô,D£¤¾¸)®ù™D0óKXÌa`¦’‡É%=æÐã§8ßš#(5©†ÕL8\~œT¨ãˆ)ÜÙÛ&OÜ覷·ª½ÅÍÆí•Ó¿¬‚’ufå©sG×xuëX» l).aV&.ÿs=ó`.˜«æ 8€üR—œëe¸Ngâ»F±YÀEµ¸Ô탼+5Ë4®÷ÖT¥ÀÉ lÔ´¥·æÕ€á~°™ Þ7…tÈÃgZ,¬›èÇpˆr/˜Z·+Á»/ÝÉy׊ëòÕ%3GX“y•»m›Ìz¸‰*0'vóD°}g¦OŽóz“¾W>²á $0ÈéKêŒôäxu”€´÷@ÍÈ Ê[Oà «l~ûÁÈŸ…=Ñò-†l,zl²Òûgã~óvy„)«‘æÑ5¡é´‰tòÆ…y ×ä§)4íÔçrJÿØ©«šÒgþ /+Ü;ζ·_ù÷îäoÔ„ÔÞ¢‹åx1ƒ×X-)zÒ}ø™“À'm—i»¸Å!j YAjÆ¥¥þM¯L$ˆ>dPÝ/ jÀûß¡vº£täôlzÅ<1_7éYGËy4ß‹¼íS‹”0#æ‚ÐF üF©h﵂eò¬GË0PÁúT:D¸N-8híX۱ι#;žù-ŸuËÈóC·™gÜ㘵]š+È ©Ü–=¹­êo‘àqûY"fÃÍ)ñxO”æŒUÊ¥D{’®É(S›€¥i®S1ÖörÂÇÈ0¹²‡\*káÁ…{ΑÜ%)q’B£~^Ÿ'´“HÚ Ñ9`[¸ìbbþŠLÁçÂ}½KÕñžGvµ3Cg[‚~ðSañ1ýM´Cypã;綞D .—ç ܈ ŸÒ¨PGúÈ@‡¨­]§ØH8¤ÈÏýF€[h­p6n§éïƒdyýþNć~qœk#Çv° «^±9趮;‰#îögõÂÇjÕxà¿lWl;èÛ}”æ}"â'È~ÿá˜çÑ1’?(ð‹Ï²+ì‚Gœ¢Ž'‡Ú~Ýúæ¢=C.iò ø¥8[Rj5~>c¼Ó¼€¶Æò®aF§Ejó»°âQð»}[ê,©ø¼åYÄ}Qó¤lí¯¹â¥m_ÈêK[X“ uC¿Çc)/[}|aÅg–ÅQLÑ·´…«L³Á‘¯à~#ðô{|JA9ü#«d%°û¯ýÿk-2ÑGðAW‹Xï¿U™J]Ø¿bÁª½Làðªo}X°Ç›K'¡¸`ò‰å#NÀÀ·Ÿ©¾ +¦ÂLÙýpóÔ˜)¦,zEzáxÖì¨ÎÊ8ATÉÆŠw[KÓ +˜¨^øUM«í0KsÒãÇHN@}‡£›qóEY›g÷/ÓÝz*üç+»:Á ~“¸ÞWTÌ\¯@@«å5]µ´¥óÊ¾î† w`À«…­r‚9þ±u§GÔ2Iê±)‹(—Ì +Q“+xÐÃHlY­.| ªul©\RØ¿=Qô íêàS7Ÿn´ÿ%iäc}NˆÒ›\v©š+5 Ī þSåÖÆèJz穼\#[°ì Ô£'Àì|™þ5Ù*n6ôÿ5„ § +Œ³Òq§*wèuëÿ[´ã«™²g¸ÀÓi%r¬ç_O:Ó0n% Bnq¿G¿jï¤Øo  «@ÿ÷\UIŠ÷é7¼qV¬R²Ìº‘œœÞÊ31IÌȃ=*O~ÊgÚ‰•Œ‘?ó_&‹".œì,½„H¹Na4…sa¾Ýì ?$×Ið UÓ;un ’Å!ç0óÁ®&ӃȢ̺âñè‘“Uj~ã´’Îgãx7[R0u9 ýö`t†VÁÌÍû=…9ŽbðU@NáR0©ŒwF©@¹,+È[4»Y¨ èLWtÛKÉž"—FØCŸ½o/w\%=›óf …uþfRÛ>è÷\7“™Ù‹9ñ•‡>²<ßÉNñ?<!+—º Q©eÐ|žU?ÕçÖ\©8>:Õ$ɪáHáîÔ&++¶\¸úr‰V¹êIù5h¡×<ùcL"4¥ æiyì"u²é2í (Qsºý8ÛǨïhJ\WÿÖU^QOnÎÍ0¡aYüiƒ}6…ÐPŽgµdÐ +,'?ø!š² FyS=Jµ®€v(d<ÈX|Ûí˜m +÷ȵu gISÔÝQŠžÞ² ÚÕ§é»S. +”æÓÓ=Ad.ç–Š3+zq¯îœKH¦Êh›{äN$%?Ø—6Ÿ¾„‘ïï8å÷{!éz±˜×TvaF¢ ãí^_€ÉbOøIKQÀZùìÕ¬ä…i¹5$BɶpÓGÕºÛü5”r”‡W&á5ñ€&BŒ)xÛ\1mmÖ9ƒ¸×çxö´¯Õ†ƒx›†Z2ʣǑ*ºF1X¦ñÓ6·Ÿ¬j›ø!lÏ­{$lµ‹á_"ž|?ƒÖ¹dôðë‘£¡îåhÿ/ê€>„1Î}Í&„š(7sí÷yPv•Dn&yê2´Cóð¾m‚¹ Ôƒ·Öܲ-¯ª2­ø¸Òþgi/³ÐÄ †$ö’²Dò^§U#—÷b!çãü…B½ÚÒgò•@Ÿ#€‚/ÛP+ÛÊ–@òñ™¡}(pF\Æ'ðP(Õ•¬âäì\Ì~ù ´ßž$þ&éÕ°¹`‹6z:Doe  +‡FÚ–/¬33-@+sÛò ÉN~¹õ¿“+áF¬*ÚT+x|Û.˜£ÓMM؇ô#…›‚È‹‘ŸÐJç£B?ÆÎTŒC{á›.‡‚ûXb6bÔúÖk=;¾("]gMí<ªËÎéa€°¿ÑNsʯ4-+˜ Þ-v¬+ð ƒá(w|c-:Àqb²? Ç]Í {5^ÿúžðh’žÙp™9+—‰ÙÇ¡ÃNŸFÒÊâþ›€vN/wÙÖ›N94ð-öö åÕ7Ølöÿ&Uí>È|btÂèNBIðåšdã\| Ü€„XVŸVƒšŸi#B_0áM·u¶Yˆo¸¶ ¹oïaŸ}<|Ší~u˜§—èÓS©BE0ßI­;q°Ã?ð”ÍTˆÈ°j€Mé²Þ趯?ù]ÿì>ÃÐ|Çc,ŽÂHPߤŒ¶–ÕZq¡Ú³Sÿ +}µÝ÷gAkp÷Ö¶ ÕK¿Ó¨x•àØk±LYíuöÉS§þ7 ŠŸT—)n¸®<=eÑ~ñF\Ž6DzpŠ@Ù*À6É›½ŸH”qè~8o²öÆTNă)o[Áb;Q$íqÞ€µPNrÜc¶7Lmj@ÆöÇÑ#Ý9RŠS¦±²ËuA5$ºˆÛ›ŒwV$³âKpše_ê™Ýó*¤{ Õ+§±7Ã==:“ô’Ùœ³¸M\ú\°zf.g÷­ÄåyzK‰¥qk\>ÁÚ¸ÚS3þ9•Fd”ˆv°;7ûœ…ní”Æ ÀÅzæ¹ztÖ1€~Xó“4-ÆEäÓ€›Û¥óyÍHSšß ý7Lϲ×f?Üéö´„>98vøÅP_¿ [-¿W·m7> j±XDâØÔåkD¥~Ø¢½ ‰@÷Q/ú¼°ãCNüBìÜ>™¯áìÒâj‘L“‹„¶£Ú´7g·Cêgj÷µâ¢\je{—ãÍŸlŠ4|¬ªöÓj•‹]Œî®8ܧ·5ôd¼ª§?«Î\®`ªà•P2O©[¡ÿê.Þ_È34›{ u]hø¶Ãê1±]‰î4‡øV#\ÒT…îóÅr­²#8”aø,ÝêaÍú-òÁP¢®ÏÜØU„ æ¨c?Z†å6Ljd€–°íÁ6)‘r>rödÈmá«OàÂÉ…\¬S’tšf‡èësáe=^]v +ÁkpAÈ0?¤’Ž08¢¨E‚nC’Èé¨U‚Ãêé å¸î«‰y@cJĶÑÃWiéÁšG“,(6—Ò”¨~“íHï·Ú…šëF2{ϱìÅ5©p*N´û+5lâj9pøEž!¾(gÆ«Í põ€ &H5‘)¨;.’âX5/0ª\”îôÅýÂÆgdŽ…%2‘ö7ðCµ%¦J×öc`J¿_= Àó¢ÖrÅžôïr±ö¯ +üh™à9ú!ÚÓ”=Ò”üµ•¦T؆b¡@ôÚå@‚(ÛÂmøˆ Ÿ„SŒ`]´…‹•C°è--‘Õy͆éú·bKUdÄ/äsˆxµªU]÷bv¸-šFp«l ÆÒZ ùÿž4FèÏåC ûIé”Ý6¸¼M˜3 ­°ûl«Þ®ÍõÇï}©4»g*h__Žñ§¦&Áñ +±¶å¨­¤‡?»rÜB« +¾VÕH´óigÑH|U1ÄY=ü·VðÑ Ý›)IðaÈ +Õ¢c<Øž`…º$¡´8³¸õ,à­~{DÞf×ÀT r˜"¶Þšæ„”þ)è¢xÇ„O‘\t¢O˜ úT\c|@hhB¾‹†Ùµ*1¢Ø;ÝàŒ÷K‚6S%É’ƒ„|pK`Û†zòý×L ˆ•vqн笜!É/¬>ÈVÂHWß+—¹à<5;·uÊtDÂåÄšµÉÖ䲎®'ÞH%“å N&ÿ}Pì 3à õêa£0;eE¿ÏŒGQŠüw;„«- v‘‡à÷èÎx"Ô 2+7g‚¤YÒÁšVìîúb²1Ž2ÿÅ-ð>fš9Wh}n!t\‹IðmÇ4°Aw1 +¿Ï?3þÔ¡EÅgþòÉŽä@騎²ÂÖÖʤo¬š„_EŠðꯆÙV^g~™ú0ù` C<bàìêª |€° 3U[‚Ö¼ ™õMVÆß·„íÀ¾¥SÉý°^ázËT\@¹z,õèƒ*ÇvžM±õ4ÏYàÞ8–X é2ÆO >{«öC¯´ëžƒezHï9øõ§©Î‘[á_i³™Ö ÝvE\À€TC%özs¶ÏÀ¦ßÊÛîãÄãòK æ ¶ô¬j}tv +W]{§í¨áÀÒˆ÷"ÃŽìWLá<Λ•œµ[âîÔß!ò®§q¤ÈÝLtd®ØUg¢R¡¨*Œ=p†…ݦ¾xûÈ»À§‹ÈUV—">ŒÖ½^v’,³+šhZL;lÚœ)ot¹!${ÛôQ½uZ¶LabÆwahë¾¼̺dZËY‡Ä‰û’‰3T#hÿ¼œb>©¦â·ÔR4Ãfng9£ãúŸ¡«ï.¥bx‰ÆÍ;ò-ë°KOóV£Ò£ë1+*ïJ<=#ì +ôS~¼^ÚÒ/Ø´1œÌ <$5ç|JÏvp 1R8:Z‡:"ѧ±]‹ Çc(ÃAëQf÷j¸š¦¯ÌiWÔg(k2i‘ÓC¨Îx$ÇËCcM”Ë-mù¥‡ÕnˆD #ûu»CSË÷îiAßÀ’T1N‘@kxh™¿™bÈ3X¹SŠ/´W"uTõr4䆧 T* +‡ƒ4à¤É +ŠZ@JÙy˜þh7ì’5rP“lÜüãé¿c”„5Èz#³BƒK8mâÄÊlŠUì$©ç€‰7jpI˜¨ÍqZ=Yª30 ?k蹘›'mR,F¼ÅU\;ø®ÈBÚ3“°¯Nø™—êyŸ¤jð{«j +»“äw@æÑ0Ä'h‚>lÁ“ƒ)Aó2XÉË@Å]+ݨý0ÿþ8£…IP¤;?å/ªN°)±x8/çýé³Â$w(‹Ì¤ö4Œ‘¿ÆÙá™üSo 0à±LÃœ9,ãYˆp`¡<ö{³€øKU$WL5;~ &ÂѼÚÓØ9K¤s¿Ò¢êG}inkf(sŠ«Bg–ñQ¸Š’ E¾ãÂÞ˜š©w.¯ƒÎ$ý c~<ô§ZSZÙY»‚uj…"õÐîŸkª_áû_b·ÖŸÁ|ŸzÂ@~G&@´¿" o'3±^rHåì-¼üõƒ*]}t²ß|¬Éb&³64Á$+4æέ–Šxé̪³¼!pÚ§mxš·ææ?r:!cÆ1 _"qé‡òÿ]ÜŒxEnú4sÒ#&ãç]Ñ''$mÿ2;s¦f9¤‘­µem|¶ßºtŠÙýd^†òˆÚZd·Ël\£ãªý #¦¹V‡Úª…uOtߺòBôbª9[éèn¸îw*[F‚Ú'«´V½~ògTh)ÅÙ0¸WG=š‹6Áxº,a4Ž`¤Ïl^b3Ý4ViOÿ –õ–z@ë^ø¨!} Ïíæl•ma‘±ûLhj-'¿aÃI«Eáe™ì@¤¨–hc(‰Sòý?w;f‹^ Í•ÅÃíñÑïpGóóÎî‹ë4MP. „oo ÈúÉÄ.Œcá>‘ù+€ûÖc¤_·î«±ÅáøÇ0´çôßñx¬"¼§Ý +%šøh8ƘÍØSÉX²Rà„T3G#Ø_Ü)×ÛOÐÄB^h«˜†j:Á5"Þ3‰l¬®D£1ÒÂ4©¢v›fFÍ›©ï‡¿†¯êÞÚvÍ÷À¸ÚÙ¹ܽ‰w„†ú³;ìõüN7ÛäÏ0KÛ&Ú¯þ Yܼ²88~±ãºQt¹”áPQãL<¼â´B“‘‡_b»1í/ÁuTÔ°wzkim·§je3€¹‡(ÉuË‹_åäÙwÂz(8Ñ<£Ü•ýš(9*”8¯&ѫφËM41Úº©ˆ7ðÂltS‘ð€vcúçé꺄jƒš ݱ?ëÍÝÕ"†›Í¼ü黎TyvI ãâà¡Ì‚Ç ‹ÿb’¥#ºßq¡¦^<5;QæÕìâosò¿M⧢`Óò¥SQY,ãw÷,Ê™‡ìƒ?Q²âö²Æ¥ßÄ Ò ˜I×Ì|Úó»‡ÛM…l–ÀÇEu“DQ`Ã’V9;fžJQO)7ò„.º‡cÌß¾æ`Æ8ªÛÅmÐ|V‘²¾W‘‡§Qüg¢•ðâoùahùãcy¡ûprá+MÖåOÇ)æ-`–LƒY7#9x¤±âD«‡¥F­ÜO÷¹uù´¿‡†ZéÛ6œRc¼PùÍmƒÜY7èLpÖ­>ùSfÓRŽÚÒ5+h¶kr…xÈ,fsúÄ‹Y £"%*EqeåÖ½v8>¡Nuv×GZ–’í–Êù´åÁÑ ɉÜOð¥0ŒäyçA®¼wäiH.´W«¶6;”˜*Ëô|ëÛgTEåÓºUTÛ›)纸%y˜~È-ˆ¾?uµOÄtãz¦UÔI;aYï"ÔlTÌÖ‹Q W¶õ!Å$Pb{AŒwþèîÔÙŒN¡^ISµŽÙ·?4÷úMÎÄ3p,ÏO¸ÒGAz7€îõñ«û¿pc9uÓ¢¡2! 8DÑVÝßM.ƒJk äÄWe:ms’b~îÙšåÇ'ö¹ k°}E>µ_*È`7…~¡®›žˆû` _a¢rìY?¢|s=óY,­²9üQ¾à ¾˜-¢ñ:—HèìºtÑE£ `Ìë£ÙdÕ#„œñIÄé&cªkð¶ïdY‚ü‚ú,n4Tbˆ9HŸ÷_ÍA¸QŸArc_0ZÉŠa"Ëé÷ìkÌ»K\ì’èöØ´#å´‹vñ^ß;þ§‡7ÂkDºÇ•@0˜\ˆÓ{õ£îè¶+!>¤6ª ôê˜ ç¬Qd‚‡D:Ö8xlÉ]¼i}™H‡iŠlÎ*g¶²ØýbòÒkJ43.Õ“*•uúù¤˜ýÐMF‰üÕwgSa›åÁ-ªtÓ˜²®_ãΆQ"½'Ú@èÈpR~d¢£Ž©ª2]£ï‘„#fAZ¾Ôýxшð®{l Ñfòp㮓f…Í—6Lè¬Ç’ˆâ1uû6CˆÚ‹ºLº@~,¢±YeWÖ›Š¢¥ªP´Lœ€ðÛ º›}ؘ] ¦`´ŠÉ¨ÃpÒ(œÉáíNöžx]*µa7/é ¸Ôî&QáÐiz  lžX«ylèUépgfàƒKÑ"äe :ÉŒ·È?;¿Š]øaã| ‚DŒgT!ö÷!ÇÇ?„™(’r úë‚:s­]pÖJÆ_-kÇLVmšRº´öÀØ90ÙF1ɇï2’㨵~™`[p§ á»àÌïÌt6© ûÏ8—FÐíä˜AM}6˜Öéi—‡‚´]˜ý»£#âœó‡½Û¶÷ü"é+úrŠ!¸ÉÉZáÛÚäÃßc¥\—‚ðy¾f¦rFôIÊK¤m ¦zÐ,f.y(7½Ö“×HÉ$À>JСg@ÂÔ¢ïU‚*ðŒ¸"n,AÊì|®ó«¾x]+üèãq\Š½ƒXa8U…6`›Uiï”.ý¶kÔC.¨|!èæ¤Ú7¿úŒ1Q"çÁ€XÐQr3 +±~¸\ÚÐR¨…g, wQàc0›OyMlGŠU™AAÅb ìŽÒûMsm€žà¨'qH»~B®v#Še¡˜’¹ˆÀ€[­ oòþÿŒÄ§ÆêI=Î6ì…ü^²öøVz§”òÇÄؼ. %µ5Ù…BB}3¯rÙ6¶Ë)¤ûó>·òqŠÎ˜´»á;‘!AZÎR}IÕýñQhº Ü!„.>ÈÁDÐÌm‹W3ä¬Z€Ùz¼æšÒѲ{þý ÅÒÁ²ìá«ÍULœp™^·tûžØ€†ɤo‹ï²U*çðs‚š)Œ,©ÖuP抪›3@–¹l`G'\ýyù«ÙøD-€ü&(‚Uöèž”d´[e—Õÿ¥<È}ÄŠ)) Їó<äB*®;ö£ Õ{w6ùvý–¦]ɪ«ìØ®¥6ÎmÀ‡% °LH³ÈU ìbìû®‹ÞäRû3cg¾}Ù$öLÖèŠ&ü)/=í†C$OÁQ•Ø溤̋¸ ™¨(2?Á¯wIÈù‘ÛßàÑy°¡ÜìUE±laŒš~ÄaÖK .8Dˆ‚ªÁ Ðu&ÔZÚtÄZÆ9#{x¥âv,v>XVLª’DOw€®M“0¶þ½Ùè@ì…€†ú<%y¬×—-FüÔIý àn¿( x¥úfÿr$ßÎó|òÛŒû¼gTÏNQ:“ ÑŽ¤j_ßâïB0Â×ÁÀ+ò@÷)ôTT~JÜ/‚QçuS› ²…—4Ež¼þqÈ-MÂð¦ð’?.ÆEzøª€}Tµ˜ÚÆèJF qúût\öfüšö'U—¢(·op¥éêîâÉ=…<÷TNïØ­EËÊöó¶÷>¥t… Æ~ÅM `O°ÛÉE  +Õ‚S›1I¸€^ 2è\÷»Ã[±G¶×Á‡I0A#µY(Åw± «÷¾Î;ÏÜ[žÌCV9ÚÌ¥_v9õ÷,Â3“ ysGßpÕ½~|îQÁlV€œvÙ¨3ä#š—3|F’oõÕ%,”BÒá¬ÿÀ—ÁŒ¥8áÇ”&aÛÔŠ‘'Zhcgà ÛfPÌHÜŒTPØ×£Ù°´|Ýe’=×!Ò€\¤£aÛ$›¨‰¬Ë”€¯Mª3ÈÒlq†!dÓÅÏ9 ?ÃNXøx=z‰¨ºæQÀHAm*¨Šf¾qÒ Et/Ð<}–ãä„ÉóîÞF—h`Õ}4¸[Œ¶¯ÒXøú˜yE½ˆëZq)ge §³P9üú#‰bÑ…ëŽ0xÉÍÄ%ø×Ç07-•ŒHktÓùWa. +¦ OÊ­zÝ ÃopmC™™Ù\žÔöy +lýñ¯°GüŽX?1g¸htœ\6ÒOÑ¿>‘õsñ¸õØý÷JÆWˆúYXÆqtùsz\ ÊîŒ%†ÙöªŒ+7e¤`¼i%#"j²*“ÿœëö§Àg‚·OJÚRŸñïG‹´5"ŠX‹‡hŠmÊù›ù娄Â,S2,=±¾øñúz±­ V£úÊSbl‘j8d_ü”6lô\®‹1’£>~K??K•iÎð=üB4ŽMðì$sµ2X+ 8Ë<×yZZì½’Û_  +ù>ºÔ,¼`ÍnÙ‰Šü¤ªøìÎQ0Ìÿ%—}|˜¯¤þ-è  »˜#ݨay+$|?ºð’¬sö„ñx cáiÿ"#š|Û¸á›Oa…­IÝ+{B÷áÞñùEðb1KɘųU<À29©=A¢™6í ÷Þ 3ͪ‡@8?Á¥ù©æ×:P´‘uDhϧÿ0@S‡F‚z=az«½²Xxªµq[S+¼0úcš”› Ôœ–½*TC[à˜µ“šß[ß×ÌFö {úâåHꙊm1Vˆ¹…!Ýl’ŸÂ\Æ¥ç)V2¹`r¶„ãð¡ù9w‚ –þ–Ïør(¿M¸¦ty¥É\ƒeÂô1QŒ¼ò;d£DÂíÝ‘94ªÆÛš²œþH¯mÁÃ×Ùq@˜1*õí¿*>Ö9o¸)n>Y^´ K…¼šËúCWí££¦ßÕÌ3²¤ÍË ht$^2\ Á6Lu]ç}úOŸ ¤%1êãˆè¢Í¶<†êÚQãLðfÅú‘±óOÊŸÝ2ÿ=Iıäö¡^÷6×€—Õ.ÁÅ4Bâ-Þ¦ËJ6l=÷Ñ?dGåì˜2¦FÓ÷²û4`Mß™iœ)¸¸}¯ø»ö¿ûFÚê°Ü6’þürÈpC 9Íb”‚ìš Ž’ùünÎQ¥+- üI +ø¹÷)º’s¦Þf8Oco¼n´Ñæ‘ë…Žb“(Ήr¶7WMÁѼ©zémç¹]S`–2^`÷ ¢Ï¯Áœê¯”õß䦓_¸- ÑfJÍØÆ€B.çû=1—Lfc[·§ó.À‹ï¶[ÊUÝ6X9¡q˜°ƒ{ý2‡pž»Rõ:0ñSI9+œ&HÇW´á¼c|V_#ÅÊ­”­ +˜#J†m¯—&»+ÄN²Ä^³Jt.Ã_7‘´§ÈgÞD‰À[]¨˜6•ÿÌú}îoÉçÌëk#ð]%>òuB_zŒ'´ãÔŸÐ'VËÜSÿr¶ŒdΣm¡Û1+ª}Âj¤ÊV¹¼E‡óèíÇǢ÷ɇN/5ïç{²H&èÕë˜ïö â£F|òÓYMxþÐkúõÌË8/AoQ&*`ÂYrýkQ5Û`ý´zä‰ 6ƒLûßC']¨fŸ‡†\¯1ëJÀ11–?•jŽ¯˜% Z5‚§gˆO},Ó)ÍËhÎ[ä`ï»:nH‘±R+ŒáááŒñgMa+žóËsKšwesx{£ÞÉ\¼Hª_·aÀ³`%•Ï±(|Ý÷ÿ´Y`†ÊB¤j´KÚ»9FàÇcëAæ{Ç8V5ÂxYm*QJ HYfƒ1”ÓÆ¿ñæB€. žÂJŸ‚¸ÍÉ1Š0»ÿ[Ã`U¬B±4C"ü­bT1ÄìùPÀ®ƒã‰ \?cÍ|s169bˆÉªn*&sYÂÿ¾B šïŸ9ŸúpŒ§¡ÚváûbóeÉÇJܽ³á* Œ½u®Ž*,;rU®L^v¬›½Î’ÚÁÝ¿ÊÀ;Z¹õ1·ž(>Ž–tƒMÂíÍ »šÀÝÈÀq2³[q(O½ƒÎ¶¨É9@O•”­2PÌ|ùäƒOH ¥Åߦå^Ñc›Ši–:BªÜ³™–^Vòýî/"©Øæê4ÆT%ôâ%ÅUg¾D£žU…¼:%ì½Mow}¯ºÇ烼,¨Æ³Ï†U¡ºþ½áKuõû}ÕÕ”“â§9Odƒ¨ó3YtØ +3¾ øƒöËö I + RñZ24Û¤HÔµ£ºŠ­ËP rÕ3C8AÚ—ßWÌC&Æ¢ÑÏñ;l–óœúÔ} DZz ÙB7B?çè¬]mwíÜná ðdJÛçÅ +«6z#lû¤Ò“Ì?-ÀÖn" FÀ1'0Í+ì`z<®ÇÔý€tH l,·ø”wb˜çP“̃ªg+’y¾Lˆç­wEÍsHetsY@cöK¾rAT(©æËB_C& LlãÁ‹†§¿œH'Ê‘óNاùÔ¿mAŠ$6ŸiËUç’Ú!ýÔÎ1ô/°ƒ¾Ü—Ò4ÅIù"¾Ã‡áÒY¨³áÞÄ:_îñ£ò]¡é›Õ½Oú©ÓD(NwS?*wÁ“×+äàæÒíÜu¹qPáЦ„‡ð,é÷œÉ­øÉm!Ù+¨È|H%qö8X^ Y™¬".-7²ñY¨0V~ua-o„Zmeg²’TæöÒ˜z–á\‰g–i/jѨ,Dõà@U¯ WY2WÞ,8;HÎùôö‘vÙrN=ïfîòÛ ù©t+ €‚Û{¤Âô4kD¶of˦ÜSLÚ‰:,*˜ +Êr€ß3¬0 éçX-倷ðýŒf‚ Yo⧳µèO^dé8|ÑaúÜ´d– “7¸Ýž¡·¡÷zÃñrôÍ[3›~†AÊóA÷ÉŽ"h|õÖÔùÆUgDo:EõÙÍ_Òj‘©òtfäiØ]oÂ_–"wú1tÈ,ª÷ô rPeƒç=ó.|ohd}D$Éõú V·Fµã¾mL£À|‰Êã–ø[ÁpÂaõrÖz|0Uoo19†p¯ë±vðXð'¡ÂïSà é Ö;[nﺸPH^ò`ЈßǼh¬¨_KŸ²ÈâUϘöåhk»Z!RíÿQÉV½é î0ÂkDÝT7Áñï ]G%ÈšqãV3»®ºLÊßò T•bsS EøOÞŶ/ˆ³|ÍÈÇ,œ_èÃdßìxÏq†lÖ#ú1àJ¹é‘ÀäiŽC “UŸg\¾í¾¦R/Ên;[ÜA¿YN_¨'…Bó:1cëȦt)oÔ*wµÑU _¸LamIàD‹_9h1…šSŒ4ψõÖÉÔź,.Ç@'Ñ[N…÷Ú{dñ˜k†žŠïë¿Žór ~þóõD_÷üÎï€Ü@—¯ÌdÝ¡5JâNòŠ¤‹wôK«OvÝî^aPè|¡;ñ_ŸºÄçà*)V.ú¼}T%Y324IYº®‡¿îØ8=x†þwý{VÇ)u&;m%ç×»è4±~MnBLJ_va&Ì,@:VþÃ`û|;=ƒ§åpªö'¢"H^*ˆÔ+ÍQ|ò)”r—Û7\kÎ4JÀ³û-ÌÇÜá–·à Á%±=‡K Y»I®ˆ[ç•'(óú¬ÁþÒWÒ)aøѾ›#@¯>$ `LNæò yR°›Æ=‘ƒÛ`Œcr[-/š \e(øj4GN5­)êµ€ ³!ð<燬û¼Á¾Ê«9¶‹|Þ–ö6Òä£"ÆäàÆU&®šÀ\õ‰ü·t 'e{v…Y"7<1»É_¿‡€pº:}.kV¤‡¯_<`a¸µYÁ©x_—S`"þ综fÊNïìþ´‡·ú ëW8È ³É+,Þä1)œûv±mæG*nÇ,Á®Èn?91•,ôH* ›jëÐî¬2GÚû` +ÆÇgœ:!mÝÙP˜_á[(÷wü›[F—ïd„SÅE <;Â"ûåx[Xƒ@ÙÐ;ÎU¾L&Ý.Þ‡U¤^¾æFâV9Ÿæ\FrÿdX(ˆ*d–HÿP²"% + GªoN%Õ´sÏT:!õèÓ÷adÃ!˜Ã aàš3ì/V:_Nã‘ð+wÿ¹ÇØkWAŒ3½î!²N®ÌãÇÖ;aª„F"zò â¯ë"B40ÅâàÊ¿ý æmÌ°˜`‰f\³¯É»Ð¨¦›opS«>¸—b–è³0aƒ86M„¼¼!ñuøÑ•Aö»u…⥿™Äg¹Æê=Ø6UþG\ò¶¤›ïY/¡ç˜>Þó³ïW¢€:mÜù•ˆŸÄà¾Ô×”Žr7é›1ŠÇË ’¦Øû©‘Ç›BK™³šYœ‡w«×f]È;ÑŠ'3+´h¨{¶¯í×FÀâKí‹ÓyU”äi2.Ò£³›|½Ó­ é4~Û—e¤«AØ äÿÊ:‚¶~83œ@ .rƒåï¶ôUËz7WŽ#°$%ûÍΤP²Zù:‘T:x;1êTì&MÑx½Ll{AµñƒmÌ-\ÝZ­Àrƒe]œÝöSàýë,ÞZ%H¿ûílì, +P+fñµ—tßKBã…÷ßÜ ±¾û\ ;^~’œfö§uRŒ­Úú~þtĈ:$.&ÐQ²}±œÁýfE>€PGð!¦ù©Ëi¢JÆ’a6o-™–_$z¥Õ°tŽ|²Ú¸V-V«¾(¦­‚¤ +IÜ!C?q²ˆ´¡AX÷Iàü•i^¿–Âo¤›ú˜m`$O.cø Ð,€Ø¯¾ÊçÞ@è ‹T Ý×úþ +&n½ˆÔb”ò†Äoù29â: ûTF2€ +݃g¾[ÇÓ“×ØŒAOuÿYÁ|UNÁ>•°|?&Uø}J ™ô +M´ ®„&{0ªÞÎ`¶öYøcêZX˪Ɋ-Ê~=ÇÝ+þ l¥šÛ+Kåå`YÐÞõé#}©ðà‚Š—’ÊÝ +Ri}¸ÙÈ–AMOmÇ5Õz¦q8á6¨î§ZÓÑ@Z*zäc®ê¸ï­%ìl*4“ìpˉÛúßÊæì„R¯²ÚõðØÍqWp—J*ø5Ï÷Ÿšî+ÜY@ò… ½`µ‰<6¦“:w ›Èõ˜üT׫\›ÅžÌøn¢ïPD«]¤qIMÙDZ¤µ hØÑBn÷mz-µVö^+ŠÈn©«j«@z††HS°hú~ä0©æ! ÷E±»x¬4Píèg_æcæu‹çg‡Í®¸®ñà áÎQ°¸ÂËYÓžÿ—ju¤eœºÂ£“o?!âDóœ +äÖ]Ì÷ù31ѪB'’Wÿÿ "‹jGn‘½µ`ïçíû·¬jla5jöj¥ÿ0y«ã¼uHŠCþ”“þŽWfËÁî)Ž–‚Âæåbˆn´iL'oã+ éBáYUO†ÊÒb!X)T¾|"Óüì½,YPá~#ÄÍ&üÄÖ³oPTÀK¹·1ªºêm­•hÍ#3“¤Äd‰×šNýe…‡úCoÂ¥šbÈ—zŸˆ_±WE‡ Ó1ÕfB±G—†BtŒ]"œÎÐçÝÓ I­U噋èÿ“1uvÅP%¹÷Zöºúmâšþ\—x^Ma«¦ÜE£í?ïŸ6 ~ÙÆ”¾ˆ Wë½í2Çøa¿R`Fq²§ì14>Eü•ô÷‚{zö3´¤ÄÒMdìদW ó]ZÛ†_æ}£'˜¸†èr†Ÿ1MuÝ7Ôܳ“-åña4â`ݽï®×œ~¬?µ[ÚCG“ˆsùfº,\¤{Û!LUrú–÷—'¸ªŒ>€W†È3†êmÿ:0ÁŒ',ð.;\–÷B'ñö&ç®BOQø„9 +æù…ÐϦÏÖãÖ¬/ÍB±ü¿ôÇ]•Gú/˜òôÊJ*g<Ì«Aœ[Q"¨T~U?™ÿ!à ï¨w¬Hô2²MfP5+ ò1oÊÓ\HtŸ’ÝQ*–­Jdà¹EÕÒô=ÂãÞ× E7\ס‚@aãt´ãÛõÄh|]AšÇFÏðøU~@z–˜)®YÈMK„ÚïA²ÒhOS¿,Ç‘–+<+÷ì€P?E`Æeï+^K<…ÕÍÔ9Iࣽ³«ÅŲ gµŸ\yˆÑ-Žüwœ¢ñÝXȬ§ùU)w˜¥®*³.ýùù°Ìhðl=¶Ý@1+Ez6"ÃTK 1Á/Ú˜Ü9Id{] +´í` +47öµj¶otk£—jo¯VA˜drêLqøÉQÔ«ô¤ž@˜ˆÂy—Ì3Žƒk‘£«ªxžáo5ËÕÆee¢}ËK‰Ýi¦yžã*¢?ï‘›óÝ 'Æb¹]{Å3#ù‡#ÍË®Öçj˜ÂàÅGÏnÒ£Ãnlxò,ÃÔåǬd`ºu¶ªÑjS½éfð3²íÃîû(ñââ;U¬gÏJ´ô€:þª»¾b<2AÅ1Å;ÙûPmm—•ð‘º¢T5CI;£$ +›µ8 7à|­ÈLóL˨ˆu±"û„5ÎSÚÒ¦3,dÔ‘8æ)š‰i”4ÛRä5.(B_†ò´­5Ùôì¯ÙV7P*WX+1Y‘jF„Ï@8×»‡ØDhõ† VµÇÕ•‘¶¸9óC‘°‡:Éפ”¯=ÀšS”ÔŽ§?‡ôVùªIÚ]÷€=qjPëìŒæßÓÝî5°d­¦™C%%’%^•3Þ¢« Ofí›oGz>ÕyÂ@ŸwÙ=SiMŠ ý>¹áS„ý€KŠðæ2¶ÁŸ¤¿–Áˆkoã +mDE·vÝ­aɾ6gâL‰ŒÍT½^†3©‡ë ¥øÔìÄ°3Æu¸¿¥¢ä°0,²Ž;À?sƒN®‹Ï¼Š%àÅó&Œ­²?û)x»V"Ùzè’Ù~ÕžF*°®ü¯`Ò +^QhTÌ;–Q¶Èàä8Þ{Úãô8Ý s-6õº&PCÉCªMèÔëx4¸¿3´°ÀøxÕ £îj·eH߉d³™¡#†iHU£7ñ~°±.ýÏÝøn·a‰¡Ýu}ægdÔÍ& iìè›R(×؃ýW> %T²Q¾[ÁQn¯‡¬ÜBÃhvIC%ÆÇPãMÄ€€»mýбáª(M@¿úO˜ÿsLaí¢â¤à“;!=r[Œõd®^‹lW‚ǕムΪég ሶØU~´|L¸>‡²«ÄY ‡û•|gÉAd˜\À|c¤3ƒjw×…P3Àá¦UîrÖÖcºj°­ÃYÎñëRƒ-˜qÙ‰I§µÊË(˜U<ÃvdC˜ïà›¿÷ÍÁZÁܨl` h…hÓ‹ãɶ®’%«åï·[ê¤Ýg ¨¿m³`rÕ¯]­«d5_röK•@Ž + ç’âvD'Uq§ºÖÖÒˆ_ßlbp?Ÿøö„ËVW‹TŸ±¶AÐ ·-—÷;4ó&|;çÔô«-bÐß„ò =+Ú¢¢>Õ=5õ?Ô¯›æ¢îÒçÝ ¬†C*ñÞ¡¦Ã;i¿©9;Ù8no²Ì2daêX¢ÇÍD2Òí†ØØCw>â–ªýÑ4B~¼LáDfAøþä(> ÂF–ÇUh“†Ù2¬ŽÎÍ#3FÔYO!4•É¼˜âíØýùÑP¨ÒÆg}ÿI¿_o?—nOópü4ËîìîÐ4d¼,ã¯ð<ÁÇúÎqó¨ꎡ.Ògvëm[Ÿéû!늻H€µ’´0Ý c§¿ÙTÓ«©Iߘð'-°2®ÞõœÌíŠa?ª°¥%=¸“ÞH©$˜CÖ¡Û¶x¤ +Ö#`ï°sÍFñ9ôS#~tœw‚ìÛÔgüÎÓ ôúlS‰‘ µ?Eµ×ä{ ô3²a –­Ù¶ïoˆ¯ãc/­Ÿý¡pkáˆT&Öa%·©ð'Óöz´‚€ƒû¬q=ï³Ï¢ÅÓ÷]:¾š·…‡o"»û“xb! gNÍŒ„ôuQR^ÛØpjNc“kÄ/@9Ç 9¦êï{çë¾²3weµ÷ìóô}¯t$œ“Ü›/©9¢ÆkcÝà=æä§ÞäÏóéÚìO%Ñd÷¢À>?'¯äŠxzpž-·ÌšÁ°âhÿÀ|üÔÈí>yöMõeÒNáG›Ï³#ò$‚Ô£Û ý„žê¡Dîò¼›Á‚n*ˆµ«ÂgC8³NnåáÛ>¶'*õÏGÑœ’¢EÇÕ=7¥Û‘ofG9'gRüÒTY9’öƒÍcI­ ÛSØ# 1]Ó©yª_éáöê8‘ MÙHwfÐïÔš‚½;ätBfØ”jŒH?½¢YŒ Vä +"Á›ÜÓŠ{öM1B£æ–/~^VÄ3·k­™v,æB‰“uOsSñAg"Êp»‚}By¹š®¨BlßvÈv/_ Fµe/ÀçõïôÛ ¸Á9„ÆTË?Ó/éQ©1ë$0ñT´¢—« ÕÉÄ5Ó¸GžŒ²ª6Ò;jÌZ+¸ìÝÝ$+—¬>ò#»LÇð[êÛ0¼ŠŒy—0oYénï ~·V½1á ´‡qd§¡Í¾œzÕ+zÁˆ²ê§‡»¥L¼qhQâô|ã-.`ŽEô,¦Þ’zW/HÛeò^Ù?Ƀúogh¶E3ûJí×›‹xeoǶ!¥“ûŒ’:âï@E“ôprmÄzILò›XàÄK´dÄ}Ç. ¹pn¡ËÛ¯©rpÞ¹…Cjj}ÞQà;ëÇq+j`J¾#µâÛ–Y9jmZJbuÿ&Y4=‚À§‚lÈLÑD^g °Å-'–Û±8ˆö¬‘3wöH_ÜJ@«!Ìž àˆW€âïXi²o:¬t](Ùp,¹ò<b š^rö#*¹E%8—½uË© oþ©^Sp-<­\ñ¡;ÆíB©•P¾j­'³‰G×­M+´x×KSñFvÕ \…Ù µ‰ŒUo n¸Ò*ºŠ'”— 6`³kîؾ +Ͳ®‘’}RâCàlýÒˆ¿4û áŽoªÇ‡KHŸd‡®¤ëŸ·€Ú9‡]ØO4|ëdðœ”,Ó-jpCÒœ„Û¯<9M,âìi5qšãÈËF§b€$X=’™1ý¶|b®Ž>rÂÞÀ~Nó„)q“ªJJNò#šÍÈñªî¦GÎsƒž%Ó•žÈ®'©@*†l6`A§¿Âc{?Œâ¿y[biIòRõþAµÔ*O6µÌNcY*A drç.•Ì»…-¹iq¸ëÅór’ 16ð ¶:ˆõL”Óß`’¼æ²~Ëá©6q™ïHŒæ·•Á²Õë¤Ö=ÑWÒÊ1tlÂìjøœ!Á¿ä•!-‘©«¹t_Àiñu—3p>«:<23ÓµUœXâGBéè=çç‚|\³îâÅVs¶dœp/$ûzðlQÉ:d{†“’ðg‘×Hÿ…Èxr  .¤êÁ˜{¬L ¬$§êñK+ÇW¯¥ð*j²ñ _°¤ç}^F£w.«L¶ÆϘ¸Á/ÀÀ]œD2ºL°9)g‘a += Ö—¬<(NÆúݯ_FŽ5ÂÒÁ‰¢Ñ–Æ"ÃÚØQQ£pèŸå¼`¸M™°fMÞ-3Kð+QD +>èåÁTyDZ±/[…Ëë0TMïá7RïõÖɳšîŠŸGo~˜í:L²Ñá¿}.¯gYzIbY‚¯¢Ï”ùA‘έ¢T¿š °úôy UBBô¡˜“Ïÿ7Ê6"×°Ò.üá«17=£Â jzßšiÏâk©¸*Š«"ÔÅYHÝ+8_ +üŸ`^l¶S"˜oã˜:ÙŽq±¥ÓN¼ÑêŸê<ÖÕ!vÂgõ»TæèFgú1}ZÆ?¯ …½7qbmŽù<„ÿú“U¦Žïî6Ó„¨nÈ´E‘¹G,×™,.‘¾Íàí¼®OÓjèòTŠ^ì~…¦\;aÖ*Sý%–´îo´ÜúþîäÄ-·ÁùJÿÄ(fÄ`z¨O¤*íÄS'édòÛJÉÅlE„ŠPLÇ¡r§ùW=#‚ ™\° +[i´‚ÓÀQ,¡Ž(Íúm]²FËGø²FÃÐ9Ãÿr‘:`­œ£y\Ì5Õ s£mò—8Fæ]‡†ëêü‹’ŽãùýÖ›,SÏø0a#v³I"½[Öæ]N(åà9vä²Q›Füßý7‰•ú‚PûÙ† Žim' ºd‹Fq53S4 +ü±©¦‚½.Ôý' êE¹]·|» `æŸùé¤Ýð<4-»UÒÉ!ñ³iZçÎjDSÀšùjˆTvãî•/'…æõS̽"¦ ñ”¶¿1-oEx™eS»¼Æüê£$F 1µAatÝ 2³9pÚîy*Ø3êÐL¿AÖ}SÝL\ëA“å¸_=pãs*@‚Q«¸>Æ¿Ù—û}Åå³ ÑÖ€hyYàî`¶y¯ˆ+§´˜g;õêÙ.¾’ÜTY’$¾~‹êIz' ¹§ÇÑ*çGÙ™ƒb¢`jŸš EÒ?Ÿ ÞÆ]•‰d’ïœmû@Áá ƒeÎ#Xò«îåm×7S3µïÞµãBJFáHH$ +Í,6ºÿ‰HP#¶¿×‹ô†€è¾c¿Nþì+4lÏ^g?gp]ªóôt"bÛ†{ömpy®rv‹]êÂ*)Ò'úÝ%s}Oz ß®•ŽçJò“8ñ±8€«ï‡y’£  Ì_ñ»»µlGµ›q*gÑŽ=6kÍõƒç:™€ngZb…ôÊC¡›ŽÈÏ,êÑEÅ¡V²QTÓÿŸÓ%Ú2pŽIç›èRåä'­ŒB} ²û×ç~\ø¿ØÑËУÝx!Wèxe 8À}íÓš¬ñß,™V@ºúa»@ ;¬ï–7ãHb›†-”ûPY_z—Y¬ŒP³FÿUO-Å÷Ñ%52–.mº9Xã¤`RžâôÔ‰÷åWFzG`orrÉ«UErñ®Éãø†|ñì5Ï·nËEÃ:}µªH`sù¾I2fŸÈG“V~4àŽ­àG5Îç—ê¾¾õfáVØ%Ó®am[¥Ê1Æ6ç=¨’l²Æ¼#’Y‰ëªöºrÎ^°’ñ¼ˆƒÔÐ…iWr÷åçNLP‹ú[Gò)0­Hu~)6èýý”»¢<µŒ¥B< •m[ûœ lYY®ú!Å.÷«JPN÷Ê´öÉU £Ã½PÅ{·B§ÖÇPp¿yyn*’W£:ꤸ èÍ™œOtV¢Á»xê™RÈí¨—B€ÿ·¿ÞjHî%êgž˜%õKˆí%Ç?.­2ø5¹ÎšB):t¼ÂnËú +î|uF ù ¥éEð—O×vÓ(¯t"ÛM)_ø‚ïhùÜ ˜’×𙇪ç~fPOîå0H5”ÏB7$,ËøèÌGNbàÓÎgÞRŒ ŠÞBRƒ‰óI×±i"ŠB€¦½ë‘éQ¶¶,Q)«9“L‚¹] +ð“®â£õjò*IÑT‡|S;JÆ0a¹p®ÓJ}V© uü+þÚ*º¤®ø ÔZ]î/˜þúTæ%8ö7ª]mf†ÈÿSÒPVj²]{ƒ’_"Œ‡@l*ýhDaÂòT'áf×CÜÃ'T®±î¯^ ×‘=¢ŠôwêgSk î›¿ÒÑ3ÏF`»ÊIÜã‹Š§nÑïs¹J—ƒQ…JZ{7mòý»èÀ–,ê&K½ +endstream +endobj + +%QDF: ignore_newline +22 0 obj +146576 +endobj + +xref +0 23 +0000000000 65535 f +0000000025 00000 n +0000000097 00000 n +0000000221 00000 n +0000003486 00000 n +0000003507 00000 n +0000003589 00000 n +0000003741 00000 n +0000003793 00000 n +0000004252 00000 n +0000004272 00000 n +0000004336 00000 n +0000004534 00000 n +0000004570 00000 n +0000004884 00000 n +0000004904 00000 n +0000006922 00000 n +0000006965 00000 n +0000007208 00000 n +0000009576 00000 n +0000009598 00000 n +0000009682 00000 n +0000156384 00000 n +trailer << + /Info 2 0 R + /Root 1 0 R + /Size 23 + /ID [<31415926535897932384626433832795>] +>> +startxref +156408 +%%EOF diff --git a/examples/qtest/mod-info/files/3.qdf b/examples/qtest/mod-info/files/3.qdf new file mode 100644 index 0000000000000000000000000000000000000000..ff82f567a2a60694189af34b7880450513302c52 GIT binary patch literal 6245 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 literal 0 HcmV?d00001 diff --git a/examples/qtest/mod-info/files/no-info.pdf b/examples/qtest/mod-info/files/no-info.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0518044399731cdc736e7dc84d6e77ce372255af GIT binary patch literal 5790 zcmeHLe{2)i9XCZysey$BAqE}n(Ji>p*!RPC7u&U+)=mN$F-e@X1PCMDevDBDGz=D1Wts|IrvLVRa%B$&ocyuNM*3QUdde z)P+Sv!5d;r-6SFwqm_tdI7HD-vvL22a&C^iRgNM#F0YSunLPfDwUWqE^A}01(NTpb%B%Xr-4C1c9P>hIb3D2+4@NyOhGEQJSME zObHzA_p(klN<|}4mWqlT%Tq2^AO#Ndr6euTQ8(#dr9-Z2yrLOsk=EkkikeERZh-00 z5Y~8+*LXx{tg7W(unImiOl;^(VnhUCI3~B`xQ_y8vMW?dF%7myRK|D>mt#Q|VNN}A zau6Um(W12?hRxWaU_Ne5KPxmhH{<5!aKv)gQ)i|mE!eqk+oZZ5t{|h$qfSt0PL*hpq$WfLQ_#`#@wJHCj)XCqLFlfh43k*%`b?{5Edo= z6UJ+K1y(cn9>%JiQUm})cU(}8$x3~a7jWjao7W8n{Q4<912F z;Y9&Nvn+BMtF1E0rK4fG_qNU%aSM3J2oD3^#p@ToM>Ap451xlR0;}Un z)7mD>gaS+Ry9G6Q&d?SAKbjcG1i7ld7M{0xd)>6AwGTIwyU6~ZEUWA6d2h<>gZnO5 z_wPCt+TOIU?0k8})V}ktKY#Co3uluR^BnU+E52OSuSE~v+j;HHgZrKPpL=@h&(EED z`P7-o1MmNF^YFRKpPo*8d#dOE`GZSCLkaGgKfV7^e`N3K-etT0a{c;s<X{aul{YzGu_L#&!~Into`h3zdC!0E!?nY%5L&fea(j7RPScAU0W-b zKlSLWZ6}Hzo3?ZEcjr9u?ms4MOxAp?EP8docieg8`00V=n=V!NYRr8vZMs;}t7t99 zrms#ibu&X3f6znx)zNT#&t|!J-FHZO=Zd057oVKrygBczm6L^JY{K`)amCbNiTk_f2= zCg%oP!{$2cF>+FHLBWw5ar=YX{I~WU?VB0@#n8~{^z@Yvd}-^Pht^T|brn2rTXFY` zy_;UJ?3uRT*S%v-s|R+x^v%LS*WTY$0Lk|^-M5IaW#kIdh#`=X4$C&k==A-sM?&IP1&P6^_Ha} zH?=_yir^M0;j;}N?z16D^x2lNAu^N<;#O&KmxAlNmNp1oZGv00mHDmSG9FH2Y)|t^ zd(_C{D#EJZyFVDNuDrj@Kh^3@d(!b_9L@-oj>i(JC+)Ktb3D-2y9paIM6@=atua)K zG+BZr43OI&Ze)ah*3`%@?>U3c=Op>H7)5Oh>ng9M~BlP zD=h@&cDo6ZCTQ9Y5_YvSq48;ZLj5WzG%S%Cv(pl)!!XJr$ZDL`e_Bd01zzsL7vv;hWdJ z^PU02L!nOwA|BT%rptNCWg!JwN2@9y314?a4_?k?XDG(4hc9L4X&_5PPFcw)smI?ix9e|opjt>0 zx2$7G=%!}p-7ZBKeUL|WZW7r%4R7W(;!ggKD;X2I<8Y0`H6{ecBs?Bn<8X}$fiVe> zN7v^IF1Xg2mqECq`fMF=)yuo9X6k{+X;w<1T8TIo3W_LdR!@!kZMKSOG)T%#LUl=h Z^eSs^Wz(o;I-x{$XG)h8$Bh&({|o&LyafON literal 0 HcmV?d00001 diff --git a/examples/qtest/mod-info/files/source1.pdf b/examples/qtest/mod-info/files/source1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..86cc34771f555a94264492fcaeb598b76ca60bd8 GIT binary patch literal 5932 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

}bWiMR+dWi1~UbCYI&GxWSn&8CWlj=Vbk1 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 nU}%NS7azRiZeQ-k z)+;ix^H-^mUi%awH-RHk=i!#C&>_Z>#=Qht!AoePDbg)BP1#WN$qxBc!Qy65&6jfA zetIE$yS4S%;>%u_t@lsGcg^qO1kdvE6-A+6@XQ6#8}P(1W&_V6&x-pi<6?U(Pf+PZ z$@Z!++xB*-#k*;|FiQ(O{+iZGbK`gN=#*t7=@A^e!=sU93S|sbPj|cqKK#IK3bgdv zBL^~dUr2T-9OlG@E(OSUWG_@L?cn6%{zh*|pR8D{gj^z3eO{+W*|S*c&omLv`AtO> z>u|;Bv|usob`S5^s@xLtX$kgjMQ_%4y*QOvn@*H%he179>D4%W^3zOw11d*|DFE`U z;^_As68EJ>3R|xw1tQViUGULsfTy!`9sJZKZlQ**OqR z9TRqPuJR#iMDW%eRadHYJvzbd@g9Y6N+|zdu>|k^`l_d>-74%C%grilN;F2JVULI? zxELKWVHiCOs{9ynw^LW@O5n6K`ISu_N$$5b)C-x zdK*Gg`i<%T519O9c-ef}?rew;L@vDT5~~sFHnufGOo1n7ZFbG4N}IJs?Bs;U z@rUza(vqj(?HP6Rwpb`kU)u>i8`t2!y6&lCuQy47P{#e$HND>j?=~K)yvF>z=WZLz z3tl}FL(W>iUnk8RnepM}_(b?;oSfzk!c%m%or8tJgQi`md+i~Ar}~%vm6!;k!qPpW zZ$}(hH2fZaV;buPf%^RUGIT&z=ZVQ_t)sGjEY3jYt@QUcr|be=JyZk$;DQSkC&S2L zgni;`;9Nu}Y_0zd?fb|}NJ|!9An!`mJ~pHu80>#M_DT8#D5iTJivxt!FQ>-hc&@JK z;pPoms78p%8rU_{{&49|rt-s#`i7me3U`6+0?!Paekr8RCysFp#k@OLE{1E**0*R@ z$+X#tM@m#zX&==}Nj~HT`cX>KAubD}X+iMCh5MM#d-nBegwbGiBnZ1_YZb2QpO&5{ z`r=?zaAFrN>Fk9LRw6trz2&`o;hlRe^uC{8r>A1ySHlrYANt`CEEsD(&v0G~t~jXY zCt+=4BehXN58>jCg9WmJ8YnoGh7aft1?0qjq{313@%cdlBA6y|D6pY641~xTRyDUH zh&i`MhB3w(!XE+P4pDk0A0@6b--&H#Q`C`G1E~*H+d*Vhu__d&!Hk;#ae942K8s>XpW;<&2iPxg`Hp!6B zUZ9!wh`m*ODamIAU{9)>qUy-+w>q8Wn7npBu8`Gg^%sP@oW+d=LMha-(#3Ckx|WtM zDe4gD{nucB^BTmv>&gzz3k8^9woCfvLz5n%=SxRJexR5DG5N<=TT`UE2ib5HT@0=4 z6z)Mq5E(1P{5sVehI>HxVKe2)$FpIc?=1+8M(f%cBJpS)u=9m9JLt!xnS!l8hiDp_ z@$V9GuOD+W&^#LPPrgK~E5`Yy(OgLjzi8#JEEZ$trKkwy2}WYPpfs=h4g`wRJpZblF;&ZydMN7MiLk1sPnYNZ1`o2g zdo%e4zGT=dfu#u(D_GCQ`tO8{nUOx=T|{%md!}Hq^3+%+(xZADDw>$7u?u(NzsfmA@JW9{-;i)tvjcVPKWdt(Kg(_`GVQJk+PcD|Ny` zRvWcZQ;Ttki{TwWe2z)<$+{NeBIfD+eIf<=_pnY(elD-{W62bH89E;od5H*}O zVjw{4KIzmO7^jCwKh=Fv#@8h8{ZO_&re6bJ#gG*1{f<0(Z^ha6fiL14~< z@5CM7qnF$2FE{cCc+y*?C9wZl^(yatFZs}mFUF5m{nC|k9b$V6gxbdL(J`pFE^@6D z(3g2g4>1NbP7KoLCX0%?^N;P+#(i1dI7Wna@~&F)IC()h&xyT|cPkf0LIS4o_)-mD zT=hb=SP>wYW63uZpyf(ePPDCR`PUm8431>)r$~01iy;BC^8tD%3rhxKcR9y>WX{dW zv$s|a08WLa%so6=6qdv%RCl~H&Z9?`OC-db-4w|omm2ThZEG}B{eQH9E{Vz&dwr4F z_8$?0S;3{C^2sAad8N50@h>|R?@iDG?#i%O$~948q9}rnWNb2^F$QwC`ZGS3Gj3Pm zR6ZFYif}raUO`NL<(lk#P`GRb3oY^7b;=M{=8CX0iWS2f8m7(lQjFvpM~hKaSO>Fx z1TK0z4{`WzyQV$jcuurUDuEkt$5v8s*8)9o4a%vxm%0+83@!@SdJV~gbJ9LxK9v-p zWC4XYM&y;y^%NS$(unMYATPN}n#<(-^Z8VbL`)h)uvrl!3{3tv)wW=5AIxK&cxQI( zkT^l1@uwsfB%aqeFPWql*Y!2&`RJ3ach=-|T!)~ZB`(%T*&yOCo9r$u?|O{V@PDbx zE7qMmZOF=1aG0B&^hg9iZ1z_^PhITQ`Pf8m#=Kq^;aiMIEw#?y_8+f>c0opO7=daI z{53HIWcMiD`-uAn21O%!1Z5kHGz*%omJp@1L$#xg;&Uc_b%bLb3Kb@ zczzTz&;EEGz*9V*24X>5MsZm}>%#3Fm!GKi{>#hcq&Dvnc5!<*G|!motUnZVvATYI zZAeto!2(?1RcMVdPL$~!oLt@!yW_(*%brJh$Ks7>^Kgpgy9cex{k55q6QRP&FP~~_ zvc2S_vNFW~oi6?htX6ab**m39+IdAR-4Di*J&f7qA=A5oJa6?2Yn;igYEE?^@8=I0 z_%+YPBeSy)wyL+Q)Bp%E@y>&1B!oN+1cVQcH+YGJk+q9C7||*H_1t0!RJ`?yxAwx$ z7IzxGtp$$hD-*{EM?w}$(iTB)s6=a;ymkGVxu~}-fj&AmU$q(L9zvy$R~c}&K)748 zXNq&Vpad`0++jNQO}yFPM!e4bSw}b|g$T?EGZ#s^w?=$Z=)n-GC!+*wxg8%G3(?Y@ zF)3CIJ;a!zL|+mFZb?MEmokQih;EDp%=2LDIFr8_Fr5XIy8ED1pu7d|4VAf^)u8^|{+F|gdR#A+ zSU&qLI*a+A%6?@kn1ibvjEZfjiF}%_YlYcb%=AQpT^md zyWqlGY+Z81*))M|ZMJ@co%wKP^`~}lTL`i==)=dw6IT$5aOO{wgvJjG6gl@KJ>lu0 zqpZc0`j+M*`VmnYst|vD;-3>T`(Pd%*RpbEEJa9$7tJ%ZjZxqOWk zjeXp@)MN{Z-^y)PY^ z@+?woI;OveyEKzv2V1XK@H_B~Y=e5SGG}GN3TaFIYm~j5n}aleW~?iCX3c#kfDV$v z)9m`n;0WO!kQv(OEfE}2O+IC}+Pph#>lnICT$>~S)ri40b^x95=jrK5VYs@GI~5u4 zf`OQJx_RVs>|IH14YF_Fm|F|3*Tyx-l-Sk=oD}EVmTZTN8kw}?!D+FJ8jmK03vksGk#ojb zVMx1EV~f#mt#~MY3H+Xp@%C`-Zh<|s^6DZEPCKNjn{dvKFaNE!X@cidhU)_->Jo>G z{+4Iyc{W}<_U;TO>~=}DVD_%`0A~U#ywvBYR11P@7G85xBpZs;wVWl!5l@+hk22e^ z3Xu)|?cz>wtV!qpA0%3B&a&8IrVS1dW?R%h`pulLW^RM)W52f zh+?5sk5OFh#sFWmEOrQ$aCPSbW0YxY0}hP1UkCclloehAbA-ZtV$nuAj^`|>r9cod z7h$luW^9OUKbY(AzmuAk9Sq+fDJ#d?^bHcg6ctGtSlw`q(QW&#Zwj2<3RV&SQF97m zaQ@@J6>t|tXeA43_-#8z7hDMjn%$vja(GRKeehWQk+D(NV&5V08}_^i)Yvlvx-mP( z({`G>uQgJ^1<2V_2g7Mk&ym!@BF9e>xOW%NPMQ~r+U4%m2`;y z#)$mx6eJqIwQ)IPQZ&NW6Qo_Yqv2ybF<8-}46wJPHu8B7O?X_?kzqJ7RW`2n<`KeX zHa0flsVgVEaHl?8Cm0gJ3Z*EzyLHJUH4KH^Ntn(q2|&f=8Hf&^PZg&-A~3$Uxk(0+ zAP@B9)n{T<4LuY}2y&g?qSVaE;yD?J!<6vD1R8rM)5WCgb8wrV_PrifnV?G4q=sZl z%?g@zqs=p>l)B9qaWp{JFY-r`8?&8K9DVm3qNF`G>2r-wC1e^LA`rb>mEMGW3GL4k zNvfUNM(i8PS=49J4Eka?cZAfh`mxH`?*SA`$$S!&AByY)UTvZ--KN$A?uzgC$l;LM zZ7R%B>a+`(kw|MCV2HJ8!XtWfd-ns2^QM7-PXi#ew@YkD0B@67U>lF*Snpl)ZzXue zDaoAdhneHea4ElpYUjQsm3I-7HgN^SpzU*>=#pPGcS=b(sQ6&N(TYA0vIkl5Hz~)+ zpqQKZ_kOh!t8TF$0Divcft&@@j?-wo!xPreILC$#1gT!bLGpxs=CW>7X4SO;U3w+| z4j)v_G#m75T>!lLBMbA$@Xn*?Yx#;#B+Sp-gI?x*h%Bd99&}ef3Plfok@9?EC$)}8 ztY_bd_w6kdBlFa%z8qRsW4bIaRNAOd5##>}t3#5{geACZf!xpw_QO^54b64lS@eGj zX<;W`*YAH(%e2IL!P*dDjO&=emk7QV_Bcw>LiXcGzzBk;Na_~-E2wq>reW9l=v=y< zcp4=5W~dytmzZogE*hnToV1IHWSl#10HS@tK|)|6jQ_0S{{EA7?m1`q>U@evci&pj z`3;`luxif-j0b|fBK+UIz4`IUznoRT6R!F(a-BbTN09s+ zYqwSM1lIw@Mp5>e&8XCc&2t<(kFKi_SjymLl17^Z_?`?v*|;N=B4FBpbuQy%9K(N( z+FFEVz(B|IzoVqM$7T*@W7&`LfK5RdN|{DqlmYdzFv;n@3S5E5!$RywE7|VHUUFQ; z;+wiVTwn|6J*|F2Hj4OaXwyaARK6QoHW%$r9e(~yO5-I*5W>Olbp;lK4f8%AN6lrL zTg+iR!>-PMkdMb3CZ_KmTFU}f9M7p()@xl=jFI5xNo#J#50YQ5Q6Z(zW~K1BH`0C* z9>Rz`LjND?x)u0cq56tJL4iyTNZUnrfumJ}2LT+R&|A*ZgFks;FkoP!8YcQ(#ok|a z0VJ-z71cOD;G1&osGiGyl_~Q+9 zXbz0SOo&OKSd*K@n?7T@-gwLby*F8c7JjToOdmM~mb!zzrIc*VQ%!7RlwpQWc*m?u zx5c&hr}S~OKk1X~+KYdudG_KAXJFERrSNnHWKh{ZsKL zpAe)$y)gKAByfBfe1E^Jl*#>q69rUr?Lr&=j((1cwBI&A8Q^CBc9Q!5eba% zGtUXF_Ok%?2DSG-Qv=s&BYr7nVB%O?8dWIdd^ioi{tgmm*4HEIPIW@VPYch_yRz2> zw8}K8dWMv|h-nnvzS~ms*L1&Qk;KW>pLYGU*e^3hWVRrBxAjk&k{tvi>>U^&q&Uan z^$wl{viuzn3NIN4>-tUmw67;7z^Eu-a2WN|#8ql+QF1#6N?vQP;rLCU%h|bZFqCs< z=|eETdD&Eb&_Ng7LL@PiTc}vXY}8clt^H=ksa;M)bWU>hoPY!VB&k|?Wj40s8d3V0Jz|zX4?kFr&NvS=SjUMzDmQ_yN()&o zp>i;`_VAU2#hL>S?pjN2^yltq=lDKC@rvfaig_f49V-^A;hHWXhu9j|pM&@Dxfa~{ z&Bo|1D(WX!^9~AY+@?+S&}SE-G87&{Mlmoo`6bO2k{1bd2~@hMGrq>~(n%(eahP?MWHTJO``vH~u)pz-N9)Nxf_>BuRO*a( zZ!3kU$*?Jnb+~rJH|aj=(7h0zhPG&!2*R0Bd}g4Qq#v4|*CfmiL>{EW*;4NY`Cu!` zqpad-4C-e0nBk@%!Hxef!}E~2R{d|xAL_Dn_J!FB^%)ghxa50a^X3{EbJZn#w>;ew zD5vQJ1Z59Nri{KBUhmF2dE0xaBQomfzu7pha@Was@TiS_Ou?NX{@#QYNLTTYy9{um z;g4b}fBZ=agim!ot$3#ReCrI|Q=@`-6O9*6kkeJ5?tX>BBEo9osv^76MdqV#3&B;# zG3_wc)Iq92LH6cKXq&x)h_&|UoQTMVjJ{{!Bt8fgQS5zI3UuXWlr8U zuTkUP%led*cqdsO;vZUi{e_q&SRZvO)COgARFO#X85PHIOh!fwaCbZB-3l$xqr$^a z??jI}H}m(M7RdYeA;(liLeO?gcX1Px{W@nE(K0Of9TWYUPN4oPIraR1PQtdMgzqh5 zw6V&{?AT{iS@1mR9$GruHm6^`t9=YY2->7ntR&Jw@f(@i1>AS4QnzVU( zQkUPbf3PU?KAfPkbAeDh?fvBK5z!Op!D>^y6k^o2(IO8j?{qSb{IDQO(Dupu=)+)X zQt{=v)OT>(i0k;i!m3}Y(E<6OfcBsHxp370lbvXQwUkDl7(HI*cK++|iRo<=geo=? zamSJqMy1U><#lWN^%?N!=B1{oKQn3_S z;L$rWQ1umQ)08_du{W>MHvOQX>HMS!khJBaN*IsV7=@Ke6w)iOE(%3^PLY}Pg9B6S zCzQh@7;t#-1Kgd+PG`CG5+a~r^~@{bZrTjEHTs?vSLXa1EjC-h8@9Jq{SN=1txFf; zl^?WWp(0PQv)-zhRumeAy4R`?1>mbktP1xVLH)u}__R>&n*F(GVC0ToAgd6+9C8F|`5?>NBd0GF~$2hRyc20JZO8Vs*1=WQ}?2{g4*!Y7$^)u^d z7?)}Vil@IU5WO0D2ZdZxM_T_s3A>zBZ4$NiD%=~Ag{`FfgLw~t9ty>v9T?}v7GQ?w zE5t=NJG;4>f;VXclUE;v?|ZXxyGyVx*~#gA_=}f5%PX7y`og!7tX!b1g_^o+-(a8R z*5bEGz+GUh9wq0mUZ$m{ZbfuLSy|-Y`$aE?C>%oK*nTOve^pS=PyYu3{&$VL631k} z8%J%iK8E;*yil(XM|`MnF|%^WMO|H6M<3~_-!V!d+fax`Dz85Au@9E;Bdan?9tLFj zz}m%mP_PNyVadpGb-x+SI z=~c=_wY+VZ!rwx4Abe#e|HScuo=jLzC$#Q7=}q+EO(&N83NLDp*J6tvbWyw$xG*Ga)LlvbfhI8mi17~K!Bym0gW*FGs@G2g0ZfO02ZIXOXQkFw7kXj8gaUW{66D)X*`*X)-`5lEn)Cl0Xk|C;!=b5iBN(>2DzH{ z3s)e%;J#De9ooA<=HR>AHHAB#$X>Ln?3FYp0f8+y-GQOxx+G4F2C(?UPH@-%th-j48XGeTv`3NPJeynIacem6AxOP4?y_y`t|x;}b)n?A8dkRu^mJ zTWs|4;(4w(sLohR&2P^AY$}Sj<1ws2Yr*3-xS8qd{`Q_|biI#|9%+|HXtZ6&ZvLEO z6^cns;MjDek2?v2p0A3-NUt%`t6)Bs?a9`RIj&2Mm0H4WW~3Sghsz|H>yP76kYDZ_ zWTqODXeUKTm7`d`c{U)kEk=+e0e-tf$Ch)z!-KH@t3gW?#4PWQxgKt!=!3gk0tw0| z@nV<@!E)R|**mN99Q&O0zG6<)H{kH4^tGU)j@O|}Oo0UykPl?7-|e4ckj-^4Y5oU> za%fSuva_rTUD7S?YzN+qdTsIZlWu=qNizqu!2H^>O@-)ximCn1r6q;|({o!)Dp2c` z#_|6x0-nW39l;SNd44pLx{uQ6&g6a4ss|Tdy$_N?R4?TWT<}_(M# z$|jT7<9sRG+J}zX(s2z~<8Bey(cDT6jO8CkEjl}N%Dk@$d}rt}`GZ4O$gSUQkWhVa zzPbSIEQFpu0e8|XsPVzoR9HSUgZAy z!|{V@WNa3byI(j?#!Y0@SsvsOXQwGc`TOkU%LW35n7s_M#`Io3cQV(`cATo2{s z+O+Ejr|bOGqi%zrM4sbO4-?9SOlY~4pd9`A>hzfH44`s+T2^|N^Y^~ahb_d^@v>0< zk}WrxsZmTFb%?xzsUbN{{Z6effJ+rTSd_!bnDI+3cL{8@UpmeW1D=Mv{}AY?W@|f% z$pA#PTD&u)_B~>u({-s;1hI#*zN0(zX!xGGN{DB-)5h0XBhgD4%zx# z&2BM2(I=XDN_i?sB;da;yiI6&zHdoaH4xw*O89 z$f*l)8Yxr?2Hc;m9VtTw61f62H8%#X5HPwO(g+7gKWN zW%2w@-@7nR1083KpA~R@rzRqp%rd#0qEvU+N~8PJ`Y69q{LM*0BJc?pLxWjJgnqwk z@4k3c?2)%>{Xs!1rO5dauK&z}jcPJ4qiWAo{wm)f_6^Fthe>j<*`!{hdw65NbXw0f ze!(*2+YZ6e_SgZ0i5y9Z&ET25-j7db)V^m}PvO5$@$M2{f-GK7lzj*1Q z1s?A&AsRf1AGgQY6jgkzl(W@ZfOkOB)OjSI755+1p(H7NIGShNmV1JsmnN(M583XQ z{Ob1imh~FR0180$zbUWQe-mALlHfU6h?i)0LrjrA!y@hc#dAdW@Tr!YWaP6Eoiw9F zJK0drfedYz9OEfr7!Ie+qxll{YY($D7OMlocf-Rpdm8g~pABp8gzOV7nHSR4RSA%P zEd!0C_4MGt{~XId0{F|*C6SRh_e73}G3XZ`8&|%OC`QDgUo-vbp{Eh3T3Y)OCv|3! z05YFBe(yeU8getAaf`jo*!yQ%JG8y z3~0=!%PI-vNNgYY-FnL<7^$mQoW*2a2~HYe=I&rfMN^g)49VtCsFS_D+8v=K4J$Y9 z;gN|mqAVI^OLX>55?I{koKi=<%lRl!(gO5(Jsz@gL5(?L(TDuQ(XUAWO&AtWu|;NT z3=HAticg{0OE+m~beoc3)i!x*r2)q}$==OLUM#~_N&VOHKh&HDWY@EDa_q`MVA-Kf zOP#5^;8j2Lu1{=dWq5l2@ee#j)EGM)GF4iT;C$W%UVM~Oqd3dQg$OYonzKuZqnRi? z3^M!wHBh<4Vp8n2h{V?8`L^c$+D~M+lIZ)Te(+pQiY-g?aXnD8{co)*HRJuFfoX!n zLx5L}8g+B+ZFP8qSN49}eJPOGCiGHpjJ?QrG(D?)T`kdhB)|hr$Vg|pZ-5`1g)Tp_ z8;?TYAqVo54Pq;Ki$&F%AW;YTr)5KTTo7DU0rqhe)I%9+hR&&?0<3{ds3$tqu!Ypj z*G5&Rz1Do>KMh;a9*xv|PZ+do0{@%rs_;|;T6S(QCITgN#`O4h`(G>ZSlWN8W+6yvY4~;ifITq9 zUBamE7toLQa@=@K)pmhj%QmmyLoTYb-?hXHD0v;=Zh@(y*k4rqsLT6NA&1VYS81`p zL8_Js>sue+p}IB{7D{+A3wZ)4Gt7~8wycAVGJrIxv%H3^-mRj&>XZ`FsAlrkIV&X+ zHk&(7uyZM5NwS90@&@zf>lz*Uad8jlR<_|0wfAwOsG?(k!2sz<`C3*eiSBmuOL?DO~nO9+gswk!1G%eF2 zq$mq~2P(n}YtDu%$d|N`&9GaW@az6eEQ7J|W4r7R1n5p!FW!J4o8&qP#Q^+ow%#8; z(t>J|4Y!m8k@l5BXwfSRy?EjtK*O@}N;V>2#_`s2v*OOtR>#=}#qQvBlAiMF@)B$y z6UdTEj_*+MZ)4E;nzX*99Q3l{>Y{MQQjb<(a1#V-xvtWdAltSfYx&E7LTxv4TUW9B zsNrC=^`^fFiv=^6$98<=loOj!)zGo(Nf=ThQIC+}-o3!+97{W7f-FgplGjw$hW>{2 z=!4UGmKA6-oMaf*7cp*m-^iCPhjI%Gj>pkbnbTbwVp|0pud`tamOP+1sVVR+cQCbA z>#%6!x(!j;$ukMVJt-ZC_UR$=K5?e={JOgWMa{l~t?ULEoZOVqc1@}`sZaB_#oR>*a%=ot~X#LDu<4K-G=rE^zJwwjf+gw?v+%w&(#7nBzV8wkgh>V zP&{g2rA}`q(dSb=7xkRSAW}+Lr2uQI+F4T4U^R{S(vfdEtTA>BmahdaE*|1(iDb zpjhtqr~N-*Z>8B-$tM>U4(130hX*$5r}e-!&zAgFoX(PpC}k;qHg(EBQ~a6oGZYKp zE0C(wH;-4BYXf`s{iQHq#W7aiDWBoS(Fa9b7sAoZh{rC0ykiWJ5}EXRR-lC>2oGl| zQC9<^UBl%Zg4*2`n)kRai|QA5;YlDI@}9gSfNi-NR*!Wp6ZV%$F-!cqkn<+A-S4s; ztf(=qKZz)|J1P5-MX5JZHv$a|^~eT48;UBc)MMl(gP+XeG(54K(FrEUcU;W#16;4G zh131v=fGqq!8n$~)}-fCN>FGFnaXpf!EXqKiCz0~=sC}6VPP0%+YM2sp&@9@Mik!+mR1~QswdE(+y-k~!QW$rV zIZH>E<`-f^aU9&FFaz2FNlR9#-MLx|3ktDebiJ~Nz4ETT?TH{C-p7E9O>?}W#_rH< zs{m&a8`@lG`XU8p9>K9~y(Ncc{x3G~P7@Ov(T*<~OETCvN0U&#b7_z%CJDGNgxv+N zdQ0rjNF$~jXG=I>9s5;0*W6;`nD5^3cdaF7uYROoN!f6vd{1 z*^KkXm}SrkCfXayuynUwUeCc)+)JLu@6``{*xH ztGy}{_QCI{be7uNa?I_|UG$LqHXvtQ)~>`5ntuRgUWH3kXc%F(pA+m5%;8acIvRKx zp8dXhk9sukqK)W-DMySXi%9NnM0eGArww5GO^JR>t+{ayqaHJP&fBruHS$^ zQZP+OK5{?wh@Mt7OUaeg*&_M{&`uM=YCU9D)}W17GH?dzCdD<(t`rH2?+O`s1vA)d z@bOoHp0YnFW8Cb#9?eFurM^B7?Z-X}K*0$k6*Doc9az`<;V)V!py5}($)1MTsnsAq9XjsMe}wPA+=v<-)eF$zr=~{qnxpY{)VxkH5?Q zmQ(Qgf=IVeaQNEr@V9@(fK8Ko2Mu<1ys%gMGCdWI<>$9&f4kMx<23+e*Ec)oyg*eA zwspCz+OSvhWO?KF;g&}Npg`x<2(JD(U`XjTD&AAl(`8J13=<4X#O8w+2PQ3VWMewZ z7jS8iuRzZL32C{Q4rhaV=w?DSALohgI04}LQ3~D$3=d;(9W`H(ehI=1*wIT_=*dRg zBfOZ#RWiYAT;XmC{oXZReUkTyM6>`Ik#RXO#Qk8D{vk4xHX$K78l| z*7_kl!i~CeR7hnKU<}*u6QiDuf;3RGmV=a`+R=GZ=0QX!!2UJZtze|1x6$Na==&4t ztgDQ(8~F`k$P_$rG4be>4y014RQ+>FH=!3%Gpg5=h%Vr!dd23S3ZP(7ZU(iJagQ%A z0U08CZawaNzIAm8*X&*t zpD*wb(PTP5A6w2++MkA!Fz!zggm`0oc8yF+icJeUAUZf5eS7dYaZBLD9e~0BS!y~Y z3d%(wlw|Ey8-rSKy0xKjqE^TpNylJ1j>RboEtXd5xO;o!LDe>B+TtZfGc1#0ZxSvm zRyj=yeLCRim5;6q-jXrg<8?liIHeO<(J6$Ssj0vu9{q1zr6+1RBjsc$C8hx<8&BPP z9$6cY&(#lnwJjSoRq9aYG5C6=e)-PvTPi+*16Acrs-`dP<<`)b#AUfI&zY*dpoTvU z6~7b{uiECTzQo>lGxxH$K+L!7o%VS=W}q5~r(Hu4lr+5fq(>`MgS)jVmi@A6B&k|a zy7C-nTn_te7;rZeZEB-tWnYA~9zEp&tpRdDVBCf^76b=#iIM6n5g)}^;&a!G6xvN&j2TIP82wScWk5R}fB07i zLoj)Iq(lhaxaa5gs?QhxbU@lbjG#+|9QrUJzu-z{Y!h@!-$CAYCjx%<=)v)ZgRN$Y z9-(Lfa~-a4q2r|PSTy5UdA?4(U>ES0vIGZNPJV7^8!JW_l5Vdkem^)=>iWWPwzQh4 zu^Q&BmVSAo1r;e0{O2g`ASk=Drckco^ecbIJuLQHQ>|h!HAVAEd;Mr)VhEgXm{y6I zuuis+k4CGY7WOsj~L>45cdTD+ERM!x! zhB5loLg5to!#PSPRbC<46eGsgMB3WW-PEYDiW`50m=H+;NZ>{f;qBTGUFlkIJ9|%& z68f_qwT?&GE5RDag6i z_z9k@-=X3kDYOm$3uws(T*opRfS=1LV>rExv)!|MYvUoVd^qeOawkD)f4u}ZXF~75 z1Q8CEJlJxpCkHrQe!7+b6(uLt;te3xx76n&o|4h!L#Ks8$Vh$0dT-~wbmowZMOnvb^-Xp- zS-bS8ESPDj^BT6AX&88z@m2Plcm#X-Z+f!`(abQbLcUpCOwM~=MX2=^c6F_KfFoN; zfAu&VzNr6WG@DAUrXt%`^o>B>&~`@x1wa;>SzDz*AnZO^neG)17k6vhpK1ARMk;xO z#1Xh?Yk@hyVDIJHgaPCl!S!suuj>8mf&XJ0Y5-U{Q3FnZ)C~&>hsqo+>pu{;vtE!wAaze$^e769Xy^^r z0hC4VyF%9A&9t}T0BUrKC{0pXZRvrbRko*!Cdg<*t=Md~N4mlwMsYq(l8Y}UaH9cz zgv(*N>Lff$*y_OcS$77Jj1pLx)iSGjDt%=G*@ z;Qy!FHfwq6^WKLRf=)$dU-!_3!O);ZBR4Y4TwAMg<}J{*HVP#m+tsLKE89MXKID2h zm)vQIFB&+X((p&}l)u+k7qt?dsnxM zEe%H`yhldrconiOJof!;cNOH(*di{q*#CzM@|5LhCCrPln9ST%%{7#_40ej;qUWn` zEJs)OYe7xPOu^K_VjgiyC_p-{GS3wL#Efs9rxw&Prw>d;g_Cb=OZX9wDNlqC=Kq>{ zRMC^GHOC5(oTsksTCT+qeC!yU7e_7QSCL0dfyJ^jZ@KDFh_vtLqY-0|$>bf$C#pFh zFwV>aL!a*UrsqM$9XA{@5=}a{2`x5e7AOx!R@e=rjZ zz2{`Gl`kXf&2E(V(}gYO`fBU(6GfUm8;l6=8D9mAl+?`3fnA5of2{!{4c>eH6+1D-w2@*5&5=~dhYV&N;>$; z0VQ~#6^N*F?^zI*A9Oy30t3GTk%AYNn0T)(<0@71G+H$M=OK{buwkL)2EV_2EHRw{ zp|Dw=YqxL)beEORob`fUWlf&l7}*VDrO@c7E!vaHbpVk*gPRz3ne0g}sFIplo-^@O zxob#!Rk(SPfQ`E{$s;Y~{9!X>%ZdSr2KiqmelVOB+kA^sx@`md2grl1Y$sn)I{TRmpbN3O z-CK47hvNHaK@}3{MKxo+z)9@JOwlURZ5-|8&LO@3BD1A!l7Ktk^kqPO)KvNUk;pyH zz97RFCa}tI4>nZ4znIoZAR#gQ;(>(wN4x0{=Zql`OglEHr?aJvf<<0VoOg|fO^e0d zy&zI@L{Vgt=XlS#iDL>SwFOWF|7xGpy&?OlU-`7MNy^sDGb)OtTcHc;k2N{e?7T*| zY(~d(lcKpQ8^ESt;D&nq9}^Nua~QlkS%kYgURBv5O@Ul&fsLwO$)kjD7tO{arf(&WB^Sq ztfn{b5AhSfikNf39yP}+eB{Zdj_9hU5bb2^bLvNY<2w9A?`r~lyB6O=2#;a;atKt2 zA_)9kocrlt%y-bs2M%2_n=hAUhUkkY7%zduM5K3;B7(`da7{GKm8sRYrh<}1^~m7N zBy4cLh{*P|cCM0;_U6yiSbL_I*RZzzfgUye9fmlez37s(?vJvB;`;Zi@s-`29XQmlc5HU#!jg~+dF^RMY2G zKrqF>=tU^MX1X~#itupoy1!Dj#ijlod)~3WiEW&2xJxJt!HXr~;dJIyVjcyPkxujT zvo}1LhP+O@lyqGb&U}!q^edUNq0>#aqqZgeZj**@2tlC}^RO_ytYs&~ah7LA?f|Z} z%AOujau9Vg5wb=x)|@0fC!ri66}Ww|&@)-go9;eYOK2`b##(M_;p`i(WZz2bab<{v zcdQTVIg`R*u~A-9}R=?BXx>>Dn#;lM#}6LHR(?=y}wISE+LNG zX$7uIXaZtbslrdBSBe6Bgn)`vFXD(fv@X%D3GNab7^Fr(947P51lI4xoAZO<*#xQS zI1Lk`E++y9VkBi9xW-!@e>BW1$N})RU97`rQNxh1Rv0Fw{z^u?+{oUdGx))JXk*g-a}M=OUt0^@#kUle!JrJoHNJ>TFmaI6Ue zdDKUtga}U&Z>KaL`Y-|mVR%Sgkv98sd9Rq)9OOwhhZB;k!Diig4;&!#EdaqVx*%)% zn(mqQ3T4v!1Qba-l#p7To$RO77D1_B+K5o@B~oCjZ;p&yxN`&(?pFDR;8Au(nsc+8 zyKGkqW@xXUm<$t(s7oK&HKI3i2{An>Ez8+|s?YAdx&XHb{}N2ajI+TX+D{s0?BG*t{n-m*2lE3YMZ|a5HzmDDI7G8}s>sm-SPaEw%s5wYxu;=xT>n_XQC$*^&lDQl; zR<=`Cm1J?aU@q5bljORXzcm{Yrii}N>LyT049c_bHUjz8j8^!ILq6p#o({$`Uig~? zkg+%)*3f{{y1nPUefG(oyUJc3J}^XV(OMX+389^B`Oc#fK+}sDuZVTSn|!*5EsbD< z)9~H|nn5ZF#bU^*=8cn*Z@`4rCt-K2R9^@VKX_E0fV`tm;9`o|6qWIY{BTQvtYW68 zPnnw*BT0dE65<^kE%^Hg+3Feu?HLTKcgRNe0oj3(F%|=0fo8^qNbf|;Wbpn_tu|>i z?-?O%vO!YJd}ZZ7VJ^X-xbl@AA$rT~p&RovbfhE$A9f`f>WuHAwY;{SX-k5nsBHhS z{*uPd({85gbGxmI&V4(R*ykc@`?2pSi6R)af1vO?xx(X!=Mqy8@QKT1mU=m>Iv^U$ zCwp^G4)3QafbdgiGkg)1e4xkhr}Dx=UDMmU8#wwsOHg%4J#QbI8V6ev3MGP00LYU$ zu!kp@@FdK*c}3F7o=y98CD2EgRjoqo`mO)GzZd2PP9f)qR$C1 z^O{JYVs=l&8eLTA@oSK7F8gaAivl9qg#4VXJj-Ne2^+O)P>1Qwa-M2?bXzob*)0~We zx#Mn$DmaQ4(`J7C>8Pd1ew^{_{T}_WO?$)UgxL4-<{#k2Mk}6m%nD{vYMf2j+Q9*U z&MpJRTW0*4>j(u}HWdn9+y6o2*Fx3g{Q2ZjOGjKtb!fKMj*d{ArCdQY={9!Y?(w{myu@`a3=HCtWg?M;yxR9Zu+!SbZPz@PS|b8XM-ySo zdvfSb5DV-O+=0FDRC~7mpaDdKT|Z+JIx*mx7YvLb?TFx8ld5i?Zi>7Y22+&h=cUYG z7X27*pja-Cy4$w=Lts*gl#Jz9kR}#4{*ZJMjTdpD=gfJP_a}X8jAMSwZ>4@^wOH5s zoiU_q9n+<85<<<@SgK1rxR1xh>FfUT`hm>E2TCd-rl*8QqAv@ED`XU{$xPC@DrdK| z9{uBlMtE+qTneUc;$h;OBW^UcyIZ;jwmJ`QSNcxFEY)6a#i&f!G6)(22Ferm$ z8iqBb*0%-o@%1-;G|0tpqu{a*+e6&qdGwKW3N2^l*ictPU=9&!ZvtSzSp9j_Qnl3E zqo2a_2<-4K=X7^gv`*^B8HG{a1l^C7oV1_gV*uo(6P`E5gNM>#4vG{&Q;&U9%kB4i$7ic$(vPEMi?o>C71%HBMp4mxi*3{SrH?ZxqH|Ie;3 z)VZye4aA1xs&QL_5knGj@2JRUhipS~Kz*-tb@63QLfb@Cw8ZU`gHQ4ze%4*Il zxW*~bWs!-@udzmmt5;GG+q=1ugLMTDqW)~KEM!$cKWUBA1u~~2Z?F08Bf~)&E3wv zI`oJBWj8=Fqkoad>0US8u|b~doEUS_NpW~3tjGso?zdXDBkOvR3U|qm{k;2`UMaDK z8Gkz>qc)+*?%sN?YiDr%L}(7S!>AlcL=Ip!tAABTD339>d`Okf*Ho20X_Q#yhT<7) zIUE#0Lk&qASsxi#!bVmuxiOdr7|JB2Hx_7*otFkI`at(qUQf3{3rbHo{VeZqR4>a; zbzi16ovM!eh>&}`jE(`~+7RB%oFy@cnw9ZhR;I@vB#vae+Fs>l8B zst=?>qhg=UCjdc;o|S0qMwDn&Y{nHnQVAp=D!#55~p$pIPQWL)b@$W(9go$8Tkn9Zs;k2rKO?b z4H{`m?Cjw~d;(jx6@iL;2dL zkCPM%kXO+{S#wR~YJ^TL3bO**xDdU_MuIU}?WFrmNNvxh+ zO7>Zw-?8145@oP?^Tbx@0-A7f1AJ>8JMh(2{ohCFY8#)y)*yZqD|!?eg&|7r_W+WB z;9I*ij)-c9rVnMazlo!2g`+JVkAd+t5P zF*zbV?8j$);f#jk+U>Cv#mrEBQM&&L-+}?lK7t`R{TYnjOzCU>W)m>n-K7Jb!ICcRpBuDr6q2u76sTnd!ZZLi$UtUtvXRTuZf0!6 zNPUL(3|;l+s!Pm)yA9&R(YGJPC0v2k81oxtW9J)eWWnRD*R@HhzT-?%cYJ^~+&9Lg zZ`yC+uzBJ`a-b5Wb7}m4mjgx3xZ&Uop&RRh-l*A2lPy5n?`gf7W1AHs2+bUqj1juX zxEpq*C;9AJO~{G)zv3a&Agc&F;yVO?0fnBWP3;P=daee6D4Z*?7(@&!F>gse$q2ES z6bu*K4lk+ELf-;#q2bGE{!rw2pNpFJr=%x;;DN2P>rm4Io7UN`fMAUbp|D3`fx{uh zu8_)8N3xg;MBe^BA^ZhkSI1xwMqspr<5t(urJ9BRLiC?|K5ZmhBLwqE^7?nYHruJ^3w} z2ABJ0X4FSQ4($^m zd`d1os5}C75r$IE9_d28PiBJ$Zni-6ZukyOl-c3hXcJObhTME0H9YrKOb1jdKf2CRzQ z_Z}Xx7MSZ2mrF}zL5F#2H?v+fIo6d7jHjo}{&Q1k@Sf$drvK7}(0lOj3D`-58jo+9 z73%oPZczl7C*7xAMhRdN@HR(ZGe!$T8s)za;U*DPcv9%sUOu zsvkQz5hEA3tvABQYB~L{Ke@cblHx?j(IRhe#(cHhvKXV?E*tJ!=fQH~tc54Gj7D0f z^iFQqgJ9aXTR{-Lqm_^;sa{wNMx%OR{s<=`Q@J_dn1r@NE(L43qNLW~7qUS@6Iou2 z+RO}Ln77Y1toaOjMM#npc(c~cfJb8jTti!B8n{>~k02+jY~ijE*)GU45Yi2qAZz@h z6|W5AAC{}e5W4Y}1{?rp;_)*9Yn_Fu7DzEHtv4?Cy{~hU$vLeGSp1GQQI-fMzSpY!bs3#)eyD`Or&)pXo~S?f z?>EiI!-IO82*TiU)+71z_ok=)sn6_i-7VGk4Kpyc`{McPnJL?Kkquw+XJBM_GYda8 zrkn^6ftA_Ve)-%R`$_cPg#oFTan-`r2gMwnI$<}TxB>=5*yv@>oCa5?prHTkng)3c z0P1C4vc$y3az}#+>j}~6qpb8;3*ytg_K*pMaFKu5;AcyS_52R%(&HUlXwji|> zyKc_92Zg5sODWZz3EklvTJ1SiP3AphUarHG7iBw4M%ibLIsO>}ZP&!soxhpo1bw9d zW|L@4e0Yt-f2&9Wf4d;(Z;G?urz)@vGqw8kyAZYG`z5-RM_?^?FTWK)wq+hmnvt6r zx>|bxDlG?EOPx9xXito#M+I@C?)>@8uPc5zMKFh-_C4GjFeajApj#ajCl>2G0o~Fj z*$d(OBQXrie`m8tc}_q8CI_TdKOWak%KrCs9AH8&J9ehn6?VB)J@KvMHT{#}u|wyM zB2tuc-UIYa6TpOb@e_KrVD~1y6(i(s|uxcrcx}J9LfmzHhA49jN*C8ndJD@u8azS}6`U|BtgReDW`urw>H#Y{n zDl3Z7HZFQZsv&{)(6F<>MRFjOK>xPxCi>>Mta!7z9=b+%EhsOQoDUD+%^~P4@Xe|| z0Ji@<93eC}rDM703C5cNm0{_&Ak!1AcP^%!D_j&)qqEVNbS*y#^$zOdb91klytBVW zq+bX-Je9LQWXr1Vv+10pjt^p+DN_FIuy{Ly7B<5R34Z15KuYJYQ-h@ z>}s6p8JI`bEus2mcTA=oE1LJ~)O$D9GQtzpUt z2qTFx$X$@bnm`fC@@0^x-KhQ*;Q(EW`9jG8s+6`!6(Yf6EhOdp?yzz#uebk)=F7$P zb7=)m@BjDGPCO@hFaPUCx|fiz>jAN#$A3&buun9acw$?o8GQw4b(ZLTag~0G-zP#> zNEo>uV`%uDd4{)bbng4C{#;n&PS1o)xD}$=Hd}Hkjlio3M?Eu*8A{78CqCU1c}%e${1a9+z;G4N(` zuq!rvEyv}YSviekWNvx#SeQ{LhZqhv*N3H{f}_|nz`b?3vExePm1p8-w{==mlRq#K z)y7a{kCSHkeO4$H@Mnj<6ny8DCFNCcv8Vu+bD(I#mzLF!qYK}xSK=$miYby450Qt( z9Z1Fcx-p~PT$&rd=VUz+6&I_3OR*YAD_o?L1vCFQ(OPb5&6H9+Bv*80;RLwPCdFWX+AHs52#&gdsz?g)NPu ztYVir({5~uqPb(JWaKpC>ZG9m7Hm@0n_Iaw4Lcwxf=uw!@cGOnR7zr^)M5mYgQJ&C z&%bI*!7}tiV5f}~w#6Nl-Qh%d`mZm5l=Riu+!UA#1J_=A z67|oINnKGx8F^r2glSf8gs)1N?wC`^O`Fox+aJ3;n(+VR6Q(l=E5xmkwcA_E)|_L7E__s3WKPe^QOa~T{3mGQkD3kib`6MRwNx@UUwbE zJRX*HyS%8rHjMkkZDpA}!~=F~mSLt>ujx8pY&$iq&rZB46tETTlgy`6_$X$rc?YVA*0}Fp%1VfcGQZK9b#9RoMj|nU8 z-&*LvvH4MCF^MQsHOf60_%L_U6I`frGJQA{ECcft{Rxy+Es5#vb~MO9V(X(I$M-W) zx=wHmXtmM9f+6d@kA$foTP1p2SJw742E!x`O~5O1TT}uVOX)i~-_-L%%NHWbYRf@A zo?nm4r$ipcPu1bR#GQ?=Jn)|<)p*mi`tN24f3?iwPKWPLG&(?(!@zUT6>iDp=O z4s!g|SSk)5j#l7na>|cJv~VVLtfia7Sl038q`Zns@s|6l7W=b+u1Z|%hrXOs5n|7; znBXYvP*WhX{Kf;PPm9FF{Q!uGwX!3g1i|qwNkm%Lq^o8!lA2SITY-Igue3(W-GjW` z7V-$2z|E@f@C|;S=eElCgj5Td2I`irON58>Ku>O}TRa5SZ{2pBZd^I0;`tsTYp3nn zgY>euwBGN;C*;BJ<&ZS);Unfb-Ym@RX-cuz>&&pKNlS09>?*oEr%8`D^zoc6mp*9~ z8j~xu^lD|Gju8d1$)2Okp^+Jik04P-{k82FffQm@G;4uBxL2z?lx@*9nAx&t&Qm4& z`tNCT6g2QZwwiBTh3~07+dI}~o z=rGO@A@)6%U7JtT*=s0$u=5-I5{-SJGZe64GP`dWef_ohMa@C!vGz~)HmnlJvg`jz zz@6HgE!TePe8~??!N-s4Sh8k{dglGjgLCO&zAwZ~+kPQ2`pK-A&R3T1*k|s;Uly zmCD`;x1_%j9rfa{HLiz6NnIa_Y64+A7KQLhVMSgzCEU*Z0YYWDbXJ3tVg=-&+b`+iW!f zM(^lBFhK2uy8z3uvJqeO(zM)_Pq&}8%KYL*G(2}lShgeozmAQ5{OvM0f`wvlqK`k3 z)>E|glvwGSDjCCvZQ!=}mAvy8QAIRi@((Tqrf&R@WF6`JHt)+q5$`acr2{aCX0lS0 zOw-ew;Jw1}NY8|AEa3CtxKe32`u%S%2jJrmnp{#4xNBTNmiW1o=7bR+x4*bPvm@lg z9e}!Y&L^eK^<5teexL`vhbeC8ZFK8I8bjYpDd<|s)TTlFNa8XIGqKXTksLAjcZHbKM>Y9FzereEvW-kt(#y0O7Y1h6ZybjIXqO1mq1H z`F6yPgmT`kr9y$O6x^ZUh^L^CI7Zl0bBoLN7IQJ#;@O@EEVJwdZ)9q2BXI=x)Lw;T z;f0p@;oud|iVfmX`QKOLhZ9kskmHC$?XghtCmii%_(}o_aRx`4vJ#r>P4%gLp!WRMf=<_mldzvQPThDVn6*4V&4PF@K zxO;jBnD&c^t9cj@!tjumia1|4Dd+4X4+r=TX`bCiL#L7t<4>{ae{l zIem3nN=j|*udPMHg#+OB*C*fM$w9YvCJ4za^mR}2X}k?G3Wz}2+9-wavI|m3UFRzE z_`=39?X!G%;FcO@m z5Z+>lVFz@^Y{SX*A#)NfUwFH_X}mB?CVUhlOV>r04wkFxbb6%n2-yThgHOadR14~@ z;}mwT`y7JX^c3uV6uPkteClZ--uy!(5r7uf{@}k>AKa5+)eU&L1n$DmhIZ)@QxC|d#_IQ^r9)^M{cjox3;s! zn=yE4F~Ubj=;9-6T-i&g?)HObU9?8zAgv8YbmPY4qi!h9bYoyLpwC-yhLtawNcY&b z%9B8%Xj>*BR`qja|Nep^u%%D4{AT_P>4MV*2+ZvBjOEc)KVqhUathK4EN|8-XQW^L zCGng``oHh|RoVf801;0kXknE6@FlGmEGH zOJHL`~sR(YoGXNx<;LY zRfbkgnsXZ5q1Sd4zXeGZm_7gGJHLkp(_iqP9Jty>hAQ$=yw}$qdrB+B!Z<&0Kz>@% zFYb#2m;tdA9JLRZb%p;s6bLX6Dts_%!=m9~^ z&xRm{IZ)Q<0YD|YpAAgd znCdb9?p46s2x0K+p4DFYTRgSu1=0U%k7jy^U8o$4ZrPAS^41x!UPVfekux~ngXZ2_ z;J{~_QI8MjDFv8K4gmUgf<8||-|R2qUD>d9rE3f0e>!bUU_3p@qU*eMFXQZ&QSL(- z>g0klSWJLAslenOfeT_Xb43uaT)ze6e5mkQ#B+bTtGPl_>4JA6F9Th^94y(cQDwI+u4# z-A*kFPDJynt6nB?K5@aL)^LFh%0fAwTPyt~c{5(j*hTl?wx<@XdFYwzPS6#8!KW<+LEU1Q4NIQ2 z2On!EX!dMUFRNYm|4uDZe{#$=B#ydr%>+}L_?3n3O(#G7I#2wo^>8;yQk#HZwLLJy`0*?Cte=J6Q_+aJ~e%|5#~4anTI}o$;;KqR(7EIE)or z%GuKL2H)5@TbAWx^!(Jf{Z|YAAy0 zm^zT{=Wm`@*U7IP;{=^0We_n4*lsTUWYF{(ghl*}XMyjVZZ2C!ww@T9a?4)hWQ(oykRo;72> z7lO^H5{0Jk6oFhl+o3G7JGs*GeCxO_j;KamB7MRp1`)Rv4#$YGYmg z@>%iIG0TO@=skDYqv(}l=E_vMVmsWM@F50Kb7hJay=GiaGSsg`_e=_15vQ;jT`whr zTPjKC0JFVo)OTiI%K_40wqzaVCq5ntMaW^k;5xJp!O~E z1QCs>AkwlIUc4Y-&)kAabq+6hXkY5%Oq1(p&w@w9`@qCnJt4ucj(o@VDLd9rM)V+& zKu(8M(>#oDji@IWI9rI3rSKxs?C+kwsvGQzDLg{_@N9J1OvV@07UkQ@ltJn9xQJ$O z7yOZPGGEG9$2Te7qbL8l^MZ{vqir!plCoX`h6w>t>p0744+hz0(62l2pz(RE8BTh- zfRc7dA9vY_MlBnngqr1ITA#Y5`=PR}pFJh+tr`)ZOwZ4HDuWz#Tab{_p+4O667F^5 z+YK+>XPbjAD;c#_pAz5gcis=b7+t?a;OMJcG6kdPDbruAO1}{x766A+_95Dc zTYKAi*`_nLi*N~C@*L*_jf>o&p^nqFj$2o+NLxQ03pEWnsll#qOB=RzioP-zE`LfOkM~Or}+U`ZI0jMCW0i-cEmt2Zpr<)Q`lLarw zM}4uEx8-}ELs&}!A>i00j4`66S9U_06ET6H-@5FKbLXIws_Dq=?l0hSv*A?U2x&Fv z>JYPxrV=NUwM+Qqaor(-4FkwVF2TuMM9ZmNmzuJ%UsCyze$;q|NCsu|Klq<#4R<&Fjlvcf$Ej<`pAWTevH?xqkrF?kbLi z)Do$dA5U`usPQ6FdIXCrR!=fqSAAbG#^H&NmXy-3zpM9oa~z&>lbxpJot1rZD% z_AzqlaU!13E`r9*)Y)UunF%fX_Wm;fXK^L>)zQ`8zH$KgrC^L(2yU}u$A#?NC5_63 z%7lSrio}Z7!U`fnpW+`u3^z~!HvmCEzQ2javPF7WaS4XMw)^aD^oID4(KCM|(PD4| zC0)ME5^QJ10KuFqM8z3vUWH&Z5FA;*?Y`6&|A4vS^gYY!khMJXV7Ge!_2 z{qsa&UwWsZyPUYnjsY+Y@|Mxe<}hnC z^4~m_3N-}sX+D37Cak0{n?g*?Y?lmOJNS4UmL-2H_dgfnqz z1NUTSA^>m%*EFKiY&%k%)$A2j_^mEwBMaz4=#LU%!Vijg={s0@3`tXMM8b2G2?Eyt zC2b-mG`T(5D5K0*gyB(M7q>(TY$TQgyo3?zU6DpZ00}_$zi~mNW>=%gP@3nVnW7hZ zz;{b#W4hFKV>OEnb>$?Pwq{WfNjhb=JHWKJIl_l9QKfP^AX0>}g2G#DGXw3hl&-Pp zm7X3zT#yN6sU$j}=V+Z&uBWvZKkCHV33T-nxxaLS0>1R*Fd6^cEbDsSD1hgKHQI7U z91X8ogr$P?13=+a-6hZzq2DD9YHCY2=(RVJ~{`d_)G>hseXH!alLbJ zTc8^@>WgcETBtol6>?w`D3)N;v`2@dI88Tb&*<$;&?zzbi8_z_nYJn_AgNG8XphNm z9O%r+#8>`rTo6lAwd(xz@|$cqgQY8l8k9&Xr$U0QvFVSAdnke;#c1p z_NycF~&mj&OCFnRMp1g*+$3a*7eBgz%*X2Z~V=)8LeJ3LKO_1#G{ zhT;(x{+UO5wFx8&K(O0V!!Eukafy2bCpp53Fgn$xFaSAG$Olo0#ngDd8~k^)^zhBW z?xHO6ib{S>E=CEzSLBJ0Owu)+E#ErU;ITEj9oY!m1?*~-;GNzK9fTLYcYEO(G*Hmv z&6CIY+mzz%f4pH0MUbYzjZM%I14Ot*{`tda>)zA3yQ*o^B){}0;S}`LI>*fKEcv1K zEc-eXH2}uYt*rt+fQMCP{^Vxm)d}q;Jm=u%O}uY@nH1{y%Knl$Mo^#h-VeE+$Y*9B+4qhibmOVbT zi%U|GD}rt`ok_@|HszZB5l|}hq_Hw$sx2gSGEElzlpjnq*Y?JqJP#$SScg1=w*a8^KVP&-IHTY%eRaW%=aNCaCs zNR!OI*OC`f!3^1$$hbW8`gI9q;$77sL|&w&mE zX=~JgY0w-g+pZ4a;S(&prZYB#Y%;LbSUM}pa#&ne3JPqYILj3S6U*YQq{X*QU@OWl zQSrbFG|E)5anFWAn+kkF7=MKx4;jVIPu8r%e{eO@dDZHB9>2R7UKO_%7qhj*q3K1X zAYg5Oj(pZoTSv|AFv=po3mIB+%(fk#P=r)mdbzTtVj z+@{jE0M@1(zl@?`OgMouN!%fe(ljdBmifH=8LDM&Vv#Zo6|cM`NE<{U3iPV+oy-u847{8)RBSFLwMGW0gcFfY)WxtL6%I-JR=7zV4xOt{wDty~g-``e(HMXN48miGnOcLw zyUNU4;0%z72VGOj2LLv>mKnb*3^yz$(43D7>zjhfZu00TQF+HSsAPz_mv!B=ZIrPc zCaT;uvRk$s=$|(4_1;Za+2r_%>o8s#sFh1*g@6=e;MvZoc;-xLY5!m@0tQsBn|Vn( zU7cvoS)X_+v9mY6if&+{B%kWmCL)TdoNqJz{K&kcUsaAa3b{E~fz6H$_@dQZw!6Tt zX|#LM>g&v#CT(0R@vdJU94^Yi5g(-Ld;HHt z+91arrx(o5ldZHfnEP5FdEj~wvqeNaq;!5~^dIqA(98ScJ`xt!ZfDtUlxT&+OD=RV z{w9aRg7cn2ae0@b-{R;u*m0FyRiRkK5%`m%Hl28e2On>0yoh1Kg{28ZbshObo`_H% zyQ@EyGMfIA8i&!=YcE)nk-C7l^ODF7PRYdgv-mN~IU15u(BpObDFBGffQQndP_K?< zq$+n!*AdFaLDV5szDefd9L#g=X0Mh{uhtlj3-D`p;@(yz+{L4(DpaN!D%fhwF{gdC zX{>sbDrncV6$U7ir*F)F5iSlRf=ehrlrS$V^UgR}f8Xbv460_Mkww|*8PtjL#{s5D zJ@dD-ltFn>{KO%j3!Pt0iGeh7Epr!J-LCQ?4Mto%#)-H8MJu!?&=c)P|5&?mtz4pTRA^*GaGQTm z58ZfW&wAL1uImc!B_hhpeSfSE8Cy&@_~7JDyVt2U|LLosAO01o1xm(&j74u%KDE^x zXrcPdI|jY1*Y1CCXN{FtIWVr!jlWDF{saudYFl}sqRmiXhYZ~oF#H)2Lh~?>Zt)I$ z;*K$@ENkWMX@f9;taSt@5;_S}PL~nd8+=7%JgrXkKJ%Z?O4A(6C**Ec_J>o{R@0D8 ztO^d3d5a2Q#hu@;Ds}Jfk#zY;3X??z^9IAy-wYfhyd+|+3GxwY49L=?(rCErk&2nRny)&R=StJi%NO&&1olwU6T2W5Ersf!1YX8kPsHG|e<-h4pEp*?6ZN(^_VOICp zMFU9fZ3?${ST}2h0?)mc6{BcI)4P-5i5%7(f;^-1P&dyc7TmKSBE08IPhG$%G5D7- zyi_EwE+B9!DZ6=m0SioBuQqFB2WH2r2p#R+@MD1IasXT(CIY0r_)w;%6$zL^Im@v8 zDp6MTBIZa!!df8rN3?Wo(geDfs6vP2nRL=%C+HK}qTAY=Y@~@uu>%BT zF!fSeI0|?vi}h#7sLHC6SyaQdUuOv+N!psAfu>fScYD=nrf?Cf&nTyfIE^N7wje!P zryBhEYBoWSysa?H<Mwwxvgif$%(TtV4)-r#u=N}YVS{zbP}3;N%(7^;Fn=s|AV zQO}R@9{a)+v9u~QgANV!`>nIQFKm~rnq~mj^5rCkRG4ltWEtctMq|YQIVd#p2$a~9 zTE`JsBxw@}GR4!5Y>O+(x6u@~44p+hXU51+ey)`g<--T)s8g9)7rou5ZTyJtWA2V2 zAfsqS7j-M>4uafU*uQi*$baCc;y|wkDlccPNp|u_{qOO2bInQ$tb{roVXz7Hq^Y(= z0%?_72mG_8T0@gJ1&}YJT-*^rg|!q`V218@KK z`#2Uax$Iq)R<>W$@IsoV)6)VL8xgfw^puF+;HcbfXW^(ra3&wzA5)V8_TQr&bRy$J zyy#2~T^-pc14qQyIxj*lcH~RcdXO~I26?fxiW2I{NNnjVwnz_Yx5U9*-yITbRVA^y z>4?f@>}~Ym&i6~;^x}aIRw0ru&KX~S#G>EQSibgx7rsE; z1yPbxmaUB(47}+_njSs@z{NWP!2xE;3r%UJArd5QBQ2N#9Yd~fpm|S@v-arm;0}WR zZsk%+TTTzBIT+1LkqDK2! zDtE+2Bk^4_h0lqM98?&zJ;#hA zdCHq7QaXn%bToCRW436pFD>ExQ}nzq1W&L-Jr+bZGvGLJjT_aLS)k!`5GW1woT=Mp zOD~x)x+7o9%orar-C)V(5+sZADTYXg^tU*oh=FxNv=*WUg9r2Be~zROJ%m3Zf5%7I^0Jp zf;;`Ctv8<2M?R zv9iFoR*y~Ap{HB9=5G+4s?Q7Sc0w0?U1!1W0eEozdsq)94bQeS{-)Y=c<;Gv$J0AH28zL{$Xqwx)`+Za% z`-o2sf@g|oZpMq=nJ<@R-;U(6;UX9EHundj7FK7E~eYF|Zc)dq>#j$Mb@dUTSGVQp5z43a!(_BBZWdpbofVm`ASHL`R!5!;8fmOn2WM5VH3Sf#Fx%P>(}Ffs+?SM$o2&?J!oDI> zMEX(&VzI^aUtKr)K4jdO0b+h{lY)1ZC)oWG4ZG5Y_SsR!E2w>no99XXG^1@*Hhjcu zmN88$vtFQr2u7D`2a~E|raknS??O|bWo|+$@Bvt0p&#(n=^$cn3o+{MXwV}D-2=lx_6(GU!Q%NaSL5TF2 z0SEwk0OtZH-h~uGxgU%_^Uzm2MZ=rDYGP3n;ga-WA^G(YMTJt6%jxAFzndA*nz{cb zHbjhKKoxdDOKC0wRI?vpj%Su<-7_y0D(jo+IEn|7=v2>-w%PLYVKx3c!fb z9@sH)YhPp$ZhW4a5-}EN-v=yv?$o=>B}X|tNpYhA#+dCt5FV{~t8Mv95aGsvTdPbJ z<6?It<|RwmU?fLnAi<^tpW&q3ic!A5MSYsYA*gH-m=Hyh$Vsugrr&3eKzR@O|Gu`P zt^ay(S)qcB=3NAM55zW))+{EC5OsMonB=Zl+1Is+aM}hfjYxCn+d(ifoYP)19S+Pvrvm2 zk@p@svAy*-Gvc`O2ty&TL0D1_GML-=>ni>$pDV{z0>=)4ISGz&obkm=M}Jlbc9UR) z!!Gmj7JBzeE5o+sXSi}^d`wOe_6tzhY#<7t!@2_UX|~8E_q%kOI_jsoOkp!|Ia#>c z#6w&<6SD^V?d$x|eIYP%j~pAyh^AhH)-@s`ilBO&;DCe89tiX3BA3=hFYst8YKJaj zSS-H*F8jlgwzvJZ-JE){0&l^+D6qW<443V9L@>JF)OZ3-s!F2t&qDDO7b6Ur}4 zBoNM|{4Za`J2mXl z6g4a1?<(0c$FBAQdqwj$(q5|EpPVWB?I3TrPdyI4tXg2bNR+7D`wQoP?EkCE-bp#{ zQ2}re4N7-#^VbZ%DNV4x9PovFJ@W37VE};bFNNwyk}|OHfOth8W2dX9SkVPv1oJFI zo9McRh{~*i#(f??LK56PU0Xs|ZLkCL?(}GujImM3-*5PsAqszu9n9g?-^~- z{R%Fz9}6NB9bVDd$qN`LV&n}ltx*hK_}>$uo)QgjV_)(wShQ2Evwia%x~U1ETnNo& znM64*8f2{Dm1reLtU^DFy@8>0a!`H_PR}bd?b5pE(0>JIlWhPoSr`#C}{WZvU4DM|0OneR*g| zZk6-vEx-GH%3g3%%vt_M!P$Z_C>JwPe2oLI7UrpyDI!q|?+1X_MS~;8cn7VDaD7bx z2MM9qEe*~a?cEq)xWr0=(ivi2|;^%zDvg!q1%1M%Ch#vMNgsb2`$*LtTtiyFR zIR{-G`T5#U9e?mk=A*fK&kcy>zeh}X7#ZAvB>;qc-dcU2WN&zNsq zckjez7UbB+C($W`aPG5*Sw2r$k6PE})*cMOj=F>?SiX#w95$)x{gh9sAQ$c~GW(!x z?B#GN7YI}a6odgI0LAe13WOg`>}C=l#*h@Ca-KZ=AJj#h%Jw9JkkkB{3U`bwW-GQw z*L<`(R(%(>pdKX&vNM|{{dHu9wx$hb9{*p58B}y65MNwOWQ{Yoz>0QdM zB48G;O?D!pWW>Q((p}>pr0`^aHOXJ2gLu-~@?D9B0+B^42?^6Dr%KVDvxT=h87Ohz zNpWBZH=RVu!?AB1ZqHjI)*$jqs5S@3DcfLPyCge}z4fye?YKiV;Au*D_TU3u@~iSp zfGA&AEV3V3WO=Y^F6gKxkZ*YPF^lQ5VmNa=UJTUUc(gi!d2|6V=RWE@MKt*l@Fi#0 zFgA4N2#uSvRND*X#%BK6l|YSP!t#HE$MyduN5NB<<*JTrbXh6$DGrEm7K*<)9KhMPJvqr zO7}CJn8vk^(=eQ{-ioimJ)+Xz->zG4!vD2VMe(ggTlqLhBP4+bDuibIfWB}?5zh48 zB3SvsH0IB6kh@wPC5~tL%)JG3&ZqU4X{i7lbxI3%M%?*;XL4SH-;d;7LrMU^uuw@Z zZ3&^72xfJx9Z%qzTv1*jf>}vPWu2_?5}AHbPbyM!qKKub5e9*@1%fBT&T-dNKN(%Z z+Ubttu$6lZO^Wh748}s0B3zX(5%ya^l2Rq>pu9KuPIvAZ5I=$+5WX8Q)o`znfC4yik@e#9VM5V334P>;psY znwYnQ+)a<$-yg2Ut5_oCXGvVYx_J2x#yV#PO~sc}qBTIp|rst2-^GW^O~j z@6`c8StS6J^ARYEqL@_c$o7obX8BUFHBL3EXqhHEhwktn zrtZ{SCWNo0%ue%GyjdVefEw;y{{MiLsEW7~z7g!-xsQ1=$R&Ni7Sg|$aXZdMk4Qzq zmldQC&~_85li%FGJYVCgTFTkJ^7?N$`_K|(C9I-kM6So%2})sX=r)q@?a}!s!~=6) zW$id_QnrttHN7xh3n>7_`Z_iQ9b^6k{l><$i*0%_2o&heHk^6@ zKbr>VDdmB!(8wSTQL_}t3~w**aL7t}FCn{gNX+TL@2ZXbW*~a-T5rIp;?|NtS=)9@ zd6$zKVnj3Z(fd@VQEaN1j5@`oZ;b>^EUON4#@?g}qw%Zw??(K!^-edX(T->&;%5r< zh9qVTTvsHnq&lL;wWy|TY8D!&LX&X$K~fef89lQ4UMy74lg?NsHiC)uyVnoBm%t>Gb{|}bgk5E_O9RWp7+glKA3^p>ZySD zKHg25ZLB|06g82+it2|7RS?K#JsOzee-=4&gn2!Q}HQEu;+Nz;|8 z*y2P?|6~w2>qhc4M*jrm=l;HKHF{*CUz0-+xoM90$L}}zpVPUaLVd-IjPXopAM{9J zSEQD=!2>rlbr}k_y~359JMUTs%|l_t;rXr~YHfBA(%H`=Q{)!T<<->5Z@0=vXH$RJ z5?g!njUl6}%M9I|y#c<1rSG96J?4}&#qC2mHgT>mN2`tzr-n)8xmj5l;6dD%&`R9% zgbg)oc(fEJmMRpOJ)C9E&H}Gb_Y7%4QicO)0mS;pOzRzZcX>o^YpM(YvzHjwVc~$lZK+;Zuh^ zlbHO%2%WC>r}6pYho(53sfnkJ5<@B+jaTzLYyRrP$Aa@$g04%^Yq+k3*kB7~)T^e{ zO0;D9`X>ho;W24pjxNRj#l33>ZgT@U$;{tJCwPC^q?CK{1;~lg87evIJ6+j|u_EDJ z>v<#2FkG9hd%aQCV}?LZp;jwfKbmjvOmyQ${ZPhmv8?hAn9R&#Vtk9*%`25;&4@d! z`MNhk{#aU-P!eU(0~6Zbs;W$O@g|k_HMtK^F*dydjWLuEN^L$QP*?bM3WmLLth)OA zE^t=d9Fgo|e{G00chsUlcI|ux;_%aiEbqQ%p&{Hk_KJzIJfXVdoxu~U)91{xi(a{7 z{h_o5ZS2++dmUTFk@9yXR_^-8WkfRVuQ1_=!l<+Rt={r9IWASJ?DsUyonkp{6&&EM z=c824-gixT7j-*lod;YAcOiB&6x~XD|AXG7Q&x?!`pM*^aqOkNZGsJs$@+t)MP2nb z34Yz%j!;-KIrT{T*mBSN^@&!!pG>DX?FZ=dE+VxSD^Md*AFLcu0E zk|Zsfkd5(cU5{2aSYy`e#1znk0}_7#hznmna~FHNlh|T4H$Q_MaVd7391xLjblwK3 zT`G<`eF^j=9zkg9(hV6pZp~VeA1j?&mcxUGFxwens|LtjUV-7Bx=ESD=5v?VTHxX@ z#s|6(`U)soy}RU{C8p6VOh+5!q|W zB#=;&`I;AK0;@9Vi>gdAEvU+?^^|vV6Mru!QF`4Yds<{#%XbRi{z!G{o26+Dos&Kt ztst&nKT+Y(%dr0Ypi(&1u^qM z&)dxTo9|hndD-Z13pZL84>>!kovAQPsd|%lC7VNT*Iu7aTFUAL-i$;_6qf5vt?!rR zwd7eQ#b_m5G~Wiq1*QESPiqX}p#y-D&QCLlOG>Bf5*o}8eX z&E>g5SDJ}1gN>CFvyy%0Yd=5^1WtHja?^J&n{~dtlHZn^`Ev@n2=4;2VxLT^=@@i< z@-jj|p-YN%A+ioJ%CtO8*%Q(_Qx_r->VPp4G77%-Q#`2e{6&JeuOgb1(Z%FHt42%w zuh7P6SyENEqMYPL&^=u@+Bx?XQliGjI@8}Ch`D-H(r@Dx?<6DDhzwD!46Pdcv|*cT z6@+4dCe8?Lo!GogJo()N#Qb} zMuoGLVi=vUf)#SCXIQHDbV?Vc7gP{|VTC;Q#sWe<6m2a@M=-%V?NY)tbo!Xo*IGX` zx#o+N7Tz%;Qv$HLxIr65wV8>XpA>hzK0Jkifjf6>WeO88xqyJ?Ai~dfQ0~NRe&IRQ z?MVJ4IEd@<&W{G5q^)>{{zFb+Fgv%Z?HW@7sV(SLjFO--*eKI)0DFFinrEalb!e_k z%3Ma;-nV)H-G*3fJnq@+@Y#x?7MaR5MofV;uUc>Jvo3g>J2|;D&wz47kV0yIONrqS zcF+o%x#*O(9YbLOb@7lE3Zo$+Nn5(00~1{5^s=spt&1Bh2JQXASbdKZM?g^t$M@yc z`yjt0>$DI1)3tJ{<=z6rp=4d>zZ1Y~+L9U#mksg!S@VyQ*e3NAwqutq7#%e;2eQcIA{|4-aQgd1a5bT#`# znH!3F$**gisJb?$hls>Xz@mhjc6y@Br+)ujv>Bba_S)&7$_&sCF)|6W>?@$`c1rFfTWwCh?n7oh>^;AO zXtyA9boIUFKuc%R1y)~0_Er&vlxP`|RA7Q4_X)l=u(2xm-$IU8(qztH<6e$iA>N|~ ze*e+;Mgg`;yVVQ&_ga6PpmKv{d#bsYK;C;Yv zecW14w}a5yW-Em_e*be6pJ77Na_~B3)>$`cz~A>mTyGmY=*(z^PxGKvvhUxar<3+= zw56Y}1XeCskW12bV`hBAM7n!8bLg3|w(N%jH4MrfMd`Y*zP;jptzBCGG4|T;f@TJ`y2KH=Sjl@>Gq-QWFaw1?c(6IgKU>c~iQAJXl5me> z+&S-TX#L%I?S0^a6U`P?V$qmku&%srsFC0F|6e0~(xMToxCA&gqommz)X*ksdJr%V^D5uS$`H;&(= z`1qBt8E=Pw_$pPn$7Iz=hc(U>oX^g<;LB0XnAG1lFGDJBQ(Vo{} z9(24t<%yPh$yOReudLdvz3~3TsIyGrW&6NTJRi3zTqAr6v z#2&AY!^oTe55TtDAbEJkxhGyJRO6cCuF#j{M&9zmZDxD^2pv@WgEQE5-%^7z9L(0K zL5qNHXOP{ja0hCXJ$k4m^%)MDj_;ih!n`^OIn6N0f2v3x>#mXcCyJy*gcRb2oIhi7b0(!yZ#jF!h8^ap{x;Iud$I69(9G5nZZz+`{I!|5Zq!r2Y zFYz~Ey7~p5nQI?7o&88N>#ufBSB&z99eByDnD0E#10nvjmso`JIs~xs`izXLR|0H( zUc}|ITY*Rfc7eAtn`~&1XmL9~1e?P>fkk~bZt*kJo6d4b=e76e&)h6B(i2`Ud#Yq- zI6)d6=qIR4kilb0X>rweC>_8*k3Qe5arA+N{83i*_@hzo((@=Upn4S`LlEV}^{8D2 zlF%7ZfMaK_llH0a4_s3O&S>SZ4$e)O(u{v0AXM7VbbA z{1Z(T&|k>@Ips}r=Wqn_Go+`#9PE28v*>LEjlEaY4L)z#4#NPHI$Iq6MtW~Yj75=W zo`E{Nrp&+OGGT(I+-(-}aDXtRK6!+S!@0dh^ugQd(T@gHVgOprikq8P zN%EO)GCIBYJRXt5Pkq-XO%z`yq1n{YRXlW9&nX3UZ@9P8orHFXUj@uUd3 z-92EZ5a-&eY!QvFns?(EvIXh_oVQ})*QhTa)vcL7%ujg(=M9?xC(SFRT>tg`RWbtV zITs-Vo$*4>UogE1ArLp7G2y%|9_;tPuWvX{ToT(jHTvDl(R>~jdf!S))NVklE6lK} zDfnU@3XmWK*G+FH_k}G;C9k?ni0PIpRjQ%Yfz9tP+u7bYK!&|sAf;2)+3fX#-8KhpE^u0oSzE#Qn4 zkwtJ~U&PjI9lGpH=V=ItkzxcNFe$mPQmO4hXvueu=yF-;OB@BccMC9b6_GJs6Rv#=1A^C)VwD4-4M zW}0T|#eh&hMPSn2Jn=%&uq%orTe`owVmshW_+k)xI>T)w>8eOkdE^(Lx`FZw&Ckn!??dGxg2A54&o96?;?Y;spy4R2$&CrqKB zhqcT)P`%I7l|yjf9T-}b2jRYk!tFOQoOTnKR%d_9`R(TR*>xBiZn_Hy4^IgeGjAC|GNAOFDD$`FW6tkpGsUg1>0dsQ7q$jEsc3W04H4MEWs#3|JNpyCC=;N*uL29f z1@E=HZ`J%f(HlpE+o1|3^0L8rDyYktoOj}jVG8ku{FMS8$BR3|1|vhH|7{-q_ z-md9r?Ge~iz~IF`ZbJ1jlsUS_$O6%K1u}SC7p?X4-T-&%y`b-IOg5YTQXd(#|3yAB zPqd;)Z8m@8V(@^{3E?u0>$vNf{%S|e#+>iG8^%qO;i>XJhdXAvT&u!Q>OH5PsWQzzP)q4tODOuJ3fuH%vIfHVxd z%}|mz+x_!3HLa`RGTxhN_=o}TvxedXn%qK!Z*WP-pJe%7Q(*fjuh2FFXoxg8^mU8{ zoiA^nLr{1zJIL0BSrKfi0_ft$?2^3`r8S%6?4rbv|2GE{eTOW14WID%x*-6-&e-ML zC{x&92h*W8p`OJHfu7?X_>w^iarnpBJ@7(RJoJ8n;M??p%P*STRl{g3>A-MDPE@M^^w-M^Y>968NC(44+ZFoCnzFutI_n;Iq(b z`^*9<tN2n2E91FUO5kBUb7tjuCCNmg0-EFp%ZURu= z+LBiZh$~<&rGidF0hlO4V~VouUess*{pAHZ$5LZ_w$&m>*+{rzw=bo9z=`PqTuW1` zS@S5S#jXBG32s2*fe;%E59=q(}y&f+Xf~sXrvp(`osFOI8d&s z?u`-{&ulIg2MRL&#R`FsGdj0gn&jb8{{XrIeJ2V!d~-p8#o}Z2%NNwE zVUnW>UubF_s|&GfH(SE*pV{5=T{sF?cH}_+a_+)ic3 zc2D>R$HIO%e|{b#4K^!mXyrEd)8@Q5csmOk8@C@+CCuat?xFnJncl2w2z%)Mk|43& zw$10ui#*PjqqItKk`}>cCwadzUUMg_EWH{}F+y|Uyf?wh6svUOKKCM-LfBZ_wO6M= z8>o$PXD0_TtrVmJOB`A=^c`rXm zKoNl_h^=}rED-JDBzWvq4MpTy6N`V!HVOBGcV+<;DXUBY$Z|N4SvhS>?m}2OxYZSXeT@+^cC=L6lr8;`yDQ8v5n+?n80*4hQ z+^R={-sJ1=_!-^$_btK|3^MoR{YCqu2-ljX6`!`PK~sPx!%A4Kphk-Ea_ue zfi~*qCd3N&Nb2|Wl|+BYRQ?{OdUQQdSN>#j+cP4Yn*Y&J=nZg=I)izNYQB5z zB;pagTJF#3yMAJj-hI(SpeF-}K%_bW$B1uZI4+5f>t--pW><@Z+c-%z)kqw-t2oV& zIPz{qB^uC1Sk^ajz9E4N=Ay_x7$Bq?5Z_UNxP?=Q3A zYniCHF;KQN&v|7a4z9ti6Zsuonbl(7Q+t{qV>2fapXr<&oSZ|cat$V%~zI_vr(f=T_e zc?*8PZTHYy^BB2iH)4X)ItQj_d^`t1QZ~lQvaPO#Pz2TFRpiiV9S6@X(y# zDNPiglUu|bv$aVPj=ScZ@U=)rkW5SDZ2+0Ry-$A!R8qc#v`dW)Zt$CS6~V8+_Gkfj z?wu(9T;I`L^@|hu>Qb(L;MjYq11SJvnO;zck9a0tAn?myc8nu;jFwlMN!%3$p_Ut# zVT4+mDS&6)cGpm#@iPa1oztjXWZdrlixZCK{SHZu7dM*Fr*R82pe%@-Tv)Ea+r#a0 z*v*OP+S5oO9j*F32Ga|6{XH~>Rdd>i)1pl=Ox^u*isn_s+2jG(V4}^b4}RQHzCcj{ zE;L}3b3>s3=GUT)BerSKCwtnIPh)v1kiTILV3qDAU!4w5x~_TRTY_OM_!GkIaDLYR zmCpzctbOh`gUbJ@Gip-O{E{I7J&ao>eH9;n=y#0uXatAoNi{^T%Xu^a>z}GdT3U6C zSjR(e9RI!47=S@{sQJvAlpAxrlgSB;Bpdg#;%5R&PxI(r172IL-k#y8D!jsQxzHY& z3(9UCV9RV*<^SlGAq`Q(kvPW9OPUGpn`95OJ9p@~85${@^sr-%aH6r_Xq?_dp5Tl-IZzAs7uj`)r{sk9SyZJE(gTB!)2Hl^BeK->< zeh@U2kSntI#I)o;5P2CCy7y5Vj62Ya0}=|%kMe#cCUz$bY0>_x?iGPqB z5kE)hVY*P9;blHOHs2vRbJ{#5(*5fsR9|zDyJr&7ZM*U0q+pxxr$Qq@HJ4umK+R?F zo(n?a?mlTdA$Il%%{ivC8m7s5_k+Z2loX+qC_(2HIb1C7Tw5gv9nt_sfK8=o<h@#jdEwo?~74XV&;^5ecN61mQ#gKtR90 zKT&(b7lSe#L}FqwH(~hjIVJi86crEfYiSw4jDLf8!p74myJoooJHwhbZdEwai@aem zU#GdLuwNq#oaN1I^f9I=9c{STINXgP1eLbPLjnG8HF;m3@EZe^@CGoGz1LOV4#!_9 zwlO3hX9wyvb#zhJJ5+tSN5s`4pdqKN(3HnWXSI~}-|6VFTj6^yeYjIPr9u+nNmZ@1 zzJ2ZffOnR_sJ~QJlked_3wh8JM8pCJ{Gof^`(PB(*IPD{8w^VV*UHjrlwR3ZCY9x>tg8p1Qg9YijfOqsvs?V z#0B&K4nXn0BXQQlNx-%>^Ps?77KwDtiR)sW_vGmk7P2fGb6}wxT;Xn5c0d{Ek2YqP zGz1v%(?zrj$RrY=_e%U5x3OR@f|mr{!l~V9RyzvB89AhQ95>Aus}17_!dsH)hqm5p zW`=1+&dLD0j)gCHg?y+aArsN>Pz*=^sv0p3+_s-Hc0C8<6g{d(xu%A7nA)6&ja&SvXI56>KSZIR(PW&Az+zF zjEjX!U>^gO!)p-Vq$OW{0mPt?UMKSHG>wV>{5|_w_NzR?SzvTvj9KNmC!DYG!%=B_ z-DBU<*1BUHGOr(vokriJ%SK#7tD?+u^9zJ_2CWH4vdQ7|!3y9dWzGWbSV4OmMiQbL|b_wrT{T z+{-bk30vJ2=ocPtAiU#qEchZXG`NKA&Y!^~XPKn|Y|7P=+^v$UuaW|F`WYhCiKkYC z;M6IT;AVr25fU8DtE#K%au+<+*_Wur02m{Gw`kv9lBzc|Pz+Ox1kYsM1b23G4p&QZ z*1j&1&5uB>dDgqF2^h&ACTd(~;3B=jrn|0>4`tOlbF?_ynWV-Nfi3-^ePu!n68teL0+q!^6T6w&t+gt1Z7bBOr{bYKPR*pMRkmpD-PN{IV!ehu0Dv?y05QB9FM#+4c)QNQb z07ryb+YtDphfNKyS@6u^E@Kij@dHkcW1dZCh;7cBNHdCyRN|o4ePZ;Wn4&Xdt=`Xc z)~G*+y6ogldk2tt*KB};nglNW2>}O^g!ahEoThc!?CLYIyKE48X*nrPB`KR|elqiB zROyBK)NA5~GsGZnamRGp(CgjDA&HZ70n?4_4?srw#+nWZn!z6Vy&$i zeEcr0RGyhGNkTwOCBND%92J{fl7Z3$Mf-Ds&c&_akkWd{xjnPxf)=8+Vy<4Zmp74< zfS>^>lOKGc0;bY57^H|Z$A3+6E@IUQ5dYsB=DkB?A#Lfd`7;nf>0Dt21rhy68ts(g z>W_X%R0CB9PoaTvQYF|j1UOz*=WsI!;-X|5h{{qZPkvR4=36F^j@`SDAV#KRh z9S@%XE4aEw(d6_gQY7*jjOJrw;sqjPq&GUcb815G^6$rFIfZ!lCscVKR)K{^hLaRM zKh2WLsff7S8#SOp3>aGVe+>1NZt%mV;@sdQa`OeTirnx$x1+rF*NBikJa>muSd797 zO0Evk1P3+rIW`vGd{^=fzL>F|B>nmLBuR@_cE5GwdP8ih60Y$=%eN$6Z04FyhokWF z=G;!qDUf{TSMsOtD#N!>Vj~mft5fsqJL$q6MKa8c5N z1M?S6Z{*Sv^C`w(0OUMwx;h62qY1-GAHbSv4pR+oy(nG?zsh3am2AT1p!au}D_U4l z4PE0QM&rOV#(QvpzbexEqNNvwf5Lo|hfe__P2O%P1eGcUNK+bP{ebsZB+PE{k(M)e zcjx4$HDGnwkO6+^0!!S(hqTZGw|{_jyA9%`&YWG+8$NB0K>;4xR$J$~GJ@}Mx{SIe z4BT4F;Sz&-R9j6Fm!-J+)2lZa-F*>dTzIyhi=|AIrrM_a@m1X6x_BlFeIeLy@~yf* z*m>aiL=tSDM-Ztwi9Y@Yc=-RpF2%BH&7iTD?8y?M_p zovTe#rhWWXwBxQJw#N<%PXf{hV~lv}83sCrM~qfGosl|JIcjPm2ZRt55p4tSAI^g2 zd}qxQ+`ne~o}ddx^M*0QmMSBc!{pe^+7p$X%eAQ)assF~!t2-G*Yh`O#r35SICAZx zc@znPHSC*~XJo(cUyTB_2W<37Z#W7oO!N3lHq0Nm><|&&{PJH)>4Inze+8l5Hj;;ZL?qIw_i&SBb&ugauBYrgh{uN6bizC$ zZ-tlmtK4IooEIr#Sh?Ugssk7iei9Z+>j&*YT(4p{))mB(E~8o`TO#XR33^)=B5w2( zN+g@`R2dJ)Dhm<#p`3*)D<_cj4UpYJ#YZEbzJkQIj9O$A4)p<^heaXOG`-K#{taUk zNFwFlH|Thv8I}cCYi@H08IjfGzbuKGSPys;SmijLST63wuSUyYXB75@-O2|tuI+uq zc+Rda8-;t10vpI%hG;FcGL?EpWZ@U{%9$L^ZbZrlwnc0a#l7xIi@A`~#Ap> zJ{2Ta5%B28bOHN^J)6CRQ~jrhT{ViAF_@#=YJeNhSAfG_yG^cgyxr>2BY8mF6d*e` zdv2WChwa4nlhD56`L>ap2a9iHtXMLx|q6{#5w%A*u)k4Mt zU774e^6-XlT6Rdbd$qndFHk5KaXpP2n`lzl+5_jdPxoHDmA2@}mZMM~Lr}}n3TF)M zeL^i7Vi5@w|6}1jdJFS&{tzKsZFgxEgfT?*0l1;*Ed-EKPVb7DZ-U9orx5(`1D-fw#YDz4J)?o66 z)Zuj#@A8*#9=hNsK8o9)dt-L?5z$=H;G#aS32Xy-B5S-Wo8g@W@+_XzQ?k zM)|+pT@Eo%wP;T38|YD?6PJ3Uv4Dk~h;p`5do&iA?V@u>e{M#~!;sP~4!W%ih zq^~ar8O*-duc9mF+6YE;i^JVT&Lz+vHtumU@LwFO?{EgkNq|>n!neS8rGNQcIJ%gX z;SK+L7z2oR&5j+y(QOo>FsB5eSagFvgG%(7P4^Vs-lAo*iD<~WhiOELM(RyuWN=$S zMh_1cx^%d2Pq+>&e5ROYfCnpKFz;wa{83P{!61&tZ_l!c65Y%Q^bcvuib2AbN&qp| zkFgEv0V0Q2=?esAF@zBk&6gHV+8WwD+_y_qMInM|LxgF}rSIcrN7iWfD!=<4dzK5h zGF9~TdfpkPdtXUT?Z7qTzrbEJ@4yvY2GpnGA zh?{Q%I;a)#w-0_AaEpQt5lkgSKhWkLg&NyiLF3cwKyddIMgHt$|X z!t>_Y^tu05Q*+~EZNSg10Aab$?pufNY7<1}h3VuY8HS@g<1SD-f~TUh$YuXuCD{79 z>)Y6P(2O+aV*fqoy3=`~Nj6LxYkZhI77F%qHohC2%@4jiHDQQulo_&_qpMj{Am2ap z;&*gzBL4~Ej&Gis{@{xfFr`J}YuHP|sov7m89^{sgk$K%g_)_dp@=T;U$*;%Z>tTZ zxkehJUQPFq@67mIenb*2GSaxWi0&ZU7xdS}TPZ?|OBoe#{0yzX80Qu%o^w7lfOo$j z+fV0DTgk96>{z|jJrW*jB)1_L}@k9v13bpS3_E zCj*0Mbd1ncsW$8{-k5TCP6Z4jy6-IIymB7qlu^D-eV9ZTg<&&m7!P3*3+{7nP8xC< zAk4zGiY!LI1#*NP)W-1Yf4i(zp3MpxC{?g_4HFE83GtMROnRwgZy{PK4;d1(VhvgFTQNdZ5oL)pxh<9A0MKuMR#92IDKkpGiVp*=84$uxiWAf%0<5}s$5#ZB_&I~?KP!%SkAw+&VL>_y4M}7k zxt!kn=OzeMSaMh6%1i_Vt$mILD$B7d&Inou| zaNok2XH{+Zt{7%vwQR-ia+s?miq3#xyUVMK<7mnVtBWfta~0?#Dk)ZAcGM|iXlnkd z%q-P%{c{>inb?!-_|_eG-k2U7y2iKm_bf?MU{Zio29o`LU7i=Q4HTv;LH!Cx+smP;AezN>^+iRnH@_)uAF@C%1L{d6|`JRU|*d3zcQyvYll>=-|4uFyYu$h%*EO?#1Jo1`W<^`%6<@_3qoy z>|7!KEle9tgS(sHqWj|MV-22;uNj~xYtg@NPlWPEAH=foAv{lw`4337bRi*hpN0E( z=-&UX%Vx$c3(XRg2h4sgdf>0lw~y8b@bwy#39k$9O)`O1qt26<&#B6Oa85l6x|?$OhSuN4D(YkH4S1eo5e=0En_U0fQhMWuyk& zWbL9k8%osuz=|V5Sl_?>8L5u&hy-%p5rx2btWRj*1!6V*B)3u;1clWTYi5Ww3#i1X|_xL=AzZ$^+ECc4kxXZZrD=$%ITwsDfR=ed1p5tplcS*#^C-X&Iy0% z({0~y6`Qot*q=3zQ~w029+`9un+ZlC1fZ*%M_Gwa=!Bnp%8Il-=V6r7}Ze4yL|1NGw2U);S@55 zPinx>vfLA>>2vH-(gaLE>(TLWfJVL{PFIIeP%ck4H?1jH#8;p@noi_@7H;6YR_jS~ zaJ8oxH>@!DTati}B8C}0mn`U?;rUM0CJJ%KNGla>$|$c5UbQUZSI4j16#6vG-vce8 zT(ROl#e_8TUAz(rrmt4DEc$eTVZhhW8_#~eEPWt=eZ9W^4Vlb@t) z`H8Vq`D0_Q6d7W-EBhv6v>L_qp<`J;>3r3b_9>}isO+gCo1UrD6+?7f2|DuQ&4hPz zQ@$n;e|N9>$su+Q&IIhbxtG;ncv$UBY7VJ}5;}dK}$qxTy`{?nId3tV00KQ(1Lm~ERq`)ww|LP@zr_@qPn(6~0LuTlq1@W=hA371d*W)3W_pN8 z!$Z@nug6woj;0WVP`zK^?}rxTzVPLF`D;P?LUhn+DrNN3WH;*K=dyz-i&M5M@4v+xx9~Wt@+!^r3{l3%IwAOYhJ~3=ZcS&#m ze_Z(kL_WpDFL<4z@1{2dn9g!j4c2k@-&8d`K>B&D&x1K@J?ziHOT30;FpbzEs-~Ik zX6mzX0{~Dd)9$U*9-w1T4fq~5+Wbp6v>QuewSSTSckdmFtWzy7|ZM zdA(QUyJEL^xeCnmFG_CoeZ5+e5}XM4DqOXeFxA73hM_F zO5~iS9pUYJKRW9r+DjQ|(Fb(k`u)8Wwep}{t)v8o)7|MWZjiksxj_7)L9ygayNzs~ z6R@)!cT)7&J2T4066-S#oJfjzF)Tu#Fa)3U5v9`XNdB9FTa+Rpa7G^hMI2~B7{+eL zF8zJyJH(vEPR4PzBr_=kj=das=1(ngPMpS~O;0!gXefS^`vOyFt0#u-1J-VBc|3`1BP# zua1+1b|s{Rvly(I89(tyi2+FP^vE9dVLK&u{$J6;OuRHk5zrYnZ{*gzGVLpSj)IO= zd=^DUW7##q>nbpzS=6y*-yN>=&q?#=mM-YeGT6CFeA0x zE(U20i$?L?Lln^=;|DckW$LO9b55)Rnn#j7KW$wlF+E`=2cb`hq@Iix9<qp|#V-Ej6O4IHopTz{7YW3gSH}Vo)euDD znjaG5786TD*)%a0e&f|ZECeVRu){;A|1^QzuIBsl`S(TbKczQ7eIHHprU!Y&@z1ZR zHlWZk2AVR1Wq4IWie}OK*&Tb^FX8Dny)%o+ePu8O9+w~Dl3Gyxq~Siwkf%jM6N84R z_(5J5hanC&B0GH20%YW%q9zxV&-saPX zu&*5cUMt!VNwjf~_BOpNQ-+m*dHtqF|2Qs;TfXpDbpS2Zy8)*HG z3%_VJzWqaiFhbpJol%#S{}-f2B?Ppow-a$uv10$Z1&=sM_{K%0XyJ|pRdY6347NJl z)^k<-blAibLq{AVLd2({S|;Q56mb?E{{bpetlnGaSb`ZqQ=f!$C{sM>eK5G%+L9qr zTagJ}BP$OBhvX(b3mp_)pL3Gw*$bI=A@mr;1~k?Op+61q-@jSxQd8k+0Wa{- z)oVQ|biabyw>p7`O<;6#b0-bd;fJj1!6>nYMrg~h6n9Hkx565tp|_A8XVX|E^V92g z%0(Gd(kW0&VTLVueNZgD>kjo}yYfoXM!sJ|id;zpP}3v0{H$3ZY0o^& zD36|{)<%jeLwE}v2kQVz(h(kD-e!K!(=6i9`+8%AZxtA_DiD1^M=z_W+T&w93!j zSTfudWmsl@g#mAYLVi$JN+mh08gRf*h;~u4WcwYvg>E8kv-{pi8f zEubKo3CcTQp&-e2D+6_%f{6a5L))ok7csEWeUpK8vWtu>LO>Li_2We5<8$xZanUe*(a6Zc1F`w{@Zl zM>uB_ta}=-9443p61Ci=QmRYgcruFI>^B)QS~n#ap9ryYqnY2Jl1;aD)fH%uuc}x7 zLd(79049R$z4|zH7kDoTt}ScK(miJ4)Mo43)V>-IR4-?-*hM5x2h% zdGuwGt6o*$>s|qiu-*->E-=%( zgQz*a(erdIsnp#OM`a>Y2aWYOA7)Yu7z4PBe2;CNh6rb3<4rXAryT?6O#`gJ6gAr1 zHm1F+dk_fo9%8r6s564gGoDq?{H^T@_yxJpVJW4%I&C*!l+6h}W8@2XH|u7Hn7z+r zV$Owfb#TojTlZsSG+wCjxM`NY9dj>YwfuTeDIfw7BIyb9D1D@%NLp=Rzi^P`xqsPNbq^yX$#Cc zZ*$PY5Fa~)6n^r5V>2p;Q8t_7Rvw&3Vzq6MVULrt{uK59-bU^9(DBLiOsJfQ$X^Fy zY=m)}4?P7Zf>dVX6aU#S5mQYVi}#g{pU>CVoV=e>8wAe=MdCX$uc;F&-dO&c(nop^ z@iZ6MTja<+S44eChy{I6Re{NqpyGmTm#3OiLV|#J2FFY1v|LgGfz5;gdxh2FIm;zD zvXa&e9RbW|=2#Aa$QG;}e83wOgh^LKyhQb%2I4brwe>*eU0IXbh0?c5w5f6F;49H4 z4iE|YDTCpcDEtA+7J;EofdMv-3B2a5bNUgZDOb|o=~FvG`mT?Yu`6IR<^D}Ue4cc> zUj@8tORMNXa`N)-k4?XuS{Cm1!1>a2a1QrbdmQSVW;grS<$V;2AWJZi;64l-K?mX- z|8AtfyeHCVPlQ(>1DbLjt(dv0bs#C8g^EKLMVe=XB)5HKyE~T0cONOf%pz3ULq8J3 zo7B5haf~!}kPZ%W&WZJ%`d3ehkz$1Sm|TIFPHym=fCOUfOCM00fwRd4Qn_~4w`wq_ zk6FQb>=}8*|0TybO4~6jG4X;Q44XPTnS|+INBazfp(kMwXrAzDx_YHIrhFFT$Y0ym z|8LMHnG@Q*+VQIk?aG6;l%K0}#tMAXoYT-N?#z(h_Xmgt1X)GBT1}WcW6H3Ar;_-i zXW@vtb??2t(wo1QW27+WX>W4|TQH_PagE)WnsN;>c(K@v6)2B6)!}t4Aojqu*5y#7 zN8azcyWM#ONB@s+Uv2#VNv4aXi^_uQW%bJ}0&;&YkP@N48UQmb(+_a>!4k7&$woHG zE9bU7T5AWHNYSarnd$V?f|7I1$5svt=LawRu|3lbbsrJ52*YFWDWsE6XNIPH;+T5U zfSPy-M_RN>45Z1F=>y;=f43qq1EdeOj+Yt5Ex6qzT`t?(I|HdBsv9*9ZEiGK#ZP7Q zuP!%eW#JF;=|TpQXh#F9+HptyRmP#WlD!1N-n=MZcr$BDG!ZqyIHPTHym2>wViYd5 z)t)Pol0>a(TKbxk4pYdV`!o$*G$(XcpG&Wpb{Y*y;j^1{$c2lbM|JeydZ{K{VOMqv zoc|1DbiUW5wc3h)tNG1vqvgwJuGajc?bMNY3s>T6v3PfoU$*G#E-0t?K(R*K7!ufGbRLO7hd!SxoHK;eJ|id|DMiPA(8hOQNwmTy9c+ritf``)EscA6 zt1o9bQ%%oBKq-|#tO_k$vg&4h9%x|z#x)#qpw-*B3LB*-=!S&d&<)XtPpxm$-jGG6 zr~R5lBtvA!^eGEjpPfl3%qHYxvKbEvMauwwdon^rCY(~@h`Gr&9W039J59cva)maq z8}1hb!k6X&x*KO2OkJ@a_hD@H9DR_RK5|v<|Dbbk0gKv1VDrt*MR~U1!s^>;58K@P z475X=%7UjCTEsSoImNlJNCHdU(4b9z%WI0)?VkQV{?q$Y^%zo=L;CnmNRek#Z3ukx zJ21@$b^<_G=_31muse=sAz4_(Q8w$KR`@9fZ?T1Zq(lJfioA|=#Nfm1Jzma>jHQ#FZ40ebm zHhJ-~Hud(D>=A{yJFv0%;-RV^d2&x`3Go?NI|CxxKbmp4%m2`?+%(8lvtA~|JlvKdLA$g?Ezfz)Zj+6tw=N)funl5|_ zpFvyXY$9do&wmVAv=JL|P@UZkF=8S6q=Ek@2jk>=;EZ8WU#m8)PCuASB$g3gNTa{u z@3kq}OK+pR!!0Jr@7x?kUpH?4X@Yo>I8<6kP~Afl39P>Eu=AoCgFl4NtKE%jV<|o} zi22W;nTEL`1z=rCH%TR%P_7zMT9^|~)8heYKTejUc-zF+qZxUt_^?_Y4>$d>&{(8~+1~9ziGRHrYEdtV zmMvK=!oZ7D%kHW8gO+)OnG49dIj z8KjCJ$KxP8x+(tuq@5iQAAU~Ev?gl9$_)vk?!2nC1HHmUY{>KIO6Jb zjWK5Csst|dqEw@TIf?wajFT8mdwBs9Z>CXv0mkfb*b7SRoz;O3`a72r|N>VMT9@5bC`<_sZUepOav4AFkBdD7D^5tp&LPk^A#fJ>M}BT z4wL~S2Z0Rqnk}mMs=^D}_Epm7`g35PbY*|L<+$TtpxF3qBc6LC&45-EzegSVpd>LL z(Hi2DP1qtOKh3I^gVQNTqb-AF3Tmbm!gn^5Q*nI7szY65EdM40>wR&(!QtM2eyW_IX? zH1b=U8U;1ncj>G*c@}t`ib{N3Q7OF<>`DSI)v+$ul_^VlLu^&7v5=CGuAcmjm1zHy zaW#g7xU9~5$GUP0VV^I^Wh!x%ATR`Fx|~!kx4}6}HINk!B+Ga*DyrYmj`4 zSf0(riI+@tLl)3eep8taLkdyPW3J@azww{uS0sBdTbZtL&9U3shSS$yfV3PqI}Pk< zo2?b=X$_<0Q5BpJ&UO6JGr8_JXpMFoAoty`rj|%WvaSI|vde?{MYnzds{q!p*#BiH zr95>SDHODQ4@~R<*5La4Cs)`)_5=$vvX-Ob0T)@Chs6GZx={xw3jWY37L{v3q3(Fs z`z)vHtZoZHgJ{Us^U$bpReDLmi)UgSG_u*V3IaKAJcrRucomi`CAMc9o6JVn z3S7^Hc2rJ{YA&0xZKQu_Z#{6(EifKy`Gp`DX+2bV!@G>pR2c5SHA_ zxK{7r(**=}*yasST}eJpcXF>`$85;NkATsnyV*mL%|8d{gc2t)F~+M%M^4SAaM$8K zYuZ*kRkOk$XnMN^g9MzJFN`RYZJU|o#Y8WAdwSFYP)!vx)|iZF;*P&sb#Nckmoyq) z?i$Y!+H!QqN?fs-+O=DRPD=AUGZngNM*yd<2D-^O92q{0Fw-bczv|S1OZu=qPZw9V zpu^hf6lOEeqZS7F_6?Ed=CnKZlA@EOh{dgu27-pa$`Vn_D>FWbmYx(amEGIN;Aegc z+f>6J)O1qw=VLh7Bcxa3pavtXZ!QHlyG!4a31v|)Op6MmPR8w%3EU5RaWJ^i&3!+O z6f;k*ep{d;VNe?x3qYKbfNJMB|FUBj2DSh*vu3DzSQIhpvtI^l;o zjcH(W@y;<4KjaVx#JVO=J5!pK+<<`E(U~3miN5!EZbJmN#M?ocebvwR46t2z5_<2` z5&*FH_SCr)tRP?BWtk4f{ONZ)TgcZ8gBLl56d|nRvuX*2yl`?`navnERqIu?|6Vp4 zRIbLO`(l&lX|Vi<255?H8Or&ZpG|vWxd81=G^MepkbbeG#@4@L^!!R7ohEQWI3MCM zqnYRCNT_F1ebx_?ZHfM3&;bvsz-etjJ{7y3rvX&n_D+&GApxQP@1MejA>bo+q^fZd zFjz-de*H)GLbFz@2fO-}e1~Z8#CBLf(uSlMXKjGTcCK}xTJ-Zvo>hFlsA$p2F6}c6 zPcoWuE4zI2o52!p&C{HE#}z$IrLcJjL)s7)PfVGR#wO1WxO|1DapD5>yFCD3pff4B zzQr%i{;lyRn7G$D?f`pa{7otvbdcN`>7|T?WvX|1CIgQ)mtZL*QYRU{b%SX%A9@?+ z45m(Lp*^t9BsuPL#-YYX(p&Bn z1W66DXO9*K;jKWO#zC(f=7PJe?z4Nj&@8ChpN)U6kZC5 zInI?!aEDBHT9l=pV~`R2qt^JaDYP(njZ+s0J|l52G(#m#?y@e3g;={$(gYHE0)e|E zIU+Q}vuD*uBfZzK`3clWev6HfS39MWR;-%Mq$nI@iFegD4+N=bdsTmDnQ~qR#hIxc z-hS!wFDgIVduyP1myv_M6S*kj`(=Ir#ly9c0wyW6?PSQhwzv73u^rdY1a zh!G}={&4_N-CR;y9LZ3|)@n^J7=r!5pV+`GfL*^TD62D+@Tr#mI!BA&~@tNqWz;RV^Sh_;oppZba)?a_tS zRS@;ofv!7XhOa88%t+LM`*N~cYAkB83(4kc4!#Uh=dpV+dhs`avW<1c>x8`hBBNKv z4A3_RnPO<~B(r6=UUcHR3%B#Cu4p#@kjjLGDRt}LFECNR09;lvp?|H5YM@)fA<92}sVXU6f2{@F|jJtbSv zQzf|JkYoL`W1-END)V`F5o3+Pd4nMjjD z@X~!)FJ=T7LBXcY-RU{PVWfT4;)@ymUy2Fw9VZ_AU;$41*{$@~leGeeO~(t7-;pWv zOU>B;17=Ue(Id=tt(*i@`!!Eoj{IghFjLA_<%|DgK|S}CIijZ_Xg#XUu$;^aIQVb= zmX^wkcR0vBwnS3q>oO*GIjgMspTkyC?6V)JUlE9DH-m)&yw?YZ*WA7j#+Lc|PX#Te z?r8mkb9zs8X^6X6boIo~Gl2n5ih5TZ%V;xXi{^mzvjdH(k$)f?ZXIsurHMK&-y)>) zWUUyz5EscEa`VPIC1%P_&wq)(Q85_SNB8R#4SDg9hp*Yq5no1M-&C8enUwz}q{|#M zx3_zQQSmF}JtDg1xQLLG1Y~k&Zdm!4<@dYe1MGSh;Xk`}Cd1iqFY%qX2}0b&(ussr zyzVSOpbRUtdeF22k-hK_xMLQZNE#fcK1<>fFcwRT-nW_v* zKzte*dJ{c5*0M0nNwdnizMytoJn>7OQ$3;FGrzQSMAPg&Q@}{DrQQa~Hi`-tICgx& za0vu+(elyu*l?-ai&iUDtD~T*a2G3kM{CKJmB76CH)uaYJypeuZ+sIS)s8Q9^a}`! zgh+>=J_Bpv&L(QzR_MK_$R#WWcg&d6+hBE&LdNOeGfpu{f2OUF0_8+mZZ) zU(Kf5osy7-Cgx}wh&UpyzEyp$4Oq#oH3U5$+&i6T*Lf!JZ$UM zGcz7P?b3k;hyeW@Bn}0*A0C}XgQa;J|1`x>J5|1cY}ESOQEngI=L@zha!RWkY>rDE zw|)K|+(X8H@Z^T>Dq&lhr5Wgv=poh`+@Tzd4;rT%KEVdfC|Yau%OKDFQ*tb5osWqI zbIwkDww%(UE3#J>vS+6yTZ^{pRSaZhEj_mbOi-o(d#AK_^0X#XYhH2IZR?cgEchbG zyJb07pkn@Hj_X@0?9(Nr$<|&txBb34>=e3tzXD0JoI>ZW zbL;3H^+M?jz{Kz`KF3agq16a{!Qb6p(z!kYi*=95L*cvo54g+q0gm%)WYx*~{f)=m`oKP&|CSmu0!DF{>#72!qTY z!pf7Z2?Z5s@eXqN49eN~%}aOG%nLypFsTzWl1MZAr)I&_Q_aHh$JK68;~Z9R62mgHmyyk zw-lj9Tegg^x+i~ul|`8QkjWsJyb<>)6LI}%5H6-uGm=KbX63-7hoXPU`d_!%*lOpE=^442%ni~uVQ-N3|$ zh5-d4m}VFgQN|D42oOb)&0>yBq&FgY;Pg0LSZ_|plT^sB38zsVA#LQ;SeLJJY+BV{ zk8QcOZ&S2ui})&}*>WS5{L;I*43~43N^%~&OLf~}M|)@{4dhTfN#s5&ec(!DP73sX z&92}8kEI%v7BUZXnOeFDdIBq~3g-qOeCy7J8@8p{S7INN(ct)RxxNcz zM+0a2aAxa;R*vgx6xqZcD^KrARARvUt2}cWz}oT{tlL5yt`ixqB171_b>hE!VtSe9 zu(D@{8bDkfQc4-A7lqGSp^9LY3rPG?#9(nq@-$swGDV>T3S3@^%0v~y|PLLLz|Bc+$DyGvmBJ6%>kp=Se$r@HSo@sSPyBDJM z)#f9>C}GNI2WTGbuOwmTT3W=(5d{sz`$s&Vh-zF1fEKdov+K9eC$7EuT=*CIRQ@1 zZW5#UtZs9D!w>~AcVhJxXpsWUq$70|ZlCY%zq9;guM@g#K8Gl%8-d;@D>w#5X4g!* z`y4b)z7iOsqe9~s?1XXuhQ)YOHrWkBrCc|Q;#t`dQmsr8lDKGb^Vh(o#v}4BONHP9 zR^q-?%*Y$CHDX z`b%)kOgkg+fxY+*|FUw(+9uep4l*D4kcef{;m9o0h z&VdL!n@wBT=eY9xSRpPSVvDEEIH$`iK~v~aZ69H*)vPfR%ZLcN$0o?WVrgzbn5?oh zBg;F#M&TWSp^u;QY96^D(hdel(fV;B6X|(WRE}Qb@7dgrs2y0z&^s?cV=YKB%nD4z zryWRv2W|7i9(r`3EgSro#oU$Isr{+M~DVVk1_-#^%|8?4;NGTJb2Ht45l(lJn@4`AnCdY66C9h`1;q{Jh( z%D}HajEYW%HLs|xS6xzC&R&5*O(;itkFN0>#Or@nIhHAXmZa$!qr3e_Sms8L4a4iy z;iX-|49}1*-n-(j(D?*(Zxi~T1XiI`i3ZUOnMg4~pvy7XZ-EsyE6z|P1%`K-BP@9r zEY4C$`ZDvqx~v!y*jAVob-sqN!?FdPy(vyA@DD7mq!NWILh?kNjJfe!p1fBJjNNTe z(+0B{gR9+ewNW`+W}`{G>TGaqQcJyS>4Ml}nI&B1XG!k1TWH2!TX+x&^ubhanT`i` zl1sXPbfp@a9(Sno`OYccOkl?+#2%6|Ouze_uglRrl9jID=g|R@cif#;+{;+w8iVY+pQc1#+O79z1x%h9vrrQQ zjs@?W5-z-(uR$UxJkqiG)$jo0lRJ27D7vx6p0Vxr5^ik<)AX?Bm6fDDCx-pQ_1fxz z1oHU4!0SQA2}APVKU)GwORpSEWWLfy%jH0sl4m$Q8b@92f_g%PG#gC3#U$o6#btNY zqoIj)H#tXxFf@q`&&de(vR+%8sTVJ+4rhEKX^6!;QpammiA6^2K6<&7N z4{+G}X?yj~qfAdPH=kQ$^uV*8%)PI;%~mT`1*{Pm`X}I&a8@N6AXO*)rs1W0Wb)SE z%yL7cEi~)n7lW^)&4=q7@lk`;>XA;IoeYDYrF6v{R?5=*)aa4H z*tK5NlIMH%Z>8eU060L$zqIU;s|TyF!L9`JLA=H0E`XnPhO*=Oda8*1^Y6c{)LrzF zKekgPCQ}7xKX-Y)L_S+hJqS zAjeW0`MN0{V_N1QE^_-v{S602zfCF-<8H`OIpDgvu;Yv*!-=7WqB>Zz5!&oUzU3*@Ghs>h(1 zzd)cA=w(S=2!52S}r4|=Xc|+r@ z{8{uN4VOkD;*#!)_50B6w*av&wc*aCSJCz^^`IjNxdmjdTmwAne1#qToNHMMAz%{A^%fdq#w~n&XXwDku^<03QzklGK_Cnna zVTi9YqUMogD-=Q{iqO}7*_iK4!~`q8{_ltNF_0%Jf^8 z%+NOlyONBNf14d%^mu$pTjQW^9nDN5TV%1K;R}IVauhR1Qz#(HYZ!eiUyD2$;YbcL zjlClibs&zRY}@>ehV}~?70lg5R`wONxEfNu<{I~1fvEp1xq7%<;jHwvPFylalN{@H zn@XPIq+q2_pJR@fW}z*J>s>T7W;Vo4R>a!3N>#_QE8GMtrwSsAqK@IbO&^BsrP9+B zvFBdX6HU`(?>bjN6|W1o&_qStT%e7>|Kf06ve1h!@N75C71k_YU{4v??G8Fp%yehw zVPTe8jF>+_kMwrhn&>izX#nqrTJpdJN+Y`0t-D?sbpvlXr#xlD`SctTtw^bZNpnP( zhJ%-hsw#_`Tbs2ExQi=El%=G)?Yz7VyE3w3ttzIm-~PK6e?6?YfLoWb@pj7%ZmFmW zvxE*vs@=w?&4#DP#*cbmfs7{W_%F<6|&1Crxu zZ<;Gz8Fa?HH<#@0wK)p$FKoRB3&Pd(Fc|q_XHUd+;OW? zMZ6T$?>$Tzcu*(ha6uzACrvyFo^@ly@1!@dpf!gKqo6Iq1GbrJg-At?g*E2K%&H%{ zsSA#Sj-;WE!fT^*miY}G1(}m5UtYx6g=AC1Yi?K zz{N>`2ot%4Y|9Y=)X^_iqy(hFqf`|{BjVbGCED<%pG#J67xmO!yzSt!LQ49}==4BkqcUi8y(yQP`66O_Wx-w7Z@^S~w{FkKZ@7TgPI}x@1!_=#bo4Uh z>in083ry#5V$b}VKbKN@-Y(<)?DJ|5>3lD`=$&)go^R7$UUj5qYV$g$kpKU!AoH#L z|8NSQ+jH_5D0O`tI2dU_9r9VVmqZgEGpd!ZZaz$&5yWD#b7;*0LV+hz0$y-S+C|)q zo($$Q^4`ZqEbB>sJ}M^~w4$ZimOM zbn1xvUi?k-i%g;TMfDzjdryf4&@*m@fxvoTJ_ZgP221a9X)tx2CAa&5!yChEW5(V+ z0xZvXjII0O<9z{48dBC;zs66Ht8V(l7!+H8+TH zuZS-G=a{TKHC$p!J;9|;LBt`fRp~Zf9n{fHUe4qs`_)&RW-533%Z_LSo)1fuM`b(z zuFX3-pc0BER9|t@>agVt=sk*p&Xept7O2|qc@(GtL47otR+gWPS|}>7>T#t|u@Hjq zaNEa>iLBmwqBb;>Rt9(@A>}=&?WujMo@Xyb>J4oas6rf(m|l>|pl)@#(h&Uh^)7*V zIKcx-qM1cby9=P_{t^mpvpPql914RbEzYKqUT0+t9PReR(q187K|t3~#6PK#~trFkrr{h}&!S?ltd8HT558%{X{xX@@>~ zG3tt20Z??LW4d$)qHFC-Fm$r|X3W)Wn3b0U^%dVc-*SO$K95GZ^mVNmh{_VgO%nN^ z@Lh?_Z=K?xZ^NA+NUWq8&k#~Xo%kd=bWs+$O`Q+MfeS7pPYJMPpbz(w{zGcSt^zTWdN zmIK=Cg8Y%?Cq?qKg3_<})~v}b8tw}N-KjQ~hPVjS8{5ax#1hEJE|B53pk)4)5FL{c z#r>GzTfLS1o;78qd}9|BW2S!{ip%m$aR>p9Xi~QLie^SyK!UHbOL{xHa-Pc5|24zF z167{NeIdk%f8pf}8=1=i8OXQS*6LGeERZBTJDJ7b<1IvQFgRk8jCfLSZVK1$R_u;@ zyF(8ioP$ZJ>ycyPVm!**82eCm;<;|j5$_?cD+D4cYx7kE&LkGqcM=LyfBC88h9n0o z8b_9yWr-xXu@QWCm2LJ2+fmr&j?df~>=cnTfs-5&RHvS(=r~rup|2^X9lEsNvSXM!fb$zt{pIPLolpL`~+)P>nEV@VoxTLNgGrWC$|ck%AhFEo8~g4DLnx#!(C zDS~xt8E3)`XHuSd-PNomdl&8en-9>}vb51X z@L!0}>)onfl>ZWq2A1=+P+s_0u6W;Ro-nnJvjYlmi&3Az0+M^y-1*iBPDVJSiNIth zMQs)g;18X>Hv%g!VA11x{3_^*t_Ha!_H+j&W@M-Eklh>A|AIxat$})u?A8^y-JwBx zJrN!)b^0ai`)NoMrQnHQ=nU4547yb@%t3CH3Q8lHib64l3HPaK3H zcGMxY7eL(EfCPVD)MI9A7x zW4ELp$x2!t^qX6O@($HaaaSDv|LrF^|5zH0Fz!HU9qkG96#BkpY^&-~?H<7+?kjM* z7sXv;k@129&$2kJH!-ut8IMiWJ^K!-bA)=6?Hb)qr3i#u+J_?bWewAziPxH@<6*Vr z{t5BwF5APs*dj^IuUj;_cr0s@_z~dj3nJ*Tw%@seI_bsBa4pUo1~({Cnpqm2eX^RV2R+jQ!dId88%7uinnCk zN!?x{k#DqQSM6QMEEBJMe-VRpW2oZ8#OT?V&=X};=WO7zRnLqhtE`bwA zhlj|A(+%TzUSk8TbS13FO{=2wI>WT?kD`zVxZ@Y^bWXvliOQfoi?A;xzROjd zi?DY{HW9p42C(=B11SE-P5X{^V>sjtL9}!*>JdMwu#W$h7Je@C@|%MDg;%b{h~Ezo z>zM8e7}F`<-HPk$%-2R6$G49N2JV1kfUYwDJx*yWj!S3s`rMep*$rNAY!1WXZ8AA5 z5qwj*PAD&VzdJN*PHa=-KHwN@Uxk3cZkPCpPikIeVIg-jvj~}kQe9p>ayWDSwX(Mf zdFi9ps;Q38u##G(-c}^ILt43=%Z;usF+!TCuH3&V`iBPGUnRmJBf(PLA9J`qh@w63n42Cc!rJB(B^`iTvssLBTRp2!GpMnTRDxJ8W?wNBS;8bP@%L$F?3bob96v(99Ph_AN|XTyOQRj? zu-P4PArRAFisWbJqgtxcJmC1Zm+Ci0!?I@ibU$1E%Y2g1PB~`xe97BRl7JH?f){2G zCJ{8wWTJ7IA?hnleO=WUa?=aBsWbK0tv})W$NMo1FWl_^xqb%YW#WNTn86TU_ST)L3K9gAh-OAve$9*$!oCZ5 z$3Ca;!*2SHRp&To#?VvU@fdgd8Mux$?^R%n6OJI^a@i=lKB#x zw}zwD6&P7p&a z7`;>1|Ck9$J;Q~sADV%doT%Z&_|6ocEo7q0|> zBI3K{td|0*uW*Ze@utt?{Q#~rTfH%^8)yfi=`^l|-X+|WBKGF;g`^%Ip~B-!;e-my zZQy<^NSG@^Qzut+5{95u98Xa4`-1TB)ScVDaUF6R^W(+X()Qm^vQjjPfYWhIS`M{} zI3Yo#f=t`C8lP0Dm1z*?*C0XP9OZqR~;`MYw;sXKy!9QzDw`@;*l4%*G--kW0;qw5Qp@G zq{&o-)u|D!5}Y=`fv_MgV~aB5M@kPW!2--Nxpq9weV7 zXg`x#QG)EcFVlB$*glkiquE{8YKx*0?Vdu;^VaUMg~+Y}euQ&cv8c7T}0vHNcHFa2K&ENjG{8>V{^Z-=UqGC7Z_sM81~ z-eLS8GlPd7M#-aiIUhc+XD}p{FQlorZh3s=FA+Q=wS@IpdQI z)|#1tUzn0sx{>mc*Rv{IKLoBVQWy?pAFXK}M4mrSN zXgU=H4^=e`n83E4rxY+9+La!A1i$3%UJRPc&&iK{(gJIMF5e!xfY$4{K0-kfSx zkq9l?!+Fb0?3eZnYgO?J*Emp7?$>yMo4{)6kWDq?{wQS=P!l57>#)Pq|+=A^uXLBBy$ns zz#TYIFBHkNAYlPFh35FH$b1lT7{gVpr5I|)c)ZVAM~31E;u9_;3KzpJ8}YYwE)xYW z=wW{CIo|_6qUo?XVUI_RA#kV{%2wIN*b#OU^7NvPmsq%3}bWjoHSP_bjUd4cF!^!b_80!u68-3qd9dLy; zs34f?IRFv-veO{;(-|w7gU0c%b38lpJ- zDOdHmWDy~85j;cN9mS{hq%EA+y&zkzDTrLRFaVBq)4riRa!ncqIm*^?1%<68a&al6 zMvLb(hKcj@X@GPZTZTsw=elqQ}J9xb=g*V0ymAa<&HqC0wn;8&5IdBG@t;9rlhrc1WMoq(=*V z#{or(qsKcP(UjJ?V{Y!xMhw6DQyO*g*}~+P?R(aq8&L{55jno!#I2lJph}$;@Kd^5 z4AYm5(%}YrB2M9NV}P+$$GiEKOHka2zA75)D;3o-RO>NMkX^KW=vwcaG8AqoC zgQNg5%3mDY%L=(?L)&p#9D0@FUsQlJT+V?G1rFIoYU|nB7z-z(AQ)G@2XWG#NF2`e<{Zea!IQ08MCZ0Y91M(iK$X*t6~1 zu=h;Fm*Rz%^EC6HxaD1G1FQqAd?-U=O@s4$xQE%4J1qtKh?Vud5j%Lb>A2YW3`R33`!M?5h$tzx=koRm?;DORf}(r4DOglbwf zY9?ac3i6hV+`6(R&io6KuQ_=YxIqjoL^3<2;}5?Z+@&sR>RCTlm+ub7N!*2TC@~aT zmc*^7bOT8s6>QHGar~7|1H%5y;su5*3C(8}OSY*E20yTMVd;=D(SW136YyH3CDFmH z%L<3XdIW`cP_<2(h#CStFO?G?i&2ZZDw|M;Hb_uCp^U^?zr9=Tbx?CT+z?@_S{@R6 zEUW@VH|!};4f;<4Am)_x_9WHL$uuQ_g%Wl4?@nx_Mg*i;-hE#zjN{e}0odskM898@ z|Lkwm4&CwCCCpm!HPw5xu!z~faBC}Wip?3<;1Ot<7W$dq-B&)jy{n^4*=MCnF`Hw3 zM!-CjiWJ~L@tnD7zq8LHO-;3pRJu|2pIDU3hK*Ac)8Ay=Ql@XpQt-ZGbC1i^Pthyi zCq|f|A!gipniC>-(Tc1+U2I{G96TOD=~vn(TzW=77wdGq7--s2MnYS%zB1d?(I`nU z{)DSn5jusrW{BBumYzE6Ui%jH(vX;tC(zOT8eTRxv%S{ZMkGOoKq#LscG>6Sh5>+n zWb6_I({L(@?ZfOOi{fQQ%6~`VcFR;YE9)gPg@y+)530*y+;d5*H7}39e-ZVVQd4nA zmr5Ve9^b4O3I>EU09;csGh=YMHjLnoY$G<(m$dECC3*O!Xoja=xG4(#kBi3Yt)iv~Hm*)9_Fr|p8+PY2vD}a$ByrbQ3X-@!31}KBdUDy#^D1ReK`$U5K zww=fEK!p8bqR87!Kq=ZFU@IT}UizRvA9Ya}H>1Pfk;I$}(3*a8G+^=73bBm!#5SY( z2SqSl4>^B4WGE{&%QV*bq6+B^Q>OtC3v85HK-a=%(LtP{8Mi{7QvRnIc!5(LicQuu z3#!s`P3CH5WwOW>^Oqa-fx((GXm5t4x|ic6wlyY`z|ug!an3K{!R0BC_UbM5nE{sJ zIvH14q-{>(qSF^5S0vpD*tBme>(9jg_t*yHbb2Bxo9~tFUjb5;D;JBg-78f6J~fk5 zDHsE3aXU|DX|ccluCz7wZ})NhaWm488Ka5>x~`g4RY7Ra4?;C|6)wAy(`z4+{b!v; zPkn#elov7H{(-op(?l8t814I&hPv6`F)pEbK$W+i!2ca&vdq~rYxm!0CiX+ zq36sALPGAAq($V7L4#VSW@cUr!tQFMQ_TVY%228mnm@_j;C^@+{*gyhU5CF%D)gy6M`|3-auc)e_|{z`gn zxnOS3S=M98w+>sE$H!x^^$WQ@2qBTawIEb=`Fc!sNpCst?{Yb-IdXqy4`sSHk?=F) zy%J1*eOj;f^TaJ_kI~WU_@lN2;^T?0sB#W^L!z70qj(<4s=j`9)#t~6w(IkcI1;-Z zb#ElO#*oHDh9u=Stqw)gwFK3c^D6z@MaRwqvxj3xcR+4Z={5a^$iP}E$LIPuj7R4M zsi~&X+l+2!-Vcr+XMB)*0+>kczstpEury*57g^^gKRF)AIv7vVZ=S+b%L)rM3-{5*z){2uH@@lh8U@2 zXNGqraDzQG0hb#Hez^FpEnQNI7qrsGZVk#ectWu@ZN<*qg4Q{K3Gg`?6TEb4!BALt z?1-@AchdFJuq#wtYY{!6fSdjQYu7#jw&Tm)JMyeP1kF!tG7WRKF=N~?7d~@#H@S}T zRbWSZpuRe#WJ}PmCV0Ngi2_?rfN_a(t0%Ai@#W>Pl^um%6ArA0Likmd=OVw%kHfGo z*6>WYLm-D(XNyYxPO*HeJsK>C-t-YU4fL>Z?|Z<7!j?HMuqh%$&}Z0-zWNiqU<@qq znDv3u>P+CbkH%4WB&_fIncrLh;cAMsEq(LuO7aP7$1p)9XX~YGWNY)r4eW&)pXR8F zg_&-J&@$Bgl0Nq~E?)^?t){ct)=xSl4tCHGk@;(q1Sb@GTsU_Wz+;t!&pd33cQYTj zZ%?_W4|{-z1*onJ3-*1Q+FE{}7D)fOp#K0=I|0956vf}kqQ%fQFH~!4?$I;m=*~_t z4^)pHPOZe!N|eFAhN*+2-_p5TO*9I|M&}io)z*~jT@_mnG5in!X>MI=3fQE9Q~ zasc2gP|Y6FpmH>HAsoQX7`WjLD%Kfx6EuBf;seRk7>g-5+-OQy_){i1k_aw}s~L<*h%?>F zpfkYKi~BNJ^AF49t;F7ZO-Ga=la==LdlWT08h~c8H)=00RrZ30^orxh0e@LfGNy%Gck3YO3j(|Y2rQ~@%e%n-dRISMudNdFt%>`K;j9MN>o zB%V|ro;B8s;kH`mjW?@oW)5TuLvi|&C+>$&O)GIPaDoEk+4(xUPk_W~ za`e8tfgd3*2DMpkbyGP>k#76c)YZB}4G%V-;$ifsOcF#_%vm^$B8O9L3Gp1CP7hOD zZPY*dB-5|NV!}a}a&N5+vFn%w3jVTr{H`*O+*-Cl1RL(r51V}H|OP2JqA>uy&VgEHJjbv|?b>T^Y3{3`$nz0(srg)Ys ziC#FArr2H21+GFcWE+JOqsQhesDZZh1ddnoDHs+v+_{)Km!pSJOyd82oNt75TUai9 z&`M08lr=u2%cW&%Nf*jMH)2u!7NqY!wWNY*zY9!9FX@gFGTQStxtWw=V5C)cr~`Zx0V(e4IvAbES&TskB?fBz;VO=8CxuECy8-82sW7Suol zb<0E}u01C7(FT=h36sQooG4$ZPU?xk>b!p~c=~h++)aTg0uCGYu*sxZ50>;Yu>#$( zJ?RKz$E;ACaPo!+b@;zx+~esg_|n|Kcl!#muGWDY+qKOyH)k1=(-H_|j%KXxf=$MSMam+ zy5N5J8FAM%-4ql0h}y4+INvZn?0c7Oo)LBc<*>bxP++&3pV<%pV|@(?$vAZr56>|g zp~#E%Hl>?O#m*P4mFSv`k!W}?yxyx&xjYp83L?nf{<=F#2&{&Ozmw@}E2Rw7v;6;( z?an}bmfXqqY1n9J6F!g0%mpPhnGYet6sra@hk-{hlzBJy<-T5z^BX<9uuk6oFc+x> zWbvKQk`L*v7vss%yv@J0-EK3xIGnj+&#Q+=iU@at&Sc0Y&;IW$@_g-j2X}V9VLzW! z+~f{=KCD==(+PMBE9q1r@3o;FQobsPX?P zjw3m4$h>-?&LRQeh6>b0LnO|Q*whD6s0dL>QSiT*BHHmyB}b1i{pNGWJrC3<*$TTUrHYkwLj-h1Ynqp>hT zkBoh}VAx^ZxDo?efOGRogh|?ZdbI$Xf|*df4R4`4>m%=EAPV_iL#d#+9lK5sg0BEE z-gdx@$mx_(J!=2|?hB;1#|>yRwNYO0Yg5fcSBd)U35Ys>?u@{Rub$hiRG#yyP|ej= zRUW<|qHcjD2i4lLIo;QzUi<%_^ejZ9q`tT*uKAfnF!M`T%wb@rl84ESB>_F=(Br2# z-zy94V`j9OltAq3N^(iFESD zg?SCvo9I30C(g$b$JVzLPGCjpmQp?SN_f>q?sQdHsWaJG9$DCiY zgU-z3J)#~zrZsw^R=7}MTI!dXSNBW#DU<^i{L<{yaal)PYDPu#Gwn|YLc1Tg?3jdE z_6ylv<5n{9H^YTGy%MCcWM-_+EoVKhqHW>O7*b2p4U`cDzM>$fvW{Mmpqr^1ddF*AWNrtPPH&-^-?JHOWq$vGKm=OPNMBw5U!$S2Q;7S%)eC~*5cfy=AL~j zAYp(FnWbeLfS0Fow>hioylmvEn$e}gLq&gBx`P1;rDT0y8C8M(lyRhP7CX1c zHjKURJ_#=?+&j*;w_o}9?&NROgw)=mi{*GR5`))REh&1^eF2^LnUlZ>CvBH$yB@d^ z#UW}7SwU*XrI4lmO$4t@B!~w-6J!uj-7gGk6~O!7p?10(qjco-0c?8389Xr?UpMJl zN6UFM-;2EMQ;U=^7$fF_&_)aVMyY7;wSr~xtVhc*P{I0CItWC#PAxcS?O5Bf&bcEy zp7|}Gb<4=}L${e{+~b(FU79P%4XNCgJ-MywZvc_tar;>!X2Z=X@pw-Il;#B<5$PX~NvWHwMYvI9#d(M#*+$AY-8|$d6icG=he-gq2eFwcu)$yK3cC|A@XIl?~e(+Oa@iF~Pv_pAt<2&cJ zoF$>MW0`_`Ky=#C=ioq-^c4 zx#Fd5Ulqs$>PuT3Sd$HPL%+vkDKA@nd|}0Bmc>yNOwqTr7=^1$v%!(C;C>_U0rY!( zN8No5|g;zS5yNQ%okj*KtQV;Wd*s-S=Vfm7wy#^_3V=c&A0BU=El>>$*m1t-Al z7<`%jHQ6d|HuV2Bgbk+(8H}^i6mh2mDtG900qg%;wBxIpvS+vs8NkzNB@c3}=U-1c z(=cu&Ab&!SZWVFAN55+Cq}Xo-2?-w!t3dzv6I@kEiudU^ym3~njZ(7Ax{;im-pURT z1~V}mNzBNDJt|Lr%4gb%m5h-UKl5KEiy|(Z>@2+-gh;s-9!_C2g>zxP-RuiLB-css zpjFd5b#9=N#UbY~^T8CZ9wyU+$fC@Rx*6h~0`cgPlU0pse&e)~&S&FzH(OFLbvX_F z_FxuthE~DM&HFutIgSQmkMLDMPT>-N6H+j#9gKHIsX)0bE67_kyIH6We-P+QS9IG; z$(|yYMt|5tpS^D{cU&bsoAVuJ3x#zC{$^4d+dk+8_gps_fs>ipi#hR?hd#1A-^ot# zKYu&|AuE>{x(QLKWe3oFo>h%M)#uh+sW?75)g;NP;Yi``7}O>!E4F`JxcYJ#i2@f^ z2f6A=`GGYXXrb3U`D08X5;Ua==4pAutRe?>vYqKN?Vu=8bGiimINKb@sPAY>Tvz|r zRbEj~ZXeFgFri^t{Aq)IHighoj%T%G&KY^p zUn?l7jL+d+&<@*di&H9km#R5?8fVVz``O~?A!p0%I$5?Vh%O&I^al0GMj1=eq|2V! zIAuy8t+HdxY11ufE(W_doXrj=;)G9q1Pw)|YwA1QyuIW_HkWzwVq{y~RX`^`{3b&6X`qaIlZn-e+FQdkC6{igYRwhWzR`9g--adM$O4m5R6aQ6_j@7fdXKS~ z*Hm_4Mxq1_kK^rLUx3MCPxwhoQNUXH?A5H~g%$&8xiusn4;(@i$+mFQN7cI9{52nx za+HUES0>>IHSvHZLW~?Kc-vetZEe;$gSgk{c=oif)rNz38k+}(S~7vkqsNgdx&uZr zSf=sQHWjy@tQ2aS_#tf1t$QSFwTt0_Ul$^td_NEzgVwniWc2Xsk)xsRVQ6k zG0uI>CWM+OH*@Xxc~EvAl|*hPdFnE>L-X*yZGyQJpaIl_x7OUUEw2}@ zjW4s%#Gr;G_L8zh1RU~Skf&9UBbWCEVj<__{1Sx+LcQA3XY!RmpCf>RFWXQS4=dZs zmO%3HnW23sa7J9lCj;X8$@qqpbCdZ+LkY@GczqfD|6fO5)H{te!2C(os%o!7e=fq+EgoeeA_OV zqti`I*o}wuBY}mRg2;=1k)MyyO6LQk1sFm<7sk#HRE$G=;Ru^9hl2Z924Xg1)cV$I zJv+XQC3XHAgpJOQf9&go%*umr!+PIJnyG%cMg9heQ?Ep{EOe+4V>8x4aV;V5@} zV=W#!z;R--KMTiQ2+a!-do^DF`kwG;lAhUcnK>($JXmZ?dT45}pT_aJZMQa-i+flm zirGBelb+-_7{7*spUcb0Ybu~tfEg!2LZ9*oUv_hXp=Z6WsXRfd5T`ZrnOw9_$OY2P z)?&ke`t(L#U*oNwTMul60#}20p_FKOEdbQ_Y-ykn2dhA;7G=Qxo|Ayr!ve{`(W1ud z1De1L{gKQvMsf3Tt*bv>H$1lM6y8X-^L6&&_CAT($DzYcpGMNk;u9YJ0-Jyic1|yM z+17!ZPB}E4@GbWC3FQ*iH-Xq}jTQF)CROb|$b4b|kaWW6PC`lW<(g#UTzn1OfP`39 zp9NNfnxAQpBSK#=!xo`Uw{^Bzh;O*I3mmy`?_nCBeLQ@M?S6Hbrj8lFc9Ax zNgu5{aj?Tb@RZF|h{&*NfKBPL-srZkKlzVc|Li`)(0s>ZERMniNC8makED#YmeuZ$ znx$HCp%mJ)8B_lX8hy3h_h%kK0&8&h*0vzkOTW{oc$MJTYq3mO?FDuA$y2BPHwlWL zRF^3SZny=mJRCh`(SGqpT#hymM0yx-ia^;az&6R70ll9{lyT^OIB&9n_Qq6B#2|YCy&Z_Q%m97~MHiic_YsvdeWrH6*%-+mD-! zcUGMwv*Jr|nq^<=nced$qrQcYLQHni-fkL+O#(ZXSYM@XKMGg;sl~xYGr#6m*dT!Y>G4ze5|VW0@G@hi(QQF zt{gbrr?)lqWV{oqr$4LCT&`fM;FVA^PpMm>|LQK@U&u2KGy$7?9SwC|X!y3nkLocT zv0aJoG>7K$Rt`YrOoPywQ@&)nEmgbU`VV?SDk zy2~aWj$UT zT^V)?!E10q$S^;ol8!JqqNqiJZbOpDjp?XW4jzKT>gfsPxbCZo9eF@wN*%qatr&#~;qoi(X&DozKq`vNO9Y~lxM0XcB^ zMV=oaz9?tLtIZ5>^?(f~NHviNDX2RxlHyo3FEFZHl5NPe^Igk^hKrMsla1Zt?Th1IloFgz(%xO21z{3&8WD)^d-< zp7iesa`Mp+NN799Hnr2?E`l1}RDK zVF$;(-o!wL23jg4WWFcmu(WfMie&x}V=iW&TOJA|t( z3k^JCAV+e!cT;f^`$V2HMy(b zj=&A6uyTJq<$vb8$uSVmwIg-c8**4!KSs)$;JZQT@d4{IV6rb1sT<#SBFHV%YJk@f z>}ki&(v9Pcj{}YE4Dholr=Xm{mca-oeo%yYC4-_5$kNTx7S_LO^ zdj7oTC{NA4ArBKTLE+3${f|AD!sF2pWeG*Z*UPH~%ZnLouz&)&E9i$!MG5VI^6zrk z_f=-e1zQQ|O}*8EnQ4{#Vi0@W9ag<2l-a$MB~#6$(74fR$Q7}#>bHu@%~ON;F5qAE0*aOr`l{d>6DyU|ifIPH~IR10k(FPma?HcOWhP}njj82qdUP$kSEnC(`f$|Y_~ z+7jFegjTDSP@W&T)?t@51bJk_ZXs%4Gv^C?=pm#r11%#u>EM@2tcM)i+}WX(+UW#` zC~f^qru-4?)Huu)!5DagRkj$QBR7O=AnQRF@Y!3ibo!z!_k_EJ+9CzkD68z?C$zvvM~paGXKRb@IGb$ADTH=XdeZA zZXtABi%IZp$271(cM>rQzt2AoGlBlpp+&`K{_@F=aT_f*;Za>ewq3jfiU@C0S!Yu2x8#u>Z%ERfUpZQ8dY0@*1RB@^-WgB8{fBt?Sa6) z8l_Xo{hbuBUg3JnR9ry0dMx$mgDS^%o=vg!G|yS!-W)iVSPAJe#!n4Cd#m;sL$9>! zo`YqbdPwg%7Wnn2sm_p*Tj5`66allD)(hQsMO?suR6`{c_KkXTw$H$(0pAhI+wSAU z}5BDO&j_g-V;XKZpl@^?}9f4co0`Alhkl!H^ z@~)?Gq{!V&bY!jtkJublXQEP}s44=CJ#dDF-KM^H9Q(+-7{I5C$W>OCB0h{2*1cYK zk}R_iE1GCpOgn7aoGEW~xgjKb+w@Vrby~JeVPeL2VQA~VyaCL*WLgBvS&)asiTjcq zi8E9qXn+5_oMJwyrsB6AAJkGb!)9(3XE~$e`of=~tM4wIr3Ydfc!>xW#(&K_@&hgF zuuGj!^H!tMqw6s%DjV+@N<1DJJtOQ2^dB65Q+~W2UfLhhFW9s(oXns+BsJ%JO3!w1 z3^7tTI$DQ1BGIR@U5gtD#~))T!$An^QD*mQxSFP~%xPED2xlm3GHH?1L#WPpB*)7` z8)HqB%PnpBr5cCTZiqx679;z0yF*jU_wH#y-@uYoF;0;{Yj|jxznNmlGg!G(iV!cf zSB;M%byW2eax~AxNY zW0ZswHOP7+vqFPQIBnv@$^~qSRqO^Nspo(Wi8pF+Nthc4sLdacaauiDsxvSPAU|v9 zxtN-M!dyUja)nU6RyZY+B1`|fv-*-_!60y>Up1}9cu7nnI#@XSS{8MkB5-{MgOv3@3IV{7EqgjuLaDiZQMihd3q`); z!rqvgsdp}~gU&otbLHk=4y%RX$^^l@;{c~E#My`9C}@Y?sGe*EM;1po+JY$a9+dH^ za$H$4-|tgL*eFd+s~MPUp-n z8Op(AJ@hpUkw0Jyg~*zVHRJf+EJZ*3olN0f@J5~sVOIhvNcJ8J&*;51qnZGnQ@6Kn z$H&8gGYG{0FMPqqsUl2(UP|75nN3__jt51#r(j+Go->O-HX@}=M|{H4sJ+OGcl-3> zW81;)w&3Oq@s29F#(QI$c6YBmBGG~`np=HTlbr{>N1xPDTJp?3EUqO4PffN*8Qq8H zZEyM!jzll-H#n$ z2yK;J_rUj=@@-?0b$-6}{~y?GVWLz)J%opg!S?)dv=t_|p=Itv;20YDlcqH}uwYe} zMD4`koZ?blBrWsZS)@gMF$JRJOr&=6lDO1~q8iKod;91kT96Sv^* z8XSUqaCdiicXxNYkhQ+G_c?dpbAOy?K7*E$@m6(rjbchS$cSAu*%(Ddsm6o1I`O9} zSUMsRX+$jOv4)$iy2~`Z&+(^qQ<9>a=sQi=N&Zd=bE*tBF;DddXadYX?Rc7FpZP$g z2EytcS8pFdfldWO3?TGzsCS=VT?}m$%PTlIeqk($Wg&aZS^zBvWGn9o%8&fxAtS;2 ztXd-mKuHLdF!s}p9Q@FH)t7X7kO~nXW_ixD1(wpgLU-Fk6q>%IRb5E_QC6opcWjCg zGUUm)WSMI)Uh6^MIJQE>$r#4V8Tu0?Cd;xkVDlz##}?$s54oWIL`L599ZO?QmUg;M zak+3bX|)t{L@@K>lQTzPZ+q-=?UL%(py8-aM2ZSTpD6cn&+Ga}gY~0kr1mhn69mbs z9wun%+3wM3DGT^hk*tbw|EE^q1cj>qN^^SMMP~i&u`C#)q&j2Mw`pjD2KU;#u3way z->T)2B$aZHc)z~D!x?yRU+1f%E2=N3;Wb72IG9KJ6W`#CpQisP(%E>@(Z{QsP493^ zckSf&5F_KSZX<>Uk~39k+lucT(>6cf_);Njx#Qbc;;y;<8PF%IVrB05O3h5L`)RZ! zKE(N8xCpDNnaFxE-_kj`Zg-c@mXpY!7XYtAY;zEJ`9`3%9Of*7;A!>9YzHz)LbkQ1 zH9=1P)$)yz%P!BDBPY6~#>mpGcCFDqWC8TWP&?o#t>Ip>3)SQ+atW6KSOQKk0!zk&PKc^rb&D4M*7+mr4h0lr0I8+;UB(A6H%L(Yk z#F@3&)z#=JMCcK-v>Y9*9}q~`|2TlsjrEBx%wU5z`hnW(Y1SY|r|z`4qG#j2kD+?+ zdhNpb4{>C3{t7G%Y4W`(dvD^%yy5^B#P>>tbw4F0F_L+mWy-lF+3{{cByBL$;=}+5 zbIuMH;#H<#i$A5p*#PXxPUgZa#}s4Hk(9!-&cL>SvO|#7MaPl5_WH$z2Gr%2U?;zT z$11Ml8?u}%gvSS?BO02kz0-O_6@%xH{|5Eq`1MFH>(9> zqX`0a^qT;XpHWW2={p>7l%~s_Tz{BZ*5#WUF@5%G2&5Qr7z)+d*4Ob@(~rp|`P8^(lbNT@&4Px=CBHj! zya}|sY?I#1&qC9k^1RGdM3q;gLEdt@qZv%{4m|dS;FGW1yshlbUF#;CgiDl|8^(8A zylM(ulJ>WVZ|@Uvh!vLC?Lv!zfK=h&iZuQ$DKAUOcIk&s*BEFpyw zIqs$sUD>J{9hfiwY?2jsz6pHLGkpNt!i+L-$$YZ5-Jq79-T5TjM~S*is~a!ntHwsc z;ha;kDO{Wum@8VcEE|5;;P6o0h7=e8rhc%*nyP?i&@6}hFku|TD zB@-o)ohh6~Wu>JQ%01M^dQz7}kA7O@pjJMI8rg39E!RBdX$dYcJutPiFT~RpkV;^~ zv!Rgku&T8;L_J^S^nVJ3IlbVSB)SjC42pi7*Pa=w`8@kPM$%X@ zE9nPuh^OD_AdCpq%cl$28t5>n4}|DJ5Dy*P9jE;mZu+Kq9J7BrUrn-8jTP#Md+`YY zM0<_vH9wFovhxS3aARK_KSLt2X3*5no9xs5T6AgzB5>Xu)*|@p!$fexy+87XK7qoV zv!3jc&K3h&&1UXNIO2h3Ar_;bs7z`r=UTYX47POwcC4A@Ye;C}V5RxVwmQA~~ zmlwNHs*&G=CaWS%%}8}NB_u1iNUmBc)$4pIqcO#OK2eJhEl;;PWS{`F%X*R`bztK} z=JvO<7FCTN8~p)%{q!jrru@dZ8LDdrw8ii5#V!{6$_Lga#_PVI-zJE+jiB*32g2(5 z`MBCbkhSjhw%p)+gu_gfh$3(Ai24xvkoo+QC}M2k!5$-zd^qh&w5(?(dv$1k^hv3p zS|%$rg5#rB-?qNBxiiTfH41UAQv4qX@b{(fNrgH(MU~8F;of9AU+RiIEo@v7G-HAM%b*Ah? zbsknvY()bpFnH`%dW8%EQQYdRMg6>wvSp(g(&GDFk6qcHRX0W14DT%M7Y^M^?T=|8 zx&k+%{oR~JwzkJGz-M{ly$-MM6(04Ph>PRl3I&n=CImF_PV(#cY3K%# z5FiXGvM$mVVj;>&o&q2OJ>mKpxW^HbQBTt7c9veh*9*vP#POOu1WO%BLX0vKV;Z7@ z+QYpxO5lN)uWw=9`Mrk{JP@O-$NtaSmACgQpsxA9F8jLYo9W<5YgiWi1qI!i%4`={ zYlkQya-ObuaqBK^LPis-n>N64xWJ-`1k^_r+$CmSF62!c;XsxniSYdBc>6nq$A>LZ zLsglOw~LkO0`bXuCssoJ?|BOIFJJjJ;SY3 z2Bq3NxARG+45KNWb&%T)DN12VM4xL+jy_3c@KE`8vw5oFw`mq9K>o)+b!bGm(~$l|?WsEcC+O zzb2_S`wgCsT{y_6r~`H!)q!kUeen~zeYbiq2gy(8+{jHw8U#n)?#S{_2{Lrfb+l7|x#Yj2yjD{3h>~1}qW6*Cb5KlytMpG`7Wv)$ zYST|Ejn#RccOJv%N!KgldSB$_4xv<&xcL5|yeOQ_%%5a`SWG*$d^>ZYxGH zJagzolU|xR*?LP~QwoCrU=1Pu@+y-qV(Oo?un8bCobpCM$LSg4K!fJ%lKFn`%;Oqd z(6}q#E-qk61y&GZ+-frkl7S{-Pe0E6$vu8++i&2it8`T~!Blq!%AL7hBdoS;^85W` zqKimN(2=?gr3tzbTv~pW9LMt`31+bVg#S?l1Df-|NH^&{#9W^@0~>8z7`XTk`>6+2 zJvx{?LJ--(64w>@E}*rgw@^|N6yk#B@9A3?7>k#SvU0KKi0^y=lX_G8R87`NSTv)IjA6oJ6z#nuI&36V?-3xo;8;b zC#c19i?||XHf|?Dw%Z>06^qt_)?E{QS6iH;>L7m3h*3Bu6q%U4-0y?gYxYqqiz{@% zK4KzkDDT5gfnO&&jUporPetqf#iMIQ3A9S~lQhEX#SN-G|O-N+ek+K-F`h{_4ipcpme|&J*$0@4`95 zV8iT<7@H*7ZK-|(KSfs0AEX3TVuc#?ry%Iv#_C1dgUGo);M+iAPZfwVcRM3TVK@)A zKvohM>j~`LDm2qb5ojPkJ6}icLt*&t9H(4$w1cqeSpFLWzha=Mk1LO!YjIjjrT2H| zq8b|wMQW60hDU?sUnzvspHt&osFZ{>))Q-Dlh-uX=7vRY;eI}XqiybpA0~xZ0+3XK z8vKb?EMn3jF*-GSbN47!7#nnLYmvFd+L^bR-X9*gu|4>T>e-%)Pz3(_b819`WV>WR zhy|%a7sZc_@k3X^T%Fo05JQp!^tDB@`H}%m3X3#ow__X;B)5b7hijRnUu#@YZPyUF zNQ9ku>@<7349?82@qK;m+AzG%+Vmr{S=sE5Xh&2%A`zk%p`q|1=kK;`}{)&+ic+UFxqyCkK>>5-ZVSHv!9Jfg!8Ym}BYw1z zpqpLCH%R>N245a%{G(d$a#NUjLU2=`x6tIVI;J}`Spq~hO!*NJFKmQqTz}p%=B&*8 zWaU?u*y7uE^IcnTor!4i;z|51#Rc$uaCfTmuOV1}%@PBYSjtc!O+ zTgjL1xrX*sv%6pQw~C;ix0i4dhqniMS3H3jXnI)*g6E(|%%(@jn|FU1UZDqFTrQi{ zRTRanV3Z$8H;yqME0rjnp;`+Q{oyZdO8zIp6L|SBH_C;&ra2h;c>o)~Mj(+QX5)qV z748=Qat4wniJ1PG%yWUIg1w^9BnG2HT51)5nP$fI=`J*=I^*#~vl~_>)jNunS{wH^ z!ISCY=Vj-r-889q`_0Y6_YwIus1|XJCU(Wooz|z;(1J(Sl?nA&z7*alBXD@_eQQrY z3OwrJRFc|^R+3N|13Rn2%OnntEv+O|b`aHK_!=DJCx;bg1;+^FH)>B&Xs%ck4fAeon9(oi~ zJ;~0_TZ@_*W~$5?8G<#n|Em4IwINCetCRzz)}H$#nru334k_SpE68&{YowMt;BXQ2 z{h!TqkVeb?-8=#>zSfQV+{8e%-8X=f&!LfvN|gC7dvp z9GUO+5`?7Nd*T5kNEsVw)IsE5(Y51+p4Dm$DzC79=g724EcgBS!iX7Y{kuuwhLhn! zQG$ayl}x-(wR)qo*}zRjhoon)K_YA1+wh}1-!d%y@Y9L=`Od_SMC$i34%XHcb~StRgk{{+3SFRQC=AW(*$FjK z{h6c0vs<`LtZY%Y%PBQ!XH@Lh@gI*j=)*(o5cC2-c`_>9PBq(?AMz|qSh_FOV6I=b zgP}noKe75sfj>pA36X0R7^epYXqEwvB-;Uic)rhZ<`HFyr10u2KKUj=??2w7nW7v) z7&0Bz*w#fmYr^ET5|6G>_}E!t13l~l1I0vI4~_cw)sWq{WG5p#=bzZws{@(@&EiFn zI(4Xe?Nz#@abpz}ZYy_h)t}X{bOQzjk#fwdzb!U#h_3e;90~0H#KGxfS7GUNRtvYJ zk_VRr!yyz`GxkLT{F(ymZM)bN^rD0R-68aQuUi(lUw}v)HlHHrURk z-f#n``;9=s8xe2sE8TfA0*~L6{H1-RAHUs(u}Z^+Lbe6lceEC~V1R>PHttsmquj9D z!?v%iIALzjTHcQKgh5J(Sv;p8u6NOLRZ_gR%H_)`I(;N@;ruSaA#*Q;66rPOCTS0X zvPr9OHl+7&W&dVQ(&H9sAe0lDds$=Oo^LY^6mCIp)mVUXX5(wi#y5w^o2MxEnVDa) zoB15FhQ0+?OltOBi7-r1t#J3gx8Os!@SYMd@Cp~|jLb_p;waOeXf@f5Atgg{u(mTy zLhJ&I32UmD!$RR?y;-;uV;5W&Sa_e}ub@&Nr`_R%)m;e}1le!|QBnBz_Wx*EI-M+A zZ4jOtN-pj7z!bB(l2|7Bxlv2|reD15#WO5u z>h6Cz=_l^V#SZ%xnNY{Lv`Pi-l{krv*ohn2+d--E8{B?t1-BJIRiY@|9TL<*4@zd`=u0BdN-CUMyEE$H2R~$hecA;M z+4`D(G{{%{JK1B?sEJ8IlJx2Xl)Y08y+sXav>~+ObscjkkwNP62%Azgzyk^gka61_ z6x-L)&-C9>#X5Ql$UGH*E@<)61aGazJN#E)2Bix=>#7`MYQvdqV6`qVvj$-hu(}H; zf?$6_4>Tw9ro|o**yIGQ>c`DYCn!VJtrmq}h(p`DCoLuvb%F6oQ(2PY0&Nlk1n&oF zKn(-%osVxs)w^4+;}O6(U8!VbYk_#fpw3)Gwz+Q@qC`Q-NQqCkzcZ2y$+g-UeyYW7 zjl=Id0~=Qu?+?gQ7xwtTF&+8oAQEfoDBI+*R7`F|G!NxFQkJ%Hv&-Biu%ZtnZdkym z7N|-e!W5r9>f29CMdUSMCL~{ZP*Y}W#z;e+gWtP>9d;Xj}CwD}z zbvDUYy@&sYNB}onC-E%=tQ6FAfd1}FMail7+$L=zOgaHDjs3yM%=&`kVP!2DcYf#R zbDbZ~8?duyYdz%qv)~GANJq>AWZaxhyhdBsmuX%NtPX3`PQ4pj0_0g&HwI-O5Wo>& zU3OFf>39zM9pjulvlHV?v5W8kc9u)S>a4L|PF(v^cRXmVuh|sgPXUU~xAe;XP35t~ zTl_COrazk0i4;!WK;;KiS`G+L89ILmuPCu~T%5sci6N2pC);ePFg2AnN)4`IU!r9w z#p&BA5{lf*qOSJT(t8F~xq*!IWA)Lb>g;zJt{s1I9QC2#_%SK(O5{F%_ht`1XUAU(5GEl=C82vh*b=kG~@BDy-g z_N)s~uHs`F9o{U%--KdFZReU#)DT38RGV@99mugVEP6Cad?ng4Uo>=2D7}22TRfcq zkT7UK#=vsfk)M3fSi=#UXwY(ewewl0$uFGeC2-E+Mm9xqJbLD}2`M z0i5qAJ}l4XQ{(2c>XU?HHe1LnGg_CM+5)Q=abDuMQ z4dxO1<@xjgrB_o#;eV4$#=!PK~*rI9B(kBywXo4A0+?z8)h+)aFlu#blcws_U z5uJ1I1tR`=YVK$qEas>Ubz6Ax<}X}RrY@PssU=6RnKhzW$Ke-h2^do)fcNi8l;ZWek%+<4nW)|nrm??=oIs# z@zXzyVvA3@Fui>yX{nq4C3XeBgazF!J0ccjX6V^mA8dOe+_fC`E>F}AHrA{v z8)zB_E67U$S}PXw)+gx4?^iMC`LeT0`!zQcT{zrNAjJvXHaYlj=0>$8ea7xKY3M!V znTKRmegzlPysXVhIa7Bm_C!3`ND4?_8-=^onEZ^(1I@?SQ_-}d!VA8|Qn z%`zDb9xbtS`@|1ZKZ}yC-SdGMyGhgc^}duK;o;;6#J@47<^%b^swG&ju=xAJFE!7e zkgW}{km6jCB+6wd7(wlCvq-uNQ7Pux@n{Nz6!iJVAtQCN!?n@l z)(okbDJGY7xd8|3w#z#5IQ^)2_~vP^%NALA*iOWiHG3I5f5wm<6f$D(tyN7vYNJkG zDT|*1H5a~?!?cLu-%w!TJMsVldN>n}$%tLmiUZBHi_$22f<)W#Pz3HEE>1h@R} z)|NlPSF}E9!g4`rdtej9q#EDmJ1B&epf5gpyxMmMaek#E806EAh#Jkys`Y;_xK7! zX4Mijt^eyXpd0uA!3fT=$w~NxrXOjXX_2{D5!FbZbw^$Y#+0@8@GmXLicGp>0y>>I2Fr}^qr zkQ4msRIb|wrHA!rC8Wm|RLrP2*s;gfL%~arYl9HG$9@WBm5Vp$^CLE@)}0BGRQD`n zcj?Ke)XQr8m;M-dkmzeUTF`*2=Mw zkY4yKte#UtXgWV3Xmw}lN?W6Ht4$r!Z&g@qUd-|?#%qqI2Mi=MId(ZRasqXV1baM+m z7V}#SZ1dbV2AATkW(Qnv@erX`bnIWT-me4^s>VYdr<4)#7(Si5U?4mCK~@;mW>Vz9 zEo%4!e8CMh<#5@6!AX6h@8Fb5t!~6q&&Mq^YH}MMB;61rWX}ZMvsFMjrS@+Pb%4)B zji85?CHQfsBP2|*Io*cuoA%1Q82O_HJ_-RlbCdP^6I|1SbShLu0->h>Gsc3D6=De( z0fP3(VOqGT#Hpj>dyp$AQ-l&F$~#G+`){!T2ge>c9MXn6_1nfr%d}0f-v{ zX}#jSWs&R?zO!^FL{?~zh2CGSLGY?aEhmh9_j+v#x}r9f`NsfeUILNlxa&JaD4(CM zw@j$jIo*@ehR5sRd3mZCS6b>zU;#Ql!`?dk;0BMI60^}&R>E)_e+MNqM z=1tudke0L3xm1rod^H-2LTF;KL3R(uc#SlenmIq0aEYXpZ6D+B63FZE(Tl=(y^vJ{ z`k4a2@eVEDI2k&^BFSma>9`OyZ6{4`UY#V5Dlu6Bj6XDDx$~VGymuo`DrO{Sm)rtdusE zV?m?FA-n{DMgj+?G$Y0B(_=ob$Wz6aNE)s;h|El4UGsEqtB6L>$QL>5=EjixU; z9-A7SoB9s%*h`L2M7P)Ij9U8}xBtut!Ze4(dUi`yaZgVrv`J06rc2NSZN#%vYSzWd zchvqr`47sJPKmjtR8^jIFAopp!=~pJJhdxG`~YeZS61RKrEldZ+J?p>Cr?ZP5f0B9ghMV#|RsS`^ed zQ{@S0*Xa|5=fx)KCKtH!A3T#W$?9t_&aT#?rdEA!Mu8qc57)wzoTX(#+<7!wW0n$& zkOWuuR~S^xl$!Ui{;{pQm0q{}5Y?Sdy3Q)|Iz>{~zrISD1X@TdnqM39E+zW5RhN9n# z7sNLll#ugX#@deb9PqaIj!!{9fLk!=mck-+j-FsEC3*v`tR|aM!C@mxE!qK0g@H$( z33Kl;rjNVJnR*?t>)Ud(w#ylCztB`hAaLQd^V#{zl!lHqhmhi}_gs;Ml~nTKK2bV1 zsSq!??#C>6%>2d?r7ACdE<@8rnS>$GmN!*G8|I3aukByoW?%iexOMH#zJfw%N6UKC zNG2yVAXFs1KYirPT;Il2UEcoX{{3KB_-xNpbDTOO@wH&Xs-#Sk&HyuUWxQ-QlnamW z@`^~hmoc1`d#gGot+HQ0b8@c*SF?NzrXbx zLQzo-RZ6c2uN4@_fv&@*O}OJ?z9NHiXcH%KDjk==At>oY}BBl4h&y zoV%m%an$Cj0O>FylWx+)@yJpm{osk{D5Oc;t0tzJVFlVCzYQ^ML20VEP+~3doSYV| z9GtOq72+m!_#{M+uc$nil&3y+RlM+PqR?#SQY{#Wvu6&>EQ#(}x!s891xMPoB8i86 zs*}(0(zMC*=oIYrqlIE{G;|H0NX^`K+E3_fruVmx;!AMePYA9(0|rHwZFyoC(3gBl zf627|u@R(1HmgTk_o?uldJ{)L{yu-7fdq=I6Oio5nHFuE5 zSJ&=k_FuoG#xAE|LeLj-WcB_qSXqDHhBtpTe0%H)?O^d(mUP0~5c@8xotKZiY&*o+ z6)fEPH*MW;a!2{5>07(o^K}0SugfhssPv7|q|AmGK~&0E70KmSpXux+_!mUK--nsP zn5Wp6%_$u|R!CGqHN~AKLhMyCRtOk78%w;kDB@15&xxugupa;Kow!|#|I%pgb@RW6$HTPZWi73}>7uKEO*ZIJO2pI1Z# zpzeebwsXaUA)}R=CvqS3#9NWU zV67B{M5*_|+<&rdG*AWYpmU>LG0z7wP5UwS&Ia;KtRfQ3rz9ZvCV6m+GdH&*i1yXA zfOm<+wGuq?&qh@ON3o_(qqF-XJmW~7+_a(br1{~QI zS2Jt>rXtDumIuw_m~b*sdI1_H}8_O*tGBYkzr%{Aaw+@FoEYOD{yljOX-9s6smZ!AUh?>Z4 zmvY==AyYo3@2Sw#pIBQr9euJ4WXI8T2=hSfF@tWmUI&WZwO<<>$;$XTykF)YaVZdU zpxF4wr`bh5@vN@a(wpZpF(cEj)@~Hbpw} ztoE_aR&z($mA>oE#c9JM6nLdin1uD*HL2eb>C}Dj)g@1+&*cU89Wjt7!G&E?oF~Zu zXiXKm6zLp9ZQLHRN5eyeOD~8!8IPYuO(*-baBbTQemTv9#0xZ@|79K~&W8!{rNuiu zODzmm1!)_G7`!88c`5|==PjBvKrnkZp58+nT&0_-?ng;dlp_t^?iaz}SO-}<#R~xw zV(&rgCQuL`PjGiZmxkoh0zr#4$9_k8Pf#6r(HbLU`u4pWY}~W!CBpg+4!>TdA-*a4 z1NlP0(N~5GrRuDNV(6KHZcmn}da>X5VR)5Atdn3|=ELgY-qiKSD=S~A6aMgGpXL|T~+DDmy9m8aTfRnd>?@(rnQJ7kW5dKCvz#G&PHj# zzFMN(*sjPXq_7yy%`-55k=Sc%+i+0JZdVDZ%arfn>)qd~4ZGd@=-?Zy(X29umdXlk ztydfTh0M*}SLN5aj{0n<&7pK9TS?x3Tf7vn#$j$5t}Y3o@9;+Esm9FX)1L1`V9_sy zJ|V1al2P76OCG;e!5(z`Cz{FWR$M21SrVPUm`j^)Jh=dAMj81 zS`-V`GM|M2Sjz*9A zT9iu%VH5oIA1NvB;3hx0?3>lkexW_yNhaBAC@r8R#mU(Riai6z8Y>qT zTXG~rg-H@Gyi1L}rU1@6N#)rXLjEfO8kChlw+ipa>3l292qZ>jX>^Rc0^X(&_PWK( zWKbLP6Flxl1hA+t@SAwLVPINm&QW@u*CI!t*1RmU+mYdU>MxopT61fm$yC3kGHwoO zn$2S~OctBut^OfVoP2$+ulV12Vv+zawJ2`-_@xoNwwI&qybsAv(bbIw$pEmP!`E^K-AH-= zn!@#5(~W7~#i{fd+9+hTNjf7C58JJa>!_SL%9-VvP@NnE*b`WE9-DjKrxJCvZO0K1 z(MA^*H`wd6n_W00Fj?~!b8<5>P1Rs2r+(iQ6Fk`G+1vAR)2uq(>`}3+1u+aywWk02 zgz9>3@kM@s)9`0NY|Oby^jxI)n}5HvEg>c>T@HBEVMij~&p%S|f4=4)UVOu$Cg@WQ zFT=#lg*c}&uSCCq)+x_H+jG|z&32-TEDk4-s_h+1tnZ+2Z`Vo{W=w08D(9dyiPnR` z;(?n@_`{7!0VUJ>xKgGg8Xm#YIoT1M^?3pd89Tn0xC?4=US2-i8gD;+r&+gNI;q@P zdX<(5lJwaI8@R&R`+MMsRcOhlA?aekNRPx5 zPN~X?jW&0>G7~jdiO>3KK4n>Bzn~rjqDS#d(6f}*;nkZC%HMX6udrKo4u zI7io;Z8WED$(K~LY!}U8mKj33Y|G08e0I^#yIO(ap8}wc4w0TiV^FlqUy>E~?Bh)%Qltg%#VA zAIyW495J^}iwb>hZ$_>9dnjy`NZF`0q<)xO7i`(_;kl|j!luN z=4`cQOHfi2f8+h2ZkQ2N8rH_QU~xH;+P1mS>j1C)R!;-SHksGsaB60YF%WGNJ`-!L zqARd#dt&{ifS(YzmY~)yrM8ZtT8EvORM?bgljM&pq;~GIu87cG>7{WIdy<#2>=za6 zUd3mDE-~5A;rJMYn8P|3O-(gv7GgLxDK?Q*CKC}nP^>>jZhZGR(UQEZOt@W(Nz0)( ze(~T8o|WNRCIr-{bTYFnY(izWft+;~U;SPXqQa}L?|(fADU_KK(LV-8b2uT=lc`cEuQc_RK7~)Z z$Y>oQv6r&1fbwZ)o4f=eOwb+Hv+`+f&qMRRZGK{CJbT5NNOj-YD1*J-{bVZn4+z1< z8Vx}bq6&ZGqh1p~EZ3j2cx1LMas8A4TKr#6a%%5~d#mC636rZ5eN&dD?ZLmBAZ1~U zr?YJ2_`a2+tMD6S^Ljcw_-;p4)KyFuXlpwFR;(;ydr>;Dbsyk%am+GSXEh|!#pzyC zgd(nM_kh|e!D#HA-j5^}tKz}D9#Mk0F2*v7yO(g-+InNWp)yZ8RjP+(sgXMf!0u&5 z-Qy{Uv8e2ACW%oCJ}SCxv>nwhkGW_L@|{K=_cv3uz1!K7k&+92)DXL*WGE4L@StSf ze|h=Ul*L^WmMh2&iyCLC@r02IYoVrA`bgA6cNbMGDJOF`h*o_&piKBByQ@X6=VzT@ z{%oI|b(;&8ixpLjYBuL#PCfMgND^eKti4KB2L@sjy7OU@LjOrYf}q!1UE8X;_$le3 z$?rtcn{PoU7^HoCbR~@F_bd&g$%2%e_RXDELyz#(r)~})qRm|s#!Oeh7qDPnU; z_A=--SeIf?NxG{Pe#&ro_N0DYq-xA5y@#Gw*TOlaPegfrRN5tFzhwh0!qxg>iDV2F z(Ep}5DW_sysfGR1H#|m%I4qFgg6hRoSg-R^iTu-s@tn{ydKbA;X~k)ocE(&ZPgcma z)1istkBrllw#f;mF;U$n>_Lg;t^_ zqL(qV)OWB`09xu<$pAT|Xcdf19Oy+Y^i1psnduenjVx6N*%|1C^sL2=%uGz}|BBNK z*cljE{k#5w;G^+z2YLy6Jqt4f0V|Vt7!16;{{UzE4{#|XD-(NDLiTswcdYhC@31ZO z?2Uwt41k74yuAPR0*rI2*6fJY5<6a@~@Xs09{N%Bj|p84+b;(_KLV^ zeiEFJs{WP8n-)pHlyuk_YUC&hW3|di*Qp-6R_M&y*2DR{PUzm0HSSa0)sypnX#VRC zGYy8a7OrgIk;!!5hJ&XXol4z9Bmr>l^+wN`7b9iFRvxw3(+Z_HEc)){6(dd-R_cJGTt}|H^vd z+{}$1nb5a&ap}yhjUU-Jv~}U^!i`TK*|)Xxe;hqQgp!Xx2139bCXqsG!{ z)2t)I)RgqTY@IhpO)~EymK_jMZ{&=ez^GlYi0E!~`6XyMWC|ASjb(8zpJg*phlcL) zFZNTK^3nmC)YIxE$56?!CTWr;@kBqc82cFaTwC*#t&-=!d3v~=O7>C?IE#;@=5Q}v zPLmPlCDgbIliskHC(Gf~Wb-E&r^8{G7rAd_Wb*-{(+((@6X<5d-q89+afrg-X^nn)PffRkmNx7Wsz67N>EIr$(5U6ghM% zKVv)Cv5XuP%oeJ%sZN19DJ?m?ttCv!Hm!fnG}Q-&IBy7J5Yo zefy7y^`QtruLM-KGW%HXgdcI?Uyo1L!neZR}kCO47=O3B>zw(3kFaNs^mVaN&%*=!w zi~vG5Mn*zb){l#gkPX02$O-@uvaqoJ?Pmk95Hc}x5HhiI5VF1F`=GJ2zvFwC`M6kE z{#Aa+f5?2$|Dkcb>;I?z(f?t`2Zq1)vU2>z{J(Hz5P+LFa!Rt#_gXm|L-^f@BaJWaRJ`%^^aX2 zynp%M{q*6hf1&(G;$uYLd0F0h{+SaWnE&k)0K+@*zkmLv?_aa#AC3Q0`ClCWRr}!k zw~~Jh_@7JmcUOKm{sZK{UjGd22ZagnPwz+hF>U_U{&4=HibO>?41(aHokJ zeb24_+Vt0_@BT2b*I;F)V`gMx=3soE!|Zeb76uN6_a)58LdU_%%)$D;@;Nx@SUCV} z0D#ti;;Dd~$ahY4pp_B*-`e|DNk$eF0LuT?60jzGk2oI#{Fg(*kb;SY>AxfW7|nO2 z8h_C#X#EH5zf-pNp!A=v|9T+&JBtJSD}MjAFdojUQe@fvU0MKGjJQVm_awJ9Jn^lHSzSrt@AIR4>dXdU~VN zo}t%0ZT1tG;zaiB2ic++sEb7!d9IWATm*&|23DwvD5RQ01=X18o1vX>!(_pxzu8Wl zdmZ8idgMR?C2zAZ4AjR~2KBhF%OG}w+90xH`l>iFn2!U48x=AHC9hoeV!7xIRJk&0 zlxd8P4c9XbER|UJJS>k}*DN1nXpv9l0$AO^+L|Vx9&JN-c>(dh3H znoML``?Jx=JIlhw1aGm6vvtbwFmwz%v^67$BTZO5(A)qC8oCC$`P5vcl04{8+F z5ziL+eK|v-P>=6p8QdJ>N)d7tdI?rWAL;GSW}x5Yi%mybRuPq{hnXj%)9aayZ{!uO zu9H?EcW`xZwL+kkbC+EmT&)mj<=kc0{|hb3zHXM6cCOGu2pR`H6q+xR`r~vym+mW)u zzRj^gp$}~CK_AfGKt~&OT`3*y+gw8`BMloB2X#T%59@MCE*o{ZXkdlLI7Gjup9O>u zY#csb6OqxVO|>uJwy)k`Y=-HWz2V^dlMtE=!V7 z*a@|T>l;q&_&hLe>KcYckDvCC8j>mh_L1`T?fKR4NGUt6NbfU*o-(p6 zV=g1DDjy0xlyb)1eF^8^6MCM|ba)R3c&>oP%fXB(6DA}~XgY?$1#}rGzCFw2%yeH; z(}8S!s6H`?VW%>@p2`q8f(t+98jTaGiBMRY1Ho5|X=Iy@$$fl$3o1jKIRATk8QKKhsSMBCw{`p5=i#*W>fq|&YK1^6=PtWCxLP65%DKy~ z7lW&n$^cflRv9SN1?UU=tQHn`ht=Z9npRo^yluY2<-vfq?Z}_gG~02F9q&VSEWVN* ui!k&fGeJ;{D*pwmx$ge} literal 0 HcmV?d00001 diff --git a/examples/qtest/mod-info/usage.out b/examples/qtest/mod-info/usage.out new file mode 100644 index 00000000..5eeba82e --- /dev/null +++ b/examples/qtest/mod-info/usage.out @@ -0,0 +1,5 @@ +Usage: pdf-mod-info -in in_file [-out out_file] [-key key [-val val]?]+ +Modifies/Adds/Removes PDF /Info entries in the in_file +and stores the result in out_file +Special mode: pdf-mod-info --dump file +dumps all /Info entries to stdout diff --git a/examples/qtest/npages.test b/examples/qtest/npages.test new file mode 100644 index 00000000..cd81e6b8 --- /dev/null +++ b/examples/qtest/npages.test @@ -0,0 +1,23 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("npages"); + +require TestDriver; + +my $td = new TestDriver('pdf-npages'); + +$td->runtest("normal", + {$td->COMMAND => "pdf-npages minimal.pdf"}, + {$td->STRING => "1\n", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("error", + {$td->COMMAND => "pdf-npages bad"}, + {$td->STRING => "pdf-npages: bad: offset 0: not a PDF file\n", + $td->EXIT_STATUS => 2}, + $td->NORMALIZE_NEWLINES); + +$td->report(2); diff --git a/examples/qtest/npages/bad b/examples/qtest/npages/bad new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/examples/qtest/npages/bad @@ -0,0 +1 @@ +test diff --git a/examples/qtest/npages/minimal.pdf b/examples/qtest/npages/minimal.pdf new file mode 100644 index 00000000..a7e01f91 --- /dev/null +++ b/examples/qtest/npages/minimal.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/include/qpdf/Buffer.hh b/include/qpdf/Buffer.hh new file mode 100644 index 00000000..703dee3e --- /dev/null +++ b/include/qpdf/Buffer.hh @@ -0,0 +1,32 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __BUFFER_HH__ +#define __BUFFER_HH__ + +class Buffer +{ + public: + Buffer(); + Buffer(unsigned long size); + Buffer(Buffer const&); + Buffer& operator=(Buffer const&); + ~Buffer(); + unsigned long getSize() const; + unsigned char const* getBuffer() const; + unsigned char* getBuffer(); + + private: + void init(unsigned long size); + void copy(Buffer const&); + void destroy(); + + unsigned long size; + unsigned char* buf; +}; + +#endif // __BUFFER_HH__ diff --git a/include/qpdf/Pipeline.hh b/include/qpdf/Pipeline.hh new file mode 100644 index 00000000..acbc2d98 --- /dev/null +++ b/include/qpdf/Pipeline.hh @@ -0,0 +1,73 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +// Generalized Pipeline interface. By convention, subclasses of +// Pipeline are called Pl_Something. +// +// When an instance of Pipeline is created with a pointer to a next +// pipeline, that pipeline writes its data to the next one when it +// finishes with it. In order to make possible a usage style in which +// a pipeline may be passed to a function which may stick other +// pipelines in front of it, the allocator of a pipeline is +// responsible for its destruction. In other words, one pipeline +// object does not attempt to manage the memory of its successor. +// +// The client is required to call finish() before destroying a +// Pipeline in order to avoid loss of data. A Pipeline class should +// not throw an exception in the destructor if this hasn't been done +// though since doing so causes too mcuh trouble when deleting +// pipelines during error conditions. +// +// Some pipelines are resuable (i.e., you can call write() after +// calling finish() and can call finish() multiple times) while others +// are not. It is up to the caller to use a pipeline according to its +// own restrictions. + +#ifndef __PIPELINE_HH__ +#define __PIPELINE_HH__ + +#include + +class Pipeline +{ + public: + class Exception: public QEXC::General + { + public: + Exception(std::string const& message) : + QEXC::General(message) + { + } + + virtual ~Exception() throw() + { + } + }; + + Pipeline(char const* identifier, Pipeline* next); + + virtual ~Pipeline(); + + // Subclasses should implement write and finish to do their jobs + // and then, if they are not end-of-line pipelines, call + // getNext()->write or getNext()->finish. + virtual void write(unsigned char* data, int len) = 0; + virtual void finish() = 0; + + protected: + Pipeline* getNext(bool allow_null = false); + std::string identifier; + + private: + // Do not implement copy or assign + Pipeline(Pipeline const&); + Pipeline& operator=(Pipeline const&); + + Pipeline* next; +}; + +#endif // __PIPELINE_HH__ diff --git a/include/qpdf/Pl_Buffer.hh b/include/qpdf/Pl_Buffer.hh new file mode 100644 index 00000000..e78b5a17 --- /dev/null +++ b/include/qpdf/Pl_Buffer.hh @@ -0,0 +1,46 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __PL_BUFFER_HH__ +#define __PL_BUFFER_HH__ + +// This pipeline accumulates the data passed to it into a memory +// buffer. Each subsequent use of this buffer appends to the data +// accumulated so far. getBuffer() may be called only after calling +// finish() and before calling any subsequent write(). At that point, +// a dynamically allocated Buffer object is returned and the internal +// buffer is reset. The caller is responseible for deleting the +// returned Buffer. +// +// For this pipeline, "next" may be null. If a next pointer is +// provided, this pipeline will also pass the data through to it. + +#include +#include +#include +#include + +class Pl_Buffer: public Pipeline +{ + public: + Pl_Buffer(char const* identifier, Pipeline* next = 0); + virtual ~Pl_Buffer(); + virtual void write(unsigned char*, int); + virtual void finish(); + + // Each call to getBuffer() resets this object -- see notes above. + // The caller is responsible for deleting the returned Buffer + // object. + Buffer* getBuffer(); + + private: + bool ready; + std::list > data; + size_t total_size; +}; + +#endif // __PL_BUFFER_HH__ diff --git a/include/qpdf/Pl_Count.hh b/include/qpdf/Pl_Count.hh new file mode 100644 index 00000000..287b8297 --- /dev/null +++ b/include/qpdf/Pl_Count.hh @@ -0,0 +1,34 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __PL_COUNT_HH__ +#define __PL_COUNT_HH__ + +// This pipeline is reusable; i.e., it is safe to call write() after +// calling finish(). + +#include + +class Pl_Count: public Pipeline +{ + public: + Pl_Count(char const* identifier, Pipeline* next); + virtual ~Pl_Count(); + virtual void write(unsigned char*, int); + virtual void finish(); + // Returns the number of bytes written + int getCount() const; + // Returns the last character written, or '\0' if no characters + // have been written (in which case getCount() returns 0) + unsigned char getLastChar() const; + + private: + int count; + unsigned char last_char; +}; + +#endif // __PL_COUNT_HH__ diff --git a/include/qpdf/Pl_Discard.hh b/include/qpdf/Pl_Discard.hh new file mode 100644 index 00000000..cd0865a8 --- /dev/null +++ b/include/qpdf/Pl_Discard.hh @@ -0,0 +1,28 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __PL_DISCARD_HH__ +#define __PL_DISCARD_HH__ + +// This pipeline discards its output. It is an end-of-line pipeline +// (with no next). + +// This pipeline is reusable; i.e., it is safe to call write() after +// calling finish(). + +#include + +class Pl_Discard: public Pipeline +{ + public: + Pl_Discard(); + virtual ~Pl_Discard(); + virtual void write(unsigned char*, int); + virtual void finish(); +}; + +#endif // __PL_DISCARD_HH__ diff --git a/include/qpdf/Pl_Flate.hh b/include/qpdf/Pl_Flate.hh new file mode 100644 index 00000000..16058d37 --- /dev/null +++ b/include/qpdf/Pl_Flate.hh @@ -0,0 +1,53 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __PL_FLATE_HH__ +#define __PL_FLATE_HH__ + +#include + +#include + +class Pl_Flate: public Pipeline +{ + public: + class Exception: public Pipeline::Exception + { + public: + Exception(std::string const& message) : + Pipeline::Exception(message) + { + } + + virtual ~Exception() throw () + { + } + }; + + static int const def_bufsize = 65536; + + enum action_e { a_inflate, a_deflate }; + + Pl_Flate(char const* identifier, Pipeline* next, + action_e action, int out_bufsize = def_bufsize); + virtual ~Pl_Flate(); + + virtual void write(unsigned char* data, int len); + virtual void finish(); + + private: + void handleData(unsigned char* data, int len, int flush); + void checkError(char const* prefix, int error_code); + + unsigned char* outbuf; + int out_bufsize; + action_e action; + bool initialized; + z_stream zstream; +}; + +#endif // __PL_FLATE_HH__ diff --git a/include/qpdf/Pl_StdioFile.hh b/include/qpdf/Pl_StdioFile.hh new file mode 100644 index 00000000..d74ded3a --- /dev/null +++ b/include/qpdf/Pl_StdioFile.hh @@ -0,0 +1,49 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +// End-of-line pipeline that simply writes its data to a stdio FILE* object. + +#ifndef __PL_STDIOFILE_HH__ +#define __PL_STDIOFILE_HH__ + +#include + +#include + +// +// This pipeline is reusable. +// + +class Pl_StdioFile: public Pipeline +{ + public: + class Exception: public Pipeline::Exception + { + public: + Exception(std::string const& message) : + Pipeline::Exception(message) + { + } + + virtual ~Exception() throw () + { + } + }; + + // f is externally maintained; this class just writes to and + // flushes it. It does not close it. + Pl_StdioFile(char const* identifier, FILE* f); + virtual ~Pl_StdioFile(); + + virtual void write(unsigned char* buf, int len); + virtual void finish(); + + private: + FILE* file; +}; + +#endif // __PL_STDIOFILE_HH__ diff --git a/include/qpdf/PointerHolder.hh b/include/qpdf/PointerHolder.hh new file mode 100644 index 00000000..b4e9bb64 --- /dev/null +++ b/include/qpdf/PointerHolder.hh @@ -0,0 +1,170 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __POINTERHOLDER_HH__ +#define __POINTERHOLDER_HH__ + +#include + +// This class is basically boost::shared_pointer but predates that by +// several years. + +// This class expects to be initialized with a dynamically allocated +// object pointer. It keeps a reference count and deletes this once +// the reference count goes to zero. PointerHolder objects are +// explicitly safe for use in STL containers. + +// It is very important that a client who pulls the pointer out of +// this holder does not let the holder go out of scope until it is +// finished with the pointer. It is also important that exactly one +// instance of this object ever gets initialized with a given pointer. +// Otherwise, the pointer will be deleted twice, and before that, some +// objects will be left with a pointer to a deleted object. In other +// words, the only legitimate way for two PointerHolder objects to +// contain the same pointer is for one to be a copy of the other. +// Copy and assignment semantics are well-defined and essentially +// allow you to use PointerHolder as a means to get pass-by-reference +// semantics in a pass-by-value environment without having to worry +// about memory management details. + +// Comparison (== and <) are defined and operate on the internally +// stored pointers, not on the data. This makes it possible to store +// PointerHolder objects in sorted lists or to find them in STL +// containers just as one would be able to store pointers. Comparing +// the underlying pointers provides a well-defined, if not +// particularly meaningful, ordering. + +template +class PointerHolder +{ + private: + class Data + { + public: + Data(T* pointer, bool tracing) : + pointer(pointer), + tracing(tracing), + refcount(0) + { + static int next_id = 0; + this->unique_id = ++next_id; + } + ~Data() + { + if (this->tracing) + { + std::cerr << "PointerHolder deleting pointer " + << (void*)pointer + << std::endl; + } + delete this->pointer; + if (this->tracing) + { + std::cerr << "PointerHolder done deleting pointer " + << (void*)pointer + << std::endl; + } + } + T* pointer; + bool tracing; + int refcount; + int unique_id; + private: + Data(Data const&); + Data& operator=(Data const&); + }; + + public: + PointerHolder(T* pointer = 0, bool tracing = false) + { + this->init(new Data(pointer, tracing)); + } + PointerHolder(PointerHolder const& rhs) + { + this->copy(rhs); + } + PointerHolder& operator=(PointerHolder const& rhs) + { + if (this != &rhs) + { + this->destroy(); + this->copy(rhs); + } + return *this; + } + ~PointerHolder() + { + this->destroy(); + } + bool operator==(PointerHolder const& rhs) const + { + return this->data->pointer == rhs.data->pointer; + } + bool operator<(PointerHolder const& rhs) const + { + return this->data->pointer < rhs.data->pointer; + } + + // NOTE: The pointer returned by getPointer turns into a pumpkin + // when the last PointerHolder that contains it disappears. + T* getPointer() + { + return this->data->pointer; + } + T const* getPointer() const + { + return this->data->pointer; + } + int getRefcount() const + { + return this->data->refcount; + } + + private: + void init(Data* data) + { + this->data = data; + { + ++this->data->refcount; + if (this->data->tracing) + { + std::cerr << "PointerHolder " << this->data->unique_id + << " refcount increased to " << this->data->refcount + << std::endl; + } + } + } + void copy(PointerHolder const& rhs) + { + this->init(rhs.data); + } + void destroy() + { + bool gone = false; + { + if (--this->data->refcount == 0) + { + gone = true; + } + if (this->data->tracing) + { + std::cerr << "PointerHolder " << this->data->unique_id + << " refcount decreased to " + << this->data->refcount + << std::endl; + } + } + if (gone) + { + delete this->data; + } + } + + Data* data; +}; + +#endif // __POINTERHOLDER_HH__ diff --git a/include/qpdf/QEXC.hh b/include/qpdf/QEXC.hh new file mode 100644 index 00000000..b94edf7a --- /dev/null +++ b/include/qpdf/QEXC.hh @@ -0,0 +1,119 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QEXC_HH__ +#define __QEXC_HH__ + +#include +#include +#include + +namespace QEXC +{ + // This namespace contains all exception classes used by the + // library. + + // The class hierarchy is as follows: + + // std::exception + // | + // +-> QEXC::Base + // | + // +-> QEXC::General + // | + // +-> QEXC::Internal + + // QEXC::General is the base class of all standard user-defined + // exceptions and "expected" error conditions raised by QClass. + // Applications or libraries using QClass are encouraged to derive + // their own exceptions from these classes if they wish. It is + // entirely reasonable for code to catch QEXC::General or specific + // subclasses of it as part of normal error handling. + + // QEXC::Internal is reserved for internal errors. These should + // be used only for situations that indicate a likely bug in the + // software itself. This may include improper use of a library + // function. Operator errors should not be able to cause Internal + // errors. (There may be some exceptions to this such as users + // invoking programs that were intended only to be invoked by + // other programs.) QEXC::Internal should generally not be + // trapped except in terminate handlers or top-level exception + // handlers which will want to translate them into error messages + // and cause the program to exit. Such top-level handlers may + // want to catch std::exception instead. + + // All subclasses of QEXC::Base implement a const unparse() method + // which returns a std::string const&. They also override + // std::exception::what() to return a char* with the same value. + // unparse() should be implemented in such a way that a program + // catching QEXC::Base or std::exception can use the text returned + // by unparse() (or what()) without any exception-specific + // adornment. (The program may prefix the program name or other + // general information.) Note that std::exception::what() is a + // const method that returns a const char*. For this reason, it + // is essential that unparse() return a const reference to a + // string so that what() can be implemented by calling unparse(). + // This means that the string that unparse() returns a reference + // to must not be allocated on the stack in the call to unparse(). + // The recommended way to do this is for derived exception classes + // to store their string descriptions by calling the protected + // setMessage() method and then to not override unparse(). + + class Base: public std::exception + { + // This is the common base class for all exceptions in qclass. + // Application/library code should not generally catch this + // directly. See above for caveats. + public: + Base(); + Base(std::string const& message); + virtual ~Base() throw() {} + virtual std::string const& unparse() const; + virtual const char* what() const throw(); + + protected: + void setMessage(std::string const& message); + + private: + std::string message; + }; + + class General: public Base + { + // This is the base class for normal user/library-defined + // error conditions. + public: + General(); + General(std::string const& message); + virtual ~General() throw() {}; + }; + + // Note that Internal is not derived from General. Internal + // errors are too severe. We don't want internal errors + // accidentally trapped as part of QEXC::General. If you are + // going to deal with internal errors, you have to do so + // explicitly. + class Internal: public Base + { + public: + Internal(std::string const& message); + virtual ~Internal() throw() {}; + }; + + class System: public General + { + public: + System(std::string const& prefix, int sys_errno); + virtual ~System() throw() {}; + int getErrno() const; + + private: + int sys_errno; + }; +}; + +#endif // __QEXC_HH__ diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh new file mode 100644 index 00000000..d311b3c8 --- /dev/null +++ b/include/qpdf/QPDF.hh @@ -0,0 +1,750 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QPDF_HH__ +#define __QPDF_HH__ + +#include +#include +#include +#include + +#include +#include +#include +#include + +class QPDF_Stream; +class BitStream; +class BitWriter; +class QPDFExc; + +class QPDF +{ + public: + QPDF(); + ~QPDF(); + + // Associate a file with a QPDF object and do initial parsing of + // the file. PDF objects are not read until they are needed. A + // QPDF object may be associated with only on file in its + // lifetime. This method must be called before any methods that + // potentially ask for information about the PDF file are called. + // Prior to calling this, the only methods that are allowed are + // those that set parameters. + void processFile(char const* filename, char const* password = ""); + + // Parameter settings + + // If true, ignore any cross-reference streams in a hybrid file + // (one that contains both cross-reference streams and + // cross-reference tables). This can be useful for testing to + // ensure that a hybrid file would work with an older reader. + void setIgnoreXRefStreams(bool); + + // By default, any warnings are issued to stderr as they are + // encountered. If this is called with a true value, reporitng of + // warnings is suppressed. You may still retrieve warnings by + // calling getWarnings. + void setSuppressWarnings(bool); + + // By default, QPDF will try to recover if it finds certain types + // of errors in PDF files. If turned off, it will throw an + // exception on the first such problem it finds without attempting + // recovery. + void setAttemptRecovery(bool); + + // Other public methods + + // Return the list of warnings that have been issued so far and + // clear the list. This method may be called even if processFile + // throws an exception. Note that if setSuppressWarnings was not + // called or was called with a false value, any warnings retrieved + // here will have already been issued to stderr. + std::vector getWarnings(); + + std::string getFilename() const; + std::string getPDFVersion() const; + QPDFObjectHandle getTrailer(); + QPDFObjectHandle getRoot(); + + // Install this object handle as an indirect object and return an + // indirect reference to it. + QPDFObjectHandle makeIndirectObject(QPDFObjectHandle); + + // Retrieve an object by object ID and generation. Returns an + // indirect reference to it. + QPDFObjectHandle getObjectByID(int objid, int generation); + + // Encryption support + + struct EncryptionData + { + // This class holds data read from the encryption dictionary. + EncryptionData(int V, int R, int Length_bytes, long P, + std::string const& O, std::string const& U, + std::string const& id1) : + V(V), + R(R), + Length_bytes(Length_bytes), + P(P), + O(O), + U(U), + id1(id1) + { + } + + int V; + int R; + int Length_bytes; + long P; + std::string O; + std::string U; + std::string id1; + }; + + static void trim_user_password(std::string& user_password); + static std::string compute_data_key( + std::string const& encryption_key, int objid, int generation); + static std::string compute_encryption_key( + std::string const& password, EncryptionData const& data); + + static void compute_encryption_O_U( + char const* user_password, char const* owner_password, + int V, int R, int key_len, unsigned long P, + std::string const& id1, + std::string& O, std::string& U); + std::string const& getUserPassword() const; + + // Linearization support + + // Returns true iff the file starts with a linearization parameter + // dictionary. Does no additional validation. + bool isLinearized(); + + // Performs various sanity checks on a linearized file. Return + // true if no errors or warnings. Otherwise, return false and + // output errors and warnings to stdout. + bool checkLinearization(); + + // Calls checkLinearization() and, if possible, prints normalized + // contents of some of the hints tables to stdout. Normalization + // includes adding min values to delta values and adjusting + // offsets based on the location and size of the primary hint + // stream. + void showLinearizationData(); + + // Shows the contents of the cross-reference table + void showXRefTable(); + + // Optimization support -- see doc/optimization. Implemented in + // QPDF_optimization.cc + + // The object_stream_data map maps from a "compressed" object to + // the object stream that contains it. This enables optimize to + // populate the object <-> user maps with only uncompressed + // objects. If allow_changes is false, an exception will be + // thrown if any changes are made during the optimization process. + // This is available so that the test suite can make sure that a + // linearized file is already optimized. When called in this way, + // optimize() still populates the object <-> user maps + void optimize(std::map const& object_stream_data, + bool allow_changes = true); + + // Replace all references to indirect objects that are "scalars" + // (i.e., things that don't have children: not arrays, streams, or + // dictionaries) with direct objects. + void flattenScalarReferences(); + + // For QPDFWriter: + + // Remove /ID, /Encrypt, and /Prev keys from the trailer + // dictionary since these are regenerated during write. + void trimTrailerForWrite(); + + // Get lists of all objects in order according to the part of a + // linearized file that they belong to. + void getLinearizedParts( + std::map const& object_stream_data, + std::vector& part4, + std::vector& part6, + std::vector& part7, + std::vector& part8, + std::vector& part9); + + void generateHintStream(std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber, + PointerHolder& hint_stream, + int& S, int& O); + + // Map object to object stream that contains it + void getObjectStreamData(std::map&); + // Get a list of objects that would be permitted in an object + // stream + std::vector getCompressibleObjects(); + + // Convenience routines for common functions. See also + // QPDFObjectHandle.hh for additional convenience routines. + + // Traverse page tree return all /Page objects. + std::vector const& getAllPages(); + + // Resolver class is restricted to QPDFObjectHandle so that only + // it can resolve indirect references. + class Resolver + { + friend class QPDFObjectHandle; + private: + static PointerHolder resolve( + QPDF* qpdf, int objid, int generation) + { + return qpdf->resolve(objid, generation); + } + }; + friend class Resolver; + + // Pipe class is restricted to QPDF_Stream + class Pipe + { + friend class QPDF_Stream; + private: + static void pipeStreamData(QPDF* qpdf, int objid, int generation, + off_t offset, size_t length, + QPDFObjectHandle dict, + Pipeline* pipeline) + { + qpdf->pipeStreamData( + objid, generation, offset, length, dict, pipeline); + } + }; + friend class Pipe; + + private: + class InputSource + { + public: + InputSource() : + last_offset(0) + { + } + virtual ~InputSource() + { + } + + void setLastOffset(off_t); + off_t getLastOffset() const; + std::string readLine(); + + virtual std::string const& getName() const = 0; + virtual off_t tell() = 0; + virtual void seek(off_t offset, int whence) = 0; + virtual void rewind() = 0; + virtual size_t read(char* buffer, int length) = 0; + virtual void unreadCh(char ch) = 0; + + protected: + off_t last_offset; + }; + + class FileInputSource: public InputSource + { + public: + FileInputSource(); + void setFilename(char const* filename); + virtual ~FileInputSource(); + virtual std::string const& getName() const; + virtual off_t tell(); + virtual void seek(off_t offset, int whence); + virtual void rewind(); + virtual size_t read(char* buffer, int length); + virtual void unreadCh(char ch); + + private: + FileInputSource(FileInputSource const&); + FileInputSource& operator=(FileInputSource const&); + + void destroy(); + + std::string filename; + FILE* file; + }; + + class BufferInputSource: public InputSource + { + public: + BufferInputSource(std::string const& description, Buffer* buf); + virtual ~BufferInputSource(); + virtual std::string const& getName() const; + virtual off_t tell(); + virtual void seek(off_t offset, int whence); + virtual void rewind(); + virtual size_t read(char* buffer, int length); + virtual void unreadCh(char ch); + + private: + std::string description; + Buffer* buf; + off_t cur_offset; + }; + + class ObjGen + { + public: + ObjGen(); + ObjGen(int obj, int gen); + bool operator<(ObjGen const&) const; + + int obj; + int gen; + }; + + class ObjCache + { + public: + ObjCache() : + end_before_space(0), + end_after_space(0) + { + } + ObjCache(PointerHolder object, + off_t end_before_space, + off_t end_after_space) : + object(object), + end_before_space(end_before_space), + end_after_space(end_after_space) + { + } + + PointerHolder object; + off_t end_before_space; + off_t end_after_space; + }; + + void parse(); + void warn(QPDFExc const& e); + void setTrailer(QPDFObjectHandle obj); + void read_xref(off_t offset); + void reconstruct_xref(QPDFExc& e); + int read_xrefTable(off_t offset); + int read_xrefStream(off_t offset); + int processXRefStream(off_t offset, QPDFObjectHandle& xref_stream); + void insertXrefEntry(int obj, int f0, int f1, int f2); + QPDFObjectHandle readObject( + InputSource*, int objid, int generation, + bool in_object_stream); + QPDFObjectHandle readObjectInternal( + InputSource* input, int objid, int generation, + bool in_object_stream, + bool in_array, bool in_dictionary); + int recoverStreamLength( + InputSource* input, int objid, int generation, off_t stream_offset); + QPDFTokenizer::Token readToken(InputSource*); + + QPDFObjectHandle readObjectAtOffset( + off_t offset, + int exp_objid, int exp_generation, + int& act_objid, int& act_generation); + PointerHolder resolve(int objid, int generation); + void resolveObjectsInStream(int obj_stream_number); + + // Calls finish() on the pipeline when done but does not delete it + void pipeStreamData(int objid, int generation, + off_t offset, size_t length, + QPDFObjectHandle dict, + Pipeline* pipeline); + void getAllPagesInternal(QPDFObjectHandle cur_pages, + std::vector& result); + + // methods to support encryption -- implemented in QPDF_encryption.cc + void initializeEncryption(); + std::string getKeyForObject(int objid, int generation); + void decryptString(std::string&, int objid, int generation); + void decryptStream(Pipeline*& pipeline, int objid, int generation, + std::vector >& heap); + + // Linearization Hint table structures. + // Naming conventions: + + // HSomething is the Something Hint Table or table header + // HSomethingEntry is an entry in the Something table + + // delta_something + min_something = something + // nbits_something = number of bits required for something + + // something_offset is the pre-adjusted offset in the file. If >= + // H0_offset, H0_length must be added to get an actual file + // offset. + + // PDF 1.4: Table F.4 + struct HPageOffsetEntry + { + HPageOffsetEntry() : + delta_nobjects(0), + delta_page_length(0), + nshared_objects(0), + delta_content_offset(0), + delta_content_length(0) + { + } + + int delta_nobjects; // 1 + int delta_page_length; // 2 + int nshared_objects; // 3 + // vectors' sizes = nshared_objects + std::vector shared_identifiers; // 4 + std::vector shared_numerators; // 5 + int delta_content_offset; // 6 + int delta_content_length; // 7 + }; + + // PDF 1.4: Table F.3 + struct HPageOffset + { + HPageOffset() : + min_nobjects(0), + first_page_offset(0), + nbits_delta_nobjects(0), + min_page_length(0), + nbits_delta_page_length(0), + min_content_offset(0), + nbits_delta_content_offset(0), + min_content_length(0), + nbits_delta_content_length(0), + nbits_nshared_objects(0), + nbits_shared_identifier(0), + nbits_shared_numerator(0), + shared_denominator(0) + { + } + + int min_nobjects; // 1 + int first_page_offset; // 2 + int nbits_delta_nobjects; // 3 + int min_page_length; // 4 + int nbits_delta_page_length; // 5 + int min_content_offset; // 6 + int nbits_delta_content_offset; // 7 + int min_content_length; // 8 + int nbits_delta_content_length; // 9 + int nbits_nshared_objects; // 10 + int nbits_shared_identifier; // 11 + int nbits_shared_numerator; // 12 + int shared_denominator; // 13 + // vector size is npages + std::vector entries; + }; + + // PDF 1.4: Table F.6 + struct HSharedObjectEntry + { + HSharedObjectEntry() : + delta_group_length(0), + signature_present(0), + nobjects_minus_one(0) + { + } + + // Item 3 is a 128-bit signature (unsupported by Acrobat) + int delta_group_length; // 1 + int signature_present; // 2 -- always 0 + int nobjects_minus_one; // 4 -- always 0 + }; + + // PDF 1.4: Table F.5 + struct HSharedObject + { + HSharedObject() : + first_shared_obj(0), + first_shared_offset(0), + nshared_first_page(0), + nshared_total(0), + nbits_nobjects(0), + min_group_length(0), + nbits_delta_group_length(0) + { + } + + int first_shared_obj; // 1 + int first_shared_offset; // 2 + int nshared_first_page; // 3 + int nshared_total; // 4 + int nbits_nobjects; // 5 + int min_group_length; // 6 + int nbits_delta_group_length; // 7 + // vector size is nshared_total + std::vector entries; + }; + + // PDF 1.4: Table F.9 + struct HGeneric + { + HGeneric() : + first_object(0), + first_object_offset(0), + nobjects(0), + group_length(0) + { + } + + int first_object; // 1 + int first_object_offset; // 2 + int nobjects; // 3 + int group_length; // 4 + }; + + // Other linearization data structures + + // Initialized from Linearization Parameter dictionary + struct LinParameters + { + LinParameters() : + file_size(0), + first_page_object(0), + first_page_end(0), + npages(0), + xref_zero_offset(0), + first_page(0), + H_offset(0), + H_length(0) + { + } + + int file_size; // /L + int first_page_object; // /O + int first_page_end; // /E + int npages; // /N + int xref_zero_offset; // /T + int first_page; // /P + int H_offset; // offset of primary hint stream + int H_length; // length of primary hint stream + }; + + // Computed hint table value data structures. These tables + // contain the computed values on which the hint table values are + // based. They exclude things like number of bits and store + // actual values instead of mins and deltas. File offsets are + // also absolute rather than being offset by the size of the + // primary hint table. We populate the hint table structures from + // these during writing and compare the hint table values with + // these during validation. We ignore some values for various + // reasons described in the code. Those values are omitted from + // these structures. Note also that object numbers are object + // numbers from the input file, not the output file. + + // Naming convention: CHSomething is analogous to HSomething + // above. "CH" is computed hint. + + struct CHPageOffsetEntry + { + CHPageOffsetEntry() : + nobjects(0), + nshared_objects(0) + { + } + + int nobjects; + int nshared_objects; + // vectors' sizes = nshared_objects + std::vector shared_identifiers; + }; + + struct CHPageOffset + { + // vector size is npages + std::vector entries; + }; + + struct CHSharedObjectEntry + { + CHSharedObjectEntry(int object) : + object(object) + { + } + + int object; + }; + + // PDF 1.4: Table F.5 + struct CHSharedObject + { + CHSharedObject() : + first_shared_obj(0), + nshared_first_page(0), + nshared_total(0) + { + } + + int first_shared_obj; + int nshared_first_page; + int nshared_total; + // vector size is nshared_total + std::vector entries; + }; + + // No need for CHGeneric -- HGeneric is fine as is. + + + // Data structures to support optimization -- implemented in + // QPDF_optimization.cc + + class ObjUser + { + public: + enum user_e + { + ou_bad, + ou_page, + ou_thumb, + ou_trailer_key, + ou_root_key, + ou_root + }; + + // type is set to ou_bad + ObjUser(); + + // type must be ou_root + ObjUser(user_e type); + + // type must be one of ou_page or ou_thumb + ObjUser(user_e type, int pageno); + + // type must be one of ou_trailer_key or ou_root_key + ObjUser(user_e type, std::string const& key); + + bool operator<(ObjUser const&) const; + + user_e ou_type; + int pageno; // if ou_page; + std::string key; // if ou_trailer_key or ou_root_key + }; + + // methods to support linearization checking -- implemented in + // QPDF_linearization.cc + void readLinearizationData(); + bool checkLinearizationInternal(); + void dumpLinearizationDataInternal(); + QPDFObjectHandle readHintStream(Pipeline&, off_t offset, size_t length); + void readHPageOffset(BitStream); + void readHSharedObject(BitStream); + void readHGeneric(BitStream, HGeneric&); + int maxEnd(ObjUser const& ou); + int getLinearizationOffset(ObjGen const&); + QPDFObjectHandle getUncompressedObject( + QPDFObjectHandle&, std::map const& object_stream_data); + int lengthNextN(int first_object, int n, + std::list& errors); + void checkHPageOffset(std::list& errors, + std::list& warnings, + std::vector const& pages, + std::map& idx_to_obj); + void checkHSharedObject(std::list& warnings, + std::list& errors, + std::vector const& pages, + std::map& idx_to_obj); + void checkHOutlines(std::list& warnings); + void dumpHPageOffset(); + void dumpHSharedObject(); + void dumpHGeneric(HGeneric&); + int adjusted_offset(int offset); + QPDFObjectHandle objGenToIndirect(ObjGen const&); + void calculateLinearizationData( + std::map const& object_stream_data); + void pushOutlinesToPart( + std::vector& part, + std::set& lc_outlines, + std::map const& object_stream_data); + int outputLengthNextN( + int in_object, int n, + std::map const& lengths, + std::map const& obj_renumber); + void calculateHPageOffset( + std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber); + void calculateHSharedObject( + std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber); + void calculateHOutline( + std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber); + void writeHPageOffset(BitWriter&); + void writeHSharedObject(BitWriter&); + void writeHGeneric(BitWriter&, HGeneric&); + + + // Methods to support optimization + + void optimizePagesTree( + QPDFObjectHandle, + std::map >&, + int& pageno, bool allow_changes); + void updateObjectMaps(ObjUser const& ou, QPDFObjectHandle oh); + void updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh, + std::set& visited, bool top); + void filterCompressedObjects(std::map const& object_stream_data); + + + QPDFTokenizer tokenizer; + FileInputSource file; + bool encrypted; + bool encryption_initialized; + bool ignore_xref_streams; + bool suppress_warnings; + bool attempt_recovery; + std::string provided_password; + std::string user_password; + std::string encryption_key; + std::string cached_object_encryption_key; + int cached_key_objid; + int cached_key_generation; + std::string pdf_version; + std::map xref_table; + std::set deleted_objects; + std::map obj_cache; + QPDFObjectHandle trailer; + std::vector all_pages; + std::vector warnings; + + // Linearization data + int first_xref_item_offset; // actual value from file + bool uncompressed_after_compressed; + + // Linearization parameter dictionary and hint table data: may be + // read from file or computed prior to writing a linearized file + QPDFObjectHandle lindict; + LinParameters linp; + HPageOffset page_offset_hints; + HSharedObject shared_object_hints; + HGeneric outline_hints; + + // Computed linearization data: used to populate above tables + // during writing and to compare with them during validation. c_ + // means computed. + LinParameters c_linp; + CHPageOffset c_page_offset_data; + CHSharedObject c_shared_object_data; + HGeneric c_outline_data; + + // Object ordering data for linearized files: initialized by + // calculateLinearizationData(). Part numbers refer to the PDF + // 1.4 specification. + std::vector part4; + std::vector part6; + std::vector part7; + std::vector part8; + std::vector part9; + + // Optimization data + std::map > obj_user_to_objects; + std::map > object_to_obj_users; +}; + +#endif // __QPDF_HH__ diff --git a/include/qpdf/QPDFExc.hh b/include/qpdf/QPDFExc.hh new file mode 100644 index 00000000..d3efb3b9 --- /dev/null +++ b/include/qpdf/QPDFExc.hh @@ -0,0 +1,22 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QPDFEXC_HH__ +#define __QPDFEXC_HH__ + +#include + +class QPDFExc: public QEXC::General +{ + public: + QPDFExc(std::string const& message); + QPDFExc(std::string const& filename, int offset, + std::string const& message); + virtual ~QPDFExc() throw (); +}; + +#endif // __QPDFEXC_HH__ diff --git a/include/qpdf/QPDFObject.hh b/include/qpdf/QPDFObject.hh new file mode 100644 index 00000000..1597e20e --- /dev/null +++ b/include/qpdf/QPDFObject.hh @@ -0,0 +1,20 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QPDFOBJECT_HH__ +#define __QPDFOBJECT_HH__ + +#include + +class QPDFObject +{ + public: + virtual ~QPDFObject() {} + virtual std::string unparse() = 0; +}; + +#endif // __QPDFOBJECT_HH__ diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh new file mode 100644 index 00000000..e38eb116 --- /dev/null +++ b/include/qpdf/QPDFObjectHandle.hh @@ -0,0 +1,221 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QPDFOBJECTHANDLE_HH__ +#define __QPDFOBJECTHANDLE_HH__ + +#include +#include +#include +#include + +#include +#include + +#include + +class Pipeline; +class QPDF; + +class QPDFObjectHandle +{ + public: + QPDFObjectHandle(); + bool isInitialized() const; + + // Exactly one of these will return true for any object. + bool isBool(); + bool isNull(); + bool isInteger(); + bool isReal(); + bool isName(); + bool isString(); + bool isArray(); + bool isDictionary(); + bool isStream(); + + // This returns true in addition to the query for the specific + // type for indirect objects. + bool isIndirect(); + + // True for everything except array, dictionary, and stream + bool isScalar(); + + // Public factory methods + + static QPDFObjectHandle newNull(); + static QPDFObjectHandle newBool(bool value); + static QPDFObjectHandle newInteger(int value); + static QPDFObjectHandle newReal(std::string const& value); + static QPDFObjectHandle newName(std::string const& name); + static QPDFObjectHandle newString(std::string const& str); + static QPDFObjectHandle newArray( + std::vector const& items); + static QPDFObjectHandle newDictionary( + std::map const& items); + + // Accessor methods. If an accessor method that is valid for only + // a particular object type is called on an object of the wrong + // type, an exception is thrown. + + // Methods for bool objects + bool getBoolValue(); + + // Methods for integer objects + int getIntValue(); + + // Methods for real objects + std::string getRealValue(); + + // Methods that work for both integer and real objects + bool isNumber(); + double getNumericValue(); + + // Methods for name objects + std::string getName(); + + // Methods for string objects + std::string getStringValue(); + std::string getUTF8Value(); + + // Methods for array objects + int getArrayNItems(); + QPDFObjectHandle getArrayItem(int n); + + // Methods for dictionary objects + bool hasKey(std::string const&); + QPDFObjectHandle getKey(std::string const&); + std::set getKeys(); + + // Mutator methods. Use with caution. + + // Recursively copy this object, making it direct. Throws an + // exception if a loop is detected or any sub-object is a stream. + void makeDirect(); + + // Mutator methods for array objects + void setArrayItem(int, QPDFObjectHandle const&); + + // Mutator methods for dictionary objects + + // Replace value of key, adding it if it does not exist + void replaceKey(std::string const& key, QPDFObjectHandle const&); + // Remove key, doing nothing if key does not exist + void removeKey(std::string const& key); + + // Methods for stream objects + QPDFObjectHandle getDict(); + + // Returns filtered (uncompressed) stream data. Throws an + // exception if the stream is filtered and we can't decode it. + PointerHolder getStreamData(); + + // Write stream data through the given pipeline. A null pipeline + // value may be used if all you want to do is determine whether a + // stream is filterable. If filter is false, write raw stream + // data and return false. If filter is true, then attempt to + // apply all the decoding filters to the stream data. If we are + // successful, return true. Otherwise, return false and write raw + // data. If filtering is requested and successfully performed, + // then the normalize and compress flags are used to determine + // whether stream data should be normalized and compressed. In + // all cases, if this function returns false, raw data has been + // written. If it returns true, then any requested filtering has + // been performed. Note that if the original stream data has no + // filters applied to it, the return value will be equal to the + // value of the filter parameter. Callers may use the return + // value of this function to determine whether or not the /Filter + // and /DecodeParms keys in the stream dictionary should be + // replaced if writing a new stream object. + bool pipeStreamData(Pipeline*, bool filter, + bool normalize, bool compress); + + // return 0 for direct objects + int getObjectID() const; + int getGeneration() const; + + std::string unparse(); + std::string unparseResolved(); + + // Convenience routines for commonly performed functions + + // Throws an exception if this is not a Page object. Returns an + // empty map if there are no images or no resources. This + // function does not presently support inherited resources. See + // comment in the source for details. Return value is a map from + // XObject name to the image object, which is always a stream. + std::map getPageImages(); + + // Throws an exception if this is not a Page object. Returns a + // vector of stream objects representing the content streams for + // the given page. This routine allows the caller to not care + // whether there are one or more than one content streams for a + // page. + std::vector getPageContents(); + + // Initializers for objects. This Factory class gives the QPDF + // class specific permission to call factory methods without + // making it a friend of the whole QPDFObjectHandle class. + class Factory + { + friend class QPDF; + private: + static QPDFObjectHandle newIndirect(QPDF* qpdf, + int objid, int generation) + { + return QPDFObjectHandle::newIndirect(qpdf, objid, generation); + } + // object must be dictionary object + static QPDFObjectHandle newStream( + QPDF* qpdf, int objid, int generation, + QPDFObjectHandle stream_dict, off_t offset, int length) + { + return QPDFObjectHandle::newStream( + qpdf, objid, generation, stream_dict, offset, length); + } + }; + friend class Factory; + + // Accessor for raw underlying object -- only QPDF is allowed to + // call this. + class ObjAccessor + { + friend class QPDF; + private: + static PointerHolder getObject(QPDFObjectHandle& o) + { + o.dereference(); + return o.obj; + } + }; + friend class ObjAccessor; + + private: + QPDFObjectHandle(QPDF*, int objid, int generation); + QPDFObjectHandle(QPDFObject*); + + // Private object factory methods + static QPDFObjectHandle newIndirect(QPDF*, int objid, int generation); + static QPDFObjectHandle newStream( + QPDF* qpdf, int objid, int generation, + QPDFObjectHandle stream_dict, off_t offset, int length); + + void assertInitialized() const; + void assertType(char const* type_name, bool istype); + void assertPageObject(); + void dereference(); + void makeDirectInternal(std::set& visited); + + bool initialized; + + QPDF* qpdf; // 0 for direct object + int objid; // 0 for direct object + int generation; + PointerHolder obj; +}; + +#endif // __QPDFOBJECTHANDLE_HH__ diff --git a/include/qpdf/QPDFTokenizer.hh b/include/qpdf/QPDFTokenizer.hh new file mode 100644 index 00000000..e921bfc5 --- /dev/null +++ b/include/qpdf/QPDFTokenizer.hh @@ -0,0 +1,141 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QPDFTOKENIZER_HH__ +#define __QPDFTOKENIZER_HH__ + +#include +#include + +class QPDFTokenizer +{ + public: + enum token_type_e + { + tt_bad, + tt_array_close, + tt_array_open, + tt_brace_close, + tt_brace_open, + tt_dict_close, + tt_dict_open, + tt_integer, + tt_name, + tt_real, + tt_string, + tt_null, + tt_bool, + tt_word, + }; + + class Token + { + public: + Token() : type(tt_bad) {} + + Token(token_type_e type, std::string const& value) : + type(type), + value(value) + { + } + + Token(token_type_e type, std::string const& value, + std::string raw_value, std::string error_message) : + type(type), + value(value), + raw_value(raw_value), + error_message(error_message) + { + } + token_type_e getType() const + { + return this->type; + } + std::string const& getValue() const + { + return this->value; + } + std::string const& getRawValue() const + { + return this->raw_value; + } + std::string const& getErrorMessage() const + { + return this->error_message; + } + bool operator==(Token const& rhs) + { + // Ignore fields other than type and value + return ((this->type != tt_bad) && + (this->type == rhs.type) && + (this->value == rhs.value)); + } + + private: + token_type_e type; + std::string value; + std::string raw_value; + std::string error_message; + }; + + QPDFTokenizer(); + + // PDF files with version < 1.2 allowed the pound character + // anywhere in a name. Starting with version 1.2, the pound + // character was allowed only when followed by two hexadecimal + // digits. This method should be called when parsing a PDF file + // whose version is older than 1.2. + void allowPoundAnywhereInName(); + + // Mode of operation: + + // Keep presenting characters and calling getToken() until + // getToken() returns true. When it does, be sure to check + // unread_ch and to unread ch if it is true. + + // It these are called when a token is available, an exception + // will be thrown. + void presentCharacter(char ch); + void presentEOF(); + + // If a token is available, return true and initialize token with + // the token, unread_char with whether or not we have to unread + // the last character, and if unread_char, ch with the character + // to unread. + bool getToken(Token& token, bool& unread_char, char& ch); + + // This function returns true of the current character is between + // tokens (i.e., white space that is not part of a string) or is + // part of a comment. A tokenizing filter can call this to + // determine whether to output the character. + bool betweenTokens(); + + private: + void reset(); + + // Lexer state + enum { st_top, st_in_comment, st_in_string, st_lt, st_gt, + st_literal, st_in_hexstring, st_token_ready } state; + + bool pound_special_in_name; + + // Current token accumulation + token_type_e type; + std::string val; + std::string raw_val; + std::string error_message; + bool unread_char; + char char_to_unread; + + // State for strings + int string_depth; + bool string_ignoring_newline; + char bs_num_register[4]; + bool last_char_was_bs; +}; + +#endif // __QPDFTOKENIZER_HH__ diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh new file mode 100644 index 00000000..f332a227 --- /dev/null +++ b/include/qpdf/QPDFWriter.hh @@ -0,0 +1,243 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +// This class implements a simple writer for saving QPDF objects to +// new PDF files. See comments through the header file for additional +// details. + +#ifndef __QPDFWRITER_HH__ +#define __QPDFWRITER_HH__ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +class QPDF; +class QPDFObjectHandle; +class Pl_Count; + +class QPDFWriter +{ + public: + // Passing null as filename means write to stdout + QPDFWriter(QPDF& pdf, char const* filename); + ~QPDFWriter(); + + // Set the value of object stream mode. In disable mode, we never + // generate any object streams. In preserve mode, we preserve + // object stream structure from the original file. In generate + // mode, we generate our own object streams. In all cases, we + // generate a conventional cross-reference table if there are no + // object streams and a cross-reference stream if there are object + // streams. The default is o_preserve. + enum object_stream_e { o_disable, o_preserve, o_generate }; + void setObjectStreamMode(object_stream_e); + + // Set value of stream data mode. In uncompress mode, we attempt + // to uncompress any stream that we can. In preserve mode, we + // preserve any filtering applied to streams. In compress mode, + // if we can apply all filters and the stream is not already + // optimally compressed, recompress the stream. + enum stream_data_e { s_uncompress, s_preserve, s_compress }; + void setStreamDataMode(stream_data_e); + + // Set value of content stream normalization. The default is + // "false". If true, we attempt to normalize newlines inside of + // content streams. Some constructs such as inline images may + // thwart our efforts. There may be some cases where this can + // damage the content stream. This flag should be used only for + // debugging and experimenting with PDF content streams. Never + // use it for production files. + void setContentNormalization(bool); + + // Set QDF mode. QDF mode causes special "pretty printing" of + // PDF objects, adds comments for easier perusing of files. + // Resulting PDF files can be edited in a text editor and then run + // through fix-qdf to update cross reference tables and stream + // lengths. + void setQDFMode(bool); + + // Cause a static /ID value to be generated. Use only in test + // suites. + void setStaticID(bool); + + // Preserve encryption. The default is true unless prefilering, + // content normalization, or qdf mode has been selected in which + // case encryption is never preserved. Encryption is also not + // preserved if we explicitly set encryption parameters. + void setPreserveEncryption(bool); + + // Set up for encrypted output. Disables stream prefiltering and + // content normalization. Note that setting R2 encryption + // parameters sets the PDF version to at least 1.3, and setting R3 + // encryption parameters pushes the PDF version number to at least + // 1.4. + void setR2EncryptionParameters( + char const* user_password, char const* owner_password, + bool allow_print, bool allow_modify, + bool allow_extract, bool allow_annotate); + enum r3_print_e + { + r3p_full, // allow all printing + r3p_low, // allow only low-resolution printing + r3p_none // allow no printing + }; + enum r3_modify_e + { + r3m_all, // allow all modification + r3m_annotate, // allow comment authoring and form operations + r3m_form, // allow form field fill-in or signing + r3m_assembly, // allow only document assembly + r3m_none // allow no modification + }; + void setR3EncryptionParameters( + char const* user_password, char const* owner_password, + bool allow_accessibility, bool allow_extract, + r3_print_e print, r3_modify_e modify); + + // Create linearized output. Disables qdf mode, content + // normalization, and stream prefiltering. + void setLinearization(bool); + + void write(); + + private: + // flags used by unparseObject + static int const f_stream = 1 << 0; + static int const f_filtered = 1 << 1; + static int const f_in_ostream = 1 << 2; + + enum trailer_e { t_normal, t_lin_first, t_lin_second }; + + int bytesNeeded(unsigned long n); + void writeBinary(unsigned long val, unsigned int bytes); + void writeString(std::string const& str); + void writeBuffer(PointerHolder&); + void writeStringQDF(std::string const& str); + void writeStringNoQDF(std::string const& str); + void assignCompressedObjectNumbers(int objid); + void enqueueObject(QPDFObjectHandle object); + void writeObjectStreamOffsets(std::vector& offsets, int first_obj); + void writeObjectStream(QPDFObjectHandle object); + void writeObject(QPDFObjectHandle object, int object_stream_index = -1); + void writeTrailer(trailer_e which, int size, + bool xref_stream, int prev = 0); + void unparseObject(QPDFObjectHandle object, int level, + unsigned int flags); + void unparseObject(QPDFObjectHandle object, int level, + unsigned int flags, + // for stream dictionaries + int stream_length, bool compress); + void unparseChild(QPDFObjectHandle child, int level, int flags); + void initializeSpecialStreams(); + void preserveObjectStreams(); + void generateObjectStreams(); + void generateID(); + void setEncryptionParameters( + char const* user_password, char const* owner_password, + int V, int R, int key_len, std::set& bits_to_clear); + void setEncryptionParametersInternal( + int V, int R, int key_len, long P, + std::string const& O, std::string const& U, + std::string const& id1, std::string const& user_password); + void copyEncryptionParameters(); + void setDataKey(int objid); + int openObject(int objid = 0); + void closeObject(int objid); + void writeStandard(); + void writeLinearized(); + void enqueuePart(std::vector& part); + void writeEncryptionDictionary(); + void writeHeader(); + void writeHintStream(int hint_id); + int writeXRefTable(trailer_e which, int first, int last, int size); + int writeXRefTable(trailer_e which, int first, int last, int size, + // for linearization + int prev, + bool suppress_offsets, + int hint_id, + int hint_offset, + int hint_length); + int writeXRefStream(int objid, int max_id, int max_offset, + trailer_e which, int first, int last, int size); + int writeXRefStream(int objid, int max_id, int max_offset, + trailer_e which, int first, int last, int size, + // for linearization + int prev, + int hint_id, + int hint_offset, + int hint_length); + + // When filtering subsections, push additional pipelines to the + // stack. When ready to switch, activate the pipeline stack. + // Pipelines passed to pushPipeline are deleted when + // clearPipelineStack is called. + Pipeline* pushPipeline(Pipeline*); + void activatePipelineStack(); + + // Calls finish on the current pipeline and pops the pipeline + // stack until the top of stack is a previous active top of stack, + // and restores the pipeline to that point. Deletes any piplines + // that it pops. If the bp argument is non-null and any of the + // stack items are of type Pl_Buffer, the buffer is retrieved. + void popPipelineStack(PointerHolder* bp = 0); + + void pushEncryptionFilter(); + void pushDiscardFilter(); + + QPDF& pdf; + char const* filename; + FILE* file; + bool close_file; + bool normalize_content_set; + bool normalize_content; + bool stream_data_mode_set; + stream_data_e stream_data_mode; + bool qdf_mode; + bool static_id; + bool direct_stream_lengths; + bool encrypted; + bool preserve_encryption; + bool linearized; + object_stream_e object_stream_mode; + std::string encryption_key; + std::map encryption_dictionary; + + std::string id1; // for /ID key of + std::string id2; // trailer dictionary + std::string min_pdf_version; + int encryption_dict_objid; + std::string cur_data_key; + std::list > to_delete; + Pl_Count* pipeline; + std::list object_queue; + std::map obj_renumber; + std::map xref; + std::map lengths; + int next_objid; + int cur_stream_length_id; + int cur_stream_length; + bool added_newline; + int max_ostream_index; + std::set normalized_streams; + std::map page_object_to_seq; + std::map contents_to_page_seq; + std::map object_to_object_stream; + std::map > object_stream_to_objects; + std::list pipeline_stack; +}; + +#endif // __QPDFWRITER_HH__ diff --git a/include/qpdf/QPDFXRefEntry.hh b/include/qpdf/QPDFXRefEntry.hh new file mode 100644 index 00000000..4b1db9a2 --- /dev/null +++ b/include/qpdf/QPDFXRefEntry.hh @@ -0,0 +1,34 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QPDFXREFENTRY_HH__ +#define __QPDFXREFENTRY_HH__ + +class QPDFXRefEntry +{ + public: + // Type constants are from the PDF spec section + // "Cross-Reference Streams": + // 0 = free entry; not used + // 1 = "uncompressed"; field 1 = offset + // 2 = "compressed"; field 1 = object stream number, field 2 = index + + QPDFXRefEntry(); + QPDFXRefEntry(int type, int field1, int field2); + + int getType() const; + int getOffset() const; // only for type 1 + int getObjStreamNumber() const; // only for type 2 + int getObjStreamIndex() const; // only for type 2 + + private: + int type; + int field1; + int field2; +}; + +#endif // __QPDFXREFENTRY_HH__ diff --git a/include/qpdf/QTC.hh b/include/qpdf/QTC.hh new file mode 100644 index 00000000..3d9597d4 --- /dev/null +++ b/include/qpdf/QTC.hh @@ -0,0 +1,16 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QTC_HH__ +#define __QTC_HH__ + +namespace QTC +{ + void TC(char const* const scope, char const* const ccase, int n = 0); +}; + +#endif // __QTC_HH__ diff --git a/include/qpdf/QUtil.hh b/include/qpdf/QUtil.hh new file mode 100644 index 00000000..f2b67d92 --- /dev/null +++ b/include/qpdf/QUtil.hh @@ -0,0 +1,45 @@ +// Copyright (c) 2005-2008 Jay Berkenbilt +// +// This file is part of qpdf. This software may be distributed under +// the terms of version 2 of the Artistic License which may be found +// in the source distribution. It is provided "as is" without express +// or implied warranty. + +#ifndef __QUTIL_HH__ +#define __QUTIL_HH__ + +#include +#include +#include +#include + +#include + +namespace QUtil +{ + // This is a collection of useful utility functions that don't + // really go anywhere else. + std::string int_to_string(int, int length = 0); + std::string double_to_string(double, int decimal_places = 0); + + // If status is -1, convert the current value of errno to a + // QEXC::System exception. Otherwise, return status. + int os_wrapper(std::string const& description, int status) + throw (QEXC::System); + + FILE* fopen_wrapper(std::string const&, FILE*) + throw (QEXC::System); + + char* copy_string(std::string const&); + + // Get the value of an environment variable in a portable fashion. + // Returns true iff the variable is defined. If `value' is + // non-null, initializes it with the value of the variable. + bool get_env(std::string const& var, std::string* value = 0); + + // Return a string containing the byte representation of the UTF-8 + // encoding for the unicode value passed in. + std::string toUTF8(unsigned long uval); +}; + +#endif // __QUTIL_HH__ diff --git a/install-sh b/install-sh new file mode 100755 index 00000000..a5897de6 --- /dev/null +++ b/install-sh @@ -0,0 +1,519 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-12-25.00 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/libqpdf/BitStream.cc b/libqpdf/BitStream.cc new file mode 100644 index 00000000..c6fda4e6 --- /dev/null +++ b/libqpdf/BitStream.cc @@ -0,0 +1,45 @@ + + +#include + +// See comments in bits.cc +#define BITS_READ 1 +#include "bits.icc" + +BitStream::BitStream(unsigned char const* p, int nbytes) : + start(p), + nbytes(nbytes) +{ + reset(); +} + +void +BitStream::reset() +{ + p = start; + bit_offset = 7; + bits_available = 8 * nbytes; +} + +unsigned long +BitStream::getBits(int nbits) +{ + return read_bits(this->p, this->bit_offset, + this->bits_available, nbits); +} + +void +BitStream::skipToNextByte() +{ + if (bit_offset != 7) + { + unsigned int bits_to_skip = bit_offset + 1; + if (bits_available < bits_to_skip) + { + throw QEXC::Internal("overflow skipping to next byte in bitstream"); + } + bit_offset = 7; + ++p; + bits_available -= bits_to_skip; + } +} diff --git a/libqpdf/BitWriter.cc b/libqpdf/BitWriter.cc new file mode 100644 index 00000000..f682aac5 --- /dev/null +++ b/libqpdf/BitWriter.cc @@ -0,0 +1,30 @@ + + +#include + +// See comments in bits.cc +#define BITS_WRITE 1 +#include "bits.icc" + +BitWriter::BitWriter(Pipeline* pl) : + pl(pl), + ch(0), + bit_offset(7) +{ +} + +void +BitWriter::writeBits(unsigned long val, int bits) +{ + write_bits(this->ch, this->bit_offset, val, bits, this->pl); +} + +void +BitWriter::flush() +{ + if (bit_offset < 7) + { + int bits_to_write = bit_offset + 1; + write_bits(this->ch, this->bit_offset, 0, bits_to_write, this->pl); + } +} diff --git a/libqpdf/Buffer.cc b/libqpdf/Buffer.cc new file mode 100644 index 00000000..3dde1f90 --- /dev/null +++ b/libqpdf/Buffer.cc @@ -0,0 +1,79 @@ + +#include + +#include + +Buffer::Buffer() +{ + init(0); +} + +Buffer::Buffer(unsigned long size) +{ + init(size); +} + +Buffer::Buffer(Buffer const& rhs) +{ + init(0); + copy(rhs); +} + +Buffer& +Buffer::operator=(Buffer const& rhs) +{ + copy(rhs); + return *this; +} + +Buffer::~Buffer() +{ + destroy(); +} + +void +Buffer::init(unsigned long size) +{ + this->size = size; + this->buf = (size ? new unsigned char[size] : 0); +} + +void +Buffer::copy(Buffer const& rhs) +{ + if (this != &rhs) + { + this->destroy(); + this->init(rhs.size); + if (this->size) + { + memcpy(this->buf, rhs.buf, this->size); + } + } +} + +void +Buffer::destroy() +{ + delete [] this->buf; + this->size = 0; + this->buf = 0; +} + +unsigned long +Buffer::getSize() const +{ + return this->size; +} + +unsigned char const* +Buffer::getBuffer() const +{ + return this->buf; +} + +unsigned char* +Buffer::getBuffer() +{ + return this->buf; +} diff --git a/libqpdf/MD5.cc b/libqpdf/MD5.cc new file mode 100644 index 00000000..ecdd8a33 --- /dev/null +++ b/libqpdf/MD5.cc @@ -0,0 +1,441 @@ +// This file implements a class for computation of MD5 checksums. +// It is derived from the reference algorithm for MD5 as given in +// RFC 1321. The original copyright notice is as follows: +// +///////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +// rights reserved. +// +// License to copy and use this software is granted provided that it +// is identified as the "RSA Data Security, Inc. MD5 Message-Digest +// Algorithm" in all material mentioning or referencing this software +// or this function. +// +// License is also granted to make and use derivative works provided +// that such works are identified as "derived from the RSA Data +// Security, Inc. MD5 Message-Digest Algorithm" in all material +// mentioning or referencing the derived work. +// +// RSA Data Security, Inc. makes no representations concerning either +// the merchantability of this software or the suitability of this +// software for any particular purpose. It is provided "as is" +// without express or implied warranty of any kind. +// +// These notices must be retained in any copies of any part of this +// documentation and/or software. +// +///////////////////////////////////////////////////////////////////////// + +#include + +#include +#include +#include +#include +#include + +int const S11 = 7; +int const S12 = 12; +int const S13 = 17; +int const S14 = 22; +int const S21 = 5; +int const S22 = 9; +int const S23 = 14; +int const S24 = 20; +int const S31 = 4; +int const S32 = 11; +int const S33 = 16; +int const S34 = 23; +int const S41 = 6; +int const S42 = 10; +int const S43 = 15; +int const S44 = 21; + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +// F, G, H and I are basic MD5 functions. +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +// ROTATE_LEFT rotates x left n bits. +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +// Rotation is separate from addition to prevent recomputation. +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +// MD5 initialization. Begins an MD5 operation, writing a new context. +void MD5::init() +{ + count[0] = count[1] = 0; + // Load magic initialization constants. + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + + finalized = false; + memset(digest_val, 0, sizeof(digest_val)); +} + +// MD5 block update operation. Continues an MD5 message-digest +// operation, processing another message block, and updating the +// context. + +void MD5::update(unsigned char *input, + unsigned int inputLen) +{ + unsigned int i, index, partLen; + + // Compute number of bytes mod 64 + index = (unsigned int)((count[0] >> 3) & 0x3F); + + // Update number of bits + if ((count[0] += ((UINT4)inputLen << 3)) + < ((UINT4)inputLen << 3)) + count[1]++; + count[1] += ((UINT4)inputLen >> 29); + + partLen = 64 - index; + + // Transform as many times as possible. + + if (inputLen >= partLen) { + memcpy + ((POINTER)&buffer[index], (POINTER)input, partLen); + transform(state, buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + transform(state, &input[i]); + + index = 0; + } + else + i = 0; + + // Buffer remaining input + memcpy + ((POINTER)&buffer[index], (POINTER)&input[i], + inputLen-i); +} + +// MD5 finalization. Ends an MD5 message-digest operation, writing the +// the message digest and zeroizing the context. +void MD5::final() +{ + if (finalized) + { + return; + } + + unsigned char bits[8]; + unsigned int index, padLen; + + // Save number of bits + encode(bits, count, 8); + + // Pad out to 56 mod 64. + + index = (unsigned int)((count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + update(PADDING, padLen); + + // Append length (before padding) + update(bits, 8); + // Store state in digest_val + encode(digest_val, state, 16); + + // Zeroize sensitive information. + memset(state, 0, sizeof(state)); + memset(count, 0, sizeof(count)); + memset(buffer, 0, sizeof(buffer)); + + finalized = true; +} + +// MD5 basic transformation. Transforms state based on block. +void MD5::transform(UINT4 state[4], unsigned char block[64]) +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + decode(x, block, 64); + + // Round 1 + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); // 1 + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); // 2 + FF (c, d, a, b, x[ 2], S13, 0x242070db); // 3 + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); // 4 + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); // 5 + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); // 6 + FF (c, d, a, b, x[ 6], S13, 0xa8304613); // 7 + FF (b, c, d, a, x[ 7], S14, 0xfd469501); // 8 + FF (a, b, c, d, x[ 8], S11, 0x698098d8); // 9 + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); // 10 + FF (c, d, a, b, x[10], S13, 0xffff5bb1); // 11 + FF (b, c, d, a, x[11], S14, 0x895cd7be); // 12 + FF (a, b, c, d, x[12], S11, 0x6b901122); // 13 + FF (d, a, b, c, x[13], S12, 0xfd987193); // 14 + FF (c, d, a, b, x[14], S13, 0xa679438e); // 15 + FF (b, c, d, a, x[15], S14, 0x49b40821); // 16 + + // Round 2 + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); // 17 + GG (d, a, b, c, x[ 6], S22, 0xc040b340); // 18 + GG (c, d, a, b, x[11], S23, 0x265e5a51); // 19 + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); // 20 + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); // 21 + GG (d, a, b, c, x[10], S22, 0x2441453); // 22 + GG (c, d, a, b, x[15], S23, 0xd8a1e681); // 23 + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); // 24 + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); // 25 + GG (d, a, b, c, x[14], S22, 0xc33707d6); // 26 + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); // 27 + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); // 28 + GG (a, b, c, d, x[13], S21, 0xa9e3e905); // 29 + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); // 30 + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); // 31 + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); // 32 + + // Round 3 + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); // 33 + HH (d, a, b, c, x[ 8], S32, 0x8771f681); // 34 + HH (c, d, a, b, x[11], S33, 0x6d9d6122); // 35 + HH (b, c, d, a, x[14], S34, 0xfde5380c); // 36 + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); // 37 + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); // 38 + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); // 39 + HH (b, c, d, a, x[10], S34, 0xbebfbc70); // 40 + HH (a, b, c, d, x[13], S31, 0x289b7ec6); // 41 + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); // 42 + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); // 43 + HH (b, c, d, a, x[ 6], S34, 0x4881d05); // 44 + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); // 45 + HH (d, a, b, c, x[12], S32, 0xe6db99e5); // 46 + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); // 47 + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); // 48 + + // Round 4 + II (a, b, c, d, x[ 0], S41, 0xf4292244); // 49 + II (d, a, b, c, x[ 7], S42, 0x432aff97); // 50 + II (c, d, a, b, x[14], S43, 0xab9423a7); // 51 + II (b, c, d, a, x[ 5], S44, 0xfc93a039); // 52 + II (a, b, c, d, x[12], S41, 0x655b59c3); // 53 + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); // 54 + II (c, d, a, b, x[10], S43, 0xffeff47d); // 55 + II (b, c, d, a, x[ 1], S44, 0x85845dd1); // 56 + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); // 57 + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); // 58 + II (c, d, a, b, x[ 6], S43, 0xa3014314); // 59 + II (b, c, d, a, x[13], S44, 0x4e0811a1); // 60 + II (a, b, c, d, x[ 4], S41, 0xf7537e82); // 61 + II (d, a, b, c, x[11], S42, 0xbd3af235); // 62 + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); // 63 + II (b, c, d, a, x[ 9], S44, 0xeb86d391); // 64 + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + // Zeroize sensitive information. + + memset ((POINTER)x, 0, sizeof (x)); +} + +// Encodes input (UINT4) into output (unsigned char). Assumes len is a +// multiple of 4. +void MD5::encode(unsigned char *output, UINT4 *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +// Decodes input (unsigned char) into output (UINT4). Assumes len is a +// multiple of 4. +void MD5::decode(UINT4 *output, unsigned char *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | + (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); +} + +// Public functions + +MD5::MD5() +{ + init(); +} + +void MD5::reset() +{ + init(); +} + +void MD5::encodeString(char const* str) +{ + unsigned int len = strlen(str); + + update((unsigned char *)str, len); + final(); +} + +void MD5::appendString(char const* input_string) +{ + update((unsigned char *)input_string, strlen(input_string)); +} + +void MD5::encodeDataIncrementally(char const* data, int len) +{ + update((unsigned char *)data, len); +} + +void MD5::encodeFile(char const *filename, int up_to_size) + throw (QEXC::System) +{ + FILE *file; + unsigned char buffer[1024]; + + if ((file = fopen (filename, "rb")) == NULL) + { + throw QEXC::System(std::string("MD5: can't open ") + filename, errno); + } + + int len; + int so_far = 0; + int to_try = 1024; + do + { + if ((up_to_size >= 0) && ((so_far + to_try) > up_to_size)) + { + to_try = up_to_size - so_far; + } + len = fread(buffer, 1, to_try, file); + if (len > 0) + { + update(buffer, len); + so_far += len; + if ((up_to_size >= 0) && (so_far >= up_to_size)) + { + break; + } + } + } while (len > 0); + if (ferror(file)) + { + // Assume, perhaps incorrectly, that errno was set by the + // underlying call to read.... + (void) fclose(file); + throw QEXC::System(std::string("MD5: read error on ") + filename, errno); + } + (void) fclose(file); + + final(); +} + +void MD5::digest(Digest result) +{ + final(); + memcpy(result, digest_val, sizeof(digest_val)); +} + +void MD5::print() +{ + final(); + + unsigned int i; + for (i = 0; i < 16; ++i) + { + printf("%02x", digest_val[i]); + } + printf("\n"); +} + +std::string MD5::unparse() +{ + final(); + + char result[33]; + char* p = result; + unsigned int i; + for (i = 0; i < 16; ++i) + { + sprintf(p, "%02x", digest_val[i]); + p += 2; + } + return result; +} + +std::string +MD5::getDataChecksum(char const* buf, int len) +{ + MD5 m; + m.encodeDataIncrementally(buf, len); + return m.unparse(); +} + +std::string +MD5::getFileChecksum(char const* filename, int up_to_size) +{ + MD5 m; + m.encodeFile(filename, up_to_size); + return m.unparse(); +} + +bool +MD5::checkDataChecksum(char const* const checksum, + char const* buf, int len) +{ + std::string actual_checksum = getDataChecksum(buf, len); + return (checksum == actual_checksum); +} + +bool +MD5::checkFileChecksum(char const* const checksum, + char const* filename, int up_to_size) +{ + bool result = false; + try + { + std::string actual_checksum = getFileChecksum(filename, up_to_size); + result = (checksum == actual_checksum); + } + catch (QEXC::System) + { + // Ignore -- return false + } + return result; +} diff --git a/libqpdf/Makefile b/libqpdf/Makefile new file mode 100644 index 00000000..90899055 --- /dev/null +++ b/libqpdf/Makefile @@ -0,0 +1 @@ +include ../make/proxy.mk diff --git a/libqpdf/PCRE.cc b/libqpdf/PCRE.cc new file mode 100644 index 00000000..afa6e954 --- /dev/null +++ b/libqpdf/PCRE.cc @@ -0,0 +1,365 @@ + + +#include +#include + +#include + +PCRE::Exception::Exception(std::string const& message) +{ + this->setMessage("PCRE error: " + message); +} + +PCRE::NoBackref::NoBackref() : + Exception("no match") +{ +} + +PCRE::Match::Match(int nbackrefs, char const* subject) +{ + this->init(-1, nbackrefs, subject); +} + +PCRE::Match::~Match() +{ + this->destroy(); +} + +PCRE::Match::Match(Match const& rhs) +{ + this->copy(rhs); +} + +PCRE::Match& +PCRE::Match::operator=(Match const& rhs) +{ + if (this != &rhs) + { + this->destroy(); + this->copy(rhs); + } + return *this; +} + +void +PCRE::Match::init(int nmatches, int nbackrefs, char const* subject) +{ + this->nmatches = nmatches; + this->nbackrefs = nbackrefs; + this->subject = subject; + this->ovecsize = 3 * (1 + nbackrefs); + this->ovector = 0; + if (this->ovecsize) + { + this->ovector = new int[this->ovecsize]; + } +} + +void +PCRE::Match::copy(Match const& rhs) +{ + this->init(rhs.nmatches, rhs.nbackrefs, rhs.subject); + int i; + for (i = 0; i < this->ovecsize; ++i) + { + this->ovector[i] = rhs.ovector[i]; + } +} + +void +PCRE::Match::destroy() +{ + delete [] this->ovector; +} + +PCRE::Match::operator bool() +{ + return (this->nmatches >= 0); +} + + +std::string +PCRE::Match::getMatch(int n, int flags) + throw(QEXC::General, Exception) +{ + // This method used to be implemented in terms of + // pcre_get_substring, but that function gives you an empty string + // for an unmatched backreference that is in range. + + int offset; + int length; + try + { + getOffsetLength(n, offset, length); + } + catch (NoBackref&) + { + if (flags & gm_no_substring_returns_empty) + { + return ""; + } + else + { + throw; + } + } + + return std::string(this->subject).substr(offset, length); +} + +void +PCRE::Match::getOffsetLength(int n, int& offset, int& length) throw(Exception) +{ + if ((this->nmatches < 0) || + (n > this->nmatches - 1) || + (this->ovector[n * 2] == -1)) + { + throw NoBackref(); + } + offset = this->ovector[n * 2]; + length = this->ovector[n * 2 + 1] - offset; +} + + +int +PCRE::Match::getOffset(int n) throw(Exception) +{ + int offset; + int length; + this->getOffsetLength(n, offset, length); + return offset; +} + + +int +PCRE::Match::getLength(int n) throw(Exception) +{ + int offset; + int length; + this->getOffsetLength(n, offset, length); + return length; +} + + +int +PCRE::Match::nMatches() const +{ + return this->nmatches; +} + +PCRE::PCRE(char const* pattern, int options) throw (Exception) +{ + char const *errptr; + int erroffset; + this->code = pcre_compile(pattern, options, &errptr, &erroffset, 0); + if (this->code) + { + this->nbackrefs = pcre_info(this->code, 0, 0); + } + else + { + std::string message = (std::string("compilation of ") + pattern + + " failed at offset " + + QUtil::int_to_string(erroffset) + ": " + + errptr); + throw Exception(message); + } +} + +PCRE::~PCRE() +{ + pcre_free(this->code); +} + +PCRE::Match +PCRE::match(char const* subject, int options, int startoffset, int size) + throw (QEXC::General, Exception) +{ + if (size == -1) + { + size = strlen(subject); + } + + Match result(this->nbackrefs, subject); + int status = pcre_exec(this->code, 0, subject, size, + startoffset, options, + result.ovector, result.ovecsize); + if (status >= 0) + { + result.nmatches = status; + } + else + { + std::string message; + + switch (status) + { + case PCRE_ERROR_NOMATCH: + break; + + case PCRE_ERROR_BADOPTION: + message = "bad option passed to PCRE::match()"; + throw Exception(message); + break; + + case PCRE_ERROR_NOMEMORY: + message = "insufficient memory"; + throw Exception(message); + break; + + case PCRE_ERROR_NULL: + case PCRE_ERROR_BADMAGIC: + case PCRE_ERROR_UNKNOWN_NODE: + default: + message = "pcre_exec returned " + QUtil::int_to_string(status); + throw QEXC::Internal(message); + } + } + + return result; +} + +void +PCRE::test(int n) +{ + try + { + if (n == 1) + { + static char const* utf8 = "abÏ€defq"; + PCRE u1("^([[:alpha:]]+)"); + PCRE u2("^([\\p{L}]+)", PCRE_UTF8); + PCRE::Match m1 = u1.match(utf8); + if (m1) + { + std::cout << "no utf8: " << m1.getMatch(1) << std::endl; + } + PCRE::Match m2 = u2.match(utf8); + if (m2) + { + std::cout << "utf8: " << m2.getMatch(1) << std::endl; + } + return; + } + + try + { + PCRE pcre1("a**"); + } + catch (Exception& e) + { + std::cout << e.unparse() << std::endl; + } + + PCRE pcre2("^([^\\s:]*)\\s*:\\s*(.*?)\\s*$"); + PCRE::Match m2 = pcre2.match("key: value one two three "); + if (m2) + { + std::cout << m2.nMatches() << std::endl; + std::cout << m2.getMatch(0) << std::endl; + std::cout << m2.getOffset(0) << std::endl; + std::cout << m2.getLength(0) << std::endl; + std::cout << m2.getMatch(1) << std::endl; + std::cout << m2.getOffset(1) << std::endl; + std::cout << m2.getLength(1) << std::endl; + std::cout << m2.getMatch(2) << std::endl; + std::cout << m2.getOffset(2) << std::endl; + std::cout << m2.getLength(2) << std::endl; + try + { + std::cout << m2.getMatch(3) << std::endl; + } + catch (Exception& e) + { + std::cout << e.unparse() << std::endl; + } + try + { + std::cout << m2.getOffset(3) << std::endl; + } + catch (Exception& e) + { + std::cout << e.unparse() << std::endl; + } + } + PCRE pcre3("^(a+)(b+)?$"); + PCRE::Match m3 = pcre3.match("aaa"); + try + { + if (m3) + { + std::cout << m3.nMatches() << std::endl; + std::cout << m3.getMatch(0) << std::endl; + std::cout << m3.getMatch(1) << std::endl; + std::cout << "-" + << m3.getMatch( + 2, Match::gm_no_substring_returns_empty) + << "-" << std::endl; + std::cout << "hello" << std::endl; + std::cout << m3.getMatch(2) << std::endl; + std::cout << "can't see this" << std::endl; + } + } + catch (Exception& e) + { + std::cout << e.unparse() << std::endl; + } + + // backref: 1 2 3 4 5 + PCRE pcre4("^((?:(a(b)?)(?:,(c))?)|(c))?$"); + static char const* candidates[] = { + "qqqcqqq", // no match + "ab,c", // backrefs: 0, 1, 2, 3, 4 + "ab", // backrefs: 0, 1, 2, 3 + "a", // backrefs: 0, 1, 2 + "a,c", // backrefs: 0, 1, 2, 4 + "c", // backrefs: 0, 1, 5 + "", // backrefs: 0 + 0 + }; + for (char const** p = candidates; *p; ++p) + { + PCRE::Match m(pcre4.match(*p)); + if (m) + { + int nmatches = m.nMatches(); + for (int i = 0; i < nmatches; ++i) + { + std::cout << *p << ": " << i << ": "; + try + { + std::string match = m.getMatch(i); + std::cout << match; + } + catch (NoBackref&) + { + std::cout << "no backref (getMatch)"; + } + std::cout << std::endl; + + std::cout << *p << ": " << i << ": "; + try + { + int offset; + int length; + m.getOffsetLength(i, offset, length); + std::cout << offset << ", " << length; + } + catch (NoBackref&) + { + std::cout << "no backref (getOffsetLength)"; + } + std:: cout << std::endl; + } + } + else + { + std::cout << *p << ": no match" << std::endl; + } + } + } + catch (QEXC::General& e) + { + std::cout << "unexpected exception: " << e.unparse() << std::endl; + } +} diff --git a/libqpdf/Pipeline.cc b/libqpdf/Pipeline.cc new file mode 100644 index 00000000..17c0c8b2 --- /dev/null +++ b/libqpdf/Pipeline.cc @@ -0,0 +1,25 @@ + + +#include + +Pipeline::Pipeline(char const* identifier, Pipeline* next) : + identifier(identifier), + next(next) +{ +} + +Pipeline::~Pipeline() +{ +} + +Pipeline* +Pipeline::getNext(bool allow_null) +{ + if ((next == 0) && (! allow_null)) + { + throw Exception( + this->identifier + + ": Pipeline::getNext() called on pipeline with no next"); + } + return this->next; +} diff --git a/libqpdf/Pl_ASCII85Decoder.cc b/libqpdf/Pl_ASCII85Decoder.cc new file mode 100644 index 00000000..4ecdaf41 --- /dev/null +++ b/libqpdf/Pl_ASCII85Decoder.cc @@ -0,0 +1,131 @@ +#include +#include +#include +#include + +Pl_ASCII85Decoder::Pl_ASCII85Decoder(char const* identifier, Pipeline* next) : + Pipeline(identifier, next), + pos(0), + eod(0) +{ + memset(this->inbuf, 117, 5); +} + +Pl_ASCII85Decoder::~Pl_ASCII85Decoder() +{ +} + +void +Pl_ASCII85Decoder::write(unsigned char* buf, int len) +{ + if (eod > 1) + { + return; + } + for (int i = 0; i < len; ++i) + { + if (eod > 1) + { + break; + } + else if (eod == 1) + { + if (buf[i] == '>') + { + flush(); + eod = 2; + } + else + { + throw QEXC::General( + "broken end-of-data sequence in base 85 data"); + } + } + else + { + switch (buf[i]) + { + case ' ': + case '\f': + case '\v': + case '\t': + case '\r': + case '\n': + QTC::TC("libtests", "Pl_ASCII85Decoder ignore space"); + // ignore whitespace + break; + + case '~': + eod = 1; + break; + + case 'z': + if (pos != 0) + { + throw QEXC::General( + "unexpected z during base 85 decode"); + } + else + { + QTC::TC("libtests", "Pl_ASCII85Decoder read z"); + getNext()->write((unsigned char*)"\000\000\000\000", 4); + } + break; + + default: + if ((buf[i] < 33) || (buf[i] > 117)) + { + throw QEXC::General + ("character out of range during base 85 decode"); + } + else + { + this->inbuf[this->pos++] = buf[i]; + if (pos == 5) + { + flush(); + } + } + break; + } + } + } +} + +void +Pl_ASCII85Decoder::flush() +{ + if (this->pos == 0) + { + QTC::TC("libtests", "Pl_ASCII85Decoder no-op flush"); + return; + } + unsigned long lval = 0; + for (int i = 0; i < 5; ++i) + { + lval *= 85; + lval += (this->inbuf[i] - 33); + } + + unsigned char outbuf[4]; + memset(outbuf, 0, 4); + for (int i = 3; i >= 0; --i) + { + outbuf[i] = lval & 0xff; + lval >>= 8; + } + + QTC::TC("libtests", "Pl_ASCII85Decoder partial flush", + (this->pos == 5) ? 0 : 1); + getNext()->write(outbuf, this->pos - 1); + + this->pos = 0; + memset(this->inbuf, 117, 5); +} + +void +Pl_ASCII85Decoder::finish() +{ + flush(); + getNext()->finish(); +} diff --git a/libqpdf/Pl_ASCIIHexDecoder.cc b/libqpdf/Pl_ASCIIHexDecoder.cc new file mode 100644 index 00000000..d1b4ef1c --- /dev/null +++ b/libqpdf/Pl_ASCIIHexDecoder.cc @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include + +Pl_ASCIIHexDecoder::Pl_ASCIIHexDecoder(char const* identifier, Pipeline* next) : + Pipeline(identifier, next), + pos(0), + eod(false) +{ + strcpy(this->inbuf, "00"); +} + +Pl_ASCIIHexDecoder::~Pl_ASCIIHexDecoder() +{ +} + +void +Pl_ASCIIHexDecoder::write(unsigned char* buf, int len) +{ + if (this->eod) + { + return; + } + for (int i = 0; i < len; ++i) + { + char ch = toupper(buf[i]); + switch (ch) + { + case ' ': + case '\f': + case '\v': + case '\t': + case '\r': + case '\n': + QTC::TC("libtests", "Pl_ASCIIHexDecoder ignore space"); + // ignore whitespace + break; + + case '>': + this->eod = true; + flush(); + break; + + default: + if (((ch >= '0') && (ch <= '9')) || + ((ch >= 'A') && (ch <= 'F'))) + { + this->inbuf[this->pos++] = ch; + if (this->pos == 2) + { + flush(); + } + } + else + { + char t[2]; + t[0] = ch; + t[1] = 0; + throw QEXC::General( + std::string("character out of range during base Hex decode: ") + t); + } + break; + } + if (this->eod) + { + break; + } + } +} + +void +Pl_ASCIIHexDecoder::flush() +{ + if (this->pos == 0) + { + QTC::TC("libtests", "Pl_ASCIIHexDecoder no-op flush"); + return; + } + int b[2]; + for (int i = 0; i < 2; ++i) + { + if (this->inbuf[i] >= 'A') + { + b[i] = this->inbuf[i] - 'A' + 10; + } + else + { + b[i] = this->inbuf[i] - '0'; + } + } + unsigned char ch = (unsigned char)((b[0] << 4) + b[1]); + + QTC::TC("libtests", "Pl_ASCIIHexDecoder partial flush", + (this->pos == 2) ? 0 : 1); + getNext()->write(&ch, 1); + + this->pos = 0; + strcpy(this->inbuf, "00"); +} + +void +Pl_ASCIIHexDecoder::finish() +{ + flush(); + getNext()->finish(); +} diff --git a/libqpdf/Pl_Buffer.cc b/libqpdf/Pl_Buffer.cc new file mode 100644 index 00000000..185cf636 --- /dev/null +++ b/libqpdf/Pl_Buffer.cc @@ -0,0 +1,67 @@ + +#include +#include +#include + +Pl_Buffer::Pl_Buffer(char const* identifier, Pipeline* next) : + Pipeline(identifier, next), + ready(false), + total_size(0) +{ +} + +Pl_Buffer::~Pl_Buffer() +{ +} + +void +Pl_Buffer::write(unsigned char* buf, int len) +{ + Buffer* b = new Buffer(len); + memcpy(b->getBuffer(), buf, len); + this->data.push_back(b); + this->ready = false; + this->total_size += len; + + if (getNext(true)) + { + getNext()->write(buf, len); + } +} + +void +Pl_Buffer::finish() +{ + this->ready = true; + if (getNext(true)) + { + getNext()->finish(); + } +} + +Buffer* +Pl_Buffer::getBuffer() +{ + if (! this->ready) + { + throw QEXC::Internal("Pl_Buffer::getBuffer() called when not ready"); + } + + Buffer* b = new Buffer(this->total_size); + unsigned char* p = b->getBuffer(); + while (! this->data.empty()) + { + PointerHolder bph = this->data.front(); + this->data.pop_front(); + Buffer* bp = bph.getPointer(); + size_t bytes = bp->getSize(); + memcpy(p, bp->getBuffer(), bytes); + p += bytes; + this->total_size -= bytes; + } + + assert(this->total_size == 0); + this->ready = false; + + return b; +} diff --git a/libqpdf/Pl_Count.cc b/libqpdf/Pl_Count.cc new file mode 100644 index 00000000..8a361ad5 --- /dev/null +++ b/libqpdf/Pl_Count.cc @@ -0,0 +1,42 @@ + +#include + +Pl_Count::Pl_Count(char const* identifier, Pipeline* next) : + Pipeline(identifier, next), + count(0), + last_char('\0') +{ +} + +Pl_Count::~Pl_Count() +{ +} + +void +Pl_Count::write(unsigned char* buf, int len) +{ + if (len) + { + this->count += len; + getNext()->write(buf, len); + this->last_char = buf[len - 1]; + } +} + +void +Pl_Count::finish() +{ + getNext()->finish(); +} + +int +Pl_Count::getCount() const +{ + return this->count; +} + +unsigned char +Pl_Count::getLastChar() const +{ + return this->last_char; +} diff --git a/libqpdf/Pl_Discard.cc b/libqpdf/Pl_Discard.cc new file mode 100644 index 00000000..1632ea23 --- /dev/null +++ b/libqpdf/Pl_Discard.cc @@ -0,0 +1,23 @@ + +#include + +// Exercised in md5 test suite + +Pl_Discard::Pl_Discard() : + Pipeline("discard", 0) +{ +} + +Pl_Discard::~Pl_Discard() +{ +} + +void +Pl_Discard::write(unsigned char* buf, int len) +{ +} + +void +Pl_Discard::finish() +{ +} diff --git a/libqpdf/Pl_Flate.cc b/libqpdf/Pl_Flate.cc new file mode 100644 index 00000000..ba60c472 --- /dev/null +++ b/libqpdf/Pl_Flate.cc @@ -0,0 +1,198 @@ + +#include + +#include + +Pl_Flate::Pl_Flate(char const* identifier, Pipeline* next, + action_e action, int out_bufsize) : + Pipeline(identifier, next), + out_bufsize(out_bufsize), + action(action), + initialized(false) +{ + this->outbuf = new unsigned char[out_bufsize]; + + zstream.zalloc = (alloc_func)0; + zstream.zfree = (free_func)0; + zstream.opaque = (voidpf)0; + zstream.next_in = 0; + zstream.avail_in = 0; + zstream.next_out = this->outbuf; + zstream.avail_out = out_bufsize; +} + +Pl_Flate::~Pl_Flate() +{ + if (this->outbuf) + { + delete [] this->outbuf; + this->outbuf = 0; + } +} + +void +Pl_Flate::write(unsigned char* data, int len) +{ + if (this->outbuf == 0) + { + throw Exception( + this->identifier + + ": Pl_Flate: write() called after finish() called"); + } + handleData(data, len, Z_NO_FLUSH); +} + +void +Pl_Flate::handleData(unsigned char* data, int len, int flush) +{ + this->zstream.next_in = data; + this->zstream.avail_in = len; + + if (! this->initialized) + { + int err = Z_OK; + if (this->action == a_deflate) + { + err = deflateInit(&this->zstream, Z_DEFAULT_COMPRESSION); + } + else + { + err = inflateInit(&this->zstream); + } + checkError("Init", err); + this->initialized = true; + } + + int err = Z_OK; + + bool done = false; + while (! done) + { + if (action == a_deflate) + { + err = deflate(&this->zstream, flush); + } + else + { + err = inflate(&this->zstream, flush); + } + switch (err) + { + case Z_BUF_ERROR: + // Probably shouldn't be able to happen, but possible as a + // boundary condition: if the last call to inflate exactly + // filled the output buffer, it's possible that the next + // call to inflate could have nothing to do. + done = true; + break; + + case Z_STREAM_END: + done = true; + // fall through + + case Z_OK: + { + if ((this->zstream.avail_in == 0) && + (this->zstream.avail_out > 0)) + { + // There is nothing left to read, and there was + // sufficient buffer space to write everything we + // needed, so we're done for now. + done = true; + } + uLong ready = (this->out_bufsize - this->zstream.avail_out); + if (ready > 0) + { + this->getNext()->write(this->outbuf, ready); + this->zstream.next_out = this->outbuf; + this->zstream.avail_out = this->out_bufsize; + } + } + break; + + default: + this->checkError("data", err); + break; + } + } +} + +void +Pl_Flate::finish() +{ + if (this->outbuf) + { + if (this->initialized) + { + unsigned char buf[1]; + buf[0] = '\0'; + handleData(buf, 0, Z_FINISH); + int err = Z_OK; + if (action == a_deflate) + { + err = deflateEnd(&this->zstream); + } + else + { + err = inflateEnd(&this->zstream); + } + checkError("End", err); + } + + delete [] this->outbuf; + this->outbuf = 0; + } + this->getNext()->finish(); +} + +void +Pl_Flate::checkError(char const* prefix, int error_code) +{ + if (error_code != Z_OK) + { + char const* action_str = (action == a_deflate ? "deflate" : "inflate"); + std::string msg = + this->identifier + ": " + action_str + ": " + prefix + ": "; + + if (this->zstream.msg) + { + msg += this->zstream.msg; + } + else + { + switch (error_code) + { + case Z_ERRNO: + msg += "zlib system error"; + break; + + case Z_STREAM_ERROR: + msg += "zlib stream error"; + break; + + case Z_DATA_ERROR: + msg += "zlib data error"; + break; + + case Z_MEM_ERROR: + msg += "zlib memory error"; + break; + + case Z_BUF_ERROR: + msg += "zlib buffer error"; + break; + + case Z_VERSION_ERROR: + msg += "zlib version error"; + break; + + default: + msg += std::string("zlib unknown error (") + + QUtil::int_to_string(error_code) + ")"; + break; + } + } + + throw Exception(msg); + } +} diff --git a/libqpdf/Pl_LZWDecoder.cc b/libqpdf/Pl_LZWDecoder.cc new file mode 100644 index 00000000..e85531e9 --- /dev/null +++ b/libqpdf/Pl_LZWDecoder.cc @@ -0,0 +1,229 @@ +#include + +#include +#include +#include +#include + +Pl_LZWDecoder::Pl_LZWDecoder(char const* identifier, Pipeline* next, + bool early_code_change) : + Pipeline(identifier, next), + code_size(9), + next(0), + byte_pos(0), + bit_pos(0), + bits_available(0), + code_change_delta(early_code_change ? 1 : 0), + eod(false), + last_code(256) +{ + memset(buf, 0, 3); +} + + +Pl_LZWDecoder::~Pl_LZWDecoder() +{ +} + +void +Pl_LZWDecoder::write(unsigned char* bytes, int len) +{ + for (int i = 0; i < len; ++i) + { + this->buf[next++] = bytes[i]; + if (this->next == 3) + { + this->next = 0; + } + this->bits_available += 8; + if (this->bits_available >= this->code_size) + { + sendNextCode(); + } + } +} + +void +Pl_LZWDecoder::finish() +{ + getNext()->finish(); +} + +void +Pl_LZWDecoder::sendNextCode() +{ + int high = this->byte_pos; + int med = (this->byte_pos + 1) % 3; + int low = (this->byte_pos + 2) % 3; + + int bits_from_high = 8 - this->bit_pos; + int bits_from_med = this->code_size - bits_from_high; + int bits_from_low = 0; + if (bits_from_med > 8) + { + bits_from_low = bits_from_med - 8; + bits_from_med = 8; + } + int high_mask = (1 << bits_from_high) - 1; + int med_mask = 0xff - ((1 << (8 - bits_from_med)) - 1); + int low_mask = 0xff - ((1 << (8 - bits_from_low)) - 1); + int code = 0; + code += (this->buf[high] & high_mask) << bits_from_med; + code += ((this->buf[med] & med_mask) >> (8 - bits_from_med)); + if (bits_from_low) + { + code <<= bits_from_low; + code += ((this->buf[low] & low_mask) >> (8 - bits_from_low)); + this->byte_pos = low; + this->bit_pos = bits_from_low; + } + else + { + this->byte_pos = med; + this->bit_pos = bits_from_med; + } + if (this->bit_pos == 8) + { + this->bit_pos = 0; + ++this->byte_pos; + this->byte_pos %= 3; + } + this->bits_available -= this->code_size; + + handleCode(code); +} + +unsigned char +Pl_LZWDecoder::getFirstChar(int code) +{ + unsigned char result = '\0'; + if (code < 256) + { + result = (unsigned char) code; + } + else + { + assert(code > 257); + unsigned int idx = code - 258; + assert(idx < table.size()); + Buffer& b = table[idx]; + result = b.getBuffer()[0]; + } + return result; +} + +void +Pl_LZWDecoder::addToTable(unsigned char next) +{ + unsigned int last_size = 0; + unsigned char const* last_data = 0; + unsigned char tmp[1]; + + if (this->last_code < 256) + { + tmp[0] = this->last_code; + last_data = tmp; + last_size = 1; + } + else + { + assert(this->last_code > 257); + unsigned int idx = this->last_code - 258; + assert(idx < table.size()); + Buffer& b = table[idx]; + last_data = b.getBuffer(); + last_size = b.getSize(); + } + + Buffer entry(1 + last_size); + unsigned char* new_data = entry.getBuffer(); + memcpy(new_data, last_data, last_size); + new_data[last_size] = next; + this->table.push_back(entry); +} + +void +Pl_LZWDecoder::handleCode(int code) +{ + if (this->eod) + { + return; + } + + if (code == 256) + { + if (! this->table.empty()) + { + QTC::TC("libtests", "Pl_LZWDecoder intermediate reset"); + } + this->table.clear(); + this->code_size = 9; + } + else if (code == 257) + { + this->eod = true; + } + else + { + if (this->last_code != 256) + { + // Add to the table from last time. New table entry would + // be what we read last plus the first character of what + // we're reading now. + unsigned char next = '\0'; + unsigned int table_size = table.size(); + if (code < 256) + { + // just read < 256; last time's next was code + next = code; + } + else if (code > 257) + { + unsigned int idx = code - 258; + if (idx > table_size) + { + throw QEXC::General("LZWDecoder: bad code received"); + } + else if (idx == table_size) + { + // The encoder would have just created this entry, + // so the first character of this entry would have + // been the same as the first character of the + // last entry. + QTC::TC("libtests", "Pl_LZWDecoder last was table size"); + next = getFirstChar(this->last_code); + } + else + { + next = getFirstChar(code); + } + } + unsigned int last_idx = 258 + table_size; + if (last_idx == 4095) + { + throw QEXC::General("LZWDecoder: table full"); + } + addToTable(next); + unsigned int change_idx = last_idx + code_change_delta; + if ((change_idx == 511) || + (change_idx == 1023) || + (change_idx == 2047)) + { + ++this->code_size; + } + } + + if (code < 256) + { + unsigned char ch = (unsigned char) code; + getNext()->write(&ch, 1); + } + else + { + Buffer& b = table[code - 258]; + getNext()->write(b.getBuffer(), b.getSize()); + } + } + + this->last_code = code; +} diff --git a/libqpdf/Pl_MD5.cc b/libqpdf/Pl_MD5.cc new file mode 100644 index 00000000..0a2711b8 --- /dev/null +++ b/libqpdf/Pl_MD5.cc @@ -0,0 +1,43 @@ + +#include + +#include + +Pl_MD5::Pl_MD5(char const* identifier, Pipeline* next) : + Pipeline(identifier, next), + in_progress(false) +{ +} + +Pl_MD5::~Pl_MD5() +{ +} + +void +Pl_MD5::write(unsigned char* buf, int len) +{ + if (! this->in_progress) + { + this->md5.reset(); + this->in_progress = true; + } + this->md5.encodeDataIncrementally((char*) buf, len); + this->getNext()->write(buf, len); +} + +void +Pl_MD5::finish() +{ + this->getNext()->finish(); + this->in_progress = false; +} + +std::string +Pl_MD5::getHexDigest() +{ + if (this->in_progress) + { + throw QEXC::General("digest requested for in-progress MD5 Pipeline"); + } + return this->md5.unparse(); +} diff --git a/libqpdf/Pl_PNGFilter.cc b/libqpdf/Pl_PNGFilter.cc new file mode 100644 index 00000000..28b87c5e --- /dev/null +++ b/libqpdf/Pl_PNGFilter.cc @@ -0,0 +1,146 @@ + +#include +#include + +Pl_PNGFilter::Pl_PNGFilter(char const* identifier, Pipeline* next, + action_e action, unsigned int columns, + unsigned int bytes_per_pixel) : + Pipeline(identifier, next), + action(action), + columns(columns), + cur_row(0), + prev_row(0), + buf1(0), + buf2(0), + pos(0) +{ + this->buf1 = new unsigned char[columns + 1]; + this->buf2 = new unsigned char[columns + 1]; + this->cur_row = buf1; + + // number of bytes per incoming row + this->incoming = (action == a_encode ? columns : columns + 1); +} + +Pl_PNGFilter::~Pl_PNGFilter() +{ + delete [] buf1; + delete [] buf2; +} + +void +Pl_PNGFilter::write(unsigned char* data, int len) +{ + int left = this->incoming - this->pos; + unsigned int offset = 0; + while (len >= left) + { + // finish off current row + memcpy(this->cur_row + this->pos, data + offset, left); + offset += left; + len -= left; + + processRow(); + + // Swap rows + unsigned char* t = this->prev_row; + this->prev_row = this->cur_row; + this->cur_row = t ? t : this->buf2; + memset(this->cur_row, 0, this->columns + 1); + left = this->incoming; + this->pos = 0; + } + if (len) + { + memcpy(this->cur_row + this->pos, data + offset, len); + } + this->pos += len; +} + +void +Pl_PNGFilter::processRow() +{ + if (this->action == a_encode) + { + encodeRow(); + } + else + { + decodeRow(); + } +} + +void +Pl_PNGFilter::decodeRow() +{ + int filter = (int) this->cur_row[0]; + if (this->prev_row) + { + switch (filter) + { + case 0: // none + break; + + case 1: // sub + throw Exception("sub filter not implemented"); + break; + + case 2: // up + for (unsigned int i = 1; i <= this->columns; ++i) + { + this->cur_row[i] += this->prev_row[i]; + } + break; + + case 3: // average + throw Exception("average filter not implemented"); + break; + + case 4: // Paeth + throw Exception("Paeth filter not implemented"); + break; + + default: + // ignore + break; + } + } + + getNext()->write(this->cur_row + 1, this->columns); +} + +void +Pl_PNGFilter::encodeRow() +{ + // For now, hard-code to using UP filter. + unsigned char ch = 2; + getNext()->write(&ch, 1); + if (this->prev_row) + { + for (unsigned int i = 0; i < this->columns; ++i) + { + ch = this->cur_row[i] - this->prev_row[i]; + getNext()->write(&ch, 1); + } + } + else + { + getNext()->write(this->cur_row, this->columns); + } +} + +void +Pl_PNGFilter::finish() +{ + if (this->pos) + { + // write partial row + processRow(); + } + this->prev_row = 0; + this->cur_row = buf1; + this->pos = 0; + memset(this->cur_row, 0, this->columns + 1); + + getNext()->finish(); +} diff --git a/libqpdf/Pl_QPDFTokenizer.cc b/libqpdf/Pl_QPDFTokenizer.cc new file mode 100644 index 00000000..63f0caaf --- /dev/null +++ b/libqpdf/Pl_QPDFTokenizer.cc @@ -0,0 +1,179 @@ + +#include +#include +#include + +Pl_QPDFTokenizer::Pl_QPDFTokenizer(char const* identifier, Pipeline* next) : + Pipeline(identifier, next), + newline_after_next_token(false), + just_wrote_nl(false), + last_char_was_cr(false), + unread_char(false), + char_to_unread('\0'), + pass_through(false) +{ +} + +Pl_QPDFTokenizer::~Pl_QPDFTokenizer() +{ +} + +void +Pl_QPDFTokenizer::writeNext(char const* buf, int len) +{ + if (len) + { + unsigned char* t = new unsigned char[len]; + memcpy(t, buf, len); + getNext()->write(t, len); + delete [] t; + this->just_wrote_nl = (buf[len-1] == '\n'); + } +} + +void +Pl_QPDFTokenizer::writeToken(QPDFTokenizer::Token& token) +{ + std::string value = token.getRawValue(); + + switch (token.getType()) + { + case QPDFTokenizer::tt_string: + value = QPDF_String(token.getValue()).unparse(); + break; + + case QPDFTokenizer::tt_name: + value = QPDF_Name(token.getValue()).unparse(); + break; + + default: + break; + } + writeNext(value.c_str(), value.length()); +} + +void +Pl_QPDFTokenizer::processChar(char ch) +{ + if (this->pass_through) + { + // We're not noramlizing anymore -- just write this without + // looking at it. + writeNext(&ch, 1); + return; + } + + tokenizer.presentCharacter(ch); + QPDFTokenizer::Token token; + if (tokenizer.getToken(token, this->unread_char, this->char_to_unread)) + { + writeToken(token); + if (this->newline_after_next_token) + { + writeNext("\n", 1); + this->newline_after_next_token = false; + } + if ((token.getType() == QPDFTokenizer::tt_word) && + (token.getValue() == "BI")) + { + // Uh oh.... we're not sophisticated enough to handle + // inline images safely. We'd have to to set up all the + // filters and pipe the iamge data through it until the + // filtered output was the right size for an image of the + // specified dimensions. Then we'd either have to write + // out raw image data or continue to write filtered data, + // resuming normalization when we get to the end. + // Insetad, for now, we'll just turn off noramlization for + // the remainder of this stream. + this->pass_through = true; + if (this->unread_char) + { + writeNext(&this->char_to_unread, 1); + this->unread_char = false; + } + } + } + else + { + bool suppress = false; + if ((ch == '\n') && (this->last_char_was_cr)) + { + // Always ignore \n following \r + suppress = true; + } + + if ((this->last_char_was_cr = (ch == '\r'))) + { + ch = '\n'; + } + + if (this->tokenizer.betweenTokens()) + { + if (! suppress) + { + writeNext(&ch, 1); + } + } + else + { + if (ch == '\n') + { + this->newline_after_next_token = true; + } + } + } +} + + +void +Pl_QPDFTokenizer::checkUnread() +{ + if (this->unread_char) + { + processChar(this->char_to_unread); + if (this->unread_char) + { + throw QEXC::Internal("unread_char still true after processing " + "unread character"); + } + } +} + +void +Pl_QPDFTokenizer::write(unsigned char* buf, int len) +{ + checkUnread(); + for (int i = 0; i < len; ++i) + { + processChar(buf[i]); + checkUnread(); + } +} + +void +Pl_QPDFTokenizer::finish() +{ + this->tokenizer.presentEOF(); + if (! this->pass_through) + { + QPDFTokenizer::Token token; + if (tokenizer.getToken(token, this->unread_char, this->char_to_unread)) + { + writeToken(token); + if (unread_char) + { + if (this->char_to_unread == '\r') + { + this->char_to_unread = '\n'; + } + writeNext(&this->char_to_unread, 1); + } + } + } + if (! this->just_wrote_nl) + { + writeNext("\n", 1); + } + + getNext()->finish(); +} diff --git a/libqpdf/Pl_RC4.cc b/libqpdf/Pl_RC4.cc new file mode 100644 index 00000000..74e53c8b --- /dev/null +++ b/libqpdf/Pl_RC4.cc @@ -0,0 +1,57 @@ + +#include + +#include + +Pl_RC4::Pl_RC4(char const* identifier, Pipeline* next, + unsigned char const* key_data, int key_len, + int out_bufsize) : + Pipeline(identifier, next), + out_bufsize(out_bufsize), + rc4(key_data, key_len) +{ + this->outbuf = new unsigned char[out_bufsize]; +} + +Pl_RC4::~Pl_RC4() +{ + if (this->outbuf) + { + delete [] this->outbuf; + this->outbuf = 0; + } +} + +void +Pl_RC4::write(unsigned char* data, int len) +{ + if (this->outbuf == 0) + { + throw Exception( + this->identifier + + ": Pl_RC4: write() called after finish() called"); + } + + int bytes_left = len; + unsigned char* p = data; + + while (bytes_left > 0) + { + int bytes = (bytes_left < this->out_bufsize ? bytes_left : out_bufsize); + bytes_left -= bytes; + rc4.process(p, bytes, outbuf); + p += bytes; + getNext()->write(outbuf, bytes); + } +} + +void +Pl_RC4::finish() +{ + if (this->outbuf) + { + delete [] this->outbuf; + this->outbuf = 0; + } + this->getNext()->finish(); +} diff --git a/libqpdf/Pl_StdioFile.cc b/libqpdf/Pl_StdioFile.cc new file mode 100644 index 00000000..c0f42afd --- /dev/null +++ b/libqpdf/Pl_StdioFile.cc @@ -0,0 +1,48 @@ + +#include + +#include + +Pl_StdioFile::Pl_StdioFile(char const* identifier, FILE* f) : + Pipeline(identifier, 0), + file(f) +{ +} + +Pl_StdioFile::~Pl_StdioFile() +{ +} + +void +Pl_StdioFile::write(unsigned char* buf, int len) +{ + size_t so_far = 0; + while (len > 0) + { + so_far = fwrite(buf, 1, len, this->file); + if (so_far == 0) + { + throw QEXC::System(this->identifier + ": Pl_StdioFile::write", + errno); + } + else + { + buf += so_far; + len -= so_far; + } + } +} + +void +Pl_StdioFile::finish() +{ + if (fileno(this->file) != -1) + { + fflush(this->file); + } + else + { + throw QEXC::Internal(this->identifier + + ": Pl_StdioFile::finish: stream already closed"); + } +} diff --git a/libqpdf/QEXC.cc b/libqpdf/QEXC.cc new file mode 100644 index 00000000..c65afbb6 --- /dev/null +++ b/libqpdf/QEXC.cc @@ -0,0 +1,67 @@ + +#include +#include +#include + +QEXC::Base::Base() +{ + // nothing needed +} + +QEXC::Base::Base(std::string const& message) : + message(message) +{ + // nothing needed +} + +std::string const& +QEXC::Base::unparse() const +{ + return this->message; +} + +void +QEXC::Base::setMessage(std::string const& message) +{ + this->message = message; +} + +const char* +QEXC::Base::what() const throw() +{ + // Since unparse() returns a const string reference, its + // implementors must arrange to have it return a reference to a + // string that is not going to disappear. It is therefore safe + // for us to return it's c_str() pointer. + return this->unparse().c_str(); +} + +QEXC::General::General() +{ + // nothing needed +} + +QEXC::General::General(std::string const& message) : + Base(message) +{ + // nothing needed +} + +QEXC::System::System(std::string const& prefix, int sys_errno) +{ + // Note: using sys_errno in case errno is a macro. + this->sys_errno = sys_errno; + this->setMessage(prefix + ": " + strerror(sys_errno)); +} + +int +QEXC::System::getErrno() const +{ + return this->sys_errno; +} + +QEXC::Internal::Internal(std::string const& message) : + Base("INTERNAL ERROR: " + message) +{ + // nothing needed +} diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc new file mode 100644 index 00000000..6f51fa2c --- /dev/null +++ b/libqpdf/QPDF.cc @@ -0,0 +1,1851 @@ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +void +QPDF::InputSource::setLastOffset(off_t offset) +{ + this->last_offset = offset; +} + +off_t +QPDF::InputSource::getLastOffset() const +{ + return this->last_offset; +} + +std::string +QPDF::InputSource::readLine() +{ + // Read a line terminated by one or more \r or \n characters + // without caring what the exact terminator is. Consume the + // trailing newline characters but don't return them. + + off_t offset = this->tell(); + std::string buf; + enum { st_before_nl, st_at_nl } state = st_before_nl; + char ch; + while (1) + { + size_t len = this->read(&ch, 1); + if (len == 0) + { + break; + } + + if (state == st_before_nl) + { + if ((ch == '\012') || (ch == '\015')) + { + state = st_at_nl; + } + else + { + buf += ch; + } + } + else if (state == st_at_nl) + { + if ((ch == '\012') || (ch == '\015')) + { + // do nothing + } + else + { + // unread this character + this->unreadCh(ch); + break; + } + } + } + // Override last offset to be where we started this line rather + // than before the last character read + this->last_offset = offset; + return buf; +} + +QPDF::FileInputSource::FileInputSource() : + file(0) +{ +} + +void +QPDF::FileInputSource::setFilename(char const* filename) +{ + destroy(); + this->filename = filename; + this->file = QUtil::fopen_wrapper(std::string("open ") + this->filename, + fopen(this->filename.c_str(), "rb")); +} + +QPDF::FileInputSource::~FileInputSource() +{ + destroy(); +} + +void +QPDF::FileInputSource::destroy() +{ + if (this->file) + { + fclose(this->file); + this->file = 0; + } +} + +std::string const& +QPDF::FileInputSource::getName() const +{ + return this->filename; +} + +off_t +QPDF::FileInputSource::tell() +{ + return ftell(this->file); +} + +void +QPDF::FileInputSource::seek(off_t offset, int whence) +{ + QUtil::os_wrapper(std::string("seek to ") + this->filename + ", offset " + + QUtil::int_to_string(offset) + " (" + + QUtil::int_to_string(whence) + ")", + fseek(this->file, offset, whence)); +} + +void +QPDF::FileInputSource::rewind() +{ + ::rewind(this->file); +} + +size_t +QPDF::FileInputSource::read(char* buffer, int length) +{ + this->last_offset = ftell(this->file); + size_t len = fread(buffer, 1, length, this->file); + if ((len == 0) && ferror(this->file)) + { + throw QPDFExc(this->filename, this->last_offset, + std::string("read ") + + QUtil::int_to_string(length) + " bytes"); + } + return len; +} + +void +QPDF::FileInputSource::unreadCh(char ch) +{ + QUtil::os_wrapper(this->filename + ": unread character", + ungetc((unsigned char)ch, this->file)); +} + +QPDF::BufferInputSource::BufferInputSource(std::string const& description, + Buffer* buf) : + description(description), + buf(buf), + cur_offset(0) +{ +} + +QPDF::BufferInputSource::~BufferInputSource() +{ +} + +std::string const& +QPDF::BufferInputSource::getName() const +{ + return this->description; +} + +off_t +QPDF::BufferInputSource::tell() +{ + return this->cur_offset; +} + +void +QPDF::BufferInputSource::seek(off_t offset, int whence) +{ + switch (whence) + { + case SEEK_SET: + this->cur_offset = offset; + break; + + case SEEK_END: + this->cur_offset = this->buf->getSize() - offset; + break; + + case SEEK_CUR: + this->cur_offset += offset; + break; + + default: + throw QEXC::Internal("invalid argument to BufferInputSource::seek"); + break; + } +} + +void +QPDF::BufferInputSource::rewind() +{ + this->cur_offset = 0; +} + +size_t +QPDF::BufferInputSource::read(char* buffer, int length) +{ + off_t end_pos = this->buf->getSize(); + if (this->cur_offset >= end_pos) + { + this->last_offset = end_pos; + return 0; + } + + this->last_offset = this->cur_offset; + size_t len = std::min((int)(end_pos - this->cur_offset), length); + memcpy(buffer, buf->getBuffer() + this->cur_offset, len); + this->cur_offset += len; + return len; +} + +void +QPDF::BufferInputSource::unreadCh(char ch) +{ + if (this->cur_offset > 0) + { + --this->cur_offset; + } +} + +QPDF::ObjGen::ObjGen(int o = 0, int g = 0) : + obj(o), + gen(g) +{ +} + +bool +QPDF::ObjGen::ObjGen::operator<(ObjGen const& rhs) const +{ + return ((this->obj < rhs.obj) || + ((this->obj == rhs.obj) && (this->gen < rhs.gen))); +} + +QPDF::QPDF() : + encrypted(false), + encryption_initialized(false), + ignore_xref_streams(false), + suppress_warnings(false), + attempt_recovery(true), + cached_key_objid(0), + cached_key_generation(0), + first_xref_item_offset(0), + uncompressed_after_compressed(false) +{ +} + +QPDF::~QPDF() +{ +} + +void +QPDF::processFile(char const* filename, char const* password) +{ + this->file.setFilename(filename); + this->provided_password = password; + parse(); +} + +void +QPDF::setIgnoreXRefStreams(bool val) +{ + this->ignore_xref_streams = val; +} + +void +QPDF::setSuppressWarnings(bool val) +{ + this->suppress_warnings = val; +} + +void +QPDF::setAttemptRecovery(bool val) +{ + this->attempt_recovery = val; +} + +std::vector +QPDF::getWarnings() +{ + std::vector result = this->warnings; + this->warnings.clear(); + return result; +} + +void +QPDF::parse() +{ + static PCRE header_re("^%PDF-(1.\\d+)\\b"); + static PCRE eof_re("(?s:startxref\\s+(\\d+)\\s+%%EOF\\b)"); + + std::string line = this->file.readLine(); + PCRE::Match m1 = header_re.match(line.c_str()); + if (m1) + { + this->pdf_version = m1.getMatch(1); + if (atof(this->pdf_version.c_str()) < 1.2) + { + this->tokenizer.allowPoundAnywhereInName(); + } + } + else + { + QTC::TC("qpdf", "QPDF not a pdf file"); + throw QPDFExc(this->file.getName(), 0, "not a PDF file"); + } + + // PDF spec says %%EOF must be found within the last 1024 bytes of + // the file. We add an extra 30 characters to leave room for the + // startxref stuff. + static int const tbuf_size = 1054; + this->file.seek(0, SEEK_END); + if (this->file.tell() > tbuf_size) + { + this->file.seek(-tbuf_size, SEEK_END); + } + else + { + this->file.rewind(); + } + char* buf = new char[tbuf_size + 1]; + // Put buf in a PointerHolder to guarantee deletion of buf. This + // calls delete rather than delete [], but it's okay since buf is + // an array of fundamental types. + PointerHolder b(buf); + memset(buf, '\0', tbuf_size + 1); + this->file.read(buf, tbuf_size); + + // Since buf may contain null characters, we can't do a regexp + // search on buf directly. Find the last occurrence within buf + // where the regexp matches. + char* p = buf; + char const* candidate = ""; + while ((p = (char*)memchr(p, 's', tbuf_size - (p - buf))) != 0) + { + if (eof_re.match(p)) + { + candidate = p; + } + ++p; + } + + try + { + PCRE::Match m2 = eof_re.match(candidate); + if (! m2) + { + QTC::TC("qpdf", "QPDF can't find startxref"); + throw QPDFExc(this->file.getName() + ": can't find startxref"); + } + off_t xref_offset = atoi(m2.getMatch(1).c_str()); + read_xref(xref_offset); + } + catch (QPDFExc& e) + { + if (this->attempt_recovery) + { + reconstruct_xref(e); + QTC::TC("qpdf", "QPDF reconstructed xref table"); + } + else + { + throw e; + } + } + + initializeEncryption(); +} + +void +QPDF::warn(QPDFExc const& e) +{ + this->warnings.push_back(e.unparse()); + if (! this->suppress_warnings) + { + std::cerr << "WARNING: " << this->warnings.back() << std::endl; + } +} + +void +QPDF::setTrailer(QPDFObjectHandle obj) +{ + if (this->trailer.isInitialized()) + { + return; + } + this->trailer = obj; +} + +void +QPDF::reconstruct_xref(QPDFExc& e) +{ + static PCRE obj_re("^(\\d+) (\\d+) obj\\b"); + static PCRE endobj_re("^endobj\\b"); + static PCRE trailer_re("^trailer\\b"); + + warn(QPDFExc(this->file.getName(), 0, "file is damaged")); + warn(e); + warn(QPDFExc("Attempting to reconstruct cross-reference table")); + + this->file.seek(0, SEEK_END); + off_t eof = this->file.tell(); + this->file.seek(0, SEEK_SET); + bool in_obj = false; + while (this->file.tell() < eof) + { + std::string line = this->file.readLine(); + if (in_obj) + { + if (endobj_re.match(line.c_str())) + { + in_obj = false; + } + } + else + { + PCRE::Match m = obj_re.match(line.c_str()); + if (m) + { + in_obj = true; + int obj = atoi(m.getMatch(1).c_str()); + int gen = atoi(m.getMatch(2).c_str()); + int offset = this->file.getLastOffset(); + insertXrefEntry(obj, 1, offset, gen); + } + else if ((! this->trailer.isInitialized()) && + trailer_re.match(line.c_str())) + { + // read "trailer" + this->file.seek(this->file.getLastOffset(), SEEK_SET); + readToken(&this->file); + QPDFObjectHandle t = readObject(&this->file, 0, 0, false); + if (! t.isDictionary()) + { + // Oh well. It was worth a try. + } + else + { + setTrailer(t); + } + } + } + } + + if (! this->trailer.isInitialized()) + { + // We could check the last encountered object to see if it was + // an xref stream. If so, we could try to get the trailer + // from there. This may make it possible to recover files + // with bad startxref pointers even when they have object + // streams. + + throw QPDFExc(this->file.getName() + ": unable to find trailer " + "dictionary while recovering damanged file"); + } + + // We could iterate through the objects looking for streams and + // try to find objects inside of them, but it's probably not worth + // the trouble. Acrobat can't recover files with any errors in an + // xref stream, and this would be a real long shot anyway. If we + // wanted to do anything that involved looking at stream contents, + // we'd also have to call initializeEncryption() here. It's safe + // to call it more than once. +} + +void +QPDF::read_xref(off_t xref_offset) +{ + std::map free_table; + while (xref_offset) + { + this->file.seek(xref_offset, SEEK_SET); + std::string line = this->file.readLine(); + if (line == "xref") + { + xref_offset = read_xrefTable(this->file.tell()); + } + else + { + xref_offset = read_xrefStream(xref_offset); + } + } + + int size = this->trailer.getKey("/Size").getIntValue(); + int max_obj = (*(xref_table.rbegin())).first.obj; + if (! this->deleted_objects.empty()) + { + max_obj = std::max(max_obj, *(this->deleted_objects.rbegin())); + } + if (size != max_obj + 1) + { + QTC::TC("qpdf", "QPDF xref size mismatch"); + warn(QPDFExc(this->file.getName() + + std::string(": reported number of objects (") + + QUtil::int_to_string(size) + + ") inconsistent with actual number of objects (" + + QUtil::int_to_string(max_obj + 1) + ")")); + } + + // We no longer need the deleted_objects table, so go ahead and + // clear it out to make sure we never depend on its being set. + this->deleted_objects.clear(); +} + +int +QPDF::read_xrefTable(off_t xref_offset) +{ + static PCRE xref_first_re("^(\\d+)\\s+(\\d+)"); + static PCRE xref_entry_re("(?s:(^\\d{10}) (\\d{5}) ([fn])[ \r\n]{2}$)"); + + std::vector deleted_items; + + this->file.seek(xref_offset, SEEK_SET); + bool done = false; + while (! done) + { + std::string line = this->file.readLine(); + PCRE::Match m1 = xref_first_re.match(line.c_str()); + if (! m1) + { + QTC::TC("qpdf", "QPDF invalid xref"); + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "xref syntax invalid"); + } + int obj = atoi(m1.getMatch(1).c_str()); + int num = atoi(m1.getMatch(2).c_str()); + static int const xref_entry_size = 20; + char xref_entry[xref_entry_size + 1]; + for (int i = obj; i < obj + num; ++i) + { + if (i == 0) + { + // This is needed by checkLinearization() + this->first_xref_item_offset = this->file.tell(); + } + memset(xref_entry, 0, sizeof(xref_entry)); + this->file.read(xref_entry, xref_entry_size); + PCRE::Match m2 = xref_entry_re.match(xref_entry); + if (! m2) + { + QTC::TC("qpdf", "QPDF invalid xref entry"); + throw QPDFExc( + this->file.getName(), this->file.getLastOffset(), + "invalid xref entry (obj=" + + QUtil::int_to_string(i) + ")"); + } + + int f1 = atoi(m2.getMatch(1).c_str()); + int f2 = atoi(m2.getMatch(2).c_str()); + char type = m2.getMatch(3)[0]; + if (type == 'f') + { + // Save deleted items until after we've checked the + // XRefStm, if any. + deleted_items.push_back(ObjGen(i, f2)); + } + else + { + insertXrefEntry(i, 1, f1, f2); + } + } + off_t pos = this->file.tell(); + QPDFTokenizer::Token t = readToken(&this->file); + if (t == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "trailer")) + { + done = true; + } + else + { + this->file.seek(pos, SEEK_SET); + } + } + + // Set offset to previous xref table if any + QPDFObjectHandle cur_trailer = readObject(&this->file, 0, 0, false); + if (! cur_trailer.isDictionary()) + { + QTC::TC("qpdf", "QPDF missing trailer"); + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "expected trailer dictionary"); + } + + if (! this->trailer.isInitialized()) + { + setTrailer(cur_trailer); + + if (! this->trailer.hasKey("/Size")) + { + QTC::TC("qpdf", "QPDF trailer lacks size"); + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "trailer dictionary lacks /Size key"); + } + if (! this->trailer.getKey("/Size").isInteger()) + { + QTC::TC("qpdf", "QPDF trailer size not integer"); + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "/Size key in trailer dictionary is not " + "an integer"); + } + } + + if (cur_trailer.hasKey("/XRefStm")) + { + if (this->ignore_xref_streams) + { + QTC::TC("qpdf", "QPDF ignoring XRefStm in trailer"); + } + else + { + if (cur_trailer.getKey("/XRefStm").isInteger()) + { + // Read the xref stream but disregard any return value + // -- we'll use our trailer's /Prev key instead of the + // xref stream's. + (void) read_xrefStream( + cur_trailer.getKey("/XRefStm").getIntValue()); + } + else + { + throw QPDFExc(this->file.getName(), xref_offset, + "invalid /XRefStm"); + } + } + } + + // Handle any deleted items now that we've read the /XRefStm. + for (std::vector::iterator iter = deleted_items.begin(); + iter != deleted_items.end(); ++iter) + { + ObjGen& og = *iter; + insertXrefEntry(og.obj, 0, 0, og.gen); + } + + if (cur_trailer.hasKey("/Prev")) + { + if (! cur_trailer.getKey("/Prev").isInteger()) + { + QTC::TC("qpdf", "QPDF trailer prev not integer"); + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "/Prev key in trailer dictionary is not " + "an integer"); + } + QTC::TC("qpdf", "QPDF prev key in trailer dictionary"); + xref_offset = cur_trailer.getKey("/Prev").getIntValue(); + } + else + { + xref_offset = 0; + } + + return xref_offset; +} + +int +QPDF::read_xrefStream(off_t xref_offset) +{ + bool found = false; + if (! this->ignore_xref_streams) + { + int xobj; + int xgen; + QPDFObjectHandle xref_obj; + try + { + xref_obj = readObjectAtOffset(xref_offset, 0, 0, xobj, xgen); + } + catch (QPDFExc& e) + { + // ignore -- report error below + } + if (xref_obj.isInitialized() && + xref_obj.isStream() && + xref_obj.getDict().getKey("/Type").isName() && + xref_obj.getDict().getKey("/Type").getName() == "/XRef") + { + QTC::TC("qpdf", "QPDF found xref stream"); + found = true; + xref_offset = processXRefStream(xref_offset, xref_obj); + } + } + + if (! found) + { + QTC::TC("qpdf", "QPDF can't find xref"); + throw QPDFExc(this->file.getName(), xref_offset, "xref not found"); + } + + return xref_offset; +} + +int +QPDF::processXRefStream(off_t xref_offset, QPDFObjectHandle& xref_obj) +{ + QPDFObjectHandle dict = xref_obj.getDict(); + QPDFObjectHandle W_obj = dict.getKey("/W"); + QPDFObjectHandle Index_obj = dict.getKey("/Index"); + if (! (W_obj.isArray() && + (W_obj.getArrayNItems() >= 3) && + W_obj.getArrayItem(0).isInteger() && + W_obj.getArrayItem(1).isInteger() && + W_obj.getArrayItem(2).isInteger() && + dict.getKey("/Size").isInteger() && + (Index_obj.isArray() || Index_obj.isNull()))) + { + throw QPDFExc(this->file.getName(), xref_offset, + "Cross-reference stream does not have" + " proper /W and /Index keys"); + } + std::vector indx; + if (Index_obj.isArray()) + { + int n_index = Index_obj.getArrayNItems(); + if ((n_index % 2) || (n_index < 2)) + { + throw QPDFExc(this->file.getName(), xref_offset, + "Cross-reference stream's /Index has an" + " invalid number of values"); + } + for (int i = 0; i < n_index; ++i) + { + if (Index_obj.getArrayItem(i).isInteger()) + { + indx.push_back(Index_obj.getArrayItem(i).getIntValue()); + } + else + { + throw QPDFExc(this->file.getName(), xref_offset, + "Cross-reference stream's /Index's item " + + QUtil::int_to_string(i) + + " is not an integer"); + } + } + QTC::TC("qpdf", "QPDF xref /Index is array", + n_index == 2 ? 0 : 1); + } + else + { + QTC::TC("qpdf", "QPDF xref /Index is null"); + int size = dict.getKey("/Size").getIntValue(); + indx.push_back(0); + indx.push_back(size); + } + + int num_entries = 0; + for (unsigned int i = 1; i < indx.size(); i += 2) + { + num_entries += indx[i]; + } + + int W[3]; + int entry_size = 0; + for (int i = 0; i < 3; ++i) + { + W[i] = W_obj.getArrayItem(i).getIntValue(); + entry_size += W[i]; + } + + int expected_size = entry_size * num_entries; + + PointerHolder bp = xref_obj.getStreamData(); + int actual_size = bp.getPointer()->getSize(); + + if (expected_size != actual_size) + { + throw QPDFExc(this->file.getName(), xref_offset, + "Cross-reference stream data has the wrong size;" + " expected = " + QUtil::int_to_string(expected_size) + + "; actual = " + QUtil::int_to_string(actual_size)); + } + + int cur_chunk = 0; + int chunk_count = 0; + + bool saw_first_compressed_object = false; + + unsigned char const* data = bp.getPointer()->getBuffer(); + for (int i = 0; i < num_entries; ++i) + { + // Read this entry + unsigned char const* entry = data + (entry_size * i); + int fields[3]; + unsigned char const* p = entry; + for (int j = 0; j < 3; ++j) + { + fields[j] = 0; + if ((j == 0) && (W[0] == 0)) + { + QTC::TC("qpdf", "QPDF default for xref stream field 0"); + fields[0] = 1; + } + for (int k = 0; k < W[j]; ++k) + { + fields[j] <<= 8; + fields[j] += (int)(*p++); + } + } + + // Get the object and generation number. The object number is + // based on /Index. The generation number is 0 unless this is + // an uncompressed object record, in which case the generation + // number appears as the third field. + int obj = indx[cur_chunk] + chunk_count; + ++chunk_count; + if (chunk_count >= indx[cur_chunk + 1]) + { + cur_chunk += 2; + chunk_count = 0; + } + + if (saw_first_compressed_object) + { + if (fields[0] != 2) + { + this->uncompressed_after_compressed = true; + } + } + else if (fields[0] == 2) + { + saw_first_compressed_object = true; + } + if (obj == 0) + { + // This is needed by checkLinearization() + this->first_xref_item_offset = xref_offset; + } + insertXrefEntry(obj, fields[0], fields[1], fields[2]); + } + + if (! this->trailer.isInitialized()) + { + setTrailer(dict); + } + + if (dict.hasKey("/Prev")) + { + if (! dict.getKey("/Prev").isInteger()) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "/Prev key in xref stream dictionary is not " + "an integer"); + } + QTC::TC("qpdf", "QPDF prev key in xref stream dictionary"); + xref_offset = dict.getKey("/Prev").getIntValue(); + } + else + { + xref_offset = 0; + } + + return xref_offset; +} + +void +QPDF::insertXrefEntry(int obj, int f0, int f1, int f2) +{ + // Populate the xref table in such a way that the first reference + // to an object that we see, which is the one in the latest xref + // table in which it appears, is the one that gets stored. + + // If there is already an entry for this object and generation in + // the table, it means that a later xref table has registered this + // object. Disregard this one. + { // private scope + int gen = (f0 == 2 ? 0 : f2); + ObjGen og(obj, gen); + if (this->xref_table.count(og)) + { + QTC::TC("qpdf", "QPDF xref reused object"); + return; + } + if (this->deleted_objects.count(obj)) + { + QTC::TC("qpdf", "QPDF xref deleted object"); + return; + } + } + + switch (f0) + { + case 0: + this->deleted_objects.insert(obj); + break; + + case 1: + // f2 is generation + QTC::TC("qpdf", "QPDF xref gen > 0", ((f2 > 0) ? 1 : 0)); + this->xref_table[ObjGen(obj, f2)] = QPDFXRefEntry(f0, f1, f2); + break; + + case 2: + this->xref_table[ObjGen(obj, 0)] = QPDFXRefEntry(f0, f1, f2); + break; + + default: + throw QPDFExc(this->file.getName(), 0, + "unknown xref stream entry type " + + QUtil::int_to_string(f0)); + break; + } +} + +void +QPDF::showXRefTable() +{ + for (std::map::iterator iter = + this->xref_table.begin(); + iter != this->xref_table.end(); ++iter) + { + ObjGen const& og = (*iter).first; + QPDFXRefEntry const& entry = (*iter).second; + std::cout << og.obj << "/" << og.gen << ": "; + switch (entry.getType()) + { + case 1: + std::cout << "uncompressed; offset = " << entry.getOffset(); + break; + + case 2: + std::cout << "compressed; stream = " << entry.getObjStreamNumber() + << ", index = " << entry.getObjStreamIndex(); + break; + + default: + throw QEXC::Internal("unknown cross-reference table type while" + " showing xref_table"); + break; + } + std::cout << std::endl; + } +} + +QPDFObjectHandle +QPDF::readObject(InputSource* input, int objid, int generation, + bool in_object_stream) +{ + off_t offset = input->tell(); + QPDFObjectHandle object = readObjectInternal( + input, objid, generation, in_object_stream, false, false); + // Override last_offset so that it points to the beginning of the + // object we just read + input->setLastOffset(offset); + return object; +} + +QPDFObjectHandle +QPDF::readObjectInternal(InputSource* input, + int objid, int generation, + bool in_object_stream, + bool in_array, bool in_dictionary) +{ + if (in_dictionary && in_array) + { + // Although dictionaries and arrays arbitrarily nest, these + // variables indicate what is at the top of the stack right + // now, so they can, by definition, never both be true. + throw QEXC::Internal("readObjectInternal: in_dict && in_array"); + } + + QPDFObjectHandle object; + + off_t offset = input->tell(); + std::vector olist; + bool done = false; + while (! done) + { + object = QPDFObjectHandle(); + + QPDFTokenizer::Token token = readToken(input); + + switch (token.getType()) + { + case QPDFTokenizer::tt_brace_open: + case QPDFTokenizer::tt_brace_close: + // Don't know what to do with these for now + QTC::TC("qpdf", "QPDF bad brace"); + throw QPDFExc(input->getName(), input->getLastOffset(), + "unexpected brace token"); + break; + + case QPDFTokenizer::tt_array_close: + if (in_array) + { + done = true; + } + else + { + QTC::TC("qpdf", "QPDF bad array close"); + throw QPDFExc(input->getName(), input->getLastOffset(), + "unexpected array close token"); + } + break; + + case QPDFTokenizer::tt_dict_close: + if (in_dictionary) + { + done = true; + } + else + { + QTC::TC("qpdf", "QPDF bad dictionary close"); + throw QPDFExc(input->getName(), input->getLastOffset(), + "unexpected dictionary close token"); + } + break; + + case QPDFTokenizer::tt_array_open: + object = readObjectInternal( + input, objid, generation, in_object_stream, true, false); + break; + + case QPDFTokenizer::tt_dict_open: + object = readObjectInternal( + input, objid, generation, in_object_stream, false, true); + break; + + case QPDFTokenizer::tt_bool: + object = QPDFObjectHandle::newBool( + (token.getValue() == "true")); + break; + + case QPDFTokenizer::tt_null: + object = QPDFObjectHandle::newNull(); + break; + + case QPDFTokenizer::tt_integer: + object = QPDFObjectHandle::newInteger( + atoi(token.getValue().c_str())); + break; + + case QPDFTokenizer::tt_real: + object = QPDFObjectHandle::newReal(token.getValue()); + break; + + case QPDFTokenizer::tt_name: + object = QPDFObjectHandle::newName(token.getValue()); + break; + + case QPDFTokenizer::tt_word: + { + std::string const& value = token.getValue(); + if ((value == "R") && (in_array || in_dictionary) && + (olist.size() >= 2) && + (olist[olist.size() - 1].isInteger()) && + (olist[olist.size() - 2].isInteger())) + { + // Try to resolve indirect objects + object = QPDFObjectHandle::Factory::newIndirect( + this, + olist[olist.size() - 2].getIntValue(), + olist[olist.size() - 1].getIntValue()); + olist.pop_back(); + olist.pop_back(); + } + else + { + throw QPDFExc(input->getName(), input->getLastOffset(), + "unknown token while reading object (" + + value + ")"); + } + } + break; + + case QPDFTokenizer::tt_string: + { + std::string val = token.getValue(); + if (this->encrypted && (! in_object_stream)) + { + decryptString(val, objid, generation); + } + object = QPDFObjectHandle::newString(val); + } + break; + + default: + throw QPDFExc(input->getName(), input->getLastOffset(), + "unknown token type while reading object"); + break; + } + + if (in_dictionary || in_array) + { + if (! done) + { + olist.push_back(object); + } + } + else if (! object.isInitialized()) + { + throw QEXC::Internal(std::string("uninitialized object (token = ") + + QUtil::int_to_string(token.getType()) + + ", " + token.getValue() + ")"); + } + else + { + done = true; + } + } + + if (in_array) + { + object = QPDFObjectHandle::newArray(olist); + } + else if (in_dictionary) + { + // Convert list to map. Alternating elements are keys. + std::map dict; + if (olist.size() % 2) + { + QTC::TC("qpdf", "QPDF dictionary odd number of elements"); + throw QPDFExc( + input->getName(), input->getLastOffset(), + "dictionary ending here has an odd number of elements"); + } + for (unsigned int i = 0; i < olist.size(); i += 2) + { + QPDFObjectHandle key_obj = olist[i]; + QPDFObjectHandle val = olist[i + 1]; + if (! key_obj.isName()) + { + throw QPDFExc( + input->getName(), offset, + std::string("dictionary key not name (") + + key_obj.unparse() + ")"); + } + dict[key_obj.getName()] = val; + } + object = QPDFObjectHandle::newDictionary(dict); + + if (! in_object_stream) + { + // check for stream + off_t cur_offset = input->tell(); + if (readToken(input) == + QPDFTokenizer::Token(QPDFTokenizer::tt_word, "stream")) + { + // Kill to next actual newline. Do not use readLine() + // here -- streams are a special case. The next + // single newline character marks the end of the + // stream token. It is incorrect to strip subsequent + // carriage returns or newlines as they may be part of + // the stream. + { + char ch; + do + { + if (input->read(&ch, 1) == 0) + { + // A premature EOF here will result in + // some other problem that will get + // reported at another time. + ch = '\n'; + } + } while (ch != '\n'); + } + + // Must get offset before accessing any additional + // objects since resolving a previously unresolved + // indirect object will change file position. + off_t stream_offset = input->tell(); + int length = 0; + + try + { + if (dict.count("/Length") == 0) + { + QTC::TC("qpdf", "QPDF stream without length"); + throw QPDFExc(input->getName(), offset, + "stream dictionary lacks /Length key"); + } + + QPDFObjectHandle length_obj = dict["/Length"]; + if (! length_obj.isInteger()) + { + QTC::TC("qpdf", "QPDF stream length not integer"); + throw QPDFExc(input->getName(), offset, + "/Length key in stream dictionary is not " + "an integer"); + } + + length = length_obj.getIntValue(); + input->seek(stream_offset + length, SEEK_SET); + if (! (readToken(input) == + QPDFTokenizer::Token( + QPDFTokenizer::tt_word, "endstream"))) + { + QTC::TC("qpdf", "QPDF missing endstream"); + throw QPDFExc(input->getName(), input->getLastOffset(), + "expected endstream"); + } + } + catch (QPDFExc& e) + { + if (this->attempt_recovery) + { + // may throw an exception + length = recoverStreamLength( + input, objid, generation, stream_offset); + } + else + { + throw e; + } + } + object = QPDFObjectHandle::Factory::newStream( + this, objid, generation, object, stream_offset, length); + } + else + { + input->seek(cur_offset, SEEK_SET); + } + } + } + + return object; +} + +int +QPDF::recoverStreamLength(InputSource* input, + int objid, int generation, off_t stream_offset) +{ + static PCRE endobj_re("^endobj\\b"); + + // Try to reconstruct stream length by looking for + // endstream(\r\n?|\n)endobj + warn(QPDFExc(input->getName(), stream_offset, + "attempting to recover stream length")); + + input->seek(0, SEEK_END); + off_t eof = input->tell(); + input->seek(stream_offset, SEEK_SET); + std::string last_line; + off_t last_line_offset = 0; + int length = 0; + while (input->tell() < eof) + { + std::string line = input->readLine(); + // Can't use regexp last_line since it might contain nulls + if (endobj_re.match(line.c_str()) && + (last_line.length() >= 9) && + (last_line.substr(last_line.length() - 9, 9) == "endstream")) + { + // Stream probably ends right before "endstream", which + // contains 9 characters. + length = last_line_offset + last_line.length() - 9 - stream_offset; + // Go back to where we would have been if we had just read + // the endstream. + input->seek(input->getLastOffset(), SEEK_SET); + break; + } + last_line = line; + last_line_offset = input->getLastOffset(); + } + + if (length) + { + int this_obj_offset = 0; + ObjGen this_obj(0, 0); + + // Make sure this is inside this object + for (std::map::iterator iter = + this->xref_table.begin(); + iter != this->xref_table.end(); ++iter) + { + ObjGen const& og = (*iter).first; + QPDFXRefEntry const& entry = (*iter).second; + if (entry.getType() == 1) + { + int obj_offset = entry.getOffset(); + if ((obj_offset > stream_offset) && + ((this_obj_offset == 0) || + (this_obj_offset > obj_offset))) + { + this_obj_offset = obj_offset; + this_obj = og; + } + } + } + if (this_obj_offset && + (this_obj.obj == objid) && + (this_obj.gen == generation)) + { + // Well, we found endstream\nendobj within the space + // allowed for this object, so we're probably in good + // shape. + } + else + { + QTC::TC("qpdf", "QPDF found wrong endstream in recovery"); + } + } + + if (length == 0) + { + throw QPDFExc(input->getName(), stream_offset, + "unable to recover stream data"); + } + + QTC::TC("qpdf", "QPDF recovered stream length"); + return length; +} + +QPDFTokenizer::Token +QPDF::readToken(InputSource* input) +{ + off_t offset = input->tell(); + QPDFTokenizer::Token token; + bool unread_char; + char char_to_unread; + while (! this->tokenizer.getToken(token, unread_char, char_to_unread)) + { + char ch; + if (input->read(&ch, 1) == 0) + { + throw QPDFExc(input->getName(), offset, "EOF while reading token"); + } + else + { + if (isspace(ch) && (input->getLastOffset() == offset)) + { + ++offset; + } + this->tokenizer.presentCharacter(ch); + } + } + + if (unread_char) + { + input->unreadCh(char_to_unread); + } + + if (token.getType() == QPDFTokenizer::tt_bad) + { + throw QPDFExc(input->getName(), offset, token.getErrorMessage()); + } + + input->setLastOffset(offset); + + return token; +} + +QPDFObjectHandle +QPDF::readObjectAtOffset(off_t offset, int exp_objid, int exp_generation, + int& objid, int& generation) +{ + this->file.seek(offset, SEEK_SET); + + QPDFTokenizer::Token tobjid = readToken(&this->file); + QPDFTokenizer::Token tgen = readToken(&this->file); + QPDFTokenizer::Token tobj = readToken(&this->file); + + bool objidok = (tobjid.getType() == QPDFTokenizer::tt_integer); + int genok = (tgen.getType() == QPDFTokenizer::tt_integer); + int objok = (tobj == QPDFTokenizer::Token(QPDFTokenizer::tt_word, "obj")); + + QTC::TC("qpdf", "QPDF check objid", objidok ? 1 : 0); + QTC::TC("qpdf", "QPDF check generation", genok ? 1 : 0); + QTC::TC("qpdf", "QPDF check obj", objok ? 1 : 0); + + try + { + if (! (objidok && genok && objok)) + { + QTC::TC("qpdf", "QPDF expected n n obj"); + throw QPDFExc(this->file.getName(), offset, "expected n n obj"); + } + objid = atoi(tobjid.getValue().c_str()); + generation = atoi(tgen.getValue().c_str()); + + if (exp_objid && + (! ((objid == exp_objid) && (generation == exp_generation)))) + { + QTC::TC("qpdf", "QPDF err wrong objid/generation"); + throw QPDFExc(this->file.getName(), offset, + std::string("expected ") + + QUtil::int_to_string(exp_objid) + " " + + QUtil::int_to_string(exp_generation) + " obj"); + } + } + catch (QPDFExc& e) + { + if (exp_objid && this->attempt_recovery) + { + // Try again after reconstructing xref table + reconstruct_xref(e); + ObjGen og(exp_objid, exp_generation); + if (this->xref_table.count(og) && + (this->xref_table[og].getType() == 1)) + { + off_t new_offset = this->xref_table[og].getOffset(); + // Call readObjectAtOffset with 0 for exp_objid to + // avoid an infinite loop. + QPDFObjectHandle result = + readObjectAtOffset(new_offset, 0, 0, objid, generation); + QTC::TC("qpdf", "QPDF recovered in readObjectAtOffset"); + return result; + } + } + else + { + throw e; + } + } + + QPDFObjectHandle oh = readObject( + &this->file, objid, generation, false); + + if (! (readToken(&this->file) == + QPDFTokenizer::Token(QPDFTokenizer::tt_word, "endobj"))) + { + QTC::TC("qpdf", "QPDF err expected endobj"); + warn(QPDFExc(this->file.getName(), this->file.getLastOffset(), + "expected endobj")); + } + + ObjGen og(objid, generation); + if (! this->obj_cache.count(og)) + { + // Store the object in the cache here so it gets cached + // whether we first know the offset or whether we first know + // the object ID and generation (in which we case we would get + // here through resolve). + + // Determine the end offset of this object before and after + // white space. We use these numbers to validate + // linearization hint tables. Offsets and lengths of objects + // may imply the end of an object to be anywhere between these + // values. + off_t end_before_space = this->file.tell(); + + // skip over spaces + while (true) + { + char ch; + if (this->file.read(&ch, 1)) + { + if (! isspace(ch)) + { + this->file.seek(-1, SEEK_CUR); + break; + } + } + else + { + throw QPDFExc(this->file.getName(), offset, + "EOF after endobj"); + } + } + off_t end_after_space = this->file.tell(); + + this->obj_cache[og] = + ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), + end_before_space, end_after_space); + } + + return oh; +} + +PointerHolder +QPDF::resolve(int objid, int generation) +{ + // Check object cache before checking xref table. This allows us + // to insert things into the object cache that don't actually + // exist in the file. + ObjGen og(objid, generation); + if (! this->obj_cache.count(og)) + { + if (! this->xref_table.count(og)) + { + // PDF spec says unknown objects resolve to the null object. + return new QPDF_Null; + } + + QPDFXRefEntry const& entry = this->xref_table[og]; + switch (entry.getType()) + { + case 1: + { + off_t offset = entry.getOffset(); + // Object stored in cache by readObjectAtOffset + int aobjid; + int ageneration; + QPDFObjectHandle oh = + readObjectAtOffset(offset, objid, generation, + aobjid, ageneration); + } + break; + + case 2: + resolveObjectsInStream(entry.getObjStreamNumber()); + break; + + default: + throw QPDFExc(this->file.getName(), 0, + "object " + + QUtil::int_to_string(objid) + "/" + + QUtil::int_to_string(generation) + + " has unexpected xref entry type"); + } + } + + return this->obj_cache[og].object; +} + +void +QPDF::resolveObjectsInStream(int obj_stream_number) +{ + // Force resolution of object stream + QPDFObjectHandle obj_stream = getObjectByID(obj_stream_number, 0); + if (! obj_stream.isStream()) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "supposed object stream " + + QUtil::int_to_string(obj_stream_number) + + " is not a stream"); + } + + // For linearization data in the object, use the data from the + // object stream for the objects in the stream. + ObjGen stream_og(obj_stream_number, 0); + off_t end_before_space = this->obj_cache[stream_og].end_before_space; + off_t end_after_space = this->obj_cache[stream_og].end_after_space; + + QPDFObjectHandle dict = obj_stream.getDict(); + if (! (dict.getKey("/Type").isName() && + dict.getKey("/Type").getName() == "/ObjStm")) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "supposed object stream " + + QUtil::int_to_string(obj_stream_number) + + " has wrong type"); + } + + if (! (dict.getKey("/N").isInteger() && + dict.getKey("/First").isInteger())) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "object stream " + + QUtil::int_to_string(obj_stream_number) + + " has incorrect keys"); + } + + int n = dict.getKey("/N").getIntValue(); + int first = dict.getKey("/First").getIntValue(); + + std::map offsets; + + PointerHolder bp = obj_stream.getStreamData(); + BufferInputSource input( + "object stream " + QUtil::int_to_string(obj_stream_number), + bp.getPointer()); + + for (int i = 0; i < n; ++i) + { + QPDFTokenizer::Token tnum = readToken(&input); + QPDFTokenizer::Token toffset = readToken(&input); + if (! ((tnum.getType() == QPDFTokenizer::tt_integer) && + (toffset.getType() == QPDFTokenizer::tt_integer))) + { + throw QPDFExc(input.getName(), input.getLastOffset(), + "expected integer in object stream header"); + } + + int num = atoi(tnum.getValue().c_str()); + int offset = atoi(toffset.getValue().c_str()); + offsets[num] = offset + first; + } + + for (std::map::iterator iter = offsets.begin(); + iter != offsets.end(); ++iter) + { + int obj = (*iter).first; + int offset = (*iter).second; + input.seek(offset, SEEK_SET); + QPDFObjectHandle oh = readObject(&input, obj, 0, true); + + // Store in cache + ObjGen og(obj, 0); + + this->obj_cache[og] = + ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), + end_before_space, end_after_space); + } +} + +QPDFObjectHandle +QPDF::makeIndirectObject(QPDFObjectHandle oh) +{ + ObjGen o1 = (*(this->obj_cache.rbegin())).first; + ObjGen o2 = (*(this->xref_table.rbegin())).first; + QTC::TC("qpdf", "QPDF indirect last obj from xref", + (o2.obj > o1.obj) ? 1 : 0); + int max_objid = std::max(o1.obj, o2.obj); + ObjGen next(max_objid + 1, 0); + this->obj_cache[next] = + ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); + return QPDFObjectHandle::Factory::newIndirect(this, next.obj, next.gen); +} + +QPDFObjectHandle +QPDF::getObjectByID(int objid, int generation) +{ + return QPDFObjectHandle::Factory::newIndirect(this, objid, generation); +} + +void +QPDF::trimTrailerForWrite() +{ + // Note that removing the encryption dictionary does not interfere + // with reading encrypted files. QPDF loads all the information + // it needs from the encryption dictionary at the beginning and + // never looks at it again. + this->trailer.removeKey("/ID"); + this->trailer.removeKey("/Encrypt"); + this->trailer.removeKey("/Prev"); + + // Remove all trailer keys that potentially come from a + // cross-reference stream + this->trailer.removeKey("/Index"); + this->trailer.removeKey("/W"); + this->trailer.removeKey("/Length"); + this->trailer.removeKey("/Filter"); + this->trailer.removeKey("/DecodeParms"); + this->trailer.removeKey("/Type"); + this->trailer.removeKey("/XRefStm"); +} + +std::string +QPDF::getFilename() const +{ + return this->file.getName(); +} + +std::string +QPDF::getPDFVersion() const +{ + return this->pdf_version; +} + +QPDFObjectHandle +QPDF::getTrailer() +{ + return this->trailer; +} + +QPDFObjectHandle +QPDF::getRoot() +{ + return this->trailer.getKey("/Root"); +} + +void +QPDF::getObjectStreamData(std::map& omap) +{ + for (std::map::iterator iter = + this->xref_table.begin(); + iter != this->xref_table.end(); ++iter) + { + ObjGen const& og = (*iter).first; + QPDFXRefEntry const& entry = (*iter).second; + if (entry.getType() == 2) + { + omap[og.obj] = entry.getObjStreamNumber(); + } + } +} + +std::vector +QPDF::getCompressibleObjects() +{ + // Return a set of object numbers of objects that are allowed to + // be in object streams. We disregard generation numbers here + // since this is a helper function for QPDFWriter which is going + // to renumber objects anyway. This code will do weird things if + // we have two objects with the same object number and different + // generations, but so do virtually all PDF consumers, + // particularly since this is not a permitted condition. + + // We walk through the objects by traversing the document from the + // root, including a traversal of the pages tree. This makes that + // objects that are on the same page are more likely to be in the + // same object stream, which is slightly more efficient, + // particularly with linearized files. This is better than + // iterating through the xref table since it avoids preserving + // orphaned items. + + // Exclude encryption dictionary, if any + int encryption_dict_id = 0; + QPDFObjectHandle encryption_dict = trailer.getKey("/Encrypt"); + if (encryption_dict.isIndirect()) + { + encryption_dict_id = encryption_dict.getObjectID(); + } + + std::set visited; + std::list queue; + queue.push_front(this->trailer); + std::vector result; + while (! queue.empty()) + { + QPDFObjectHandle obj = queue.front(); + queue.pop_front(); + if (obj.isIndirect()) + { + int objid = obj.getObjectID(); + if (visited.count(objid)) + { + QTC::TC("qpdf", "QPDF loop detected traversing objects"); + continue; + } + if (objid == encryption_dict_id) + { + QTC::TC("qpdf", "QPDF exclude encryption dictionary"); + } + else if (! obj.isStream()) + { + result.push_back(objid); + } + visited.insert(objid); + } + if (obj.isStream()) + { + QPDFObjectHandle dict = obj.getDict(); + std::set keys = dict.getKeys(); + for (std::set::reverse_iterator iter = keys.rbegin(); + iter != keys.rend(); ++iter) + { + std::string const& key = *iter; + QPDFObjectHandle value = dict.getKey(key); + if (key == "/Length") + { + // omit stream lengths + if (value.isIndirect()) + { + QTC::TC("qpdf", "QPDF exclude indirect length"); + } + } + else + { + queue.push_front(value); + } + } + } + else if (obj.isDictionary()) + { + std::set keys = obj.getKeys(); + for (std::set::reverse_iterator iter = keys.rbegin(); + iter != keys.rend(); ++iter) + { + queue.push_front(obj.getKey(*iter)); + } + } + else if (obj.isArray()) + { + int n = obj.getArrayNItems(); + for (int i = 1; i <= n; ++i) + { + queue.push_front(obj.getArrayItem(n - i)); + } + } + } + + return result; +} + +void +QPDF::pipeStreamData(int objid, int generation, + off_t offset, size_t length, + QPDFObjectHandle stream_dict, + Pipeline* pipeline) +{ + std::vector > to_delete; + if (this->encrypted) + { + bool xref_stream = false; + if (stream_dict.getKey("/Type").isName() && + (stream_dict.getKey("/Type").getName() == "/XRef")) + { + QTC::TC("qpdf", "QPDF piping xref stream from encrypted file"); + xref_stream = true; + } + if (! xref_stream) + { + decryptStream(pipeline, objid, generation, to_delete); + } + } + + this->file.seek(offset, SEEK_SET); + char buf[10240]; + while (length > 0) + { + size_t to_read = (sizeof(buf) < length ? sizeof(buf) : length); + size_t len = this->file.read(buf, to_read); + if (len == 0) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "unexpected EOF reading stream data"); + } + length -= len; + pipeline->write((unsigned char*)buf, len); + } + pipeline->finish(); +} + +std::vector const& +QPDF::getAllPages() +{ + if (this->all_pages.empty()) + { + getAllPagesInternal( + this->trailer.getKey("/Root").getKey("/Pages"), this->all_pages); + } + return this->all_pages; +} + +void +QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages, + std::vector& result) +{ + std::string type = cur_pages.getKey("/Type").getName(); + if (type == "/Pages") + { + QPDFObjectHandle kids = cur_pages.getKey("/Kids"); + int n = kids.getArrayNItems(); + for (int i = 0; i < n; ++i) + { + getAllPagesInternal(kids.getArrayItem(i), result); + } + } + else if (type == "/Page") + { + result.push_back(cur_pages); + } + else + { + throw QPDFExc(this->file.getName() + ": invalid Type in page tree"); + } +} diff --git a/libqpdf/QPDFExc.cc b/libqpdf/QPDFExc.cc new file mode 100644 index 00000000..c7270677 --- /dev/null +++ b/libqpdf/QPDFExc.cc @@ -0,0 +1,20 @@ + +#include + +#include + +QPDFExc::QPDFExc(std::string const& message) : + QEXC::General(message) +{ +} + +QPDFExc::QPDFExc(std::string const& filename, int offset, + std::string const& message) : + QEXC::General(filename + ": offset " + QUtil::int_to_string(offset) + + ": " + message) +{ +} + +QPDFExc::~QPDFExc() throw () +{ +} diff --git a/libqpdf/QPDFObject.cc b/libqpdf/QPDFObject.cc new file mode 100644 index 00000000..6c4963e2 --- /dev/null +++ b/libqpdf/QPDFObject.cc @@ -0,0 +1,2 @@ + +#include diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc new file mode 100644 index 00000000..9fba7b43 --- /dev/null +++ b/libqpdf/QPDFObjectHandle.cc @@ -0,0 +1,637 @@ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +QPDFObjectHandle::QPDFObjectHandle() : + initialized(false), + objid(0), + generation(0) +{ +} + +QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) : + initialized(true), + qpdf(qpdf), + objid(objid), + generation(generation) +{ +} + +QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) : + initialized(true), + qpdf(0), + objid(0), + generation(0), + obj(data) +{ +} + +bool +QPDFObjectHandle::isInitialized() const +{ + return this->initialized; +} + +template +class QPDFObjectTypeAccessor +{ + public: + static bool check(QPDFObject* o) + { + return (o && dynamic_cast(o)); + } +}; + +bool +QPDFObjectHandle::isBool() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isNull() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isInteger() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isReal() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isNumber() +{ + return (isInteger() || isReal()); +} + +double +QPDFObjectHandle::getNumericValue() +{ + double result = 0.0; + if (isInteger()) + { + result = getIntValue(); + } + else if (isReal()) + { + result = atof(getRealValue().c_str()); + } + else + { + throw QEXC::Internal("getNumericValue called for non-numeric object"); + } + return result; +} + +bool +QPDFObjectHandle::isName() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isString() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isArray() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isDictionary() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isStream() +{ + dereference(); + return QPDFObjectTypeAccessor::check(obj.getPointer()); +} + +bool +QPDFObjectHandle::isIndirect() +{ + assertInitialized(); + return (this->objid != 0); +} + +bool +QPDFObjectHandle::isScalar() +{ + return (! (isArray() || isDictionary() || isStream())); +} + +// Bool accessors + +bool +QPDFObjectHandle::getBoolValue() +{ + assertType("Boolean", isBool()); + return dynamic_cast(obj.getPointer())->getVal(); +} + +// Integer accessors + +int +QPDFObjectHandle::getIntValue() +{ + assertType("Integer", isInteger()); + return dynamic_cast(obj.getPointer())->getVal(); +} + +// Real accessors + +std::string +QPDFObjectHandle::getRealValue() +{ + assertType("Real", isReal()); + return dynamic_cast(obj.getPointer())->getVal(); +} + +// Name acessors + +std::string +QPDFObjectHandle::getName() +{ + assertType("Name", isName()); + return dynamic_cast(obj.getPointer())->getName(); +} + +// String accessors + +std::string +QPDFObjectHandle::getStringValue() +{ + assertType("String", isString()); + return dynamic_cast(obj.getPointer())->getVal(); +} + +std::string +QPDFObjectHandle::getUTF8Value() +{ + assertType("String", isString()); + return dynamic_cast(obj.getPointer())->getUTF8Val(); +} + +// Array acessors + +int +QPDFObjectHandle::getArrayNItems() +{ + assertType("Array", isArray()); + return dynamic_cast(obj.getPointer())->getNItems(); +} + +QPDFObjectHandle +QPDFObjectHandle::getArrayItem(int n) +{ + assertType("Array", isArray()); + return dynamic_cast(obj.getPointer())->getItem(n); +} + +// Array mutators + +void +QPDFObjectHandle::setArrayItem(int n, QPDFObjectHandle const& item) +{ + assertType("Array", isArray()); + return dynamic_cast(obj.getPointer())->setItem(n, item); +} + +// Dictionary accesors + +bool +QPDFObjectHandle::hasKey(std::string const& key) +{ + assertType("Dictionary", isDictionary()); + return dynamic_cast(obj.getPointer())->hasKey(key); +} + +QPDFObjectHandle +QPDFObjectHandle::getKey(std::string const& key) +{ + assertType("Dictionary", isDictionary()); + return dynamic_cast(obj.getPointer())->getKey(key); +} + +std::set +QPDFObjectHandle::getKeys() +{ + assertType("Dictionary", isDictionary()); + return dynamic_cast(obj.getPointer())->getKeys(); +} + +// Dictionary mutators + +void +QPDFObjectHandle::replaceKey(std::string const& key, + QPDFObjectHandle const& value) +{ + assertType("Dictionary", isDictionary()); + return dynamic_cast( + obj.getPointer())->replaceKey(key, value); +} + +void +QPDFObjectHandle::removeKey(std::string const& key) +{ + assertType("Dictionary", isDictionary()); + return dynamic_cast(obj.getPointer())->removeKey(key); +} + +// Stream accessors +QPDFObjectHandle +QPDFObjectHandle::getDict() +{ + assertType("Stream", isStream()); + return dynamic_cast(obj.getPointer())->getDict(); +} + +PointerHolder +QPDFObjectHandle::getStreamData() +{ + assertType("Stream", isStream()); + return dynamic_cast(obj.getPointer())->getStreamData(); +} + +bool +QPDFObjectHandle::pipeStreamData(Pipeline* p, bool filter, + bool normalize, bool compress) +{ + assertType("Stream", isStream()); + return dynamic_cast(obj.getPointer())->pipeStreamData( + p, filter, normalize, compress); +} + +int +QPDFObjectHandle::getObjectID() const +{ + return this->objid; +} + +int +QPDFObjectHandle::getGeneration() const +{ + return this->generation; +} + +std::map +QPDFObjectHandle::getPageImages() +{ + assertPageObject(); + + // Note: this code doesn't handle inherited resources. If this + // page dictionary doesn't have a /Resources key or has one whose + // value is null or an empty dictionary, you are supposed to walk + // up the page tree until you find a /Resources dictionary. As of + // this writing, I don't have any test files that use inherited + // resources, and hand-generating one won't be a good test beacuse + // any mistakes in my understanding would be present in both the + // code and the test file. + + // NOTE: If support of inherited resources (see above comment) is + // implemented, edit comment in QPDFObjectHandle.hh for this + // function. + + std::map result; + if (this->hasKey("/Resources")) + { + QPDFObjectHandle resources = this->getKey("/Resources"); + if (resources.hasKey("/XObject")) + { + QPDFObjectHandle xobject = resources.getKey("/XObject"); + std::set keys = xobject.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string key = (*iter); + QPDFObjectHandle value = xobject.getKey(key); + if (value.isStream()) + { + QPDFObjectHandle dict = value.getDict(); + if (dict.hasKey("/Subtype") && + (dict.getKey("/Subtype").getName() == "/Image") && + (! dict.hasKey("/ImageMask"))) + { + result[key] = value; + } + } + } + } + } + + return result; +} + +std::vector +QPDFObjectHandle::getPageContents() +{ + assertPageObject(); + + std::vector result; + QPDFObjectHandle contents = this->getKey("/Contents"); + if (contents.isArray()) + { + int n_items = contents.getArrayNItems(); + for (int i = 0; i < n_items; ++i) + { + QPDFObjectHandle item = contents.getArrayItem(i); + if (item.isStream()) + { + result.push_back(item); + } + else + { + throw QEXC::General("unknown item type while inspecting " + "element of /Contents array in page " + "dictionary"); + } + } + } + else if (contents.isStream()) + { + result.push_back(contents); + } + else + { + throw QEXC::General("unknown object type inspecting /Contents " + "key in page dictionary"); + } + + return result; +} + +std::string +QPDFObjectHandle::unparse() +{ + std::string result; + if (this->isIndirect()) + { + result = QUtil::int_to_string(this->objid) + " " + + QUtil::int_to_string(this->generation) + " R"; + } + else + { + result = unparseResolved(); + } + return result; +} + +std::string +QPDFObjectHandle::unparseResolved() +{ + dereference(); + return this->obj.getPointer()->unparse(); +} + +QPDFObjectHandle +QPDFObjectHandle::newIndirect(QPDF* qpdf, int objid, int generation) +{ + return QPDFObjectHandle(qpdf, objid, generation); +} + +QPDFObjectHandle +QPDFObjectHandle::newBool(bool value) +{ + return QPDFObjectHandle(new QPDF_Bool(value)); +} + +QPDFObjectHandle +QPDFObjectHandle::newNull() +{ + return QPDFObjectHandle(new QPDF_Null()); +} + +QPDFObjectHandle +QPDFObjectHandle::newInteger(int value) +{ + return QPDFObjectHandle(new QPDF_Integer(value)); +} + +QPDFObjectHandle +QPDFObjectHandle::newReal(std::string const& value) +{ + return QPDFObjectHandle(new QPDF_Real(value)); +} + +QPDFObjectHandle +QPDFObjectHandle::newName(std::string const& name) +{ + return QPDFObjectHandle(new QPDF_Name(name)); +} + +QPDFObjectHandle +QPDFObjectHandle::newString(std::string const& str) +{ + return QPDFObjectHandle(new QPDF_String(str)); +} + +QPDFObjectHandle +QPDFObjectHandle::newArray(std::vector const& items) +{ + return QPDFObjectHandle(new QPDF_Array(items)); +} + +QPDFObjectHandle +QPDFObjectHandle::newDictionary( + std::map const& items) +{ + return QPDFObjectHandle(new QPDF_Dictionary(items)); +} + + +QPDFObjectHandle +QPDFObjectHandle::newStream(QPDF* qpdf, int objid, int generation, + QPDFObjectHandle stream_dict, + off_t offset, int length) +{ + return QPDFObjectHandle(new QPDF_Stream( + qpdf, objid, generation, + stream_dict, offset, length)); +} + +void +QPDFObjectHandle::makeDirectInternal(std::set& visited) +{ + assertInitialized(); + + if (isStream()) + { + QTC::TC("qpdf", "QPDFObjectHandle ERR clone stream"); + throw QEXC::General("attempt to make a stream into a direct object"); + } + + int cur_objid = this->objid; + if (cur_objid != 0) + { + if (visited.count(cur_objid)) + { + QTC::TC("qpdf", "QPDFObjectHandle makeDirect loop"); + throw QEXC::General("loop detected while converting object from " + "indirect to direct"); + } + visited.insert(cur_objid); + } + + dereference(); + this->objid = 0; + this->generation = 0; + + QPDFObject* new_obj = 0; + + if (isBool()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone bool"); + new_obj = new QPDF_Bool(getBoolValue()); + } + else if (isNull()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone null"); + new_obj = new QPDF_Null(); + } + else if (isInteger()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone integer"); + new_obj = new QPDF_Integer(getIntValue()); + } + else if (isReal()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone real"); + new_obj = new QPDF_Real(getRealValue()); + } + else if (isName()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone name"); + new_obj = new QPDF_Name(getName()); + } + else if (isString()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone string"); + new_obj = new QPDF_String(getStringValue()); + } + else if (isArray()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone array"); + std::vector items; + int n = getArrayNItems(); + for (int i = 0; i < n; ++i) + { + items.push_back(getArrayItem(i)); + items.back().makeDirectInternal(visited); + } + new_obj = new QPDF_Array(items); + } + else if (isDictionary()) + { + QTC::TC("qpdf", "QPDFObjectHandle clone dictionary"); + std::set keys = getKeys(); + std::map items; + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + items[*iter] = getKey(*iter); + items[*iter].makeDirectInternal(visited); + } + new_obj = new QPDF_Dictionary(items); + } + else + { + throw QEXC::Internal("QPDFObjectHandle::makeIndirect: " + "unknown object type"); + } + + this->obj = new_obj; + + if (cur_objid) + { + visited.erase(cur_objid); + } +} + +void +QPDFObjectHandle::makeDirect() +{ + std::set visited; + makeDirectInternal(visited); +} + +void +QPDFObjectHandle::assertInitialized() const +{ + if (! this->initialized) + { + throw QEXC::Internal("operation attempted on uninitialized " + "QPDFObjectHandle"); + } +} + +void +QPDFObjectHandle::assertType(char const* type_name, bool istype) +{ + if (! istype) + { + throw QEXC::Internal(std::string("operation for ") + type_name + + " object attempted on object of wrong type"); + } +} + +void +QPDFObjectHandle::assertPageObject() +{ + if (! (this->isDictionary() && this->hasKey("/Type") && + (this->getKey("/Type").getName() == "/Page"))) + { + throw QEXC::Internal("page operation called on non-Page object"); + } +} + +void +QPDFObjectHandle::dereference() +{ + if (this->obj.getPointer() == 0) + { + this->obj = QPDF::Resolver::resolve( + this->qpdf, this->objid, this->generation); + if (this->obj.getPointer() == 0) + { + QTC::TC("qpdf", "QPDFObjectHandle indirect to unknown"); + this->obj = new QPDF_Null(); + } + } +} diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc new file mode 100644 index 00000000..4eed6f16 --- /dev/null +++ b/libqpdf/QPDFTokenizer.cc @@ -0,0 +1,458 @@ + +#include + +// DO NOT USE ctype -- it is locale dependent for some things, and +// it's not worth the risk of including it in case it may accidentally +// be used. + +#include +#include +#include + +// See note above about ctype. +static bool is_hex_digit(char ch) +{ + return (strchr("0123456789abcdefABCDEF", ch) != 0); +} + +QPDFTokenizer::QPDFTokenizer() : + pound_special_in_name(true) +{ + reset(); +} + +void +QPDFTokenizer::allowPoundAnywhereInName() +{ + QTC::TC("qpdf", "QPDFTokenizer allow pound anywhere in name"); + this->pound_special_in_name = false; +} + +void +QPDFTokenizer::reset() +{ + state = st_top; + type = tt_bad; + val = ""; + raw_val = ""; + error_message = ""; + unread_char = false; + char_to_unread = '\0'; + string_depth = 0; + string_ignoring_newline = false; + last_char_was_bs = false; +} + +void +QPDFTokenizer::presentCharacter(char ch) +{ + static PCRE num_re("^[\\+\\-]?(?:\\.\\d+|\\d+(?:\\.\\d+)?)$"); + + if (state == st_token_ready) + { + throw QEXC::Internal("QPDF tokenizer presented character " + "while token is waiting"); + } + + char orig_ch = ch; + + // State machine is implemented such that some characters may be + // handled more than once. This happens whenever you have to use + // the character that caused a state change in the new state. + + bool handled = true; + if (state == st_top) + { + // Note: we specifically do not use ctype here. It is + // locale-dependent. + if (strchr(" \t\n\v\f\r", ch)) + { + // ignore + } + else if (ch == '%') + { + // Discard comments + state = st_in_comment; + } + else if (ch == '(') + { + string_depth = 1; + string_ignoring_newline = false; + memset(bs_num_register, '\0', sizeof(bs_num_register)); + last_char_was_bs = false; + state = st_in_string; + } + else if (ch == '<') + { + state = st_lt; + } + else if (ch == '>') + { + state = st_gt; + } + else + { + val += ch; + if (ch == ')') + { + type = tt_bad; + QTC::TC("qpdf", "QPDF_Tokenizer bad )"); + error_message = "unexpected )"; + state = st_token_ready; + } + else if (ch == '[') + { + type = tt_array_open; + state = st_token_ready; + } + else if (ch == ']') + { + type = tt_array_close; + state = st_token_ready; + } + else if (ch == '{') + { + type = tt_brace_open; + state = st_token_ready; + } + else if (ch == '}') + { + type = tt_brace_close; + state = st_token_ready; + } + else + { + state = st_literal; + } + } + } + else if (state == st_in_comment) + { + if ((ch == '\r') || (ch == '\n')) + { + state = st_top; + } + } + else if (state == st_lt) + { + if (ch == '<') + { + val = "<<"; + type = tt_dict_open; + state = st_token_ready; + } + else + { + handled = false; + state = st_in_hexstring; + } + } + else if (state == st_gt) + { + if (ch == '>') + { + val = ">>"; + type = tt_dict_close; + state = st_token_ready; + } + else + { + val = ">"; + type = tt_bad; + QTC::TC("qpdf", "QPDF_Tokenizer bad >"); + error_message = "unexpected >"; + unread_char = true; + char_to_unread = ch; + state = st_token_ready; + } + } + else if (state == st_in_string) + { + if (string_ignoring_newline && (! ((ch == '\r') || (ch == '\n')))) + { + string_ignoring_newline = false; + } + + unsigned int bs_num_count = strlen(bs_num_register); + bool ch_is_octal = ((ch >= '0') && (ch <= '7')); + if ((bs_num_count == 3) || ((bs_num_count > 0) && (! ch_is_octal))) + { + // We've accumulated \ddd. PDF Spec says to ignore + // high-order overflow. + val += (char) strtol(bs_num_register, 0, 8); + memset(bs_num_register, '\0', sizeof(bs_num_register)); + bs_num_count = 0; + } + + if (string_ignoring_newline && ((ch == '\r') || (ch == '\n'))) + { + // ignore + } + else if (ch_is_octal && (last_char_was_bs || (bs_num_count > 0))) + { + bs_num_register[bs_num_count++] = ch; + } + else if (last_char_was_bs) + { + switch (ch) + { + case 'n': + val += '\n'; + break; + + case 'r': + val += '\r'; + break; + + case 't': + val += '\t'; + break; + + case 'b': + val += '\b'; + break; + + case 'f': + val += '\f'; + break; + + case '\r': + case '\n': + string_ignoring_newline = true; + break; + + default: + // PDF spec says backslash is ignored before anything else + val += ch; + break; + } + } + else if (ch == '\\') + { + // last_char_was_bs is set/cleared below as appropriate + if (bs_num_count) + { + throw QEXC::Internal("QPDFTokenizer: bs_num_count != 0 " + "when ch == '\\'"); + } + } + else if (ch == '(') + { + val += ch; + ++string_depth; + } + else if ((ch == ')') && (--string_depth == 0)) + { + type = tt_string; + state = st_token_ready; + } + else + { + val += ch; + } + + last_char_was_bs = ((! last_char_was_bs) && (ch == '\\')); + } + else if (state == st_literal) + { + if (strchr(" \t\n\v\f\r()<>[]{}/%", ch) != 0) + { + // A C-loacle whitespace character or delimiter terminates + // token. It is important to unread the whitespace + // character even though it is ignored since it may be the + // newline after a stream keyword. Removing it here could + // make the stream-reading code break on some files, + // though not on any files in the test suite as of this + // writing. + + type = tt_word; + unread_char = true; + char_to_unread = ch; + state = st_token_ready; + } + else + { + val += ch; + } + } + else + { + handled = false; + } + + + if (handled) + { + // okay + } + else if (state == st_in_hexstring) + { + if (ch == '>') + { + type = tt_string; + state = st_token_ready; + if (val.length() % 2) + { + // PDF spec says odd hexstrings have implicit + // trailing 0. + val += '0'; + } + char num[3]; + num[2] = '\0'; + std::string nval; + for (unsigned int i = 0; i < val.length(); i += 2) + { + num[0] = val[i]; + num[1] = val[i+1]; + char nch = (char)(strtol(num, 0, 16)); + nval += nch; + } + val = nval; + } + else if (is_hex_digit(ch)) + { + val += ch; + } + else if (strchr(" \t\n\v\f\r", ch)) + { + // ignore + } + else + { + type = tt_bad; + QTC::TC("qpdf", "QPDF_Tokenizer bad ("); + error_message = std::string("invalid character (") + + ch + ") in hexstring"; + state = st_token_ready; + } + } + else + { + throw QEXC::Internal("invalid state while reading token"); + } + + if ((state == st_token_ready) && (type == tt_word)) + { + if ((val.length() > 0) && (val[0] == '/')) + { + type = tt_name; + // Deal with # in name token. Note: '/' by itself is a + // valid name, so don't strip leading /. That way we + // don't have to deal with the empty string as a name. + std::string nval = "/"; + char const* valstr = val.c_str() + 1; + for (char const* p = valstr; *p; ++p) + { + if ((*p == '#') && this->pound_special_in_name) + { + if (p[1] && p[2] && + is_hex_digit(p[1]) && is_hex_digit(p[2])) + { + char num[3]; + num[0] = p[1]; + num[1] = p[2]; + num[2] = '\0'; + char ch = (char)(strtol(num, 0, 16)); + if (ch == '\0') + { + type = tt_bad; + QTC::TC("qpdf", "QPDF_Tokenizer null in name"); + error_message = + "null character not allowed in name token"; + nval += "#00"; + } + else + { + nval += ch; + } + p += 2; + } + else + { + QTC::TC("qpdf", "QPDF_Tokenizer bad name"); + type = tt_bad; + error_message = "invalid name token"; + nval += *p; + } + } + else + { + nval += *p; + } + } + val = nval; + } + else if (num_re.match(val.c_str())) + { + if (val.find('.') != std::string::npos) + { + type = tt_real; + } + else + { + type = tt_integer; + } + } + else if ((val == "true") || (val == "false")) + { + type = tt_bool; + } + else if (val == "null") + { + type = tt_null; + } + else + { + // I don't really know what it is, so leave it as tt_word. + // Lots of cases ($, #, etc.) other than actual words fall + // into this category, but that's okay at least for now. + type = tt_word; + } + } + + if (! (betweenTokens() || ((state == st_token_ready) && unread_char))) + { + this->raw_val += orig_ch; + } +} + +void +QPDFTokenizer::presentEOF() +{ + switch (state) + { + case st_token_ready: + case st_top: + // okay + break; + + case st_in_comment: + state = st_top; + break; + + default: + type = tt_bad; + error_message = "EOF while reading token"; + state = st_token_ready; + } +} + +bool +QPDFTokenizer::getToken(Token& token, bool& unread_char, char& ch) +{ + bool ready = (this->state == st_token_ready); + unread_char = this->unread_char; + ch = this->char_to_unread; + if (ready) + { + token = Token(type, val, raw_val, error_message); + reset(); + } + return ready; +} + +bool +QPDFTokenizer::betweenTokens() +{ + return ((state == st_top) || (state == st_in_comment)); +} diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc new file mode 100644 index 00000000..0a611eb9 --- /dev/null +++ b/libqpdf/QPDFWriter.cc @@ -0,0 +1,2021 @@ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +QPDFWriter::QPDFWriter(QPDF& pdf, char const* filename) : + pdf(pdf), + filename(filename), + file(0), + close_file(false), + normalize_content_set(false), + normalize_content(false), + stream_data_mode_set(false), + stream_data_mode(s_compress), + qdf_mode(false), + static_id(false), + direct_stream_lengths(true), + encrypted(false), + preserve_encryption(true), + linearized(false), + object_stream_mode(o_preserve), + encryption_dict_objid(0), + next_objid(1), + cur_stream_length_id(0), + cur_stream_length(0), + added_newline(false), + max_ostream_index(0) +{ + if (filename == 0) + { + this->filename = "standard output"; + QTC::TC("qpdf", "QPDFWriter write to stdout"); + file = stdout; + } + else + { + QTC::TC("qpdf", "QPDFWriter write to file"); + file = QUtil::fopen_wrapper(std::string("open ") + filename, + fopen(filename, "wb+")); + close_file = true; + } + Pipeline* p = new Pl_StdioFile("qdf output", file); + to_delete.push_back(p); + pipeline = new Pl_Count("qdf count", p); + to_delete.push_back(pipeline); + pipeline_stack.push_back(pipeline); +} + +QPDFWriter::~QPDFWriter() +{ + if (file) + { + fclose(file); + } +} + +void +QPDFWriter::setObjectStreamMode(object_stream_e mode) +{ + this->object_stream_mode = mode; +} + +void +QPDFWriter::setStreamDataMode(stream_data_e mode) +{ + this->stream_data_mode_set = true; + this->stream_data_mode = mode; +} + +void +QPDFWriter::setContentNormalization(bool val) +{ + this->normalize_content_set = true; + this->normalize_content = val; +} + +void +QPDFWriter::setQDFMode(bool val) +{ + this->qdf_mode = val; +} + +void +QPDFWriter::setStaticID(bool val) +{ + this->static_id = val; +} + +void +QPDFWriter::setPreserveEncryption(bool val) +{ + this->preserve_encryption = val; +} + +void +QPDFWriter::setLinearization(bool val) +{ + this->linearized = val; +} + +void +QPDFWriter::setR2EncryptionParameters( + char const* user_password, char const* owner_password, + bool allow_print, bool allow_modify, + bool allow_extract, bool allow_annotate) +{ + std::set clear; + if (! allow_print) + { + clear.insert(3); + } + if (! allow_modify) + { + clear.insert(4); + } + if (! allow_extract) + { + clear.insert(5); + } + if (! allow_annotate) + { + clear.insert(6); + } + + this->min_pdf_version = "1.3"; + setEncryptionParameters(user_password, owner_password, 1, 2, 5, clear); +} + +void +QPDFWriter::setR3EncryptionParameters( + char const* user_password, char const* owner_password, + bool allow_accessibility, bool allow_extract, + r3_print_e print, r3_modify_e modify) +{ + // Acrobat 5 security options: + + // Checkboxes: + // Enable Content Access for the Visually Impaired + // Allow Content Copying and Extraction + + // Allowed changes menu: + // None + // Only Document Assembly + // Only Form Field Fill-in or Signing + // Comment AUthoring, Form Field Fill-in or Signing + // General Editing, Comment and Form Field Authoring + + // Allowed printing menu: + // None + // Low Resolution + // Full printing + + std::set clear; + if (! allow_accessibility) + { + clear.insert(10); + } + if (! allow_extract) + { + clear.insert(5); + } + + // Note: these switch statements all "fall through" (no break + // statements). Each option clears successively more access bits. + switch (print) + { + case r3p_none: + clear.insert(3); // any printing + + case r3p_low: + clear.insert(12); // high resolution printing + + case r3p_full: + break; + + // no default so gcc warns for missing cases + } + + switch (modify) + { + case r3m_none: + clear.insert(11); // document essembly + + case r3m_assembly: + clear.insert(9); // filling in form fields + + case r3m_form: + clear.insert(6); // modify annotations, fill in form fields + + case r3m_annotate: + clear.insert(4); // other modifications + + case r3m_all: + break; + + // no default so gcc warns for missing cases + } + + this->min_pdf_version = "1.4"; + setEncryptionParameters(user_password, owner_password, 2, 3, 16, clear); +} + +void +QPDFWriter::setEncryptionParameters( + char const* user_password, char const* owner_password, + int V, int R, int key_len, std::set& bits_to_clear) +{ + // PDF specification refers to bits with the low bit numbered 1. + // We have to convert this into a bit field. + + // Specification always requirse bits 1 and 2 to be cleared. + bits_to_clear.insert(1); + bits_to_clear.insert(2); + + unsigned long P = 0; + // Create the complement of P, then invert. + for (std::set::iterator iter = bits_to_clear.begin(); + iter != bits_to_clear.end(); ++iter) + { + P |= (1 << (*iter) - 1); + } + P = ~P; + + generateID(); + std::string O; + std::string U; + QPDF::compute_encryption_O_U( + user_password, owner_password, V, R, key_len, P, this->id1, O, U); + setEncryptionParametersInternal( + V, R, key_len, P, O, U, this->id1, user_password); +} + +void +QPDFWriter::copyEncryptionParameters() +{ + generateID(); + QPDFObjectHandle trailer = this->pdf.getTrailer(); + if (trailer.hasKey("/Encrypt")) + { + QPDFObjectHandle encrypt = trailer.getKey("/Encrypt"); + int V = encrypt.getKey("/V").getIntValue(); + int key_len = 5; + if (V > 1) + { + key_len = encrypt.getKey("/Length").getIntValue() / 8; + } + setEncryptionParametersInternal( + V, + encrypt.getKey("/R").getIntValue(), + key_len, + encrypt.getKey("/P").getIntValue(), + encrypt.getKey("/O").getStringValue(), + encrypt.getKey("/U").getStringValue(), + this->id1, // this->id1 == the other file's id1 + pdf.getUserPassword()); + } +} + +void +QPDFWriter::setEncryptionParametersInternal( + int V, int R, int key_len, long P, + std::string const& O, std::string const& U, + std::string const& id1, std::string const& user_password) +{ + encryption_dictionary["/Filter"] = "/Standard"; + encryption_dictionary["/V"] = QUtil::int_to_string(V); + encryption_dictionary["/Length"] = QUtil::int_to_string(key_len * 8); + encryption_dictionary["/R"] = QUtil::int_to_string(R); + encryption_dictionary["/P"] = QUtil::int_to_string(P); + encryption_dictionary["/O"] = QPDF_String(O).unparse(true); + encryption_dictionary["/U"] = QPDF_String(U).unparse(true); + this->encrypted = true; + QPDF::EncryptionData encryption_data(V, R, key_len, P, O, U, this->id1); + this->encryption_key = QPDF::compute_encryption_key( + user_password, encryption_data); +} + +void +QPDFWriter::setDataKey(int objid) +{ + this->cur_data_key = QPDF::compute_data_key( + this->encryption_key, objid, 0); +} + +int +QPDFWriter::bytesNeeded(unsigned long n) +{ + int bytes = 0; + while (n) + { + ++bytes; + n >>= 8; + } + return bytes; +} + +void +QPDFWriter::writeBinary(unsigned long val, unsigned int bytes) +{ + assert(bytes <= sizeof(unsigned long)); + unsigned char data[sizeof(unsigned long)]; + for (unsigned int i = 0; i < bytes; ++i) + { + data[bytes - i - 1] = (unsigned char)(val & 0xff); + val >>= 8; + } + this->pipeline->write(data, bytes); +} + +void +QPDFWriter::writeString(std::string const& str) +{ + this->pipeline->write((unsigned char*)str.c_str(), str.length()); +} + +void +QPDFWriter::writeBuffer(PointerHolder& b) +{ + this->pipeline->write(b.getPointer()->getBuffer(), + b.getPointer()->getSize()); +} + +void +QPDFWriter::writeStringQDF(std::string const& str) +{ + if (this->qdf_mode) + { + writeString(str); + } +} + +void +QPDFWriter::writeStringNoQDF(std::string const& str) +{ + if (! this->qdf_mode) + { + writeString(str); + } +} + +Pipeline* +QPDFWriter::pushPipeline(Pipeline* p) +{ + assert(dynamic_cast(p) == 0); + this->pipeline_stack.push_back(p); + return p; +} + +void +QPDFWriter::activatePipelineStack() +{ + Pl_Count* c = new Pl_Count("count", this->pipeline_stack.back()); + this->pipeline_stack.push_back(c); + this->pipeline = c; +} + +void +QPDFWriter::popPipelineStack(PointerHolder* bp) +{ + assert(this->pipeline_stack.size() >= 2); + this->pipeline->finish(); + assert(dynamic_cast(this->pipeline_stack.back()) == + this->pipeline); + delete this->pipeline_stack.back(); + this->pipeline_stack.pop_back(); + while (dynamic_cast(this->pipeline_stack.back()) == 0) + { + Pipeline* p = this->pipeline_stack.back(); + this->pipeline_stack.pop_back(); + Pl_Buffer* buf = dynamic_cast(p); + if (bp && buf) + { + *bp = buf->getBuffer(); + } + delete p; + } + this->pipeline = dynamic_cast(this->pipeline_stack.back()); +} + +void +QPDFWriter::pushEncryptionFilter() +{ + if (this->encrypted && (! this->cur_data_key.empty())) + { + Pipeline* p = + new Pl_RC4("stream encryption", this->pipeline, + (unsigned char*) this->cur_data_key.c_str(), + this->cur_data_key.length()); + pushPipeline(p); + } + // Must call this unconditionally so we can call popPipelineStack + // to balance pushEncryptionFilter(). + activatePipelineStack(); +} + +void +QPDFWriter::pushDiscardFilter() +{ + pushPipeline(new Pl_Discard()); + activatePipelineStack(); +} + +int +QPDFWriter::openObject(int objid) +{ + if (objid == 0) + { + objid = this->next_objid++; + } + this->xref[objid] = QPDFXRefEntry(1, pipeline->getCount(), 0); + writeString(QUtil::int_to_string(objid)); + writeString(" 0 obj\n"); + return objid; +} + +void +QPDFWriter::closeObject(int objid) +{ + // Write a newline before endobj as it makes the file easier to + // repair. + writeString("\nendobj\n"); + writeStringQDF("\n"); + this->lengths[objid] = pipeline->getCount() - this->xref[objid].getOffset(); +} + +void +QPDFWriter::assignCompressedObjectNumbers(int objid) +{ + if (this->object_stream_to_objects.count(objid) == 0) + { + return; + } + + // Reserve numbers for the objects that belong to this object + // stream. + for (std::set::iterator iter = + this->object_stream_to_objects[objid].begin(); + iter != this->object_stream_to_objects[objid].end(); + ++iter) + { + obj_renumber[*iter] = next_objid++; + } +} + +void +QPDFWriter::enqueueObject(QPDFObjectHandle object) +{ + if (object.isIndirect()) + { + if (object.isNull()) + { + // This is a place-holder object for an object stream + } + else if (object.isScalar()) + { + throw QEXC::Internal( + "QPDFWriter::enqueueObject: indirect scalar: " + + std::string(this->filename) + " " + + QUtil::int_to_string(object.getObjectID()) + " " + + QUtil::int_to_string(object.getGeneration())); + } + int objid = object.getObjectID(); + + if (obj_renumber.count(objid) == 0) + { + if (this->object_to_object_stream.count(objid)) + { + // This is in an object stream. Don't process it + // here. Instead, enqueue the object stream. + int stream_id = this->object_to_object_stream[objid]; + enqueueObject(this->pdf.getObjectByID(stream_id, 0)); + } + else + { + object_queue.push_back(object); + obj_renumber[objid] = next_objid++; + + if (this->object_stream_to_objects.count(objid)) + { + // For linearized files, uncompressed objects go + // at end, and we take care of assigning numbers + // to them elsewhere. + if (! this->linearized) + { + assignCompressedObjectNumbers(objid); + } + } + else if ((! this->direct_stream_lengths) && object.isStream()) + { + // reserve next object ID for length + ++next_objid; + } + } + } + } + else if (object.isArray()) + { + int n = object.getArrayNItems(); + for (int i = 0; i < n; ++i) + { + if (! this->linearized) + { + enqueueObject(object.getArrayItem(i)); + } + } + } + else if (object.isDictionary()) + { + std::set keys = object.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + if (! this->linearized) + { + enqueueObject(object.getKey(*iter)); + } + } + } + else + { + // ignore + } +} + +void +QPDFWriter::unparseChild(QPDFObjectHandle child, int level, int flags) +{ + if (! this->linearized) + { + enqueueObject(child); + } + if (child.isIndirect()) + { + if (child.isScalar()) + { + throw QEXC::Internal( + "QPDFWriter::unparseChild: indirect scalar: " + + QUtil::int_to_string(child.getObjectID()) + " " + + QUtil::int_to_string(child.getGeneration())); + } + int old_id = child.getObjectID(); + int new_id = obj_renumber[old_id]; + writeString(QUtil::int_to_string(new_id)); + writeString(" 0 R"); + } + else + { + unparseObject(child, level, flags); + } +} + +void +QPDFWriter::writeTrailer(trailer_e which, int size, bool xref_stream, int prev) +{ + QPDFObjectHandle trailer = pdf.getTrailer(); + if (! xref_stream) + { + writeString("trailer <<"); + } + writeStringQDF("\n"); + if (which == t_lin_second) + { + writeString(" /Size "); + writeString(QUtil::int_to_string(size)); + } + else + { + std::set keys = trailer.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string const& key = *iter; + writeStringQDF(" "); + writeStringNoQDF(" "); + writeString(QPDF_Name::normalizeName(key)); + writeString(" "); + if (key == "/Size") + { + writeString(QUtil::int_to_string(size)); + if (which == t_lin_first) + { + writeString(" /Prev "); + int pos = this->pipeline->getCount(); + writeString(QUtil::int_to_string(prev)); + int nspaces = pos + 11 - this->pipeline->getCount(); + assert(nspaces >= 0); + for (int i = 0; i < nspaces; ++i) + { + writeString(" "); + } + } + } + else + { + unparseChild(trailer.getKey(key), 1, 0); + } + writeStringQDF("\n"); + } + } + + // Write ID + writeStringQDF(" "); + writeString(" /ID ["); + writeString(QPDF_String(this->id1).unparse(true)); + writeString(QPDF_String(this->id2).unparse(true)); + writeString("]"); + + if (which != t_lin_second) + { + // Write reference to encryption dictionary + if (this->encrypted) + { + writeString(" /Encrypt "); + writeString(QUtil::int_to_string(this->encryption_dict_objid)); + writeString(" 0 R"); + } + } + + writeStringQDF("\n"); + writeStringNoQDF(" "); + writeString(">>"); +} + +void +QPDFWriter::unparseObject(QPDFObjectHandle object, int level, + unsigned int flags) +{ + unparseObject(object, level, flags, 0, false); +} + +void +QPDFWriter::unparseObject(QPDFObjectHandle object, int level, + unsigned int flags, int stream_length, bool compress) +{ + unsigned int child_flags = flags & ~f_stream; + + std::string indent; + for (int i = 0; i < level; ++i) + { + indent += " "; + } + + if (object.isArray()) + { + // Note: PDF spec 1.4 implementation note 121 states that + // Acrobat requires a space after the [ in the /H key of the + // linearization parameter dictionary. We'll do this + // unconditionally for all arrays because it looks nicer and + // doesn't make the files that much bigger. + writeString("["); + writeStringQDF("\n"); + int n = object.getArrayNItems(); + for (int i = 0; i < n; ++i) + { + writeStringQDF(indent); + writeStringQDF(" "); + writeStringNoQDF(" "); + unparseChild(object.getArrayItem(i), level + 1, child_flags); + writeStringQDF("\n"); + } + writeStringQDF(indent); + writeStringNoQDF(" "); + writeString("]"); + } + else if (object.isDictionary()) + { + writeString("<<"); + writeStringQDF("\n"); + std::set keys = object.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string const& key = *iter; + if ((flags & f_filtered) && + ((key == "/Filter") || + (key == "/DecodeParms"))) + { + continue; + } + if ((flags & f_stream) && (key == "/Length")) + { + continue; + } + writeStringQDF(indent); + writeStringQDF(" "); + writeStringNoQDF(" "); + writeString(QPDF_Name::normalizeName(key)); + writeString(" "); + unparseChild(object.getKey(key), level + 1, child_flags); + writeStringQDF("\n"); + } + + if (flags & f_stream) + { + writeStringQDF(indent); + writeStringQDF(" "); + writeString(" /Length "); + + if (this->direct_stream_lengths) + { + writeString(QUtil::int_to_string(stream_length)); + } + else + { + writeString( + QUtil::int_to_string(this->cur_stream_length_id)); + writeString(" 0 R"); + } + writeStringQDF("\n"); + if (compress && (flags & f_filtered)) + { + writeStringQDF(indent); + writeStringQDF(" "); + writeString(" /Filter /FlateDecode"); + writeStringQDF("\n"); + } + } + + writeStringQDF(indent); + writeStringNoQDF(" "); + writeString(">>"); + } + else if (object.isStream()) + { + // Write stream data to a buffer. + int old_id = object.getObjectID(); + int new_id = obj_renumber[old_id]; + if (! this->direct_stream_lengths) + { + this->cur_stream_length_id = new_id + 1; + } + QPDFObjectHandle stream_dict = object.getDict(); + + bool filter = (this->stream_data_mode != s_preserve); + if (this->stream_data_mode == s_compress) + { + // Don't filter if the stream is already compressed with + // FlateDecode. We don't want to make it worse by getting + // rid of a predictor or otherwising messing with it. We + // should also avoid messing with anything that's + // compressed with a lossy compression scheme, but we + // don't support any of those right now. + QPDFObjectHandle filter_obj = stream_dict.getKey("/Filter"); + if (filter_obj.isName() && (filter_obj.getName() == "/FlateDecode")) + { + QTC::TC("qpdf", "QPDFWriter not recompressing /FlateDecode"); + filter = false; + } + } + bool normalize = false; + bool compress = false; + if (this->normalize_content && normalized_streams.count(old_id)) + { + normalize = true; + filter = true; + } + else if (filter && (this->stream_data_mode == s_compress)) + { + compress = true; + QTC::TC("qpdf", "QPDFWriter compressing uncompressed stream"); + } + + flags |= f_stream; + + pushPipeline(new Pl_Buffer("stream data")); + activatePipelineStack(); + bool filtered = + object.pipeStreamData(this->pipeline, filter, normalize, compress); + PointerHolder stream_data; + popPipelineStack(&stream_data); + if (filtered) + { + flags |= f_filtered; + } + else + { + compress = false; + } + + this->cur_stream_length = stream_data.getPointer()->getSize(); + unparseObject(stream_dict, 0, flags, this->cur_stream_length, compress); + writeString("\nstream\n"); + pushEncryptionFilter(); + writeBuffer(stream_data); + popPipelineStack(); + + if (this->qdf_mode) + { + if (this->pipeline->getLastChar() != '\n') + { + writeString("\n"); + this->added_newline = true; + } + else + { + this->added_newline = false; + } + } + writeString("endstream"); + } + else if (object.isString()) + { + std::string val; + if (this->encrypted && + (! (flags & f_in_ostream)) && + (! this->cur_data_key.empty())) + { + val = object.getStringValue(); + char* tmp = QUtil::copy_string(val); + unsigned int vlen = val.length(); + RC4 rc4((unsigned char const*)this->cur_data_key.c_str(), + this->cur_data_key.length()); + rc4.process((unsigned char*)tmp, vlen); + val = QPDF_String(std::string(tmp, vlen)).unparse(); + delete [] tmp; + } + else + { + val = object.unparseResolved(); + } + writeString(val); + } + else + { + writeString(object.unparseResolved()); + } +} + +void +QPDFWriter::writeObjectStreamOffsets(std::vector& offsets, + int first_obj) +{ + for (unsigned int i = 0; i < offsets.size(); ++i) + { + if (i != 0) + { + writeStringQDF("\n"); + writeStringNoQDF(" "); + } + writeString(QUtil::int_to_string(i + first_obj)); + writeString(" "); + writeString(QUtil::int_to_string(offsets[i])); + } + writeString("\n"); +} + +void +QPDFWriter::writeObjectStream(QPDFObjectHandle object) +{ + // Note: object might be null if this is a place-holder for an + // object stream that we are generating from scratch. + + int old_id = object.getObjectID(); + int new_id = obj_renumber[old_id]; + + std::vector offsets; + int first = 0; + + // Generate stream itself. We have to do this in two passes so we + // can calculate offsets in the first pass. + PointerHolder stream_buffer; + int first_obj = -1; + bool compressed = false; + for (int pass = 1; pass <= 2; ++pass) + { + if (pass == 1) + { + pushDiscardFilter(); + } + else + { + // Adjust offsets to skip over comment before first object + + first = offsets[0]; + for (std::vector::iterator iter = offsets.begin(); + iter != offsets.end(); ++iter) + { + *iter -= first; + } + + // Take one pass at writing pairs of numbers so we can get + // their size information + pushDiscardFilter(); + writeObjectStreamOffsets(offsets, first_obj); + first += this->pipeline->getCount(); + popPipelineStack(); + + // Set up a stream to write the stream data into a buffer. + Pipeline* next = pushPipeline(new Pl_Buffer("object stream")); + if (! ((this->stream_data_mode == s_uncompress) || this->qdf_mode)) + { + compressed = true; + next = pushPipeline( + new Pl_Flate("compress object stream", next, + Pl_Flate::a_deflate)); + } + activatePipelineStack(); + writeObjectStreamOffsets(offsets, first_obj); + } + + int count = 0; + for (std::set::iterator iter = + this->object_stream_to_objects[old_id].begin(); + iter != this->object_stream_to_objects[old_id].end(); + ++iter, ++count) + { + int obj = *iter; + int new_obj = this->obj_renumber[obj]; + if (first_obj == -1) + { + first_obj = new_obj; + } + if (this->qdf_mode) + { + writeString("%% Object stream: object " + + QUtil::int_to_string(new_obj) + ", index " + + QUtil::int_to_string(count) + "\n"); + } + if (pass == 1) + { + offsets.push_back(this->pipeline->getCount()); + } + writeObject(this->pdf.getObjectByID(obj, 0), count); + + this->xref[new_obj] = QPDFXRefEntry(2, new_id, count); + } + + // stream_buffer will be initialized only for pass 2 + popPipelineStack(&stream_buffer); + } + + // Write the object + openObject(new_id); + setDataKey(new_id); + writeString("<<"); + writeStringQDF("\n "); + writeString(" /Type /ObjStm"); + writeStringQDF("\n "); + writeString(" /Length " + + QUtil::int_to_string(stream_buffer.getPointer()->getSize())); + writeStringQDF("\n "); + if (compressed) + { + writeString(" /Filter /FlateDecode"); + } + writeString(" /N " + QUtil::int_to_string(offsets.size())); + writeStringQDF("\n "); + writeString(" /First " + QUtil::int_to_string(first)); + if (! object.isNull()) + { + // If the original object has an /Extends key, preserve it. + QPDFObjectHandle dict = object.getDict(); + QPDFObjectHandle extends = dict.getKey("/Extends"); + if (extends.isIndirect()) + { + QTC::TC("qpdf", "QPDFWriter copy Extends"); + writeStringQDF("\n "); + writeString(" /Extends "); + unparseChild(extends, 1, f_in_ostream); + } + } + writeStringQDF("\n"); + writeStringNoQDF(" "); + writeString(">>\nstream\n"); + if (this->encrypted) + { + QTC::TC("qpdf", "QPDFWriter encrypt object stream"); + } + pushEncryptionFilter(); + writeBuffer(stream_buffer); + popPipelineStack(); + writeString("endstream"); + this->cur_data_key.clear(); + closeObject(new_id); +} + +void +QPDFWriter::writeObject(QPDFObjectHandle object, int object_stream_index) +{ + int old_id = object.getObjectID(); + + if ((object_stream_index == -1) && + (this->object_stream_to_objects.count(old_id))) + { + writeObjectStream(object); + return; + } + + int new_id = obj_renumber[old_id]; + if (this->qdf_mode) + { + if (this->page_object_to_seq.count(old_id)) + { + writeString("%% Page "); + writeString( + QUtil::int_to_string( + this->page_object_to_seq[old_id])); + writeString("\n"); + } + if (this->contents_to_page_seq.count(old_id)) + { + writeString("%% Contents for page "); + writeString( + QUtil::int_to_string( + this->contents_to_page_seq[old_id])); + writeString("\n"); + } + } + if (object_stream_index == -1) + { + openObject(new_id); + setDataKey(new_id); + unparseObject(object, 0, 0); + this->cur_data_key.clear(); + closeObject(new_id); + } + else + { + unparseObject(object, 0, f_in_ostream); + writeString("\n"); + } + + if ((! this->direct_stream_lengths) && object.isStream()) + { + if (this->qdf_mode) + { + if (this->added_newline) + { + writeString("%QDF: ignore_newline\n"); + } + } + openObject(new_id + 1); + writeString(QUtil::int_to_string(this->cur_stream_length)); + closeObject(new_id + 1); + } +} + +void +QPDFWriter::generateID() +{ + // Note: we can't call generateID() at the time of construction + // since the caller hasn't yet had a chance to call setStaticID(), + // but we need to generate it before computing encryption + // dictionary parameters. This is why we call this function both + // from setEncryptionParameters() and from write() and return + // immediately if the ID has already been generated. + + if (! this->id2.empty()) + { + return; + } + + QPDFObjectHandle trailer = pdf.getTrailer(); + + std::string result; + + if (this->static_id) + { + // For test suite use only... + static char tmp[] = {0x31, 0x41, 0x59, 0x26, + 0x53, 0x58, 0x97, 0x93, + 0x23, 0x84, 0x62, 0x64, + 0x33, 0x83, 0x27, 0x95, + 0x00}; + result = tmp; + } + else + { + // The PDF specification has guidelines for creating IDs, but it + // states clearly that the only thing that's really important is + // that it is very likely to be unique. We can't really follow + // the guidelines in the spec exactly because we haven't written + // the file yet. This scheme should be fine though. + + std::string seed; + seed += QUtil::int_to_string((int)time(0)); + seed += " QPDF "; + seed += filename; + seed += " "; + if (trailer.hasKey("/Info")) + { + std::set keys = trailer.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + QPDFObjectHandle obj = trailer.getKey(*iter); + if (obj.isString()) + { + seed += " "; + seed += obj.getStringValue(); + } + } + } + + MD5 m; + m.encodeString(seed.c_str()); + MD5::Digest digest; + m.digest(digest); + result = std::string((char*)digest, sizeof(MD5::Digest)); + } + + // If /ID already exists, follow the spec: use the original first + // word and generate a new second word. Otherwise, we'll use the + // generated ID for both. + + this->id2 = result; + if (trailer.hasKey("/ID")) + { + // Note: keep /ID from old file even if --static-id was given. + this->id1 = trailer.getKey("/ID").getArrayItem(0).getStringValue(); + } + else + { + this->id1 = this->id2; + } +} + +void +QPDFWriter::initializeSpecialStreams() +{ + // Mark all page content streams in case we are filtering or + // normalizing. + std::vector pages = pdf.getAllPages(); + int num = 0; + for (std::vector::iterator iter = pages.begin(); + iter != pages.end(); ++iter) + { + QPDFObjectHandle& page = *iter; + this->page_object_to_seq[page.getObjectID()] = ++num; + QPDFObjectHandle contents = page.getKey("/Contents"); + std::vector contents_objects; + if (contents.isArray()) + { + int n = contents.getArrayNItems(); + for (int i = 0; i < n; ++i) + { + contents_objects.push_back( + contents.getArrayItem(i).getObjectID()); + } + } + else if (contents.isStream()) + { + contents_objects.push_back(contents.getObjectID()); + } + + for (std::vector::iterator iter = contents_objects.begin(); + iter != contents_objects.end(); ++iter) + { + this->contents_to_page_seq[*iter] = num; + this->normalized_streams.insert(*iter); + } + } +} + +void +QPDFWriter::preserveObjectStreams() +{ + this->pdf.getObjectStreamData(this->object_to_object_stream); +} + +void +QPDFWriter::generateObjectStreams() +{ + // Basic strategy: make a list of objects that can go into an + // object stream. Then figure out how many object streams are + // needed so that we can distribute objects approximately evenly + // without having any object stream exceed 100 members. We don't + // have to worry about linearized files here -- if the file is + // linearized, we take care of excluding things that aren't + // allowed here later. + + // This code doesn't do anything with /Extends. + + std::vector const& eligible = this->pdf.getCompressibleObjects(); + unsigned int n_object_streams = (eligible.size() + 99) / 100; + unsigned int n_per = eligible.size() / n_object_streams; + if (n_per * n_object_streams < eligible.size()) + { + ++n_per; + } + unsigned int n = 0; + int cur_ostream = 0; + for (std::vector::const_iterator iter = eligible.begin(); + iter != eligible.end(); ++iter) + { + if ((n % n_per) == 0) + { + if (n > 0) + { + QTC::TC("qpdf", "QPDFWriter generate >1 ostream"); + } + n = 0; + } + if (n == 0) + { + // Construct a new null object as the "original" object + // stream. The rest of the code knows that this means + // we're creating the object stream from scratch. + cur_ostream = this->pdf.makeIndirectObject( + QPDFObjectHandle::newNull()).getObjectID(); + } + this->object_to_object_stream[*iter] = cur_ostream; + ++n; + } +} + +void +QPDFWriter::write() +{ + // Do preliminary setup + + if (this->linearized) + { + this->qdf_mode = false; + } + + if (this->qdf_mode) + { + if (! this->normalize_content_set) + { + this->normalize_content = true; + } + if (! this->stream_data_mode_set) + { + this->stream_data_mode = s_uncompress; + } + } + + if (this->encrypted) + { + // Encryption has been explicitly set + this->preserve_encryption = false; + } + else if (this->normalize_content || + (this->stream_data_mode == s_uncompress) || + this->qdf_mode) + { + // Encryption makes looking at contents pretty useless. If + // the user explicitly encrypted though, we still obey that. + this->preserve_encryption = false; + } + + if (preserve_encryption) + { + copyEncryptionParameters(); + } + + if (this->qdf_mode || this->normalize_content || + (this->stream_data_mode == s_uncompress)) + { + initializeSpecialStreams(); + } + + if (this->qdf_mode) + { + // Generate indirect stream lengths for qdf mode since fix-qdf + // uses them for storing recomputed stream length data. + // Certain streams such as object streams, xref streams, and + // hint streams always get direct stream lengths. + this->direct_stream_lengths = false; + } + + switch (this->object_stream_mode) + { + case o_disable: + // no action required + break; + + case o_preserve: + preserveObjectStreams(); + break; + + case o_generate: + generateObjectStreams(); + break; + + // no default so gcc will warn for missing case tag + } + + if (this->linearized) + { + // Page dictionaries are not allowed to be compressed objects. + std::vector pages = pdf.getAllPages(); + for (std::vector::iterator iter = pages.begin(); + iter != pages.end(); ++iter) + { + QPDFObjectHandle& page = *iter; + int objid = page.getObjectID(); + if (this->object_to_object_stream.count(objid)) + { + QTC::TC("qpdf", "QPDFWriter uncompressing page dictionary"); + this->object_to_object_stream.erase(objid); + } + } + } + + if (this->linearized || this->encrypted) + { + // The document catalog is not allowed to be compressed in + // linearized files either. It also appears that Adobe Reader + // 8.0.0 has a bug that prevents it from being able to handle + // encrypted files with compressed document catalogs, so we + // disable them in that case as well. + int objid = pdf.getRoot().getObjectID(); + if (this->object_to_object_stream.count(objid)) + { + QTC::TC("qpdf", "QPDFWriter uncompressing root"); + this->object_to_object_stream.erase(objid); + } + } + + // Generate reverse mapping from object stream to objects + for (std::map::iterator iter = + this->object_to_object_stream.begin(); + iter != this->object_to_object_stream.end(); ++iter) + { + int obj = (*iter).first; + int stream = (*iter).second; + this->object_stream_to_objects[stream].insert(obj); + this->max_ostream_index = + std::max(this->max_ostream_index, + (int)this->object_stream_to_objects[stream].size() - 1); + } + + if (! this->object_stream_to_objects.empty()) + { + this->min_pdf_version = "1.5"; + } + + generateID(); + + pdf.trimTrailerForWrite(); + pdf.flattenScalarReferences(); + + if (this->linearized) + { + writeLinearized(); + } + else + { + writeStandard(); + } + + this->pipeline->finish(); + if (this->close_file) + { + fclose(this->file); + } + this->file = 0; +} + +void +QPDFWriter::enqueuePart(std::vector& part) +{ + for (std::vector::iterator iter = part.begin(); + iter != part.end(); ++iter) + { + enqueueObject(*iter); + } +} + +void +QPDFWriter::writeEncryptionDictionary() +{ + this->encryption_dict_objid = openObject(this->encryption_dict_objid); + writeString("<<"); + for (std::map::iterator iter = + this->encryption_dictionary.begin(); + iter != this->encryption_dictionary.end(); ++iter) + { + writeString(" "); + writeString((*iter).first); + writeString(" "); + writeString((*iter).second); + } + writeString(" >>"); + closeObject(this->encryption_dict_objid); +} + +void +QPDFWriter::writeHeader() +{ + std::string version = pdf.getPDFVersion(); + if (! this->min_pdf_version.empty()) + { + float ov = atof(version.c_str()); + float mv = atof(this->min_pdf_version.c_str()); + if (mv > ov) + { + version = this->min_pdf_version; + } + } + + writeString("%PDF-"); + writeString(version); + // This string of binary characters would not be valid UTF-8, so + // it really should be treated as binary. + writeString("\n%¿÷¢þ\n"); + writeStringQDF("%QDF-1.0\n\n"); +} + +void +QPDFWriter::writeHintStream(int hint_id) +{ + PointerHolder hint_buffer; + int S = 0; + int O = 0; + pdf.generateHintStream( + this->xref, this->lengths, this->obj_renumber, hint_buffer, S, O); + + openObject(hint_id); + setDataKey(hint_id); + + unsigned char* hs = hint_buffer.getPointer()->getBuffer(); + unsigned long hlen = hint_buffer.getPointer()->getSize(); + + writeString("<< /Filter /FlateDecode /S "); + writeString(QUtil::int_to_string(S)); + if (O) + { + writeString(" /O "); + writeString(QUtil::int_to_string(O)); + } + writeString(" /Length "); + writeString(QUtil::int_to_string(hlen)); + writeString(" >>\nstream\n"); + + if (this->encrypted) + { + QTC::TC("qpdf", "QPDFWriter encrypted hint stream"); + } + pushEncryptionFilter(); + writeBuffer(hint_buffer); + popPipelineStack(); + + if (hs[hlen - 1] != '\n') + { + writeString("\n"); + } + writeString("endstream"); + closeObject(hint_id); +} + +int +QPDFWriter::writeXRefTable(trailer_e which, int first, int last, int size) +{ + return writeXRefTable(which, first, last, size, 0, false, 0, 0, 0); +} + +int +QPDFWriter::writeXRefTable(trailer_e which, int first, int last, int size, + int prev, bool suppress_offsets, + int hint_id, int hint_offset, int hint_length) +{ + writeString("xref\n"); + writeString(QUtil::int_to_string(first)); + writeString(" "); + writeString(QUtil::int_to_string(last - first + 1)); + int space_before_zero = this->pipeline->getCount(); + writeString("\n"); + for (int i = first; i <= last; ++i) + { + if (i == 0) + { + writeString("0000000000 65535 f \n"); + } + else + { + int offset = 0; + if (! suppress_offsets) + { + offset = this->xref[i].getOffset(); + if ((hint_id != 0) && + (i != hint_id) && + (offset >= hint_offset)) + { + offset += hint_length; + } + } + writeString(QUtil::int_to_string(offset, 10)); + writeString(" 00000 n \n"); + } + } + writeTrailer(which, size, false, prev); + writeString("\n"); + return space_before_zero; +} + +int +QPDFWriter::writeXRefStream(int objid, int max_id, int max_offset, + trailer_e which, int first, int last, int size) +{ + return writeXRefStream(objid, max_id, max_offset, + which, first, last, size, 0, 0, 0, 0); +} + +int +QPDFWriter::writeXRefStream(int xref_id, int max_id, int max_offset, + trailer_e which, int first, int last, int size, + int prev, int hint_id, + int hint_offset, int hint_length) +{ + int xref_offset = this->pipeline->getCount(); + int space_before_zero = xref_offset - 1; + + // field 1 contains offsets and object stream identifiers + int f1_size = std::max(bytesNeeded(max_offset), + bytesNeeded(max_id)); + + // field 2 contains object stream indices + int f2_size = bytesNeeded(this->max_ostream_index); + + unsigned int esize = 1 + f1_size + f2_size; + + // Must store in xref table in advance of writing the actual data + // rather than waiting for openObject to do it. + this->xref[xref_id] = QPDFXRefEntry(1, pipeline->getCount(), 0); + + Pipeline* p = pushPipeline(new Pl_Buffer("xref stream")); + bool compressed = false; + if (! ((this->stream_data_mode == s_uncompress) || this->qdf_mode)) + { + compressed = true; + p = pushPipeline( + new Pl_Flate("compress xref", p, Pl_Flate::a_deflate)); + p = pushPipeline( + new Pl_PNGFilter( + "pngify xref", p, Pl_PNGFilter::a_encode, esize, 0)); + } + activatePipelineStack(); + for (int i = first; i <= last; ++i) + { + QPDFXRefEntry& e = this->xref[i]; + switch (e.getType()) + { + case 0: + writeBinary(0, 1); + writeBinary(0, f1_size); + writeBinary(0, f2_size); + break; + + case 1: + { + int offset = e.getOffset(); + if ((hint_id != 0) && + (i != hint_id) && + (offset >= hint_offset)) + { + offset += hint_length; + } + writeBinary(1, 1); + writeBinary(offset, f1_size); + writeBinary(0, f2_size); + } + break; + + case 2: + writeBinary(2, 1); + writeBinary(e.getObjStreamNumber(), f1_size); + writeBinary(e.getObjStreamIndex(), f2_size); + break; + + default: + throw QEXC::Internal("invalid type writing xref stream"); + break; + } + } + PointerHolder xref_data; + popPipelineStack(&xref_data); + + openObject(xref_id); + writeString("<<"); + writeStringQDF("\n "); + writeString(" /Type /XRef"); + writeStringQDF("\n "); + writeString(" /Length " + + QUtil::int_to_string(xref_data.getPointer()->getSize())); + if (compressed) + { + writeStringQDF("\n "); + writeString(" /Filter /FlateDecode"); + writeStringQDF("\n "); + writeString(" /DecodeParms << /Columns " + + QUtil::int_to_string(esize) + " /Predictor 12 >>"); + } + writeStringQDF("\n "); + writeString(" /W [ 1 " + + QUtil::int_to_string(f1_size) + " " + + QUtil::int_to_string(f2_size) + " ]"); + if (! ((first == 0) && (last == size - 1))) + { + writeString(" /Index [ " + + QUtil::int_to_string(first) + " " + + QUtil::int_to_string(last - first + 1) + " ]"); + } + writeTrailer(which, size, true, prev); + writeString("\nstream\n"); + writeBuffer(xref_data); + writeString("\nendstream"); + closeObject(xref_id); + return space_before_zero; +} + +void +QPDFWriter::writeLinearized() +{ + // Optimize file and enqueue objects in order + + bool need_xref_stream = (! this->object_to_object_stream.empty()); + pdf.optimize(this->object_to_object_stream); + + std::vector part4; + std::vector part6; + std::vector part7; + std::vector part8; + std::vector part9; + pdf.getLinearizedParts(this->object_to_object_stream, + part4, part6, part7, part8, part9); + + // Object number sequence: + // + // second half + // second half uncompressed objects + // second half xref stream, if any + // second half compressed objects + // first half + // linearization dictionary + // first half xref stream, if any + // part 4 uncompresesd objects + // encryption dictionary, if any + // hint stream + // part 6 uncompressed objects + // first half compressed objects + // + + // Second half objects + int second_half_uncompressed = part7.size() + part8.size() + part9.size(); + int second_half_first_obj = 1; + int after_second_half = 1 + second_half_uncompressed; + this->next_objid = after_second_half; + int second_half_xref = 0; + if (need_xref_stream) + { + second_half_xref = this->next_objid++; + } + // Assign numbers to all compressed objects in the second half. + std::vector* vecs2[] = {&part7, &part8, &part9}; + for (int i = 0; i < 3; ++i) + { + for (std::vector::iterator iter = (*vecs2[i]).begin(); + iter != (*vecs2[i]).end(); ++iter) + { + assignCompressedObjectNumbers((*iter).getObjectID()); + } + } + int second_half_end = this->next_objid - 1; + int second_trailer_size = this->next_objid; + + // First half objects + int first_half_start = this->next_objid; + int lindict_id = this->next_objid++; + int first_half_xref = 0; + if (need_xref_stream) + { + first_half_xref = this->next_objid++; + } + int part4_first_obj = this->next_objid; + this->next_objid += part4.size(); + int after_part4 = this->next_objid; + if (this->encrypted) + { + this->encryption_dict_objid = this->next_objid++; + } + int hint_id = this->next_objid++; + int part6_first_obj = this->next_objid; + this->next_objid += part6.size(); + int after_part6 = this->next_objid; + // Assign numbers to all compressed objects in the first half + std::vector* vecs1[] = {&part4, &part6}; + for (int i = 0; i < 2; ++i) + { + for (std::vector::iterator iter = (*vecs1[i]).begin(); + iter != (*vecs1[i]).end(); ++iter) + { + assignCompressedObjectNumbers((*iter).getObjectID()); + } + } + int first_half_end = this->next_objid - 1; + int first_trailer_size = this->next_objid; + + int part4_end_marker = part4.back().getObjectID(); + int part6_end_marker = part6.back().getObjectID(); + int space_before_zero = 0; + int file_size = 0; + int part6_end_offset = 0; + int first_half_max_obj_offset = 0; + int second_xref_offset = 0; + int first_xref_end = 0; + int second_xref_end = 0; + + this->next_objid = part4_first_obj; + enqueuePart(part4); + assert(this->next_objid = after_part4); + this->next_objid = part6_first_obj; + enqueuePart(part6); + assert(this->next_objid == after_part6); + this->next_objid = second_half_first_obj; + enqueuePart(part7); + enqueuePart(part8); + enqueuePart(part9); + assert(this->next_objid == after_second_half); + + int hint_length = 0; + PointerHolder hint_buffer; + + // Write file in two passes. Part numbers refer to PDF spec 1.4. + + for (int pass = 1; pass <= 2; ++pass) + { + if (pass == 1) + { + pushDiscardFilter(); + } + + // Part 1: header + + writeHeader(); + + // Part 2: linearization parameter dictionary. Save enough + // space to write real dictionary. 150 characters is enough + // space if all numerical values in the parameter dictionary + // are 10 digits long plus a few extra characters for safety. + + int pos = this->pipeline->getCount(); + openObject(lindict_id); + writeString("<<"); + if (pass == 2) + { + std::vector const& pages = pdf.getAllPages(); + int first_page_object = obj_renumber[pages[0].getObjectID()]; + int npages = pages.size(); + + writeString(" /Linearized 1 /L "); + writeString(QUtil::int_to_string(file_size + hint_length)); + // Implementation note 121 states that a space is + // mandatory after this open bracket. + writeString(" /H [ "); + writeString(QUtil::int_to_string(this->xref[hint_id].getOffset())); + writeString(" "); + writeString(QUtil::int_to_string(hint_length)); + writeString(" ] /O "); + writeString(QUtil::int_to_string(first_page_object)); + writeString(" /E "); + writeString(QUtil::int_to_string(part6_end_offset + hint_length)); + writeString(" /N "); + writeString(QUtil::int_to_string(npages)); + writeString(" /T "); + writeString(QUtil::int_to_string(space_before_zero + hint_length)); + } + writeString(" >>"); + closeObject(lindict_id); + static int const pad = 150; + int spaces = (pos + pad - this->pipeline->getCount()); + assert(spaces >= 0); + for (int i = 0; i < spaces; ++i) + { + writeString(" "); + } + writeString("\n"); + + // Part 3: first page cross reference table and trailer. + + int first_xref_offset = this->pipeline->getCount(); + int hint_offset = 0; + if (pass == 2) + { + hint_offset = this->xref[hint_id].getOffset(); + } + if (need_xref_stream) + { + // Must pad here too. + if (pass == 1) + { + // first_half_max_obj_offset is very likely to fall + // within the first 64K of the document (thus + // requiring two bytes for offsets) since it is the + // offset of the last uncompressed object in page 1. + // We allow for it to do otherwise though. + first_half_max_obj_offset = 65535; + } + pos = this->pipeline->getCount(); + writeXRefStream(first_half_xref, first_half_end, + first_half_max_obj_offset, + t_lin_first, first_half_start, first_half_end, + first_trailer_size, + hint_length + second_xref_offset, + hint_id, hint_offset, hint_length); + int endpos = this->pipeline->getCount(); + if (pass == 1) + { + // Pad so we have enough room for the real xref + // stream. In an extremely unlikely worst case, + // first_half_max_obj_offset could be enough larger to + // require two extra bytes beyond what we calculated + // in pass 1. This means we need to save two extra + // bytes for each xref entry. To that, we'll add 10 + // extra bytes for number length increases. + int possible_extra = + 10 + (2 * (first_half_end - first_half_start + 1)); + for (int i = 0; i < possible_extra; ++i) + { + writeString(" "); + } + first_xref_end = this->pipeline->getCount(); + } + else + { + // Pad so that the next object starts at the same + // place as in pass 1. + for (int i = 0; i < first_xref_end - endpos; ++i) + { + writeString(" "); + } + assert(this->pipeline->getCount() == first_xref_end); + } + writeString("\n"); + } + else + { + writeXRefTable(t_lin_first, first_half_start, first_half_end, + first_trailer_size, hint_length + second_xref_offset, + (pass == 1), hint_id, hint_offset, hint_length); + writeString("startxref\n0\n%%EOF\n"); + } + + // Parts 4 through 9 + + for (std::list::iterator iter = + this->object_queue.begin(); + iter != this->object_queue.end(); ++iter) + { + QPDFObjectHandle cur_object = (*iter); + if (cur_object.getObjectID() == part6_end_marker) + { + first_half_max_obj_offset = this->pipeline->getCount(); + } + writeObject(cur_object); + if (cur_object.getObjectID() == part4_end_marker) + { + if (this->encrypted) + { + writeEncryptionDictionary(); + } + if (pass == 1) + { + this->xref[hint_id] = + QPDFXRefEntry(1, this->pipeline->getCount(), 0); + } + else + { + // Part 5: hint stream + writeBuffer(hint_buffer); + } + } + if (cur_object.getObjectID() == part6_end_marker) + { + part6_end_offset = this->pipeline->getCount(); + } + } + + // Part 10: overflow hint stream -- not used + + // Part 11: main cross reference table and trailer + + second_xref_offset = this->pipeline->getCount(); + if (need_xref_stream) + { + space_before_zero = + writeXRefStream(second_half_xref, + second_half_end, second_xref_offset, + t_lin_second, 0, second_half_end, + second_trailer_size); + if (pass == 1) + { + // Add some padding -- we need an accurate file_size + // number, and this could change if the pass 2 xref + // stream compresses differently. There shouldn't be + // much difference, so we'll just pad 100 characters. + // This is unscientific though, and may not always + // work. The only way we could really get around this + // would be to seek back to the beginning of the file + // and update /L in the linearization dictionary, but + // that would be the only thing in the design that + // would require the output file to be seekable. + for (int i = 0; i < 99; ++i) + { + writeString(" "); + } + writeString("\n"); + second_xref_end = this->pipeline->getCount(); + } + else + { + // Make the file size the same. + int pos = this->pipeline->getCount(); + while (pos < second_xref_end + hint_length - 1) + { + ++pos; + writeString(" "); + } + writeString("\n"); + // If this assertion fails, maybe we didn't have + // enough padding above. + assert(this->pipeline->getCount() == + second_xref_end + hint_length); + } + } + else + { + space_before_zero = + writeXRefTable(t_lin_second, 0, second_half_end, + second_trailer_size); + } + writeString("startxref\n"); + writeString(QUtil::int_to_string(first_xref_offset)); + writeString("\n%%EOF\n"); + + if (pass == 1) + { + // Close first pass pipeline + file_size = this->pipeline->getCount(); + popPipelineStack(); + + // Save hint offset since it will be set to zero by + // calling openObject. + int hint_offset = this->xref[hint_id].getOffset(); + + // Write hint stream to a buffer + pushPipeline(new Pl_Buffer("hint buffer")); + activatePipelineStack(); + writeHintStream(hint_id); + popPipelineStack(&hint_buffer); + hint_length = hint_buffer.getPointer()->getSize(); + + // Restore hint offset + this->xref[hint_id] = QPDFXRefEntry(1, hint_offset, 0); + } + } +} + +void +QPDFWriter::writeStandard() +{ + // Start writing + + writeHeader(); + + // Put root first on queue. + QPDFObjectHandle trailer = pdf.getTrailer(); + enqueueObject(trailer.getKey("/Root")); + + // Next place any other objects referenced from the trailer + // dictionary into the queue, handling direct objects recursively. + // Root is already there, so enqueuing it a second time is a + // no-op. + std::set keys = trailer.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + enqueueObject(trailer.getKey(*iter)); + } + + // Now start walking queue, output each object + while (this->object_queue.size()) + { + QPDFObjectHandle cur_object = this->object_queue.front(); + this->object_queue.pop_front(); + writeObject(cur_object); + } + + // Write out the encryption dictionary, if any + if (this->encrypted) + { + writeEncryptionDictionary(); + } + + // Now write out xref. next_objid is now the number of objects. + off_t xref_offset = this->pipeline->getCount(); + if (this->object_stream_to_objects.empty()) + { + // Write regular cross-reference table + // Write regular cross-reference table + writeXRefTable(t_normal, 0, this->next_objid - 1, this->next_objid); + } + else + { + // Write cross-reference stream. + int xref_id = this->next_objid++; + writeXRefStream(xref_id, xref_id, xref_offset, t_normal, + 0, this->next_objid - 1, this->next_objid); + } + writeString("startxref\n"); + writeString(QUtil::int_to_string(xref_offset)); + writeString("\n%%EOF\n"); +} diff --git a/libqpdf/QPDFXRefEntry.cc b/libqpdf/QPDFXRefEntry.cc new file mode 100644 index 00000000..669a2f13 --- /dev/null +++ b/libqpdf/QPDFXRefEntry.cc @@ -0,0 +1,61 @@ + +#include +#include +#include + +QPDFXRefEntry::QPDFXRefEntry() : + type(0), + field1(0), + field2(0) +{ +} + +QPDFXRefEntry::QPDFXRefEntry(int type, int field1, int field2) : + type(type), + field1(field1), + field2(field2) +{ + if ((type < 1) || (type > 2)) + { + throw QPDFExc("invalid xref type " + QUtil::int_to_string(type)); + } +} + +int +QPDFXRefEntry::getType() const +{ + return this->type; +} + +int +QPDFXRefEntry::getOffset() const +{ + if (this->type != 1) + { + throw QPDFExc( + "getOffset called for xref entry of type != 1"); + } + return this->field1; +} + +int +QPDFXRefEntry::getObjStreamNumber() const +{ + if (this->type != 2) + { + throw QPDFExc( + "getObjStreamNumber called for xref entry of type != 2"); + } + return this->field1; +} + +int +QPDFXRefEntry::getObjStreamIndex() const +{ + if (this->type != 2) + { + throw QPDFExc( + "getObjStreamIndex called for xref entry of type != 2"); + } + return this->field2; +} diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc new file mode 100644 index 00000000..d1edbfdd --- /dev/null +++ b/libqpdf/QPDF_Array.cc @@ -0,0 +1,51 @@ + +#include + +#include + +QPDF_Array::QPDF_Array(std::vector const& items) : + items(items) +{ +} + +QPDF_Array::~QPDF_Array() +{ +} + +std::string +QPDF_Array::unparse() +{ + std::string result = "[ "; + for (std::vector::iterator iter = this->items.begin(); + iter != this->items.end(); ++iter) + { + result += (*iter).unparse(); + result += " "; + } + result += "]"; + return result; +} + +int +QPDF_Array::getNItems() const +{ + return this->items.size(); +} + +QPDFObjectHandle +QPDF_Array::getItem(int n) const +{ + if ((n < 0) || (n >= (int)this->items.size())) + { + throw QEXC::Internal("bounds array accessing QPDF_Array element"); + } + return this->items[n]; +} + +void +QPDF_Array::setItem(int n, QPDFObjectHandle const& oh) +{ + // Call getItem for bounds checking + (void) getItem(n); + this->items[n] = oh; +} diff --git a/libqpdf/QPDF_Bool.cc b/libqpdf/QPDF_Bool.cc new file mode 100644 index 00000000..2b50c4c2 --- /dev/null +++ b/libqpdf/QPDF_Bool.cc @@ -0,0 +1,23 @@ + +#include + +QPDF_Bool::QPDF_Bool(bool val) : + val(val) +{ +} + +QPDF_Bool::~QPDF_Bool() +{ +} + +std::string +QPDF_Bool::unparse() +{ + return (val ? "true" : "false"); +} + +bool +QPDF_Bool::getVal() const +{ + return this->val; +} diff --git a/libqpdf/QPDF_Dictionary.cc b/libqpdf/QPDF_Dictionary.cc new file mode 100644 index 00000000..654df688 --- /dev/null +++ b/libqpdf/QPDF_Dictionary.cc @@ -0,0 +1,84 @@ + +#include + +#include +#include + +QPDF_Dictionary::QPDF_Dictionary( + std::map const& items) : + items(items) +{ +} + +QPDF_Dictionary::~QPDF_Dictionary() +{ +} + +std::string +QPDF_Dictionary::unparse() +{ + std::string result = "<< "; + for (std::map::iterator iter = + this->items.begin(); + iter != this->items.end(); ++iter) + { + result += QPDF_Name::normalizeName((*iter).first) + + " " + (*iter).second.unparse() + " "; + } + result += ">>"; + return result; +} + +bool +QPDF_Dictionary::hasKey(std::string const& key) +{ + return ((this->items.count(key) > 0) && + (! this->items[key].isNull())); +} + +QPDFObjectHandle +QPDF_Dictionary::getKey(std::string const& key) +{ + // PDF spec says fetching a non-existent key from a dictionary + // returns the null object. + if (this->items.count(key)) + { + // May be a null object + return (*(this->items.find(key))).second; + } + else + { + return QPDFObjectHandle::newNull(); + } +} + +std::set +QPDF_Dictionary::getKeys() +{ + std::set result; + for (std::map::const_iterator iter = + this->items.begin(); + iter != this->items.end(); ++iter) + { + if (hasKey((*iter).first)) + { + result.insert((*iter).first); + } + } + return result; +} + +void +QPDF_Dictionary::replaceKey(std::string const& key, + QPDFObjectHandle const& value) +{ + // add or replace value + this->items[key] = value; +} + +void +QPDF_Dictionary::removeKey(std::string const& key) +{ + // no-op if key does not exist + this->items.erase(key); +} diff --git a/libqpdf/QPDF_Integer.cc b/libqpdf/QPDF_Integer.cc new file mode 100644 index 00000000..988519d0 --- /dev/null +++ b/libqpdf/QPDF_Integer.cc @@ -0,0 +1,25 @@ + +#include + +#include + +QPDF_Integer::QPDF_Integer(int val) : + val(val) +{ +} + +QPDF_Integer::~QPDF_Integer() +{ +} + +std::string +QPDF_Integer::unparse() +{ + return QUtil::int_to_string(this->val); +} + +int +QPDF_Integer::getVal() const +{ + return this->val; +} diff --git a/libqpdf/QPDF_Name.cc b/libqpdf/QPDF_Name.cc new file mode 100644 index 00000000..f57ced04 --- /dev/null +++ b/libqpdf/QPDF_Name.cc @@ -0,0 +1,46 @@ + +#include + +QPDF_Name::QPDF_Name(std::string const& name) : + name(name) +{ +} + +QPDF_Name::~QPDF_Name() +{ +} + +std::string +QPDF_Name::normalizeName(std::string const& name) +{ + std::string result; + char num[4]; + result += name[0]; + for (unsigned int i = 1; i < name.length(); ++i) + { + char ch = name[i]; + // Don't use locale/ctype here; follow PDF spec guidlines. + if (strchr("#()<>[]{}/%", ch) || (ch < 33) || (ch > 126)) + { + sprintf(num, "#%02x", (unsigned char) ch); + result += num; + } + else + { + result += ch; + } + } + return result; +} + +std::string +QPDF_Name::unparse() +{ + return normalizeName(this->name); +} + +std::string +QPDF_Name::getName() const +{ + return this->name; +} diff --git a/libqpdf/QPDF_Null.cc b/libqpdf/QPDF_Null.cc new file mode 100644 index 00000000..57a78b7e --- /dev/null +++ b/libqpdf/QPDF_Null.cc @@ -0,0 +1,12 @@ + +#include + +QPDF_Null::~QPDF_Null() +{ +} + +std::string +QPDF_Null::unparse() +{ + return "null"; +} diff --git a/libqpdf/QPDF_Real.cc b/libqpdf/QPDF_Real.cc new file mode 100644 index 00000000..87a19cb2 --- /dev/null +++ b/libqpdf/QPDF_Real.cc @@ -0,0 +1,23 @@ + +#include + +QPDF_Real::QPDF_Real(std::string const& val) : + val(val) +{ +} + +QPDF_Real::~QPDF_Real() +{ +} + +std::string +QPDF_Real::unparse() +{ + return this->val; +} + +std::string +QPDF_Real::getVal() +{ + return this->val; +} diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc new file mode 100644 index 00000000..9694f837 --- /dev/null +++ b/libqpdf/QPDF_Stream.cc @@ -0,0 +1,309 @@ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +QPDF_Stream::QPDF_Stream(QPDF* qpdf, int objid, int generation, + QPDFObjectHandle stream_dict, + off_t offset, int length) : + qpdf(qpdf), + objid(objid), + generation(generation), + stream_dict(stream_dict), + offset(offset), + length(length) +{ + if (! stream_dict.isDictionary()) + { + throw QEXC::Internal("stream object instantiated with non-dictionary " + "object for dictionary"); + } +} + +QPDF_Stream::~QPDF_Stream() +{ +} + +std::string +QPDF_Stream::unparse() +{ + // Unparse stream objects as indirect references + return QUtil::int_to_string(this->objid) + " " + + QUtil::int_to_string(this->generation) + " R"; +} + +QPDFObjectHandle +QPDF_Stream::getDict() const +{ + return this->stream_dict; +} + +PointerHolder +QPDF_Stream::getStreamData() +{ + Pl_Buffer buf("stream data buffer"); + if (! pipeStreamData(&buf, true, false, false)) + { + throw QPDFExc("getStreamData called on unfilterable stream"); + } + return buf.getBuffer(); +} + +bool +QPDF_Stream::filterable(std::vector& filters, + int& predictor, int& columns, + bool& early_code_change) +{ + // Initialize values to their defaults as per the PDF spec + predictor = 1; + columns = 0; + early_code_change = true; + + bool filterable = true; + + // See if we can support any decode parameters that are specified. + + QPDFObjectHandle decode_obj = + this->stream_dict.getKey("/DecodeParms"); + if (decode_obj.isNull()) + { + // no problem + } + else if (decode_obj.isDictionary()) + { + std::set keys = decode_obj.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string const& key = *iter; + if (key == "/Predictor") + { + QPDFObjectHandle predictor_obj = decode_obj.getKey(key); + if (predictor_obj.isInteger()) + { + predictor = predictor_obj.getIntValue(); + if (! ((predictor == 1) || (predictor == 12))) + { + filterable = false; + } + } + else + { + filterable = false; + } + } + else if (key == "/EarlyChange") + { + QPDFObjectHandle earlychange_obj = decode_obj.getKey(key); + if (earlychange_obj.isInteger()) + { + int earlychange = earlychange_obj.getIntValue(); + early_code_change = (earlychange == 1); + if (! ((earlychange == 0) || (earlychange == 1))) + { + filterable = false; + } + } + else + { + filterable = false; + } + } + else if (key == "/Columns") + { + QPDFObjectHandle columns_obj = decode_obj.getKey(key); + if (columns_obj.isInteger()) + { + columns = columns_obj.getIntValue(); + } + else + { + filterable = false; + } + } + else + { + filterable = false; + } + } + } + else + { + throw QPDFExc(qpdf->getFilename(), this->offset, + "invalid decode parameters object type for this stream"); + } + + if ((predictor > 1) && (columns == 0)) + { + // invalid + filterable = false; + } + + if (! filterable) + { + return false; + } + + // Check filters + + QPDFObjectHandle filter_obj = this->stream_dict.getKey("/Filter"); + bool filters_okay = true; + + if (filter_obj.isNull()) + { + // No filters + } + else if (filter_obj.isName()) + { + // One filter + filters.push_back(filter_obj.getName()); + } + else if (filter_obj.isArray()) + { + // Potentially multiple filters + int n = filter_obj.getArrayNItems(); + for (int i = 0; i < n; ++i) + { + QPDFObjectHandle item = filter_obj.getArrayItem(i); + if (item.isName()) + { + filters.push_back(item.getName()); + } + else + { + filters_okay = false; + } + } + } + else + { + filters_okay = false; + } + + if (! filters_okay) + { + QTC::TC("qpdf", "QPDF_Stream invalid filter"); + throw QPDFExc(qpdf->getFilename(), this->offset, + "invalid filter object type for this stream"); + } + + // `filters' now contains a list of filters to be applied in + // order. See which ones we can support. + + for (std::vector::iterator iter = filters.begin(); + iter != filters.end(); ++iter) + { + std::string const& filter = *iter; + if (! ((filter == "/FlateDecode") || + (filter == "/LZWDecode") || + (filter == "/ASCII85Decode") || + (filter == "/ASCIIHexDecode"))) + { + filterable = false; + } + } + + return filterable; +} + +bool +QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool filter, + bool normalize, bool compress) +{ + std::vector filters; + int predictor = 1; + int columns = 0; + bool early_code_change = true; + if (filter) + { + filter = filterable(filters, predictor, columns, early_code_change); + } + + if (pipeline == 0) + { + QTC::TC("qpdf", "QPDF_Stream pipeStreamData with null pipeline"); + return filter; + } + + // Construct the pipeline in reverse order. Force pipelines we + // create to be deleted when this function finishes. + std::vector > to_delete; + + if (filter) + { + if (compress) + { + pipeline = new Pl_Flate("compress object stream", pipeline, + Pl_Flate::a_deflate); + to_delete.push_back(pipeline); + } + + if (normalize) + { + pipeline = new Pl_QPDFTokenizer("normalizer", pipeline); + to_delete.push_back(pipeline); + } + + for (std::vector::reverse_iterator iter = filters.rbegin(); + iter != filters.rend(); ++iter) + { + std::string const& filter = *iter; + if (filter == "/FlateDecode") + { + if (predictor == 12) + { + QTC::TC("qpdf", "QPDF_Stream PNG filter"); + pipeline = new Pl_PNGFilter( + "png decode", pipeline, Pl_PNGFilter::a_decode, + columns, 0 /* not used */); + to_delete.push_back(pipeline); + } + + pipeline = new Pl_Flate("stream inflate", + pipeline, Pl_Flate::a_inflate); + to_delete.push_back(pipeline); + } + else if (filter == "/ASCII85Decode") + { + pipeline = new Pl_ASCII85Decoder("ascii85 decode", pipeline); + to_delete.push_back(pipeline); + } + else if (filter == "/ASCIIHexDecode") + { + pipeline = new Pl_ASCIIHexDecoder("asciiHex decode", pipeline); + to_delete.push_back(pipeline); + } + else if (filter == "/LZWDecode") + { + pipeline = new Pl_LZWDecoder("lzw decode", pipeline, + early_code_change); + to_delete.push_back(pipeline); + } + else + { + throw QEXC::Internal("QPDFStream: unknown filter " + "encountered after check"); + } + } + } + + QPDF::Pipe::pipeStreamData(this->qpdf, this->objid, this->generation, + this->offset, this->length, + this->stream_dict, pipeline); + + return filter; +} diff --git a/libqpdf/QPDF_String.cc b/libqpdf/QPDF_String.cc new file mode 100644 index 00000000..cc8ca042 --- /dev/null +++ b/libqpdf/QPDF_String.cc @@ -0,0 +1,178 @@ + +#include + +#include +// DO NOT USE ctype -- it is locale dependent for some things, and +// it's not worth the risk of including it in case it may accidentally +// be used. +#include + +// See above about ctype. +static bool is_iso_latin1_printable(unsigned char ch) +{ + return (((ch >= 32) && (ch <= 126)) || (ch >= 160)); +} + +QPDF_String::QPDF_String(std::string const& val) : + val(val) +{ +} + +QPDF_String::~QPDF_String() +{ +} + +std::string +QPDF_String::unparse() +{ + return unparse(false); +} + +std::string +QPDF_String::unparse(bool force_binary) +{ + bool use_hexstring = force_binary; + if (! use_hexstring) + { + unsigned int nonprintable = 0; + int consecutive_printable = 0; + for (unsigned int i = 0; i < this->val.length(); ++i) + { + char ch = this->val[i]; + // Note: do not use locale to determine printability. The PDF + // specification accepts arbitrary binary data. Some locales + // imply multibyte characters. We'll consider something + // printable if it is printable in ISO-Latin-1. We'll code + // this manually rather than being rude and setting locale. + if ((ch == 0) || (! (is_iso_latin1_printable(ch) || + strchr("\n\r\t\b\f", ch)))) + { + ++nonprintable; + consecutive_printable = 0; + } + else + { + if (++consecutive_printable > 5) + { + // If there are more than 5 consecutive printable + // characters, I want to see them as such. + nonprintable = 0; + break; + } + } + } + + // Use hex notation if more than 20% of the characters are not + // printable in the current locale. Uniformly distributed random + // characters will not pass this test even with ISO-Latin-1 in + // which 76% are either printable or in the set of standard + // escaped characters. + if (5 * nonprintable > val.length()) + { + use_hexstring = true; + } + } + std::string result; + if (use_hexstring) + { + result += "<"; + char num[3]; + for (unsigned int i = 0; i < this->val.length(); ++i) + { + sprintf(num, "%02x", (unsigned char) this->val[i]); + result += num; + } + result += ">"; + } + else + { + result += "("; + char num[5]; + for (unsigned int i = 0; i < this->val.length(); ++i) + { + char ch = this->val[i]; + switch (ch) + { + case '\n': + result += "\\n"; + break; + + case '\r': + result += "\\r"; + break; + + case '\t': + result += "\\t"; + break; + + case '\b': + result += "\\b"; + break; + + case '\f': + result += "\\f"; + break; + + case '(': + result += "\\("; + break; + + case ')': + result += "\\)"; + break; + + case '\\': + result += "\\\\"; + break; + + default: + if (is_iso_latin1_printable(ch)) + { + result += this->val[i]; + } + else + { + sprintf(num, "\\%03o", (unsigned char)ch); + result += num; + } + break; + } + } + result += ")"; + } + + return result; +} + +std::string +QPDF_String::getVal() const +{ + return this->val; +} + +std::string +QPDF_String::getUTF8Val() const +{ + std::string result; + unsigned int len = this->val.length(); + if ((len >= 2) && (len % 2 == 0) && + (this->val[0] == '\xfe') && (this->val[1] == '\xff')) + { + // This is a Unicode string using big-endian UTF-16. This + // code is not actually correct as it doesn't properly handle + // characters past 0xffff. + for (unsigned int i = 2; i < len; i += 2) + { + result += QUtil::toUTF8(((unsigned char) this->val[i] << 8) + + ((unsigned char) this->val[i+1])); + } + } + else + { + for (unsigned int i = 0; i < len; ++i) + { + result += QUtil::toUTF8((unsigned char) this->val[i]); + } + } + return result; +} diff --git a/libqpdf/QPDF_encryption.cc b/libqpdf/QPDF_encryption.cc new file mode 100644 index 00000000..e5e2d8be --- /dev/null +++ b/libqpdf/QPDF_encryption.cc @@ -0,0 +1,441 @@ +// This file implements methods from the QPDF class that involve +// encryption. + +#include + +#include + +#include +#include +#include +#include + +static char const padding_string[] = { + 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, + 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, + 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, + 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a +}; + +static unsigned int const O_key_bytes = sizeof(MD5::Digest); +static unsigned int const id_bytes = 16; +static unsigned int const key_bytes = 32; + +void +pad_or_truncate_password(std::string const& password, char k1[key_bytes]) +{ + int password_bytes = std::min(key_bytes, password.length()); + int pad_bytes = key_bytes - password_bytes; + memcpy(k1, password.c_str(), password_bytes); + memcpy(k1 + password_bytes, padding_string, pad_bytes); +} + +void +QPDF::trim_user_password(std::string& user_password) +{ + // Although unnecessary, this routine trims the padding string + // from the end of a user password. Its only purpose is for + // recovery of user passwords which is done in the test suite. + char const* cstr = user_password.c_str(); + size_t len = user_password.length(); + if (len < key_bytes) + { + return; + } + + char* p = 0; + while ((p = strchr(cstr, '\x28')) != 0) + { + if (memcmp(p, padding_string, len - (p - cstr)) == 0) + { + user_password = user_password.substr(0, p - cstr); + return; + } + } +} + +static std::string +pad_or_truncate_password(std::string const& password) +{ + char k1[key_bytes]; + pad_or_truncate_password(password, k1); + return std::string(k1, key_bytes); +} + +static void +iterate_md5_digest(MD5& md5, MD5::Digest& digest, int iterations) +{ + md5.digest(digest); + + for (int i = 0; i < iterations; ++i) + { + MD5 m; + m.encodeDataIncrementally((char*)digest, sizeof(digest)); + m.digest(digest); + } +} + + +static void +iterate_rc4(unsigned char* data, int data_len, + unsigned char* okey, int key_len, + int iterations, bool reverse) +{ + unsigned char* key = new unsigned char[key_len]; + for (int i = 0; i < iterations; ++i) + { + int const xor_value = (reverse ? iterations - 1 - i : i); + for (int j = 0; j < key_len; ++j) + { + key[j] = okey[j] ^ xor_value; + } + RC4 rc4(key, key_len); + rc4.process(data, data_len); + } + delete [] key; +} + +std::string +QPDF::compute_data_key(std::string const& encryption_key, + int objid, int generation) +{ + // Algorithm 3.1 from the PDF 1.4 Reference Manual + + std::string result = encryption_key; + + // Append low three bytes of object ID and low two bytes of generation + result += (char) (objid & 0xff); + result += (char) ((objid >> 8) & 0xff); + result += (char) ((objid >> 16) & 0xff); + result += (char) (generation & 0xff); + result += (char) ((generation >> 8) & 0xff); + + MD5 md5; + md5.encodeDataIncrementally(result.c_str(), result.length()); + MD5::Digest digest; + md5.digest(digest); + return std::string((char*) digest, + std::min(result.length(), (size_t) 16)); +} + +std::string +QPDF::compute_encryption_key( + std::string const& password, EncryptionData const& data) +{ + // Algorithm 3.2 from the PDF 1.4 Reference Manual + + MD5 md5; + md5.encodeDataIncrementally( + pad_or_truncate_password(password).c_str(), key_bytes); + md5.encodeDataIncrementally(data.O.c_str(), key_bytes); + char pbytes[4]; + pbytes[0] = (char) (data.P & 0xff); + pbytes[1] = (char) ((data.P >> 8) & 0xff); + pbytes[2] = (char) ((data.P >> 16) & 0xff); + pbytes[3] = (char) ((data.P >> 24) & 0xff); + md5.encodeDataIncrementally(pbytes, 4); + md5.encodeDataIncrementally(data.id1.c_str(), id_bytes); + MD5::Digest digest; + iterate_md5_digest(md5, digest, ((data.R == 3) ? 50 : 0)); + return std::string((char*)digest, data.Length_bytes); +} + +static void +compute_O_rc4_key(std::string const& user_password, + std::string const& owner_password, + QPDF::EncryptionData const& data, + unsigned char key[O_key_bytes]) +{ + std::string password = owner_password; + if (password.empty()) + { + password = user_password; + } + MD5 md5; + md5.encodeDataIncrementally( + pad_or_truncate_password(password).c_str(), key_bytes); + MD5::Digest digest; + iterate_md5_digest(md5, digest, ((data.R == 3) ? 50 : 0)); + memcpy(key, digest, O_key_bytes); +} + +static std::string +compute_O_value(std::string const& user_password, + std::string const& owner_password, + QPDF::EncryptionData const& data) +{ + // Algorithm 3.3 from the PDF 1.4 Reference Manual + + unsigned char O_key[O_key_bytes]; + compute_O_rc4_key(user_password, owner_password, data, O_key); + + char upass[key_bytes]; + pad_or_truncate_password(user_password, upass); + iterate_rc4((unsigned char*) upass, key_bytes, + O_key, data.Length_bytes, (data.R == 3) ? 20 : 1, false); + return std::string(upass, key_bytes); +} + +static +std::string +compute_U_value_R2(std::string const& user_password, + QPDF::EncryptionData const& data) +{ + // Algorithm 3.4 from the PDF 1.4 Reference Manual + + std::string k1 = QPDF::compute_encryption_key(user_password, data); + char udata[key_bytes]; + pad_or_truncate_password("", udata); + iterate_rc4((unsigned char*) udata, key_bytes, + (unsigned char*)k1.c_str(), data.Length_bytes, 1, false); + return std::string(udata, key_bytes); +} + +static +std::string +compute_U_value_R3(std::string const& user_password, + QPDF::EncryptionData const& data) +{ + // Algorithm 3.5 from the PDF 1.4 Reference Manual + + std::string k1 = QPDF::compute_encryption_key(user_password, data); + MD5 md5; + md5.encodeDataIncrementally( + pad_or_truncate_password("").c_str(), key_bytes); + md5.encodeDataIncrementally(data.id1.c_str(), data.id1.length()); + MD5::Digest digest; + md5.digest(digest); + iterate_rc4(digest, sizeof(MD5::Digest), + (unsigned char*) k1.c_str(), data.Length_bytes, 20, false); + char result[key_bytes]; + memcpy(result, digest, sizeof(MD5::Digest)); + // pad with arbitrary data -- make it consistent for the sake of + // testing + for (unsigned int i = sizeof(MD5::Digest); i < key_bytes; ++i) + { + result[i] = (char)((i * i) % 0xff); + } + return std::string(result, key_bytes); +} + +static std::string +compute_U_value(std::string const& user_password, + QPDF::EncryptionData const& data) +{ + if (data.R == 3) + { + return compute_U_value_R3(user_password, data); + } + + return compute_U_value_R2(user_password, data); +} + +static bool +check_user_password(std::string const& user_password, + QPDF::EncryptionData const& data) +{ + // Algorithm 3.6 from the PDF 1.4 Reference Manual + + std::string u_value = compute_U_value(user_password, data); + int to_compare = ((data.R == 3) ? sizeof(MD5::Digest) : key_bytes); + return (memcmp(data.U.c_str(), u_value.c_str(), to_compare) == 0); +} + +static bool +check_owner_password(std::string& user_password, + std::string const& owner_password, + QPDF::EncryptionData const& data) +{ + // Algorithm 3.7 from the PDF 1.4 Reference Manual + + unsigned char key[O_key_bytes]; + compute_O_rc4_key(user_password, owner_password, data, key); + unsigned char O_data[key_bytes]; + memcpy(O_data, (unsigned char*) data.O.c_str(), key_bytes); + iterate_rc4(O_data, key_bytes, key, data.Length_bytes, + (data.R == 3) ? 20 : 1, true); + std::string new_user_password = + std::string((char*)O_data, key_bytes); + bool result = false; + if (check_user_password(new_user_password, data)) + { + result = true; + user_password = new_user_password; + } + return result; +} + +void +QPDF::initializeEncryption() +{ + if (this->encryption_initialized) + { + return; + } + this->encryption_initialized = true; + + // After we initialize encryption parameters, we must used stored + // key information and never look at /Encrypt again. Otherwise, + // things could go wrong if someone mutates the encryption + // dictionary. + + if (! this->trailer.hasKey("/Encrypt")) + { + return; + } + + QPDFObjectHandle id_obj = this->trailer.getKey("/ID"); + if (! (id_obj.isArray() && + (id_obj.getArrayNItems() == 2) && + id_obj.getArrayItem(0).isString())) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "invalid /ID in trailer dictionary"); + } + + std::string id1 = id_obj.getArrayItem(0).getStringValue(); + if (id1.length() != id_bytes) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "first /ID string in trailer dictionary has " + "incorrect length"); + } + + QPDFObjectHandle encryption_dict = this->trailer.getKey("/Encrypt"); + if (! encryption_dict.isDictionary()) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "/Encrypt in trailer dictionary is not a dictionary"); + } + + if (! (encryption_dict.getKey("/Filter").isName() && + (encryption_dict.getKey("/Filter").getName() == "/Standard"))) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "unsupported encryption filter"); + } + + if (! (encryption_dict.getKey("/V").isInteger() && + encryption_dict.getKey("/R").isInteger() && + encryption_dict.getKey("/O").isString() && + encryption_dict.getKey("/U").isString() && + encryption_dict.getKey("/P").isInteger())) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "some encryption dictionary parameters are missing " + "or the wrong type"); + } + + int V = encryption_dict.getKey("/V").getIntValue(); + int R = encryption_dict.getKey("/R").getIntValue(); + std::string O = encryption_dict.getKey("/O").getStringValue(); + std::string U = encryption_dict.getKey("/U").getStringValue(); + unsigned int P = (unsigned int) encryption_dict.getKey("/P").getIntValue(); + + if (! (((R == 2) || (R == 3)) && + ((V == 1) || (V == 2)))) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "Unsupported /R or /V in encryption dictionary"); + } + + if (! ((O.length() == key_bytes) && (U.length() == key_bytes))) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "incorrect length for /O and/or /P in " + "encryption dictionary"); + } + + int Length = 40; + if (encryption_dict.getKey("/Length").isInteger()) + { + Length = encryption_dict.getKey("/Length").getIntValue(); + if ((Length % 8) || (Length < 40) || (Length > 128)) + { + throw QPDFExc(this->file.getName(), this->file.getLastOffset(), + "invalid /Length value in encryption dictionary"); + } + } + + EncryptionData data(V, R, Length / 8, P, O, U, id1); + if (check_owner_password(this->user_password, this->provided_password, data)) + { + // password supplied was owner password; user_password has + // been initialized + } + else if (check_user_password(this->provided_password, data)) + { + this->user_password = this->provided_password; + } + else + { + throw QPDFExc(this->file.getName() + ": invalid password"); + } + + this->encrypted = true; + this->encryption_key = compute_encryption_key(this->user_password, data); +} + +std::string +QPDF::getKeyForObject(int objid, int generation) +{ + if (! this->encrypted) + { + throw QEXC::Internal("request for encryption key in non-encrypted PDF"); + } + + if (! ((objid == this->cached_key_objid) && + (generation == this->cached_key_generation))) + { + this->cached_object_encryption_key = + compute_data_key(this->encryption_key, objid, generation); + this->cached_key_objid = objid; + this->cached_key_generation = generation; + } + + return this->cached_object_encryption_key; +} + +void +QPDF::decryptString(std::string& str, int objid, int generation) +{ + if (objid == 0) + { + return; + } + std::string key = getKeyForObject(objid, generation); + char* tmp = QUtil::copy_string(str); + unsigned int vlen = str.length(); + RC4 rc4((unsigned char const*)key.c_str(), key.length()); + rc4.process((unsigned char*)tmp, vlen); + str = std::string(tmp, vlen); + delete [] tmp; +} + +void +QPDF::decryptStream(Pipeline*& pipeline, int objid, int generation, + std::vector >& heap) +{ + std::string key = getKeyForObject(objid, generation); + pipeline = new Pl_RC4("stream decryption", pipeline, + (unsigned char*) key.c_str(), key.length()); + heap.push_back(pipeline); +} + +void +QPDF::compute_encryption_O_U( + char const* user_password, char const* owner_password, + int V, int R, int key_len, unsigned long P, + std::string const& id1, std::string& O, std::string& U) +{ + EncryptionData data(V, R, key_len, P, "", "", id1); + data.O = compute_O_value(user_password, owner_password, data); + O = data.O; + U = compute_U_value(user_password, data); +} + +std::string const& +QPDF::getUserPassword() const +{ + return this->user_password; +} diff --git a/libqpdf/QPDF_linearization.cc b/libqpdf/QPDF_linearization.cc new file mode 100644 index 00000000..6c0cf3be --- /dev/null +++ b/libqpdf/QPDF_linearization.cc @@ -0,0 +1,2103 @@ +// See doc/linearization. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +template +static void +load_vector_int(BitStream& bit_stream, int nitems, std::vector& vec, + int bits_wanted, int T::*field) +{ + // nitems times, read bits_wanted from the given bit stream, + // storing results in the ith vector entry. + + for (int i = 0; i < nitems; ++i) + { + vec[i].*field = bit_stream.getBits(bits_wanted); + } + // The PDF spec says that each hint table starts at a byte + // boundary. Each "row" actually must start on a byte boundary. + bit_stream.skipToNextByte(); +} + +template +static void +load_vector_vector(BitStream& bit_stream, + int nitems1, std::vector& vec1, int T::*nitems2, + int bits_wanted, std::vector T::*vec2) +{ + // nitems1 times, read nitems2 (from the ith element of vec1) items + // into the vec2 vector field of the ith item of vec1. + for (int i1 = 0; i1 < nitems1; ++i1) + { + for (int i2 = 0; i2 < vec1[i1].*nitems2; ++i2) + { + (vec1[i1].*vec2).push_back(bit_stream.getBits(bits_wanted)); + } + } + bit_stream.skipToNextByte(); +} + +bool +QPDF::checkLinearization() +{ + bool result = false; + try + { + readLinearizationData(); + result = checkLinearizationInternal(); + } + catch (QPDFExc& e) + { + std::cout << e.what() << std::endl; + } + return result; +} + +bool +QPDF::isLinearized() +{ + // If the first object in the file is a dictionary with a suitable + // /Linearized key and has an /L key that accurately indicates the + // file size, initialize this->lindict and return true. + + // A linearized PDF spec's first object will be contained within + // the first 1024 bytes of the file and will be a dictionary with + // a valid /Linearized key. This routine looks for that and does + // no additional validation. + + // The PDF spec says the linearization dictionary must be + // completely contained within the first 1024 bytes of the file. + // Add a byte for a null terminator. + static int const tbuf_size = 1025; + + char* buf = new char[tbuf_size]; + this->file.seek(0, SEEK_SET); + PointerHolder b(buf); // guarantee deletion + memset(buf, '\0', tbuf_size); + this->file.read(buf, tbuf_size - 1); + + static PCRE lindict_re("(?s:(\\d+)\\s+0\\s+obj\\s*<<)"); + + off_t offset = -1; + int lindict_obj = 0; + char* p = buf; + while (lindict_obj == 0) + { + PCRE::Match m(lindict_re.match(p)); + if (m) + { + offset = m.getOffset(0) + (p - buf); + lindict_obj = atoi(m.getMatch(1).c_str()); + if (m.getMatch(0).find('\n') != std::string::npos) + { + QTC::TC("qpdf", "QPDF lindict found newline"); + } + } + else + { + if ((p = (char*)memchr(p, '\0', tbuf_size - (p - buf))) != 0) + { + QTC::TC("qpdf", "QPDF lindict null found"); + while ((p - buf < tbuf_size) && (*p == 0)) + { + ++p; + } + if ((p - buf) == tbuf_size) + { + break; + } + QTC::TC("qpdf", "QPDF lindict searching after null"); + } + } + } + + if (lindict_obj == 0) + { + return false; + } + + QPDFObjectHandle candidate = QPDFObjectHandle::Factory::newIndirect( + this, lindict_obj, 0); + if (! candidate.isDictionary()) + { + return false; + } + + QPDFObjectHandle linkey = candidate.getKey("/Linearized"); + if (! (linkey.isNumber() && ((int)floor(linkey.getNumericValue()) == 1))) + { + return false; + } + + QPDFObjectHandle L = candidate.getKey("/L"); + if (L.isInteger()) + { + int Li = L.getIntValue(); + this->file.seek(0, SEEK_END); + if (Li != this->file.tell()) + { + QTC::TC("qpdf", "QPDF /L mismatch"); + return false; + } + else + { + this->linp.file_size = Li; + } + } + + this->lindict = candidate; + + return true; +} + +void +QPDF::readLinearizationData() +{ + // This function throws an exception (which is trapped by + // checkLinearization()) for any errors that prevent loading. + + // Hint table parsing code needs at least 32 bits in a long. + assert(sizeof(long) >= 4); + + if (! isLinearized()) + { + throw QPDFExc(this->file.getName() + " is not linearized"); + } + + // /L is read and stored in linp by isLinearized() + QPDFObjectHandle H = lindict.getKey("/H"); + QPDFObjectHandle O = lindict.getKey("/O"); + QPDFObjectHandle E = lindict.getKey("/E"); + QPDFObjectHandle N = lindict.getKey("/N"); + QPDFObjectHandle T = lindict.getKey("/T"); + QPDFObjectHandle P = lindict.getKey("/P"); + + if (! (H.isArray() && + O.isInteger() && + E.isInteger() && + N.isInteger() && + T.isInteger() && + (P.isInteger() || P.isNull()))) + { + throw QPDFExc("some keys in linearization dictionary are of " + "the wrong type"); + } + + // Hint table array: offset length [ offset length ] + unsigned int n_H_items = H.getArrayNItems(); + if (! ((n_H_items == 2) || (n_H_items == 4))) + { + throw QPDFExc("H has the wrong number of items"); + } + + std::vector H_items; + for (unsigned int i = 0; i < n_H_items; ++i) + { + QPDFObjectHandle oh(H.getArrayItem(i)); + if (oh.isInteger()) + { + H_items.push_back(oh.getIntValue()); + } + else + { + throw QPDFExc("some H items are of the wrong type"); + } + } + + // H: hint table offset/length for primary and overflow hint tables + int H0_offset = H_items[0]; + int H0_length = H_items[1]; + int H1_offset = 0; + int H1_length = 0; + if (H_items.size() == 4) + { + // Acrobat doesn't read or write these (as PDF 1.4), so we + // don't have a way to generate a test case. + // QTC::TC("qpdf", "QPDF overflow hint table"); + H1_offset = H_items[2]; + H1_length = H_items[3]; + } + + // P: first page number + int first_page = 0; + if (P.isInteger()) + { + QTC::TC("qpdf", "QPDF P present in lindict"); + first_page = P.getIntValue(); + } + else + { + QTC::TC("qpdf", "QPDF P absent in lindict"); + } + + // Store linearization parameter data + + // file_size initialized by isLinearized() + this->linp.first_page_object = O.getIntValue(); + this->linp.first_page_end = E.getIntValue(); + this->linp.npages = N.getIntValue(); + this->linp.xref_zero_offset = T.getIntValue(); + this->linp.first_page = first_page; + this->linp.H_offset = H0_offset; + this->linp.H_length = H0_length; + + // Read hint streams + + Pl_Buffer pb("hint buffer"); + QPDFObjectHandle H0 = readHintStream(pb, H0_offset, H0_length); + if (H1_offset) + { + (void) readHintStream(pb, H1_offset, H1_length); + } + + // PDF 1.4 hint tables that we ignore: + + // /T thumbnail + // /A thread information + // /E named destination + // /V interactive form + // /I information dictionary + // /C logical structure + // /L page label + + // Individual hint table offsets + QPDFObjectHandle HS = H0.getKey("/S"); // shared object + QPDFObjectHandle HO = H0.getKey("/O"); // outline + + PointerHolder hbp = pb.getBuffer(); + Buffer* hb = hbp.getPointer(); + unsigned char const* h_buf = hb->getBuffer(); + int h_size = hb->getSize(); + + readHPageOffset(BitStream(h_buf, h_size)); + + int HSi = HS.getIntValue(); + readHSharedObject(BitStream(h_buf + HSi, h_size - HSi)); + + if (HO.isInteger()) + { + int HOi = HO.getIntValue(); + readHGeneric(BitStream(h_buf + HOi, h_size - HOi), + this->outline_hints); + } +} + +QPDFObjectHandle +QPDF::readHintStream(Pipeline& pl, off_t offset, size_t length) +{ + int obj; + int gen; + QPDFObjectHandle H = readObjectAtOffset(offset, 0, 0, obj, gen); + ObjCache& oc = this->obj_cache[ObjGen(obj, gen)]; + off_t min_end_offset = oc.end_before_space; + off_t max_end_offset = oc.end_after_space; + if (! H.isStream()) + { + throw QPDFExc("hint table is not a stream"); + } + + QPDFObjectHandle Hdict = H.getDict(); + + // Some versions of Acrobat make /Length indirect and place it + // immediately after the stream, increasing length to cover it, + // even though the specification says all objects in the + // linearization parameter dictionary must be direct. We have to + // get the file position of the end of length in this case. + QPDFObjectHandle length_obj = Hdict.getKey("/Length"); + if (length_obj.isIndirect()) + { + QTC::TC("qpdf", "QPDF hint table length indirect"); + // Force resolution + (void) length_obj.getIntValue(); + ObjCache& oc = this->obj_cache + [ObjGen(length_obj.getObjectID(), + length_obj.getGeneration())]; + min_end_offset = oc.end_before_space; + max_end_offset = oc.end_after_space; + } + else + { + QTC::TC("qpdf", "QPDF hint table length direct"); + } + off_t computed_end = offset + length; + if ((computed_end < min_end_offset) || + (computed_end > max_end_offset)) + { + std::cout << "expected = " << computed_end + << "; actual = " << min_end_offset << ".." + << max_end_offset << std::endl; + throw QPDFExc("hint table length mismatch"); + } + H.pipeStreamData(&pl, true, false, false); + return Hdict; +} + +void +QPDF::readHPageOffset(BitStream h) +{ + // All comments referring to the PDF spec refer to the spec for + // version 1.4. + + HPageOffset& t = this->page_offset_hints; + + t.min_nobjects = h.getBits(32); // 1 + t.first_page_offset = h.getBits(32); // 2 + t.nbits_delta_nobjects = h.getBits(16); // 3 + t.min_page_length = h.getBits(32); // 4 + t.nbits_delta_page_length = h.getBits(16); // 5 + t.min_content_offset = h.getBits(32); // 6 + t.nbits_delta_content_offset = h.getBits(16); // 7 + t.min_content_length = h.getBits(32); // 8 + t.nbits_delta_content_length = h.getBits(16); // 9 + t.nbits_nshared_objects = h.getBits(16); // 10 + t.nbits_shared_identifier = h.getBits(16); // 11 + t.nbits_shared_numerator = h.getBits(16); // 12 + t.shared_denominator = h.getBits(16); // 13 + + unsigned int nitems = this->linp.npages; + std::vector& entries = t.entries; + entries = std::vector(nitems); + + load_vector_int(h, nitems, entries, + t.nbits_delta_nobjects, + &HPageOffsetEntry::delta_nobjects); + load_vector_int(h, nitems, entries, + t.nbits_delta_page_length, + &HPageOffsetEntry::delta_page_length); + load_vector_int(h, nitems, entries, + t.nbits_nshared_objects, + &HPageOffsetEntry::nshared_objects); + load_vector_vector(h, nitems, entries, + &HPageOffsetEntry::nshared_objects, + t.nbits_shared_identifier, + &HPageOffsetEntry::shared_identifiers); + load_vector_vector(h, nitems, entries, + &HPageOffsetEntry::nshared_objects, + t.nbits_shared_numerator, + &HPageOffsetEntry::shared_numerators); + load_vector_int(h, nitems, entries, + t.nbits_delta_content_offset, + &HPageOffsetEntry::delta_content_offset); + load_vector_int(h, nitems, entries, + t.nbits_delta_content_length, + &HPageOffsetEntry::delta_content_length); +} + +void +QPDF::readHSharedObject(BitStream h) +{ + HSharedObject& t = this->shared_object_hints; + + t.first_shared_obj = h.getBits(32); // 1 + t.first_shared_offset = h.getBits(32); // 2 + t.nshared_first_page = h.getBits(32); // 3 + t.nshared_total = h.getBits(32); // 4 + t.nbits_nobjects = h.getBits(16); // 5 + t.min_group_length = h.getBits(32); // 6 + t.nbits_delta_group_length = h.getBits(16); // 7 + + QTC::TC("qpdf", "QPDF lin nshared_total > nshared_first_page", + (t.nshared_total > t.nshared_first_page) ? 1 : 0); + + int nitems = t.nshared_total; + std::vector& entries = t.entries; + entries = std::vector(nitems); + + load_vector_int(h, nitems, entries, + t.nbits_delta_group_length, + &HSharedObjectEntry::delta_group_length); + load_vector_int(h, nitems, entries, + 1, &HSharedObjectEntry::signature_present); + for (int i = 0; i < nitems; ++i) + { + if (entries[i].signature_present) + { + // Skip 128-bit MD5 hash. These are not supported by + // acrobat, so they should probably never be there. We + // have no test case for this. + for (int j = 0; j < 4; ++j) + { + (void) h.getBits(32); + } + } + } + load_vector_int(h, nitems, entries, + t.nbits_nobjects, + &HSharedObjectEntry::nobjects_minus_one); +} + +void +QPDF::readHGeneric(BitStream h, HGeneric& t) +{ + t.first_object = h.getBits(32); // 1 + t.first_object_offset = h.getBits(32); // 2 + t.nobjects = h.getBits(32); // 3 + t.group_length = h.getBits(32); // 4 +} + +bool +QPDF::checkLinearizationInternal() +{ + // All comments referring to the PDF spec refer to the spec for + // version 1.4. + + std::list errors; + std::list warnings; + + // Check all values in linearization parameter dictionary + + LinParameters& p = this->linp; + + // L: file size in bytes -- checked by isLinearized + + // O: object number of first page + std::vector const& pages = getAllPages(); + if (p.first_page_object != pages[0].getObjectID()) + { + QTC::TC("qpdf", "QPDF err /O mismatch"); + errors.push_back("first page object (/O) mismatch"); + } + + // N: number of pages + int npages = pages.size(); + if (p.npages != npages) + { + // Not tested in the test suite + errors.push_back("page count (/N) mismatch"); + } + + for (int i = 0; i < npages; ++i) + { + QPDFObjectHandle const& page = pages[i]; + ObjGen og(page.getObjectID(), page.getGeneration()); + if (this->xref_table[og].getType() == 2) + { + errors.push_back("page dictionary for page " + + QUtil::int_to_string(i) + " is compressed"); + } + } + + // T: offset of whitespace character preceding xref entry for object 0 + this->file.seek(p.xref_zero_offset, SEEK_SET); + while (1) + { + char ch; + this->file.read(&ch, 1); + if (! ((ch == ' ') || (ch == '\r') || (ch == '\n'))) + { + this->file.seek(-1, SEEK_CUR); + break; + } + } + if (this->file.tell() != this->first_xref_item_offset) + { + QTC::TC("qpdf", "QPDF err /T mismatch"); + errors.push_back("space before first xref item (/T) mismatch " + "(computed = " + + QUtil::int_to_string(this->first_xref_item_offset) + + "; file = " + QUtil::int_to_string(this->file.tell())); + } + + // P: first page number -- Implementation note 124 says Acrobat + // ignores this value, so we will too. + + // Check numbering of compressed objects in each xref section. + // For linearized files, all compressed objects are supposed to be + // at the end of the containing xref section if any object streams + // are in use. + + if (this->uncompressed_after_compressed) + { + errors.push_back("linearized file contains an uncompressed object" + " after a compressed one in a cross-reference stream"); + } + + // Further checking requires optimization and order calculation. + // Don't allow optimization to make changes. If it has to, then + // the file is not properly linearized. We use the xref table to + // figure out which objects are compressed and which are + // uncompressed. + { // local scope + std::map object_stream_data; + for (std::map::const_iterator iter = + this->xref_table.begin(); + iter != this->xref_table.end(); ++iter) + { + ObjGen const& og = (*iter).first; + QPDFXRefEntry const& entry = (*iter).second; + if (entry.getType() == 2) + { + object_stream_data[og.obj] = entry.getObjStreamNumber(); + } + } + optimize(object_stream_data, false); + calculateLinearizationData(object_stream_data); + } + + // E: offset of end of first page -- Implementation note 123 says + // Acrobat includes on extra object here by mistake. pdlin fails + // to place thumbnail images in section 9, so when thumbnails are + // present, it also gets the wrong value for /E. It also doesn't + // count outlines here when it should even though it places them + // in part 6. This code fails to put thread information + // dictionaries in part 9, so it actually gets the wrong value for + // E when threads are present. In that case, it would probably + // agree with pdlin. As of this writing, the test suite doesn't + // contain any files with threads. + + assert(! this->part6.empty()); + int min_E = -1; + int max_E = -1; + for (std::vector::iterator iter = this->part6.begin(); + iter != this->part6.end(); ++iter) + { + ObjGen og((*iter).getObjectID(), (*iter).getGeneration()); + // All objects have to have been dereferenced to be classified. + assert(this->obj_cache.count(og) > 0); + ObjCache const& oc = this->obj_cache[og]; + min_E = std::max(min_E, (int)oc.end_before_space); + max_E = std::max(max_E, (int)oc.end_after_space); + } + if ((p.first_page_end < min_E) || (p.first_page_end > max_E)) + { + QTC::TC("qpdf", "QPDF warn /E mismatch"); + warnings.push_back("end of first page section (/E) mismatch: /E = " + + QUtil::int_to_string(p.first_page_end) + + "; computed = " + + QUtil::int_to_string(min_E) + ".." + + QUtil::int_to_string(max_E)); + } + + // Check hint tables + + std::map shared_idx_to_obj; + checkHSharedObject(errors, warnings, pages, shared_idx_to_obj); + checkHPageOffset(errors, warnings, pages, shared_idx_to_obj); + checkHOutlines(warnings); + + // Report errors + + bool result = true; + + if (! errors.empty()) + { + result = false; + for (std::list::iterator iter = errors.begin(); + iter != errors.end(); ++iter) + { + std::cout << "ERROR: " << (*iter) << std::endl; + } + } + + if (! warnings.empty()) + { + result = false; + for (std::list::iterator iter = warnings.begin(); + iter != warnings.end(); ++iter) + { + std::cout << "WARNING: " << (*iter) << std::endl; + } + } + + return result; +} + +int +QPDF::maxEnd(ObjUser const& ou) +{ + assert(this->obj_user_to_objects.count(ou) > 0); + std::set const& ogs = this->obj_user_to_objects[ou]; + int end = 0; + for (std::set::iterator iter = ogs.begin(); + iter != ogs.end(); ++iter) + { + ObjGen const& og = *iter; + assert(this->obj_cache.count(og) > 0); + end = std::max( + end, (int)(this->obj_cache[og].end_after_space)); + } + return end; +} + +int +QPDF::getLinearizationOffset(ObjGen const& og) +{ + QPDFXRefEntry entry = this->xref_table[og]; + int result = 0; + switch (entry.getType()) + { + case 1: + result = entry.getOffset(); + break; + + case 2: + // For compressed objects, return the offset of the object + // stream that contains them. + result = getLinearizationOffset(ObjGen(entry.getObjStreamNumber(), 0)); + break; + + default: + throw QPDFExc( + this->file.getName(), 0, + "getLinearizationOffset called for xref entry not of type 1 or 2"); + break; + } + return result; +} + +QPDFObjectHandle +QPDF::getUncompressedObject(QPDFObjectHandle& obj, + std::map const& object_stream_data) +{ + if (obj.isNull() || (object_stream_data.count(obj.getObjectID()) == 0)) + { + return obj; + } + else + { + int repl = (*(object_stream_data.find(obj.getObjectID()))).second; + return objGenToIndirect(ObjGen(repl, 0)); + } +} + +int +QPDF::lengthNextN(int first_object, int n, + std::list& errors) +{ + int length = 0; + for (int i = 0; i < n; ++i) + { + ObjGen og(first_object + i, 0); + if (this->xref_table.count(og) == 0) + { + errors.push_back( + "no xref table entry for " + + QUtil::int_to_string(first_object + i) + " 0"); + } + else + { + assert(this->obj_cache.count(og) > 0); + length += this->obj_cache[og].end_after_space - + getLinearizationOffset(og); + } + } + return length; +} + +void +QPDF::checkHPageOffset(std::list& errors, + std::list& warnings, + std::vector const& pages, + std::map& shared_idx_to_obj) +{ + // Implementation note 126 says Acrobat always sets + // delta_content_offset and delta_content_length in the page + // offset header dictionary to 0. It also states that + // min_content_offset in the per-page information is always 0, + // which is an incorrect value. + + // Implementation note 127 explains that Acrobat always sets item + // 8 (min_content_length) to zero, item 9 + // (nbits_delta_content_length) to the value of item 5 + // (nbits_delta_page_length), and item 7 of each per-page hint + // table (delta_content_length) to item 2 (delta_page_length) of + // that entry. Acrobat ignores these values when reading files. + + // Empirically, it also seems that Acrobat sometimes puts items + // under a page's /Resources dictionary in with shared objects + // even when they are private. + + unsigned int npages = pages.size(); + int table_offset = adjusted_offset( + this->page_offset_hints.first_page_offset); + ObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); + assert(this->xref_table.count(first_page_og) > 0); + int offset = getLinearizationOffset(first_page_og); + if (table_offset != offset) + { + warnings.push_back("first page object offset mismatch"); + } + + for (unsigned int pageno = 0; pageno < npages; ++pageno) + { + ObjGen page_og(pages[pageno].getObjectID(), + pages[pageno].getGeneration()); + int first_object = page_og.obj; + assert(this->xref_table.count(page_og) > 0); + offset = getLinearizationOffset(page_og); + + HPageOffsetEntry& he = this->page_offset_hints.entries[pageno]; + CHPageOffsetEntry& ce = this->c_page_offset_data.entries[pageno]; + int h_nobjects = he.delta_nobjects + + this->page_offset_hints.min_nobjects; + if (h_nobjects != ce.nobjects) + { + // This happens with pdlin when there are thumbnails. + warnings.push_back( + "object count mismatch for page " + + QUtil::int_to_string(pageno) + ": hint table = " + + QUtil::int_to_string(h_nobjects) + "; computed = " + + QUtil::int_to_string(ce.nobjects)); + } + + // Use value for number of objects in hint table rather than + // computed value if there is a discrepancy. + int length = lengthNextN(first_object, h_nobjects, errors); + int h_length = he.delta_page_length + + this->page_offset_hints.min_page_length; + if (length != h_length) + { + // This condition almost certainly indicates a bad hint + // table or a bug in this code. + errors.push_back( + "page length mismatch for page " + + QUtil::int_to_string(pageno) + ": hint table = " + + QUtil::int_to_string(h_length) + "; computed length = " + + QUtil::int_to_string(length) + " (offset = " + + QUtil::int_to_string(offset) + ")"); + } + + offset += h_length; + + // Translate shared object indexes to object numbers. + std::set hint_shared; + std::set computed_shared; + + if ((pageno == 0) && (he.nshared_objects > 0)) + { + // pdlin and Acrobat both do this even though the spec + // states clearly and unambiguously that they should not. + warnings.push_back("page 0 has shared identifier entries"); + } + + for (int i = 0; i < he.nshared_objects; ++i) + { + int idx = he.shared_identifiers[i]; + assert(shared_idx_to_obj.count(idx) > 0); + hint_shared.insert(shared_idx_to_obj[idx]); + } + + for (int i = 0; i < ce.nshared_objects; ++i) + { + int idx = ce.shared_identifiers[i]; + assert(idx < this->c_shared_object_data.nshared_total); + int obj = this->c_shared_object_data.entries[idx].object; + computed_shared.insert(obj); + } + + for (std::set::iterator iter = hint_shared.begin(); + iter != hint_shared.end(); ++iter) + { + if (! computed_shared.count(*iter)) + { + // pdlin puts thumbnails here even though it shouldn't + warnings.push_back( + "page " + QUtil::int_to_string(pageno) + + ": shared object " + QUtil::int_to_string(*iter) + + ": in hint table but not computed list"); + } + } + + for (std::set::iterator iter = computed_shared.begin(); + iter != computed_shared.end(); ++iter) + { + if (! hint_shared.count(*iter)) + { + // Acrobat does not put some things including at least + // built-in fonts and procsets here, at least in some + // cases. + warnings.push_back( + "page " + QUtil::int_to_string(pageno) + + ": shared object " + QUtil::int_to_string(*iter) + + ": in computed list but not hint table"); + } + } + } +} + +void +QPDF::checkHSharedObject(std::list& errors, + std::list& warnings, + std::vector const& pages, + std::map& idx_to_obj) +{ + // Implementation note 125 says shared object groups always + // contain only one object. Implementation note 128 says that + // Acrobat always nbits_nobjects to zero. Implementation note 130 + // says that Acrobat does not support more than one shared object + // per group. These are all consistent. + + // Implementation note 129 states that MD5 signatures are not + // implemented in Acrobat, so signature_present must always be + // zero. + + // Implementation note 131 states that first_shared_obj and + // first_shared_offset have meaningless values for single-page + // files. + + // Empirically, Acrobat and pdlin generate incorrect values for + // these whenever there are no shared objects not referenced by + // the first page (i.e., nshared_total == nshared_first_page). + + HSharedObject& so = this->shared_object_hints; + if (so.nshared_total < so.nshared_first_page) + { + errors.push_back("shared object hint table: ntotal < nfirst_page"); + } + else + { + // The first nshared_first_page objects are consecutive + // objects starting with the first page object. The rest are + // consecutive starting from the first_shared_obj object. + int cur_object = pages[0].getObjectID(); + for (int i = 0; i < so.nshared_total; ++i) + { + if (i == so.nshared_first_page) + { + QTC::TC("qpdf", "QPDF lin check shared past first page"); + if (this->part8.empty()) + { + errors.push_back( + "part 8 is empty but nshared_total > " + "nshared_first_page"); + } + else + { + int obj = this->part8[0].getObjectID(); + if (obj != so.first_shared_obj) + { + errors.push_back( + "first shared object number mismatch: " + "hint table = " + + QUtil::int_to_string(so.first_shared_obj) + + "; computed = " + + QUtil::int_to_string(obj)); + } + } + + cur_object = so.first_shared_obj; + + ObjGen og(cur_object, 0); + assert(this->xref_table.count(og) > 0); + int offset = getLinearizationOffset(og); + int h_offset = adjusted_offset(so.first_shared_offset); + if (offset != h_offset) + { + errors.push_back( + "first shared object offset mismatch: hint table = " + + QUtil::int_to_string(h_offset) + "; computed = " + + QUtil::int_to_string(offset)); + } + } + + idx_to_obj[i] = cur_object; + HSharedObjectEntry& se = so.entries[i]; + int nobjects = se.nobjects_minus_one + 1; + int length = lengthNextN(cur_object, nobjects, errors); + int h_length = so.min_group_length + se.delta_group_length; + if (length != h_length) + { + errors.push_back( + "shared object " + QUtil::int_to_string(i) + + " length mismatch: hint table = " + + QUtil::int_to_string(h_length) + "; computed = " + + QUtil::int_to_string(length)); + } + cur_object += nobjects; + } + } +} + +void +QPDF::checkHOutlines(std::list& warnings) +{ + // Empirically, Acrobat generates the correct value for the object + // number but incorrectly stores the next object number's offset + // as the offset, at least when outlines appear in part 6. It + // also generates an incorrect value for length (specifically, the + // length that would cover the correct number of objects from the + // wrong starting place). pdlin appears to generate correct + // values in those cases. + + if (this->c_outline_data.nobjects == this->outline_hints.nobjects) + { + if (this->c_outline_data.nobjects == 0) + { + return; + } + + if (this->c_outline_data.first_object == + this->outline_hints.first_object) + { + // Check length and offset. Acrobat gets these wrong. + QPDFObjectHandle outlines = getRoot().getKey("/Outlines"); + ObjGen og(outlines.getObjectID(), outlines.getGeneration()); + assert(this->xref_table.count(og) > 0); + int offset = getLinearizationOffset(og); + ObjUser ou(ObjUser::ou_root_key, "/Outlines"); + int length = maxEnd(ou) - offset; + int table_offset = + adjusted_offset(this->outline_hints.first_object_offset); + if (offset != table_offset) + { + warnings.push_back( + "incorrect offset in outlines table: hint table = " + + QUtil::int_to_string(table_offset) + + "; computed = " + QUtil::int_to_string(offset)); + } + int table_length = this->outline_hints.group_length; + if (length != table_length) + { + warnings.push_back( + "incorrect length in outlines table: hint table = " + + QUtil::int_to_string(table_length) + + "; computed = " + QUtil::int_to_string(length)); + } + } + else + { + warnings.push_back("incorrect first object number in outline " + "hints table."); + } + } + else + { + warnings.push_back("incorrect object count in outline hint table"); + } +} + +void +QPDF::showLinearizationData() +{ + try + { + readLinearizationData(); + checkLinearizationInternal(); + dumpLinearizationDataInternal(); + } + catch (QPDFExc& e) + { + std::cout << e.what() << std::endl; + } +} + +void +QPDF::dumpLinearizationDataInternal() +{ + std::cout << this->file.getName() << ": linearization data:" << std::endl + << std::endl; + + std::cout + << "file_size: " << this->linp.file_size << std::endl + << "first_page_object: " << this->linp.first_page_object << std::endl + << "first_page_end: " << this->linp.first_page_end << std::endl + << "npages: " << this->linp.npages << std::endl + << "xref_zero_offset: " << this->linp.xref_zero_offset << std::endl + << "first_page: " << this->linp.first_page << std::endl + << "H_offset: " << this->linp.H_offset << std::endl + << "H_length: " << this->linp.H_length << std::endl + << std::endl; + + std::cout << "Page Offsets Hint Table" << std::endl + << std::endl; + dumpHPageOffset(); + std::cout << std::endl + << "Shared Objects Hint Table" << std::endl + << std::endl; + dumpHSharedObject(); + + if (this->outline_hints.nobjects > 0) + { + std::cout << std::endl + << "Outlines Hint Table" << std::endl + << std::endl; + dumpHGeneric(this->outline_hints); + } +} + +int +QPDF::adjusted_offset(int offset) +{ + // All offsets >= H_offset have to be increased by H_length + // since all hint table location values disregard the hint table + // itself. + if (offset >= this->linp.H_offset) + { + return offset + this->linp.H_length; + } + return offset; +} + + +void +QPDF::dumpHPageOffset() +{ + HPageOffset& t = this->page_offset_hints; + std::cout + << "min_nobjects: " << t.min_nobjects + << std::endl + << "first_page_offset: " << adjusted_offset(t.first_page_offset) + << std::endl + << "nbits_delta_nobjects: " << t.nbits_delta_nobjects + << std::endl + << "min_page_length: " << t.min_page_length + << std::endl + << "nbits_delta_page_length: " << t.nbits_delta_page_length + << std::endl + << "min_content_offset: " << t.min_content_offset + << std::endl + << "nbits_delta_content_offset: " << t.nbits_delta_content_offset + << std::endl + << "min_content_length: " << t.min_content_length + << std::endl + << "nbits_delta_content_length: " << t.nbits_delta_content_length + << std::endl + << "nbits_nshared_objects: " << t.nbits_nshared_objects + << std::endl + << "nbits_shared_identifier: " << t.nbits_shared_identifier + << std::endl + << "nbits_shared_numerator: " << t.nbits_shared_numerator + << std::endl + << "shared_denominator: " << t.shared_denominator + << std::endl; + + for (int i1 = 0; i1 < this->linp.npages; ++i1) + { + HPageOffsetEntry& pe = t.entries[i1]; + std::cout + << "Page " << i1 << ":" << std::endl + << " nobjects: " << pe.delta_nobjects + t.min_nobjects + << std::endl + << " length: " << pe.delta_page_length + t.min_page_length + << std::endl + // content offset is relative to page, not file + << " content_offset: " + << pe.delta_content_offset + t.min_content_offset << std::endl + << " content_length: " + << pe.delta_content_length + t.min_content_length << std::endl + << " nshared_objects: " << pe.nshared_objects << std::endl; + for (int i2 = 0; i2 < pe.nshared_objects; ++i2) + { + std::cout << " identifier " << i2 << ": " + << pe.shared_identifiers[i2] << std::endl; + std::cout << " numerator " << i2 << ": " + << pe.shared_numerators[i2] << std::endl; + } + } +} + +void +QPDF::dumpHSharedObject() +{ + HSharedObject& t = this->shared_object_hints; + std::cout + << "first_shared_obj: " << t.first_shared_obj + << std::endl + << "first_shared_offset: " << adjusted_offset(t.first_shared_offset) + << std::endl + << "nshared_first_page: " << t.nshared_first_page + << std::endl + << "nshared_total: " << t.nshared_total + << std::endl + << "nbits_nobjects: " << t.nbits_nobjects + << std::endl + << "min_group_length: " << t.min_group_length + << std::endl + << "nbits_delta_group_length: " << t.nbits_delta_group_length + << std::endl; + + for (int i = 0; i < t.nshared_total; ++i) + { + HSharedObjectEntry& se = t.entries[i]; + std::cout << "Shared Object " << i << ":" << std::endl; + std::cout << " group length: " + << se.delta_group_length + t.min_group_length << std::endl; + // PDF spec says signature present nobjects_minus_one are + // always 0, so print them only if they have a non-zero value. + if (se.signature_present) + { + std::cout << " signature present" << std::endl; + } + if (se.nobjects_minus_one != 0) + { + std::cout << " nobjects: " + << se.nobjects_minus_one + 1 << std::endl; + } + } +} + +void +QPDF::dumpHGeneric(HGeneric& t) +{ + std::cout + << "first_object: " << t.first_object + << std::endl + << "first_object_offset: " << adjusted_offset(t.first_object_offset) + << std::endl + << "nobjects: " << t.nobjects + << std::endl + << "group_length: " << t.group_length + << std::endl; +} + +QPDFObjectHandle +QPDF::objGenToIndirect(ObjGen const& og) +{ + return getObjectByID(og.obj, og.gen); +} + +void +QPDF::calculateLinearizationData(std::map const& object_stream_data) +{ + // This function calculates the ordering of objects, divides them + // into the appropriate parts, and computes some values for the + // linearization parameter dictionary and hint tables. The file + // must be optimized (via calling optimize()) prior to calling + // this function. Note that actual offsets and lengths are not + // computed here, but anything related to object ordering is. + + if (this->object_to_obj_users.empty()) + { + // Note that we can't call optimize here because we don't know + // whether it should be called with or without allow changes. + throw QEXC::Internal("QPDF::calculateLinearizationData " + "called before optimize()"); + } + + // Separate objects into the categories sufficient for us to + // determine which part of the linearized file should contain the + // object. This categorization is useful for other purposes as + // well. Part numbers refer to version 1.4 of the PDF spec. + + // Parts 1, 3, 5, 10, and 11 don't contain any objects from the + // original file (except the trailer dictionary in part 11). + + // Part 4 is the document catalog (root) and the following root + // keys: /ViewerPreferences, /PageMode, /Threads, /OpenAction, + // /AcroForm, /Encrypt. Note that Thread information dictionaries + // are supposed to appear in part 9, but we are disregarding that + // recommendation for now. + + // Part 6 is the first page section. It includes all remaining + // objects referenced by the first page including shared objects + // but not including thumbnails. Additionally, if /PageMode is + // /Outlines, then information from /Outlines also appears here. + + // Part 7 contains remaining objects private to pages other than + // the first page. + + // Part 8 contains all remaining shared objects except those that + // are shared only within thumbnails. + + // Part 9 contains all remaining objects. + + // We sort objects into the following categories: + + // * open_document: part 4 + + // * first_page_private: part 6 + + // * first_page_shared: part 6 + + // * other_page_private: part 7 + + // * other_page_shared: part 8 + + // * thumbnail_private: part 9 + + // * thumbnail_shared: part 9 + + // * other: part 9 + + // * outlines: part 6 or 9 + + QPDFObjectHandle root = getRoot(); + bool outlines_in_first_page = false; + QPDFObjectHandle pagemode = root.getKey("/PageMode"); + QTC::TC("qpdf", "QPDF categorize pagemode present", + pagemode.isName() ? 1 : 0); + if (pagemode.isName()) + { + if (pagemode.getName() == "/UseOutlines") + { + if (root.hasKey("/Outlines")) + { + outlines_in_first_page = true; + } + else + { + QTC::TC("qpdf", "QPDF UseOutlines but no Outlines"); + } + } + QTC::TC("qpdf", "QPDF categorize pagemode outlines", + outlines_in_first_page ? 1 : 0); + } + + std::set open_document_keys; + open_document_keys.insert("/ViewerPreferences"); + open_document_keys.insert("/PageMode"); + open_document_keys.insert("/Threads"); + open_document_keys.insert("/OpenAction"); + open_document_keys.insert("/AcroForm"); + + std::set lc_open_document; + std::set lc_first_page_private; + std::set lc_first_page_shared; + std::set lc_other_page_private; + std::set lc_other_page_shared; + std::set lc_thumbnail_private; + std::set lc_thumbnail_shared; + std::set lc_other; + std::set lc_outlines; + std::set lc_root; + + for (std::map >::iterator oiter = + this->object_to_obj_users.begin(); + oiter != this->object_to_obj_users.end(); ++oiter) + { + ObjGen const& og = (*oiter).first; + + std::set& ous = (*oiter).second; + + bool in_open_document = false; + bool in_first_page = false; + int other_pages = 0; + int thumbs = 0; + int others = 0; + bool in_outlines = false; + bool is_root = false; + + for (std::set::iterator uiter = ous.begin(); + uiter != ous.end(); ++uiter) + { + ObjUser const& ou = *uiter; + switch (ou.ou_type) + { + case ObjUser::ou_trailer_key: + if (ou.key == "/Encrypt") + { + in_open_document = true; + } + else + { + ++others; + } + break; + + case ObjUser::ou_thumb: + ++thumbs; + break; + + case ObjUser::ou_root_key: + if (open_document_keys.count(ou.key) > 0) + { + in_open_document = true; + } + else if (ou.key == "/Outlines") + { + in_outlines = true; + } + else + { + ++others; + } + break; + + case ObjUser::ou_page: + if (ou.pageno == 0) + { + in_first_page = true; + } + else + { + ++other_pages; + } + break; + + case ObjUser::ou_root: + is_root = true; + break; + + case ObjUser::ou_bad: + throw QEXC::Internal("QPDF::calculateLinearizationData: " + "invalid user type"); + break; + } + } + + if (is_root) + { + lc_root.insert(og); + } + else if (in_outlines) + { + lc_outlines.insert(og); + } + else if (in_open_document) + { + lc_open_document.insert(og); + } + else if ((in_first_page) && + (others == 0) && (other_pages == 0) && (thumbs == 0)) + { + lc_first_page_private.insert(og); + } + else if (in_first_page) + { + lc_first_page_shared.insert(og); + } + else if ((other_pages == 1) && (others == 0) && (thumbs == 0)) + { + lc_other_page_private.insert(og); + } + else if (other_pages > 1) + { + lc_other_page_shared.insert(og); + } + else if ((thumbs == 1) && (others == 0)) + { + lc_thumbnail_private.insert(og); + } + else if (thumbs > 1) + { + lc_thumbnail_shared.insert(og); + } + else + { + lc_other.insert(og); + } + } + + // Generate ordering for objects in the output file. Sometimes we + // just dump right from a set into a vector. Rather than + // optimizing this by going straight into the vector, we'll leave + // these phases separate for now. That way, this section can be + // concerned only with ordering, and the above section can be + // considered only with categorization. Note that sets of ObjGens + // are sorted by ObjGen. In a linearized file, objects appear in + // sequence with the possible exception of hints tables which we + // won't see here anyway. That means that running + // calculateLinearizationData() on a linearized file should give + // results identical to the original file ordering. + + // We seem to traverse the page tree a lot in this code, but we + // can address this for a future code optimization if necessary. + // Premature optimization is the root of all evil. + std::vector pages; + { // local scope + // Map all page objects to the containing object stream. This + // should be a no-op in a properly linearized file. + std::vector t = getAllPages(); + for (std::vector::iterator iter = t.begin(); + iter != t.end(); ++iter) + { + pages.push_back(getUncompressedObject(*iter, object_stream_data)); + } + } + unsigned int npages = pages.size(); + + // We will be initializing some values of the computed hint + // tables. Specifically, we can initialize any items that deal + // with object numbers or counts but not any items that deal with + // lengths or offsets. The code that writes linearized files will + // have to fill in these values during the first pass. The + // validation code can compute them relatively easily given the + // rest of the information. + + this->c_linp.npages = npages; + this->c_page_offset_data.entries = std::vector(npages); + + // Part 4: open document objects. We don't care about the order. + + assert(lc_root.size() == 1); + this->part4.push_back(objGenToIndirect(*(lc_root.begin()))); + for (std::set::iterator iter = lc_open_document.begin(); + iter != lc_open_document.end(); ++iter) + { + this->part4.push_back(objGenToIndirect(*iter)); + } + + // Part 6: first page objects. Note: implementation note 124 + // states that Acrobat always treats page 0 as the first page for + // linearization regardless of /OpenAction. pdlin doesn't provide + // any option to set this and also disregards /OpenAction. We + // will do the same. + + // First, place the actual first page object itself. + ObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); + if (! lc_first_page_private.count(first_page_og)) + { + throw QEXC::Internal("QPDF::calculateLinearizationData: first page " + "object not in lc_first_page_private"); + } + lc_first_page_private.erase(first_page_og); + this->c_linp.first_page_object = pages[0].getObjectID(); + this->part6.push_back(pages[0]); + + // The PDF spec "recommends" an order for the rest of the objects, + // but we are going to disregard it except to the extent that it + // groups private and shared objects contiguously for the sake of + // hint tables. + + for (std::set::iterator iter = lc_first_page_private.begin(); + iter != lc_first_page_private.end(); ++iter) + { + this->part6.push_back(objGenToIndirect(*iter)); + } + + for (std::set::iterator iter = lc_first_page_shared.begin(); + iter != lc_first_page_shared.end(); ++iter) + { + this->part6.push_back(objGenToIndirect(*iter)); + } + + // Place the outline dictionary if it goes in the first page section. + if (outlines_in_first_page) + { + pushOutlinesToPart(this->part6, lc_outlines, object_stream_data); + } + + // Fill in page offset hint table information for the first page. + // The PDF spec says that nshared_objects should be zero for the + // first page. pdlin does not appear to obey this, but it fills + // in garbage values for all the shared object identifiers on the + // first page. + + this->c_page_offset_data.entries[0].nobjects = this->part6.size(); + + // Part 7: other pages' private objects + + // For each page in order: + for (unsigned int i = 1; i < npages; ++i) + { + // Place this page's page object + + ObjGen page_og(pages[i].getObjectID(), pages[i].getGeneration()); + if (! lc_other_page_private.count(page_og)) + { + throw QEXC::Internal( + "QPDF::calculateLinearizationData: page object for page " + + QUtil::int_to_string(i) + " not in lc_other_page_private"); + } + lc_other_page_private.erase(page_og); + this->part7.push_back(pages[i]); + + // Place all non-shared objects referenced by this page, + // updating the page object count for the hint table. + + this->c_page_offset_data.entries[i].nobjects = 1; + + ObjUser ou(ObjUser::ou_page, i); + assert(this->obj_user_to_objects.count(ou) > 0); + std::set ogs = this->obj_user_to_objects[ou]; + for (std::set::iterator iter = ogs.begin(); + iter != ogs.end(); ++iter) + { + ObjGen const& og = (*iter); + if (lc_other_page_private.count(og)) + { + lc_other_page_private.erase(og); + this->part7.push_back(objGenToIndirect(og)); + ++this->c_page_offset_data.entries[i].nobjects; + } + } + } + // That should have covered all part7 objects. + if (! lc_other_page_private.empty()) + { + throw QEXC::Internal( + "QPDF::calculateLinearizationData: lc_other_page_private is " + "not empty after generation of part7"); + } + + // Part 8: other pages' shared objects + + // Order is unimportant. + for (std::set::iterator iter = lc_other_page_shared.begin(); + iter != lc_other_page_shared.end(); ++iter) + { + this->part8.push_back(objGenToIndirect(*iter)); + } + + // Part 9: other objects + + // The PDF specification makes recommendations on ordering here. + // We follow them only to a limited extent. Specifically, we put + // the pages tree first, then private thumbnail objects in page + // order, then shared thumbnail objects, and then outlines (unless + // in part 6). After that, we throw all remaining objects in + // arbitrary order. + + // Place the pages tree. + std::set pages_ogs = + this->obj_user_to_objects[ObjUser(ObjUser::ou_root_key, "/Pages")]; + assert(! pages_ogs.empty()); + for (std::set::iterator iter = pages_ogs.begin(); + iter != pages_ogs.end(); ++iter) + { + ObjGen const& og = *iter; + if (lc_other.count(og)) + { + lc_other.erase(og); + this->part9.push_back(objGenToIndirect(og)); + } + } + + // Place private thumbnail images in page order. Slightly more + // information would be required if we were going to bother with + // thumbnail hint tables. + for (unsigned int i = 0; i < npages; ++i) + { + QPDFObjectHandle thumb = pages[i].getKey("/Thumb"); + thumb = getUncompressedObject(thumb, object_stream_data); + if (! thumb.isNull()) + { + // Output the thumbnail itself + ObjGen thumb_og(thumb.getObjectID(), thumb.getGeneration()); + if (lc_thumbnail_private.count(thumb_og)) + { + lc_thumbnail_private.erase(thumb_og); + this->part9.push_back(thumb); + } + else + { + // No internal error this time...there's nothing to + // stop this object from having been referred to + // somewhere else outside of a page's /Thumb, and if + // it had been, there's nothing to prevent it from + // having been in some set other than + // lc_thumbnail_private. + } + std::set& ogs = + this->obj_user_to_objects[ObjUser(ObjUser::ou_thumb, i)]; + for (std::set::iterator iter = ogs.begin(); + iter != ogs.end(); ++iter) + { + ObjGen const& og = *iter; + if (lc_thumbnail_private.count(og)) + { + lc_thumbnail_private.erase(og); + this->part9.push_back(objGenToIndirect(og)); + } + } + } + } + if (! lc_thumbnail_private.empty()) + { + throw QEXC::Internal( + "QPDF::calculateLinearizationData: lc_thumbnail_private " + "not empty after placing thumbnails"); + } + + // Place shared thumbnail objects + for (std::set::iterator iter = lc_thumbnail_shared.begin(); + iter != lc_thumbnail_shared.end(); ++iter) + { + this->part9.push_back(objGenToIndirect(*iter)); + } + + // Place outlines unless in first page + if (! outlines_in_first_page) + { + pushOutlinesToPart(this->part9, lc_outlines, object_stream_data); + } + + // Place all remaining objects + for (std::set::iterator iter = lc_other.begin(); + iter != lc_other.end(); ++iter) + { + this->part9.push_back(objGenToIndirect(*iter)); + } + + // Make sure we got everything exactly once. + + unsigned int num_placed = this->part4.size() + this->part6.size() + + this->part7.size() + this->part8.size() + this->part9.size(); + unsigned int num_wanted = this->object_to_obj_users.size(); + if (num_placed != num_wanted) + { + throw QEXC::Internal("QPDF::calculateLinearizationData: wrong " + "number of objects placed (num_placed = " + + QUtil::int_to_string(num_placed) + + "; number of objects: " + + QUtil::int_to_string(num_wanted)); + } + + // Calculate shared object hint table information including + // references to shared objects from page offset hint data. + + // The shared object hint table consists of all part 6 (whether + // shared or not) in order followed by all part 8 objects in + // order. Add the objects to shared object data keeping a map of + // object number to index. Then populate the shared object + // information for the pages. + + // Note that two objects never have the same object number, so we + // can map from object number only without regards to generation. + std::map obj_to_index; + + this->c_shared_object_data.nshared_first_page = this->part6.size(); + this->c_shared_object_data.nshared_total = + this->c_shared_object_data.nshared_first_page + + this->part8.size(); + + std::vector& shared = + this->c_shared_object_data.entries; + for (std::vector::iterator iter = this->part6.begin(); + iter != this->part6.end(); ++iter) + { + QPDFObjectHandle& oh = *iter; + int obj = oh.getObjectID(); + obj_to_index[obj] = shared.size(); + shared.push_back(CHSharedObjectEntry(obj)); + } + QTC::TC("qpdf", "QPDF lin part 8 empty", this->part8.empty() ? 1 : 0); + if (! this->part8.empty()) + { + this->c_shared_object_data.first_shared_obj = + this->part8[0].getObjectID(); + for (std::vector::iterator iter = + this->part8.begin(); + iter != this->part8.end(); ++iter) + { + QPDFObjectHandle& oh = *iter; + int obj = oh.getObjectID(); + obj_to_index[obj] = shared.size(); + shared.push_back(CHSharedObjectEntry(obj)); + } + } + assert(this->c_shared_object_data.nshared_total == + (int) this->c_shared_object_data.entries.size()); + + // Now compute the list of shared objects for each page after the + // first page. + + for (unsigned int i = 1; i < npages; ++i) + { + CHPageOffsetEntry& pe = this->c_page_offset_data.entries[i]; + ObjUser ou(ObjUser::ou_page, i); + assert(this->obj_user_to_objects.count(ou) > 0); + std::set const& ogs = this->obj_user_to_objects[ou]; + for (std::set::const_iterator iter = ogs.begin(); + iter != ogs.end(); ++iter) + { + ObjGen const& og = *iter; + if ((this->object_to_obj_users[og].size() > 1) && + (obj_to_index.count(og.obj) > 0)) + { + int idx = obj_to_index[og.obj]; + ++pe.nshared_objects; + pe.shared_identifiers.push_back(idx); + } + } + } +} + +void +QPDF::pushOutlinesToPart( + std::vector& part, + std::set& lc_outlines, + std::map const& object_stream_data) +{ + QPDFObjectHandle root = getRoot(); + QPDFObjectHandle outlines = root.getKey("/Outlines"); + if (outlines.isNull()) + { + return; + } + outlines = getUncompressedObject(outlines, object_stream_data); + ObjGen outlines_og(outlines.getObjectID(), outlines.getGeneration()); + QTC::TC("qpdf", "QPDF lin outlines in part", + ((&part == (&this->part6)) ? 0 + : (&part == (&this->part9)) ? 1 + : 9999)); // can't happen + this->c_outline_data.first_object = outlines_og.obj; + this->c_outline_data.nobjects = 1; + lc_outlines.erase(outlines_og); + part.push_back(outlines); + for (std::set::iterator iter = lc_outlines.begin(); + iter != lc_outlines.end(); ++iter) + { + part.push_back(objGenToIndirect(*iter)); + ++this->c_outline_data.nobjects; + } +} + +void +QPDF::getLinearizedParts( + std::map const& object_stream_data, + std::vector& part4, + std::vector& part6, + std::vector& part7, + std::vector& part8, + std::vector& part9) +{ + calculateLinearizationData(object_stream_data); + part4 = this->part4; + part6 = this->part6; + part7 = this->part7; + part8 = this->part8; + part9 = this->part9; +} + +static inline int nbits(int val) +{ + return (val == 0 ? 0 : (1 + nbits(val >> 1))); +} + +int +QPDF::outputLengthNextN( + int in_object, int n, + std::map const& lengths, + std::map const& obj_renumber) +{ + // Figure out the length of a series of n consecutive objects in + // the output file starting with whatever object in_object from + // the input file mapped to. + + assert(obj_renumber.count(in_object) > 0); + int first = (*(obj_renumber.find(in_object))).second; + int length = 0; + for (int i = 0; i < n; ++i) + { + assert(lengths.count(first + i) > 0); + length += (*(lengths.find(first + i))).second; + } + return length; +} + +void +QPDF::calculateHPageOffset( + std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber) +{ + // Page Offset Hint Table + + // We are purposely leaving some values set to their initial zero + // values. + + std::vector const& pages = getAllPages(); + unsigned int npages = pages.size(); + CHPageOffset& cph = this->c_page_offset_data; + std::vector& cphe = cph.entries; + + // Calculate minimum and maximum values for number of objects per + // page and page length. + + int min_nobjects = cphe[0].nobjects; + int max_nobjects = min_nobjects; + int min_length = outputLengthNextN( + pages[0].getObjectID(), min_nobjects, lengths, obj_renumber); + int max_length = min_length; + int max_shared = cphe[0].nshared_objects; + + HPageOffset& ph = this->page_offset_hints; + std::vector& phe = ph.entries; + phe = std::vector(npages); + + for (unsigned int i = 0; i < npages; ++i) + { + // Calculate values for each page, assigning full values to + // the delta items. They will be adjusted later. + + // Repeat calculations for page 0 so we can assign to phe[i] + // without duplicating those assignments. + + int nobjects = cphe[i].nobjects; + int length = outputLengthNextN( + pages[i].getObjectID(), nobjects, lengths, obj_renumber); + int nshared = cphe[i].nshared_objects; + + min_nobjects = std::min(min_nobjects, nobjects); + max_nobjects = std::max(max_nobjects, nobjects); + min_length = std::min(min_length, length); + max_length = std::max(max_length, length); + max_shared = std::max(max_shared, nshared); + + phe[i].delta_nobjects = nobjects; + phe[i].delta_page_length = length; + phe[i].nshared_objects = nshared; + } + + ph.min_nobjects = min_nobjects; + int in_page0_id = pages[0].getObjectID(); + int out_page0_id = (*(obj_renumber.find(in_page0_id))).second; + ph.first_page_offset = (*(xref.find(out_page0_id))).second.getOffset(); + ph.nbits_delta_nobjects = nbits(max_nobjects - min_nobjects); + ph.min_page_length = min_length; + ph.nbits_delta_page_length = nbits(max_length - min_length); + ph.nbits_nshared_objects = nbits(max_shared); + ph.nbits_shared_identifier = + nbits(this->c_shared_object_data.nshared_total); + ph.shared_denominator = 4; // doesn't matter + + // It isn't clear how to compute content offset and content + // length. Since we are not interleaving page objects with the + // content stream, we'll use the same values for content length as + // page length. We will use 0 as content offset because this is + // what Adobe does (implementation note 127) and pdlin as well. + ph.nbits_delta_content_length = ph.nbits_delta_page_length; + ph.min_content_length = ph.min_page_length; + + for (unsigned int i = 0; i < npages; ++i) + { + // Adjust delta entries + assert(phe[i].delta_nobjects >= min_nobjects); + assert(phe[i].delta_page_length >= min_length); + phe[i].delta_nobjects -= min_nobjects; + phe[i].delta_page_length -= min_length; + phe[i].delta_content_length = phe[i].delta_page_length; + + for (int j = 0; j < cphe[i].nshared_objects; ++j) + { + phe[i].shared_identifiers.push_back( + cphe[i].shared_identifiers[j]); + phe[i].shared_numerators.push_back(0); + } + } +} + +void +QPDF::calculateHSharedObject( + std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber) +{ + CHSharedObject& cso = this->c_shared_object_data; + std::vector& csoe = cso.entries; + HSharedObject& so = this->shared_object_hints; + std::vector& soe = so.entries; + soe = std::vector(cso.nshared_total); + + int min_length = outputLengthNextN( + csoe[0].object, 1, lengths, obj_renumber); + int max_length = min_length; + + for (int i = 0; i < cso.nshared_total; ++i) + { + // Assign absolute numbers to deltas; adjust later + int length = outputLengthNextN( + csoe[i].object, 1, lengths, obj_renumber); + min_length = std::min(min_length, length); + max_length = std::max(max_length, length); + soe[i].delta_group_length = length; + } + + so.nshared_total = cso.nshared_total; + so.nshared_first_page = cso.nshared_first_page; + if (so.nshared_total > so.nshared_first_page) + { + so.first_shared_obj = + (*(obj_renumber.find(cso.first_shared_obj))).second; + so.first_shared_offset = + (*(xref.find(so.first_shared_obj))).second.getOffset(); + } + so.min_group_length = min_length; + so.nbits_delta_group_length = nbits(max_length - min_length); + + for (int i = 0; i < cso.nshared_total; ++i) + { + // Adjust deltas + assert(soe[i].delta_group_length >= min_length); + soe[i].delta_group_length -= min_length; + } +} + +void +QPDF::calculateHOutline( + std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber) +{ + HGeneric& cho = this->c_outline_data; + + if (cho.nobjects == 0) + { + return; + } + + HGeneric& ho = this->outline_hints; + + ho.first_object = + (*(obj_renumber.find(cho.first_object))).second; + ho.first_object_offset = + (*(xref.find(ho.first_object))).second.getOffset(); + ho.nobjects = cho.nobjects; + ho.group_length = outputLengthNextN( + cho.first_object, ho.nobjects, lengths, obj_renumber); +} + +template +static void +write_vector_int(BitWriter& w, int nitems, std::vector& vec, + int bits, int T::*field) +{ + // nitems times, write bits bits from the given field of the ith + // vector to the given bit writer. + + for (int i = 0; i < nitems; ++i) + { + w.writeBits(vec[i].*field, bits); + } + // The PDF spec says that each hint table starts at a byte + // boundary. Each "row" actually must start on a byte boundary. + w.flush(); +} + +template +static void +write_vector_vector(BitWriter& w, + int nitems1, std::vector& vec1, int T::*nitems2, + int bits, std::vector T::*vec2) +{ + // nitems1 times, write nitems2 (from the ith element of vec1) items + // from the vec2 vector field of the ith item of vec1. + for (int i1 = 0; i1 < nitems1; ++i1) + { + for (int i2 = 0; i2 < vec1[i1].*nitems2; ++i2) + { + w.writeBits((vec1[i1].*vec2)[i2], bits); + } + } + w.flush(); +} + + +void +QPDF::writeHPageOffset(BitWriter& w) +{ + HPageOffset& t = this->page_offset_hints; + + w.writeBits(t.min_nobjects, 32); // 1 + w.writeBits(t.first_page_offset, 32); // 2 + w.writeBits(t.nbits_delta_nobjects, 16); // 3 + w.writeBits(t.min_page_length, 32); // 4 + w.writeBits(t.nbits_delta_page_length, 16); // 5 + w.writeBits(t.min_content_offset, 32); // 6 + w.writeBits(t.nbits_delta_content_offset, 16); // 7 + w.writeBits(t.min_content_length, 32); // 8 + w.writeBits(t.nbits_delta_content_length, 16); // 9 + w.writeBits(t.nbits_nshared_objects, 16); // 10 + w.writeBits(t.nbits_shared_identifier, 16); // 11 + w.writeBits(t.nbits_shared_numerator, 16); // 12 + w.writeBits(t.shared_denominator, 16); // 13 + + unsigned int nitems = getAllPages().size(); + std::vector& entries = t.entries; + + write_vector_int(w, nitems, entries, + t.nbits_delta_nobjects, + &HPageOffsetEntry::delta_nobjects); + write_vector_int(w, nitems, entries, + t.nbits_delta_page_length, + &HPageOffsetEntry::delta_page_length); + write_vector_int(w, nitems, entries, + t.nbits_nshared_objects, + &HPageOffsetEntry::nshared_objects); + write_vector_vector(w, nitems, entries, + &HPageOffsetEntry::nshared_objects, + t.nbits_shared_identifier, + &HPageOffsetEntry::shared_identifiers); + write_vector_vector(w, nitems, entries, + &HPageOffsetEntry::nshared_objects, + t.nbits_shared_numerator, + &HPageOffsetEntry::shared_numerators); + write_vector_int(w, nitems, entries, + t.nbits_delta_content_offset, + &HPageOffsetEntry::delta_content_offset); + write_vector_int(w, nitems, entries, + t.nbits_delta_content_length, + &HPageOffsetEntry::delta_content_length); +} + +void +QPDF::writeHSharedObject(BitWriter& w) +{ + HSharedObject& t = this->shared_object_hints; + + w.writeBits(t.first_shared_obj, 32); // 1 + w.writeBits(t.first_shared_offset, 32); // 2 + w.writeBits(t.nshared_first_page, 32); // 3 + w.writeBits(t.nshared_total, 32); // 4 + w.writeBits(t.nbits_nobjects, 16); // 5 + w.writeBits(t.min_group_length, 32); // 6 + w.writeBits(t.nbits_delta_group_length, 16); // 7 + + QTC::TC("qpdf", "QPDF lin write nshared_total > nshared_first_page", + (t.nshared_total > t.nshared_first_page) ? 1 : 0); + + int nitems = t.nshared_total; + std::vector& entries = t.entries; + + write_vector_int(w, nitems, entries, + t.nbits_delta_group_length, + &HSharedObjectEntry::delta_group_length); + write_vector_int(w, nitems, entries, + 1, &HSharedObjectEntry::signature_present); + for (int i = 0; i < nitems; ++i) + { + // If signature were present, we'd have to write a 128-bit hash. + assert(entries[i].signature_present == 0); + } + write_vector_int(w, nitems, entries, + t.nbits_nobjects, + &HSharedObjectEntry::nobjects_minus_one); +} + +void +QPDF::writeHGeneric(BitWriter& w, HGeneric& t) +{ + w.writeBits(t.first_object, 32); // 1 + w.writeBits(t.first_object_offset, 32); // 2 + w.writeBits(t.nobjects, 32); // 3 + w.writeBits(t.group_length, 32); // 4 +} + +void +QPDF::generateHintStream(std::map const& xref, + std::map const& lengths, + std::map const& obj_renumber, + PointerHolder& hint_buffer, + int& S, int& O) +{ + // Populate actual hint table values + calculateHPageOffset(xref, lengths, obj_renumber); + calculateHSharedObject(xref, lengths, obj_renumber); + calculateHOutline(xref, lengths, obj_renumber); + + // Write the hint stream itself into a compressed memory buffer. + // Write through a couter so we can get offsets. + Pl_Buffer hint_stream("hint stream"); + Pl_Flate f("compress hint stream", &hint_stream, Pl_Flate::a_deflate); + Pl_Count c("count", &f); + BitWriter w(&c); + + writeHPageOffset(w); + S = c.getCount(); + writeHSharedObject(w); + O = 0; + if (this->outline_hints.nobjects > 0) + { + O = c.getCount(); + writeHGeneric(w, this->outline_hints); + } + c.finish(); + + hint_buffer = hint_stream.getBuffer(); +} diff --git a/libqpdf/QPDF_optimization.cc b/libqpdf/QPDF_optimization.cc new file mode 100644 index 00000000..8797445c --- /dev/null +++ b/libqpdf/QPDF_optimization.cc @@ -0,0 +1,490 @@ +// See doc/optimization. + +#include + +#include +#include +#include +#include +#include + +QPDF::ObjUser::ObjUser() : + ou_type(ou_bad), + pageno(0) +{ +} + +QPDF::ObjUser::ObjUser(user_e type) : + ou_type(type), + pageno(0) +{ + assert(type == ou_root); +} + +QPDF::ObjUser::ObjUser(user_e type, int pageno) : + ou_type(type), + pageno(pageno) +{ + assert((type == ou_page) || (type == ou_thumb)); +} + +QPDF::ObjUser::ObjUser(user_e type, std::string const& key) : + ou_type(type), + pageno(0), + key(key) +{ + assert((type == ou_trailer_key) || (type == ou_root_key)); +} + +bool +QPDF::ObjUser::operator<(ObjUser const& rhs) const +{ + if (this->ou_type < rhs.ou_type) + { + return true; + } + else if (this->ou_type == rhs.ou_type) + { + if (this->pageno < rhs.pageno) + { + return true; + } + else if (this->pageno == rhs.pageno) + { + return (this->key < rhs.key); + } + } + + return false; +} + +void +QPDF::flattenScalarReferences() +{ + // Do a traversal of the entire PDF file structure replacing all + // indirect objects that are not arrays, streams, or dictionaries + // with direct objects. + + std::list queue; + queue.push_back(this->trailer); + std::set visited; + + while (! queue.empty()) + { + QPDFObjectHandle node = queue.front(); + queue.pop_front(); + if (node.isIndirect()) + { + if (node.isScalar()) + { + throw QEXC::Internal( + "flattenScalarReferences landed at indirect scalar"); + } + ObjGen og(node.getObjectID(), node.getGeneration()); + if (visited.count(og) > 0) + { + continue; + } + visited.insert(og); + } + + if (node.isArray()) + { + int nitems = node.getArrayNItems(); + for (int i = 0; i < nitems; ++i) + { + QPDFObjectHandle oh = node.getArrayItem(i); + if (oh.isScalar()) + { + QTC::TC("qpdf", "QPDF opt flatten array scalar"); + oh.makeDirect(); + node.setArrayItem(i, oh); + } + else + { + queue.push_back(oh); + } + } + } + else if (node.isDictionary() || node.isStream()) + { + QPDFObjectHandle dict = node; + if (node.isStream()) + { + dict = node.getDict(); + } + std::set keys = dict.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string const& key = *iter; + QPDFObjectHandle oh = dict.getKey(key); + if (oh.isNull()) + { + // QPDF_Dictionary.getKeys() never returns null + // keys. + throw QEXC::Internal("dictionary with null key found"); + } + else if (oh.isScalar()) + { + QTC::TC("qpdf", "QPDF opt flatten dict scalar"); + oh.makeDirect(); + dict.replaceKey(key, oh); + } + else + { + queue.push_back(oh); + } + } + } + } +} + +void +QPDF::optimize(std::map const& object_stream_data, + bool allow_changes) +{ + if (! this->obj_user_to_objects.empty()) + { + // already optimized + return; + } + + // Traverse pages tree pushing all inherited resources down to the + // page level. + + // key_ancestors is a mapping of page attribute keys to a stack of + // Pages nodes that contain values for them. pageno is the + // current page sequence number numbered from 0. + std::map > key_ancestors; + int pageno = 0; + optimizePagesTree(this->trailer.getKey("/Root").getKey("/Pages"), + key_ancestors, pageno, allow_changes); + assert(key_ancestors.empty()); + + // Traverse document-level items + std::set keys = this->trailer.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string const& key = *iter; + if (key == "/Root") + { + // handled separately + } + else + { + updateObjectMaps(ObjUser(ObjUser::ou_trailer_key, key), + this->trailer.getKey(key)); + } + } + + QPDFObjectHandle root = getRoot(); + keys = root.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + // Technically, /I keys from /Thread dictionaries are supposed + // to be handled separately, but we are going to disregard + // that specification for now. There is loads of evidence + // that pdlin and Acrobat both disregard things like this from + // time to time, so this is almost certain not to cause any + // problems. + + std::string const& key = *iter; + updateObjectMaps(ObjUser(ObjUser::ou_root_key, key), + root.getKey(key)); + } + + ObjUser root_ou = ObjUser(ObjUser::ou_root); + ObjGen root_og = ObjGen(root.getObjectID(), root.getGeneration()); + obj_user_to_objects[root_ou].insert(root_og); + object_to_obj_users[root_og].insert(root_ou); + + filterCompressedObjects(object_stream_data); +} + +void +QPDF::optimizePagesTree( + QPDFObjectHandle cur_pages, + std::map >& key_ancestors, + int& pageno, bool allow_changes) +{ + // Extract the underlying dictionary object + std::string type = cur_pages.getKey("/Type").getName(); + + if (type == "/Pages") + { + // Make a list of inheritable keys. Any key other than /Type, + // /Parent, Kids, or /Count is an inheritable attribute. Push + // this object onto the stack of pages nodes that have values + // for this attribute. + + std::set inheritable_keys; + std::set keys = cur_pages.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string const& key = *iter; + if (! ((key == "/Type") || (key == "/Parent") || + (key == "/Kids") || (key == "/Count"))) + { + if (! allow_changes) + { + throw QPDFExc(this->file.getName() + + ": optimize detected an " + "inheritable resource"); + } + + // This is an inheritable resource + inheritable_keys.insert(key); + QPDFObjectHandle oh = cur_pages.getKey(key); + QTC::TC("qpdf", "QPDF opt direct pages resource", + oh.isIndirect() ? 0 : 1); + if (! oh.isIndirect()) + { + if (! oh.isScalar()) + { + // Replace shared direct object non-scalar + // resources with indirect objects to avoid + // copying large structures around. + cur_pages.replaceKey(key, makeIndirectObject(oh)); + oh = cur_pages.getKey(key); + } + else + { + // Don't defeat flattenScalarReferences which + // would have already been called by this + // time. + QTC::TC("qpdf", "QPDF opt inherited scalar"); + } + } + key_ancestors[key].push_back(oh); + if (key_ancestors[key].size() > 1) + { + QTC::TC("qpdf", "QPDF opt key ancestors depth > 1"); + } + // Remove this resource from this node. It will be + // reattached at the page level. + cur_pages.removeKey(key); + } + } + + // Visit descendant nodes. + QPDFObjectHandle kids = cur_pages.getKey("/Kids"); + int n = kids.getArrayNItems(); + for (int i = 0; i < n; ++i) + { + optimizePagesTree(kids.getArrayItem(i), key_ancestors, pageno, + allow_changes); + } + + // For each inheritable key, pop the stack. If the stack + // becomes empty, remove it from the map. That way, the + // invariant that the list of keys in key_ancestors is exactly + // those keys for which inheritable attributes are available. + + if (! inheritable_keys.empty()) + { + QTC::TC("qpdf", "QPDF opt inheritable keys"); + for (std::set::iterator iter = + inheritable_keys.begin(); + iter != inheritable_keys.end(); ++iter) + { + std::string const& key = (*iter); + key_ancestors[key].pop_back(); + if (key_ancestors[key].empty()) + { + QTC::TC("qpdf", "QPDF opt erase empty key ancestor"); + key_ancestors.erase(key); + } + } + } + else + { + QTC::TC("qpdf", "QPDF opt no inheritable keys"); + } + } + else if (type == "/Page") + { + // Add all available inheritable attributes not present in + // this object to this object. + for (std::map >::iterator + iter = key_ancestors.begin(); + iter != key_ancestors.end(); ++iter) + { + std::string const& key = (*iter).first; + if (! cur_pages.hasKey(key)) + { + QTC::TC("qpdf", "QPDF opt resource inherited"); + cur_pages.replaceKey(key, (*iter).second.back()); + } + else + { + QTC::TC("qpdf", "QPDF opt page resource hides ancestor"); + } + } + + // Traverse from this point, updating the mappings of object + // users to objects and objects to object users. + + updateObjectMaps(ObjUser(ObjUser::ou_page, pageno), cur_pages); + + // Increment pageno so that its value will be correct for the + // next page. + ++pageno; + } + else + { + throw QPDFExc(this->file.getName() + ": invalid Type in page tree"); + } +} + +void +QPDF::updateObjectMaps(ObjUser const& ou, QPDFObjectHandle oh) +{ + std::set visited; + updateObjectMapsInternal(ou, oh, visited, true); +} + +void +QPDF::updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh, + std::set& visited, bool top) +{ + // Traverse the object tree from this point taking care to avoid + // crossing page boundaries. + + bool is_page_node = false; + + if (oh.isDictionary() && oh.hasKey("/Type")) + { + std::string type = oh.getKey("/Type").getName(); + if (type == "/Page") + { + is_page_node = true; + if (! top) + { + return; + } + } + } + + if (oh.isIndirect()) + { + ObjGen og(oh.getObjectID(), oh.getGeneration()); + if (visited.count(og)) + { + QTC::TC("qpdf", "QPDF opt loop detected"); + return; + } + this->obj_user_to_objects[ou].insert(og); + this->object_to_obj_users[og].insert(ou); + visited.insert(og); + } + + if (oh.isArray()) + { + int n = oh.getArrayNItems(); + for (int i = 0; i < n; ++i) + { + updateObjectMapsInternal(ou, oh.getArrayItem(i), visited, false); + } + } + else if (oh.isDictionary() || oh.isStream()) + { + QPDFObjectHandle dict = oh; + if (oh.isStream()) + { + dict = oh.getDict(); + } + + std::set keys = dict.getKeys(); + for (std::set::iterator iter = keys.begin(); + iter != keys.end(); ++iter) + { + std::string const& key = *iter; + if (is_page_node && (key == "/Thumb")) + { + // Traverse page thumbnail dictionaries as a special + // case. + updateObjectMaps(ObjUser(ObjUser::ou_thumb, ou.pageno), + dict.getKey(key)); + } + else if (is_page_node && (key == "/Parent")) + { + // Don't traverse back up the page tree + } + else + { + updateObjectMapsInternal(ou, dict.getKey(key), + visited, false); + } + } + } +} + +void +QPDF::filterCompressedObjects(std::map const& object_stream_data) +{ + if (object_stream_data.empty()) + { + return; + } + + // Transform object_to_obj_users and obj_user_to_objects so that + // they refer only to uncompressed objects. If something is a + // user of a compressed object, then it is really a user of the + // object stream that contains it. + + std::map > t_obj_user_to_objects; + std::map > t_object_to_obj_users; + + for (std::map >::iterator i1 = + this->obj_user_to_objects.begin(); + i1 != this->obj_user_to_objects.end(); ++i1) + { + ObjUser const& ou = (*i1).first; + std::set const& objects = (*i1).second; + for (std::set::const_iterator i2 = objects.begin(); + i2 != objects.end(); ++i2) + { + ObjGen const& og = (*i2); + std::map::const_iterator i3 = + object_stream_data.find(og.obj); + if (i3 == object_stream_data.end()) + { + t_obj_user_to_objects[ou].insert(og); + } + else + { + t_obj_user_to_objects[ou].insert(ObjGen((*i3).second, 0)); + } + } + } + + for (std::map >::iterator i1 = + this->object_to_obj_users.begin(); + i1 != this->object_to_obj_users.end(); ++i1) + { + ObjGen const& og = (*i1).first; + std::set const& objusers = (*i1).second; + for (std::set::const_iterator i2 = objusers.begin(); + i2 != objusers.end(); ++i2) + { + ObjUser const& ou = (*i2); + std::map::const_iterator i3 = + object_stream_data.find(og.obj); + if (i3 == object_stream_data.end()) + { + t_object_to_obj_users[og].insert(ou); + } + else + { + t_object_to_obj_users[ObjGen((*i3).second, 0)].insert(ou); + } + } + } + + this->obj_user_to_objects = t_obj_user_to_objects; + this->object_to_obj_users = t_object_to_obj_users; +} diff --git a/libqpdf/QTC.cc b/libqpdf/QTC.cc new file mode 100644 index 00000000..b8328b2e --- /dev/null +++ b/libqpdf/QTC.cc @@ -0,0 +1,46 @@ + +#include + +#include +#include +#include + +static bool tc_active(char const* const scope) +{ + std::string value; + return (QUtil::get_env("TC_SCOPE", &value) && (value == scope)); +} + +void QTC::TC(char const* const scope, char const* const ccase, int n) +{ + static std::set > cache; + + if (! tc_active(scope)) + { + return; + } + + std::string filename; +#ifdef _WIN32 +# define TC_ENV "TC_WIN_FILENAME" +#else +# define TC_ENV "TC_FILENAME" +#endif + if (! QUtil::get_env(TC_ENV, &filename)) + { + return; + } +#undef TC_ENV + + if (cache.count(std::make_pair(ccase, n))) + { + return; + } + cache.insert(std::make_pair(ccase, n)); + + FILE* tc = + QUtil::fopen_wrapper("open test coverage file (" + filename + ")", + fopen(filename.c_str(), "ab")); + fprintf(tc, "%s %d\n", ccase, n); + fclose(tc); +} diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc new file mode 100644 index 00000000..c0de95f7 --- /dev/null +++ b/libqpdf/QUtil.cc @@ -0,0 +1,198 @@ + +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#else +#include +#endif + +std::string +QUtil::int_to_string(int num, int fullpad) +{ + // This routine will need to be recompiled if an int can be longer than + // 49 digits. + char t[50]; + + // -2 or -1 to leave space for the possible negative sign and for NUL... + if (abs(fullpad) > (int)sizeof(t) - ((num < 0)?2:1)) + { + throw QEXC::Internal("Util::int_to_string has been called with " + "a padding value greater than its internal " + "limit"); + } + + if (fullpad) + { + sprintf(t, "%0*d", fullpad, num); + } + else + { + sprintf(t, "%d", num); + } + + return std::string(t); +} + +std::string +QUtil::double_to_string(double num, int decimal_places) +{ + // This routine will need to be recompiled if a double can be longer than + // 99 digits. + char t[100]; + + std::string lhs = int_to_string((int)num); + + // lhs.length() gives us the length of the part on the right hand + // side of the dot + 1 for the dot + decimal_places: total size of + // the required string. -1 on the sizeof side to allow for NUL at + // the end. + // + // If decimal_places <= 0, it is as if no precision was provided + // so trust the buffer is big enough. The following test will + // always pass in those cases. + if (decimal_places + 1 + (int)lhs.length() > (int)sizeof(t) - 1) + { + throw QEXC::Internal("Util::double_to_string has been called with " + "a number and a decimal places specification " + "that would break an internal limit"); + } + + if (decimal_places) + { + sprintf(t, "%.*f", decimal_places, num); + } + else + { + sprintf(t, "%f", num); + } + return std::string(t); +} + +int +QUtil::os_wrapper(std::string const& description, int status) throw (QEXC::System) +{ + if (status == -1) + { + throw QEXC::System(description, errno); + } + return status; +} + +FILE* +QUtil::fopen_wrapper(std::string const& description, FILE* f) throw (QEXC::System) +{ + if (f == 0) + { + throw QEXC::System(description, errno); + } + return f; +} + +char* +QUtil::copy_string(std::string const& str) +{ + char* result = new char[str.length() + 1]; + // Use memcpy in case string contains nulls + result[str.length()] = '\0'; + memcpy(result, str.c_str(), str.length()); + return result; +} + +bool +QUtil::get_env(std::string const& var, std::string* value) +{ + // This was basically ripped out of wxWindows. +#ifdef _WIN32 + // first get the size of the buffer + DWORD len = ::GetEnvironmentVariable(var.c_str(), NULL, 0); + if (len == 0) + { + // this means that there is no such variable + return false; + } + + if (value) + { + char* t = new char[len + 1]; + ::GetEnvironmentVariable(var.c_str(), t, len); + *value = t; + delete [] t; + } + + return true; +#else + char* p = getenv(var.c_str()); + if (p == 0) + { + return false; + } + if (value) + { + *value = p; + } + + return true; +#endif +} + +std::string +QUtil::toUTF8(unsigned long uval) +{ + std::string result; + + // A UTF-8 encoding of a Unicode value is a single byte for + // Unicode values <= 127. For larger values, the first byte of + // the UTF-8 encoding has '1' as each of its n highest bits and + // '0' for its (n+1)th highest bit where n is the total number of + // bytes required. Subsequent bytes start with '10' and have the + // remaining 6 bits free for encoding. For example, an 11-bit + // unicode value can be stored in two bytes where the first is + // 110zzzzz, the second is 10zzzzzz, and the z's represent the + // remaining bits. + + if (uval > 0x7fffffff) + { + throw QEXC::General("bounds error in QUtil::toUTF8"); + } + else if (uval < 128) + { + result += (char)(uval); + } + else + { + unsigned char bytes[7]; + bytes[6] = '\0'; + unsigned char* cur_byte = &bytes[5]; + + // maximum value that will fit in the current number of bytes + unsigned char maxval = 0x3f; // six bits + + while (uval > maxval) + { + // Assign low six bits plus 10000000 to lowest unused + // byte position, then shift + *cur_byte = (unsigned char) (0x80 + (uval & 0x3f)); + uval >>= 6; + // Maximum that will fit in high byte now shrinks by one bit + maxval >>= 1; + // Slide to the left one byte + --cur_byte; + if (cur_byte < bytes) + { + throw QEXC::Internal("QUtil::toUTF8: overflow error"); + } + } + // If maxval is k bits long, the high (7 - k) bits of the + // resulting byte must be high. + *cur_byte = (unsigned char)((0xff - (1 + (maxval << 1))) + uval); + + result += (char*)cur_byte; + } + + return result; +} diff --git a/libqpdf/RC4.cc b/libqpdf/RC4.cc new file mode 100644 index 00000000..74b538b5 --- /dev/null +++ b/libqpdf/RC4.cc @@ -0,0 +1,56 @@ + +#include + +#include + +static void swap_byte(unsigned char &a, unsigned char &b) +{ + unsigned char t; + + t = a; + a = b; + b = t; +} + +RC4::RC4(unsigned char const* key_data, int key_len) +{ + if (key_len == -1) + { + key_len = strlen((char*)key_data); + } + + for (int i = 0; i < 256; ++i) + { + key.state[i] = i; + } + key.x = 0; + key.y = 0; + + int i1 = 0; + int i2 = 0; + for (int i = 0; i < 256; ++i) + { + i2 = (key_data[i1] + key.state[i] + i2) % 256; + swap_byte(key.state[i], key.state[i2]); + i1 = (i1 + 1) % key_len; + } +} + +void +RC4::process(unsigned char *in_data, int len, unsigned char* out_data) +{ + if (out_data == 0) + { + // Convert in place + out_data = in_data; + } + + for (int i = 0; i < len; ++i) + { + key.x = (key.x + 1) % 256; + key.y = (key.state[key.x] + key.y) % 256; + swap_byte(key.state[key.x], key.state[key.y]); + int xor_index = (key.state[key.x] + key.state[key.y]) % 256; + out_data[i] = in_data[i] ^ key.state[xor_index]; + } +} diff --git a/libqpdf/bits.icc b/libqpdf/bits.icc new file mode 100644 index 00000000..465bf5b9 --- /dev/null +++ b/libqpdf/bits.icc @@ -0,0 +1,149 @@ + +#ifndef __BITS_CC__ +#define __BITS_CC__ + +#include +#include +#include +#include + +// These functions may be run at places where the function call +// overhead from test coverage testing would be too high. Therefore, +// we make the test coverage cases conditional upon a preprocessor +// symbol. BitStream.cc includes this file without defining the +// symbol, and the specially designed test code that fully exercises +// this code includes with the symbol defined. + +#ifdef BITS_READ +static unsigned long +read_bits(unsigned char const*& p, unsigned int& bit_offset, + unsigned int& bits_available, unsigned int bits_wanted) +{ + // View p as a stream of bits: + + // 76543210 76543210 .... + + // bit_offset is the bit number within the first byte that marks + // the first bit that we would read. + + if (bits_wanted > bits_available) + { + throw QEXC::General("overflow reading bit stream"); + } + if (bits_wanted > 32) + { + throw QEXC::Internal("read_bits: too many bits requested"); + } + + unsigned long result = 0; +#ifdef BITS_TESTING + if (bits_wanted == 0) + { + QTC::TC("libtests", "bits zero bits wanted"); + } +#endif + while (bits_wanted > 0) + { + // Grab bits from the first byte clearing anything before + // bit_offset. + unsigned char byte = *p & ((1 << (bit_offset + 1)) - 1); + + // There are bit_offset + 1 bits available in the first byte. + unsigned int to_copy = std::min(bits_wanted, bit_offset + 1); + unsigned int leftover = (bit_offset + 1) - to_copy; + +#ifdef BITS_TESTING + QTC::TC("libtests", "bits bit_offset", + ((bit_offset == 0) ? 0 : + (bit_offset == 7) ? 1 : + 2)); + QTC::TC("libtests", "bits leftover", (leftover > 0) ? 1 : 0); +#endif + + // Right shift so that all the bits we want are right justified. + byte >>= leftover; + + // Copy the bits into result + result <<= to_copy; + result |= byte; + + // Update pointers + if (leftover) + { + bit_offset = leftover - 1; + } + else + { + bit_offset = 7; + ++p; + } + bits_wanted -= to_copy; + bits_available -= to_copy; + +#ifdef BITS_TESTING + QTC::TC("libtests", "bits iterations", + ((bits_wanted > 8) ? 0 : + (bits_wanted > 0) ? 1 : + 2)); +#endif + } + + return result; +} +#endif + +#ifdef BITS_WRITE +static void +write_bits(unsigned char& ch, unsigned int& bit_offset, + unsigned long val, unsigned bits, Pipeline* pipeline) +{ + if (bits > 32) + { + throw QEXC::Internal("write_bits: too many bits requested"); + } + + // bit_offset + 1 is the number of bits left in ch +#ifdef BITS_TESTING + if (bits == 0) + { + QTC::TC("libtests", "bits write zero bits"); + } +#endif + while (bits > 0) + { + int bits_to_write = std::min(bits, bit_offset + 1); + unsigned char newval = + (val >> (bits - bits_to_write)) & ((1 << bits_to_write) - 1); + int bits_left_in_ch = bit_offset + 1 - bits_to_write; + newval <<= bits_left_in_ch; + ch |= newval; + if (bits_left_in_ch == 0) + { +#ifdef BITS_TESTING + QTC::TC("libtests", "bits write pipeline"); +#endif + pipeline->write(&ch, 1); + bit_offset = 7; + ch = 0; + } + else + { +#ifdef BITS_TESTING + QTC::TC("libtests", "bits write leftover"); +#endif + bit_offset -= bits_to_write; + } + bits -= bits_to_write; +#ifdef BITS_TESTING + QTC::TC("libtests", "bits write iterations", + ((bits > 8) ? 0 : + (bits > 0) ? 1 : + 2)); +#endif + } + +} +#endif + + +#endif // __BITS_CC__ diff --git a/libqpdf/build.mk b/libqpdf/build.mk new file mode 100644 index 00000000..9733cb9f --- /dev/null +++ b/libqpdf/build.mk @@ -0,0 +1,73 @@ +TARGETS_libqpdf = \ + libqpdf/$(OUTPUT_DIR)/libqpdf.la + +INCLUDES_libqpdf = include libqpdf + +SRCS_libqpdf = \ + libqpdf/BitStream.cc \ + libqpdf/BitWriter.cc \ + libqpdf/Buffer.cc \ + libqpdf/MD5.cc \ + libqpdf/PCRE.cc \ + libqpdf/Pipeline.cc \ + libqpdf/Pl_ASCII85Decoder.cc \ + libqpdf/Pl_ASCIIHexDecoder.cc \ + libqpdf/Pl_Buffer.cc \ + libqpdf/Pl_Count.cc \ + libqpdf/Pl_Discard.cc \ + libqpdf/Pl_Flate.cc \ + libqpdf/Pl_LZWDecoder.cc \ + libqpdf/Pl_MD5.cc \ + libqpdf/Pl_PNGFilter.cc \ + libqpdf/Pl_QPDFTokenizer.cc \ + libqpdf/Pl_RC4.cc \ + libqpdf/Pl_StdioFile.cc \ + libqpdf/QEXC.cc \ + libqpdf/QPDF.cc \ + libqpdf/QPDFExc.cc \ + libqpdf/QPDFObject.cc \ + libqpdf/QPDFObjectHandle.cc \ + libqpdf/QPDFTokenizer.cc \ + libqpdf/QPDFWriter.cc \ + libqpdf/QPDFXRefEntry.cc \ + libqpdf/QPDF_Array.cc \ + libqpdf/QPDF_Bool.cc \ + libqpdf/QPDF_Dictionary.cc \ + libqpdf/QPDF_Integer.cc \ + libqpdf/QPDF_Name.cc \ + libqpdf/QPDF_Null.cc \ + libqpdf/QPDF_Real.cc \ + libqpdf/QPDF_Stream.cc \ + libqpdf/QPDF_String.cc \ + libqpdf/QPDF_encryption.cc \ + libqpdf/QPDF_linearization.cc \ + libqpdf/QPDF_optimization.cc \ + libqpdf/QTC.cc \ + libqpdf/QUtil.cc \ + libqpdf/RC4.cc + +# ----- + +OBJS_libqpdf = $(call src_to_lobj,$(SRCS_libqpdf)) + +ifeq ($(GENDEPS),1) +-include $(call lobj_to_dep,$(OBJS_libqpdf)) +endif + +$(OBJS_libqpdf): libqpdf/$(OUTPUT_DIR)/%.lo: libqpdf/%.cc + $(call libcompile,$<,$(INCLUDES_libqpdf)) + +# Last three arguments to makelib are CURRENT,REVISION,AGE. +# +# * If any interfaces have been removed or changed, we are not binary +# compatible. Increment CURRENT, and set AGE and REVISION to 0. +# +# * Otherwise, if any interfaces have been added since the last +# public release, then increment CURRENT and AGE, and set REVISION +# to 0. +# +# * Otherwise, increment REVISION + +libqpdf/$(OUTPUT_DIR)/libqpdf.la: $(OBJS_libqpdf) + $(call makelib,$(OBJS_libqpdf),$@,1,0,0) + diff --git a/libqpdf/qpdf/BitStream.hh b/libqpdf/qpdf/BitStream.hh new file mode 100644 index 00000000..d02eea42 --- /dev/null +++ b/libqpdf/qpdf/BitStream.hh @@ -0,0 +1,23 @@ +// Read bits from a bit stream. See BitWriter for writing. + +#ifndef __BITSTREAM_HH__ +#define __BITSTREAM_HH__ + +class BitStream +{ + public: + BitStream(unsigned char const* p, int nbytes); + void reset(); + unsigned long getBits(int nbits); + void skipToNextByte(); + + private: + unsigned char const* start; + int nbytes; + + unsigned char const* p; + unsigned int bit_offset; + unsigned int bits_available; +}; + +#endif // __BITSTREAM_HH__ diff --git a/libqpdf/qpdf/BitWriter.hh b/libqpdf/qpdf/BitWriter.hh new file mode 100644 index 00000000..1efd498a --- /dev/null +++ b/libqpdf/qpdf/BitWriter.hh @@ -0,0 +1,24 @@ +// Write bits into a bit stream. See BitStream for reading. + +#ifndef __THIS_FILE_Q__ +#define __THIS_FILE_Q__ + +class Pipeline; + +class BitWriter +{ + public: + // Write bits to the pipeline. It is the caller's responsibility + // to eventually call finish on the pipeline. + BitWriter(Pipeline* pl); + void writeBits(unsigned long val, int bits); + // Force any partial byte to be written to the pipeline. + void flush(); + + private: + Pipeline* pl; + unsigned char ch; + unsigned int bit_offset; +}; + +#endif // __THIS_FILE_Q__ diff --git a/libqpdf/qpdf/MD5.hh b/libqpdf/qpdf/MD5.hh new file mode 100644 index 00000000..0ae15da9 --- /dev/null +++ b/libqpdf/qpdf/MD5.hh @@ -0,0 +1,73 @@ + +#ifndef __MD5_HH__ +#define __MD5_HH__ + +#include +#include + +class MD5 +{ + public: + typedef unsigned char Digest[16]; + + MD5(); + void reset(); + + // encodes string and finalizes + void encodeString(char const* input_string); + + // encodes file and finalizes + void encodeFile(char const* filename, int up_to_size = -1) + throw(QEXC::System); + + // appends string to current md5 object + void appendString(char const* input_string); + + // appends arbitrary data to current md5 object + void encodeDataIncrementally(char const* input_data, int len); + + // computes a raw digest + void digest(Digest); + + // prints the digest to stdout terminated with \r\n (primarily for + // testing) + void print(); + + // returns the digest as a hexademical string + std::string unparse(); + + // Convenience functions + static std::string getDataChecksum(char const* buf, int len); + static std::string getFileChecksum(char const* filename, int up_to_size = -1); + static bool checkDataChecksum(char const* const checksum, + char const* buf, int len); + static bool checkFileChecksum(char const* const checksum, + char const* filename, int up_to_size = -1); + + private: + // POINTER defines a generic pointer type + typedef void *POINTER; + + // UINT2 defines a two byte word + typedef unsigned short int UINT2; + + // UINT4 defines a four byte word + typedef unsigned long int UINT4; + + void init(); + void update(unsigned char *, unsigned int); + void final(); + + static void transform(UINT4 [4], unsigned char [64]); + static void encode(unsigned char *, UINT4 *, unsigned int); + static void decode(UINT4 *, unsigned char *, unsigned int); + + UINT4 state[4]; // state (ABCD) + UINT4 count[2]; // number of bits, modulo 2^64 (lsb first) + unsigned char buffer[64]; // input buffer + + bool finalized; + Digest digest_val; +}; + +#endif // __MD5_HH__ diff --git a/libqpdf/qpdf/PCRE.hh b/libqpdf/qpdf/PCRE.hh new file mode 100644 index 00000000..a226aa19 --- /dev/null +++ b/libqpdf/qpdf/PCRE.hh @@ -0,0 +1,107 @@ +// This is a C++ wrapper class around Philip Hazel's perl-compatible +// regular expressions library. +// + +#ifndef __PCRE_HH__ +#define __PCRE_HH__ + +#include +#include + +#include + +// Note: this class does not encapsulate all features of the PCRE +// package -- only those that I actually need right now are here. + +class PCRE +{ + public: + class Exception: public QEXC::General + { + public: + Exception(std::string const& message); + virtual ~Exception() throw() {} + }; + + // This is thrown when an attempt is made to access a non-existent + // back reference. + class NoBackref: public Exception + { + public: + NoBackref(); + virtual ~NoBackref() throw() {} + }; + + class Match + { + friend class PCRE; + public: + Match(int nbackrefs, char const* subject); + Match(Match const&); + Match& operator=(Match const&); + ~Match(); + operator bool(); + + // All the back reference accessing routines may throw the + // special exception NoBackref (derived from Exception) if the + // back reference does not exist. Exception will be thrown + // for other error conditions. This allows callers to trap + // this condition explicitly when they care about the + // difference between a backreference matching an empty string + // and not matching at all. + + // see getMatch flags below + std::string getMatch(int n, int flags = 0) + throw(QEXC::General, Exception); + void getOffsetLength(int n, int& offset, int& length) throw(Exception); + int getOffset(int n) throw(Exception); + int getLength(int n) throw(Exception); + + // nMatches returns the number of available matches including + // match 0 which is the whole string. In other words, if you + // have one backreference in your expression and the + // expression matches, nMatches() will return 2, getMatch(0) + // will return the whole string, getMatch(1) will return the + // text that matched the backreference, and getMatch(2) will + // throw an exception because it is out of range. + int nMatches() const; + + // Flags for getMatch + + // getMatch on a substring that didn't match should return + // empty string instead of throwing an exception + static int const gm_no_substring_returns_empty = (1 << 0); + + private: + void init(int nmatches, int nbackrefs, char const* subject); + void copy(Match const&); + void destroy(); + + int nbackrefs; + char const* subject; + int* ovector; + int ovecsize; + int nmatches; + }; + + // The value passed in as options is passed to pcre_exec. See man + // pcreapi for details. + PCRE(char const* pattern, int options = 0) throw(Exception); + ~PCRE(); + + Match match(char const* subject, int options = 0, int startoffset = 0, + int size = -1) + throw(QEXC::General, Exception); + + static void test(int n = 0); + + private: + // prohibit copying and assignment + PCRE(PCRE const&); + PCRE& operator=(PCRE const&); + + pcre* code; + int nbackrefs; +}; + +#endif // __PCRE_HH__ diff --git a/libqpdf/qpdf/Pl_ASCII85Decoder.hh b/libqpdf/qpdf/Pl_ASCII85Decoder.hh new file mode 100644 index 00000000..9883a58e --- /dev/null +++ b/libqpdf/qpdf/Pl_ASCII85Decoder.hh @@ -0,0 +1,23 @@ + +#ifndef __PL_ASCII85DECODER_HH__ +#define __PL_ASCII85DECODER_HH__ + +#include + +class Pl_ASCII85Decoder: public Pipeline +{ + public: + Pl_ASCII85Decoder(char const* identifier, Pipeline* next); + virtual ~Pl_ASCII85Decoder(); + virtual void write(unsigned char* buf, int len); + virtual void finish(); + + private: + void flush(); + + char inbuf[5]; + int pos; + int eod; +}; + +#endif // __PL_ASCII85DECODER_HH__ diff --git a/libqpdf/qpdf/Pl_ASCIIHexDecoder.hh b/libqpdf/qpdf/Pl_ASCIIHexDecoder.hh new file mode 100644 index 00000000..36272328 --- /dev/null +++ b/libqpdf/qpdf/Pl_ASCIIHexDecoder.hh @@ -0,0 +1,23 @@ + +#ifndef __PL_ASCIIHEXDECODER_HH__ +#define __PL_ASCIIHEXDECODER_HH__ + +#include + +class Pl_ASCIIHexDecoder: public Pipeline +{ + public: + Pl_ASCIIHexDecoder(char const* identifier, Pipeline* next); + virtual ~Pl_ASCIIHexDecoder(); + virtual void write(unsigned char* buf, int len); + virtual void finish(); + + private: + void flush(); + + char inbuf[3]; + int pos; + bool eod; +}; + +#endif // __PL_ASCIIHEXDECODER_HH__ diff --git a/libqpdf/qpdf/Pl_LZWDecoder.hh b/libqpdf/qpdf/Pl_LZWDecoder.hh new file mode 100644 index 00000000..95ec55b3 --- /dev/null +++ b/libqpdf/qpdf/Pl_LZWDecoder.hh @@ -0,0 +1,40 @@ + +#ifndef __PL_LZWDECODER_HH__ +#define __PL_LZWDECODER_HH__ + +#include + +#include +#include + +class Pl_LZWDecoder: public Pipeline +{ + public: + Pl_LZWDecoder(char const* identifier, Pipeline* next, + bool early_code_change); + virtual ~Pl_LZWDecoder(); + virtual void write(unsigned char* buf, int len); + virtual void finish(); + + private: + void sendNextCode(); + void handleCode(int code); + unsigned char getFirstChar(int code); + void addToTable(unsigned char next); + + // members used for converting bits to codes + unsigned char buf[3]; + int code_size; + int next; + int byte_pos; + int bit_pos; // left to right: 01234567 + int bits_available; + + // members used for handle LZW decompression + bool code_change_delta; + bool eod; + std::vector table; + int last_code; +}; + +#endif // __PL_LZWDECODER_HH__ diff --git a/libqpdf/qpdf/Pl_MD5.hh b/libqpdf/qpdf/Pl_MD5.hh new file mode 100644 index 00000000..2d9d11fd --- /dev/null +++ b/libqpdf/qpdf/Pl_MD5.hh @@ -0,0 +1,30 @@ + +#ifndef __PL_MD5_HH__ +#define __PL_MD5_HH__ + +// This pipeline sends its output to its successor unmodified. After +// calling finish, the MD5 checksum of the data that passed through +// the pipeline is available. + +// This pipeline is reusable; i.e., it is safe to call write() after +// calling finish(). The first call to write() after a call to +// finish() initializes a new MD5 object. + +#include +#include + +class Pl_MD5: public Pipeline +{ + public: + Pl_MD5(char const* identifier, Pipeline* next); + virtual ~Pl_MD5(); + virtual void write(unsigned char*, int); + virtual void finish(); + std::string getHexDigest(); + + private: + bool in_progress; + MD5 md5; +}; + +#endif // __PL_MD5_HH__ diff --git a/libqpdf/qpdf/Pl_PNGFilter.hh b/libqpdf/qpdf/Pl_PNGFilter.hh new file mode 100644 index 00000000..1ecc7060 --- /dev/null +++ b/libqpdf/qpdf/Pl_PNGFilter.hh @@ -0,0 +1,62 @@ + +#ifndef __PL_PNGFILTER_HH__ +#define __PL_PNGFILTER_HH__ + +// This pipeline applies or reverses the application of a PNG filter +// as described in the PNG specification. + +// NOTE: In its initial implementation, it only encodes and decodes +// filters "none" and "up". The primary motivation of this code is to +// encode and decode PDF 1.5+ XRef streams which are often encoded +// with Flate predictor 12, which corresponds to the PNG up filter. +// At present, the bytes_per_pixel parameter is ignored, and an +// exception is thrown if any row of the file has a filter of other +// than 0 or 2. Finishing the implementation would not be difficult. +// See chapter 6 of the PNG specification for a description of the +// filter algorithms. + +#include + +class Pl_PNGFilter: public Pipeline +{ + public: + class Exception: public Pipeline::Exception + { + public: + Exception(std::string const& message) : + Pipeline::Exception(message) + { + } + + virtual ~Exception() throw () + { + } + }; + + // Encoding is not presently supported + enum action_e { a_encode, a_decode }; + + Pl_PNGFilter(char const* identifier, Pipeline* next, + action_e action, unsigned int columns, + unsigned int bytes_per_pixel); + virtual ~Pl_PNGFilter(); + + virtual void write(unsigned char* data, int len); + virtual void finish(); + + private: + void processRow(); + void encodeRow(); + void decodeRow(); + + action_e action; + unsigned int columns; + unsigned char* cur_row; + unsigned char* prev_row; + unsigned char* buf1; + unsigned char* buf2; + int pos; + int incoming; +}; + +#endif // __PL_PNGFILTER_HH__ diff --git a/libqpdf/qpdf/Pl_QPDFTokenizer.hh b/libqpdf/qpdf/Pl_QPDFTokenizer.hh new file mode 100644 index 00000000..448dbb18 --- /dev/null +++ b/libqpdf/qpdf/Pl_QPDFTokenizer.hh @@ -0,0 +1,40 @@ + +#ifndef __PL_QPDFTOKENIZER_HH__ +#define __PL_QPDFTOKENIZER_HH__ + +#include + +#include + +// +// Treat incoming text as a stream consisting of valid PDF tokens, but +// output bad tokens just the same. The idea here is to be able to +// use pipeline for content streams to normalize newlines without +// interfering with meaningful newlines such as those that occur +// inside of strings. +// + +class Pl_QPDFTokenizer: public Pipeline +{ + public: + Pl_QPDFTokenizer(char const* identifier, Pipeline* next); + virtual ~Pl_QPDFTokenizer(); + virtual void write(unsigned char* buf, int len); + virtual void finish(); + + private: + void processChar(char ch); + void checkUnread(); + void writeNext(char const*, int len); + void writeToken(QPDFTokenizer::Token&); + + QPDFTokenizer tokenizer; + bool newline_after_next_token; + bool just_wrote_nl; + bool last_char_was_cr; + bool unread_char; + char char_to_unread; + bool pass_through; +}; + +#endif // __PL_QPDFTOKENIZER_HH__ diff --git a/libqpdf/qpdf/Pl_RC4.hh b/libqpdf/qpdf/Pl_RC4.hh new file mode 100644 index 00000000..6bebe5aa --- /dev/null +++ b/libqpdf/qpdf/Pl_RC4.hh @@ -0,0 +1,42 @@ + +#ifndef __PL_RC4_HH__ +#define __PL_RC4_HH__ + +#include + +#include + +class Pl_RC4: public Pipeline +{ + public: + class Exception: public Pipeline::Exception + { + public: + Exception(std::string const& message) : + Pipeline::Exception(message) + { + } + + virtual ~Exception() throw() + { + } + }; + + static int const def_bufsize = 65536; + + // key_len of -1 means treat key_data as a null-terminated string + Pl_RC4(char const* identifier, Pipeline* next, + unsigned char const* key_data, int key_len = -1, + int out_bufsize = def_bufsize); + virtual ~Pl_RC4(); + + virtual void write(unsigned char* data, int len); + virtual void finish(); + + private: + unsigned char* outbuf; + int out_bufsize; + RC4 rc4; +}; + +#endif // __PL_RC4_HH__ diff --git a/libqpdf/qpdf/QPDF_Array.hh b/libqpdf/qpdf/QPDF_Array.hh new file mode 100644 index 00000000..371be50e --- /dev/null +++ b/libqpdf/qpdf/QPDF_Array.hh @@ -0,0 +1,24 @@ + +#ifndef __QPDF_ARRAY_HH__ +#define __QPDF_ARRAY_HH__ + +#include + +#include +#include + +class QPDF_Array: public QPDFObject +{ + public: + QPDF_Array(std::vector const& items); + virtual ~QPDF_Array(); + virtual std::string unparse(); + int getNItems() const; + QPDFObjectHandle getItem(int n) const; + void setItem(int, QPDFObjectHandle const&); + + private: + std::vector items; +}; + +#endif // __QPDF_ARRAY_HH__ diff --git a/libqpdf/qpdf/QPDF_Bool.hh b/libqpdf/qpdf/QPDF_Bool.hh new file mode 100644 index 00000000..06aca822 --- /dev/null +++ b/libqpdf/qpdf/QPDF_Bool.hh @@ -0,0 +1,19 @@ + +#ifndef __QPDF_BOOL_HH__ +#define __QPDF_BOOL_HH__ + +#include + +class QPDF_Bool: public QPDFObject +{ + public: + QPDF_Bool(bool val); + virtual ~QPDF_Bool(); + virtual std::string unparse(); + bool getVal() const; + + private: + bool val; +}; + +#endif // __QPDF_BOOL_HH__ diff --git a/libqpdf/qpdf/QPDF_Dictionary.hh b/libqpdf/qpdf/QPDF_Dictionary.hh new file mode 100644 index 00000000..6a79fb69 --- /dev/null +++ b/libqpdf/qpdf/QPDF_Dictionary.hh @@ -0,0 +1,35 @@ + +#ifndef __QPDF_DICTIONARY_HH__ +#define __QPDF_DICTIONARY_HH__ + +#include + +#include +#include + +#include + +class QPDF_Dictionary: public QPDFObject +{ + public: + QPDF_Dictionary(std::map const& items); + virtual ~QPDF_Dictionary(); + virtual std::string unparse(); + + // hasKey() and getKeys() treat keys with null values as if they + // aren't there. getKey() returns null for the value of a + // non-existent key. This is as per the PDF spec. + bool hasKey(std::string const&); + QPDFObjectHandle getKey(std::string const&); + std::set getKeys(); + + // Repalce value of key, adding it if it does not exist + void replaceKey(std::string const& key, QPDFObjectHandle const&); + // Remove key, doing nothing if key does not exist + void removeKey(std::string const& key); + + private: + std::map items; +}; + +#endif // __QPDF_DICTIONARY_HH__ diff --git a/libqpdf/qpdf/QPDF_Integer.hh b/libqpdf/qpdf/QPDF_Integer.hh new file mode 100644 index 00000000..fb6360b2 --- /dev/null +++ b/libqpdf/qpdf/QPDF_Integer.hh @@ -0,0 +1,19 @@ + +#ifndef __QPDF_INTEGER_HH__ +#define __QPDF_INTEGER_HH__ + +#include + +class QPDF_Integer: public QPDFObject +{ + public: + QPDF_Integer(int val); + virtual ~QPDF_Integer(); + virtual std::string unparse(); + int getVal() const; + + private: + int val; +}; + +#endif // __QPDF_INTEGER_HH__ diff --git a/libqpdf/qpdf/QPDF_Name.hh b/libqpdf/qpdf/QPDF_Name.hh new file mode 100644 index 00000000..a32f6f4f --- /dev/null +++ b/libqpdf/qpdf/QPDF_Name.hh @@ -0,0 +1,22 @@ + +#ifndef __QPDF_NAME_HH__ +#define __QPDF_NAME_HH__ + +#include + +class QPDF_Name: public QPDFObject +{ + public: + QPDF_Name(std::string const& name); + virtual ~QPDF_Name(); + virtual std::string unparse(); + std::string getName() const; + + // Put # into strings with characters unsuitable for name token + static std::string normalizeName(std::string const& name); + + private: + std::string name; +}; + +#endif // __QPDF_NAME_HH__ diff --git a/libqpdf/qpdf/QPDF_Null.hh b/libqpdf/qpdf/QPDF_Null.hh new file mode 100644 index 00000000..60c1ae35 --- /dev/null +++ b/libqpdf/qpdf/QPDF_Null.hh @@ -0,0 +1,14 @@ + +#ifndef __QPDF_NULL_HH__ +#define __QPDF_NULL_HH__ + +#include + +class QPDF_Null: public QPDFObject +{ + public: + virtual ~QPDF_Null(); + std::string unparse(); +}; + +#endif // __QPDF_NULL_HH__ diff --git a/libqpdf/qpdf/QPDF_Real.hh b/libqpdf/qpdf/QPDF_Real.hh new file mode 100644 index 00000000..b950c569 --- /dev/null +++ b/libqpdf/qpdf/QPDF_Real.hh @@ -0,0 +1,20 @@ + +#ifndef __QPDF_REAL_HH__ +#define __QPDF_REAL_HH__ + +#include + +class QPDF_Real: public QPDFObject +{ + public: + QPDF_Real(std::string const& val); + virtual ~QPDF_Real(); + std::string unparse(); + std::string getVal(); + + private: + // Store reals as strings to avoid roundoff errors. + std::string val; +}; + +#endif // __QPDF_REAL_HH__ diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh new file mode 100644 index 00000000..71381fd3 --- /dev/null +++ b/libqpdf/qpdf/QPDF_Stream.hh @@ -0,0 +1,42 @@ + +#ifndef __QPDF_STREAM_HH__ +#define __QPDF_STREAM_HH__ + +#include + +#include + +class Pipeline; +class QPDF; + +class QPDF_Stream: public QPDFObject +{ + public: + QPDF_Stream(QPDF*, int objid, int generation, + QPDFObjectHandle stream_dict, + off_t offset, int length); + virtual ~QPDF_Stream(); + virtual std::string unparse(); + QPDFObjectHandle getDict() const; + + // See comments in QPDFObjectHandle.hh + bool pipeStreamData(Pipeline*, bool filter, + bool normalize, bool compress); + + // See comments in QPDFObjectHandle.hh + PointerHolder getStreamData(); + + private: + bool filterable(std::vector& filters, + int& predictor, int& columns, bool& early_code_change); + + + QPDF* qpdf; + int objid; + int generation; + QPDFObjectHandle stream_dict; + off_t offset; + int length; +}; + +#endif // __QPDF_STREAM_HH__ diff --git a/libqpdf/qpdf/QPDF_String.hh b/libqpdf/qpdf/QPDF_String.hh new file mode 100644 index 00000000..f3063c50 --- /dev/null +++ b/libqpdf/qpdf/QPDF_String.hh @@ -0,0 +1,23 @@ + +#ifndef __QPDF_STRING_HH__ +#define __QPDF_STRING_HH__ + +#include + +// QPDF_Strings may included embedded null characters. + +class QPDF_String: public QPDFObject +{ + public: + QPDF_String(std::string const& val); + virtual ~QPDF_String(); + virtual std::string unparse(); + std::string unparse(bool force_binary); + std::string getVal() const; + std::string getUTF8Val() const; + + private: + std::string val; +}; + +#endif // __QPDF_STRING_HH__ diff --git a/libqpdf/qpdf/RC4.hh b/libqpdf/qpdf/RC4.hh new file mode 100644 index 00000000..657bf35b --- /dev/null +++ b/libqpdf/qpdf/RC4.hh @@ -0,0 +1,26 @@ + +#ifndef __RC4_HH__ +#define __RC4_HH__ + +class RC4 +{ + public: + // key_len of -1 means treat key_data as a null-terminated string + RC4(unsigned char const* key_data, int key_len = -1); + + // out_data = 0 means to encrypt/decrypt in place + void process(unsigned char* in_data, int len, unsigned char* out_data = 0); + + private: + class RC4Key + { + public: + unsigned char state[256]; + unsigned char x; + unsigned char y; + }; + + RC4Key key; +}; + +#endif // __RC4_HH__ diff --git a/libtests/Makefile b/libtests/Makefile new file mode 100644 index 00000000..90899055 --- /dev/null +++ b/libtests/Makefile @@ -0,0 +1 @@ +include ../make/proxy.mk diff --git a/libtests/ascii85.cc b/libtests/ascii85.cc new file mode 100644 index 00000000..4b5fed13 --- /dev/null +++ b/libtests/ascii85.cc @@ -0,0 +1,36 @@ +#include + +#include +#include + +int main() +{ + Pl_StdioFile out("stdout", stdout); + Pl_ASCII85Decoder decode("decode", &out); + + try + { + unsigned char buf[10000]; + bool done = false; + while (! done) + { + int len = read(0, buf, sizeof(buf)); + if (len <= 0) + { + done = true; + } + else + { + decode.write(buf, len); + } + } + decode.finish(); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + exit(2); + } + + return 0; +} diff --git a/libtests/bits.cc b/libtests/bits.cc new file mode 100644 index 00000000..09f5d8e2 --- /dev/null +++ b/libtests/bits.cc @@ -0,0 +1,177 @@ + +#include +#include +#include +#include + +// See comments in bits.cc +#define BITS_TESTING 1 +#define BITS_READ 1 +#define BITS_WRITE 1 +#include "../libqpdf/bits.icc" + +static void +print_values(int byte_offset, unsigned int bit_offset, + unsigned int bits_available) +{ + std::cout << "byte offset = " << byte_offset << ", " + << "bit offset = " << bit_offset << ", " + << "bits available = " << bits_available << std::endl; +} + +static void +test_read_bits(unsigned char const* buf, + unsigned char const*& p, unsigned int& bit_offset, + unsigned int& bits_available, int bits_wanted) +{ + unsigned long result = + read_bits(p, bit_offset, bits_available, bits_wanted); + + std::cout << "bits read: " << bits_wanted << ", result = " << result + << std::endl; + print_values(p - buf, bit_offset, bits_available); +} + +static void +test_write_bits(unsigned char& ch, unsigned int& bit_offset, unsigned long val, + int bits, Pl_Buffer* bp) +{ + write_bits(ch, bit_offset, val, bits, bp); + printf("ch = %02x, bit_offset = %d\n", (unsigned int) ch, bit_offset); +} + +static void +print_buffer(Pl_Buffer* bp) +{ + bp->finish(); + Buffer* b = bp->getBuffer(); + unsigned char const* p = b->getBuffer(); + unsigned long l = b->getSize(); + for (unsigned long i = 0; i < l; ++i) + { + printf("%02x%s", (unsigned int)(p[i]), + (i == l - 1) ? "\n" : " "); + } + printf("\n"); + delete b; +} + +static void +test() +{ + // 11110101 00010101 01100101 01111001 00010010 10001001 01110101 01001011 + // F5 15 65 79 12 89 75 4B + + // Read tests + + static unsigned char const buf[] = { + 0xF5, 0x15, 0x65, 0x79, 0x12, 0x89, 0x75, 0x4B + }; + + unsigned char const* p = buf; + unsigned int bit_offset = 7; + unsigned int bits_available = 64; + + // 11110:101 0:001010:1 01100101: 01111001 + // 0:00:1:0010 10001001 01110101 01001:011 + print_values(p - buf, bit_offset, bits_available); + test_read_bits(buf, p, bit_offset, bits_available, 5); + test_read_bits(buf, p, bit_offset, bits_available, 4); + test_read_bits(buf, p, bit_offset, bits_available, 6); + test_read_bits(buf, p, bit_offset, bits_available, 9); + test_read_bits(buf, p, bit_offset, bits_available, 9); + test_read_bits(buf, p, bit_offset, bits_available, 2); + test_read_bits(buf, p, bit_offset, bits_available, 1); + test_read_bits(buf, p, bit_offset, bits_available, 0); + test_read_bits(buf, p, bit_offset, bits_available, 25); + + try + { + test_read_bits(buf, p, bit_offset, bits_available, 4); + } + catch (std::exception& e) + { + std::cout << "exception: " << e.what() << std::endl; + print_values(p - buf, bit_offset, bits_available); + } + + test_read_bits(buf, p, bit_offset, bits_available, 3); + std::cout << std::endl; + + // 11110101 00010101 01100101 01111001: 00010010 10001001 01110101 01001011 + + p = buf; + bit_offset = 7; + bits_available = 64; + print_values(p - buf, bit_offset, bits_available); + test_read_bits(buf, p, bit_offset, bits_available, 32); + test_read_bits(buf, p, bit_offset, bits_available, 32); + std::cout << std::endl; + + BitStream b(buf, 8); + std::cout << b.getBits(32) << std::endl; + b.reset(); + std::cout << b.getBits(32) << std::endl; + std::cout << b.getBits(32) << std::endl; + std::cout << std::endl; + + b.reset(); + std::cout << b.getBits(6) << std::endl; + b.skipToNextByte(); + std::cout << b.getBits(8) << std::endl; + b.skipToNextByte(); + std::cout << b.getBits(8) << std::endl; + std::cout << std::endl; + + // Write tests + + // 11110:101 0:001010:1 01100101: 01111001 + // 0:00:1:0010 10001001 01110101 01001:011 + + unsigned char ch = 0; + bit_offset = 7; + Pl_Buffer* bp = new Pl_Buffer("buffer"); + + test_write_bits(ch, bit_offset, 30UL, 5, bp); + test_write_bits(ch, bit_offset, 10UL, 4, bp); + test_write_bits(ch, bit_offset, 10UL, 6, bp); + test_write_bits(ch, bit_offset, 16059UL, 0, bp); + test_write_bits(ch, bit_offset, 357UL, 9, bp); + print_buffer(bp); + + test_write_bits(ch, bit_offset, 242UL, 9, bp); + test_write_bits(ch, bit_offset, 0UL, 2, bp); + test_write_bits(ch, bit_offset, 1UL, 1, bp); + test_write_bits(ch, bit_offset, 5320361UL, 25, bp); + test_write_bits(ch, bit_offset, 3UL, 3, bp); + + print_buffer(bp); + test_write_bits(ch, bit_offset, 4111820153UL, 32, bp); + test_write_bits(ch, bit_offset, 310998347UL, 32, bp); + print_buffer(bp); + + BitWriter bw(bp); + bw.writeBits(30UL, 5); + bw.flush(); + bw.flush(); + bw.writeBits(0xABUL, 8); + bw.flush(); + print_buffer(bp); + + delete bp; +} + +int main() +{ + try + { + test(); + } + catch (std::exception& e) + { + std::cout << "unexpected exception: " << e.what() << std::endl; + exit(2); + } + std::cout << "done" << std::endl; + return 0; +} diff --git a/libtests/buffer.cc b/libtests/buffer.cc new file mode 100644 index 00000000..6494c5c4 --- /dev/null +++ b/libtests/buffer.cc @@ -0,0 +1,61 @@ + +#include +#include +#include + +typedef unsigned char* uc; + +int main() +{ + try + { + Pl_Discard discard; + Pl_Count count("count", &discard); + Pl_Buffer bp1("bp1", &count); + bp1.write((uc)"12345", 5); + bp1.write((uc)"67890", 5); + bp1.finish(); + std::cout << "count: " << count.getCount() << std::endl; + bp1.write((uc)"abcde", 5); + bp1.write((uc)"fghij", 6); + bp1.finish(); + std::cout << "count: " << count.getCount() << std::endl; + Buffer* b = bp1.getBuffer(); + std::cout << "size: " << b->getSize() << std::endl; + std::cout << "data: " << b->getBuffer() << std::endl; + delete b; + bp1.write((uc)"qwert", 5); + bp1.write((uc)"yuiop", 6); + bp1.finish(); + std::cout << "count: " << count.getCount() << std::endl; + b = bp1.getBuffer(); + std::cout << "size: " << b->getSize() << std::endl; + std::cout << "data: " << b->getBuffer() << std::endl; + delete b; + + Pl_Buffer bp2("bp2"); + bp2.write((uc)"moo", 3); + bp2.write((uc)"quack", 6); + try + { + delete bp2.getBuffer(); + } + catch (std::exception& e) + { + std::cout << e.what() << std::endl; + } + bp2.finish(); + b = bp2.getBuffer(); + std::cout << "size: " << b->getSize() << std::endl; + std::cout << "data: " << b->getBuffer() << std::endl; + delete b; + } + catch (std::exception& e) + { + std::cout << "unexpected exception: " << e.what() << std::endl; + exit(2); + } + + std::cout << "done" << std::endl; + return 0; +} diff --git a/libtests/build.mk b/libtests/build.mk new file mode 100644 index 00000000..4a58fcaa --- /dev/null +++ b/libtests/build.mk @@ -0,0 +1,40 @@ +BINS_libtests = \ + ascii85 \ + bits \ + buffer \ + flate \ + hex \ + lzw \ + md5 \ + pcre \ + png_filter \ + pointer_holder \ + qexc \ + qutil \ + rc4 + +TARGETS_libtests = $(foreach B,$(BINS_libtests),libtests/$(OUTPUT_DIR)/$(B)) + +$(TARGETS_libtests): $(TARGETS_libqpdf) + +INCLUDES_libtests = include libqpdf + +TC_SRCS_libtests = $(wildcard libqpdf/*.cc) $(wildcard libtests/*.cc) \ + libqpdf/bits.icc + +# ----- + +$(foreach B,$(BINS_libtests),$(eval \ + OBJS_$(B) = $(call src_to_obj,libtests/$(B).cc))) + +ifeq ($(GENDEPS),1) +-include $(foreach B,$(BINS_libtests),$(call obj_to_dep,$(OBJS_$(B)))) +endif + +$(foreach B,$(BINS_libtests),$(eval \ + $(OBJS_$(B)): libtests/$(OUTPUT_DIR)/%.o: libtests/$(B).cc ; \ + $(call compile,libtests/$(B).cc,$(INCLUDES_libtests)))) + +$(foreach B,$(BINS_libtests),$(eval \ + libtests/$(OUTPUT_DIR)/$(B): $(OBJS_$(B)) ; \ + $(call makebin,$(OBJS_$(B)),$$@))) diff --git a/libtests/flate.cc b/libtests/flate.cc new file mode 100644 index 00000000..0b5b8977 --- /dev/null +++ b/libtests/flate.cc @@ -0,0 +1,110 @@ + +#include +#include +#include + +#include +#include + +FILE* safe_fopen(char const* filename, char const* mode) +{ + FILE* result = fopen(filename, mode); + if (result == 0) + { + std::cerr << "fopen " << filename << " failed: " << strerror(errno) + << std::endl; + } + return result; +} + +void run(char const* filename) +{ + std::string n1 = std::string(filename) + ".1"; + std::string n2 = std::string(filename) + ".2"; + std::string n3 = std::string(filename) + ".3"; + + FILE* o1 = safe_fopen(n1.c_str(), "wb"); + FILE* o2 = safe_fopen(n2.c_str(), "wb"); + FILE* o3 = safe_fopen(n3.c_str(), "wb"); + Pipeline* out1 = new Pl_StdioFile("o1", o1); + Pipeline* out2 = new Pl_StdioFile("o2", o2); + Pipeline* out3 = new Pl_StdioFile("o3", o3); + + // Compress the file + Pipeline* def1 = new Pl_Flate("def1", out1, Pl_Flate::a_deflate); + + // Decompress the file + Pipeline* inf2 = new Pl_Flate("inf2", out2, Pl_Flate::a_inflate); + + // Count bytes written to o3 + Pl_Count* count3 = new Pl_Count("count3", out3); + + // Do both simultaneously + Pipeline* inf3 = new Pl_Flate("inf3", count3, Pl_Flate::a_inflate); + Pipeline* def3 = new Pl_Flate("def3", inf3, Pl_Flate::a_deflate); + + FILE* in1 = safe_fopen(filename, "rb"); + unsigned char buf[1024]; + size_t len; + while ((len = fread(buf, 1, sizeof(buf), in1)) > 0) + { + // Write to the compression pipeline + def1->write(buf, len); + + // Write to the both pipeline + def3->write(buf, len); + } + + def1->finish(); + delete def1; + delete out1; + fclose(o1); + + def3->finish(); + + std::cout << "bytes written to o3: " << count3->getCount() << std::endl; + + + delete def3; + delete inf3; + delete count3; + delete out3; + fclose(o3); + + // Now read the compressed data and write to the output uncompress pipeline + FILE* in2 = safe_fopen(n1.c_str(), "rb"); + while ((len = fread(buf, 1, sizeof(buf), in2)) > 0) + { + inf2->write(buf, len); + } + + inf2->finish(); + delete inf2; + delete out2; + fclose(o2); + + // At this point, filename, filename.2, and filename.3 should have + // identical contents. filename.1 should be a compressed version. + + std::cout << "done" << std::endl; +} + +int main(int argc, char* argv[]) +{ + if (argc != 2) + { + std::cerr << "Usage: pipeline filename" << std::endl; + exit(2); + } + char* filename = argv[1]; + + try + { + run(filename); + } + catch (QEXC::General& e) + { + std::cout << e.unparse() << std::endl; + } + return 0; +} diff --git a/libtests/hex.cc b/libtests/hex.cc new file mode 100644 index 00000000..0bd6354a --- /dev/null +++ b/libtests/hex.cc @@ -0,0 +1,36 @@ +#include + +#include +#include + +int main() +{ + Pl_StdioFile out("stdout", stdout); + Pl_ASCIIHexDecoder decode("decode", &out); + + try + { + unsigned char buf[10000]; + bool done = false; + while (! done) + { + int len = read(0, buf, sizeof(buf)); + if (len <= 0) + { + done = true; + } + else + { + decode.write(buf, len); + } + } + decode.finish(); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + exit(2); + } + + return 0; +} diff --git a/libtests/libtests.testcov b/libtests/libtests.testcov new file mode 100644 index 00000000..ddbccd24 --- /dev/null +++ b/libtests/libtests.testcov @@ -0,0 +1,18 @@ +ignored-scope: qpdf +Pl_LZWDecoder intermediate reset 0 +Pl_LZWDecoder last was table size 0 +Pl_ASCII85Decoder ignore space 0 +Pl_ASCII85Decoder read z 0 +Pl_ASCII85Decoder no-op flush 0 +Pl_ASCII85Decoder partial flush 1 +bits leftover 1 +bits bit_offset 2 +bits iterations 2 +bits zero bits wanted 0 +bits write iterations 2 +bits write leftover 0 +bits write pipeline 0 +bits write zero bits 0 +Pl_ASCIIHexDecoder ignore space 0 +Pl_ASCIIHexDecoder no-op flush 0 +Pl_ASCIIHexDecoder partial flush 1 diff --git a/libtests/lzw.cc b/libtests/lzw.cc new file mode 100644 index 00000000..38c8e541 --- /dev/null +++ b/libtests/lzw.cc @@ -0,0 +1,38 @@ +#include + +#include +#include + +int main() +{ + Pl_StdioFile out("stdout", stdout); + // We don't exercise LZWDecoder with early code change false + // because we have no way to generate such an LZW stream. + Pl_LZWDecoder decode("decode", &out, true); + + try + { + unsigned char buf[10000]; + bool done = false; + while (! done) + { + int len = read(0, buf, sizeof(buf)); + if (len <= 0) + { + done = true; + } + else + { + decode.write(buf, len); + } + } + decode.finish(); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + exit(2); + } + + return 0; +} diff --git a/libtests/md5.cc b/libtests/md5.cc new file mode 100644 index 00000000..e1c69bb6 --- /dev/null +++ b/libtests/md5.cc @@ -0,0 +1,74 @@ + +#include +#include +#include +#include + +static void test_string(char const* str) +{ + MD5 a; + a.encodeString(str); + a.print(); +} + +int main(int, char*[]) +{ + test_string(""); + test_string("a"); + test_string("abc"); + test_string("message digest"); + test_string("abcdefghijklmnopqrstuvwxyz"); + test_string("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi" + "jklmnopqrstuvwxyz0123456789"); + test_string("1234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890"); + MD5 a; + a.encodeFile("md5.in"); + std::cout << a.unparse() << std::endl; + MD5 b; + b.encodeFile("md5.in", 100); + std::cout << b.unparse() << std::endl; + + std::cout + << MD5::checkDataChecksum("900150983cd24fb0d6963f7d28e17f72", "abc", 3) + << std::endl + << MD5::checkFileChecksum("5f4b4321873433daae578f85c72f9e74", "md5.in") + << std::endl + << MD5::checkFileChecksum("6f4b4321873433daae578f85c72f9e74", "md5.in") + << std::endl + << MD5::checkDataChecksum("000150983cd24fb0d6963f7d28e17f72", "abc", 3) + << std::endl + << MD5::checkFileChecksum("6f4b4321873433daae578f85c72f9e74", "glerbl") + << std::endl; + + + Pl_Discard d; + Pl_MD5 p("MD5", &d); + for (int i = 0; i < 2; ++i) + { + FILE* f = fopen("md5.in", "rb"); + if (f) + { + // buffer size < size of md5.in + unsigned char buf[50]; + bool done = false; + while (! done) + { + int len = fread(buf, 1, sizeof(buf), f); + if (len <= 0) + { + done = true; + } + else + { + p.write(buf, len); + } + } + fclose(f); + p.finish(); + std::cout << p.getHexDigest() << std::endl; + } + } + + return 0; +} diff --git a/libtests/pcre.cc b/libtests/pcre.cc new file mode 100644 index 00000000..0df692a3 --- /dev/null +++ b/libtests/pcre.cc @@ -0,0 +1,30 @@ + +#include +#include + +int main(int argc, char* argv[]) +{ + if ((argc == 2) && (strcmp(argv[1], "--unicode-classes-supported") == 0)) + { + try + { + PCRE("^([\\p{L}]+)", PCRE_UTF8); + std::cout << "1" << std::endl; + } + catch (PCRE::Exception& e) + { + std::cout << "0" << std::endl; + } + return 0; + } + + if ((argc == 2) && (strcmp(argv[1], "--unicode-classes") == 0)) + { + PCRE::test(1); + } + else + { + PCRE::test(); + } + return 0; +} diff --git a/libtests/png_filter.cc b/libtests/png_filter.cc new file mode 100644 index 00000000..eef1aa3d --- /dev/null +++ b/libtests/png_filter.cc @@ -0,0 +1,84 @@ + +#include +#include + +#include +#include +#include + +FILE* safe_fopen(char const* filename, char const* mode) +{ + FILE* result = fopen(filename, mode); + if (result == 0) + { + std::cerr << "fopen " << filename << " failed: " << strerror(errno) + << std::endl; + } + return result; +} + +void run(char const* filename, bool encode, unsigned int columns) +{ + // Decode the file + FILE* in = safe_fopen(filename, "rb"); + FILE* o1 = safe_fopen("out", "wb"); + Pipeline* out = new Pl_StdioFile("out", o1); + Pipeline* pl = new Pl_PNGFilter( + "png", out, + encode ? Pl_PNGFilter::a_encode : Pl_PNGFilter::a_decode, + columns, 0 /* not used */); + assert((2 * (columns + 1)) < 1024); + unsigned char buf[1024]; + size_t len; + while (true) + { + len = fread(buf, 1, (2 * columns) + 1, in); + if (len == 0) + { + break; + } + pl->write(buf, len); + len = fread(buf, 1, 1, in); + if (len == 0) + { + break; + } + pl->write(buf, len); + len = fread(buf, 1, 1, in); + if (len == 0) + { + break; + } + pl->write(buf, len); + } + + pl->finish(); + delete pl; + delete out; + fclose(o1); + fclose(in); + + std::cout << "done" << std::endl; +} + +int main(int argc, char* argv[]) +{ + if (argc != 4) + { + std::cerr << "Usage: pipeline {en,de}code filename columns" << std::endl; + exit(2); + } + bool encode = (strcmp(argv[1], "encode") == 0); + char* filename = argv[2]; + int columns = atoi(argv[3]); + + try + { + run(filename, encode, columns); + } + catch (QEXC::General& e) + { + std::cout << e.unparse() << std::endl; + } + return 0; +} diff --git a/libtests/pointer_holder.cc b/libtests/pointer_holder.cc new file mode 100644 index 00000000..9176df17 --- /dev/null +++ b/libtests/pointer_holder.cc @@ -0,0 +1,81 @@ + +#include + +#include +#include +#include + +#include + +class Object +{ + public: + Object(); + ~Object(); + void hello(); + + private: + static int next_id; + int id; +}; + + +int Object::next_id = 0; + +Object::Object() +{ + this->id = ++next_id; + std::cout << "created Object, id " << this->id << std::endl; +} + +Object::~Object() +{ + std::cout << "destroyed Object, id " << this->id << std::endl; +} + +void +Object::hello() +{ + std::cout << "calling Object::hello for " << this->id << std::endl; +} + +typedef PointerHolder ObjectHolder; + +int main(int argc, char* argv[]) +{ + std::list ol1; + + ObjectHolder oh0; + { + std::cout << "hello" << std::endl; + Object* o1 = new Object; + ObjectHolder oh1(o1); + ObjectHolder oh2(oh1); + ObjectHolder oh3(new Object); + ObjectHolder oh4; + ObjectHolder oh5; + if (oh4 == oh5) + { + std::cout << "nulls equal" << std::endl; + } + oh3 = oh1; + oh4 = oh2; + if (oh3 == oh4) + { + std::cout << "equal okay" << std::endl; + } + if ((! (oh3 < oh4)) && (! (oh4 < oh3))) + { + std::cout << "less than okay" << std::endl; + } + ol1.push_back(oh3); + ol1.push_back(oh3); + Object* o3 = new Object; + oh0 = o3; + } + + ol1.front().getPointer()->hello(); + ol1.pop_front(); + std::cout << "goodbye" << std::endl; + return 0; +} diff --git a/libtests/qexc.cc b/libtests/qexc.cc new file mode 100644 index 00000000..db12d39c --- /dev/null +++ b/libtests/qexc.cc @@ -0,0 +1,65 @@ + +#include +#include +#include + +void do_terminate() +{ + try + { + throw; + } + catch (std::exception& e) + { + std::cerr << "uncaught exception: " << e.what() << std::endl; + exit(3); + } + exit(4); +} + +void f(int n) +{ + switch (n) + { + case 0: + throw QEXC::General("general exception"); + break; + + case 1: + throw QEXC::Internal("internal error"); + break; + + case 2: + throw QEXC::System("doing something", EINVAL); + break; + + case 3: + { + int a = -1; + new char[a]; + } + break; + } +} + +int main(int argc, char* argv[]) +{ + std::set_terminate(do_terminate); + if (argc != 2) + { + std::cerr << "usage: qexc n" << std::endl; + exit(2); + } + + try + { + f(atoi(argv[1])); + } + catch (QEXC::General& e) + { + std::cerr << "exception: " << e.unparse() << std::endl; + std::cerr << "what: " << e.what() << std::endl; + exit(2); + } + return 0; +} diff --git a/libtests/qtest/ascii85.test b/libtests/qtest/ascii85.test new file mode 100644 index 00000000..07551bd1 --- /dev/null +++ b/libtests/qtest/ascii85.test @@ -0,0 +1,22 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("ascii85") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('ascii85'); + +$td->runtest("decode", + {$td->COMMAND => "ascii85 < base85.in"}, + {$td->FILE => "binary.out", + $td->EXIT_STATUS => 0}); + +$td->runtest("partial decode", + {$td->COMMAND => "echo '\@<5skEHbu7\$3~>' | ascii85"}, + {$td->STRING => "asdfqwer\n", + $td->EXIT_STATUS => 0}); + +$td->report(2); diff --git a/libtests/qtest/ascii85/base85.in b/libtests/qtest/ascii85/base85.in new file mode 100644 index 00000000..0237ac51 --- /dev/null +++ b/libtests/qtest/ascii85/base85.in @@ -0,0 +1,43 @@ +70!<9iWTSm7KiWTSm7fWNCiWTSm8,rWHiWTSm8H8`MiWTSm8cSiRiWTSm +9)nrWiWTSm9E5&\iWTSm9`P/aiWTSm:&k8fiWTSm:B1AkiWTSm:]LJpiWTSm +;#gSuiWTSm;?-]%iWTSm;ZHf*iWTSm;uco/iWTSm<<*#4iWTSmiWTSm=9&>CiWTSm=TAGHiWTSm=o\P&M<.ZglicMP!!!"'J]"ig!!9c9E!!)4J#6=g,>KOe_2$i.E#lc1Zi<9Je!!!$!,nT#= +#\X23#\ZI(!!)7krVuot-+)V7#\Za0!!)7[rVuot-+Mn; +#\[$8!!)7KrVuot-+r1?#\[<@!!)7;rVuot-,AIC#\[TH!!)7+rVuot-,eaG +#\[lP!!)6prVuot--5$K#\\/X!!)6`rVuot--Y#\X2>!!)9Aqu?]r,o#>B#\XJF!!)91qu?]r,oGVF +#\XbN!!)9!qu?]r,oknJ#\Y%V!!)8fqu?]r,p;1N#\Y=^!!)8Vqu?]r,p_IR +#\YUf!!)8Fqu?]r,q.aV#\Ymn!!)86qu?]r,qS$Z#\Z1!!!)8&qu?]r,r"<^ +#\ZI)!!)7kqu?]r,rFTb#\Za1!!)7[qu?]r,rjlf#\[$9!!)7Kqu?]r,s:/j +#\[QcOH>QcOH>Q(M<0BV#_5(Ziro\gF:@ITK>7VbLuJRDs3dTsiWT +UG&;APTlc'+Liro\hahs3?M<0BV#b_gf"UKgtF:u(`!!!"Q^iTn'"=+Q:"UP +.Tahs4%OH>QcOH>QcOH>Q(M<0BV(lLfgMbOV<:]u[VM+f0#a$_0]zM,Y`'M$ +,*fQi6sbahs4"F=$ufM<0BV#`0NHMd6aJF1!q`($, +La&Mb=>67L4oV%#\-p0uu*'$.'3I^kop\iW4rW,`0m+FNP$V=!!!"m+QWb4 +7M_,io18?,Mb`F=$ufKYWH+F:?1n~>trailing garbage diff --git a/libtests/qtest/ascii85/binary.out b/libtests/qtest/ascii85/binary.out new file mode 100644 index 0000000000000000000000000000000000000000..f33a0b43d9072a5c64f814e256dabc1f8065a74a GIT binary patch literal 2048 zcmY+_F>D)E9LMp$!EP^-5hv8aLK$vwAVUX7v{Hs5-H;SRQn8Ny4D-j6>M`6go;Gsi?4hKQRl^BkQAwmebr9qCGN*+2yP-@=y4?^XJ``zc> zz09=4A~o`o$W`*PNS#~|xkg?QG327ib@F|Y23Zqnk{^h)$PY!XLV(e9ZunsDur;qb6;r;R2~ zVa5(KbqTvTRgdEm?y5cP;f}hDCvl>l#1$N>PvdFaP*<>z>*_POiUajDwr@@jef2qP z--H}i)IP3bPd$TK(4niY;szG=JZ|CPGkanpz#;Cd7w{U+)HR&oRDBh%w_B8|ns5ab4ZSJshZ8IK#gB6TFWr>Jay_r@ny)*j2CLAr|##_!tlW zV*Lr0oONG)8#_2tuVWXd>MwB#chw#2;g0$%Jc$$a7Ovn>{WYG(4Rsg$xURl~t2j_^ z;{f~WySRoc>J-ZCLoDhd zKE}g8S-*?r1?#^06n1c?E@2m^>Tz7cUA2cj+);csj1*lO{1D=+)&f3#>aIv z4Qr}6P}8&~z`mNsH8osO)4ZmRJv9w%40hEtv1wpY)5xZUhkxkzk3-y7)6ixOXKI?- zBsf*m*k&Df)ik&1;EtLGH(NMS)8wX$Lp6! z?CnQ;8$|4`?yWrfzQB0y-cIt*^&4)#;H;+2SLiIU2V=YWGUrB_z2^B%uP?>3PJE#l z2l-f{`LeS+Q!X+wS}5nEe0lKsGZ8!QX7e@vUG{mR@p8OejGE`}j2DYjy{VtavX^hC(YNgfxp=%BWwD(X9WC#0zYXu8;Mkk4 qruIg&&L*@YAIr_Vuk#4cjlZ-}wu9|7w@EJl`#d+&=%88LE&L6VD~eA5 literal 0 HcmV?d00001 diff --git a/libtests/qtest/bits.test b/libtests/qtest/bits.test new file mode 100644 index 00000000..f5dac7b5 --- /dev/null +++ b/libtests/qtest/bits.test @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("bits") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('bits'); + +$td->runtest("bits", + {$td->COMMAND => "bits"}, + {$td->FILE => "bits.out", + $td->EXIT_STATUS => 0}); + +$td->report(1); diff --git a/libtests/qtest/bits/bits.out b/libtests/qtest/bits/bits.out new file mode 100644 index 00000000..73111536 --- /dev/null +++ b/libtests/qtest/bits/bits.out @@ -0,0 +1,59 @@ +byte offset = 0, bit offset = 7, bits available = 64 +bits read: 5, result = 30 +byte offset = 0, bit offset = 2, bits available = 59 +bits read: 4, result = 10 +byte offset = 1, bit offset = 6, bits available = 55 +bits read: 6, result = 10 +byte offset = 1, bit offset = 0, bits available = 49 +bits read: 9, result = 357 +byte offset = 3, bit offset = 7, bits available = 40 +bits read: 9, result = 242 +byte offset = 4, bit offset = 6, bits available = 31 +bits read: 2, result = 0 +byte offset = 4, bit offset = 4, bits available = 29 +bits read: 1, result = 1 +byte offset = 4, bit offset = 3, bits available = 28 +bits read: 0, result = 0 +byte offset = 4, bit offset = 3, bits available = 28 +bits read: 25, result = 5320361 +byte offset = 7, bit offset = 2, bits available = 3 +exception: overflow reading bit stream +byte offset = 7, bit offset = 2, bits available = 3 +bits read: 3, result = 3 +byte offset = 8, bit offset = 7, bits available = 0 + +byte offset = 0, bit offset = 7, bits available = 64 +bits read: 32, result = 4111820153 +byte offset = 4, bit offset = 7, bits available = 32 +bits read: 32, result = 310998347 +byte offset = 8, bit offset = 7, bits available = 0 + +4111820153 +4111820153 +310998347 + +61 +21 +101 + +ch = f0, bit_offset = 2 +ch = 00, bit_offset = 6 +ch = 14, bit_offset = 0 +ch = 14, bit_offset = 0 +ch = 00, bit_offset = 7 +f5 15 65 + +ch = 00, bit_offset = 6 +ch = 00, bit_offset = 4 +ch = 10, bit_offset = 3 +ch = 48, bit_offset = 2 +ch = 00, bit_offset = 7 +79 12 89 75 4b + +ch = 00, bit_offset = 7 +ch = 00, bit_offset = 7 +f5 15 65 79 12 89 75 4b + +f0 ab + +done diff --git a/libtests/qtest/buffer.test b/libtests/qtest/buffer.test new file mode 100644 index 00000000..83ce4643 --- /dev/null +++ b/libtests/qtest/buffer.test @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("buffer") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('buffer'); + +$td->runtest("buffer", + {$td->COMMAND => "buffer"}, + {$td->FILE => "buffer.out", + $td->EXIT_STATUS => 0}); + +$td->report(1); diff --git a/libtests/qtest/buffer/buffer.out b/libtests/qtest/buffer/buffer.out new file mode 100644 index 00000000..9ee2b545 --- /dev/null +++ b/libtests/qtest/buffer/buffer.out @@ -0,0 +1,11 @@ +count: 10 +count: 21 +size: 21 +data: 1234567890abcdefghij +count: 32 +size: 11 +data: qwertyuiop +INTERNAL ERROR: Pl_Buffer::getBuffer() called when not ready +size: 9 +data: mooquack +done diff --git a/libtests/qtest/flate.test b/libtests/qtest/flate.test new file mode 100644 index 00000000..fe850b3e --- /dev/null +++ b/libtests/qtest/flate.test @@ -0,0 +1,73 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; +use File::Copy; +use Digest::MD5; + +chdir("flate") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +cleanup(); + +my $td = new TestDriver('flate'); + +cleanup(); + +open(F, ">farbage") or die; +print F "q" x 10000, "\n"; +print F "w" x 10000, "\n"; +print F "e" x 10000, "\n"; +print F "r" x 10000, "\n"; +print F "t" x 10000, "\n"; +print F "y" x 10000, "\n"; +print F "u" x 10000, "\n"; +print F "i" x 10000, "\n"; +print F "o" x 10000, "\n"; +print F "p" x 10000, "\n"; +close(F); + +check_file("farbage", "a6449c61db5b0645c0693b7560b77a60"); + +$td->runtest("run driver", + {$td->COMMAND => "flate farbage"},, + {$td->STRING => "bytes written to o3: 100010\ndone\n", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +check_file("farbage", "a6449c61db5b0645c0693b7560b77a60"); + +$td->runtest("compressed file correct", + {$td->FILE => "farbage.1"}, + {$td->FILE => "compressed"}); + +$td->runtest("uncompress filter works", + {$td->FILE => "farbage"}, + {$td->FILE => "farbage.2"}); + +$td->runtest("double filter works", + {$td->FILE => "farbage"}, + {$td->FILE => "farbage.3"}); + +cleanup(); + +$td->report(6); + +sub cleanup +{ + system("rm -f farbage*"); +} + +sub check_file +{ + my ($file, $sum) = @_; + open(F, "<$file") or die "open $file"; + my $md5 = new Digest::MD5; + $md5->addfile(*F); + close(F); + my $result = $md5->hexdigest; + $td->runtest("check $file", + {$td->STRING => "$result\n"}, + {$td->STRING => "$sum\n"}); +} diff --git a/libtests/qtest/flate/compressed b/libtests/qtest/flate/compressed new file mode 100644 index 0000000000000000000000000000000000000000..79b2da1bb621aa5f4e71817ee1c41b4eb767f9e7 GIT binary patch literal 147 zcmb=J^Y-9I-Ub5(<_)&>Mh1?7fmh$}Y(DW#f&m6T)JMXY3;_!4aJI+^W;mPGh!MtK k;9v%0GKieuhO=3Vm|$#&#uykAXreisEpmcAT0DRg06nr4`2YX_ literal 0 HcmV?d00001 diff --git a/libtests/qtest/hex.test b/libtests/qtest/hex.test new file mode 100644 index 00000000..32ec84b5 --- /dev/null +++ b/libtests/qtest/hex.test @@ -0,0 +1,22 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("hex") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('hex'); + +$td->runtest("decode", + {$td->COMMAND => "hex < hex.in"}, + {$td->FILE => "binary.out", + $td->EXIT_STATUS => 0}); + +$td->runtest("partial decode", + {$td->COMMAND => "echo '7a65726F203D203>' | hex"}, + {$td->STRING => "zero = 0", + $td->EXIT_STATUS => 0}); + +$td->report(2); diff --git a/libtests/qtest/hex/binary.out b/libtests/qtest/hex/binary.out new file mode 100644 index 0000000000000000000000000000000000000000..f33a0b43d9072a5c64f814e256dabc1f8065a74a GIT binary patch literal 2048 zcmY+_F>D)E9LMp$!EP^-5hv8aLK$vwAVUX7v{Hs5-H;SRQn8Ny4D-j6>M`6go;Gsi?4hKQRl^BkQAwmebr9qCGN*+2yP-@=y4?^XJ``zc> zz09=4A~o`o$W`*PNS#~|xkg?QG327ib@F|Y23Zqnk{^h)$PY!XLV(e9ZunsDur;qb6;r;R2~ zVa5(KbqTvTRgdEm?y5cP;f}hDCvl>l#1$N>PvdFaP*<>z>*_POiUajDwr@@jef2qP z--H}i)IP3bPd$TK(4niY;szG=JZ|CPGkanpz#;Cd7w{U+)HR&oRDBh%w_B8|ns5ab4ZSJshZ8IK#gB6TFWr>Jay_r@ny)*j2CLAr|##_!tlW zV*Lr0oONG)8#_2tuVWXd>MwB#chw#2;g0$%Jc$$a7Ovn>{WYG(4Rsg$xURl~t2j_^ z;{f~WySRoc>J-ZCLoDhd zKE}g8S-*?r1?#^06n1c?E@2m^>Tz7cUA2cj+);csj1*lO{1D=+)&f3#>aIv z4Qr}6P}8&~z`mNsH8osO)4ZmRJv9w%40hEtv1wpY)5xZUhkxkzk3-y7)6ixOXKI?- zBsf*m*k&Df)ik&1;EtLGH(NMS)8wX$Lp6! z?CnQ;8$|4`?yWrfzQB0y-cIt*^&4)#;H;+2SLiIU2V=YWGUrB_z2^B%uP?>3PJE#l z2l-f{`LeS+Q!X+wS}5nEe0lKsGZ8!QX7e@vUG{mR@p8OejGE`}j2DYjy{VtavX^hC(YNgfxp=%BWwD(X9WC#0zYXu8;Mkk4 qruIg&&L*@YAIr_Vuk#4cjlZ-}wu9|7w@EJl`#d+&=%88LE&L6VD~eA5 literal 0 HcmV?d00001 diff --git a/libtests/qtest/hex/hex.in b/libtests/qtest/hex/hex.in new file mode 100644 index 00000000..9721a35a --- /dev/null +++ b/libtests/qtest/hex/hex.in @@ -0,0 +1,70 @@ +45000028e20508074600002ce205080747000030e205080748000034e20 +5080749000038e20508074a00003ce20508074b000040e20508074c0000 +44e20508074d000048e20508074e00004ce20508074f000050e20508075 +0000054e205080751000058e20508075200005ce205080753000060e205 +080754000064e205080755000068e20508075600006ce20508075700007 +0e205080758000074e205080759000078e20508075a00005589e55383ec +04e8000000005b81c3b44c01008b93f8ffffff85d27405e8de000000e83 +5060000e840070100585bc9c3ff3508e10508ff250ce1050800000000ff +2510e105086800000000e9e0ffffffff2514e105086808000000e9d0fff +fffff2518e105086810000000e9c0ffffffff251ce105086818000000e9 +b0ffffffff2520e105086820000000e9a0ffffffff2524e105086828000 +000e990ffffffff2528e105086830000000e980ffffffff252ce1050868 +38000000e970ffffffff2530e105086840000000e960ffffffff2534e10 +5086848000000e950ffffffff2538e105086850000000e940ffffffff25 +3ce105086858000000e930ffffffff2540e105086860000000e920fffff +fff2544e105086868000000e910ffffffff2548e105086870000000e900 +ffffffff254ce105086878000000e9f0feffffff2550e10508688000000 +0e9e0feffffff2554e105086888000000e9d0feffffff2558e105086890 +000000e9c0feffffff255ce105086898000000e9b0feffffff2560e1050 +868a0000000e9a0feffffff2564e1050868a8000000e990feffffff2568 +e1050868b0000000e980feffffff256ce1050868b8000000e970fefffff +f2570e1050868c0000000e960feffffff2574e1050868c8000000e950fe +ffffff2578e1050868d0000000e940feffffff257ce1050868d8000000e +930feffffff2580e1050868e0000000e920feffffff2584e1050868e800 +0000e910feffffff2588e1050868f0000000e900feffffff258ce105086 +8f8000000e9f0fdffffff2590e105086800010000e9e0fdffffff2594e1 +05086808010000e9d0fdffffff2598e105086810010000e9c0fdffffff2 +59ce105086818010000e9b0fdffffff25a0e105086820010000e9a0fdff +ffff25a4e105086828010000e990fdffffff25a8e105086830010000e98 +0fdffffff25ace105086838010000e970fdffffff25b0e1050868400100 +00e960fdffffff25b4e105086848010000e950fdffffff25b8e10508685 +0010000e940fdffffff25bce105086858010000e930fdffffff25c0e105 +086860010000e920fdffffff25c4e105086868010000e910fdffffff25c +8e105086870010000e900fdffffff25cce105086878010000e9f0fcffff +FF25D0E105086880010000E9E0FCFFFFFF25D4E105086888010000E9D0F +CFFFFFF25D8E105086890010000E9C0FCFFFFFF25DCE105086898010000 +E9B0FCFFFFFF25E0E1050868A0010000E9A0FCFFFFFF25E4E1050868A80 +10000E990FCFFFFFF25E8E1050868B0010000E980FCFFFFFF25ECE10508 +68B8010000E970FCFFFFFF25F0E1050868C0010000E960FCFFFFFF25F4E +1050868C8010000E950FCFFFFFF25F8E1050868D0010000E940FCFFFFFF +25FCE1050868D801 0000E930FCFFFFFF2500E2050868E0010000E920FCF +FFFFF2504E2050868E8010000E910FCFFFFFF2508E2050868F0010000E9 +00FCFFFFFF250CE2050868F8010000E9F0FBFFFFFF2510E205086800020 +000E9E0FBFFFFFF2514E205086808020000E9D0FBFFFFFF2518E2050868 +10020000E9C0FBFFFFFF251CE205086818020000E9B0FBFFFFFF2520E20 +5086820020000E9A0FBFFFFFF2524E205086828020000E990FBFFFFFF25 +28E2050 8683 0020000E980FBFFFFFF252CE205086838020000E970FBFFF +FFF2530E205086840020000E960FBFFFFFF2534E205086848020000E950 +FBFFFFFF2538E205086850020000E940FBFFFFFF253CE20508685802000 +0E930FBFFFFFF2540E205086860020000E920FBFFFFFF2544E205086868 +020000E910FBFFFFFF2548E205086870020000E900FBFFFFFF254CE2050 +86878020000E9F0FAFFFFFF2550E205086880020000E9E0FAFFFFFF2554 +e205086888020000e9d0faffffff2558e205086890020000e9c0fafffff +f255ce205086898020000e9b0faffffff2560e2050868a0020000e9a0fa +ffffff2564e2050868a8020000e990faffffff2568e2050868b0020000e +980faffffff256ce2050868b8020000e970faffffff2570e2050868c002 +0000e960faffffff2574e2050868c8020000e950faffffff2578e205086 +8d0020000e940faffff00000000000000000000000031ed5e89e183e4f0 +50545268009b050868109b0508515668f0e60408e893fbfffff49090909 +0909090909090909090905589e583ec08803dc8e3050800740ceb1c83c0 +04a388e20508ffd2a188e205088b1085d275ebc605c8e3050801c9c3905 +589e583ec08a110e0050885c07412b80000000085c07409c7042410e005 +08ffd0c9c3909090909090909090909090905589e583ec188b45088b4d0 +c8b50048b00894c2408c744240c0000000089542404890424e897fe0000 +c9c3908d7426005589e583ec08891c248b5d0c897424048b75088b4b048 +b56048b06330331d131d209c1751a8b4b088b46088b5b0c8b560c31c831 +da09d00f94c089c283e2018b1c2489d08b74240489ec5dc38d742600a12 +0e505085589e585c075088b4508a320e505085dc38d76008dbc27000000 +00a120e505085589e585c0750da124e5050883c001a324e505085dc3908 +d7426005584c089e5740cc705>trailing farbage diff --git a/libtests/qtest/lzw.test b/libtests/qtest/lzw.test new file mode 100644 index 00000000..abb412d4 --- /dev/null +++ b/libtests/qtest/lzw.test @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("lzw") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('lzw'); + +$td->runtest("decode", + {$td->COMMAND => "lzw < lzw1.in"}, + {$td->FILE => "lzw1.out", + $td->EXIT_STATUS => 0}); + +$td->report(1); diff --git a/libtests/qtest/lzw/lzw1.in b/libtests/qtest/lzw/lzw1.in new file mode 100644 index 0000000000000000000000000000000000000000..d95d596cbbb4dcd5e25839a55c0e19ecd0465c9c GIT binary patch literal 64355 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%0A*%cGWY@VX-CKb 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

HxGOJJtl%&xaB& z)Z0Wk_JHv7{QUh0*T&NaG4=(V-Ua*SsCQrUl6zMM`CYekES)M!nNP@<50`N?175ViK%Q(L5}e7m48` zB&4+6JN?pnGPZ#j`Y%#{kZ>A=_%g~|9sq0bjMgu$4&}@Oul0L(V+A*$dj-&rln#)w z>7n?{8t1wRH-lv?IONfjHp0Fv0RVk&kY^e8}KRv;a)Uz1S$5Dh5jJh?&BaaIf;xkQkF^nEG5Kolq=`0b->(+IBU@8 z0wLN%mKKtZ1;K($V9Y+a{rFF2)V>C8ACZ}r&sYb1oqti@S-B?}hHn3Py$y z=b=z+7G_-n?0XUEu*fa+TTsL;r=tAJNSy%oLPsWaB%|4OzI0IJx_SGvsFM=8{k&%wFUVo;N;I26 zR)J^M;f2}$ z#4R&<`$?hT@Bun#UqM*sprzR#MK%WDB@@K~R8c06Q3a3BUV|j%eB2f)^aZl*0=rdA fE)98FMDP57cLwQh;Àô1–Ò_¿ÏX4Ì‘µƒ±Ž†å_÷þ”¤g·Ä'Ÿ0mº;bŠDG?­GÖûõQ¹°1ZgÍâG»ÿ‰çOe0?}PBóÞ@´ÆžÉ—ŧ°æõ—ú~x3Dúüê{úZH[‰—/DÑEa^¾¸Ê¥ÿ•7e.õ¸†_}Û¿g¹u¿ó$úèÍéóç_«ùEiŽ—^*½tWˆñ©%&Ü@‘“HïßK”#ñâŸï†ËM!Ç,åéѲY’ +„'j^B²o ƒû7#±p]²*¦ÑNáfäÀø¾QH‡òyZ#aøYŠ÷”X«ŠÙd¡Ž g•S¢S}í³Z“”MŒä^Á h:§á]¿h#…%¾a+ÔË”Ö[·Ø(Î1 ïJ”UåTÏ5*¤˜’H9lNl+d…\†Ysʳ6Y%YZFl‰MeÀ‘nm ͲP +~mA=tÈh-{,!)ÌReÚòÿÆã’ë’!…{O â'C=èYª&8`Ì° _a“¿S<µ"§ ƒrœî“Þà1cÈð¾s|ë{ϸ†˜½õPÐ4‘ýM=$;sµ„²)Ã’th$zê:-on©ls¨L~_‰Ïë®Ìýæ=‚»_à‡?`ø¹KÁsJ$"õnáøˆ·z æ (B6 DêQÓˆù— ;êf8`ø6•ZêÅÙvª”Ôtõ)ù29¿…§ŒB]D¹0ƒýîI"˲£BK¨¨ILOPÃ(R€"×óasAeF´èeGlöyPꩾYuS…šjk¹tZÖÄ 6â¶1y1, G”ï[ŽTÏ™«É¬ƒ1êJËœâÓigL§É—-ÒAѳª¯gëØ„ K½Ä‹U3 Øê+]¥r›:êyr]Nx©T(½n#Õ;U”³ƒ ˜1£ã­ÀÆ¡2GɆ"¿ëø†^0*8Q ¨:^b¢GùÎeÝaE/D¸V –£¦u¨Ùì«ÀËIt­ãa¤6ô_Bê1%r{•ÍY:4ö!¦fN¢¡Žä î«I à‚®1¤”¡u)´ %*ÊC@p¡(\”T”ý¶]N¬l•\Y¥rïGÖ#;Г5¥tÞ “Ä(¹¥4]ê'\`íˆ'ÉX¡·§­'Ùt»môà@KÂë—溩­RªËæJ‰úù­†ÀStfÁÔ/#­onpØ%$O‡‚u3<~5ч™Å3a‹ÜK0Ó…§þ¬\€t^à h6A׶¦ÜR>ª\‘êc6ãŒÊ5‰¸ÒªOáQÇžÚÖh[Œ¦˜2àÅ¡z°½É' Šüà(äz´‚³…žBeiˆ×U² ¡!µ”© hPàh A5㦧VW4¨ðØ^±ë¹×!ƒÜÊõžÛf«Qœ–üœ¹)Ü™jCùM%4K]ë2Ø&t(>ÎÌ?S±Y†ùg­zóäáÕ­04?֥܃$¥cJ1iFT6u]z!‚º±,Š˜ç(Åa¿ä†ÚÉq[‰ï_eu’ a•c¦‰¹y0’^GÑÀÆ à oTbNÊyëÚ©†Ó$Îaœ¦šzrPÕ^).ð£¡G àJ<¢­‘Aÿ©=çÚ›¤ÖkçsØ·†ýóuwrorçöíû<òÝâî»Ð‹§ÛG¢0j³g²¹%•/:Rܾ Ï)G¯ê4ÉÂ#{ÙVõ1÷øA" ð Í'åðÛ‡°oí +3 Ñf½ª\2™æ¤Þ0öU2GÏ1ÁùþšäžzòOÅS$<.Ø©ŽgP=Àí”2éÜÏÂw©p’æ‚^y±¸¡ OŽ?ç–67ãÉr©$åô+à ÂeIzÄ!ôù=“ѧ×¹žY + ¯ПþË©=®O"Ù@†$)ïŸMœÕUêì_X9é“ÛŒð;28pmÇ[aFÁW¦™‚ð”º@-Ác”ºT—=šƒU¬†|½{”Tç}Éþyzø‰ŒÆÒL¹ð>C¨#· DU×Lc¸´5\±~§lÑûâF£»Âe’$çzŽÃ e<òeá#šl³»köžÌ”j·Fu¡¤¼wk†™í!CW+ùD1íÔ> +RRdÐZÂÁ.Ì€¢‚n©™C¹Úx™%êÚŽLr:ÅÂmç½Tݪ>GlYÑ Çˆ:EdØÅb­@çüYp§{*ŸíÄ'áo#À®ÐL}ªR¸ÿ€¨½(íBôT¼ù§íü÷Ê2 æ°E¾é‰åÕâ|JÂ|., Ïq,vÃ1 Δš§wm±—% Gý¾y$GÆ[YÉÚš{Ö´¶fŠeó†}1o¨ò¾>ª~Já0‰Æ"ƒ²à{‰¡–wÖŒc½NÚËêŠ^FeÙ3*Íþÿ®Úl# YCæžò}±4oçÉ>s¼CqåØe$ÕB%UN¼GAï<á5­|+’‹\#¯ç (ótu;ËÆF€€ +BÌŒõÈ1 +ÌA`8‘¡¼•]Øt"ŒK¬é$ùlRpSþ³% T×,ž*ù-Ëjxž ÊÝóÛ‚ø¢’Øò0}Œ ŽûËOòXQã‹ã§¡†2ßQc:‰m0µx†Sñ_ƒá5Údø ¾¤P"`[ {bZ³j™7Ü„‹Oܳá$²¢ßZ,§‚ÛèÄlKÙŒëØ_mñrŽ¯Y¯ªË@±´gEÂþf¤}/°<1z+r2³>HÉ)y»RÒ¼úþ !gWïsu®›»(/×õù +úvå]ˆä‹»Ü†ˆ®zj{V »ÙMT½¤ýH\ÒþÊ÷¾t»‡õõa}­êô÷°ÈÞÜ"» ‹ä‹\F­á¿ËµTÝ_¨°“»›¥ôÑ¢/.³‡Eöa‘}Xdÿ Y÷f³µÆÎx—øëXš¿’•yÁ7ª¿Ý59èN·¼Ö]Ãû¹ç5ý<÷v¿ªezvKrÑì`_û*ý°H?,Ò³Þ0»®ÍEîË&Q=®Ï¾Œ7áñ cö¯;på%AV_Ú}M/Ù—m~Þ=îìþpÐùy÷ÕþÑñÒß •{·?é…r}á/ßÿøãÁ¯òΊú»ôÍÃçž|ph;­ÎÆF§õ<Á.O.7éK‡îD­_ŒF³¶ÑäŸg››ð·õüi·è7ÿl¶7ZíoZÍv»ý´ùü¼o77ڛ߰æ";š÷™€àeì.CÎã^Q¹0Io¡Ûýú>᪞¥¡ 5輟òVEù‘¡m ÀÔè8îÇW|*PðAòÅ»’Щn>ð ^e ¸¨›ˆ‚KÞ&X·/’ Ùû|*oR +Ø¢ºkêÅv^ö=[kad6¼©ðˆ0cfdÂ2µÌ—¶‰¾Ê(€ Vh°^*×Ãvv#ò¥;_h"¹úu¤|?` +q^›sãhrÚº[åæ? +”£Yä¤fÍFŽÅ’8½e–È'™©Ãþ-®äÓÃD’HÙPKð_j1~Ã-@Ö‹¬•ø/÷à 1Ü™ýÝïgŸqð¼ášëK⌦|Øn0}µ…hqF#4Ø,[È-¶ª(².gt‹÷õLrLj i]ÈŒŸ ¸ˆHm*)­‡1rq)h‰„5±2hÜ°áŽïÅÄ 1$^ø +ûÊñý/â bªÐ<>öêKŠô†8Y}[f]@–r˜¯EµìSب{‡i7…ž&—eߢ尓r¢…ÄJ%¹^ì¶Ð: ;ç…œtbÃz%²°g©JJáÑ€ÕSófÛl­¶ì40|Ð[÷p1Î5‰YF1ц ¼Ø¼øºnÛàô¶,“…±©ˆùÜš$˜nYÊ7Euë Q€g: èÞÙ¶[‹n£qÔ'dH2YJ +q²mô5Süv) Æð ¹nÀ'÷úOVþl‹°) XË0q´*`M_¿4%Òxß-×ó¥ð²à8yYbîÆáoC/\ˆ +–2~-@ “v5°Ì-a<APÛâ'1ÅKv†¿3²Aæ~Ãyà³NE!” óÑ…p£B:r¾¿ÂM|1²‡}ô’zm-2)gèî†k‘J“ Ô„/?60WŸ¼Ói(nNT\()¹««ƒŽç|€á5ïš’[¿5?8çnjN3¥/¯iôGš =õ¨k¿ÿnöÍ'ès«Ör©RB“@ç2œ‚&:Î’!3ð&~FÒXõ²ïÙK;¬ÕwÏjU +­$y~¢ÑüÐ$³«Zy+6ëôSÊ‚Úãú㺃³ESŠ-^wû1 +b^kF3ÛÊ<ïÔo‚w2\4Ö[ÖÓ¡I2ìsw½ùþvço®®èÇñ:üÿäŸ!­­¬§™þe5ä*èãÑt¿Ï§\¹7hC X: +»— J“Òç¢gý[ #€Z}–n"\»Å +þvÈõØqrÍL!7Š#Îv {0x¶Â Ë>YHAŽ™‘ÝÐpu~Q_ÆFp·"Ê›pâ2‚×Êa }飼¼DE9/™ƒ`ËxÉ?kkÙaÊUßòà‹M»°³ˆ¶!¤¬„_ј£là˜£ë v®–ãkP¥P—^ÅDsû?Ó[%áYô©VÏùûã©a¦“³b˜Z$ä+NºŽ3-5‡h¬áÜYd Cvd-˜ÿÌŸaØ.»Sk×^¡Š·¯ñnγ‚[€¥5%a<+›]E±î*`Ö`­¦ã’½(Šœý0Nÿd«ø̼$|VÇCÛ»Æ7¼ÃP¤ÉL!|ÑÁç*â#.dF:9e—Žxu¹ûRs÷=ŸR7W›¥ËÑ¢úEØ%ç&%±è­ô,W@‘<“o4ƒeå_Ý®„¼añÐÄ êoU“F53s1 L|ÜáNø³j`Ϧ;¬v8%ؤØdJ°ãj`ÇS‚½¬örJ°ŸØBÆe–P*Âà“½C²m)88‚ëS!Øÿô¹×ë}ÑxTÜŒ}~ìO3âcâD§XRcnšÖ3W<ój%:òB\þ ù›Ëpr /Ãäš‚šr™-îM¦¶¬ž‚’%¥?gJíq"?Ê'ò—ÇùN¡dªåšU­UÅö›\+LI¿s –h†–žƒì^©%eìžQL¦åüʪÆTƒTu4dW¦ug‘i9])쇟 +з ±ÿ—m´óµç°ŠÀo?¯*î+¨×°y¤móYÔ5u6¥A&³Ó7茖FD ¶TYca¾Ù؆CDê?¶åi¾Ô(gÎÌ¡¢GÙ%Üßs–Õ„ ‹×³c±&s’FçÆâýìX,ýÙ€Sç9Ú·—VYµž_ÇЄ2óð÷!KÑþºb8I¾y“ }5«o:W[Ö†æñ%ÛáSò Âwœ§º“ŸòeŸ­\Zg+ÞþËû—yò6˜Ý1_‡BÜä¤á¿'&%X®äžgñÝœoñÒðY×2¢]‚Ÿe-(Zë¥Ôƒ–»[Ç“ +iücߢyáÛi 7÷cën™¾iÿ^p6ôY$ŽG©a{ü¾Ò>ëû‚=úh}s˜¡,”K²¥Û†·™³ÄL³òeDaÊ(—)º‡Œ âÿEÜ ¤µðdù@§æK• N¡-5¸ZШÔ&f'¼ç‰¦0ÏÆçU²´Ò…²§ß(D+î]·{å§ir²OÄrÖ2¨«†4½Áª†¹ú† Ý +"¸FxfÀ±\RŒ¬Š2ìúØ\é²ÚB< íÖ…ç ]TLÅ¥E¸ ‡¼ÙÓï¢`#ÓŽÙ->掑ysXNA¤ê*$¦ Ýîäà ükœÎÞ{d´èWH¼{ÆÓ‹âª{d[ÎàH‹” Ü7âÎШu ¸)ü2·e9‹ü—|?Ÿ;öSr=4•¹þ*‰à2£Û¢†Z3ŽÅávLÒÉëx?»Â/_Ä0Þâ^(}ꢡiY—‡tQB0$äSƒÚVµ•»ön¹¾óÕ¬ëâ2{¼œ–,?øyZš¦;~Ó ™kÝ0•SþÏ +:×Á^|bçî튉sÂdØE·¶dšv&¿h_kë ‹@ì˼røžfw„&[•7.sJµö¥(_ß?–Þÿä8 ôU9äkK‡o;Ç'¯:'ûG»'oä£Ë¤;«ÜóøKð…îNpÞÐ96]Îwä­$ìÁñ +ÃQ6îx«s‚C¢gpù_N¥ ¿§¤vt]]­ñrÒsïPl³JÕ¸š>KÍ•™Ú{Yó“‰]Šèaò’=¯¾¶Œ@¯µüõ¶|c7)4yëΘg4%×:!øCf ͤwU_­Òúñ +ù±ÛQöý2S¶“í jÎÒ³¦Ë™ûУYæ1s®ýzgö}üâÉúÀ~˜^x¹bîð@9Q‡ð-Ú9ñÚÍææ_6ô»ÑØ?ÙY³4_ôŸW‘&LaÙœðoÌ8X´.ÀãÍ–«$€Ó`NrŠ™ÁöèR|èÀ³'ÄéÉÑîÁÉ1ˆÓÎÁáÞë÷¯ö_9ÁxŠJzÃúì½=üñà' +ë#eÿ SÄðû,:§~‹5Àç—·GÿØ=zûþðU,®ì*N>I<ö,ÀFµn—,m>+Ð^Bõ¿ÛÝÛ7"ìðû ^†ÄUœ+MÛê·° Ã*¨››3*Q6ÐQq›í KÏ UÄ$ê«ý½×NTvH­±ßÔêdR4Cñ8áM,³”êKü%(8P‡ttdB”þbU~“h8ÞhwÄ-wlÙ +$›ÏÆ’–7ÇŠ(tššD‘׫CT i6Â@×uœx¢D]èž>`]Y;S¹3ŒáØ  ÷Ll§F( +¾³2œøöÝzÝꀊ˜¤(oOÚÝׯ EÐ ’¹F4°¡Õ·§†Ø%Ñ H®Ë! ÝÚð¬w2¢"0q†·÷aĪ6`£«hh”¢Âo¸³pŸ˜Lu– +G"js†EƒS^Â|"숒¡úÂøn9ÇügÍÁ¤JëRµ:Ô´Bq`Ä”(eÔ2ùÛÀ² ‘¿¶<²DÐËz(¢s83a9²•À¤9›ù‰5ƒ¼"ÙPIŠ²ó‰Á«¯@^uS”Ý×¢P¤ª4Ì€±$)¯„ìÎ-åD³æ¬Ö ëJá/@â-ª¹rošNK?Qmf¨ê?È@GÝ$RÒùöäçý£Î/{?ïuNDpHL‚}*Uó É] Üõº +ûýKiï[_Œë߆iC¥Kx‘“ÑQ’ò{äÿ\³ÓIÔïÑíú'ÿÛÝ’Ó™\YíÍñ?÷Ô%º²º¨¶Q¯$±ÞÎ%¸-sƒËW!Íé\·¥»C*-ä]V•õy¥ÈŸ®+ù¥$¨Ï¿Øh˜B.óf ”­-`y¸™þå.³w°xé°kϼ‚¸`’%'T¿6ºkµz!¦~• àÁl·Ÿòøÿ£y‚ÿSfÿo>mñgÊþßnÿ>k?Øÿoåóÿÿæâÿ‹™3§ù_ÿÿÇpÂ5ê7q’ð…á—åcð߈è¿ä ÑbüÿãÍ»Üÿòo3Ë!‚ÇxÎ;á˜?·¾Ø*ÏY ÁÇh¢PJ@‘ßÎ<…s\½-oEMÝ‘àÿ[ëƒ?­åŸ©ò_o¨}–„aMb&œx#ðKêgªÚ2 ò<¹Å®EûœB>&•¾àY(5\g­&Pû"üV êë½PÔ +kÙüõ`XÝ©!võa¹¶Äó{™E>_ùã4qi2Ä€ }ÐÁ\…+Ïó†jA¤¢ h½±ñ’-}†ét3ÔÞˆì.—é7{Éšømàä¸â%wj…w4EO1“[]Þ8È2+ŒÀæâ3—£À‡D¼Åze cþ!®­Ñ_°Nò‚Ü7ÃÊÂETcÖ ˜u~Æ\e¹%wjŠ÷ç!K™ I¾ÝÿY^f&&„ +léÂ,uKNaZôn§„é5ÝJ(\¬¶D" 8 ³q]‡Ö›Òqe„—÷T +d,iÜÐ/ðçȸ2R¼¦F‘KyNÚkX-ä¹5GŸ‰IeŒâ€ ¡«D[ó¸ÖÒh³ZÄ^°3\¼©ýÁvxa‘ÙPwü·èôÓ|òLJzÝpó5ýÇ÷¶~ýCßeË4ò2ӈц Ê4ŠÑJjÿa9yã®Ë-Æ @KG¬QZ)/œðÐr]´Ôºþ°Í»·Ÿ¢ýßÕF{!`Åû¿§›OÛÏ!ÿÛ³Íç-þü¿Z|Sø°ÿ»Ïƒÿ×¢÷~¾Y3ç°²X¦mïŽì^ªª×WqÙÌV¯ón÷¤³ÿëÞþ»“‚=Û†ðS7KÀD˯öÜ}ÿ:ƒn±;Ñ¡#nצn[öRyòó_(ó°¦@O„*=˜ŒiG\ˆû»£ƒ7»Gÿ‚>ƒÏr>Ââp £Ž J¿ýáö÷N:{»{?ï‘[ ãŒäf÷"tãæÜ[à€oéo£$8ŒOõ!o¼¹‘뙧\l i{óùwÏê¹¾oL&¶;Ë&éC+yÈ÷R=0S¤1ßJ 3Á\wytÿ„Aͪ$·^Œ¡)±ƒ;Ã+ø¼Nó + D‹mžÚm©3¾~7êÑé)N˜®ñ"î£A†‹›×{¯Ö³õSŽ=$('/`?¿Ãºàþ`<@z—Ÿw_½Þ_—øcÌ.ÐÑQtĉÄÈ[ÒÌå÷K4Üh³ÝwS®xÃȈÉÅ/"`§:v0sN«ú•=ubcÂvšŒ: +0(þ󥌯¡›ãPòf®¼ œÊOÙgiÍ=þ ŒvYÑ*¤ ?Óµ¡ó Þ½úmÑ‹Z››^rÖøÛ·1—š2ºöX]ÆÝcM·Ö\ œûåé›@`¾ÙØ7¤)ÇÓ:'ç4g9™-«« Z3 w¹?ňû°.jKu¥˜}J[;Ø4,u]àÐãPêÈu«£YŒë”~esü­ýXy^!UêLÂRº;¶ \!0iXØ°+9§œÄÓëÌMÏZk2Ì°6Ö Iájhƒ ýØwµZ–·§_obýt¦W…FÆK.äFúÕçŸù!f˜æšd +Ž„˜Â‘+ÐC¡‘’·&P8ϸ¾:NeŒ*¼OS![´·Y:¥ò¾2z-}w„WO]úîh²Ð £‚p ROBq-8}ÛYŠ†}ØDëZ^Ä„!k+Û*uG?¡‹¶5Ù8Ùåå/ö’õsnåòZ?¸†xU@êù)„㋸'î”%á¿'Øt(!•Lã9 ’$¾ÒqÊfØsXè0JEä²Ï#s¯O»n˜V…A0z!Nî2XÒkαŸ(Ÿ•£‚`?ò-DbáõÕ¥n|áD´2¢8@(4Y,B“ßU"ñL.í NxF8 ÆùËuÈ•Í÷]«E²O•Ãàuö=kò‹ÖvDä-} ”Á•B±wL”³ælnÔ£³¤Å{#¸#/ê; µ÷š PNL¿ºžjþ®’䓸]µ-±~ÎØÖ0gÚõšV0Iý\ 97á}^Zö¼Î¨ú™¾è–p™’ùk/4?EË|‰³[lHX*4’éoiúµš¦‰A˜¦Á9¸#äO:™ Ž¼}õv ¼äùjw¤l 6-ð‰²à’£?- 6kˆäËÂU¤@N¨¥£H–ø¨dJB¾'ŒP)À¨Ålw‘¬[Ä°M’Qœ +_W¹Iç_„K¯ÞvÁKt5v‘W„9ÇÓôqÐÏ©¤ 4}V“•E€ ‹Áø;.ZòøK›Sä<â=ÆD{PûöýÙzr@L°¨n±o͈ÂX7È«ƒ°òµ6aüß8Sd0 Iå Íi’† BÿëÆ—eÆѽÊŸ² äÈz؃µ@ÝÌ#HĵÊ·p¡(om38áÏ+7>mü—ºz +Ò´dìÐd&WJD ¯ˆ¬ôеö Ë+#€Ãè Áÿ¼t‡òä&¡‘¸H™ð¯øÛà¬?2Zÿ’27Lô “Ú²V g‰I2ª_‹L‚‘Ï ”]^f+üou¸—ž¹(B.U:£Œ“|By¼Ä„|UcYEКŒV¢ÄY2hš5…EBÚNCj1#ìŸöz…‚ë:ff½  Iå/E[ µIàr]Þ(«²SÛƒ¬M „Î;Uv ¾MƒïòmE%½la-[WqY5FVÑš¼q +m¿@CË™P™ ¢¼{u÷Ù1A¶Q® £Xl*øUP¿: µ»¼=¶Œ°|êgá(kMØ‹ >?œ|PŽ…V¯}…ŒNµžA§4Ò¾âè",yôÒBë},ˆ„‘tVÁK÷àÕ¼Œ‹ÂÔöjþìÏd.Œ žÙÍ窒î}»ÌM&FOvOöÀm;<©9%i7Ajz &|jn6›u<ºL¸¼? Ù^ ÷_Áð´¦…<F]ˆúŽÀ¿+Þž8ˆ/„¼qvÆ g]4äÁ{¡ÌÃÙ8Ž 'ÿz·ßbçI<-Íe³;AëÊn _”ÊèÌ–•cPv•¦·Xwè‘r þ:&ˆtsõøÚktP6(>1&;KÒ 6`´vXÙ¥­f$²+ØxH{ÑPÍÔ'¬žëL|dÙXÆvPPÝàæ¼)ˆÓâÒì!´ “°€:À1È!67i²¼?YWF&ähùöÝp9¨Z‰æ6ÎHA×@ÈEµq(oì"CO¬ø[òý%5Y®‰â¹ÍEäX^Á†NÃóhíßTã‘ÉRéh|òÙíÂx9…CœÑd‹BÍiv+³t)Øî†Òü/ŽÑ)oòc‹ÎìþA´÷—;n¾H÷ÂO$l)µ_ÿ^YÐ d®Hï@3]¾*Äñ}ž¶mó ­¿ø&²ñƒð7 ˜°ñ +[ÕºRœü M:MÑeéc²RzP‡-mÒÌýhÀ½° ¶5` W0†ïA.[Ö’‹°?ÂÝŒzX&õp&Vfæó`þöÕ^ +«oasêÍ<e\ïU‘ð \Â]‘‹0 ERµ”RªÉ!ÆrS8˜ü^‹¹‰³@@ò½’2SöÁ)‘ Çæ-'€ììmÙ¿'C°j\´€Ø)$zº +1V +ïKdÜsÊl"Rwñ5”Ê©Wâ.~v…ú:z>E<ËÊ<«Vî’$Í]”è½oYRo¼ “3|M-«’ý„¯K2ÅY"õ(EŸÀ3CN>\~Ò7äÁ4øUO†x -oå „Û10Ù^¯s]. Õa œªÁÂ[3vÂÌä~6¦@=Ì…8uçÌ`9‘ÃRUɶ*ýLÜ«riev Æ´ªâR>òS‹«6]}]q¬1›ÀR†B®Ö¬W ~ÛÒzv%,/gSéŸٵÀ-i0Õ¥O)ðÀ¨ªl§tÊ뫉{ sd\å€G¹¬a=’¼’s.ú·èŒ=¢k½šòÿ9ÙóîõîɾNDûç£÷{üûqýw—Y——Ù#q«B…´­i—ùŸ*­ ¾e¯V±ÓùáíÑëÝÃW{¯Šþ§O[uwW‹ã¯–Œ¿É#·Ù”,®hÂMEãf? •mI3eÃìãCŠ‹~‡Cð`M!µ:Dí÷i59a·@í¬™)ºý\,wžyšŸ/P†zrúWÎ`ŠJe7ë õÇ1) (£¢Û\Sß||;Ïo‡³m¶Î°`o\/„˜§,s?N4ê¹\vwî?N®PnS;V0yh‡›pÌsÑÈÀ,¤Ä‡–p0 f°°¼ÀÕÔr)tæ÷ù¬ñ̓ÕµáSœ¸ZÛƒ¦I¼æm.@zK¾Ø)£*†·Kb‚ÁX QJki/„[º·€l4("lN•w—´*¼uÃ7` #‹—}¼Hf’ }šê¶,%ií@Ę Ò`+À uúy´ I|%ý +ýGuà»àùê!lɨ¼™Œ'¹iR¤nT¨À‰è2mŠBGÌÛTT¢Qõ ÏYY¢–I¢£>0kÿµ×ñŒ’âu§¦ŠØ®(ÅTfI…Aw¿ÂOÎ9vã<—”k2"œÏ}KŠ.¢üm}]7¢ÿXç‘ú¤1?4–¿rö¨rÛ¾ “Ý(N=÷ùžQÑö/”@â\Ã^^tu9ƒn'âÝEœs£Fšt„H…_ qö]àÙiR.ÿVJ•ñà›½rŒ ?^³ópúGÖÿXs1·¼:²Tµ¢Oä¼ÎÓ¹RYݬ|:.Z´Œ¯ÖEÀŽ‹‰|R “êˆÔîϨdIž‹W.Lf/¤‰µ3 +':ý}ißMzóþdÿ×ÎÁáÁ‰=BXØL½MÆ›¼<0i<ªÏÕŸØê®Ã:Wþ”çòDвâøßív³ ùŸÚ›ígí§íÞ†ÏCüïÛø<Äÿ¾™ÜOžY³´  à—Pâdâ*ØlTz•ÀeÜQ˜Œ£0'x•èÚžtM…J:ƒãñ¿OvEË}Aœk.² Ã^iôìý££·G`jí½ höá[¾N½Úëî¾Ù§Ó=Dš¯É¸Øax;†Ë3¦yú’ðÚZ\Ç7Ž0 Ïd„‘àåjV~MĤöcC.LrK*Ie—kÒí§Ï 8^Q%£í›a›â‰i¸eâzÂZÚ›‡¾à»•[˜bŸæi¦± +=³%Tï1w/7,Þå‡Ib°10ãà4âÆNÞøû¾j4IÎ ªºë!«O[0äØ0*r¤i°¤¡ëÕºàRãñÞkâåfdA¶Åj¼ÜŽ·ùÌ '¸.ÙÁË|é ]´}ªÃY‹²¨»ÞàëL]x^gF9Éë³ðµóÊè¶0IU„bEŸ0~ÌÓ‰iaýÌ+n‡ËÖN°·'¥%×Á÷:| dfÎï܆E0ÔòÕnnŽq!ñÛ7/t€ã÷~ýí†ÆÓ8=ët܇oå3 +ÈúæàìŽê']5·ª«5ãàðäèàð˜ooD8×:Þp@îþjÜýæÁûãŸNðÝ=!e.š½SMÕÅÌTcA¶ÿˆe7Âh¶J|b÷Òp ·È÷Õ×]UÇ/åLYûf÷ûþàuM˜ +Éším>Ö¹Íþü³¨dR¹ä™SÒã.CË ‘Ó?ñý8»ÎPíï3Tûîé¤TÆ*Š2¶ÙÅéW“ +)hþ2°èZ¦ÔÂ3WÞýy3 +CÊ]Ê7ÄèÀ,êa8pî÷«m\ƒ +qŽ¿Œz“ ÉBŒäBa*ÓEŠ Œƒ¸&°Óh G/E¨p®PtF1f>ìp˜ç¡ù Oý<÷ÒÚ䆣+³š³Ì8¤ñ_fI®‘‰×?EÝø< Fœ"}LÿÉ÷[úXf¾ñ3g‡ +Î ³#Q“· ±kÐÿ ­ÖQú#’á¿ùÈX(Id¾lç‹Ÿ1óú‚•ž¯æ¸©ž°^0~{ÞßTÙ‹ÇÁã{܇†ðÏþÆžâœYEþ:áEêŸÞó>ÅþÍgÏŸ?ÿ¦ÕÜh>Ûh¶77Ÿ}Ól·šüуÿß-|rüÿZÿûwkíf³ý—u¼Q@wætçý§Âˆ³¹«8ù$`À+ôòû禞(øÐéÍãß—St~Ï>×ËmÉïåf:@˜Îu.V¸$ç‹ì¼Û=:9Ø}Ý9~·¿Çÿü/Žq=«ýêsIò¿r¡”‰0q²µ¥ +BˆÝó˜ï3O¶sªâ²O]⣟ä…Á4IPÏ+wÿ]Üy’‡°3ýOò*$¡«*¨':¤¥uç_›%OŠš*+n-?ŠºÂ²§‚…bîÍÒzî°„'—”7ªè‰5Ì拳3úñ²‰²ÛfÂen<è°cpîcDϱq"¡On­»´ÏÈé´x¹Ø®›¶ò¢ÙŽV–L)æ'™a>Ô,…¨ý·ÔÓC—Vü"”¥Mez¬Mèň›m¹•÷÷ûW1†O(y¨Èöy°÷÷q2vLnÅhY¾‡71NÙ<`L!ÞpR6=Új1²ö´Æ²Šc‚f¨ÂÎ9¬9†G·UÜeO‹†¿Ò:ãŸøžøäuçÝÛ£˯³ƒ_íÿðþ§zel­èœòåBÙµ àó\›1ƒ–ñË1x¥þ4*WÓôv‰d·2m͉Àz¢íã¢ËúU:á´$t™©µF••Ñv±9Ùa4+¢)Ç£»/líYªpÿ/ y¿»áÌ»ÿ +ûÿg-¸ÿ×n?m>ö´Å÷ÿÍÍg͇ýÿm|öÿ7wB¢.àêß;™U“ Ž)Õúx4áÈð¿|•¢û€i$Ý  +1k4ëCîªâú0†ÜDp îíC†ÂsôÙEôÀè.ÄIÏíôšz È7 ëÄÌ”ò‡'ÈÂøjXb› /Gû|ë¾·_d™ÈôØæ7U¸Òþ-Rû@HqyæòCÔ‹87-ƒ¾û’$½ü%ŽØl8Ì’°5ç%Y#®±ûñ¶Í‡+I§¯Å1,ªDš…ìCŒ_ˆ“'qæ´ÌÂ+«.œÎ㢲œ»»³~ ¢BÁ7 ¶‰Ï…³rð1×Ýyƒa¡Ê¢‘ˆú ˆcÒmˆÈs­Nµþ°SÙœÕÕ¨ËÙÛ}4›;øÌúT«¯‹.™(Ì©è siÂKR“5˜ÄNˆK3øµêjm%ªÿÖü°n'3¥~•õ +±ëÄÃþµÝ/7ëÔêªÊ~õåFFžzãzqLÈzã”ø%W%a%\'³*‹©[•Ly!‚—‘»%«ÄY®I;â`W Æëˆä ’²É3®ÞËÍ«l7\ÖïôƒÅз ã*ö—1©DàA>ZÚç‚€EƒÀ˜«„¤eÔ`©Nì$"8Ë‘tV—²èF_õ˜ÞÆ4º§Ãœ°Þáž{מc “…6g*ËÎþ¯Âþ?¸êœNÀÈ?«  lÿ¿ùü™{þßzþ°ÿ¿•ÏÃþÿæöÿöÌ™Óp\7w ,â„m1¸y%Q±>÷aƒ´ûKç.Êör·öN/˜½·‡?üT¬‡/Dgѹ¥G– úçq/;ÆÃ._x;;+c9axæ¶.Ã1¦›íŒøÄâŽæàɦ€xBKø^®0º‡d¥ŠÜÔàððP] ‚'¹§o:pñŒ¯³ß5œçp‰›?Ž;Œ¼ÃS þE{§´…vN ­j-l–·°™ÓÂFµ¾+oaN*µž•7Ñz–G§§F# +€S[5%îŠßõ­-³dc) ¿BU(‰ÍÓÑ.)¨ ßR®Sçx番 ß¿Ö↥p†/œg/ùB'N,uÿ…ÿ'SGz( +¸ð“ô4fºµ%‘Û"CÉ@ʛ石Ÿ«Â> –e•Ó‚¾V:ÐÐF” +ØÏÅAâ€J¡ÆN¤V5Ÿè\~ +ÞþǪ`Zx¶¶TØ^ØÇa Û4£ƒèÈÞ(à´„:v[Œ.œ’°ÉT¡ _VÇÊ¥^¡©‚­1¼úB¤hxþñp'v¨d¦‰=ç +&Ø!Z*ÇîP[n &8OëJÙÏ]‰¸²‘Œ®Œb¾áÊ^?É€ üC&F§ D + u¾¶DrÜMÒ—Ó/¸ýœÅz +œ"¾ì~ª‰Ugœøs‡è{½b¨vjP–Ð;#äÊY³ÛƒÄ&]žö![=èCÞz'1+×Ù.C31ŠSÎ’Ar½•mX³f1'bÊ@HWöë6Ä!RéU0ª“v/ê9¹œAA9!% Äº1{­2tJÀ”ʾ'yƒà+–Àh Ò|g ~S¦8AŒÏdÿ_ +j4qÃZÁòŽÅË †à†WµaÝLFE£yøvÿg™—Šè’At•n_/~S]zô.£ /e7Ó_á§hÿ?JøÞ²]u`YŸÝ dÿß~ÖÞ„óÿ§©p³ûÿæ3þçaÿ ŸÿÆø¿7ºõ7´×&ªˆ“Eºÿ«í©¿žÖà<¯{Tëýjß–Öd6§Iã‚|N9ìJÎìß½=Ùß;Ù…«oÑ¡½§ä­Ý&ÈÙ&§œ_ƒî¸c 9{Ëà}~ +»®o“¶…‹—ÜÅð…q”²ónwm“%ß:†áÂh„ñ2JÆ“ Ïþ“Ó~­þù‹µ­*AævZ£ýÞëâü r–‡nÓÎi•È`dÓë³ÚÉÖÖ +/ÝÅ…¿.v19mÕNVXÜ`ª8SéÚ·€Çjq^ÖFuV±ãØ€=¥ƒw6ÿ–KãÇò%ÓPMØÑPxCk;Øcì,\üa¯¼Û”ÿEë¿O”Í¢®ÿ­öFó9¬ÿíͧ­ÍæÓ6ØÿŸm<¬ÿ·òyXÿÖÿ×ÿv!n±Xöñf^Wü4U 8(i/ ~Žãö(ˆy.Êãê J× {fNÁZ³Áš°žÅEDVQµn+¿^C n—AèŠÈ_è6!ï—·GÿØ=zûþðUMgÄi°¬µÑlÖ­QÉ¿ÔI~¯¨Õžôæê g+èƒÎLäRÿ8ü÷N¶Eþt™¥EÍX¶+…µL ѱÛÊTâ-¢ÞRºEDl ¿5?Øo¨'àG¦ ï°DœNk}àh6…(7™— Ãœ¸x'! Ç~}˦¾;‰5é²vkuQ“UžêÂi^šåLEÄÐHƒ‰Éu¶d»öØ :Ãð¨ñÒȪˆÏ/‚´#pO³oe´aÏÃÕó¿Äƒ4ˆè!ó9VB¾vu ïF?´yZÜM”©hº.ìÄúpøHÍ!©dtmäÎtÎÌ1©1uÒL*L1:¢Q1·|¯BîYÔ¿E”‘b±¸´ivŸI¨ìôûsÅþó16†ã$oq! ˜˜©<Èa5ÅçlàÐVràŸ/Ù úÀZü[ÝåóéZ ÿ=á;¨>×Q*1».nŒ¾ù° +ÓÏ66é”#Ct†9ärZzòÄ‹vêb¿NW‡c+Ò¨z»E³/E BÍrk{^ h*¢«f„1.…âüÔÑ÷cýÈø‰ ­'Lˆ³ŽpeËGJÊ=QPc燇œR ‹åÁ2Ðò©3¤¶¬B¼ŒQŽœ9}J04á– ™™”¦–%BfÁE|µÉSΰ½,4dzœz…¢’iòÉesÍ@ÛJ–ÀFzÂæ…Þjÿ(Ì…¤epElgæ‡ ÇXxp…[¤x"¹JõÕûQ3Ú‚ +ŠËOŠ‡ŽÁãÃeJ—Á´ÄŒó*¤ø›Jô‚ÇDH‘ÃõgaÊ4ñ´ÓC`Úƒ–EÐ\¶@#=+ZÔoâã†( !((ï÷cÞk¾¬ð‚á5WÙ‡çì:—º1¶=£.ßvÕœZ¢èÚÓkøÖÖܱ.g ÔôÜqÁ^Á »Ì®lyÇñÙ¨ßtjÏÉá=¶×å DR%LHm ×íSú¢vH·Ð­Iµ”ž`V{OûV†#&¢ãúX¢yãEf8ƒ+€€àËyÍA™ã›C Y—¨@‰©ZlLAðŽ•óÁØL‚°UìŸë £±Ž Jé¶Ú§:+]íñ¯Ö2#ÞT(û®/a“:ç€ÐÖ–ãÄïukq›w°§Š>ˆ¥0tTÙ‡G¶ˆ™Úu‰Àru¯.+ÉP ‚¥Ízy&qmŽë¿cÐcÅ‘ˆzˆncÚ7 ú$sX Tæf>)ð¾Í•ää´6û¨¾ôUÄo+Ö‹›ì»’¶Ý sÝD¾X,4>ÑG}ÎS°%è¬ÜlX%hâçhôÁnTšlÜ Å©Ô–˜UyKžæºH˘ôvws‘AÓ®°vrlð`%Ž0 64I(mm‰d[V&Û«$ÀĪç‚ô¢Ò6– cÄÃËpá +«‰ÊFÂ)ßð¸ðñb$²¼¥Ã@ÏÑ]_ag{½2˘õY²¢¦ç(`®q ;Ž.CRbH%TR7vŽø2ÁIzÛ&l•œ ãLJŸà JVÁÃÓ û‘RQÚÖ7l®MÐ?—«JLÖ¨‚· ]´ ~âœ3Ñ=®‘´mùH³p{‚&鶮x #Ø Ò=Å g•€ÜÀÁE™0‹M—ȃ^{™°%t=†àùá:2D™™ÒЙªëgÛD…Ï"¶o­MÊê2{G±>2ú´-c´q³å©Rv ™ZÆ Rs´ŒõOC ®š6w§u}Y¥~{i­v!Z |Ú~ac ù4ɸFi͉(âŒA„9? ++À•‘nÐïN0 LÝtŽ¦mÂ_¾ázÏ÷ùèŒÖ%¾ð 'ý¾S”iÇZõØq}Z$?ó2ùšÌy¢‘ÖTNñš­ÇvÛ´ÚiÉ”ih4vZ©PÖ§zQ Zµqíà4„ì§è{œÓ ¬Tù4ÊÃ|Žº!oËN·Q´·¤–‚àõ†Òj+5©½èIßêÕ¼ÖÄÆ‚)ž˜‹] 59|¬5…#²»¥®åÛÎ;hlZ¯£ôd’‚ÇÅÖ;“bà +R \åf àÓÜ×ýßžbÅÜ,„yùËNØDUÍÉ ˜_5PUsÒ2ŠªÆ’ 7²e8c‘Ž9 s._5Øò[mIëU¯¸Ÿ…Ë©QO¯\…õ¸ÄèóíïSYM/;…Õ&|ΛÕôšQX-hðõBU³Î“M=‚4ϱÄ)cP#¿ÑõüBFGó Ý’…<Á¼âÀ•'UÄÃÔ!¥²0‡¢–Žª‡˜È”jv|UoWX¹2q!æû{L8ç4%jÊ­<ßÛÃ<'‹" „WrÍ¢Û§×t™„mÑ¥.HU´å-âÚ‰„šŠt»d+SY¡@«ýfa¢ÍB‹?Ù óÙÚÀXUm „cša¢³ IÔ†ñ•Þ८1¢@D×t-Çò‘±T¹HÈKbuÕl.¡·§1ddÙ¦F”^K$†R”Ï4ot·¹}‰ŒÅ‡Slâ…iÉØÞ(Ë/ÄÖ¢§Á#&!yž¹uN»øCY–UÞb`.žS/—ÓHÙ\îŽ8§úl,/ÎÌiÄçà{…€AZêŽñÆâxg¢Úm+þˆ‚0ÕŒPV¾)×(ݨ50ã’&Xž†!Ú ô9ß…Ÿ¢j + ®£Jv­5a1°¹rõxäţ̢! ×ÝKƒÃ؇@Cì|ÄL•s†©¬>þ‘]ß©­’ +¼¶½JÄ€±é!’µnÞ–…&×v(¹'\—oV܃ÿÁAX…üâ†ú#Óô…µnCÚà +"ÍÁi\á¨5ÄxÉå{Ê™­%üËEœm¸Âpje£ãL H˜gƒeH%êšÀÊoöà}¨F‘æjvÕl ¸‚øR9 Ãè’çš3m>®jÚ·³ + õvßÌT˜Ý-ðºäªÛØðu”éÒ¼uÛ]GZ§¿·,úÊXoŽ—y(°Ã7úŠJiUÕ¼Y­cr;g6ñ ÝEK]E 1ØÚ²}^ø—íŸ4‹ë)£Ó bÈÅg<<¡Þî¬äÎw_áÉCÜ v},–…RW‹¿£¨#Ó»LÎà®pjq5 dp]Z&T\3¸l »¡âÊuÇ­«Á2oÐkHã DRòùÛ·]·ŒæM/,¾ÎxɧÅ)âÁëjJ…˜”hÎ —n‹·¾b§î¶Ö%æ’?²zrKÞ<’El²ó÷êO9l~(æxPogQoW@½]‚z» +êíéP·´»WmÚÛzüTþx°¡ ÉX¬‚Ž»Éˆ2¦£ÿe7î‹„îàÍÊÕq¾\ ë Ë.}ö¹ +Õ =󋶔°ö —a +³µÿ-¨1K!çõÇðšs9\qËÜpët~:|¿×éÀý¶ c±0»ÏYCÜ,#ý]•Š†$@$sÙ¯ZâU&ªxÚÊ)èA-êP±5ó=ÓWÛ\ˆ?[~ŒÚùµ=µÑßla%Ž”Z¿mЙ’žŽÆœ’$–'KVÕ¶ªª¦ƒÁÓþªÅ„8[ó¨;A »ÁÿØ-¦LÐm¢M Ú’òV£âô´%­Ÿ/áÌE¿“¸lWkåðÓ.ӮƳ |¶ZPƒbÿì +-›ü›¸$ÕD7¿¨hÀ(ûEµ¹'<žöùv)òm…Q[aÔö#ï/:%òUÚ3.·ñÎîðJ~±÷‡àó–~. •a¡ê”fßU¦yp•«TŒÿOÛí¼¼–Ž‰­`d(a +î¡X³ª×ÉÏl¹•ÛPÛh¨ím¨×PVa‚`!c@AÉ:ûiMž¦WuÊì5+éOÖÊ\®‘Þà²g*Éž…ÆBÈ©½dig”Dƒ ¹¶Vs‘É[Tº©\l¥ÝѳsVˆb\ºh?mâܯ‘—[¶ñ³~Jï1ÿ×Åý¨ºg†Ó¡ø3øƒ&à¡D92¹*”aÔbqœ ç½'¾5 &}þ^}¥ûnZ] +›¼¼|¥O +)ZÑÖï·ýÙv0KçïW!%Œ@:¼0¢S”!}yÂÆ|)ãÿ¶í4 㟛ã6À5b{aP¦F!F_x^³U· kQv½V%ÓY°²~/¹{nTNÿ÷ȦN䇪…ÆðãwÖî-í+Èêîu¾ íZƒp -Xk;äÚ4 ëç®ý"öúÊžEbÿ¾Yµø:P³³£å†ÿyÁj|¢¿`˜N÷‡ƒ“ú6dŠò§ØÊÝÜgdúN-ª»}K#}Y`*°—)ˆ Å–ߢÎû/¥Âüí?PÕ#øu˜£„Ò‘·³,¥`Ž½E€ÍÛmÎ +ök5Ö¨ª‚.dý¬ÃeU9ËbU´kï‚^»a¨\ÐΆ4œä,4ø@f7rÌ݈æmçXvGǬ-¦-PLa2É—&™æ]âæÈ?½]úl”Ó‡Ù"‘^ð•gj×8øÕvD +“6}ÊÍ–æÁ°Ú`M¨/~œxÅð2LÄ­óh(Ø]ÜÛ2YÍ¿ +ÂV;_÷á87 + Ö*)ÙvoOgAy.¨êP(ÃÊ ‡Ù-ðŒçóFˆ›üóÔéG9Ç¢ƒŠÇŒƒiŽ9LjÔ耼«óuŠS·PˆÒ.šÄr¦ï`úU;ìU¬† XC¸¨sî¿üP6=ªØMç×gÞ²ãóeÉÒÄqµ-`ê$ëÞZeæe±|ËÕÛÏ/¹ëweåF[Ã8¨¬Šƒ×,Ú Ùpp$8:˲È<ª9ϼ¡fò”ÄkxUl +Õ/ý«+V$éÆ›òTª× œÛt”^0Ô9`s¶.èû˜œ„Œ®»莫fE~T]”»p+É>@»‡¯!ŸÑ9tÐHÌäó×çs‚ǨÍU“Ùõ #¤®Ú¡rü_,#I“çh[Õ *SM4^—f /€d*Œ~¶•lĵǑV7Jµs†áë;žwZˆÙº™ †š;›ôÙ(HRT!+¸x±ÿ&1£[ˆîu7Qµt.Ì¢$aÉâ)ö±ƒ ËY"s/„2XÏt¹Á ‚ƒ½ü4ÉèêƒÙ¬sOÙ…‚'<é‡a +bTÝVFH™+ÌÕ` ‚h¨ i–š·MY,cš¡<¯³\Ó †|YìÀezoÄ1PÃåÞ‘öw¡Á¼h-×ü‚†z5—u—)ÄíhÔÓ]60oN“[™}™º„¾pye¥pïAÜ?t|‰(U×!¼•s[¸á[áº<É]ÒWôE'¥§\E\ÖŒ«#îÒƒ! +éÉ{ºUðº—Aõª¤Lz'hš-+(]—Ír̺&cŽð±£Q²ö¬–¨ ÷â¢CX_Û‰z¨z´WW·­VÎhKâÉùEžAœ³Wvpà \3riaÛõ£¨tf–ÏÒ­?&ƒQ>=á­Ñ"o}dßã*¯5Ì^YpÎe¢ò¶£\ÚVÑ™drºwæø›¯<Ø©Z<²n¬Œ7ƒ¹F©‚B}\¸Œ¨#CigÃx¸–„Ý _½¹–«7r î*êEHÝh½JÊŠ4Æ|m, ®@¸‹Q*âÖó$UK;©©JŸ%O`Ú^ñ´TÇ ®ËC²ÁN'cjµ`DÞCHé@òý2LÎøþ:%RLZ~2ô;î,ga½”bø‘í½}³Z__ruÐ4¸„E J87ÂñX¦ÀÁ³£¾Š®&#.©åZ„lÔáß¡BýŸùÚ/iý]¬Çççýæ]hKMÛÊÝýÈd˜¼B‹ QÞ=.!¸¦U}/›ãxÈ ©·[%õ«^¦ÐH4šànGúÏÇp–Š6²!úÒó]‘QïrjàÿZ É0R~¹ DÑ@œòÙþ±hd0\&RqwØß×Fçâ²Uã +UþêqÊùÏâ"ÈÙi‰[¹ã÷÷±zänø+´ÃwçÍYŒé®AÌÙçÔ¡î’ E˜Ö”L¸ªô9Í{p]xlf,&'CqTPÜGÁ2¢o;ýp»…d3%0žœÓ'ýòEÒVœ žÖ6´¹]µ°Ø47Ëë.¨W@ÃlU‰6¶z+ÉQvè‚#ÁaÌꆣ±c²üì=@‹püÁ˜àa hm‡††*Ô*ŸsøĘ=ôÄN|§C4ª3$cÉÀ×9²©Ìá¬>Æé}PäÓ³êX¡Ð1½h +ºŠ“JÑC÷¨´‹ÓIÔ' 0#z¦vΫçñ–^1/e.sÑ$U™ä\Fw³Ëu³Æ­k¹èluÙ¯‘ãÎ…u<êH KŠZ?@˜2°ìnÚ¢P£X§ÂrU•_l±Ç\ 3zæÛâçà•Ûjù7‚lú1Ò¢\Ÿ°Àèã–?6ãì@ä~l‰à4`Æm´üI )u]ÆœÀ¹ê,3”~É–`T¡Pú(Df$„¢f¾ÔùªßQ÷†ÉËêõUcÙ•øjm6Ê«ªiœ|,Jì”|´·jÕ–g.¼×Z¶H†ã²ÊuÛùGå9vDsoª ÁîÕ‰eÕX–ñ±¯¬Ê•0V¸Í‚S©¾{÷bÄXæx£zD< ëî²ùjAè ‰Å£˜¦¹+.å ÷áØ‹JkšFn{?#bͱãÛïS16o¨<Û¦ŠÛϳH㳓[zÕ@»*çük }¦\qÔGÎ2U7ãGp@=°ZN²üª’32þJåU-†)S‘#pƒåri|‚ƒsú 3Í25¹×ZÛîKÿ\Åè +`¦’X%v¦ˆG02K62-²KˆbrmÝ Q,ÇÄOŠïèÙ^fÿu£•ºuï?s¯l0¾î5¾f°+’FYÓr)ÉåòQDl…f\»h>›ˆ–!iøKÕì´³ÀÛ¨ÉɱP̦¤qõŽ`@rä2oèˆ8lPˆíÝÃWvà ;áˆu]§˜E?s˜x²âÄú£ÊŽÙ:Ð{öö +3dùrN;º‰ñ—.l~AˆÉ€¸Ã]4ÜÑ>À•¿üñæëÕŠ)°VØ삽:Vþ `1 Ìh}7˜m‡YÂ'X“Í;†™rû÷9?gf° 2,wÉÆЉR¤äŒ¿â +ræЩˆR Î@t,«#Øù&+Ó`™k%ÊÚŒÜò•–ÎÜySnD¾§r);:Αàoúžéw+õ7³C©`ƒ *¸¼ÁrTÍ<ã9V50skSˆþÞS?PÌoß7i™‘¯hC”3bYOˆrŽvgYNI&ÒAŽ®!eõeORaÙ3Uõ©&šYá}ÉÞãô|³û«_.çàéR$Rá;‚ùÈ*ˆHæÊEßÿƒ©DÓôc.E5W ðaT"È3Hé$°É#Ͳç$q¤½4gÇ0KK—¡LäíïY).&Cðœ'Nã«X¦ÙÈð'‰ÕMxüU!g¥5I}lñ—C15ƒOÖR?®º^r*Ãiîc +ÏtæÀ Ê?úŽ,†’¾¢YóôH¹Ë”öqÖe(Ï|ê4©#ÁÞ3 ¯Ðn¦¼ùûeûúba3»^_Í›m†ä¹*bº€Ü%³s:9E3>¥Ga7 +úÌ1®/ȹÔ1f•YbXõÙ›+a‹cf²çFŠ¬à–bƒ¶&ƒ—ç —Ïaè–laþ7Ù›]Á‹•WpmQ®” .)[òIÅU=|SúE•¸ŠùKåúnûöÐ}!B4È›$(Å«$Â@­îè¡óE$b"¬öO«&Bʸ¾Ê墠y®Á ‡'uBŠËšJ €Aá"`b%© +Ž/‚&‹IšT€X~*- Y@tÏ-y§.voà„zÚ|½æ‘³š/pŠy/£!Z8¹fUåé(‡! +FôÖç .Õ ÄýÈ¡œZ¢Ž1à €V I¤QÅŒ.,š‘éÎjßškâÆ¢²U¦šqë±^£ÎJ æšDô£YGñ"–ݤHA)ñÎè2Õ¥%žîWÊ­X–}™Æ\H®ÑØ[ø¢h×^¶e/ݯWÛ¬WÝ©c§Ç­—çƒÇ—^Þ{¸zkÚy}‹ÝpT‡@jÐ=z î S‚É×1a¸n•¦“A(fß³ñá¹ Éüñ0\Ï$ÛI~Ùꄸm1á[ñ'Êx‡óäk`ÊHsAfs„–i«¦d¸©$ÏÇMÉqÇm*–³¹ãÏ— a­3Vç _jÖê\Y¾öù.œ•ìÔ¥+ªFØ]„Ýœ% …¿B„âB?‚¡ƒ#ŒÕ”­“ë+ÚU¬®žˆ<¶Fizlú7 ȹF䕇K$äWÓk»rY—§*ÍÈYZ½û(¢JÖDŸ¢CÙÓ8æÛÑÉêÅB>XOÇ’®˜Ò¨xã—Õ[=…¬x¦ºjL ÐR½±MJ‚„C¾’&x{™..Ô™Ÿ@ËàÌT³– m('t¿âçÝãÎîŸ÷w_í/ý <¸»ýI/”0øËã÷?þxð«Ì“!ÿ~óðùê?ÈVgc£Óz‚?žà +øär“¾th±Y¿fm£É?Ï67áoëùÓ&þnÑoøö´ý´õM«¹Ñj7[íg­ošífûyëÖ\dGó>hŒ}sÎ{÷ŠÊñíïm t»Ÿ'+K þc{ñè:‰Î/Ƭ֭³ÖßÿþÝZ»Ùlëÿ‰/†ìMÐëÅ1K¿ÂAÌ¥@Ô¥˜ò Ï@BÞ$:о I'§„Ý1Æ̹ÔüxŒÇgã+(ñ:ê†CöON^¨ÖZo®³Ú1׌‚." +†× CϸÐÃú¯öö÷9Ë6×ÇŸÆ ƒ„Œ®Áûb<m=yruuµŽœ¼'çOœòuêÀ“¥%]ç{ývo÷äàíá +uÞ²jaÀ= »p‚rI¯ ?¼Þ7ä¶=sD™rËÛ«oˆ6¾O$(^rG}µ¼wtðŽÐz—Ä—Q/L-¸N„'Äã +÷¡–îGû?íÿÚùç¦ør¼¿{´÷sççwï–þÆ ÁIBY9#ó ­ŸgY@Þí› ˆ«”ÿõ¢‘ÇCêæ»ý~Ü5ä›M²ÔLX2â–õ Î{™Ë ŒÑéaG¸Ÿ¼°qRØì,³·¶™9ʤ Z…@+dÀ+pÿ Ÿ ÀN©cõ×H{ÒÔx+BdÉò‡X| ¸Cð†§ Õ ØÚÉngµp½ 2ìÒNµ“”mäaT»äQ˜ôéîA˜äQ@õHäH +ÆÑÜ6xETY‡£Ä1Ó'KènÈŽýe8Œ0Œ5Î<ãó«ÒäðmçÇ÷‡{ ”:'ûoÞ½Þ=Ùï¼=âÓþàð'íÃQ +6c®ðSTºß2À³8jŽR3&ä̳És˜,‰€tý˜´ç5dÃÒñU á;Ûá‹(Ü9à ™pÈ"…ÉUlVCLÖ·ŠÍ™™¡ã’èTYÖœ°â<óEÑˈ¾I`V¬2 æ› +b + „ýãÿ°Ueç¤`ð¦n1¨_+JïN'JÏÕˆ,tgKÒZ<ÞåtI}t±‡DqË AØè¡‘˜«ÂøÍ8ps˜'Ÿ;J˜÷ªr~ÉYÉåBÆ/ãû."[…¯±[ca|IÝ`Z ;W¢…Lkl<Ê]+ôzšþ¡Ù`{Z ‚ý™]Û¨p#Å™œY~A²Œ&WhÈ—±ÈUu¹º]&¹Z4—(ŠXŒ¢ž–ðJqï§é÷Õ r‹Ðþ«Èl’¯9âY|RÅ÷@~T¨\yD»®^Í™0õéW2Áyk˜ø\U¦Ò­Ì JëŽed¬´u¹ñÊmlîæÞVäo§vÄ|ÎœKTÙÚ +¤ö"Ϫq2ÃC}d]m+ãV­¾£)”*z‹ËŠö;ÓlbªÆ#œ_ï¿ß:ûô +û-êç÷HkÎQ™!`|fg«è…èÏ7±¶•®þ3*Ê”ƒÕ$of‰+W–fUo]™ºnJKÉS¬TâšÛשnˆ™nžZ‚i0IJ3ÍŒWîvÆ9çÐÔ¤F§èâ®Êþ¢Ÿòóßó$Ísú[zþÛj¶6ìóßÖóçOÎoåópþ{sç¿ræ,öô ÎröûÓÑþ»ò“_UêFÎ}Í“§st»’—ÜÀ +”f\t‚Ñ“EP&mF>sâbÛ¿'xHEÑ a»02”wIØΠ冤²Õ@è VðpMæü¬üâã³8LU'×"áÑHfÝKŠÏ­Ú*e‰P«š@¦6X¨¦9†5ì'uãÉÐÍ`[,,ÿþÕU¬ erÎzµ'U1¦{Ò}ó¤ôŠ +áó˜ÅC lð[óƒHÉ`U¾æ ”£6x£p¯Rá { ¡tœ\ã@³yÙc“/j¹Öf×Ŷ§n9UÂ¥¸¹èY¾•W09'€†k\Ãö)}.`ÉéHZU>Ü1æ³? xæ)0æ(†(µñÐpË,ò[ðqç˜6°mó4Ÿtà*2Ý40„mwð)·ÿÂä<œË\lÿmn>o?ý¦Å_m¶7ž¶66áþOk³ý`ÿ½Ïƒý÷æ쿼_/i&ˆÖ!žŒG|ï˜ð¿|UÆWò^8 _†ú|ЬO<‚eÂd®3vC¹a³ î|‡\Û¾ƒ^˜ÝÅÒÓóA;½¦Þò` ÂJr­Ša뙲øªš‰úÍþÑOûå6j]ìV.'½EJ»Æc÷7é ÖÆNmålÌ«5çÍ|]‘9–ä +Ñ4™_nN»±µ›?ªgÖ¨'×€4̲¸‚6ìÂÆ®¸zŽÝ€WÊÞÀhåòÆrÑM¹`L‹F+¯?Vëe]/Ø®-|ÆÜà„I+ͯŸš·ÎÞ£}œ¹(N¡ÿéÿçuÃt>÷2ÿçÏ7ðþ»ý|óéó§›àÿñìéƒþ+ŸÛÔÿçTÿ¿í_Ï›îܪÿ+Ôƒ¹˜¾ˆ!ø¢Þª Êí¤D™Ôi}šz?:M‚„«ëœ÷@Å¡LúˆÌÍb, u*õu:ÑÂ.a+Ùu> ’^ZÁµzŠÛˆšÑˆoÆÑŽÏ8ŸÎø¶³ÿëÉþÑáîkuŽvìSç#5±%Ñ®ä¦Äi±Aù0á;:Ž,áé.gÔ³0ÓÃéLßD +#ž¨|oÂJ>*‰ð4ñu†êp“„3Ê· °-¿5m~`'G»'Çγ ’¯Yƒ‰¨‰´(ÑŠùÂÓòŽã~ssCZnÜõ©CE<`áû‰Æ`‰q­ÓùáíÑëÝÃW{N-/3ë Dmÿô¬Ù¬/`÷e²D98<>Ù=<9à\%øg”çƒ@$|`£IzÁÖþçü‚³@¸Wû{¯-µÃÇ^ªïl—µÍÞBIÉÂ_X™£›ã“WÝ×(“Þ•6ÅõÉ9^-Ùn>+)ðÌ8àä‘fÎAŒGÆð- JUŸ³°}œñæøŸ{uÈL¡û`ïu½:Æ„T§óÓá{Îøâ!S3U X§~C‚ãxÈç|‡x»â­¨†®¹rêЙ¦’DI÷Ϧ-_f‡|­Á ©û_ñe;8åòs‹m¶Ÿ¶ø?üŸgÏšõ[˜LtæDoy{ôÝ£·ï_£ÕàÂ¥µ²e¡óNÐñ/9ý¤5›ñ_þãý›_vö¡¯~ )žóÂû¶êõßaë˹ÀOö_wö~åÛRkL`™—ì;>€pÎñO|Þž¼î¼{{tbOLþª&tu1S÷Þ‹Ùº·\¿9®Ên6³C–9мEŽ› Á 7ÎØM—S«ë(&‰„È™B¶Å£ºO&:²s2tZ+…Á•$Ý¥¢C¿  éF}Š¥bê%A/|žSxàà’×ûõª“Àò³æ0—·–pÌaôøRÀ7.sÌ0²­Ÿ¢ÁéIJˆeÖ¯o/4—iÂöi÷7FÌHRÄÁL@0)"¥tFI4à[¢Z¾ðµ¢yÔ®ÓÛíûÝÑ¿jûqüq2êtùf†cü~³=Å8Ñ3a +3à:ú‚©èÆ“Ÿ›’ +è•AKK‹§R?¼ÿé§uöNþõn¿óãîÞþIQЩh6‚‹ ÏyX²nƒù¢ñkÌIÛÖØTѽßÁ4gZÆQ>i—í0>òÒ‰ º_½èS½”m g´Š(ò%<èÇçcJYmð¼›­ÒÕÚ„ f»0rÏ™é;æ6ð3;Í“Ÿø>ó¸°a ý<˜ŒÁ“¬zÓXAuÌQxr›³vW•7WË( fªºµÕ‹;|ZDçÃÚ’yÖ’' Ê µU!ãÄ¥hpgÅœÔìF‰«N¯ç¡é9&ôb‡ábáÅÀòÏC´¸¿}}zG¢*ŒeO¦Ô ÷»ÛÊŠE2éŽ1×”ÝõgCØÈù3 ,>wIY(ïGgÇ^'qcî¨^ü°÷îlª,ë>ÿõWþ¼Î¦ØàgŠ:–„ì{ל–pX>¬MnvK«Z‚”]…vþ?Óîz +i0üEIŠ¯Ö1ÔYŒ|ùŠI7“¬úŠû›#÷þ6« ªšû‡ãý‘sŠºTݤÈÿc²Ñ&RHšÍèR–ÿ?tò?´Ú­ÍÿÛøäø´›Í×ïYœ?¼“fQþßàÓy¿ÑÊ—pÞPäkí/|[Ù 8¥¡CA_ÅoX¢—8Ö fg`”Å…ë^Q¤ˆl“è*A R»“ÝG°Ô÷Öp]nÀjNõ1m¤W•L*ÃàDâ (‘\Ï…`\$Ã÷IBC6|ñN»i*h…ÅûAçFŒA.’8 "ŸKK£Éi|F|¼ïŒMÍEw…9TA52 +•Ðɶ¶x§Ž¯Ã¢Á×VFÒy¸vVÿŒWÿQí@}ÎßÅꀒ2š€f/é… % <@Uíhȸð$cЈ `K¤Q­ŒbËèß妑Fo¨—/Ù2¾”¨™IÆÄ£Úr®ƒÝ©Œ +·uÖ­ÇtÎR  |Í¿ÓCá+“—+¾€¾B„ŠÃ# XOí‚:”‡U’Dòígü³s™ñ.Ôˆ6²Ã4a5µ! ]ÍI™Ê ÅÖù<8‹>Õê¢^2)UCÎÊ ˜ñº—à’ï$Åý¼íSî=æ‚—3,^³cXpt!¾2hŠ´ã 0Ê ú‘2€ë£ 3¶M ‡óküìÞ–À=O%8\ŠwÑ~vŽ˜óƒúI`Œþa¿)?3ŸìVqå‘ UûŒ’èRæ¸-ŸYt*N^V‹ íoÏ»\1¿ €\d—P¶‘L¥¬øB“Ÿs)ÌÕ¨žÆvœ›ÎòU¦á¯1Yya-rÈ‘ÔÖ–ô±ì’yÔ€]}N¯ÌTk™oÉäGjŸ-npÕ¼1ÎS ”A;½àB¼×“ðn‡¨ˆ±Ê¢ê£t‘)?¦êâƒ[I•ñ|.ƒþ$ÌÂ]8'”F›êã÷“„xGw0ã óÅx²ÐåŠ@ù:Co3/ÜÜé\W…h0çqrh{…_MèBÙþu+ÈSËNË2–Ê$Õâá²÷m²•¸ÄØæ¬Iÿƒ$ ®õ]0åh'èˆC,…‹à’Ô…áà”5p%>ê÷aZ„£1oôµ+pIÄðÉù†ÐÁ€ß\! 1¾7¯¥2ø7…xCTD,±È ^íT™øÐ-í +óï“(í ,QRè‹wÖ*ëq—óoù·žýWž·6Ÿc½¹ìYXÑ¡ð“cðç"•<ç +mü¦UZG‡Ù=„—‚å¦@Á9ïMë/á8LXp¦ðxX€Ï@ dø`É¢oᢠK" i*®ªÐ[—xJ?‡Ô™ °Ééšî; t8䢀Óƒ5ÒÖë2ìâ>i8öžœÔp±Á¦°€+ ~o 0½ÏGD}+tþ(rúÀ­ÃÌï@Šÿ™1¬.ec nP{™]ÎÚ‰v¢v Ç6¥âO^eW\B Pö#.ä®ÁM‚è@.Ž8ù¸Î?òÎó_pÅ.ðó»N°·—­þôéÓ¦8Çpד›gž“er‘òjV¶qŒà¦pâU¨(‘âø„«Â{Ýããý£“šŠ4 WùàCÂOٻ͋ÑÿåB‘Àvà{ÉàO|V;©³'ò»îâoÍ +ׯk&”3$ñ?/ €Ûlu5òXè³³]¶}p-ó“Ùkô›íîÞÂ@ƒx«-k4ë¿í~XÄ€Pqïp1Ô#5‰-ʧîPeÂbx:3½sžà%œ%³=³€3¹$ó‡5èeúÛᨼ֪³ï™åÆ)ŽžZx¬%ŠjZ0e–3ýíäá&-³S§ ô¥“nfà]çA˜”u6¥ôkéG‡Wæ- ¼¶›«†½¦Up[,œ!·ä¼¨»æuc´_{í"‡êõ¡ûª’×£¿ÊtþætÖËQj—E~ŽœÒ‡‚û2c¯X\mq!¡ø}ˆ÷4tuõÐ3£ªN¨)çÒ¢=5óó#;.ù2¼¢Ø7tÌ+¿d•Œ«e9ÉÊiX’ÔÙõïäT&v¢Ñ/}ñ†ÆOÉBI)Œp^ °¦lÒìZ++á¤x”@ç.^3 I¯ßi‰hÌu*®7—ªc/¼-OÔ2»Å­z¡–!“õ@-«1ƒ÷iá•>¨ÕlSÙσjæóWóAµ™=ã‰ê¼žÞµ²ó©À˜ÌKdÕã[„ìÖ«’S*}r]Se S8©2ŸcÞÝÒ*Ï®Ud©X$õþœô{0ŸÝkóÙ¢˜¸„‡KÌk÷Ži‹ U…vª[¢hÖŽå3cÝ?¢~V@½Bu|j¯·zEµÿæoxÛû‹Ý(ëãWv —îüN€³¯¬r3À©òp?À&HÞ-»”ÇÝß Æsc`@îíºÀHÿ8™>KâÌ-xž@&o¹YdQo+ã˜[D Û;×+¹‹®duÿ›sÖ-èFîµs×0Ío[y×¼T+¹¬pç„+¿Ä¡Ý”× +gN +^m¸súÝæ•E_|ðRÎë79>·t!¡ú¬×"æžU®HÜ›é0ÝÕ WÄL‘f¿&j³´[Fî®ï×Jß.öx_çš9M¹˜ÞÊ.~QÈ‹Zmï onÕm°éü5,·1l÷{1¾½éSe•¾wÓh¾ÕÚ½š ´XŸóö¬ŒN=Ð Ýس>Nou×Zv +óµ®Èw´ðÞ#B~å»Ú{Gχ]n…övÆë~/´w¸žÞÃé²€]pá&øåK¾Ê¶üô0uŸjw’Àw™µzüô¯ýStÿ¿ÌóÝü”Äo>ú웵ÙÞxÚj·¾i¶ž=Ö|¸ÿŸœûÿ­¿ÿý»µv³Ù~0Kš9ݹ¯ü¿ +¹ +’„©ÌLaæ ÙA’s%îFâ¾gÆÃðl2ÄíLŠeQ Óuv§Ýa—ØÁ¯éRßECÞÓäš\‘PVéNäI + _^°!c¹Píî½~ÿjÿU&º€¯Œ\ :î¨?IáÿK¾ÜõAŸ.Þ÷bpÙ’ D4d{ìné§ù# ì½=üñà'Švà\q'ùÇWȳèܺÚW¼XR–vÀ},HâÉ°gß™÷Aþñ—³«^)n"MS>^B5@ý«ÚÑî/øz»TÜÓ0IDB•R| ~³{²÷sçÇ×»?çƒÔZÐâФ¾'ÁUç5BÀw»'ý_÷öß@c®_ ;á'ÓP>¼û¸y«8ZiÜ.N5j¼ ¸×¹_"?„• ñ/?ìryZF\¸ƒRžR¼ªôßqþ®Ÿ#{°§EL>lC¶N wïh_ÇN©¿ÓMBfšvÞí—ñµÙÌ(HÒΖ<òþ1‹ÙDÁJaþøöˆÃ«2!?q0®.+Žöß¿.c+èEØïŽÞžìï/+äl+>Jâ1×jÂ^§ËןRèˆvÙ°™i±,ˆ~F-¹*pñê‘9ÿ¸¨ðeß=Ü=:zû‹›®ÜÇ*!{—7/%VõIv½E¬|9˜d«zÉ5)DØÚ|(ürðjÿ+§ˆAOòx¢º´ùr+Â^ûí ð(YOêE„œ !ÿ`ØcéEœxéùþø/BÍl0#ߌz ºšò 3ut`9iÕ÷•àÑÛ¡‡Ûù§Õh‚ƒ€â)À¼’@¼Â– È:¡èâ»íœ¢Fšå¬Ù2UËzâk]÷¯*`p•‡Â•Â¡È”+›«¬RÕV=eT:Þß=ª˜® +—B¶ã³ƒ4cÎo<¡ßŠAgƒÚU£ÇOGûïªÀ?OÂQu¨èëݽr]ý¯ŸÝJ©àŒý£Ÿ*A„Éy9Üãw¯*©C|¯¹{2`O[ûaã¹€¹TòÉÚŠì™»}7’ÿ±¹ñ´ù\ÛÿZÏ!ÿãÆó§ö¿ÛøäÇÿ|0ýÍnúÓËÅœ@uI‹{Ä$ ûp‡‹S|êU +é³á™®÷òØȈ‰'mwÅë§ÓþOoþ• Ô_Òwj½. *ÉqätG§})W‹Ë‹ ÓT6«²é2›uæô÷`g‰\?—p~Žp)?ç¿}¤é^H?Ø1žIÉÉøëb¾rkï-© 5¸ÏÔ  C ÂŒÁeå¶"À²4M­‹Û+*\WNÌ_§)Eç+≘Ü6(B”:”õR¹C 'âà8‹&̪˜„§Ñ°gÞ呃bäƒÀÔ‘ñµ4^@v„ŒAPR_ª ‹3¼9|)%ät‹™ì$ðBnÅqÜa² ?ƒ|»µe˜ÿ¡ÿЭS0iDqÐïyuTÃô +BL9#¨šC$Ìì;àa÷ø˜kpo~à[ڃþ·{}ð¿(è}䦽ˆdX?É5¡Œ]†NÚ}×ËøÌŸÒóßN—v]sœ—è›OŸ=µÏÛͧñßoçó_{þËnA 4¦Îœz žØRäN”ÛC®Ê‰\ Lƒõb6Œõ (Ýóï_¯ûôAòRâƒ3ÅÉGî"ì– ¸–?Lá̪–uh”¦ØeOì¨Ð9Å¢a]©3£ +§C·MùÉc¿‚F8ûv¸š9àsÛÓWª¿Ì$í!ú¬:o#ü¬Œ(©ƒÐñ; Ò,{ñ’µ<·ëÓu®}¥a-2có&aðѽR¯8ˆésx§;º® VmIZ‰ßmÑ8@‘g$f€ëð„@Õ žCrxÌ!~*Š‹3!²å*Ìåà^ÐA=-Tõ£¶ªXó%mðO.½ÉÈX+l$Z?O'g r_уßôÄ¿iëƒpõ•=âå†éÌmûvO?A®\îæ€Ï’0¬9øõø&gþö¸sŒ V‡bGS×ÓÔZÜî›oi¹þÏWÀîǹ¼@Kü?Û­vSëÿÏ@ÿ‡?úÿ-|þkõÿ[PÿÕÌ™×,ÃrñÆÙ5D)­±´ /Ll,õêû‡1—ãâ„Ü9xÝH¹ú«ü¢2[ŒÐ)‹¯ +3NŸìîý#Wÿ×ooÔYs!¾Sl!æM|$ö ´²ý#Œ{2Äg¸`À3Æ10)Dó2 +ÃOFñÊS<&ÚÖ]Aî©I¿Ç¸<“úñ¼•r²³ƒ~Fœ; Ô!G"ÑϺ…ç/E/^íÿ¸ûþ5ïÍkœVo ÿƒŒD,úðÙ¢Ö0¢‘R‡}+c'-½PZ&yW(v¤mQ>ÉB~Yc'žÌÏ •-°}š%äÞ¦8yHYÌ‚yâ†Ë†âaÜ M­~¯`Lx©&sw²”шbhG|Tõk#ÄÅvÞÂ#‘#H¦wâ ÎCaË^ÂwK¢Ä`4¾¦„"…™`PdÂ-q i§‚LÛgvhÄXøtü­¦ÓŠ¬°Ö3¸ŸDD¡:[ã{ rD>þ i!ûH=UC»ÌsncP D¬ZÑAÄ–¦ÂLÆHL|@2ßóf2äŽÂ‘ÃÊtµdŽ4;å€?Rª»,£¼ò9Ý &ŸDø¸í‚‚ÔKn[i›hÖt»`7x¶)· +&Iø õâÑ!ZÿÄOê^¦uHЯìÀk’1¯ˆNx™ W£Wë;]Îd/°ÈNM“y] J(JÔõ°#hÚéhk¶ÖþÏ2³j^n8Õƒµd}V'%Ulµ¥Ú0ª’¥è¥ùsQdÀ¯Z#ÓÖL]"6<ª„°ÛÀ¿xd‘!=N?›î2£ÆÀAö%¸R`þu,mò<Ž{•Z|䶑$í9-ž,{x›¯n™t%Ó5…ÜšfyšùxàûÛB&W*,ê Ðˆ¾.2{!—ÝñuÍ‚eDlÌ>/Û6“$fvÜaîdiw»â’·¦˜&¿o"UÍÀ”f× NOÖÖüÊn¨V±GAâìóÈ*s;K$ã]í'»tøV ê–±Rò…í+´Jᦥ Ix2P˲\ñI‘T6 +®ÔU’½øUJf k•+ª¤¸{’8þQ÷“L"Y˜0ŸäGØóͯÌùšŽp³Œû¾:y{¼E¦®s¾¡æê“^6áŽ%d›AjÚë«(»c(Ì ¼,AÂvÛ©§VS‘aæÀXH r$mœ´0wC714–&åJ¼«òòrÝ›—z1ì«ôP‰)Öz&­–ÖPŽœžënŒ)*ƒ©FrT™_ýÝWzõœã¤è…ƒ¡h‹Î‘hq—‚ Wã­‡ |6¤/63¹*¥/3é­íª5ˆ\PICÔ¼K]Ô$äNngr™Õñ»êÏ—Y ŪY¼‹=Œ>÷ùSnÿϺüOÛF±ý£Õ~ñøßf«ýlüÚÍgþ?·òÉ÷ÿÞx0ýÏnúÏNš¥ùÎÞ%ñeÄ·)^øÌN Vd‡/ +{ã³Ì†Éq è:!™ßo›Ö’'™(ÑL:Â|ÿCœôaŠ@œŠ (WŸ5pÖü3J'E°xÖXR©‡8WóÍA4¾À©ƒ1µÇ‘ÚäÅ ĆŠª + »+i°Q¿3*¯×µ¼)À vœO€oÞÚÐJ¿e³FÃÍcwèõºª\Éka•œ¬Ì}‚RšjGÄgöD¦â;7ßs.éÀ®»µùëÉ;–U2š)uÌ°s™ÇD%yjâ›òNÎ@f]sï rÕ_€ÌKäW-Ÿyü€ûë’fNMˆÙ"κ“$ŠõpßäÍHä|ÐÀíåáüïMÂRTdœqÈS  +34‰\BÂK 0;µ#¤&ˆŽ×æý` “m±Ù„ˆ¢ø`É¢¯¿¦hŸ²ÿ +$MÉ/K¼EXú9ܦ¿.°ÉéšáâyèpÈeE"b eâØyÁC–×m Þ‹ÕPë¢ËOŸ]DŸ5×úgO²t™£çFðÍ‹x9k0v_Z»„c-èúòünÕÅú¦ÒÞÝ g”䴫Ʀ­cõ?ñ.þTÔº­#ì^æý",üâdGßÕ¡z¦*¹ùbIiÖu~«»ø[S§žwSŠámªjSf»•fæ±l!Ò-ÏÒ’L|{‡7=ÊÙ<{{¾D{Óv ÷C:3 ‡‡˜§ÏßmôK°p<4OBÑ£à%•’Ï¢³šG¡†/3ùÖ±û"/:¦yƒ‹ÙÎY­1 UÍŽùÎfM“î4g±*ß=œöxvr¢[”ѯ+'D·š«†½'ºh™ÃÏâûâ¤è™¤‡œ.25ß2¾ôá"Ïš—“"×vÐÁ£®ê¬[ëF¶[ ±8„Âx"m¿FÎQð—[äP½>t_!S4?ÈŬ§yUä 9uè±aÂ&êšY +1ëQRFjŒzl(  CéCÁz™×£+ +®¶¸PÌ.¼û=ü¹ºzè™NUgÓ”éÉŽšh]1´C>½Þ mœýù’=Y!™Êk_v‚Ë ê³?Wžä…[ÆãÎi|ªœMråxıoøXVzÉòV˲’’Qô¤c¾QÐï 'ý>'3ñ³Œ~蓇74€JJ2HQ„5e“~d×ZYù&…£:‡|tñšYDš.‰•£›6¶J¥œkÿ~Ë„™Ü0Mn¯Þïq•÷ä_ïöwßì3ˎ:$ã ø­BDQ•g÷P1ÎY';¬È²7gŽO^)s%4¤Ü ­¨ / Õžs¥è*HzV$“8ev£OÊtfRqµI¤sé%ÔèdV¦®±Ìô>^*nþ`8ÐßFƒ9)¨dÛ¢”ù¼Û¡´®Û>§aõ)°xe?96°Êƒì‰Ç;7ã +¼(F0'ëü¸Ÿ$®š±R¸pMªt¹"P•5RAgÇ/o&—ÀÍ„mA´ó„tMx{ß-({þHgS(Þdêõù¯ß¡Ê²nøL'÷.kýƒ±îÎŒu‹âÐ-1æÝ;Ž,6‹å[Ån‰œY«™Ïhvÿ¨êXÌ +Rù^e4 à×:Ë_²ªm2<6„Ì„¸®ì`ÂqŒCª­ +iÿz¦ [#ú¡±ƒn)à]„ù*kÒpŠ¸ÕœˆA”­•L3õ:©"Ù>š®ƒ¢ÁGµi÷ÂÛyÆÙÌJÍE M=òCXQÖv| –k&¢ã.ËêªmZêÆW5ÓäÑ„n °dˆòìæ³Óƒe¶Ôcy7†R`¯2ñò–§]?‘ß¼`?° kΦ~â–…‰ÙÐ3)a¢€i'G×kñpí*á8h"™ Êf’#ë“aôï‰ßÖfL ©•šÅ¤®…í:'H´¯Èv1€âÐÑ~€e‘¤ 05JÏŠmA˜é|s|@¬œ‚Ò¥CD¦(¡öÉJf›ŒYè +ÖÊB®—ù;âÛJÁ>u)o#ýØÚIçraV ¶üu¬žï@y²B€Å¡¸Ì1õh•5°|ïra´ÊËÔèI#ëÙy¶ÕxßaùÎç¥O}½¡¤Ë÷q~N5._ãt½ëñ½ýi[!áî}[ï Së}œŒÕÙw÷{ë³ð!IïÃÇ÷)ºÿÕUAŸæk£øþW{³ù¼eçÿh=oµ7îÝÆç6ã¿Íy쫹&æÍÓÿ¾{{|ð«TxɧmU†³: +Ï÷?± >œ¬^†}v•£Q˜ä¦éÝ«’§×WhñÚ*'­šyÖ—DØŠ ÝãowÄQ†~AÏ×/¬ä­sÆq[QeøE:ïö_az² ¯°óÉ8Ýv§3`ó Èñ¼Ž' ;¤|è¸f¾µVµ]å4”w‹ªAø"µÓ]_" Çìzƒ±¨ñÈ ‡ +”¼ÈYȘL3,¿O 9¥X2褱æouIŽŒ‚„–Y84 +‹›pª(6N}à3Dÿ ²©V¦¼Äno!*@DLU &Hþiȇû¿žpÚî¿¢ç-õü`o÷xŸ¶ÕÃ÷Çï ‡›úáþ/¯©l«i–}·O͵õSHx¶©Ÿ½zÿæÜÏúN‚z§T…”EƒÓ LPéïY¤~ÿ\g¦`Ö´š™‹¹Raºùzúûçß¿TÁæh÷ð'À¦Õr¨ÃóVçJcöŽúÔj (GÁ‚àÊ wk¥Ž½CY¾! ÆlÞÝ,IFá8Â-~<ªÄ–([Äæu2äZ]Ø… -”ãªyyWþ{úTRߨ<ŽcvW ºÅNÈK“˶8Š’%È&22˜­ø›w'ÿ ×S@äi: ÉëÞýKôSã‡ß²G¶ŠäzóŽ+„ÖwÛ´’‚¯þ'ØkÕÐVPNûšÏ­¿ ² D(íLËûöþð‡oê·›Ûćñ•\JpÍï_Ç¢¶9x +ð;â›ìä2äsÖœLjصX ‘ףݚÜ­˜9bV𨽾…¦6°~˜ˆû.x9®Œ»âLg¥¡Aøàçb ëên- ÓÄYAnz}~_²ec/Å M½`Ç8½‘@Q¸ËÝÛ\$ÿÅCrhBŸê¿Ô2`]ÌJxƒF:c”Ün¿?<Ø{ûj_ì´^Eô5_ÐS$²^ñ~©þ™/…ˆ]££I íh~$vó‘ØÍCb7‰Ý<$vç0Ù9ÇTSž\i‹›s’å$m€˜NY,;Ô]p JDQò[ê,k$e®ÓOèàrç¢%‰ vh=Þ6Ã1™I-Œ2¯Ð»QÄòç‹[¯eýj[¿6¬_›ü–åE›¤‹ ¶©N)ÑÇ×›ËgÜ|up¼ûÃëýÎ/‡mmØD÷\ w/ìöÙÊO\¡Ù ú}ÐnëbZcï–»¾]TýǨº ÈHɧú#ßEÐ4jݵ´ˆ»³ÐnTFßdºŒ@ÄvœË‡Æ:Å€+ÒËÖ¸ˆ/…Û0}·péÍÌb¼?¼v4¶Ê¾Ý†ˆ\Ñ(à&oA-+û^š_Ybã¸ÝÛHæ"ÌF…el<êʧ<™×vtét´{·eÝ=Çûj¬íÖó»V +¡¾v}…mƒÊK¤ ˆÌ(näÉ°"²‹Ñ©u•Ã„ë£dÄp’Té–.ƒ¿.M2‘Y(„„sÑdÛ Ä%K5XÚ]Ÿ`$¢þfè‡c +50'Ò”y±ÀòÐ¶Æ UÍr¬{j©¼Sö¦2ðy;‰°\õnš~JFól‘]®ÐÐBº9_ïQ¾ÞgºÑÞûŽÐùf +| +ÀãÉ‹4.¯5wÕÎÌXj¥tMÂî$Ñòu>¢•¶oQlhØ´¤æ¡5­©* 1—ÒNj=åvèW ›# n¿¥¢æ,²oÂä<ô­ÑÐ߇Á8÷Ö¦5ºfœk*âæ!EC¨±Cz#h¸çÜÇ\/ËÕ™dJC³Ò ÔÉ‚ÛüG¤L²ô¥¶»- >Ðbó0iߌ†l'à‘‚zµböæ]œ¢Å·¦;:“Yð5¹!ûŠi]‡oÐÊ༠’i-ó’ÆøŽ*$;ÿÛ*JÅô$ ÈßTÕ°8š˜ GqJÃ{–D`®›X3‹í|ËŠ´Ë‹l”Ù¤¨>7ê†kºãJ@ç“ é=$zø«}Šüae¿óy=€KüŸ>kƒÿïÖl·67Àÿwó!ÿóí|þkó?³u6§Î¢œ€/ƒ$Š')ƒ›<—ͽpÄ5 ƒôácàs ¦°pR(o‘pmìÌì4ü±H=šÀÅ4> ƒ`Ôj¹År÷RâSì/vc^Åf~‚Ò}—m…îtöþõÓ/‡Žc…¦Çí+´‚û ¡ÿFgßÇIrÝùÑ'öâŠg|•®_ìPê‡ã“×è ƒ3ë¼ÛÅ[Nñd‹Eè7Œú’ÁyÀ:¬¯Þ°µ5‘³`m®‰f¾õfûøñ€Œå7»þt ¼úît^ýÙ&$ƒE²¾›èIZ͈!GRÞŽTìiÖ³:«úŸáðÌó=ìÕ[ASä!—æyªýãÁá«Î«Ý“Ý]Ƨp<¶:dA—å~Þ=|Å…™z{ÁY°/R>äfËÓ(mXD®-?Áׯ:Ô\‡ÿx¿o•ç‚ Åjg÷ääèà‡÷'ûÐõý½“·GÿZì—C(5võ%¯Ï¿õ(Š­'] ƒùD…€0žGšU‹D‹ùäîp #ëô¿?|wô¶³·W_ÏßsÚpDël…Ó›Ý_;ïvO~V„‘Wœî"'½Ø–X¬ã8…÷®À¼°;&e ¤-°ûf]xqÈûMvãíg ¨pà#Rq¤õ|%Ë™\ÖÌ°TkiÉ€¯È,’¤cÀÑ2!ôGí†ÝozEÖ8‹â›pÜæJp‡á'‚æ¶w!k7ìT ÷úqZ¯¾ˆ½aÑ4Ï™åÔ¤EÂ%ö·É0ûÔ¾GjRɪ fË# ¬ÂôDM1ÞV»»Ù1¶ +Êöv3ƒgÖìÁXº‹YhÈ.B0H|eÙhƒ¢†—çòŽYå{DVþ x²m>ॶݻ.nÞz Q’õi,¼–³Ø2Ë©ð9tg±¨Õ?Sãì%¶I¾É¹#7…YWÖÊ.W…sõ¹FÇÑñ?"]œiò úç`yÏQ¶|/«¸4W´•ñIÎ ÉEñ·.†¤Ç›dŽ¢Pëv ¶fDy2Ð(Y#Š`vuŒ§­~û–aì5Èe¡B•p ©Ÿ)† ó#F,®„°æ¯\Øù V<ÊêD‹ õ3bAà \¨ õûBÚ™]ErZ¸ €ÄÅK2¬ÖéäLf&Ùlþý +F=Úµ¦Å$­Ú‰%&Ãü2¾ â’³|–c çœ)ånr¶¨‹©¢ ©ÞàÜðœæ#wмÀ·zrP˜Ìœ°Kéy!Š +ó«Úç: þ¥”ÇUa +Yä»q©BX#íèd—Yʉ]Ž¿ø.°:^Ýpâ–ÙÕ¾â³‡Ó 6݄ÇA¿cÎF÷!q°!ÞZÏ°Äggi8Ö“x$ŒPƒb®É0ù0ß³&=æ’ ~¯ítD®Œ¸š›«¢H;ÐÔÑ‘ÅT{²u7>'²¤øiÓ ÌÍÆy;|"§ìI3áÂëBÙÿ7[Ö‰Àç‰iî\¼Í|Šâu£’]ðɉPn]aõ||Q¼uØn¤;Ó¹|–õ…à6ä—{›}–ƒÄç­aŠüŽäsCÊhÆmgÉyGr‹&‰`ŸÉ“¬að…Y×DzªBΪPÀ$ƒ +lÖvpUÁÅDó{qG0‘¯{ѺšÁºÑºšî&öѺ1­§Äò?Ù‘ôÌHPP°¢ R,¨%]×®pµ#Ÿz_ªÂ¨2dJ8%9CÒìØ¢AÍÿlɲ &är‡ +Y·R[Á²*Á;¸ˆ[b p¬5ͬ?&Ò¿}`5)m³ØgtŠñ`äD3åOØêK¨ž‰Ü;U!ó*—-ÓšY„\ß !­­•B‚"©dìW_t1I¢V½¹ÝrÌ´µ6M[kemjˆˆÀåšìaêË{õ‡ü–¶4ñ!úÓø64óé)N6ñTÊx.سʇò£Z„TlùÅÂŽÖ1|Á) j)Àdçf0Ù™“‹ ›(/g Ê á²ãÅÅ@&WÀ€¦W€’šæÛUÉùݱ×d¯ÈŽ\áHí/•°Y›¾kbÐè]58³ÚšoÐÐáEÝ®Aë[ŽÀe)L9(õ1'ˆhyaÄ_%ìñï¿?†£âÇOg¯^‰+=Žm šÐ†i«#®ÛÒv*c‡¥±°,º¬£bâ# Ñg‹ö‘yI{ð¨)XÇãmã÷(_¿ù¾ÆÎÅâ pä¦Ûpn5r÷ å› §FñöbÅÙ_l,ð ÛÍø“³¥p´Ð,Õ,ÓÅUÔùÞþSµ¢ÍûžrÙ¾*&0ø5דX"kKÎÈF~É3u¦00uŽ(D†M#K®äbŽ ÓDáý‹ºÉ`/GmeHÈ´}R«“fGŒ„FGÛåÊ(Þ±`g-)ÖÜm¯^U;k­#Q.Îhö`Jdxm—”ª¨å€k!ˆ?âˆ*ü­lù Æ0a½«€ýýIkãI³ÉÅt:á6NÒi$œ…À’$¢†.yÑ|áÇÒ¢HU$Pü’/6Õ + -p¢óDg–ÎbŽ{^äÑéAd_p!‹{^½¬x-ñWµE´(—·ÙÚ‹º–ƒ5ÕRjšYKj^SÉj_‡µÜó¾½%©]]l/ªÎðتD {Z(hNÀjÓ}Ð_Êòx\Ê~nÙÿ·Èÿ;±r”Îî^ìÿÝÚÜh=ÿïV»Ùj?Ûh}Ól7Ÿ=}þàÿ}Ÿÿïv³¹ñ—uý¾QÏïì¤YšÏÿû]_F½0u 3;×rž¶EߊŸïszõ—ÌxQëÍ“úB‘Ì•¶S¬ +Hèéo‰ÎMÕìTĵP®JÌI’R,€4OuWyÅ-UÊEiR ‡JžœÑYMæ—\ƗʨœLBCÈt + ;b+"ë¬[I1v’é4ùw¡-ÓEVñ˜zƒ/ ‹¿5?¬ _#QÀzjLCpÚÊ”¤Çæñ¨°?—OÇe†©‘6²Ã4C5©i¯d’ïÉNÀ+ÌÊ÷ѧZ]ô«óRª†dzö§¼ÒËë^v‚K®qªóc/?Aûšì.xY1ÃÖ5ƒih¼!¾"O™õ 0Jüm†ñ¸œýÎpÒWˆ"«y5~voKàžÆ§œ¸×¥²ëˆ)¡gçE'–ÙI‚at;r.ÅÙm/ÌáY&yò²å毓Á®U“F¶Úõ~oÿUÈBä~óŽ°ƒ-U9Ì¿µ¥íMyK¦ 1Ùaþ•”eCšŽlK(g½®lºu|Ηh츳éBU¦¶Ñ#•nifB9æ<vuY³2S­e¶£jiW>“Q픦9臞IÅ•lã Òõ^À»Êl»í3†ªOÊ”ý˜J”X%¥ÊóÉ1¥.œÌÉ:ÿ§Èl¬>Äóûʶž­m´táx„é|q‡s†3ýS± ß×uQ* Ðaj=BA¡Ð…<éŒï ›ë‚¼1:ƒ}ßr ñQ¿CMu°ܧl0ïC©A}Ö +†]»å¯­Òâa% úGüä´iÀÎËŒi)’P@HÕáH4ìI¡z©ÚøÓ‡îŸY4ð¬”OÖë1œP>òUd: +» aN‡qçô#x—‚…½Å^¼`ßåö–Cÿ½ÇkŒ¡³ñUØÓ0SÎÆß‹`ˆ(`„\z¦"“´Æzg AµòFÜö€ ÄZ&’ä’Bª•3úù䢨Ó*f8HŽ.€R…ñYT‹ù˜%è>¡žzüÿ|; ;‡ºÝyÝÚFaç³MUh«"× Kæ³ îvQP†Å¼ÃÁÿöÛÖÞëÝãã­üüƒáK>WÊ8ˆûü©qýņó1Dìü»ïp0Àû÷Uü¿¯a\žI%–!ì÷?qMúp{‡+!—¡dåptScVñú@'§TÍœãeIéÌ¢é¦Ý€/N\AôÍ_Ïrâãß#‘#p4Haýúm}}ýƒ„K Õ ð¸”>/›¿aE€"…Í`²? 4?uÑ–/Š¸ą&¹ÛÀ³ êóµNË—J@Ò `‰–/‘ a´ ¤‘ ÅY T¿ðÜß{³{ÜM"œìö«ÿ .ƒ¼WÎs4[LjV‚¥”“uÎ\àÄÁ‡à,¶míôœïóÌq¯â¤‡ú£óÍ~ !:ÏO'güñ†û¸ÇÑp‚œ²  cOÝÇgѧ°'^>S‡~ Þ.HñEåy‘¿&XÛ¸šy +¿GqôUnæ~È´*™Îî–•ï³&Ÿ»Ïñˆî­-åÈŽ»¥­-õVöM ælañNÕZx¶¨x'‹JA-ˆoôdÓЇ«x+‹vŠ*ùç ¯dAC¤e‹Ê—²°¥Öd‹ë×F¡ÃxK›RÂѼ¼C§ +•ÝÏ[Ï,cTÍj"~†É“”jwà­†/ea©ýgKⳘ|ã4‹±(ì,.ž!0…£±„dKÊ—™eÂ×¾)'åêá oì5"[ˆ?wÖ…lxá. žæÌbw½6xd:Û+¬±;ßö\²¤bîAÁÜ)?Åß»¶ÉÞæ§Èþ‚Ätþ›ñ$ Øþßl?o>ÓöÿÖóošíÖý`ÿ¿…OþýŸ…šþç´ü5†ÿì”Yà€ÞQJß\© dš}±#òÎö~Þ=¿NŽvNŽ‹N ü…oàÜÀx¢{k'dúÚ‰ µ;ÅÍ=MÀˆF!—VæÆ<ÇqC:7{šÒþË>¯èϦ÷‹0Xa§ØŽ}ÖaÅw$w×;TíÀ°Ì¤¤lÓ(¤°[$‹ +zÙ«µ¹ ï{¥ž o¼ÎË×þþ‹·e$H/âd¼((„2&v”Í]7«¦¹¹æÑXÊïÿ¢ m.€âõcãY3sÿ·Õ~ú°þßÆçáüÿæ.«™3§pžO¸`\³Ô©©ƒþyœDã‹A*±>‡ñ8Ä|ß`û†* 3»ƒ^˜ÈÌO(F¼¹£N¯©3€\ƒõb4ðJÅ•5¾jovOö~ÎU/ôÛ›¸F¬lr]sP–ð@œåR¼ñ•ðd„,ìt`à¥yn +Xöê"æ´‹©"FÏYç\õû)äÔÌäØ\T|׿Œ«8øl·æ~ã×—TܘS=ª™ ˜¸Gj=£û¯Kî{î×hŒ.;Ëlà«\ÉÁ1¯Í²¬ªÒ©Qç¿Û95ÉÃÔôÝÄ‚òR­¸ÿ‹‹Ø^ƒÁ{…뤨³N4õú¦FÎxUžÈš¨lXn²öÈk÷çI³y”dæù§réD¤iøïI˜\,èße8ŒàâI¥3>ïÓ­¬nùãûÃ=ƒ“ý7ï^ïžìwÞñépø“€*Äœf‰“§¢‘ÁUyˆ¥¸H5_›˜гɯ8»ïÇAdêš2ã—{!ÂGZ9à…d¡(1¹ŠÍjˆ)E¤,qÏLJ<Ã_–S8_…½·”|ÞvÜ.ðóqçLÓ?ÆØ=þ[eŽS9X·8“<“]R›>äÓ‰Ýbò—û„§åxwíû!®³ã¥ÝÆSé6îŽÑ4(æaþÛcÜüiV a§`ír¡[‰ïoÍoù2—|§CFÂÌVX K8½|È0Û:RÈ%&N¸žî†Óô3)ïc…*‚áß– ÇÇ[[Â@ÀJäù(q½Ì›ðçû4d¨ÀH¾8 °Ñ}½«œäNw.iF#ÛTM6Æ[SîŒÝî‚÷‹'iO~Çì÷À|·CˆûÅzfþ]‘‘º,ýôÝòéÕFûSo‹÷‹WUÂ[ï![1å]øR_UgÍ«[U¯Ìwéq3]õ±•VP…³¦"ÇMj…‹ç+sž èH¾Þšà»S¼;¢Ü?^­¢-Þ[>0åäþ±äµÈ[âߌõÀÁ·D”ûÇÃB»¬"]ØM96]ñI{Þ½a±ÂaÂz} VÄÂèY7h†žYO\<ËÜ âmóÕÝ› ïŠùîF4ÝSá=à²ÿ +[¸&w y76Á»gÉÛ6Þ­àÞtQYÿ*q¡uÞ-•ÚbÊ{úï…’!G>¾ âbxtÂ݆ápŠá¸¿:á=cÊûe}¼cö½/VÇ{Âè•õϯ‚§8úÎL–÷„ŸoF×ý˜ÿÎìž÷‘ýïÀÞyO&€eòÔ™fo6`u&7¬qÑ鮳¾êOÑýOóºM‡ÞÍt´øþ糧Mþ¬ÕÜØh=oo<{Ú†øÏž={¸ÿyŸ[ŠÿðßsõÓ7iâ ÓðAèÉøÌj„ ÂÁ)\å·™ŒPÂKž :påi<¾À±á½šðæ/CÉa<\ÓObiIÄéwûG¯IÀíuöÞ¾yóö°(žD^ñùï{ +Îo^ï¾Úët Þ( ΈÞÉF“ô‚­]­}×l~GŸ=ËIáÉEþٟɯô*§¼_1ÕEFûÞcùEOÌ’˜]‹óovRFÅ%¯ö B(X×44tC+À§&§ù’Ï­ÀsfÖ)m#Ý&¬ÓuBHZW*È(N‘×U‘Ó û1Ç£Ú)%e ëN4„Ú˜ˆ”žÔêЀ¿î…#æ5×0K=‰)%1€dÜuâÓ?,~«-ë×B§Aª$“.¥Â¬âá¿_3`öŸ)ÁÁ¤êpù²Þ~¶²µYñ@•ò¥Â32àeR³±LŽ¶èŒ +'ÏøºVwÓA€Œ˜O6œ‹vp’„[,„+ê\2OE=BE0§l‘C|Ó ’ó $6dá§Ú·CUܽ±ãô­Jq$Â/’øª£¢×ÖÂOFêØ×(,]êhÚÎ{†OeÄÃ$¤t¶)«…b),¦ãˆÃ 9°Ol@ð|çƒÇ Ž_H®ìÔš"-d~«Ù(,³ýÖùS|åóåS=“4®f¡ÇÉèzN<ô?#šžˆOZéÐô¦ÀFC'±åå%}ñòÒL ËxªÔ¬®‘ Ãê«35’倢š)xŸÜQ0)oÒ}Щ b?èÔ[ÕdqM§ã@z`‘ׂ©“Î!jFwÌ*ËRänÛkªÜæòo{ï¹2òÏ}bsΉÝ‘¨Zò>ÈÝɨcL ±JÒDæK{5L:D+6Sy3ŒßzÊy½$QH!²µ5I£+ÚšòÍNíñÕãºÀ q¤:Ñýëý8Q¸‚«-_5ØòÕj‹*J4O£1Vö!ùxýñ–^Ò¸Ú)Û1±²â+íÔjgŠ Ü8ïì{f-óÉEÄk¾fÞŠŠw³¨'.s®ƃ×ȹPµòw®ˆå‘ˆ$FÕMŽ +Tlá>GÃ} ÛˆM)ãC*ºÀ‹€Ôͤ#ÐxŠ¡Wq›°y †j–[jDü’3LÔZy)¾y±ëGï´F„ò%'áðùCX²; Ý>Õ¹À[cëì‰ –KìçäHiåPš¦mwògÀ}d«ª›Hè{Æ^LòŸ¥W¡Iþq_± þÿ~Ìç&†e ÿ=¡@©˜§n_m;˯ã±÷öýáI67ƒÝÅ›c(¹÷ÎOïw^ÍG4äM«Ø'ñ˜ \ No newline at end of file diff --git a/libtests/qtest/md5.test b/libtests/qtest/md5.test new file mode 100644 index 00000000..4c0685cd --- /dev/null +++ b/libtests/qtest/md5.test @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("md5") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('md5'); + +$td->runtest("md5", + {$td->COMMAND => "md5"}, + {$td->FILE => "md5.out", + $td->EXIT_STATUS => 0}); + +$td->report(1); diff --git a/libtests/qtest/md5/md5.in b/libtests/qtest/md5/md5.in new file mode 100644 index 0000000000000000000000000000000000000000..408a68b41466c302f0d03d8ed295076dcda50995 GIT binary patch literal 250 zcmV$dKTKz?lO)+%N@GR$>81x9hWpPT`BS)6dKhzku2xjORIjq{c%r=w0a4pYQ+ Ae*gdg literal 0 HcmV?d00001 diff --git a/libtests/qtest/md5/md5.out b/libtests/qtest/md5/md5.out new file mode 100644 index 00000000..148b4e66 --- /dev/null +++ b/libtests/qtest/md5/md5.out @@ -0,0 +1,16 @@ +d41d8cd98f00b204e9800998ecf8427e +0cc175b9c0f1b6a831c399e269772661 +900150983cd24fb0d6963f7d28e17f72 +f96b697d7cb7938d525a2f31aaf161d0 +c3fcd3d76192e4007dfb496cca67e13b +d174ab98d277d9f5a5611c2c9f419d9f +57edf4a22be3c955ac49da2e2107b67a +5f4b4321873433daae578f85c72f9e74 +914b11f5990cf99f1161bfeb5865a4fc +1 +1 +0 +0 +0 +5f4b4321873433daae578f85c72f9e74 +5f4b4321873433daae578f85c72f9e74 diff --git a/libtests/qtest/pcre.test b/libtests/qtest/pcre.test new file mode 100644 index 00000000..cf0418da --- /dev/null +++ b/libtests/qtest/pcre.test @@ -0,0 +1,34 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("pcre") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('pcre'); + +$td->runtest("PCRE", + {$td->COMMAND => "pcre"}, + {$td->FILE => "pcre.out", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +chop(my $supported = `pcre --unicode-classes-supported`); +if ($supported) +{ + $td->runtest("unicode character classes", + {$td->COMMAND => "pcre --unicode-classes"}, + {$td->FILE => "pcre-unicode-classes.out", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); +} +else +{ + $td->runtest("unicode classes are not supported", + {$td->STRING => "1"}, + {$td->STRING => "1"}); +} + +$td->report(2); diff --git a/libtests/qtest/pcre/pcre-unicode-classes.out b/libtests/qtest/pcre/pcre-unicode-classes.out new file mode 100644 index 00000000..443febc5 --- /dev/null +++ b/libtests/qtest/pcre/pcre-unicode-classes.out @@ -0,0 +1,2 @@ +no utf8: ab +utf8: abÏ€defq diff --git a/libtests/qtest/pcre/pcre.out b/libtests/qtest/pcre/pcre.out new file mode 100644 index 00000000..27e94e64 --- /dev/null +++ b/libtests/qtest/pcre/pcre.out @@ -0,0 +1,68 @@ +PCRE error: compilation of a** failed at offset 2: nothing to repeat +3 +key: value one two three +0 +25 +key +0 +3 +value one two three +5 +19 +PCRE error: no match +PCRE error: no match +2 +aaa +aaa +-- +hello +PCRE error: no match +qqqcqqq: no match +ab,c: 0: ab,c +ab,c: 0: 0, 4 +ab,c: 1: ab,c +ab,c: 1: 0, 4 +ab,c: 2: ab +ab,c: 2: 0, 2 +ab,c: 3: b +ab,c: 3: 1, 1 +ab,c: 4: c +ab,c: 4: 3, 1 +ab: 0: ab +ab: 0: 0, 2 +ab: 1: ab +ab: 1: 0, 2 +ab: 2: ab +ab: 2: 0, 2 +ab: 3: b +ab: 3: 1, 1 +a: 0: a +a: 0: 0, 1 +a: 1: a +a: 1: 0, 1 +a: 2: a +a: 2: 0, 1 +a,c: 0: a,c +a,c: 0: 0, 3 +a,c: 1: a,c +a,c: 1: 0, 3 +a,c: 2: a +a,c: 2: 0, 1 +a,c: 3: no backref (getMatch) +a,c: 3: no backref (getOffsetLength) +a,c: 4: c +a,c: 4: 2, 1 +c: 0: c +c: 0: 0, 1 +c: 1: c +c: 1: 0, 1 +c: 2: no backref (getMatch) +c: 2: no backref (getOffsetLength) +c: 3: no backref (getMatch) +c: 3: no backref (getOffsetLength) +c: 4: no backref (getMatch) +c: 4: no backref (getOffsetLength) +c: 5: c +c: 5: 0, 1 +: 0: +: 0: 0, 0 diff --git a/libtests/qtest/ph.test b/libtests/qtest/ph.test new file mode 100644 index 00000000..8e70efd5 --- /dev/null +++ b/libtests/qtest/ph.test @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("ph") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('ph'); + +$td->runtest("PointerHolder", + {$td->COMMAND => "pointer_holder"}, + {$td->FILE => "ph.out", + $td->EXIT_STATUS => 0}); + +$td->report(1); diff --git a/libtests/qtest/ph/ph.out b/libtests/qtest/ph/ph.out new file mode 100644 index 00000000..37f63822 --- /dev/null +++ b/libtests/qtest/ph/ph.out @@ -0,0 +1,12 @@ +hello +created Object, id 1 +created Object, id 2 +nulls equal +destroyed Object, id 2 +equal okay +less than okay +created Object, id 3 +calling Object::hello for 1 +goodbye +destroyed Object, id 3 +destroyed Object, id 1 diff --git a/libtests/qtest/png_filter.test b/libtests/qtest/png_filter.test new file mode 100644 index 00000000..5b75a208 --- /dev/null +++ b/libtests/qtest/png_filter.test @@ -0,0 +1,63 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; +use File::Copy; +use Digest::MD5; + +chdir("png_filter") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('png_filter'); + +cleanup(); + +$td->runtest("decode columns = 4", + {$td->COMMAND => "png_filter decode in1 4"}, + {$td->STRING => "done\n", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("check output", + {$td->FILE => "out"}, + {$td->FILE => "out1"}); + +$td->runtest("decode columns = 5", + {$td->COMMAND => "png_filter decode in2 5"}, + {$td->STRING => "done\n", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("check output", + {$td->FILE => "out"}, + {$td->FILE => "out2"}); + +$td->runtest("encode columns = 4", + {$td->COMMAND => "png_filter encode out1 4"}, + {$td->STRING => "done\n", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("check output", + {$td->FILE => "out"}, + {$td->FILE => "in1"}); + +$td->runtest("encode columns = 5", + {$td->COMMAND => "png_filter encode out2 5"}, + {$td->STRING => "done\n", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + +$td->runtest("check output", + {$td->FILE => "out"}, + {$td->FILE => "in2"}); + +cleanup(); + +$td->report(8); + +sub cleanup +{ + unlink "out"; +} diff --git a/libtests/qtest/png_filter/in1 b/libtests/qtest/png_filter/in1 new file mode 100644 index 0000000000000000000000000000000000000000..bb830eca34a23f1a8502f7f6af2f1286fe57ced4 GIT binary patch literal 3985 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 VErWke>%QG|L!ci7tR745{{b@yydeMp literal 0 HcmV?d00001 diff --git a/libtests/qtest/png_filter/out1 b/libtests/qtest/png_filter/out1 new file mode 100644 index 0000000000000000000000000000000000000000..5625f331714200ab09304c10238b77ee6f133a20 GIT binary patch literal 3188 zcmWmBxfU(v7=YouPY{kNF~qdL@h8MQkBK3U1c{jEBQccLQt9Z?Yc$ree#LR_3nQz*Qf64Zt#{%k{6`e>{J={__u)>%TnzzJIx1et)_1;IWsx>W&`LEA&deN)PMRcOKk4 zH_y#;^V~c)&&_l5++KcOqq};oUZ>aV4SJ&<(W82k-mJIit$Ivv)7$k9y;JYfO`%k& zHCi3LTkp~1davH6C-i=OKp)hH^kIEOAJxb7aeYFc)Ti`meMX@&+A)yLEqMQ^j&>V-`5ZHL;XlU)=%_P{Y*dCef>f& z>LvYBztXSun>!DJNAL(9!6SGCkKhqJf=BQO9>F7c1dremJc38?2p+*Bcm$8&5j=uN z@CY8kBX|Ul;1N86NAL(9!6SGCkKhqJf=BQO9>F7c1dremJc38?2p+*Bcm$8&5j=uN z@CY8kBX|Ul;1N86NAL(9!6SGCkKhqJf=BQO9>F7c1dremJc38?2p+*Bcm$8&5j=uN z@CY8kBX|Ul;1N86NAL(9!6SJjkK~a&l1K7L9?2tlB#-2gJd#K9NFK=}c_feIkvx(| z@<<-ZBY7l`$s>6rkK~a&l1K7L9?2tlB#-2gJd#K9NFK=}c_feIkvx(| z@<<-ZBY7l`$s>6rkK~a&l1K7L9?2tlB#-2gJd#K9NFK=}c_feIkvx(| z@<<-ZBY7l`$s>6rkK~a&ibwG%9>t@06p!LjJc>v0C?3V5codJ~Q9O!A z@hBd}qj(gL;!!+`NAV~g#iMu>kK$20ibwG%9>t@06p!LjJc>v0C?3V5codJ~Q9O!A z@hBd}qj(gL;!!+`NAV~g#iMu>kK$20ibwG%9>t@06p!LjJc>v0C?3V5codJ~Q9O!A z@hBd}qj(gL;!!+`NAV~g#iMu>kK$20ibwG%9>t@1G>_)dJeo)IXdca@c{Gpa(L9<* z^JpH;qj@xs=FvQwNAqYN&7*lVkLJ-lnn&|!9?he9G>_)dJeo)IXdca@c{Gpa(L9<* z^JpH;qj@xs=FvQwNAqYN&7*lVkLJ-lnn&|!9?he9G>_)dJeo)IXdca@c{Gpa(L9<* z^JpH;qj@xs=FvQwNAqYN&7*lVkLJ-lnn&|!9?he9G>_)dJch^c7#_o8cnpu>F+7IH z@E9J$V|WaY;W0dh$M6^)!((_1kKr*qhR5(29>ZgJ43FV4Jch^c7#_o8cnpu>F+7IH z@E9J$V|WaY;W0dh$M6^)!((_1kKr*qhR5(29>ZgJ43FV4Jch^c7#_o8cnpu>F+7IH z@E9J$V|WaY;W0dh$M6^)!((_1kKr*qhR5(29>ZgJ43FV4Jch^c7#_o8c`T3Ru{@T? z@>m|rV|gr(<*_`L$MRSn%VT*gkL9sEmdEl~9?N5SERW@}JeJ4uSRTt`c`T3Ru{@T? z@>m|rV|gr(<*_`L$MRSn%VT*gkL9sEmdEl~9?N5SERW@}JeJ4uSRTt`c`T3Ru{@T? z@>m|rV|gr(<*_`L$MRSn%VT*gkL9sEmdEl~9?N5SERW@}JeJ4uSRTt`c`T3Ru{;is z!{hKcJPwb;6crQ;ASjBx#;&N?6&1yX*g<2gvBuaI5h`InZ&O^)tsJj>v%0pshXiTI=Q*~*63)=334o#p_H|Wt6dR>FGdoWO> zr@^q%FseI@Rp40)X!2&r34z=WFf$Hj>D8=%VfHtevmNHvf>l~=^$J*{5!*_NtFT=& zAE98z(OHl`1Fn^U8+YL52YA*JUXF#=WNEhb28TW1$OPunYr%IW_>rYKyb46L7VjZu zKh#n~Ey6X&5|z33?@))@o10QZbF&H1ya;r45t_8yBp9x-BdD5rgjSo`7JjH8w!(^J zSQ#ibzz(7}@9ZSlY4fouaJ-$k3pX~wO}%%E+{`aL;bnbs+ho|-&4of2!Jb%byw`&d zwYTxjf{GQv@(98*Al!gjzd&scjZGbrv8l^cHjVm2;~J1cg={+ZhRz%no6c;R&458L zNK*~zEIz_SADC2K{0Va@j?FyMx0(L~tWdvI>aywtYW&OzzKH2_M~3@P5o@o#R#o?KN}uwgNIGv6A9XWaS;nmhF#G^;4%|jBf-lS zN^^4TN^=J*Ib z1vBcv_ie;&SgAEu*@-Q%YY^<_z}fBLtl8zifa4qnyW?bOcbdJlJI!IRJHtV;yK)(> zu7qoe@R%&^{>KK`{g3lk$ow2^^1*f}6ld{5B}nDP{hZ=L2Vw*X7CNc-3Od7I!ElRvrqCTWs?fiBb+0zO+zzk1!y9|}qAew-emczMG}+Hn!~9%Wc?ni?+U-~0f}NUl zw*uO&%fGnu>`${t_NUjwIkL1rPnPx<3d2=yKl^L!hyAr<@USjC;)vQm`Uk#h*tgRr z!@=|;xUsH-JDcp_!Krg79|s{EWrxtV5IYL$R1ue8?hNyo`uz#bPahpY<~$m*TF7+(mCX_0S+gqpTkLoabpbJIt2ev z4TonX;5pGdykLZ*T{$SkUOL)yCLN2jkYmYe;v0m#fr=SmAr{9vfl!anKgW9PrK3I* z9h>U1>EFizmaUCWA-4JXn{$iVe$l6qzRVf!_uv= zk=x#J^D4-@4f$H_1RrjWCo|!OC)^4WU*QSmbbNLQo|C2HrnF6DV!we_* zo?;iC$<7pBJ^)ryzrw3l!mjnOn}7=M)dVNbL%~eYBTnIK+>M2=r^C(W@K{kjSqe`Z z!k5sL=uv*c7M42tiGq+O~rBOy$)6d+3u0eTmtrFZnu+oCBGZ$!Sy@n6VnZ z-v=}M!m6^cnmuw_^DFG}gWom5AKchZ=Ze7vMR0+=bb3HJogRtDoCv26TH|B1I1Jxt za5i-SgH3jJAyQ}8B~XlAbq?YK*|{7eoXahT;J=`}MpR%b=Nhc*99iigrPJ+@U z!CUY7W`Lg?RQnrh%!U|JC>o>7W**S|613!~6m9tddiIB2oZ_OrF2L|JkU{iCM^uNL zc*ymK=@h5vPn?&cKU1Ni%fnzxQ`oi%w%>*0TIl2!I7OL?-r`sky`gtR#5OL1KKO@S;vMqI{IXP0b+F@G5> zI0y?#%Vi_y&n3?!6zLxaV85GK0!ODo{&#S!B3vI2Hwy{s?DEP6UT49Z!Y0Gjz7;rd zPF)??M%NOXp=1GgaW-7N6Tp`mxccz{;A)|;u3`NkqBK;thj@;KYkhS|91h>@fR5a& zuAN+9Fj2V4|iM2nxDWl*4>&KJm?0<+jl_t_NNeNHSa zKM5<@0QZ&a;1|MmU(fcquU`y#&0vdhbdfSUwom5~RnvPT~V>t`2!k1tsw~ zq$Q6ipd*Ljj2)aE34e1~JucUWE7acO%0{@o3+_+|kGuQf-97lAFg{Xy&mx>UPp9kP zOvOEYwu0{?@FNA!$U{)&E>v9z$=n8>jh;i}rO;&+baNJYkU=t@BRLVCBX`5hE${Sk(bmtIL`(u!j!{&%IR5^LG=R9S7$qtmpZn@DH`}yrY2bTHt^C;Ay0|WHO4| z@Lq9SPGWJ}Z&2bml$rpgtBJoMn7g8Qg(L`h3Zc`W=23{vhB~FiS!hIj#ZxF#@ur;J z;?251FREL-Hw7!6#%U@(!UsmOgT*rkKyELXQ5L?ZLd9otFBISJ3I|TWp9kTP`dwZI zSGcW;U)>AOH2sSVc=aQ^4lo%dN*GY`5Abpq)U-qh0hI{l<}6XMJJf6pv5ruiVwb2> z37U~iiRN9QMN#NRswKMr1wGOroed~4lnRv?Rtu(3@e(;>A(!fwSl$9w+=rF9u(`6y zDA|N8OE%*ilx+S9T2cFwt!*InDfHS3y*YX%Gv~ml3ov>H}UI<;(+OHh+uO^W}=5?WEDX|}Vq(bV?(6bL@j)T!!WArbOa|Cj!U+L-GwWa5J zi2q<7Kf6o+su91riJ#!W5;(|4mHsmUE|O8{%dz4bJfS$HpB{#19OcrlU&EWD@V2?h z@OEqog)M^2y-V)^pVDG2gmi{b4!UQ9^JIyeE)?_ax4#_Z04A@2Q@!I1rYw)80QRmSxnyJCDQay|p!LCrj_` zoHg&`isi&|IGG6dpTNV-@Hh+pONEbP;WM|h_ZJ6~;p3hO9u&;SlT>}mw1uGJQ1)*K z=1lsOPl76uP?dYZry5E7)EENMZJ==#Xfhv~)`T82p=V?0O{wT!(u!5Wh<qD#c+Zn;CrhU+};CsD7)|5)$r~syx(Cm z{ED$#er{>tUJ^>(gwk~J^I>{FU#9mfcM^i%LwOeWi@5-`MnJ4DG~tx^HDee2nq7kq z>!D*dbn=72Q(?$Ykj{Dbn^*)Ul@*$AUN`uW-SYcUGcTV2E2ysDid(QfNT}ZqO>jc3 zCojUO(QwlYw>T<(w?4y5cE<0u7rY5H8UBuk^$bJ$-P3cA2whu}2j^uM5RFDjsmkKtYp z-2V$6%!IcI@Qx$p|Nc9Z5#V40j&u%iybRth;KPyuKExMLDHOuSLU?V6=XeJsa7qH| zbJhadaEk}DeFyChLjO@PZ~zQazcExOU}71V=L#$T2fM~WKF1>9I3)=va1$DPtv*~| z1UHC2;DrG%H^Hk;CZmjT6Ktqj85=s6ap8oOan+@M-zrmTFL<%PWlA$?nGjA+nTnMK z8I{qu*k$Ssg}6Xykq52xs?{~<7Y6-T!vHb92TV8t6W73e(l7Jl3s~?otR4?*sAQS7 znlH~0wotkFwiMw!WKU~*{o1CUHw?g2hVt#!I-muAmg(-2MldV_| z{v#lONCV4o4+e&{hHxSc3};wi-7Qd$T@8#&hE~;~O>waT`UZ<{(C+|@y948YgltW< zK&vf$3X5`KQ&HGlPH562DR7i63p`5TfoF%qxhrrn8ZLi@Ylqk} zf%iDJf%lW(f5YJEEqI}{Ui-k?UhsY%eB|T=e)fhh3hmoUlM!U}1e-W<8j3uJqJH4I z9^6SV$b)+|sQ5l8$u0zWvA;oHy7cET1eM|53Mv}`!84%33#ix%DwTq;+Yqq^BKts9 zjjiS)_yH88e|ih5y9?sWLw#}!YET3kveQA0W&hA&(+6lHjgYDc*6^YHPU076!VZQs{RGXXKnu0D+ykvfL64Eplf4Y- z`4)!dL&i85Sx->9keS36@2v#qGHJf0q#%}KhJIldtb|GYsI_GzRW0&DLl?=H# z6>fb8{}hHd>h~^C{B1Hq9lk(e>K9s=YJ~cZ2fx;Wtq2Xvgz#e!kp*!q85&QWLlbsG zn>x^zz(d<*LvPX#O$!nSVKiqlbPS~n9h(L-Pr)pEu>n?Us#R-Yb!XVcZiVi?0(%HI z^jIt$p9Lo>fxf{Fz2qk-N$9q=&KPpC)5Zj<$4Tx(G@g`{57h0_XeW6jY#|TK}HmI0-8!{qb1eL5fLX+k! zgz1rj=qoP!1(th?0@&UXc93tyom%6>_i(ZgoT3mFum1`+G|SBi@Puuw_>_uQeCBU5 zEC%TD2jTJS-{8pcxgi=%L)w>pJuq z1AQ03sCS@0Td<7#7iN*PWljf}tIogjNn`m<@BMZU{`eUV5SrxxducgN{VXRq5tfs) z;h+0(hkMX+cP6}1xbGC?drDWym421nxUA&v3*}EkNFDJWVu_$qosNRts??HjE42z0 zZy?P9`cV5yeKmHBBaH0?ov+u%OZuUy^I>WC`VLhj=(r>wNfU;Nm(_e7fD_sPU#Y2JyQ=cR<*8 zd?JN)B!aMx|H0sCFoa5mrJG@LSD3;!hD{BC#oQ!eOSlokmXLnfZ`37hLk4VQL&G*T zgw13bmd7m=wvQCT4l0&|hv9r1xNsaUQJ1j$UEtwUc*GuseI%{0&#mB#v&jf|r3T?{ zUV>XAJh&T_-v<>|LM>Jck9`HT|A1ySphab9X$QRrKp(a?yf23#eCR_M-VZV?FyVKY z#HNH#t_KT}VNp9l7~#KguEKvk2kY0sAG+Mn5ePq!3a6?;0eOV~RT8dKq3|2Oz|E@g zf(;0NSx69ML?L!M!hS3`lm_?u;AsoR7eR^UP~IIX?1T_%6;Xp^BBI&ah?rr}gwP_I zF<(S;jc73ydftUJKHMVuuw@ZhJs_KpuZW4%Dq>*>ETM=IOMAhVOR#+o>=+2gxnUzt zQu~OL)HLFsy>N$}iMY${9Px4^yw)%DxP%T=@%B zttGBP5*4r9fD|e>WM?Y3p9LK|LZ>A#@CpoR4C(AqW&OTYc~Tlot_chK!s14-q&)n( z9Db_}8#qms51fKODSPEZ>U@^?DxV{x%IC#hZrIBA*^0{dZ^8$TO65-!w(_U*CL^-w zesE>?Bi%}Ydp>v$hY~ClSyElRvcNkGd~Sn3H)3P}<%|qt-N=Z^5IGI1aJ(ZMutsFE zx-^P~F5Fv@-R44f?&-)O7hxzBj~pH<*saJZnriA8m^KuajEA2z^D?R%nWtE`YQAk1 zA)hl8d5n82^0-2~!J&z~NjW2LQP{}mo8cv=J@VxXlTpQv^IWA6p;fVO0mXlVlHH+{ zumnMvAB5XN9Am2_e1ZD=pzTR$KN!A?hyEPVDg)JdAooX=2|vKZ?J(&M%x?<|X28Nx z@Jl58`Wn`+gxyZCr#b8`3#W>~UmV*ie`$gn+&EQkZh%{h;hElhSw*}t8C450RaN`b z;J~@BT8h1_>irY=5L(rcM_?%m|cHOSRM`ktohj7G4`6Mp^^mQ$CiTN=Q&IN06`PKe1wJp&?pHSM?vSh&~+Ac z<7Z0L;B7F3-H%G22UF_7)J&KrmhnLmwR}6Q=noq-^Cqpfxh3rT9`^5n18h{(d46<6 zUC4urwcv`Dyh_qhSGjego-5LqCB+$&QO#5i3~qyJX7;k0eI-HC)f||1Us--M|ChS7BF6>OTuD77uLl}M(M%;jrWK>Q6 z{8KGQ6XbGNR9nnxsR3A891;qu==N=CZmQEXQM{ZuHe!H0@5IG9|SS1M&;HJ`7=~u(i-(gKvGrl zFLWZo8eNJAwyZ|F2Mmo7dZh+TYy2DnD^|hEy0Cp1>|j4??Brn9I7+c= z9J3SbV2v9@U*jg9AT@4Lk{T~|z^e*^*62dj!Jfkq?ZBkbCEtKoGL+_UMO#QPy3z*- z<8(&H1w;H8(ANpktrkLCb!q1bsgxwT_Y_E@;?aGGD!MNvj_y|oGM2!|`H;B>a>+OP zdq=SgR{R62yu~xvLFUmrPr$BC@YftTGY`%-hC9?W`d@C-=zm{;z7>ytcMjgKF&Qz1 z7l0EdBF5Pkya_VKmm0+Q*+cjSs7z=vk=>#Gcu3;jkI~y&^`B zura4J^BuL`Z6q$k%dPM#3-o(;P2)M(gbNa^>G}ZN=v>p?5B#}9YnJH)fuT@sB2?FV zHGYH!ry-fWtl7u~IV14lT|H7{L(E2YI#cybn=ormX~wOY3EP>7RL%YG6#mk-I0c)g z!scqQTkGz15R^0aIBCV6q%N^1H^Euz7kl;2 zR-NBvn~d6qCzy%3whgy)ZMXlxgWa#~L7i&{BtV&-5NHDxTY!Z!)wVo?$`q$|uggDX*R?>#(VFKa(k z(x2VnOI!FFYBK70@R?Jm_!=ldkaa@KKt*<|j-?jVJ^*#+K)rgj1`ch5xGZTdSCci?=61>EA-w@(yz0Nd$7*#4se<>)j31Vbf`2vXy|M67!#=aCb-%PR8TE?gfP0`g z4gq_i%wq`r0itR{HBzlt-5=`PL868wzJ_M3QLhDux?T%5zFzl@kg9&E>_@$fLok9o z>WyTzdO4&}FLy0WkB6UsgymGS-iisZ`6+B^4O_LwDQ=v4f7yzyaQ774a}nF&WiGth z1FtD(Tp=Qjv%d=ti@}>=aXw4IHx9x=AiSe^1hqINaj~QtSDSk^uJLF{X(66N*AdW- zkM+3j8aC_!=ov09V;E%ZgKU%71#|gWiktT@%-;#W{tmy9Tik{i*iRAT4pOGLKZ!Z+ z{2jQ+S&O?A0e3dTU5;bizeC}LBfM-UxGUnm>b-Ad8E>LVaW`Dj z%$KQi{JnedpdLK5fsd8p6V-_S%&-LKYv7U(u2Uh9{YVIU4`oR@A&Th}s&Up5s{afP z5+RubmymoKI@E`b%b-&N^yf4s4A8KFdNsZ$OeiGSl!W=*`w0uGh^w$(lWvFqoK*j4%AcFd{IA-gW)L~U;i1aCEET0g(`r(9r#QKKMrf6 z|4Im_E{T=*KxBQW$3`W_&4l>U(1I`$_5FBaOKO$a;~VtUuwG%1(H};TYT^jZml-2I z!svl8Wg_J4g6Z5Ti9b@N#Kr4j=}A~O3x3-R8`XKoW!S?9XyP7fka)Z&oKUO&**)>f z61X}7uGzvv_BZj-VR$?VK6A1Yzj7NSex({ouH0KmZuCoXTMk}-gEw_f@+Oa@P^y+x zkqMG4>|j#NL#S0&_-E?!s0xXOMqZbQ-ks>)SwbeHV8Wn;oG3* zJ&4t-+CM-G7H`n<5wzB;e%uue2FAmn$}s*dOdyX26Ia80Ho3uqX|Pa>Zzv9%YQkn} z-{8*;aG0N=4UTkztD$hMI$ZaF|GkH28u9Fi$!KUxYeTz%P^cq#o`MqWR>P8Gp%S0e z4Z}Dk4a1j0Esk=-*auLj2sAkX&C{VpE$G6e4ZBW&Za>0sPHe-G?&4pV_C4g<2=2>< zOG&!nGPbed&m`S2Pit)BtTo*B4*on0ha19?VsOq8^j%-W3wrNfOSrEv9&q#;zI_Jo zIeHD>e=r%zPIOLot|BX5JyRp<2n4v&0awZmP~G; zel4#R+`c)W84U)$+hp~D!&J`xaz(hMi z%*oTeVFndXp79xGb7+$1${rz?!eHZU_9@M^L8Z4MSmLUGW#> zwS_HZ#3tCz9wl$*Cr{gb0s9*BITsXvSm3+i3X2LOUoaE!};Y0~Iqc#5C z2Ir^11rN9!30DdUPGa(%^Kh5DEcsvVqvYoY;H3)jQkQQz%E@p4hIfPE8~0!%(+n^w zf<5Q2k;64`q<)P&zk}lGP=ew#3L@r4WoJV6_U`mEEBZ zb!k+0D%5KNZQ4Lv@@>?v2lQ3Hero8)F>5rIooO^~5@c0}nVSBG`7o;&ELVe`?;Gjw z6dL7Cge{9<>u@+w1^%oChf?4yo7d<(w@af7zr)>^pihfN_c>RMUjGJ4ztKCY(b$Ih z8rv;`Ld4g&_&6x(FCIX-4^WbjT`5I9?KecP(x=QYuyG!2J_~s#-~jv4_>i+8 zx5nr7-X%N1No@Qd^=tg(KX^J9K6HhToae@$PMeGr=U{NT1Fl;kpe6*yfc~Btt04{@09j?px0_h+W~#zpnoxO6$Y?JDFfAS5I17VV9s+& zRt3oJ3ln@{&JCDX1LkvLQ&w$)H7#K+yPC576YO#l$Kgm>II8IL=fl}=aE>iYIlmJg z^n^#N;IYDZ&L*e4cmevyk|t|dsLB5*V$&#U)pYE7ILZV~kNpWJa^Vy+H!Yyz&7!$+ zn&}g>S#uX?RTNrt+MBiC3>~w9G`$wKDdqpk2%oj2RL%lWVDSN2`B$B8SV5vT>Cnli1zgoAdXqu z*Do*bL8BZec_Q_ zJ>C!haW;B9A(kFb_3HTwc#&>0Qj3-lcfn;XxKg#$Vzz=Bq`DDWs@o}WA0SqX>)_!o z8iHpjC~g+&SAtYiOCEz#7r~2sQ%h6HRDBbZ>cbtH>N^qqh%ePYLa+g;0YsWwW;6sw zif0hC2Fh~&Qp>qQFh?{sSZkCY3;O5G)Q}wzs^}{&1510Tq>RFDLIh_#wd(f}RSn{n zLYuOnZ$ndu+d;Ngo1tWuDm4B3OzKX48l;}^f(vf&K(F4iWj$?Kyr&EIQBU7aP>I}n zR-^1a8}iB3vjxTJ+1UcUxZ`_{s0&$NVb*$B)EU;yhfRFk^xS(N4zmkAuT$}!_e#RM z+a{xzi6DCwq4vFewm>=Vqh3{KL2P4ak_K(dLEl6ebs2IF!HhyM(;j|c=3cWYPOrI~ z=U(#(yw}1c!R^;;Z8KQUmi5}Ien-c`+27!54|tFc??O#RZ!;z7U6_6AUD65suRxVY zP>YK9PFVUXFwTwDwfNxJu&FD4_+VJ^7u1K;gXo=?%V zs+*xMrAuqV9gx$J?Kl+K66OF&%E9+pN#q}`U95KgXL+kjU(S@ z?@`$22uG&E?JRhB0-ipBxA7*UuM;u%b-xLvHiEw&M1O#K&QPB$`!<>ez5BtyO_0u# zeaD2t0?OHU83pUR<^cRkqI$`}LBG~Dp(Aza*NqAKrR|0ZpCMOWe&_^0Qk;HU%&?n^_uKahj$DVE z9KwG09pFC#>i0U%Wb}861@{>6Y6aehA#f7JY=wGHA@LFD(V%}XGVed21*EgJ{WD3w z|GW#ZGzwOv!TP`95ND|WiEKE_QR#o4LiE2?4&H0#Z{tkHfI=If$WP#&0U>Q6Vg^)W zp#ino)d6ieAOkvcYzOqDBm)KxhMdzdi(MG7kaIO)Nhw(Q5`O<34yob9bT~f`p0$Iw z9pMYb8ECKp10CLiKama$CaQrJvK&~2IuC57_u4Lpj(Z@r28{KANo6268s_ogF>o_U z58OEi_FaNM+0cQIYoDCS$zp?P;h{+gYR|tx5PKS6>(;=0ZZ%EZ%P;)rcJ`RZ!q03R|^$7-4fnm>JCYv{8 z{wi2n6IR}WeH@D+M?K)gS2)Ku4tdBy8uE;C4te_=zPXr;^x{mAuD>8oFUuaKS7he& z_yS120nIDIcfUY78<3vK&ZK9vZu%td(Ddm{pT2q&{6_uK^ZtW9P2nuNpMLp0{8L1* zQR$DSn2e#OFW?Xi`uR50^%0b`g)rh98Z`rI8W0x_->rsj+;2nm@i24f50L(W!UmCST`Gfc?0^Bs$u!uIK%#02Iqa@ zD)|n3`x?Ho=fiFKf^$6xrq08|8bcJ-9Uh$mal|*g{b%S#*@vg8pZ+a%_z?Dd_zdbd zd@lJ8Uu=fugf@JyGwALaezX+)MFhkDtp)$JgqN-0gTKkhDDe*bxD7J+V^||2bOFS( z-5JU3LPj$VW=31~C}SY;Weg{yj4{+SV*=Zqu{af0P|l3Cq?NI;5*%RzG71PX-MkPmVo(Ve|!SN(GQw`2_gDWIG;?*tqR3E517JLdVboO4#;6%lFuxt-6@gt8 zV$}Z6@F%Bf)XD2`uRHvY5|4Uy5Z>}?v|$0S-VneC!07V*z+#4~4WQ`+XmbEMmxfd} zW%Rg=pjoaF+UPsfbo9e)c*=Ph%sOGu!Bg)?jx_C3Nh}< zLU?@|K5a4?S+*20%V!w`{Rb6^C95i3vQnr^R;wq_;VX1L20f`?RyH-rnpP8LFiY0F z;jsBI?DB?voZ_sbY*d#1GoGvmiSU$4X1%LmGR7Art?{0mjq%`X?s zZ6p+?VA;j!mmSgtA_hXWhESVRlHGa<=piOMm1<=7Tnqgv=LAn~$q5#3s1gm;M?vk6(5^Xj z`5AhuOMgCYCQRqkal#z7Y{J6s@H6pE*ijqw=Oz;lal$5?SPu6h;D24<WiOl({NI@W^6)(1X*`s z;un}kEK_EbfmxMc9{2B*h17YdVyJo^48KAEhr*$IzY28aeuinu2FbtyX(}wb? zJZ)rI7;^@)snE2^oX%;v4lt9_O`BT`77+NfrPONL@`JF3qcZK+MX>QT{5=cacZSaw zO-7Ev*5=qzh#bd9P?WTC+}W8NeanL?J7NUYUiBuoZTqkgyjH!ci0!MTC=Z7Da`N za23Ubn{XE%!c*{Vq^VE|QBsr=UZS+{7CypP_z8az0FH{(QIR?-Qb$GVs7M_ZsiPuw zRHTlI)KQT-DpE&9>ZnK^6{({lbyTE|iquh&Ix12}Me3+X9TlmgB6U=xj*8S#kvb|; zM@8zWNF5caqat-wq>hTz(HdzPy$TdTqO2$fPD;T^DL5$wC#B$|6r7ZTlTvU}3QkJF zNhvrf1t+E8q!gT#f|F8kQVLE=!AU7NDFr8`;G`6sl!B8|a8e3RO2J7fI4K1urQoC# zoRor-QgBiVPD;T^DL5$wC#B$|6kHUzivo91;4TW>MS;60a2EycqQG4gxQhaJQQ&SG z=B8n88s?^9ZW`vMVQw1creSUx=B8n8)?v!mP5HVhUpM9JrhMI$ubc99Q@(D>*G>7l zDPK3`>!y6&l&_oebyL1>%GXW#x+z~b&T-c!+gDtb>v z@2TiL6}_jT_f+(rir!Pvdn$TQMenKTJr%vDqW4tvo{HX6(R*5>FQ-?*qP(aeLZGD5 zDyg(eDy@=AtEAE@skBNet&&Qsq|z#>v`Q+il1i(z#`;>(1iqTUR}=VZ0$)wws|kEH zfv+a;)daqpz*iIasxH2&i?8b9tGf8AF21UZuj=Bfy7;OtzN(9_>f)=q_^K|xs*A7c z;;Xv&sxH2&i?8b9tGf8AF21TufFcc0qydUFK#>M0(f~yophyE0X@DXPP^1BhG(eFC zDAE8$8lXr66ls7W4N#;3iZnox1}M@1MH-+;0~Be1A`MWa0g5z0kp?Kz07V+0NCOmU zfFcdBMyeeQ&<+M@2LrT&0ouU;?O=d*FhDyPpdAbdg&^e?q}+m(Taa=KQf@)YEl9Zq zDYqcy7Np#Qlv|K;3sP=D$}LE_1u3^69ISKRdQ9vmQC`AD^)1=KbX-mCoX?>;X+vu{r z=qS2aQEL~qcG2S9^nk;^*09xDW3_@@r`C09U8mM{YF($+b!uI&*7a&#uh#WyU9Z-S zYS^fTjcUl#Wu7kcte5JSr+(YiuuToy)UZtrJN4d9y|+{E?XmIf4 zQR^PH?yUT)}4yoT! zH5|91*5hhDrOQ*gJgrxMThZm;YQ3P#3%a~uz0_0}G}UD_Tvo$1y}D+7r7qXh<)+@d zZAA^Y)o@!4w>9=(HTgjqYl3fj@0;HH#(VsK!T&St^vcfqN)2{&=6}##=sgF$=U{!0NDT)HYdBC?!-2vY z4jga8f#YpB@Bv^r@Bv`xcV|PtI~)4l+0gIKhJGzI^lPc1UrYI)A{LrYzm^*MwbanB zrG|bjHS}w#paHTbE)PYr(722JIssLH5I8FeY6E@jlEjJlLjmvU+? zr`B?6EvMEBdar`stDyHPSl`o#3K~&StrgW;QLPo#T2ZYP)f%SOFtvuMHB7BxYOSn> z%4(>rhRSNFs`skuy{dYzs@|)v_hPK5Aw~@`YKYM+F)MWtUAZ4 zbF4bYs&lM5$EtIzI@eX_y6Rk4o$IP|U3IRj&UMu}UR~nVC0;xR%@-*S}U}6>eo*F+NobV^=qeo?bNTG z`gKs34(ifDT{@^s2X*P7E*-30G*t&>*+J*8gU(+Eoxjc++gW2fYiwtY?X0n#HMW~t zyQ#ICT2pnIs>@XCr8=jobE-P`R%>sy_Eu|ewf0tPZ)>Z<=&dk%D~#R>qqoB7tuXp( zY+sG-tFZ%gIY5^Kte2WJ7Rt~<8Cobq3uS1b3@wzQg)+2Ih8D`uLK#{pLkneSp$sjQ zp@lLveWs?*)byE}K2y_YYWhq~KSo`~sLL328KW*^)Mbpij8T^?bXM}{ zS?Z$41^%r|sC9x`C#ZFTwN(@7VZxZKE_#?S^e|!QVZzYEgfUI6)6_amt<%&xO|8?c zt(suEx=dG>>FP3FU8bwcbak1j*4b9nWwyG^R+ri8GFx3{YZg667lp>A}#` zgQ2GfW1%`PROf~2yijFdsIo6q*%zwp3sv@oD*Hl}UC$eao;Qponq`S*S)y5%XqF|K zWr=24qFI(`mL-}+4=08mPK;$5woJp8Y1lFiTc%;lG;EoMEz_`N)?r$FnHFEB#g}Q% zmub(JY0sBw&zEV>m+5fniO0|rkFi2)tk4=Ow8jdpu|jLC&>DIkGW0xTtX4lg4;gwM zGW0xTtX99()_#gbk4J_cj|@E?8G1Z2^mt_G@yJ-G&U!{N^o(Ta8OhKylA&iLW4*ep zw|3Ed>ownc<+fhAtygaAm7AWW3_VL3dX_RaYJ!cLV5273s0lV|f{mJBqbAs>2{vki zjn)ZNoQ*2ZMipnHinCG0(PNpR$1+2YWk#N6)?=BGr6IlXsLuP$0&sr8C3uUpZ3*Y(~lUEZ;x_wMMud%C=*%ZGaP zpA}s`)vKr0SL*jdmoIer!g{I2U#N7i)$m#kuhsBQm+y4>Nv}RxU#a1fMtstUPb&6T zwSHCWSG9gs>sMOM1`TF|2D7bR*;-%G#cWF#v#q+=GJ)Ba-7?#=BTv)Az)mm7sh1Ke;_gt;0!CkN1^{TjD6}P@p=i=&IO7E4@d!_VVDeHTh zzLcgfrC3TSmQsqP6eq`Aij!k5#mO<3;^df1adOPwn#EhQcxx7K&EliSnWMSE%+cIn=4fs(b2K-YIhq^H9L)`8j^+k4M{|Rjqq)J%(cEC>XnzqP%7C8H z&3Z;R>jB)X2XM0^AGM+nl8LlJs7Z-b>bHvM!UYm+GQ# znaui@$*gag%uUp#iMlk`tLD~M>fBtNo2zqkb#AWC%~hf1s!(%PsJSYnM|N{-4bvmL zSzqdy+v~EuE<5S6lP){yva2q8h+d+P6}9$JYacDyM@#n6l6|yfA1&EOOZL%{eY9jB zZAu?)N*`@Xf6dZgv-H<2{WVK}&C*}9^w%u?HA{cZ(qFUm*DU=tOMlJM-#Ux7c95nT zq^SmJszI7+kfs`>sRn7PL7HlirW&NF25G86nre`y8lcQ2l2UoKmT+MpWG|$xKOzWlQo2mI`YQCA8Z>Hv( zsrhDVzL}a&kEZ6?8m326vmQ;&dNeib(bTL*Q}b*Mo2_B9HEgzZn8KK?FlMW2vsJa( zs@iN-ZMLd5TUDE<>E~(sd76Hnrk|(j=V|(Rntq<9pQq{PY5IAZex9aZps@=yc7et& z(AWhUyFgbF+?)~erH^;@fczpCG6E9$&ioj0rVW_8}I&U%nD>p{+}2RXC8sx#}WI33@SoyvEo^4+O?^&OsB-{G0{9iCa=;hFUvo>|}FnfGYe z9u3nMd1if)XFjM`dO$Pl0nL0wmq&DY#CoX-j%b2oYB;8bV`@02hGS|tsfLqkIH`t{ zYB*_a(2^&$<6!UfK zD|NZ9F4xuNy4KJGi}{vXZ>jZ;F7N14Pc3FWwV3az;hu)w)3AFQ_DHRd)cQ!RPjsno z_{{o-&-_H4pQ!T_b$+5eo+yv!>i1mzo~z$;^?RlFUg^D8dheC>J&k>(v2WG-R;?fO z>Vx%_`h8Hp59;?>4WHHUSq-1n@Y&j+3BIZIn_9oosy5)##%#Uh4I4YXXQ%h<^qzw* z9dzkny;K(m=Cjckh&K8H(MDe&+UN^J8-0OjQ$!<*Xhac>D5}e%x-6>8V!AA*OAo#B zu)b1*hi3NB%pRKALo<75W)IEmp_xl)Lh1XhaE(@X`n$ zD;nmnSN?hxs8{;d&qiPK+34Fm8-1H+qi^$U^lhGvzRj}#LYMj?&qiP5*;G|$eVb=fT@BUM5TnZ&UFv&18-1^5qwn=> z^u3;q9ujQyd|;#J0~=oXsm{&dezkW zN?n?&OH*}es)d@WU`z6HRAw3duDmm<)*~m`DOSl>`!2vdrn26UcFrAxoAlSY=h}DoYnEz50c9_iO+2 zti3;<=Xv)2Jntv@JfF|m`<%>nz1#KLs>|4_%h;;R*s9Ces>^KWc{|TLDet7blk!f= zcWJvz+g;lBINjrPPkKsa4}W|3+r!@;{`T&5GXJRKA9ehr4%>1W z+j7YpErgCQ>G+b4uW0*fDs+6^(bv->DmKqD-_Z6AZT7h`_PH|mXtVv4vHg^J(2-rH zj9sS8gH#@LNxMv$2i^FCZu~(v{-B(EF!}eIvHg^>{gko&l(GGkF>Pl|+Zoe##s*Wy z22;j9QpP?~#y(QUK2pX$QpU`lF|%jP?3wTCFl}c{+Zoe##x$ET&1Ouq88c_b%$YHB zW=w_|lVQeWm@$oIOk)|-Sf+=+9v3p9Wgge@xQ@qlJf3zK<>N;AxKTcCl#d&w*)P-2 z!t9qZ`(?~@88cnROqUsQI^=XHJ*6_DZA9CMwlSw;PRE>@%QEJ&jJYghF3Xt9GUl?3 zDJx^j%9ye;W~PjpDdQui%oOD*%2Sl5+_NbwW6H{ytukh-jM*wPN7-zZnWJpV%9ye; zrmT!9EAw-0KiBqiZ9h-jSp1yD&$<7(ko;Uoel8?0vap`cn6fe}sc^c&!K%|&Qlae? zZLe_ps5_Rp zDP1yeaPCL_`?M?0=o1v1Sl1yfappv1I%wvg2Rg#;`=IQ0><>}?=<>`6+HtX@*Y=KIFN`Z>! zUbCKi&3f)N>$%sg=U%g(d(C?8HS4+8tmj^{o_o!D?ltSV*KEYqnW^CK1CBo6=tGV^ zk_x9EaUl-|W<3~~^!JE=vbp;jgB=s&e3*`wsW+d zqwQR6=W07w+qr2Q2Ojjwp0D?Oy%#vTAU&ez>7wj~+Ah>~p|%UtHntwk$$B&=>(QL# zofU%KXXts%CF?PltjAok9&^ch%q4p*LFuR1=CCn~ib_ugfsa#6sQYx2Hxs=MKR4z?bc)pb9OL@MW#pNt6XK^`; z%UN8`;&K*isjQ{4mdaWxYpJZIvNl!WbSnN|Iyg}~%orf7Rp;F zZ*{aaJz}<%*;Z!TbZpbHO~($W*85rO{p=2UJLv7;eh2q=P}xQ7O$Ft>l=o8JOL;Hl z{d)K7-LH4Q-u-&_r@dV5cc=T^>3%%+BYiisyP4h1?8{ES?DWg&DKB5<<;%Q$nU@1p z4p2Ejv_wTf`%& z(Dn%1N7%M%Ya_mw3ccUc`#rt?s_kF3{i`-li)1}5lKod#JF54n-lKYt>OHFWXxi&u z%-C5ocGirYwS3K5zGf|7vlYD+y?u`Q(j$6(^!n&Mq2mc1Pw03;hoxoqN7{a*?MK?4 z)b^ydC$&A9wsG*J3q9#xo)niSaeETCQ5K^ttWC2|JAK;e)9EP(Pjg_N&YGvQ=IN}Z zW!BO%`N}*(hZ#F-#?G3tvu5n989O`Wl2a}@<&q}mtcf{mV$PbFv(}Q?c^305=2^_M zm`^Pvm$^G@?#`OKv*zyX&zUXiSk$qoV^PPFwk2&#+LqEb%1f@Xe<@CSOQ)Z_3>?_(#?^)A(_7$#P;p!ExUg7E$xBH6QeZ}p*Vq$s4#G)3+ss*yI za_}k#uX6CZ4wHJ;q@I04uSq@ohTb>0e}nrsxPOEDH@JU;`!~3MgZnqkTW^@Re$AC7 zZPt=D`)jU#&6Oe{t4PQy60(Yf>~GQz*Z7TVC>OHIg{*QRt6az`7qV|rQ7&Ya3t8nt zR=JRU%Wb^nHWUt7g+uloM+%4RJG>|yvI>XnJG}fs?;rI3LGPcO{>kZ|(o@QRqWmYy z@9BL{uf6}=8OdqxjN~+TMtYhk=gvr!b7v&Vxigac%Ozz-BB*4kBqc>6sQ4%#=c9m} zj{~P^lzR1ozuT_Y7w0KJN_=xc9FJ= zv{?z~E^>{FT;n3wxX3jw62FVY?;`QLC`p0bMM);+E=n>n_dj^CY|i~pNB=WD;?IgX zXT_YeV$OLICinML{+`O;Q~7%;S8BUbn^knqE_=={d(LAnxht7nO~uMOca5WsgavfY z0y=l2qnlIV)WSG-GcPyuax*X1$vNxfoON=}Iyq;ZoU=sESt92wk#m;FIZNc6<#5jW zH)s8uv;NI_7$s*BoU;hdSp?_yq-`uLf^$~Axqr}W)tj@{%~|W_EN*iaw>gX3oW*U< z;x_jcZC}y$m9&kkuW)76oBOI>&zIypUy}Q(UW?$IMR4xxIxK>7Ur#%jd4eQ&AC>#4 z+(+d;D)&*jkBTQRa`!=dAG8lrevq=&an9;E_pr8ywORV+9!}dhc$kBSIe3_ZW_r!^ zn&~yuYtioJDZX_HoYkan9tL zGr8tWt~rxy&g7aix#sK*=j;vV><#Da4d?6)=j;vVx}|Lo2R$5EK<6x=a~9CK9u9gq z=;5G;gU2a9PT8V5XHlK&*JjzAvuw@{IJIKVnWA&%ivMD52Q!*KIHTxsnBL6m$#D3Tgl}= zs^gNr=&`A)6m^5>_g^vv}^$$7kA9CJ5;odcf(|oPN#e*V0q|zQ*4{9S3zB)M4$CKcwxDwr@K6 zW_qOen|i;=>;WAQ=y*WKLr$Agp{+?<6Xk!=_AlDL?daQ%+8wp0NAx z>iD6KVW%Uh(Dsz0r_v+6PceIn*;DT2DFB|5B~SUAc`Erwk$)=rC!K#P`6r!!D)}d! ze=4ah@=qmIZvLs{1HAmx{5{Rz)BHWnpLI(9Y5tz(?`i&?=I?3#p62gq{+{OVY5tz( z?`i(3{8jm@@>k`r%Ad!l@*bbcdweQi<*&+LmA_}1JyS)j5&#e-D&7j@WE&A+JQMIA4u9c*7@+n~~*(xB3y z(x9@eV_Aof3-dlM%=@@7Zz{_FG8KA%srQ$9f2r3eh529d{3|NIqVg*$uQ`3q>1*jJ zi`Q7Z#^N;=uZh74dMD_epm&1aNo^;!oz!+RZDV_q?Mb$$sGLp(z0>r5>-4uyJtdX@ zEi+F^<$ufUx6FR)lD`%9-wONNEZ%1EHjB4eyv^cm7Qff~d%eHc`+L2=*Zcdlm%l$! zc{dgG-lg|0y?5!oOYdEJ@4D{0uKTX*zAL%jm0a&8$r`*baS&uuk$6d_+C=1?7E+-t za%9#G%(}suRL)E;6r7n{DDb{P;C+L@`v!sc4Fc~Q1l~6Yyl)VA-yrb5LEwFZ;LPN& zBKgKeg1-;&_W}M);K7HqeMsAf(l*!lkZXABJn+_e;H~q(Tjznd&I50q2i`glymcOU z>pbw*dEl+{z+2~mx6T7^od@cJ;3KY~J_ytYf%+h@(;L|74ZH##cm+K03V7fZ@W3nJ zff6E6LIg^PKnW2jAp+Gypn3>Y4}t0-P(1`|bga>_M#mZ*Ytjx^TjOfp!VcEBnzyin zb6A|i!hUgJzc@ID#W^g_VWG+hR2hLPBRH4Jxm0W)2j`|LoGL#8fwl{@ zU7*dDa&Q6L3)o($*XD9?pS<vUYF z!}2h=F+HMUp%~ok)Iu?^Pz)>-0}I9AX7_iq`@31#Zx;5OLAHVntRMp`$iNCRu!0PH z(i(U@BJg@da4WN0ncbS2$&Fj(->vd*J1>@-f#qgkxfxh)20oDud?Fk8L^kk=Y_Oe| z?YwN~Wjin1Q!lc3yDZ)=i+6Imlhd7??&NeQr#m^_$>~l`y>1bB-6HV1Mc{RdU?-FamaNy(Mz)Cpqad4o>3ieak zPh~$9HCLeK3Tzq&cc*R4?q+s3v%6hGMHZ;Y0u@=HA`4Vxfr>0R!0Z6C1I!LEJHYIK zTRUKsinc(}7O2t!Ra&4*3sh;rLAD3k9%Orv?LoE&*&Y<3gCcZLgbs?(K@mDA><5MY zpno0*{qs=p1q#045ch|;Kg9hZ?hkQ)i2Fm_AL9NH_lLMY#Qh=e4{?8p`$OCx;{H(T z-v6e1UE^NYxYsrAb&Y#n<9;3Y>$qRX{W|VXJ6!yJ7r)=d57RqL?=Zc?^bXTIOz$wg z!>OK|{1)YJQT`U?Z&Cghk5N8G`55J6lqac7QkkSONoA7C^E#f_VdEpP@e$bg2yA== z&$E4j$_rFppz;Eh7pS~I<%Lwmy}aOFUJ#)dMCb((dO=3mISK5X1a?jWJ12pilfceN zFvr0h2Xh?EabPzku$vOtO$mJT5%}mM@X<$Lb0x6368wkW|Iq7My5K+3Uj95w7u4z1 z>AmFWrSyo!ODtYu@e+%dSiHpIC3o+tT%Jx;Zud;pBZM^C>UUeI&#wf_BylI znZ2R+4ZZfD0(($_J*dDQRNy0*z(+2Dk6Z#Dxdc9P34G)d_{b&jkxTGvUVhDsPg??? zwgf(H34YDXuX*`3FTbJZ!hFMOt zoMt)o0Z$lc3$z8=?Ei)K|3dqJVcCr+Yhq+Alna9{xIbaQ~ogJ4^#dy3L4iOHb*YNAElrI?sj9bD>Yt`&23@+u#gsaE71OW=Au$qZ!)K4DD!! zpVjfXROtPj-p}d%ytdD4`@FW#r)?}g?~>jz3B6+yddDR6j!Ebplh8XR;bm;ENCgL1 zaBu|&S8#9z2UqF6O7B&AEkZ(zkZ^r^N_joy^_17U+Im-8?`rE^ZN00lceV8*xn8zg zyM)#*p~XsQu@YX#-wjT0aC$>}%KZ)8-@yG1+}}jyCMq{kxrxe6RJ<_~dSfK?#z^Rm zk;Vmp~VQ~wKTUgw};x-+(>9|eDZ8~mCJGi=ytJ|sEPUUtgw^O;D%I#EcPgPv) zc2~RI)$U|*CyP5-+{xlj7I(6^lf|7ZcGKHUZ#TW&^mfzRO>Z~7-KieWyLsL%lKYtL zW44dkK4$xveL=?;bbLX_7j%3f?cnbV{C$DHFVXuFJs-z~K8_2&MDI)VzC`aURK7yx zD^z?s7k-6`Pv^p~q$*r}mEKqB`J68ND!s4L^B#EUJ@C+b;Gy@x!>?2RI%S{Tg+99r zeRdaqowCpFLT`VE-u@1~{T+JyJN&xL@%DGTdH(bMu-=P=3Loa@ZUi=Qd_#JxjJNZUog6%zQ?_qln+k4pF!}cDw z_prT(?LBPoNp0QVJ?`%w_jeyxK7$PJD z`9aDLQht!~gOoj?8$Rf|53_if#ltLoLK!~HqFG0?j%FRrI-1iCu9~@O=Bk;iX0DnI zp@mrsvleD8%)X=TJKDaZ?K^23SKs04J6wI2%6F-Jm&$jk9MN_}Tc@K(Q{nVcDvwfm zl$S?&d6X9~!h~Lg3B3ptdJ!h{B24(Gm_90|kBVtGSKVCoIO=iqxTD9@BkmvP{&DUf z=e}QWzutbm{dz4aLQ9I!Y9h3n2(2c&uSvHnh32XLaT|;Y9h3n2(2c<=Tkk`ecpAScirb*_j%WS-gTdM-RBMF zd4sY32(3Rt>yOa-BebLlEh$1viqMiGw4?|vDMCw%(2^pwkO(a#LJNt|LL#(~2rVQ+ z&rpS)p$a`i6?%p$w73W@E<%fo(BdMrxCpH#LaT|euA{D_o_26m=c>+?wMJ;I5xzvv zS|ha92(2|jYmLxaBeZe|tsFuthtSF)v~mco96~FH(8?jSatN&#LhFUldLgu42v;bt zP+pWvgccW}#YJdI5n57&mK32iL}(2WT0?}^5TP|hXblls8-&&d zp|wG12@qNWgq8rIB|vBi5LyC+mH?r`KUDaK3ja{yA1eGqm42ww4^{f1N}w|2^|XXf&#pt052%O3kvXp0=%I1E~vee2e1hi zYVU&DyP)w@Y!`3ho!-uvmPt_!N`g6g`Ux-KZE3(D!_3yKq=U@j<_lP@SH z*eaL{3g&`>xu9S!D3}W$c2^4Kf`YlAU@j<=3(Dl=JB$eq{(^(Q;NUMf@D_GK5nWJ3 zCtq$%&{ISg6ww7mbU_haP(&9L(FH|xK@nY0KNr->1r>5Zg{M`Ue4o1tz7sdi%+unB#Te7_#}%@viKy6PqI)`7d}NWmyP)w+S>polIgq6>=Xf+D)0bS@~J3rgpL(z&2?E-0M~O6S7u z#-?;GsG19^=7OrZplU9tnhUDtf?BztRxYTO3u@(pTDhQBE~u3YYURRiuGGo}wQ@nN zTu>_)6vqX{aY1ohP#hN&$AvF&pg1mkk;)gTe38l*sr-|+f713(+Wtw~|E=x+A^tfP zdjDDPKkNNxPXCvV|E1%bj=q^5QF*}W15O`s`jFFyoHjXXa`Z2bzMTrE-=_C%p1;lW zx83fy-EKRTb}H>u+NrctX{XXorGrWbm49>eZ|M=`f1~_wl#lA@BEC=b5`C$l+(+4N zZQ%)RPiT8W+Y@OU2T!=#6R!3I08aq$L&`s-{6oq=r2Iq5KcxIa%0Hw$OmCRpFuh@V z!}Nyf4bvN;GD2m9$_SOGv^}NmDQ!=sZOlAiQSg98!2=eBr|CUS?`e8fr&Xub^pshZ zndcq~Rc4-hC_GE=S$faXdzRjF+Md()oVMrEHnz{PeU7b%6$&0!D0o<*;9-S=hZPFX zB}GwThJzUnW;mF2I_q>cJ>~Cb+J2_(XWEWCJ?`{)dP?QEOM2>{aNH%2yX0|~T%i17 zDp?SwYZ6%;&IP&na|CtUKR-jjMy>h**{;iTS^X|EeP zMdcKgQ&dh-IYs3Zl~bvTdp_l!PoZ!Mh11MVGds=fG_%vpPBS~r>@>5}%uX{q&Fr_# ze#`8)%-(kT`&4NAy|&+T^+#>*rb5TNI^Nasu4}yO8Xh<(c;KMmfrEkv4hkMPD0twY z_`bxp_`bw8sTPRDw)nopw)nopw)nopw)nopwwR%pp_ieTcba#acUo|o)H8`lPkD*7 zMcU4EbY^;__e{NKx`yWzif6jU2dI32%7+|%Bo$6S>gc2C5!;Wl{V3ayvOP=hS$faX zdzRic+SX`Wqiv10bF`hK?Hq0AIz89vx#=mDb2&X<$N4(W*Kxj%^L1RH;{qKQ=(y17 zXNZeaq2m%qm!`t$rSvZ4;Bsx3Yr9;}~ z(OXAv9ldq**3ny+>Lq-O>k__2U*%i$RldayY&Wpoz;*-M4Qw~C-K2Mu-p!6Sr$_WQ z)7zqLi?*$fwx&mVw>jPBbX$5#c^juYbnMWvL&pvsJJJqUyF>3CdUrY6!*so*1j{Q3J>o7|e&5}j4WYH{H{32yjWzkewG*uSA>h!BlzwYSkj=tf@?o9C; zRP4?a?ambM(Q#iY^x8Bj+B7NJG%4CNDL$z8LA`cKigrngc1enMNs15aeOT|qdhLi5 z?T8c~PJ7{LrqWEMnMyMidn3hWDlK|j^tR}=1ycNuw(n@O1yZyHQv41JTOh^n>iw=> zyC22x>OG?Eh_)lzI-Pbp?MzRpJgV(cZFWS8c0`JHM2dDqigrYbc0`JHM2dDqigrYb z-ORd~bu+6ttvIbX{ejaTIQ>C-%IUvr`*&^suI=Bo4Qdw3nB0D&thfsZ2PX za5|BmvY22o!NNCy6nz6o(Kmn;eFI3*H-Ho;{B8Y|?N8bMl)c*_w5WX5FG$ zw`kTanstk2-Qq0eS;`&)EP4pAXc8`(go`HO;?Jo3jLOfb{47;*FTQ`RXo@bHqKl^J z;&IBR=%OjQXo@bHqKl^JqA9w#KzV`k0%bFH@kMQB?4lXFXvQv@v5RKx;)@)-$bq@L zXzngHC^slKC^smZ&x_{iqKUa^VlMuY-Y@ByqKoF_qDi=D5-ysAizeZsNw{bdE}n47 z6E1neB~J+U3Bf)g*e8-org$RR-YK3)ws(prlI@-1iDY}Hcp}+_EuKhrVT&h{UD)D@ zM27#WvHhN^^~EWGSpLsddg5w8LHB%sI)37t%^#kqSC6Uv??mCib|`Z(yFMm zDk`mtrw#D50iHI%(*}6j08bm>X#+fMfTs=cv;m$rz|#hJ+5k@*;AsOqZGfi@@U#J* zHo(&cc-jC@8=yk2sE{ivQ&N}RB0tu zT1g#NQiqk)VWmuBR>~x1rA%U0$|Qp>Ws*Ucl5eC*L^9}-Qmv#^D=F1VO0|;OtfVX} zDZEN*u9BLoq}(d0s!GbJlDes+S}LiGN~)leDyXCiDqY~>N}~VcO<~E_6d` zq>>t`bTO5Ssa#CuVk#F?x!64`o=S?R(xvp2OeG~#Ny$`FGL zg;GhORNBO16N^nOHnG^mViSu^EYwmZwNz;{WwlgkGv&>cH&fnBd2_1Fy&o1RZB7!i zW4 zwldqwY%8;^%(gPy%4}A#5{* zZHBPT5Vj?MTcvHu-&Sc`^0!q|CzjNSC3Rv+omf&QmUeKzgZmxas~Afv#*&J$q+%@X zVzG|(Kt#V$9bs4OWeOM59RDog6gl6tbFo-C;+OZz$4&%u5U_H(eGgZ)Od z--zyJb~m#xJNj~Z#KD(2IH2u-wgcJ@q-~rY;Pe2e9*!(|II`s7$kG8$4+zr%VLBj8 z2ZZT>FdY!4uW|Y{PQS+K*EsdkOX+KzevQ+ER1Q)(NX3JdB@b4XJXl%sU}edJl_d{W zmONNl@?d4jgOw!@R+c71%u%tRHsSZo3!;Jhx)Jdnj=MENfB65jFl8)CB;}t!BR4*mrR-^Q)TIGy>IJ%o71=5 z!Q1Y@99lAmmdv3g^JU3=SxVod8VSAXgUGH+@>7jO z+Q#B67H7Guv)t8L?&>TtP)tPjWFmVqkv*Ac4U07_*05N^Vhs!LTtsU`%`e|Ye)%q1 zBWiy6F7nHF(VFD{WaO9cA{9zxXD70=6P?5JIXtUcB6~cMJ)Y=X9rk#lb6xUWmps=c z6*kfN^v{s|r0|NAQIUEmQV&Jyp-4RxsfQxY+$I6e)Hh#ZIKyi4;4L!X{GKM0aSrBW>gF4*u@o?+*TyJ(02}Quaj3o=DjfDSIMi zPo(ULls(Zd*WKm13ZO^<6e)lr1yE#HEm8$Vs-Q>}6sdwDRZye~iWEDMVkf#=@7;Ru z)_Zr_>uPtq+TE_E9*WdMk!mDTjYO)ENHr3vMk3Wnq#B7Hpz;8f2dF$iWEDp@mYz#*whhk)VopdM!g&LZq&Om?M<#0Z%nQh zZ%nQhZ%nQhZ%nQhZ%nQh?_;}!ym(&%FW#5Hi}xk);(ZCccwYi9-k0nK z#QT!nfOucB8xZeHb_3#l$!VLPc8PR7W-3+{i($Y`dC39E9hgzd#rem74Na)JyyKOiuYLY9{cvL zSn(b!-ebjke6Nt)Do6JBZtfox~l)oy1+lE@C&ahuE8lhcJH#^M^2h z2=j+9e+cu3Fn#?t2kA3}m?CaO#hcJH#^M^2h2=j+9Z{oR$=O&(;cy8jk ziRUJsn|N;Gxryf{o||}X;<<_ECZ3ykZsNHq^(>p3WK)xDYLZP&vZ+ZnHOZzX+0-PP znq*UxY-*BCO|q#;HZ^^mSVMe*IGd17O|q#;HZ{qnCfU^V*Mw|pl1)vrsYy09$)+aR z)FhjlWK)xDYLZP&vZ+ZnHOZzX+0-PPnq*UxY-*BCO|q#;HZ{qnCfU?<1#u;@mbi+L zO--_?Nj5dfrY70cbS)v9nq*UxY-*BCO|q#;HZ{qnCfU>^o0?=(lWb~|O--_?Nj5df zrY70cB%7LKQXvVx5^JdJOG54`p>|?RmBg3&rhGUNm z#~vAuJu)0OW8RE;Gv>{hH)Gz6c{AqCm^WkIjCnKW&6qc1-i&!O=FONlW8RE;Gv>{h zH)Gz6c{AqCm^WkIjCnKW&6qc1-i&!O=FONlW8RE;Gv>{hH)Gz6c{AqCm^WkIjCnKW z&6qc1-i&!O=FONlW8RE;Gv>{hH)Gz6c{AqCm^WkIjCnKW&6qc1-i&!O=FONlW8RE; zGv+NQw4l&}LJJBlD72u^f3N0wKpwNOs3koeLw4l&}LJJBlD72u^ zf3N0wKpwNOs3koeLw4l&}LJJBlD72u^f3N0wK zpwNOs3koeLw4l&}LJJBlD72u^f3N0wKpwNOs3koeLw4l&}LJJBl zD72u^f3N0wKq!czgx`DWn*h1Vy+)QjGZXs?Zwh^}x+ld{-?Zi&v z4&qMYE@Bt4o7h9_O++i^t(doB-io=suh`yKZ0{>>#k>{sR?J&5_fBx^o#40?^H$7T zF>l4Z74ufiTQP6NycP3S%v&*U#k>{sR?J&5Z^gV7^H$7TF>l4Z74ufiTQP6NycP3S z%v&*U#k>{sR?J&5Z^gV7^H$7TF>l4Z74ufiTQP6NycP3S%v&*U#k>{sR?J&5Z^gV7 z^H$7TF>l4Z74ufiTQP6NycP3S%v&*U#k>`BTZyr)#MoA1+$Q2}BHkwAUZRe@L>+sH zI&Ks3HW6o6JBZtfox~l)oy1+l zE@C&ahuE8lcFfx`Z^yhH^LEVJF>lAb9rJd~+c9s)ydCp)%-b<<$Gjc$cFfx`Z^yhH z^LEVJF>lAb9rJd~+c9s)ydCp)%-b<<$Gjc$cFfx`Z^yhH^LEVJF>lAb9rJd~+c9s) zydCp)%-b<<$Gjc$cFfx`Z^yjD@H-5@!|*!{zr*l548OzhI}E?W@H-5@!|*!{zr*l5 z48OzhI}E?W@H-5@!|*!{zr*l548OzhI}E?W@H-5@!|*!{zr*l548OzhI}E?W@H-5@ z!|*!{zr*l548OzhI}E?W@H-5@!|*!{zr*l548OzhI}E?W@H-5@BOSh!?~w8xQocjV zcS!jTDc>RGJEVMvl<$!89a6qS%6CZljw^^OiM7O4#MQ()Vm)yUv4Oaj*hp+5t|P7| zHWN1xHxgTjn+Pf2A>})ye20|pkn$Z;zC+4)Ncj#a-y!8YqqxQe)%SVycUq;03P?Uc5i(za9Dc1qh$Y1=7nJEd)>wC$9(ozk{b z+IC9YPHEdIZ9AoHr?l;qww=%b1rjFJoTDyo`An^D^dT%*&XUF)w3Y#=MMq z8S^scWz5T%moYD6UdFtPc^UIE=4H&wn3pjxV_wF*jCmRJGUjE>%b1rjFJoTDyo`An z^D^dT%*&XUF)w3Y#=MMq8S^scWz5T%moYD6UdFtPc^UIE=4H&wn3pjxV_wF*jCmRJ zGUjE>%b1rjFJoTDyo`An^D^dT%*&XUF)w3Y#=MMq8S^scWz5T%moYD6UdFtPc^UJg zm>-_uS>4yWDe^ zd+u`2UGBNdJ$Je1F8AE!p1a(0mwWDV&t2}h%RP6w=Pvi$<(|9TbC-MWa?f4vxywCw zx#uqT+~uCT+;f+E?sCsv?zzi7ccu3%PrKx4mptu~r(N>2OP+Sg(=K`1B~QELX_q|h zlBZqrv`e0L$2OP+Sg(=K`1B~QELX_q|hlBZqrv`e0L$?ZaQdlS)(c{k?Wn0I5|jd?fb-I#Y{-i>)T z=G~b4;^o*EFUNkAFZQE+u^;7&{U~4Djd?fb-I#Y{-i>)T=G~ZgW8RH)T=G~ZgW8RH)T=G~ZgW8RH)T=G~ZgW8Nd!J%ZgM z*gb;XBiKEH-6PmNg54w7J%ZgM*gb;XBiKEH-6PmNg54w7J%ZgM*gb;XBiKEH-6PmN zg54w7J%ZgM*gb;XBiKEH-6PmNg54w7J%ZgM*gb;XBiKEH-6PmNg54w7J%ZgM*gb;X zBiKEH-6PmNg54w7J%ZgM*gb;XBiKEH-6PmNg54w7J%ZgM*gb;XBiKEH-6PmNg54w7 zJ%ZgM*gb;XBiKEH-6PmNg58q_`&vgEiA}_H#P!5x;s)YIVheE-aWk=%xP`ct*hbt& zY$tXQw-Y;wJBT}pyNF%HZekCyHxU)gE0}vUC$3;#!MuWb1@j8#70fG`S1_+&Ucub2 zx5s|HJ@)JEv0rbG{d#-s*V|*i-X2#luV7xmyn=ZJ^9tq_%qy5zFt1=uV7xmyn=ZJ^9tq_ z%qy5zFt1=uV7xmyn=ZJ^9tq_%qy5zFt1=Tc5G@8C##R^%+~AvGo~SpRx5BTc5G@8C##R^%+~AvGo~SpRx5B zTc5G@8C##R^%+~AvGo~SpRx5BTc5G@8C##R^%+~AvGo~SpRx6&W0TK)^0`kw_sQoz z`P?U;`{Z+4Y7f^me@#aBII+QeD0Iaee$_aKKIGzKKa}ypZnxKj!_I_ha6Vc|Yd; znD=Aek9j}l{h0S--j8`d=KYxWW8RN>Kj!_I_ha6Vc|Yd;nD=Aek9j}l{h0S--j8`d z=KYxWW8RN>Kj!_I_ha6Vc|Yd;nD=Aek9j}l{h0S--j8`d=KYxWW8RN>Kj!_I_ha6V zc|Yd;nD=Aek9j}l{h0S--j8`d=KYxWW8RN>Kj!_I_ha6Vc|Yd;nD=Aek9j}l{h0S- zJ^;@EJOl6yz%u~P06YWm48Su0&j36F@C?8+0M7tC1Mm#MGXT#3JOl6yz%u~P06YWm z48Su0&j36F@C?8+0M7tC1Mm#MGXT#3JOl6yz%u~P06YWm48Su0&j36F@C?8+0M7tC z1Mm#MGXT#3JOl6yz%u~P06YWm48Su0&j36F@C?8+0M7tC1Mm#MGXT#3JOl6yz%u~P z06YWm48Su0&j36F@C?8+0M7tC1Mm#MGXT#3JOe47n;mT>ZXs?Zwh^}x+ld{-?Zi&v z4&qMYE@Bt4o7h9_O~fGPgP0FuK8X1s=7X3IVm^rZAm)RZ4`M!u`5@+lm=9t;i1{Gq zgP0FuK8X1s=7X3IVm^rZAm)RZ4`M!u`5@+lm=9t;i1{GqgP0FuK8X1s=7X3IVm^rZ zAm)RZ4`M!u`5@+lm=9t;i1{GqgP0FuK8X1s=7X3IVm^rZAm)RZ4`M!u`5@+lm=9t; zi1{GqgP0Fu?&+-9(^;{nvtmzY#h%WJJ)ISMIxF^cR_y7l*wb0Dr?X;DXT_e*ianhb zdpaxjbXM%?tk~08v8S_QPiMuR&Wb&q6?-}>_H8#k(S+S?H;vwN263!vv91_kU z;T#gqA>kYn&LQC(63!vv91_kU;T#gqA>kYn&LQC(63!vv91_kU;T#gqA>kYn&LQC( z63!vv91_kU;T#gqA>kYn&LQC(63!vv91_kU;T#gqA>kZK!+DjXtBG~Qdg2;l192^} zk=R6BM_f;ACT<{ZB(@MY5jPWCiCc(UiEYGf#CBo_aXYb-xP!QpxQp0D>?ZaQdlNB? z`7q|bq#+*0d>C_I(h&QShIknBVa$gyAI5wb^I^<~F(1Z!81rGwhcO?Hd#%!e@_ z#(Ws_Va$gyAI5wb^I^<~F(1Z!81rGwhcO?Hd#%!e@_#(Ws_Va$gyAI5wb^I^<~ zF(1Z!81rGwhcO?Hd#%!e@_#(Ws_Va$gyAI5wb^I^<~F(1Z!MCe9@ZbaxtglKRiM7O4 z#MQ()Vm)yUv4Oaj*hp+5t|P7|HWN1xHxgTjn~0lk77QG`6%Y2n2%yUiuow!qnM9kK8pD$ z=A)R8Vm^xbDCVP>k77QG`6%Y2n2%yUiuow!qnM9kK8pD$=A)R8Vm^xbDCVP>k77QG z`6%Y2n2%yUiuow!qnM9kK8pD$=A)R8Vm^xbDCVP>k77QG`6%Y2n2%yUiuow!qnM9k zK8pD$=A)R8Vm^xbDCVP>j|uUZ5RVD*m=KQ%@t6?%y1m%f?Zv)sFZOkNv9H^UecfK{ z>-J(_w-@`mz1Y|7#lCJY9uwj*As!RrF(Dok;xQo}6XG!;9uwj*As!RrF(Dok;xQo} z6XG!;9uwj*As!RrF(Dok;xQo}6XG!;9uwj*As!RrF(Dok;xQo}6XG!;9uwj*As!Rr zF(Dok;xQo}6XG!;9uwj*As!RrF(Dok;xQo}6XG!;9uwj*As!RrF(Dok;;}Tu*Erfh zTuW>uHWAkm*AttG8;Bc;EyPX4&BRvX7UEW78*v-4o!CL#PV6M^AnqjYB6bnGi9N*L zM0g-O_CR**f$Z1=*|7(*V-IA<9>|V8kR5v~am>dtAIE$g^Ks0_F(1c#9P@F^$1xwrd>r#} z%*Qbw$9x>~am>dtAIE$g^Ks0_F(1c#9P@F^$1xwrd>r#}%*Qbw$9x>~am>dtAIE$g z^Ks0_F`p2+389-1x(T715V{GWn-IDQp_>r8389-1x(T715V{GWn-IDQp_>r8389-1 zx(T715V{GWn-IDQp_>r8389-1x(T715V{GWn-IDQp_>r8389-1x(T715V{GWn-IDQ zp_>r8389-1x(T715V{GWn-IDQp_>r8389-1x(T715V{GWn-IDQp_>r8389-1x(T71 z5V{GWn@B_F&t>8Y;!0vIaTRejv5r_zTtjRit|c}Sn~3X(>xs?84aAMa7UCx2W@0OG z3vny4jkt~2PV69VCw3Bd5O)&(TqbrAyNNx--b7R}uVP-syoz}hbKi9p`>w0lcU{F* z%&VAJF|T4?#k`7n74s_QRm`iHS23?*Ud6nMc@^_2=2gtAm{&2cVqV3(ig^|DD&|$p ztC&|YuVP-syoz}h^D5?5%&VAJF|T4?#k`7n74s_QRm`iHS23?*Ud6nMc@^_2=2gtA zm{&2cVqV3(ig^|DD&|$ptC&|YuVP-syoz}h^D5?5%&VAJF|T4?#k`7n74s_QRm`iH zS23?*Ud6nMc@^_2=2gtAm{&2cVqV3(ig^|DD&|$ptC&|YuVQ`-^JADF!~7WL-aL){ zghcEoB;sS3AH)0@=EpEUhWRnfk70fc^JADF!~7WL$1p#J`7z8VU1-vUCS7RKg?y82 z?3-j`-y|FRCfRt>g(h8S(uF2nXwroyU1-vUCS7RKg(h8S(uF2nXfnN!xpZK4aBv?Mq(3j9dSLenYe+t zk=R1qMBGelC2k>ZCAJZ_5!;C!gg=dGe;U*NG^YJ&O#9QA-bL&t_7Hm$F@yOG<};Yj zU_OKS4CXVK&tN`-`3&YWn9pE7gZT{RGnmg{K7;uT<};YjU_OKS4CXVK&tN`-`3&YW zn9pE7gZT{RGnmg{K7;uT<};YjU_OKS4CXVK&tN`-`3&YWn9pE7gZT{RGnmg{K7;uT z<};YjU_OKS4CXVK&tN`-`3&YWn9pE7gZT{RGnmg{K7;uT=CdL>E0VJ!IV+O0A~`FP zvm!YwlCvT?E0VJ!IV+O0A~`FPvm!YwlCvT?E0VJ!IV+O0A~`FPvm!YwlCvT?E0VJ! zIV+O0A~`FPvm!YwlCvT?E0VJ!IV+O0A~`FPvm!YwlCvT?E0VJ!IV+O0A~`FPvm!Yw zlCvT?E0VJ!IV+O0A~`FPvm!YwlCvT?E0VJ!IV+O0A~`FPvm!YwlCvT?n?`c2qpOIk ziFL$!;u>NDaV@ct*hE}MTu*E!ZXj+Xwh%WFHxpZlTZmhUZNzQFc47x{JF%0vgSeBp zi`Yf%CiW0}6ETPR9OiSF&tX1?`5fkRn9pH8hxr`lbC}OzK8N`n=5v_OVLpfX9OiSF z&tX1?`5fkRn9pH8hxr`lbC}OzK8N`n=5v_OVLpfX9OiSF&tX1?`5fkRn9pH8hxr`l zbC}OzK8N`n=5v_OVLpfX9OiSF&tX1?`5fkRn9pH8hxr`lbC}OzK8N`n=5v_OVLmT@ z^Wrxze)HltFMjjlH!ptk;x{jT^Wrxze)HltFMjjlH!ptk;x{jT^Wrxze)HltFMjjl zH!ptk;x{jT^Wrxze)HltFMjjlH!ptk;x{jT^Wrxze)HltFMjjlH!ptk;x{jT^Wrxz ze)HltFMjjlH!ptk;x{jT^Wrxze)HltFMjjlH!ptk;x{jT^Wrxze)HltFMjjlH!ptk zY5cBmbS1HtxQe)%SVycUt|2xM*Ag3vO~iG?^~7f42I59y3vm;1GqIJpg}9a2M%+eh zCw36G6FZ4Jh&ze9h+V{PVh^!55jD(fnAb3`VP3<$hItM18s;_3YnazCuVG%pyoPxV z^BU$g%xjp}Ft1@=!@P!h4f7i2HOy<6*D$YPUcMeYnSVMe*IGd1q3sP@E>McmU1*x|n^%kVwg4A1(dJ9r- zLFz3?y#=YaAoUic-h$Lyka`PJZ$auUNWBHAw;=Tvq~3zmTabDSQg1=(El9nED~KzJ zwZv6~)LW2x3sP@E>McmU1*x|n^%kVwg4A1(dJ9r-LFz3?y#=YaAoUic-h$Lyka`PJ zZ$auUNWBHAw;=Tvq~3zmTabDSQg1=(E$kw86MKlgiKt^<$Gnbt9rHTobzLOuuVY@vypDMt^E&2r%zLOuuVY@v zypDMt^E&2r%zLOuuVY@vypDMt^E&2r%tRvPF*AN?sYl)4-CgM8cdSWwi z192m#v z4a^&uH!yEt-oU(pc?0tX<_*jnm^UzQVBWyIfq4V-2IdXS8<;mRZ(!cQyn%TG^9JS( z%o~_DFmGVqz`TKZ1M>#v4a^&uH!yEt-oU(pc?0tX<_*jnm^UzQVBWyIfq4V-2IdXS z8<;mRZ(!cQyn%TG^9JS(%o~_DFmGVK4B0Yd%aAQYwhY-aWXq8Gv5VM`UBt_fEkm{p z*)n9ykS#;D4B0Yd%aAQYwhY-aWXq5(L$(arGGxn;Ekm{p*)n9ykS#;D4B0Yd%aAQY zwhY-aWXq5(L$(arGGxn;Ekm{p*)n9ykS#;D4B0Yd%aAQYwhY-aWXq5(L$(arGGxn; zEkm{p*)n9ykS#;D4B0Yd%aAQYwhY-aWXq5(L$(arGGxn;Ekm{p*)n9ykS#;D4B0Yd z%aAQYwhY-aWXq5(r^vQBx{cUQ>>zF@b`p0GcM^9IyNKPy9%64IRxn?|d(t)jJx)+$=7Xsx2Piq(t)jJx)+$=7Xsx2Piq(t)jJx)+$=7 zXsx2Piq(t)jJx)+$=7Xsx2Piq2UAc`P%vAvC0o)hZf0H5F187nf`Wo6D3}M58x#~w zA^vqI1qD-3P*5<12+EUJf4LA=<@3H?*Y|MW|D*LkTK}WtwqxHY ze_{TG`4{G2n15mZh4~leUzmSke&GcdUU1QKh1FeH-G$X%SlxxyU0B_P)m>QKh1FeH-G$X%SlxxyU0B_P z)m>QKh1FeH-G$X%SlxxyU0B_P)m=oykK!j06;^j)br)85VRaW)cVTrGR(D}_7gl#+ zbr)85VRaW)cVTrGR(D}_7gl#+br)85VRaW)cVTrGR(D}_7gl#+br)85VRaYp#RpLk z#co_Ozhr*N{F3=4^GoKJ%rBW=GQVVg$^4S}CG$(>m&`AjUoyXBe#!ij`6cs9=9kPb znO`!$WPZu~lKCa`OXio%FPUF5zhr*N{F3=4^GoKJ%rBW=GQVVg$^4S}CG$(>m&`Aj zUoyXBe#!ij`6cs9=9kPbnO`!$WPZu~lKCa`OXio%FPUF5zhr*N{F3=4^GoKJ%rBW= zGQVVg$^4S}CG$(>m&`AjUoyXBe#!ij`6cs9=9kQ`kX<3WLUx7h3fUF1D`Z#5u8>_J zyFzw_>_JyP6Tmu8>_JyFzw_>_JyFzw_>)Kh@&boHiwX?3Bb?vNcXI(q%+F94mx^~vJv#y_M<~Pi5nBOqJVSdB>hWQQi8|F96 zZ_M<~Pi5 znBOqJVSdB>hWQQi8|F96Z)ln-14~Pam(YD$1RUr9=AMhdED~2<#Eg7md7oRTOPMOZh74D zxaD!n)ln-14~Pam(YD$1RUr9=AMhdED~2 z<#Eg7md7oRTOPMOZh74Dxc%;t_S2g9Q~V{?MMnHB-iUuhR^-H6@lO0J@?t~07av4H z6uWW9{Eqn@^E>8u%qe#iWd`5p5+=6B5RnBOtK zV}8f{j`8u%q ze#iWd`5p5+=6B5RnBOtKV}8f{j`>Kl5fw44e?%l5Cu`}#sl*Q<`2vt zm_IOoVE(}Tf%yaT2j&mVADBNde_;N={DJuc^9SY+%paIPFn?hF!2E&v1M>&w56mB! zKQMn_{=oc!`2+I@<`2vtm_IOoVE(}Tf%yaT2j&mVADBNde_;N={DJuc^9SY+%paIP zFn?hF!2E&v1M>&w56mB!KQMn_{=oc!`2+I@<`2vtm_IOoVE(}Tf%yaT2j&mVADBNd ze_;Md;gP~4g+~gH6dox&Qh22BNa2yfBZWr_j}#s$JW_b1@JQj2!Xt%83Xc>XDLhhm zr0_`Lk-{T|M+%P=9w|Ihc%<-1;gP~4g+~gH6dox&Qh22BNa2yfBZWr_j}#s$JW_b1 z@JQj2!Xt%83Xc>XDLhhmr0_`Lk-{T|M+%P=9w|Ihc%<-1;gP~4g+~gH6dox&Qh22B zNa2yfBZWr_j}#uiEBx-KKSWxri9f|(VqIj!-{Ot1!=`4jUe=11!=`4jUe=1`Kl6U({mlEB_cQNj-p{`Kl6U({mlEB_cI?*;(!tdlsKTo0VNJ7aX^U!N*qw) zfD#9kIH1GBKQKFEBK`5^N_=7Y=!nGZ4_WIo7zkoh3BKQKFEBK`5^N_=7Y=!nGZ4_ zWIo7zkoh3BKQ zKFEBK`5^N_=7Y=!nGZ4_WIo7z2;LC9A$UXZhTsjs8-h0kZwTHHydii)@P^5kZUmTj|G$fFFb^;fFz^0fJKbO&U>;!J{U7pfFb^;f zFz;@q8_WaD1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz== z1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz== z1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz==1Iz== zg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*F zg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*F zg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L*F zg9L*Fg9L*Fg9L*Fg9L*Fg9L*Fg9L-$1#^CSE8dBJMP6)(_u_*nh+;Q}nGZ7`WKQTKFoZW z`7rZg=EKZ~nGZ7`WDo_S^Og6A|ZYizlo$siPz$H@rOu@HSwqTORS5G_*=XYzJ(Fr z!iaBS#J4cwTNv>zjQAEtdhF#Ed!zo|sJ}Pr?~VF2*@7d6(4UO8+s11$U(5MZK+R&&CjoQ$t4UO8+s11$U(5MZK+R&&Cjs90mh>(~R zHZ*EOqc${ZL!&k{YD1$oG-^YmHZ*EOqc${ZL!&k{YD1$oG-^YmHZ*EOqc${ZL!&k{ zYD1$oG-^YmHZ*EOqc${ZL!%M#qxeZgg$<3`(5MZK+R&&CjoQ$t4UO8+s11$U(5MZK z+R&&CjoQ$t4UO8+s11$U(5MZK+R&&CjoQ$t4UO8+s11$U(5MZK+R*5G@j(-ALjpI{vYQ5VLs;9#{AltUmNplV}5PSuZ{V&F~2tE*T($X z*!N#El`&HpGnFw@88ekJQyDXrF;f{cl`&HpGnFw@88ekJQyDXrF;f{cl`&HpGnFw@ z88el!|B49_5|hGI#!O|*RK`qY%v8oqWz1B@Ol8be#!O|*RK`qY%v8oqWz1B@Ol8be z#!O|*RK`qY%v8oqWz1B@Ol8be#!O|*RK`qYEFyjsKZ&R?l`&HpGnFw@88ekJQyDXr zF;f{cl`&HpGnFw@88ekJQyDXrF;f{cl`&HpGnFw@88ekJQyDXrF;f{cl`&HpGnFw@ z8GA22h=M3~W1RUo^Ks_m%*UCJGaqL@&U~EtIP-Dl^Ks_m%*UCJGaqL@&U~EtIP-Dl;%~ zVjf~1Vjf~1Vjf~1Vjf~1Vjf~1Vjf~1Vjf~1Vjf~1Vjf~X$$XOeB=bq;lguZXPcolm zKFNHN`6Tm6=9A1PnNKpGWIoA!lKCX_N#>KxCz($&pJYDCe3JPj^GW8D%qN*oGM{8V z$$XOeB=bq;lguZXPcolmKIM)ncTBls${kbgm~zLIJEq(*<&G(LOu1vq9aHX@a>tZA zrra^*jwyFcxns&5Q|_2@$CNv!+%e^jDR)e{W6B*NA*q9BUh2r~~e4>J!l z4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l z4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l z4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l z4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!lf5rS2^HxeiBh(o%7Z?Z=LhjId7fw);VvT^VT_Uo%7Z?Z=LhjId7fw z);VvT^VT_Uo%7Z?Z=LhjId7fw);VvT^VT_Uo%7Z?Z=LhjIsaaK5Cu`}#sc#N<_pXh zm@hD2V7|b7f%yXS1?CIP7nm z%$JxiF<)Z7#C(bQ67wbIOU##;FEL+YzQlZq`4aOb=1a_%m@hG3V!p(DiTM)qCFV=a zmzXaxUt+$*e2MuI^Cjj>%$JxiF<)Z7#C(bQ67wbIOU##;FEL+YzQlZq`4aOb=1a_% zm@hG3V!p(DiTM)qCFV=amzXaxUt+$*e2MuI^Cjj>%$JxiF<)l1%xIa>GNWZi%Z!#8 zEi+nXw9IIk(K4fDM$3$r87(tfX0*&`nb9(%Wk$=4mKiNGT4uD&XqnM6qh&_RjFuTK zGg@Y}%xIa>GNWZi%Z!#8Ei+nXw9IIk(K4fDM$3$r87(tfX0*&`nb9(%Wk$=4mKiNG zT4uD&XqnM6qh&_RjFuTKGg@Y}%xIa>GNWZi%Z!#8Ei+nXw9IIk(K4fDM$3$r87(tf zX0*&`nbGohqjf)J#NXnL_(x<#PP`TG#J?ghHpF}JK@>!>8!OCLn6EHjVZOqAh4~8e z73M3zQTNk`3mzD z<}1usn6EHjVZOqAh4~8e73M3h^|Gp$RlTh0WmPY$dRf)Ws$N$0vZ|L=y{zhGRWGZ0S=Gy`URL$8s+U#0 ztmSa|gt9n`0%c@>h^|Gp$RlTh0WmPY$dRf)Ws$N$0 zvZ|L=y{zhGRWGZ0S=Gy`URL$8s+U#0tm|_(?=XO#Cc<5pj_azlz^PQl!Ld@w@m#q{W)}Q~V{?MMnHB-U#2qs&8S{x3KD4 zSoJNe`W9Aw3#-0`)%W6qD2QS=BFrPqBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`Yr zBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`Yr zBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`Yr zBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`YrBg`Yr zBg`YrBg`YrBg`Yrqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hs zqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqs*hsqyMj9 z9%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY7 z9%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY79%UY7 z9%UY79%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM3 z9%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM3 z9%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM3 z9%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39%CM39;X_o8mAhk8mAhk8mAhk z8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk z8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk z8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk8mAhk z8mAhk8mAhk8mAhk8mAinuA2ALhIlVNh=M3~Bf&huJi$D{Ji$D{Ji$D{Ji$D{Ji$D{ zJi$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{ zJi$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{Ji$D{ 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 z4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!l4>J!lk1&rgk1&rgk1&rgk1&rgk1&rg zk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rg zk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rg zk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1&rg zk1&rgk1&rgk1&rgk1&rgk1&rgk1&rgk1~%kk1~%kk1~%kk1~%k@BbgdelYL<2Yx@8 z_x}^1AI$szBhe4${Xf$W=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR z=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR z=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR=27NR z=27NR=27NR=27NR=27NR=27NR=27NR<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m z<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m z<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m z<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m<}v0m z<}v0m<}v0m<}v0m<}v0m=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6 z=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6 z=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6 z=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6=5gk6 z=5gk6=5gk6<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr z<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr z<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr z<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr<_YEr z=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB z=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB z=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB z=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB=1JyB<|*bW<|*bW z<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW z<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW z<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW z<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW<|*bW=4s|>=4s|>=4s|>=4s|> z=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|> z=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|> z=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|> z=4s|>=4s|>=4s|>=4s|>=4s|>=4s|>=4s|><{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0 z<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0 z<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0 z<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0 z<{9Q0<{9Q0<{9Q0<{9Q0<{9Q0=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h z=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h z=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h z=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h=2_-h z=2_-h=2_-h=2_-h<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$ z<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$ z<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$ z<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$<~im$ z<~im$=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M z=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M z=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M z=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M=6U9M<^|>j z<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j z<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j z<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j z<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j<^|>j=0)a3=0)a3=0)a3 z=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3 z=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3 z=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3=0)a3 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 zkn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9 zkn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9 zkn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9kn@o9 zkn@o9knOIazT5Y^Bw0q&Uc*eINx!;<9x^Yj`JPoJI;5U?>OIazT5Y^Bw0q&Uc*eINx!;<9x^Yj`JPoJI;5U?>OIazT5Y^Bw0q&Uc*eINx!;<9x^Y zj`JPoJI;5U?>G-T4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P# z4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P# z4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P# z4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P#4?7P# z4?B-Ik2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGw zk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGw zk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGw zk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGwk2sGyk2;S! zk2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S! zk2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S! zk2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S! zk2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;S!k2;Szk2#Myk2#Myk2#My zk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#My zk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#Myk2#My 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 z=M(1>=M(1>=M(1>=M(1>=M(1>=M(1>=M(2s=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX z=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX z=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX z=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX=TqlX z=TqlX=TqlX=TqlX=TqlX=Tql1=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs z=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs z=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs z=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs=QHOs z=QHOs=QHOs=QHPX=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C z=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C z=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C z=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C=X2+C z=X2)^=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx z=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx z=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx z=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_cx=L_dc=S$~H z=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H z=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H=S$~H 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 literal 0 HcmV?d00001 diff --git a/libtests/qtest/qexc.test b/libtests/qtest/qexc.test new file mode 100644 index 00000000..b8632b9b --- /dev/null +++ b/libtests/qtest/qexc.test @@ -0,0 +1,32 @@ +#!/usr/bin/env perl + +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("qexc") or die "chdir qexc failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('qexc'); + +my @tests = + (['general exception', 2], + ['internal error', 3], + ['system exception', 2], + ['library exception', 3, "uncaught exception: .+\n"], # fails on VC7? + ); + +for (my $i = 0; $i < scalar(@tests); ++$i) +{ + my $output = +((-f "test$i.out") + ? {$td->FILE => "test$i.out"} + : {$td->REGEXP => $tests[$i]->[2]}); + $output->{$td->EXIT_STATUS} = $tests[$i]->[1]; + $td->runtest($tests[$i]->[0], + {$td->COMMAND => "qexc $i"}, + $output, + $td->NORMALIZE_NEWLINES); +} + +$td->report(scalar(@tests)); diff --git a/libtests/qtest/qexc/test0.out b/libtests/qtest/qexc/test0.out new file mode 100644 index 00000000..7a6dba88 --- /dev/null +++ b/libtests/qtest/qexc/test0.out @@ -0,0 +1,2 @@ +exception: general exception +what: general exception diff --git a/libtests/qtest/qexc/test1.out b/libtests/qtest/qexc/test1.out new file mode 100644 index 00000000..cb18f40c --- /dev/null +++ b/libtests/qtest/qexc/test1.out @@ -0,0 +1 @@ +uncaught exception: INTERNAL ERROR: internal error diff --git a/libtests/qtest/qexc/test2.out b/libtests/qtest/qexc/test2.out new file mode 100644 index 00000000..0f1994f7 --- /dev/null +++ b/libtests/qtest/qexc/test2.out @@ -0,0 +1,2 @@ +exception: doing something: Invalid argument +what: doing something: Invalid argument diff --git a/libtests/qtest/qutil.test b/libtests/qtest/qutil.test new file mode 100644 index 00000000..e90692f8 --- /dev/null +++ b/libtests/qtest/qutil.test @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("qutil") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('qutil'); + +$td->runtest("QUtil", + {$td->COMMAND => "qutil"}, + {$td->FILE => "qutil.out", + $td->EXIT_STATUS => 0}); + +$td->report(1); diff --git a/libtests/qtest/qutil/qutil.out b/libtests/qtest/qutil/qutil.out new file mode 100644 index 00000000..f7af8903 --- /dev/null +++ b/libtests/qtest/qutil/qutil.out @@ -0,0 +1,30 @@ +16059 +0016059 +16059 +3.141590 +3.142 +1000.123000 +exception 1: INTERNAL ERROR: Util::int_to_string has been called with a padding value greater than its internal limit +exception 2: INTERNAL ERROR: Util::int_to_string has been called with a padding value greater than its internal limit +exception 3: INTERNAL ERROR: Util::int_to_string has been called with a padding value greater than its internal limit +exception 4: INTERNAL ERROR: Util::double_to_string has been called with a number and a decimal places specification that would break an internal limit +exception 5: INTERNAL ERROR: Util::double_to_string has been called with a number and a decimal places specification that would break an internal limit +one +7 +compare okay +---- +before open +exception: open file: No such file or directory +---- +before fopen +exception: fopen file: No such file or directory +---- +IN_TESTSUITE: 1: 1 +HAGOOGAMAGOOGLE: 0 +---- +0x41 -> A +0xf7 -> ÷ +0x3c0 -> Ï€ +0x16059 -> f0 96 81 99 +0x7fffffff -> fd bf bf bf bf bf +0x80000000: bounds error in QUtil::toUTF8 diff --git a/libtests/qtest/rc4.test b/libtests/qtest/rc4.test new file mode 100644 index 00000000..0207317c --- /dev/null +++ b/libtests/qtest/rc4.test @@ -0,0 +1,45 @@ +#!/usr/bin/env perl +require 5.008; +BEGIN { $^W = 1; } +use strict; + +chdir("rc4") or die "chdir testdir failed: $!\n"; + +require TestDriver; + +my $td = new TestDriver('RC4'); + +cleanup(); + +my @tests = ('0123456789abcdef', + '0123456789abcdef', + '0000000000000000', + 'ef012345', + '0123456789abcdef'); + +my $n = 0; +foreach my $key (@tests) +{ + ++$n; + $td->runtest("test $n", + {$td->COMMAND => "rc4 $key test$n.in tmp1-$n.out"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); + $td->runtest("check output", + {$td->FILE => "tmp1-$n.out"}, + {$td->FILE => "test$n.out"}); + $td->runtest("test $n reverse", + {$td->COMMAND => "rc4 $key test$n.out tmp2-$n.out"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); + $td->runtest("check output", + {$td->FILE => "tmp2-$n.out"}, + {$td->FILE => "test$n.in"}); +} + +cleanup(); + +$td->report(4 * scalar(@tests)); + +sub cleanup +{ + system("rm -f tmp*-*"); +} diff --git a/libtests/qtest/rc4/test1.in b/libtests/qtest/rc4/test1.in new file mode 100644 index 00000000..be687ec3 --- /dev/null +++ b/libtests/qtest/rc4/test1.in @@ -0,0 +1 @@ +#Eg‰«Íï \ No newline at end of file diff --git a/libtests/qtest/rc4/test1.out b/libtests/qtest/rc4/test1.out new file mode 100644 index 00000000..0a8617e0 --- /dev/null +++ b/libtests/qtest/rc4/test1.out @@ -0,0 +1 @@ +u·‡€™àÅ– \ No newline at end of file diff --git a/libtests/qtest/rc4/test2.in b/libtests/qtest/rc4/test2.in new file mode 100644 index 0000000000000000000000000000000000000000..1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e GIT binary patch literal 8 KcmZQzfB*mh2mk>9 literal 0 HcmV?d00001 diff --git a/libtests/qtest/rc4/test2.out b/libtests/qtest/rc4/test2.out new file mode 100644 index 00000000..9bdb590f --- /dev/null +++ b/libtests/qtest/rc4/test2.out @@ -0,0 +1 @@ +t”ÂçKy \ No newline at end of file diff --git a/libtests/qtest/rc4/test3.in b/libtests/qtest/rc4/test3.in new file mode 100644 index 0000000000000000000000000000000000000000..1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e GIT binary patch literal 8 KcmZQzfB*mh2mk>9 literal 0 HcmV?d00001 diff --git a/libtests/qtest/rc4/test3.out b/libtests/qtest/rc4/test3.out new file mode 100644 index 00000000..11f99ca8 --- /dev/null +++ b/libtests/qtest/rc4/test3.out @@ -0,0 +1 @@ +Þ‰A£7]: \ No newline at end of file diff --git a/libtests/qtest/rc4/test4.in b/libtests/qtest/rc4/test4.in new file mode 100644 index 0000000000000000000000000000000000000000..cb43b5ce1342e5d73830ac8b6a37ea870fae2632 GIT binary patch literal 10 KcmZQzfB^si3IG8B literal 0 HcmV?d00001 diff --git a/libtests/qtest/rc4/test4.out b/libtests/qtest/rc4/test4.out new file mode 100644 index 00000000..1394b334 --- /dev/null +++ b/libtests/qtest/rc4/test4.out @@ -0,0 +1 @@ +Ö¡A§ì<8ß½a \ No newline at end of file diff --git a/libtests/qtest/rc4/test5.in b/libtests/qtest/rc4/test5.in new file mode 100644 index 00000000..60e5cd06 --- /dev/null +++ b/libtests/qtest/rc4/test5.in @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libtests/qtest/rc4/test5.out b/libtests/qtest/rc4/test5.out new file mode 100644 index 0000000000000000000000000000000000000000..d64d1a49ce92480621f0bc5e42a9471a1698c7ec GIT binary patch literal 512 zcmV+b0{{JWmBZ!{N(p!jO4L#_jvxJ+8|g`pfjxFpG)cC1jmp@^ij6C&tY!#Z4pY^f zCc@FgkiqM|4CZYcYa0``xf!@e!dj6;dX?v1PVr}X&FH@hm4yy6ua=2KPt$i0kC^?- z)aNEvbpV+Q%zg}`#HynNqleNDJCD1~LZQ7e9eP6p-KDDsh?cH^!HWv^ZT~Tr7VCIU zNm|m*kk|Kes24}JUt$S69u2wWx>GN&>_^M>%a`iF6^XoDr$A7*5OY4A|$Wckh;u6Oini zJvF6RT(Ai#4lm8;wd`iu2utKZRi+u)-G9RtZc5`Eql@GrIpyf zzy@#l(-jHp3~Z_ZY=C-VKKM*MGr^V8KI0(74d7LQSI8pNxW#GMNv_qMP7l}fd01;p zfA)m!Y8an%hSZy!ORbxtOO~toBsVOIkN>d^RW(Tfr+PiL@&)0!pUs9~hB_6R)T`tV zq=_^ZJ>BI(rdU-#{b)SD*uW1G5}GJY>dZ{u{#d?oH&h%1aVE&ro+nkS7#g?fK(N3_ CWcvXC literal 0 HcmV?d00001 diff --git a/libtests/qutil.cc b/libtests/qutil.cc new file mode 100644 index 00000000..3a1fc8aa --- /dev/null +++ b/libtests/qutil.cc @@ -0,0 +1,199 @@ + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +#else +# include +#endif + +void string_conversion_test() +{ + std::cout << QUtil::int_to_string(16059) << std::endl + << QUtil::int_to_string(16059, 7) << std::endl + << QUtil::int_to_string(16059, -7) << std::endl + << QUtil::double_to_string(3.14159) << std::endl + << QUtil::double_to_string(3.14159, 3) << std::endl + << QUtil::double_to_string(1000.123, -1024) << std::endl; + + try + { + // int_to_string bounds error + std::cout << QUtil::int_to_string(1, 50) << std::endl; + } + catch(QEXC::Internal &e) + { + std::cout << "exception 1: " << e.unparse() << std::endl; + } + + try + { + // QUtil::int_to_string bounds error + std::cout << QUtil::int_to_string(1, -50) << std::endl; + } + catch(QEXC::Internal &e) + { + std::cout << "exception 2: " << e.unparse() << std::endl; + } + + try + { + // QUtil::int_to_string bounds error + std::cout << QUtil::int_to_string(-1, 49) << std::endl; + } + catch(QEXC::Internal &e) + { + std::cout << "exception 3: " << e.unparse() << std::endl; + } + + + try + { + // QUtil::double_to_string bounds error + std::cout << QUtil::double_to_string(3.14159, 1024) << std::endl; + } + catch(QEXC::Internal &e) + { + std::cout << "exception 4: " << e.unparse() << std::endl; + } + + try + { + // QUtil::double_to_string bounds error + std::cout << QUtil::double_to_string(1000.0, 95) << std::endl; + } + catch(QEXC::Internal &e) + { + std::cout << "exception 5: " << e.unparse() << std::endl; + } + + std::string embedded_null = "one"; + embedded_null += '\0'; + embedded_null += "two"; + std::cout << embedded_null.c_str() << std::endl; + std::cout << embedded_null.length() << std::endl; + char* tmp = QUtil::copy_string(embedded_null); + if (memcmp(tmp, embedded_null.c_str(), 7) == 0) + { + std::cout << "compare okay" << std::endl; + } + else + { + std::cout << "compare failed" << std::endl; + } + delete [] tmp; +} + +void os_wrapper_test() +{ + int fd = -1; + try + { + std::cout << "before open" << std::endl; + fd = QUtil::os_wrapper("open file", + open("/this/file/does/not/exist", O_RDONLY)); + std::cout << "after open" << std::endl; + (void) close(fd); + } + catch (QEXC::System& s) + { + std::cout << "exception: " << s.unparse() << std::endl; + } +} + +void fopen_wrapper_test() +{ + FILE* f = 0; + try + { + std::cout << "before fopen" << std::endl; + f = QUtil::fopen_wrapper("fopen file", + fopen("/this/file/does/not/exist", "r")); + std::cout << "after fopen" << std::endl; + (void) fclose(f); + } + catch (QEXC::System& s) + { + std::cout << "exception: " << s.unparse() << std::endl; + } +} + +void getenv_test() +{ + std::string val; + std::cout << "IN_TESTSUITE: " << QUtil::get_env("IN_TESTSUITE", &val) + << ": " << val << std::endl; + // Hopefully this environment variable is not defined. + std::cout << "HAGOOGAMAGOOGLE: " << QUtil::get_env("HAGOOGAMAGOOGLE") + << std::endl; +} + +static void print_utf8(unsigned long val) +{ + char t[20]; + sprintf(t, "%lx", val); + std::string result = QUtil::toUTF8(val); + std::cout << "0x" << t << " ->"; + if (val < 0xfffe) + { + std::cout << " " << result; + } + else + { + // Emacs has trouble with utf-8 encoding files with characters + // outside the 16-bit portion, so just show the character + // values. + for (std::string::iterator iter = result.begin(); + iter != result.end(); ++iter) + { + char t[3]; + sprintf(t, "%02x", (unsigned char) (*iter)); + std::cout << " " << t; + } + } + std::cout << std::endl; +} + +void to_utf8_test() +{ + print_utf8(0x41UL); + print_utf8(0xF7UL); + print_utf8(0x3c0UL); + print_utf8(0x16059UL); + print_utf8(0x7fffffffUL); + try + { + print_utf8(0x80000000UL); + } + catch (QEXC::General& e) + { + std::cout << "0x80000000: " << e.what() << std::endl; + } +} + +int main(int argc, char* argv[]) +{ + try + { + string_conversion_test(); + std::cout << "----" << std::endl; + os_wrapper_test(); + std::cout << "----" << std::endl; + fopen_wrapper_test(); + std::cout << "----" << std::endl; + getenv_test(); + std::cout << "----" << std::endl; + to_utf8_test(); + } + catch (std::exception& e) + { + std::cout << "unexpected exception: " << e.what() << std::endl; + } + + return 0; +} diff --git a/libtests/rc4.cc b/libtests/rc4.cc new file mode 100644 index 00000000..34d779ad --- /dev/null +++ b/libtests/rc4.cc @@ -0,0 +1,82 @@ + +#include +#include + +#include +#include +#include +#include + +#ifdef _WIN32 +# include +#else +# include +#endif + +int main(int argc, char* argv[]) +{ + if (argc != 4) + { + std::cerr << "Usage: rc4 hex-key infile outfile" << std::endl; + exit(2); + } + + char* hexkey = argv[1]; + char* infilename = argv[2]; + char* outfilename = argv[3]; + int hexkeylen = strlen(hexkey); + int keylen = hexkeylen / 2; + unsigned char* key = new unsigned char[keylen + 1]; + key[keylen] = '\0'; + + FILE* infile = fopen(infilename, "rb"); + if (infile == 0) + { + std::cerr << "can't open " << infilename << std::endl; + exit(2); + } + + for (unsigned int i = 0; i < strlen(hexkey); i += 2) + { + char t[3]; + t[0] = hexkey[i]; + t[1] = hexkey[i + 1]; + t[2] = '\0'; + + long val = strtol(t, 0, 16); + key[i/2] = (unsigned char) val; + } + + FILE* outfile = fopen(outfilename, "wb"); + if (outfile == 0) + { + std::cerr << "can't open " << outfilename << std::endl; + exit(2); + } + Pl_StdioFile* out = new Pl_StdioFile("stdout", outfile); + // Use a small buffer size (64) for testing + Pl_RC4* rc4 = new Pl_RC4("rc4", out, key, keylen, 64); + delete [] key; + + // 64 < buffer size < 512, buffer_size is not a power of 2 for testing + unsigned char buf[100]; + bool done = false; + while (! done) + { + int len = fread(buf, 1, sizeof(buf), infile); + if (len <= 0) + { + done = true; + } + else + { + rc4->write(buf, len); + } + } + rc4->finish(); + delete rc4; + delete out; + fclose(infile); + fclose(outfile); + return 0; +} diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 00000000..5def3516 --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,6964 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION="1.5.26 Debian 1.5.26-1" +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/make/proxy.mk b/make/proxy.mk new file mode 100644 index 00000000..16831862 --- /dev/null +++ b/make/proxy.mk @@ -0,0 +1,10 @@ +THIS=$(notdir $(abspath .)) + +all: + $(MAKE) -C .. build_$(THIS) + +check: + $(MAKE) -C .. check_$(THIS) + +clean: + $(MAKE) -C .. clean_$(THIS) diff --git a/make/rules.mk b/make/rules.mk new file mode 100644 index 00000000..901534cd --- /dev/null +++ b/make/rules.mk @@ -0,0 +1,63 @@ + +# Usage: $(call src_to_obj,srcs) +define src_to_obj +$(foreach F,$(1),$(dir $(F))$(OUTPUT_DIR)/$(patsubst %.cc,%.o,$(notdir $(F)))) +endef + +# Usage: $(call src_to_lobj,srcs) +define src_to_lobj +$(foreach F,$(1),$(dir $(F))$(OUTPUT_DIR)/$(patsubst %.cc,%.lo,$(notdir $(F)))) +endef + +# Usage: $(call obj_to_dep,objs) +define obj_to_dep +$(patsubst %.o,%.dep,$(1)) +endef + +# Usage: $(call lobj_to_dep,objs) +define lobj_to_dep +$(patsubst %.lo,%.dep,$(1)) +endef + +# Usage: $(call depflags,$(basename obj)) +ifeq ($(GENDEPS),1) +depflags=-MD -MF $(1).dep -MP +else +depflags= +endif + +# 1 2 +# Usage: $(call compile,src,includes) +define compile + $(CXX) $(CPPFLAGS) $(CXXFLAGS) \ + $(call depflags,$(basename $(call src_to_obj,$(1)))) \ + $(foreach I,$(2),-I$(I)) \ + -c $(1) -o $(call src_to_obj,$(1)) +endef + +# 1 2 +# Usage: $(call libcompile,src,includes) +define libcompile + $(LIBTOOL) --mode=compile \ + $(CXX) $(CPPFLAGS) $(CXXFLAGS) \ + $(call depflags,$(basename $(call src_to_obj,$(1)))) \ + $(foreach I,$(2),-I$(I)) \ + -c $(1) -o $(call src_to_obj,$(1)) +endef + +# 1 2 3 4 5 +# Usage: $(call makelib,objs,library,current,revision,age) +define makelib + $(LIBTOOL) --mode=link \ + $(CXX) $(CXXFLAGS) -o $(2) $(1) $(LDFLAGS) $(LIBS) \ + -rpath $(libdir) -version-info $(3):$(4):$(5) +endef + +# 1 2 +# Usage: $(call makebin,objs,binary) +define makebin + $(LIBTOOL) --mode=link \ + $(CXX) $(CXXFLAGS) $(1) -o $(2) $(LDFLAGS) \ + -Llibqpdf/$(OUTPUT_DIR) -lqpdf $(LIBS) +endef + diff --git a/make_dist b/make_dist new file mode 100755 index 00000000..5ea2c646 --- /dev/null +++ b/make_dist @@ -0,0 +1,165 @@ +#!/usr/bin/env perl +# +# This program creates a source distribution of qpdf. For details, +# see README.maintainer. +# + +require 5.008; +BEGIN { $^W = 1; } +use strict; +use Cwd; +use IO::File; + +my $whoami = ($0 =~ m,([^/\\]*)$,) ? $1 : $0; +#my $dirname = ($0 =~ m,(.*)[/\\][^/\\]+$,) ? $1 : "."; + +usage() unless @ARGV >= 1; +my $srcdir = shift(@ARGV); +my $run_tests = 1; +if (@ARGV) +{ + if ($ARGV[0] eq '--no-tests') + { + $run_tests = 0; + } + else + { + usage(); + } +} +$srcdir =~ s,/$,,; +usage() unless $srcdir =~ m/^qpdf-(\d+\.\d+(?:\.(a|b|rc)\d+)?)$/; +my $version = $1; +usage() unless -d $srcdir; + +my $pwd = getcwd(); +cd($srcdir); + +# Check versions +my $fh = safe_open("configure.ac"); +my $config_version = 'unknown'; +while (<$fh>) +{ + if (m/^AC_INIT\(qpdf,([^\)]+)\)/) + { + $config_version = $1; + last; + } +} +$fh->close(); + +$fh = safe_open("qpdf/qpdf.cc"); +my $code_version = 'unknown'; +while (<$fh>) +{ + if (m/whoami << \" version ([^\"]+)\"/) + { + $code_version = $1; + last; + } +} +$fh->close(); + +$fh = safe_open("manual/qpdf-manual.xml"); +my $doc_version = 'unknown'; +while (<$fh>) +{ + if (m/swversion "([^\"]+)\"/) + { + $doc_version = $1; + last; + } +} +$fh->close(); + +$fh = safe_open("qpdf.spec"); +my $spec_version = 'unknown'; +while (<$fh>) +{ + if (m/Version: (.*)$/) + { + $spec_version = $1; + last; + } +} + +my $version_error = 0; +if ($version ne $config_version) +{ + print "$whoami: configure.ac version = $config_version\n"; + $version_error = 1; +} +if ($version ne $code_version) +{ + print "$whoami: qpdf.cc version = $code_version\n"; + $version_error = 1; +} +if ($version ne $doc_version) +{ + print "$whoami: qpdf-manual.xml version = $doc_version\n"; + $version_error = 1; +} +if ($version ne $spec_version) +{ + print "$whoami: qpdf.spec version = $spec_version\n"; + $version_error = 1; +} +if ($version_error) +{ + die "$whoami: version numbers are not consistent\n"; +} + +run("autoconf"); +run("./configure --enable-doc-maintenance"); +run("make build_manual"); +run("make distclean"); +cd($pwd); +run("tar czvf $srcdir.tar.gz-candidate $srcdir"); +if ($run_tests) +{ + cd($srcdir); + run("./configure"); + run("make check"); + cd($pwd); +} +rename "$srcdir.tar.gz-candidate", "$srcdir.tar.gz" or die; + +print " +Source distribution created as $srcdir.tar.gz +You can now remove $srcdir. +If this is a release, don't forget to tag the version control system and +make a backup of the release tar file. + +"; + +sub safe_open +{ + my $file = shift; + my $fh = new IO::File("<$file") or die "$whoami: can't open $file: $!"; + $fh; +} + +sub run +{ + my $cmd = shift; + system($cmd) == 0 or die "$whoami: $cmd failed\n"; +} + +sub cd +{ + my $dir = shift; + chdir($dir) or die; +} + +sub usage +{ + die " +Usage: $whoami qpdf-version [ --no-tests ] + +qpdf-version must be a directory containing a pristine export of that +version of qpdf from the version control system. Use of --no-tests +can be used for internally testing releases, but do not use it for a +real release. + +"; +} diff --git a/manual/Makefile b/manual/Makefile new file mode 100644 index 00000000..90899055 --- /dev/null +++ b/manual/Makefile @@ -0,0 +1 @@ +include ../make/proxy.mk diff --git a/manual/README b/manual/README new file mode 100644 index 00000000..88118ac0 --- /dev/null +++ b/manual/README @@ -0,0 +1,3 @@ +This directory contains sources to the documentation. If you are +looking for pre-built documentation, please look in the "doc" +directory. diff --git a/manual/build.mk b/manual/build.mk new file mode 100644 index 00000000..55c49652 --- /dev/null +++ b/manual/build.mk @@ -0,0 +1,43 @@ +INDOC = manual/qpdf-manual +OUTDOC = manual/$(OUTPUT_DIR)/qpdf-manual + +TARGETS_manual := doc/qpdf.1 doc/fix-qdf.1 doc/zlib-flate.1 +ifeq ($(BUILD_HTML),1) +TARGETS_manual += doc/qpdf-manual.html +endif +ifeq ($(BUILD_PDF),1) +TARGETS_manual += doc/qpdf-manual.pdf +endif + +VALIDATE=manual/$(OUTPUT_DIR)/validate + +ifeq ($(VALIDATE_DOC),1) + +$(VALIDATE): $(INDOC).xml + $(XMLLINT) --noout --dtdvalid $(DOCBOOKX_DTD) $< + touch $(VALIDATE) + +else + +$(VALIDATE): + touch $(VALIDATE) + +endif + +$(OUTDOC).pdf: $(OUTDOC).fo + $(FOP) $< -pdf $@ + +$(OUTDOC).html: $(INDOC).xml manual/html.xsl $(VALIDATE) + $(XSLTPROC) --output $@ manual/html.xsl $< + +.PRECIOUS: $(OUTDOC).fo +$(OUTDOC).fo: $(INDOC).xml manual/print.xsl $(VALIDATE) + $(XSLTPROC) --output $@ manual/print.xsl $< + +doc/%.1: manual/%.1.in + sed -e 's:@PACKAGE_VERSION@:$(PACKAGE_VERSION):g' \ + -e 's:@docdir@:$(docdir):g' \ + < $< > $@ + +doc/%: manual/$(OUTPUT_DIR)/% + cp $< $@ diff --git a/manual/common.xsl b/manual/common.xsl new file mode 100644 index 00000000..e564bfd8 --- /dev/null +++ b/manual/common.xsl @@ -0,0 +1,9 @@ + + + + 0pt + + + + diff --git a/manual/fix-qdf.1.in b/manual/fix-qdf.1.in new file mode 100644 index 00000000..e1f7f8cb --- /dev/null +++ b/manual/fix-qdf.1.in @@ -0,0 +1,18 @@ +\" This file is not processed by autoconf, but rather by build.mk in +\" the manual directory. +.TH FIX-QDF "1" "April 2008" "fix-qdf version @PACKAGE_VERSION@" "User Commands" +.SH NAME +fix-qdf \- repair PDF files in QDF form after editing +.SH SYNOPSIS +.B qpdf +< \fIinfilename\fR > \fIoutfilename\fR +.SH DESCRIPTION +The fix-qdf program is part of the qpdf package. +.PP +The fix-qdf program reads a PDF file in QDF form and writes out +the same file with stream lengths, cross-reference table entries, and +object stream offset tables regenerated. +.PP +For details about fix-qdf and about PDF files in QDF mode, please see +the qpdf manual, which can be found in @docdir@/qpdf-manual.html or +@docdir@/qpdf-manual.pdf. diff --git a/manual/html.xsl.in b/manual/html.xsl.in new file mode 100644 index 00000000..e96f0583 --- /dev/null +++ b/manual/html.xsl.in @@ -0,0 +1,8 @@ + + + + + stylesheet.css + diff --git a/manual/print.xsl.in b/manual/print.xsl.in new file mode 100644 index 00000000..d712cb35 --- /dev/null +++ b/manual/print.xsl.in @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + #F0F0F0 + 0.5pt + solid + #575757 + 3pt + + + #00c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/manual/qpdf-manual.xml b/manual/qpdf-manual.xml new file mode 100644 index 00000000..9257f26f --- /dev/null +++ b/manual/qpdf-manual.xml @@ -0,0 +1,1964 @@ + + + + + + + + +]> + + + QPDF Manual + For QPDF Version &swversion;, &lastreleased; + + JayBerkenbilt + + + 2005–2008 + Jay Berkenbilt + + + + General Information + + QPDF is a program that does structural, content-preserving + transformations on PDF files. QPDF's website is located at http://qpdf.qbilt.org/. + + + QPDF has been released under the terms of Version + 2.0 of the Artistic License, a copy of which appears in the + file Artistic-2.0 in the source distribution. + + + QPDF was originally created in 2001 and modified periodically + between 2001 and 2005 during my employment at Apex CoVantage. Upon my + departure from Apex, the company graciously allowed me to take + ownership of the software and continue maintaining as an open + source project, a decision for which I am very grateful. I have + made considerable enhancements to it since that time. I feel + fortunate to have worked for people who would make such a decision. + This work would not have been possible without their support. + + + + What is QPDF? + + QPDF is a program that does structural, content-preserving + transformations on PDF files. It could have been called something + like pdf-to-pdf. It also provides many useful + capabilities to developers of PDF-producing software or for people + who just want to look at the innards of a PDF file to learn more + about how they work. + + + QPDF is not a PDF content creation library, a + PDF viewer, or a program capable of converting PDF into other + formats. In particular, QPDF knows nothing about the semantics of + PDF content streams. If you are looking for something that can do + that, you should look elsewhere. However, once you have a valid + PDF file, QPDF can be used to transform that file in ways perhaps + your original PDF creation can't handle. For example, programs + generate simple PDF files but can't password-protect them, + web-optimize them, or perform other transformations of that type. + + + + Building and Installing QPDF + + This chapter describes how to build and install qpdf. Please see + also the README and + INSTALL files in the source distribution. + + + System Requirements + + The qpdf package has relatively few external dependencies. In + order to build qpdf, the following packages are required: + + + + zlib: http://www.zlib.net/ + + + + + pcre: http://www.pcre.org/ + + + + + gnu make 3.81 or newer: http://www.gnu.org/software/make + + + + + perl version 5.8 or newer: + http://www.perl.org/; + required for fix-qdf and the test suite. + + + + + GNU diffutils (any version): http://www.gnu.org/software/diffutils/ + is required to run the test suite. Note that this is the + version of diff present on virtually all GNU/Linux systems. + This is required because the test suite uses diff + -u. + + + + + + Part of qpdf's test suite does comparisons of the contents PDF + files by converting them images and comparing the images. You can + optionally disable this part of the test suite by running + configure with the + flag. If you leave + this enabled, the following additional requirements are required + by the test suite. Note that in no case are these items required + to use qpdf. + + + + libtiff: http://www.remotesensing.org/libtiff/ + + + + + GhostScript version 8.60 or newer: http://pages.cs.wisc.edu/~ghost/ + + + + This option is primarily intended for use by packagers of qpdf so + that they can avoid having the qpdf packages depend on tiff and + ghostscript software. + + + If Adobe Reader is installed as acroread, some + additional test cases will be enabled. These test cases simply + verify that Adobe Reader can open the files that qpdf creates. + They require version 8.0 or newer to pass. However, in order to + avoid having qpdf depend on non-free (as in liberty) software, the + test suite will still pass without Adobe reader, and the test + suite still exercises the full functionality of the software. + + + Pre-built documentation is distributed with qpdf, so you should + generally not need to rebuild the documentation. In order to + build the documentation from its docbook sources, you need the + docbook XML style sheets (http://downloads.sourceforge.net/docbook/). + To build the PDF version of the documentation, you need Apache fop + (http://xml.apache.org/fop/) + version 0.94 of higher. + + + + Build Instructions + + Building qpdf on UNIX is generally just a matter of running + + ./configure +make + + You can also run make check to run the test + suite and make install to install. Please run + ./configure --help for options on what can be + configured. You can also set the value of + DESTDIR during installation to install to a + temporary location, as is common with many open source packages. + Please see also the README and + INSTALL files in the source distribution. + + + There is currently no support for building qpdf on Windows. The + code is reasonably portable, however, and making it work on + Windows would probably be reasonably straightforward. A + significant amount of the code in QPDF has been known to work on + Windows in the past. + + + There are some other things you can do with the build. Although + qpdf uses autoconf, it does not use + automake but instead uses a + hand-crafted non-recursive Makefile that requires gnu make. If + you're really interested, please read the comments in the + top-level Makefile. + + + + + Running QPDF + + This chapter describes how to run the qpdf program from the command + line. + + + Basic Invocation + + When running qpdf, the basic invocation is as follows: + + qpdf + + This converts PDF file to PDF file + . The output file is functionally + identical to the input file but may have been structurally + reorganized. Also, orphaned objects will be removed from the + file. Many transformations are available as controlled by the + options below. + + + does not have to be seekable, even + when generating linearized files. Specifying + “” as + means to write to standard output. + + + Most options require an output file, but some testing or + inspection commands do not. These are specifically noted. + + + + Basic Options + + The following options are the most common ones and perform + commonly needed transformations. + + + + + + Specifies a password for accessing encrypted files. + + + + + + + + Causes generation of a linearized (web optimized) output file. + + + + + + + + Causes generation an encrypted output file. Please see for details on how to + specify encryption parameters. + + + + + + + + Removes any encryption on the file. A password must be + supplied if the file is password protected. + + + + + + + Password-protected files may be opened by specifying a password. + By default, qpdf will preserve any encryption data associated with + a file. If is specified, qpdf will + attempt to remove any encryption information. If + is specified, qpdf will replace the + document's encryption parameters with whatever is specified. + + + Note that qpdf does not obey encryption restrictions already + imposed on the file. Doing so would be meaningless since qpdf can + be used to remove encryption from the file entirely. This + functionality is not intended to be used for bypassing copyright + restrictions or other restrictions placed on files by their + producers. + + + + Encryption Options + + To change the encryption parameters of a file, use the --encrypt + flag. The syntax is + + + + Note that “” terminates parsing of + encryption flags and must be present even if no restrictions are + present. + + + Either or both of the user password and the owner password may be + empty strings. + + + The value for + may be 40 + or 128. The restriction flags are dependent upon key length. + When no additional restrictions are given, the default is to be + fully permissive. + + + If is 40, + the following restriction options are available: + + + + + + Determines whether or not to allow printing. + + + + + + + + Determines whether or not to allow document modification. + + + + + + + + Determines whether or not to allow text/image extraction. + + + + + + + + Determines whether or not to allow comments and form fill-in + and signing. + + + + + If is 128, + the following restriction options are available: + + + + + + Determines whether or not to allow accessibility to visually + impaired. + + + + + + + + Determines whether or not to allow text/graphic extraction. + + + + + + + + Controls printing access. + may be + one of the following: + + + + : allow full printing + + + + + : allow low-resolution printing only + + + + + : disallow printing + + + + + + + + + + + Controls modify access. + may be + one of the following: + + + + : allow full document modification + + + + + : allow comment authoring and form operations + + + + + : allow form field fill-in and signing + + + + + : allow document assembly only + + + + + : allow no modifications + + + + + + + + The default for each permission option is to be fully permissive. + + + + Advanced Transformation Options + + These transformation options control fine points of how qpdf + creates the output file. Mostly these are of use only to people + who are very familiar with the PDF file format or who are PDF + developers. The following options are available: + + + + + + Controls transformation of stream data. The value of + may be one + of the following: + + + + : recompress stream data when + possible (default) + + + + + : leave all stream data as is + + + + + : uncompress stream data when + possible + + + + + + + + + + + Enables or disables normalization of content streams. + + + + + + + + Prevents qpdf from attempting to recover damaged files. + + + + + + + + Controls handing of object streams. The value of + may be one of + the following: + + + + : preserve original object streams + (default) + + + + + : don't write any object streams + + + + + : use object streams wherever + possible + + + + + + + + + + + Tells qpdf to ignore any cross-reference streams. + + + + + + + + Turns on QDF mode. For additional information on QDF, please + see . + + + + + + + By default, when a stream is encoded using non-lossy filters that + qpdf understands and is not already compressed using a good + compression scheme, qpdf will uncompress and recompress streams. + Assuming proper filter implements, this is safe and generally + results in smaller files. This behavior may also be explicitly + requested with . + + + When is specified, qpdf + will never attempt to change the filtering of any stream data. + + + When is specified, qpdf + will attempt to remove any non-lossy filters that it supports. + This includes /FlateDecode, + /LZWDecode, /ASCII85Decode, + and /ASCIIHexDecode. This can be very useful + for inspecting the contents of various streams. + + + When is specified, qpdf + will attempt to normalize whitespace and newlines in page content + streams. This is generally safe but could, in some cases, cause + damage to the content streams. This option is intended for people + who wish to study PDF content streams or to debug PDF content. + You should not use this for “production” PDF files. + + + Ordinarily, qpdf will attempt to recover from certain types of + errors in PDF files. These include errors in the cross-reference + table, certain types of object numbering errors, and certain types + of stream length errors. Sometimes, qpdf may think it has + recovered but may not have actually recovered, so care should be + taken when using this option as some data loss is possible. The + option will prevent qpdf from + attempting recovery. In this case, it will fail on the first + error that it encounters. + + + Object streams, also known as compressed objects, were introduced + into the PDF specification at version 1.5, corresponding to + Acrobat 6. Some older PDF viewers may not support files with + object streams. qpdf can be used to transform files with object + streams to files without object streams or vice versa. As + mentioned above, there are three object stream modes: + , , and + . + + + In mode, the relationship to objects and + the streams that contain them is preserved from the original file. + In mode, all objects are written as + regular, uncompressed objects. The resulting file should be + readable by older PDF viewers. (Of course, the content of the + files may include features not supported by older viewers, but at + least the structure will be supported.) In + mode, qpdf will create its own object + streams. This will usually result in more compact PDF files, + though they may not be readable by older viewers. In this mode, + qpdf will also make sure the PDF version number in the header is + at least 1.5. + + + Ordinarily, qpdf reads cross-reference streams when they are + present in a PDF file. If + is specified, qpdf will ignore any cross-reference streams for + hybrid PDF files. The purpose of hybrid files is to make some + content available to viewers that are not aware of cross-reference + streams. It is almost never desirable to ignore them. The only + time when you might want to use this feature is if you are testing + creation of hybrid PDF files and wish to see how a PDF consumer + that doesn't understand object and cross-reference streams would + interpret such a file. + + + The flag turns on QDF mode, which changes + some of the defaults described above. Specifically, in QDF mode, + by default, stream data is uncompressed, content streams are + normalized, and encryption is removed. These defaults can still + be overridden by specifying the appropriate options as described + above. Additionally, in QDF mode, stream lengths are stored as + indirect objects, objects are laid out in a less efficient but + more readable fashion, and the documents are interspersed with + comments that make it easier for the user to find things and also + make it possible for fix-qdf to work properly. + QDF mode is intended for people, mostly developers, who wish to + inspect or modify PDF files in a text editor. For details, please + see . + + + + Testing, Inspection, and Debugging Options + + These options can be useful for digging into PDF files or for use + in automated test suites for software that uses the qpdf library. + When any of the options in this section are specified, no output + file should be given. The following options are available: + + + + + + Causes generation of a fixed value for /ID. This is intended + for testing only. Never use it for production files. + + + + + + + + Shows document encryption parameters. Also shows the + document's user password if the owner password is given. + + + + + + + + Checks file integrity and linearization status. + + + + + + + + Checks and displays all data in the linearization hint tables. + + + + + + + + Shows the contents of the cross-reference table in a + human-readable form. This is especially useful for files with + cross-reference streams which are stored in a binary format. + + + + + + + + Show the contents of the given object. This is especially + useful for inspecting objects that are inside of object + streams (also known as “compressed objects”). + + + + + + + + When used along with the + option, if the object is a stream, shows the raw stream data + instead of object's contents. + + + + + + + + When used along with the + option, if the object is a stream, shows the filtered stream + data instead of object's contents. If the stream is filtered + using filters that qpdf does not support, an error will be + issued. + + + + + + + + Shows the object and generation number for each page + dictionary object and for each content stream associated with + the page. Having this information makes it more convenient to + inspect objects from a particular page. + + + + + + + + When used along with , also shows + the object and generation numbers for the image objects on + each page. (At present, information about images in shared + resource dictionaries are not output by this command. This is + discussed in a comment in the source code.) + + + + + + + + Checks file structure and well as encryption and + linearization. A file for which + reports no errors may still have errors in stream data but + should otherwise be otherwise structurally sound. + + + + + + + The and + options are ignored unless + is given. Either of these options + will cause the stream data to be written to standard output. In + order to avoid commingling of stream data with other output, it is + recommend that these objects not be combined with other + test/inspection options. + + + If is given and + is also given, qpdf will + attempt to normalize the stream data as if it is a page content + stream. This attempt will be made even if it is not a page + content stream, in which case it will produce unusuable results. + + + + + QDF Mode + + In QDF mode, qpdf creates PDF files in what we call QDF + form. A PDF file in QDF form, sometimes called a QDF + file, is a completely valid PDF file that has + %QDF-1.0 as its third line (after the pdf header + and binary characters) and has certain other characteristics. The + purpose of QDF form is to make it possible to edit PDF files, with + some restrictions, in an ordinary text editor. This can be very + useful for experimenting with different PDF constructs or for + making one-off edits to PDF files (though there are other reasons + why this may not always work). + + + It is ordinarily very difficult to edit PDF files in a text editor + for two reasons: most meaningful data in PDF files is compressed, + and PDF files are full of offset and length information that makes + it hard to add or remove data. A QDF file is organized in a manner + such that, if edits are kept within certain constraints, the + fix-qdf program, distributed with qpdf, is able + to restore edited files to a correct state. The + fix-qdf program takes no command-line + arguments. It reads a possibly edited QDF file from standard input + and writes a repaired file to standard output. + + + The following attributes characterize a QDF file: + + + + All objects appear in numerical order in the PDF file, including + when objects appear in object streams. + + + + + Objects are printed in an easy-to-read format, and all line + endings are normalized to UNIX line endings. + + + + + Unless specifically overridden, streams appear uncompressed + (when qpdf supports the filters and they are compressed with a + non-lossy compression scheme), and most content streams are + normalized (line endings are converted to just a UNIX-style + linefeeds). + + + + + All streams lengths are represented as indirect objects, and the + stream length object is always the next object after the stream. + If the stream data does not end with a newline, an extra newline + is inserted, and a special comment appears after the stream + indicating that this has been done. + + + + + If the PDF file contains object streams, if object stream + n contains k objects, + those objects are numbered from n+1 through + n+k, and the object number/offset pairs + appear on a separate line for each object. Additionally, each + object in the object stream is preceded by a comment indicating + its object number and index. This makes it very easy to find + objects in object streams. + + + + + All beginnings of objects, stream tokens, + endstream tokens, and + endobj tokens appear on lines by themselves. + A blank line follows every endobj token. + + + + + If there is a cross-reference stream, it is unfiltered. + + + + + Page dictionaries and page content streams are marked with + special comments that make them easy to find. + + + + + + When editing a QDF file, any edits can be made as long as the above + constraints are maintained. This means that you can freely edit a + page's content without worrying about messing up the QDF file. It + is also possible to add new objects so long as those objects are + added after the last object in the file or subsequent objects are + renumbered. If a QDF file has object streams in it, you can always + add the new objects before the xref stream and then change the + number of the xref stream, since nothing generally ever references + it by number. + + + It is not generally practical to remove objects from QDF files + without messing up object numbering, but if you remove all + references to an object, you can run qpdf on the file (after + running fix-qdf), and qpdf will omit the + now-orphaned object. + + + When fix-qdf is run, it goes through the file + and recomputes the following parts of the file: + + + + the /N, /W, and + /First keys of all object stream dictionaries + + + + + the pairs of numbers representing object numbers and offsets of + objects in object streams + + + + + all stream lengths + + + + + the cross-reference table or cross-reference stream + + + + + the offset to the cross-reference table or cross-reference + stream following the startxref token + + + + + + + Using the QPDF Library + + The source tree for the qpdf package has an + examples directory that contains a few + example programs. The qpdf/qpdf.cc source + file also serves as a useful example since it exercises almost all + of the qpdf library's public interface. The best source of + documentation on the library itself is reading comments in + include/qpdf/QPDF.hh, + include/qpdf/QDFWriter.hh, and + include/qpdf/QPDFObjectHandle.hh. + + + All header files are installed in the include/qpdf directory. It + is recommend that you use #include + <qpdf/QPDF.hh> rather than adding + include/qpdf to your include path. + + + When linking against the qpdf library, you may also need to + specify -lpcre -lz on your link command. If + your system understands how to read libtool + .la files, this may not be necessary. + + + + Design and Library Notes + + Introduction + + This section was written prior to the implementation of the qpdf + package and was subsequently modified to reflect the + implementation. In some cases, for purposes of explanation, it + may differ slightly from the actual implementation. As always, + the source code and test suite are authoritative. Even if there + are some errors, this document should serve as a road map to + understanding how this code works. + + + In general, one should adhere strictly to a specification when + writing but be liberal in reading. This way, the product of our + software will be accepted by the widest range of other programs, + and we will accept the widest range of input files. This library + attempts to conform to that philosophy whenever possible but also + aims to provide strict checking for people who want to validate + PDF files. If you don't want to see warnings and are trying to + write something that is tolerant, you can call + setSuppressWarnings(true). If you want to fail + on the first error, you can call + setAttemptRecovery(false). The default + behavior is to generating warnings for recoverable problems. Note + that recovery will not always produce the desired results even if + it is able to get through the file. Unlike most other PDF files + that produce generic warnings such as “This file is + damaged,”, qpdf generally issues a detailed error message + that would be most useful to a PDF developer. This is by design + as there seems to be a shortage of PDF validation tools out + there. (This was, in fact, one of the major motivations behind + the initial creation of qpdf.) + + + + Design Goals + + The QPDF package includes support for reading and rewriting PDF + files. It aims to hide from the user details involving object + locations, modified (appended) PDF files, the + directness/indirectness of objects, and stream filters including + encryption. It does not aim to hide knowledge of the object + hierarchy or content stream contents. Put another way, a user of + the qpdf library is expected to have knowledge about how PDF files + work, but is not expected to have to keep track of bookkeeping + details such as file positions. + + + A user of the library never has to care whether an object is + direct or indirect. All access to objects deals with this + transparently. All memory management details are also handled by + the library. + + + The PointerHolder object is used internally + by the library to deal with memory management. This is basically + a smart pointer object very similar in spirit to the Boost + library's shared_ptr object, but predating + it by several years. This library also makes use of a technique + for giving fine-grained access to methods in one class to other + classes by using public subclasses with friends and only private + members that in turn call private methods of the containing class. + See QPDFObjectHandle::Factory as an + example. + + + The top-level qpdf class is QPDF. A + QPDF object represents a PDF file. The + library provides methods for both accessing and mutating PDF + files. + + + QPDFObject is the basic PDF Object class. + It is an abstract base class from which are derived classes for + each type of PDF object. Clients do not interact with Objects + directly but instead interact with + QPDFObjectHandle. + + + QPDFObjectHandle contains + PointerHolder<QPDFObject> and + includes accessor methods that are type-safe proxies to the + methods of the derived object classes as well as methods for + querying object types. They can be passed around by value, + copied, stored in containers, etc. with very low overhead. + Instances of QPDFObjectHandle always + contain a reference back to the QPDF object + from which they were created. A + QPDFObjectHandle may be direct or indirect. + If indirect, the QPDFObject the + PointerHolder initially points to is a null + pointer. In this case, the first attempt to access the underlying + QPDFObject will result in the + QPDFObject being resolved via a call to the + referenced QPDF instance. This makes it + essentially impossible to make coding errors in which certain + things will work for some PDF files and not for others based on + which objects are direct and which objects are indirect. + + + There is no public interface for creating instances of + QPDFObjectHandle. They can be created only inside the QPDF + library. This is generally done through a call to the private + method QPDF::readObject which uses + QPDFTokenizer to read an indirect object at + a given file position and return a + QPDFObjectHandle that encapsulates it. + There are also internal methods to create fabricated indirect + objects from existing direct objects or to change an indirect + object into a direct object, though these steps are not performed + except to support rewriting. + + + When the QPDF class creates a new object, + it dynamically allocates the appropriate type of + QPDFObject and immediately hands the + pointer to an instance of QPDFObjectHandle. + The parser reads a token from the current file position. If the + token is a not either a dictionary or array opener, an object is + immediately constructed from the single token and the parser + returns. Otherwise, the parser is invoked recursively in a + special mode in which it accumulates objects until it finds a + balancing closer. During this process, the + “R” keyword is recognized and an + indirect QPDFObjectHandle may be + constructed. + + + The QPDF::resolve() method, which is used to + resolve an indirect object, may be invoked from the + QPDFObjectHandle class. It first checks a + cache to see whether this object has already been read. If not, + it reads the object from the PDF file and caches it. It the + returns the resulting QPDFObjectHandle. + The calling object handle then replaces its + PointerHolder<QDFObject> with the one + from the newly returned QPDFObjectHandle. + In this way, only a single copy of any direct object need exist + and clients can access objects transparently without knowing + caring whether they are direct or indirect objects. Additionally, + no object is ever read from the file more than once. That means + that only the portions of the PDF file that are actually needed + are ever read from the input file, thus allowing the qpdf package + to take advantage of this important design goal of PDF files. + + + If the requested object is inside of an object stream, the object + stream itself is first read into memory. Then the tokenizer reads + objects from the memory stream based on the offset information + stored in the stream. Those individual objects are cached, after + which the temporary buffer holding the object stream contents are + discarded. In this way, the first time an object in an object + stream is requested, all objects in the stream are cached. + + + An instance of QPDF is constructed by using + the class's default constructor. If desired, the + QPDF object may be configured with various + methods that change its default behavior. Then the + QPDF::processFile() method is passed the name + of a PDF file, which permanently associates the file with that + QPDF object. A password may also be given for access to + password-protected files. QPDF does not enforce encryption + parameters and will treat user and owner passwords equivalently. + Either password may be used to access an encrypted file. + + + As pointed out earlier, the intention is not for qpdf to be used + to bypass security on files. but as any open source PDF consumer + may be easily modified to bypass basic PDF document security, + and qpdf offers may transformations that can do this as well, + there seems to be little point in the added complexity of + conditionally enforcing document security. + + + QPDF will allow recovery of a user password + given an owner password. The input PDF file must be seekable. + (Output files written by QPDFWriter need + not be seekable, even when creating linearized files.) During + construction, QPDF validates the PDF file's + header, and then reads the cross reference tables and trailer + dictionaries. The QPDF class keeps only + the first trailer dictionary though it does read all of them so it + can check the /Prev key. + QPDF class users may request the root + object and the trailer dictionary specifically. The cross + reference table is kept private. Objects may then be requested by + number of by walking the object tree. + + + When a PDF file has a cross-reference stream instead of a + cross-reference table and trailer, requesting the document's + trailer dictionary returns the stream dictionary from the + cross-reference stream instead. + + + There are some convenience routines for very common operations + such as walking the page tree and returning a vector of all page + objects. For full details, please see the header file + QPDF.hh. + + + The following example should clarify how + QPDF processes a simple file. + + + + Client constructs QPDF + pdf and calls + pdf.processFile("a.pdf");. + + + + + The QPDF class checks the beginning of + a.pdf for + %!PDF-1.[0-9]+. It then reads the cross + reference table mentioned at the end of the file, ensuring that + it is looking before the last %%EOF. After + getting to trailer keyword, it invokes the + parser. + + + + + The parser sees “<<”, so + it calls itself recursively in dictionary creation mode. + + + + + In dictionary creation mode, the parser keeps accumulating + objects until it encounters + “>>”. Each object that is + read is pushed onto a stack. If + “R” is read, the last two + objects on the stack are inspected. If they are integers, they + are popped off the stack and their values are used to construct + an indirect object handle which is then pushed onto the stack. + When “>>” is finally read, + the stack is converted into a + QPDF_Dictionary which is placed in a + QPDFObjectHandle and returned. + + + + + The resulting dictionary is saved as the trailer dictionary. + + + + + The /Prev key is searched. If present, + QPDF seeks to that point and repeats + except that the new trailer dictionary is not saved. If + /Prev is not present, the initial parsing + process is complete. + + + If there is an encryption dictionary, the document's encryption + parameters are initialized. + + + + + The client requests root object. The + QPDF class gets the value of root key + from trailer dictionary and returns it. It is an unresolved + indirect QPDFObjectHandle. + + + + + The client requests the /Pages key from root + QPDFObjectHandle. The + QPDFObjectHandle notices that it is + indirect so it asks QPDF to resolve it. + QPDF looks in the object cache for an + object with the root dictionary's object ID and generation + number. Upon not seeing it, it checks the cross reference + table, gets the offset, and reads the object present at that + offset. It stores the result in the object cache and returns + the cached result. The calling + QPDFObjectHandle replaces its object + pointer with the one from the resolved + QPDFObjectHandle, verifies that it a + valid dictionary object, and returns the (unresolved indirect) + QPDFObject handle to the top of the + Pages hierarchy. + + + As the client continues to request objects, the same process is + followed for each new requested object. + + + + + + + Encryption + + Encryption is supported transparently by qpdf. When opening a PDF + file, if an encryption dictionary exists, the + QPDF object processes this dictionary using + the password (if any) provided. The primary decryption key is + computed and cached. No further access is made to the encryption + dictionary after that time. When an object is read from a file, + the object ID and generation of the object in which it is + contained is always known. Using this information along with the + stored encryption key, all stream and string objects are + transparently decrypted. Raw encrypted objects are never stored + in memory. This way, nothing in the library ever has to know or + care whether it is reading an encrypted file. + + + An interface is also provided for writing encrypted streams and + strings given an encryption key. This is used by + QPDFWriter when it rewrites encrypted + files. + + + + Writing PDF Files + + The qpdf library supports file writing of + QPDF objects to PDF files through the + QPDFWriter class. The + QPDFWriter class has two writing modes: one + for non-linearized files, and one for linearized files. See for a description of linearization + is implemented. This section describes how we write + non-linearized files including the creation of QDF files (see + . + + + This outline was written prior to implementation and is not + exactly accurate, but it provides a correct “notional” + idea of how writing works. Look at the code in + QPDFWriter for exact details. + + + + Initialize state: + + + + next object number = 1 + + + + + object queue = empty + + + + + renumber table: old object id/generation to new id/0 = empty + + + + + xref table: new id -> offset = empty + + + + + + + + Create a QPDF object from a file. + + + + + Write header for new PDF file. + + + + + Request the trailer dictionary. + + + + + For each value that is an indirect object, grab the next object + number (via an operation that returns and increments the + number). Map object to new number in renumber table. Push + object onto queue. + + + + + While there are more objects on the queue: + + + + Pop queue. + + + + + Look up object's new number n in the + renumbering table. + + + + + Store current offset into xref table. + + + + + Write n 0 obj. + + + + + If object is null, whether direct or indirect, write out + null, thus eliminating unresolvable indirect object + references. + + + + + If the object is a stream stream, write stream contents, + piped through any filters as required, to a memory buffer. + Use this buffer to determine the stream length. + + + + + If object is not a stream, array, or dictionary, write out + its contents. + + + + + If object is an array or dictionary (including stream), + traverse its elements (for array) or values (for + dictionaries), handling recursive dictionaries and arrays, + looking for indirect objects. When an indirect object is + found, if it is not resolvable, ignore. (This case is + handled when writing it out.) Otherwise, look it up in the + renumbering table. If not found, grab the next available + object number, assign to the referenced object in the + renumbering table, and push the referenced object onto the + queue. As a special case, when writing out a stream + dictionary, replace length, filters, and decode parameters + as required. + + + Write out dictionary or array, replacing any unresolvable + indirect object references with null (pdf spec says + reference to non-existent object is legal and resolves to + null) and any resolvable ones with references to the + renumbered objects. + + + + + If the object is a stream, write + stream\n, the stream contents (from the + memory buffer), and \nendstream\n. + + + + + When done, write endobj. + + + + + + + + + Once we have finished the queue, all referenced objects will have + been written out and all deleted objects or unreferenced objects + will have been skipped. The new cross-reference table will + contain an offset for every new object number from 1 up to the + number of objects written. This can be used to write out a new + xref table. Finally we can write out the trailer dictionary with + appropriately computed /ID (see spec, 8.3, File Identifiers), the + cross reference table offset, and %%EOF. + + + + Filtered Streams + + Support for streams is implemented through the + Pipeline interface which was designed for + this package. + + + When reading streams, create a series of + Pipeline objects. The + Pipeline abstract base requires + implementation write() and + finish() and provides an implementation of + getNext(). Each pipeline object, upon + receiving data, does whatever it is going to do and then writes + the data (possibly modified) to its successor. Alternatively, a + pipeline may be an end-of-the-line pipeline that does something + like store its output to a file or a memory buffer ignoring a + successor. For additional details, look at + Pipeline.hh. + + + QPDF can read raw or filtered streams. + When reading a filtered stream, the QPDF + class creates a Pipeline object for one of + each appropriate filter object and chains them together. The last + filter should write to whatever type of output is required. The + QPDF class has an interface to write raw or + filtered stream contents to a given pipeline. + + + + + Linearization + + This chapter describes how QPDF and + QPDFWriter implement creation and processing + of linearized PDFS. + + + Basic Strategy for Linearization + + To avoid the incestuous problem of having the qpdf library + validate its own linearized files, we have a special linearized + file checking mode which can be invoked via qpdf + --check-linearization (or qpdf + --check). This mode reads the linearization parameter + dictionary and the hint streams and validates that object + ordering, parameters, and hint stream contents are correct. The + validation code was first tested against linearized files created + by external tools (Acrobat and pdlin) and then used to validate + files created by QPDFWriter itself. + + + + Preparing For Linearization + + Before creating a linearized PDF file from any other PDF file, the + PDF file must be altered such that all page attributes are + propagated down to the page level (and not inherited from parents + in the /Pages tree). We also have to know + which objects refer to which other objects, being concerned with + page boundaries and a few other cases. We refer to this part of + preparing the PDF file as optimization, + discussed in . Note the, in + this context, the term optimization is a + qpdf term, and the term linearization is a + term from the PDF specification. Do not be confused by the fact + that many applications refer to linearization as optimization or + web optimization. + + + When creating linearized PDF files from optimized PDF files, there + are really only a few issues that need to be dealt with: + + + + Creation of hints tables + + + + + Placing objects in the correct order + + + + + Filling in offsets and byte sizes + + + + + + + Optimization + + In order to perform various operations such as linearization and + splitting files into pages, it is necessary to know which objects + are referenced by which pages, page thumbnails, and root and + trailer dictionary keys. It is also necessary to ensure that all + page-level attributes appear directly at the page level and are + not inherited from parents in the pages tree. + + + We refer to the process of enforcing these constraints as + optimization. As mentioned above, note + that some applications refer to linearization as optimization. + Although this optimization was initially motivated by the need to + create linearized files, we are using these terms separately. + + + PDF file optimization is implemented in the + QPDF_optimization.cc source file. That file + is richly commented and serves as the primary reference for the + optimization process. + + + After optimization has been completed, the private member + variables obj_user_to_objects and + object_to_obj_users in + QPDF have been populated. Any object that + has more than one value in the + object_to_obj_users table is shared. Any + object that has exactly one value in the + object_to_obj_users table is private. To find + all the private objects in a page or a trailer or root dictionary + key, one merely has make this determination for each element in + the obj_user_to_objects table for the given + page or key. + + + Note that pages and thumbnails have different object user types, + so the above test on a page will not include objects referenced by + the page's thumbnail dictionary and nothing else. + + + + Writing Linearized Files + + We will create files with only primary hint streams. We will + never write overflow hint streams. (As of PDF version 1.4, + Acrobat doesn't either, and they are never necessary.) The hint + streams contain offset information to objects that point to where + they would be if the hint stream were not present. This means + that we have to calculate all object positions before we can + generate and write the hint table. This means that we have to + generate the file in two passes. To make this reliable, + QPDFWriter in linearization mode invokes + exactly the same code twice to write the file to a pipeline. + + + In the first pass, the target pipeline is a count pipeline chained + to a discard pipeline. The count pipeline simply passes its data + through to the next pipeline in the chain but can return the + number of bytes passed through it at any intermediate point. The + discard pipeline is an end of line pipeline that just throws its + data away. The hint stream is not written and dummy values with + adequate padding are stored in the first cross reference table, + linearization parameter dictionary, and /Prev key of the first + trailer dictionary. All the offset, length, object renumbering + information, and anything else we need for the second pass is + stored. + + + At the end of the first pass, this information is passed to the + QPDF class which constructs a compressed + hint stream in a memory buffer and returns it. + QPDFWriter uses this information to write a + complete hint stream object into a memory buffer. At this point, + the length of the hint stream is known. + + + In the second pass, the end of the pipeline chain is a regular + file instead of a discard pipeline, and we have known values for + all the offsets and lengths that we didn't have in the first pass. + We have to adjust offsets that appear after the start of the hint + stream by the length of the hint stream, which is known. Anything + that is of variable length is padded, with the padding code + surrounding any writing code that differs in the two passes. This + ensures that changes to the way things are represented never + results in offsets that were gathered during the first pass + becoming incorrect for the second pass. + + + Using this strategy, we can write linearized files to a + non-seekable output stream with only a single pass to disk or + wherever the output is going. + + + + Calculating Linearization Data + + Once a file is optimized, we have information about which objects + access which other objects. We can then process these tables to + decide which part (as described in “Linearized PDF Document + Structure” in the PDF specification) each object is + contained within. This tells us the exact order in which objects + are written. The QPDFWriter class asks for + this information and enqueues objects for writing in the proper + order. It also turns on a check that causes an exception to be + thrown if an object is encountered that has not already been + queued. (This could happen only if there were a bug in the + traversal code used to calculate the linearization data.) + + + + Known Issues with Linearization + + There are a handful of known issues with this linearization code. + These issues do not appear to impact the behavior of linearized + files which still work as intended: it is possible for a web + browser to begin to display them before they are fully + downloaded. In fact, it seems that various other programs that + create linearized files have many of these same issues. These + items make reference to terminology used in the linearization + appendix of the PDF specification. + + + + Thread Dictionary information keys appear in part 4 with the + rest of Threads instead of in part 9. Objects in part 9 are + not grouped together functionally. + + + + + We are not calculating numerators for shared object positions + within content streams or interleaving them within content + streams. + + + + + We generate only page offset, shared object, and outline hint + tables. It would be relatively easy to add some additional + tables. We gather most of the information needed to create + thumbnail hint tables. There are comments in the code about + this. + + + + + + + Debugging Note + + The qpdf --show-linearization command can show + the complete contents of linearization hint streams. To look at + the raw data, you can extract the filtered contents of the + linearization hint tables using qpdf --show-object=n + --filtered-stream-data. Then, to convert this into a + bit stream (since linearization tables are bit streams written + without regard to byte boundaries), you can pipe the resulting + data through the following perl code: + + use bytes; +binmode STDIN; +undef $/; +my $a = <STDIN>; +my @ch = split(//, $a); +map { printf("%08b", ord($_)) } @ch; +print "\n"; + + + + + + Object and Cross-Reference Streams + + This chapter provides information about the implementation of + object stream and cross-reference stream support in qpdf. + + + Object Streams + + Object streams can contain any regular object except the + following: + + + + stream objects + + + + + objects with generation > 0 + + + + + the encryption dictionary + + + + + objects containing the /Length of another stream + + + + In addition, Adobe reader (at least as of version 8.0.0) appears + to not be able to handle having the document catalog appear in an + object stream if the file is encrypted, though this is not + specifically disallowed by the specification. + + + There are additional restrictions for linearized files. See for details. + + + The PDF specification refers to objects in object streams as + “compressed objects” regardless of whether the object + stream is compressed. + + + The generation number of every object in an object stream must be + zero. It is possible to delete and replace an object in an object + stream with a regular object. + + + The object stream dictionary has the following keys: + + + + /N: number of objects + + + + + /First: byte offset of first object + + + + + /Extends: indirect reference to stream that + this extends + + + + + + Stream collections are formed with /Extends. + They must form a directed acyclic graph. These can be used for + semantic information and are not meaningful to the PDF document's + syntactic structure. Although qpdf preserves stream collections, + it never generates them and doesn't make use of this information + in any way. + + + The specification recommends limiting the number of objects in + object stream for efficiency in reading and decoding. Acrobat 6 + uses no more than objects per object stream for linearized files + and no more 200 objects per stream for non-linearized files. + QPDFWriter, in object stream generation + mode, never puts more than 100 objects in an object stream. + + + Object stream contents consists of N pairs of + integers, each of which is the object number and the byte offset + of the object relative to the first object in the stream, followed + by the objects themselves, concatenated. + + + + Cross-Reference Streams + + For non-hybrid files, the value following + startxref is the byte offset to the xref stream + rather than the word xref. + + + For hybrid files (files containing both xref tables and + cross-reference streams), the xref table's trailer dictionary + contains the key /XRefStm whose value is the + byte offset to a cross-reference stream that supplements the xref + table. A PDF 1.5-compliant application should read the xref table + first. Then it should replace any object that it has already seen + with any defined in the xref stream. Then it should follow any + /Prev pointer in the original xref table's + trailer dictionary. The specification is not clear about what + should be done, if anything, with a /Prev + pointer in the xref stream referenced by an xref table. The + QPDF class ignores it, which is probably + reasonable since, if this case were to appear for any sensible PDF + file, the previous xref table would probably have a corresponding + /XRefStm pointer of its own. For example, if a + hybrid file were appended, the appended section would have its own + xref table and /XRefStm. The appended xref + table would point to the previous xref table which would point the + /XRefStm, meaning that the new + /XRefStm doesn't have to point to it. + + + Since xref streams must be read very early, they may not be + encrypted, and the may not contain indirect objects for keys + required to read them, which are these: + + + + /Type: value /XRef + + + + + /Size: value n+1: where + n is highest object number (same as + /Size in the trailer dictionary) + + + + + /Index (optional): value + [n count ...] + used to determine which objects' information is stored in this + stream. The default is [0 /Size]. + + + + + /Prev: value + offset: byte offset of previous xref + stream (same as /Prev in the trailer + dictionary) + + + + + /W [...]: sizes of each field in the xref + table + + + + + + The other fields in the xref stream, which may be indirect if + desired, are the union of those from the xref table's trailer + dictionary. + + + Cross-Reference Stream Data + + The stream data is binary and encoded in big-endian byte order. + Entries are concatenated, and each entry has a length equal to + the total of the entries in /W above. Each + entry consists of one or more fields, the first of which is the + type of the field. The number of bytes for each field is given + by /W above. A 0 in /W + indicates that the field is omitted and has the default value. + The default value for the field type is + “1”. All other default values are + “0”. + + + PDF 1.5 has three field types: + + + + 0: for free objects. Format: 0 obj + next-generation, same as the free table in a + traditional cross-reference table + + + + + 1: regular non-compressed object. Format: 1 offset + generation + + + + + 2: for objects in object streams. Format: 2 + object-stream-number index, the number of object + stream containing the object and the index within the object + stream of the object. + + + + + + It seems standard to have the first entry in the table be + 0 0 0 instead of 0 0 ffff + if there are no deleted objects. + + + + + Implications for Linearized Files + + For linearized files, the linearization dictionary, document + catalog, and page objects may not be contained in object streams. + + + Objects stored within object streams are given the highest range + of object numbers within the main and first-page cross-reference + sections. + + + It is okay to use cross-reference streams in place of regular xref + tables. There are on special considerations. + + + Hint data refers to object streams themselves, not the objects in + the streams. Shared object references should also be made to the + object streams. There are no reference in any hint tables to the + object numbers of compressed objects (objects within object + streams). + + + When numbering objects, all shared objects within both the first + and second halves of the linearized files must be numbered + consecutively after all normal uncompressed objects in that half. + + + + Implementation Notes + + There are three modes for writing object streams: + , , and + . In disable mode, we do not generate + any object streams, and we also generate an xref table rather than + xref streams. This can be used to generate PDF files that are + viewable with older readers. In preserve mode, we write object + streams such that written object streams contain the same objects + and /Extends relationships as in the original + file. This is equal to disable if the file has no object streams. + In generate, we create object streams ourselves by grouping + objects that are allowed in object streams together in sets of no + more than 100 objects. We also ensure that the PDF version is at + least 1.5 in generate mode, but we preserve the version header in + the other modes. The default is . + + + We do not support creation of hybrid files. When we write files, + even in preserve mode, we will lose any xref tables and merge any + appended sections. + + + + diff --git a/manual/qpdf.1.in b/manual/qpdf.1.in new file mode 100644 index 00000000..83fad225 --- /dev/null +++ b/manual/qpdf.1.in @@ -0,0 +1,19 @@ +\" This file is not processed by autoconf, but rather by build.mk in +\" the manual directory. +.TH QPDF "1" "April 2008" "qpdf version @PACKAGE_VERSION@" "User Commands" +.SH NAME +qpdf \- PDF transformation software +.SH SYNOPSIS +.B qpdf +[ \fIoptions \fR] \fIinfilename outfilename\fR +.SH DESCRIPTION +The qpdf program is used to convert one PDF file to another equivalent +PDF file. It is capable of performing a variety of transformations +such as linearization (also known as web optimization or fast web +viewing), encryption, and decryption of PDF files. It also has many +options for inspecting or checking PDF files, some of which are +useful primarily to PDF developers. +.PP +For a summary of qpdf's options, please run +\fBqpdf --help\fR. A complete manual can be found in +@docdir@/qpdf-manual.html or @docdir@/qpdf-manual.pdf. diff --git a/manual/zlib-flate.1.in b/manual/zlib-flate.1.in new file mode 100644 index 00000000..133dce7b --- /dev/null +++ b/manual/zlib-flate.1.in @@ -0,0 +1,21 @@ +\" This file is not processed by autoconf, but rather by build.mk in +\" the manual directory. +.TH ZLIB-FLATE "1" "April 2008" "zlib-flate from qpdf version @PACKAGE_VERSION@" "User Commands" +.SH NAME +zlib-flate \- raw zlib compression program +.SH SYNOPSIS +.B qpdf +\fI-compress | -uncompress\fR +.SH DESCRIPTION +The zlib-flate program is part of the qpdf package. +.PP +The zlib-flate program standard from input and writes to standard +output either compressing or compressing its input using raw zlib +compression. This program is provided primarily as a debugging tool. +It can be used to uncompress or compress raw PDF streams. +.PP +This program should not be used as a general purpose compression +tool. Use something like gzip(1) instead. +.PP +For details about qpdf, please see the qpdf manual, which can be found +in @docdir@/qpdf-manual.html or @docdir@/qpdf-manual.pdf. diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 00000000..ef7e16fd --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,161 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2006-05-11.19 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/qpdf.spec b/qpdf.spec new file mode 100644 index 00000000..93fa50ac --- /dev/null +++ b/qpdf.spec @@ -0,0 +1,93 @@ +Summary: Command-line tools and library for transforming PDF files +Name: qpdf +Version: 2.0 +Release: 1%{?dist} +License: Artistic +Group: System Environment/Libraries +URL: http://sourceforge.net/projects/qpdf/ + +Source: %{name}-%{version}.tar.gz + +Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root +BuildRequires: zlib-devel +BuildRequires: pcre-devel + +%description +QPDF is a program that does structural, content-preserving +transformations on PDF files. It could have been called something +like pdf-to-pdf. It also provides many useful capabilities to +developers of PDF-producing software or for people who just want to +look at the innards of a PDF file to learn more about how they work. + +QPDF offers many capabilities such as linearization (web +optimization), encrypt, and decription of PDF files. Note that QPDF +does not have the capability to create PDF files from scratch; it is +only used to create PDF files with special characteristics starting +from other PDF files or to inspect or extract information from +existing PDF files. + +%package devel +Summary: Development files for qpdf PDF manipulation library +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} zlib-devel pcre-devel + +%description devel +The qpdf-devel package contains header files and libraries necessary +for developing programs using the qpdf library. + +%package static +Summary: Static QPDF library +Group: Development/Libraries +Requires: %{name}-devel = %{version}-%{release} + +%description static +The qpdf-static package contains the static qpdf library. + +%prep +%setup -q + +%build +%configure --disable-test-compare-images --docdir='${datarootdir}'/doc/%{name}-%{version} +make %{?_smp_mflags} +make check + +%install +rm -rf $RPM_BUILD_ROOT +%makeinstall +# %doc below clobbers our docdir, so we have to copy it to a safe +# place so we can install it using %doc. We should still set docdir +# properly when configuring so that it gets substituted properly by +# autoconf. +cp -a $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{version} install-docs +mkdir -p install-examples/examples +cp -p examples/*.cc install-examples/examples +# Red Hat doesn't ship .la files. +rm -rf $RPM_BUILD_ROOT%{_libdir}/libqpdf.la + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root) +%doc README TODO Artistic-2.0 install-docs/* +%{_bindir}/* +%{_libdir}/libqpdf*.so.* +%{_mandir}/man1/* + +%files devel +%defattr(-,root,root) +%doc install-examples/examples +%{_includedir}/* +%{_libdir}/libqpdf*.so + +%files static +%defattr(-,root,root) +%{_libdir}/libqpdf*.a + +%clean +rm -rf $RPM_BUILD_ROOT + +%changelog +* Mon Apr 28 2008 Jay Berkenbilt - 2.0-1 +- Initial packaging 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 "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(); + 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 +#include +#include + +#include +#include +#include + +#include +#include + +#include + +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 pages = pdf.getAllPages(); + int pageno = 0; + for (std::vector::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 images = + page.getPageImages(); + if (! images.empty()) + { + std::cout << " images:" << std::endl; + for (std::map::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 content = + page.getPageContents(); + for (std::vector::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 0000000000000000000000000000000000000000..f8b779d4fb44e7812a1467e8e7a5089e0642f5d3 GIT binary patch literal 67790 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 (&A2r{U$n33{hM5(T<@mnVP?BHCOG(VD9LL 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 literal 0 HcmV?d00001 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 +>> +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 0000000000000000000000000000000000000000..8539ac4ba85902d54a91354ef4ff1cd30b37d790 GIT binary patch literal 13103 zcmd5@OOGR06`l}j1ZKS8Arv;~3aO(Ri5cHVRoyDoYLS^9YX&AgEq4QfQIxK>t0x}Z z_Q(qUG z_1$y6dt7zAwZGfHE$*mpXX{`8{_Een9gj24X2;LEo$c*zr}t<)jl%i(y=cS)9x|Z> zht|CZ>J3yXAw zwAyLlx7^qF{IX4PWzC_aJ)UxeHJ)-k+oo4s8?JYTC7y@lNi;zNGyIZExUZvp;>?zD)* zd2IXv9Bgar{^NePb7|LVq9ZsaUTYpd`{C2*QFt6p7HoT)_4dwA7Z5m{4))p2TWn{C zNjf@Uy*cY0#7v+~7g_{x1oUN1JZu7MfkURFz*6HOwArO$B(-siM$-{iX}PB~aI&5- z5~3=NCp_*3bV8+L65ejd@DF_gXjm}lZ~Wl!-RBYO-3#MzGJBew zetk9q+xHjIwT_s-OAN=g)FMi{r&gZ`N{D1wIZoGKup~pV{%KOLHuWw!7`{z%8^W|55 z@!kJ^YpGQ27@n5)C_N>_&r(45FMvtd2}t7}g?NO%iHdh`b_NTOaFvaSZ7W7ZsN;ANv6~MU|5<<-+}>gCw^{Fv zAN`n3&nA=n-z{jGEPfgu$#fV7dw3NYj09sEe}qxvPLCLOBS8Fw(aBX4AsNeoN29KV ze>jhxhd%*vg9{Mp6#!7}dQ7dtPWwhiV**Mpp-MYjc(Bb{Jg=RG(^1I89imhS;Iu!E zmw}`!NYrKQ80vHyiH16gB%sbL?`=$cQoyv=(b#32G~^nbpv))H$qDDK;@pG0!HeL} z;amrtOW1o)ARmCeQXNAYc07VV2mat3*y%i^XIw%b1&y)29KmNe#?N?8!MG|+&cQs6 z2jfG34Rbht(hkN_U{lg)HwjF(GG?7pS4!wfcX&e&%31FHa)}+IH^}^hRKb>A3v;pc zONp+v7!Ti`%^@qjBa;<13p&8PLJJ4dP|hInTw364NzDSMAd`j5*R4E+wT?x#E(ii# zY7)K)NQh*FNMXR&#c_s^I3_Zd0+e=%!9^mJymgJIp}@?5MFN;cg)}7o05-^F=Dc*Z z4RfjYCu^VV%{{aBX%r=)vAp;cLlhb`fyHZ4|0{Scpf>7)sO$AH#cy~`V>!W3J_!qF z@TW%xKW-gqWGC?LnXC)R_7qCnE_5NriRIc$(JA=}D(B*;YWA_*Z430KZsD&ZIFm=? zAgK=|7*!JW7hvv!JL9tBn%EM-g)tf@NWC`2NSIgoQF(QX5|!m@shn&wRVxb9RWdbE zo2jACRG5zN4P7r`G_D8HVg3N;xpgX67{#W zWQ9D!4b~RWuv#83MMHhgC@b_4?iaRzhSmCbDH`hYMp+?{vJC=BAQ}pa`rHv8F0INL zWE&KcKr}={ef~(dH}jdY1QMU+Z9H`%5IMLsfxJ{u)Mt>YLLyZgB$7ZhL_>WFsVXE= zwLu~YL_;*x=a6)}D4!`0iZ)23TK(<%QbAFlM5+pjRBez*0+FxLm9(Kgi&Pa^q|*k8 zBoNKeAnUV8r$Qo~Hb^9aXo!aTERt?_=QCy6fWbR`Jf;W4bf1aMY9#>42}DCQ)Mt@y zMHUGKSuOB}=Dujl`Yh6|kVq&$X#ow*Ws$Nzi*zd_(rtr85{QO^qCShH(!+cv^KhRE zl)pC~VM%6ET!9iYU>HFIh7L4QrE*^Q2X)_`>jD-it~NI12QUG?@~UMA>V+(uK#4E4Qyk!wY>r(S z?YLN!SZe3l)y4@u2wM?(5l=^uEU5JCyqRSWa2A z1>E+(KwvnR+DYH;tDsW1+|IRsoe)6$S?zq=*Mb0_;1uSCYAs#vE4c8>>j5=`_{F`{ z*Rg(yAV3c6zS@cf!F?-!1rM-{tvH7eR;+>v1+df($__1?6D)DM;#UVKWB) +{ + 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 + /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 0000000000000000000000000000000000000000..bac7eaec90b989e0b7ef49461887ee88b86d9202 GIT binary patch literal 17146 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d99bf6f819fc0db8d832545a8aecff2e131aa985 GIT binary patch literal 17137 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 literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/enc-R2,V1.pdf b/qpdf/qtest/qpdf/enc-R2,V1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dec9e6d78bf47bebddd0cb4f84127ddef9d7a351 GIT binary patch literal 17143 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 T`hx&s^#4~@KPto&dHw$fzU{m= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..88585663ade93e49a0999555b0b069c16fbad03f GIT binary patch literal 17144 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 BzN7#E literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9b95ae363ec6be69413162ac9858fe6846236e0b GIT binary patch literal 17139 zcmdU1cT^O~*Toe9#W508f{ln`z?q&rfQV!X4hy0p7zP*wg#m{F5kcKGAW>Y*iVKES z%z}y$45+9WP!thNV8DPP7;sI$s_toQy5}J0JLfxR;SYy-R=<9I>(;GT)%7s*ba1jj zM{yZuHMQ4oF}jIRgoQ)|%wkwuBMhc{s7xx6hsH^R5EOhBBO)&Na6$YKl*8d6Y?Ose zh0PFDfO16OH%Ekv3WVU7@d$?nJ|-Y2kIe$t+SnirsVoS3M*hz~v2tlJ14PJXBMg@E z2jwH!Z-|W1O=%LccvKsT3Pdy;k4tYS;Ie4#glw9P&0^8~u~8nq9S0Rq{js?sHqFN8 z(Vl}XM1|CL92NkR^1K{2i%YX{cpRFIr@|j!NN*=ZX}EBN99n!F5s&s97%eFA0S1ub zQ^+NuVNyBZ7lY{yn1!Gyhrt{t3ywg908+#YvPc#vpBJe>L?AZI;1v-8zJa@8-#q2g z7{DtOFaccY;AhR}2XXik4oe~uNLj%sKbRvD@pyrJHXD_)0@)H9Yc`)J3}j1r0??Gl zmk2;3UI14h5d;W1tRO*<%~ZfpMwCJ#S70P#G0e;y#ZEX^8Q7g$28E|&rqo>$APtK` zz#w6cj}DIl1A>Kp@kGpr0jjgHFWv}KjxfCyVC(>!fZRaTx&a?HV4x_u3EJYs0dvBJ zZ9vb!djik65xWq@y(#a_0Bmj51~`HtQQVSD)xU& z2tgDg1oXr@WWu~iDZ;duC?sJKGeMug|MrLo0ydv0sW@5@24o}(*js)T0fJ#ydPo(L zAaETb0z(H{;H{N9f%Se1>Q13y3Mm$$L>45G2LX3p2nRYv%#8+q>ZBKFyG(MZ#-ns} zK~qe_7r`S_-DMj_Tnu%v;LRGwVEQ2D2ajY~Z}T7a&%bdIL+^Mzzv{j6-F@G?>3*_l z{<3)!OyX9=f_9#W1qTJ=iNTx*dJ#yQR5nu)f}m_5YNXgu&{r)w3AzIXQUW4D0fm`F zq)uTHh15YBhyg+P0i6M#6S|60$fc5SMmOipgH7*`$(h{EHlQ}!`R~1ddG+rq9<=JZ z^G0Xs=G2h}|GGKmMi%BQSyXg-wE|6=pRjP*#-m?MQ{#j=*=f#szR4fi1Ff`o@I&Uz zG0$XY%rMJcW_Qt4`lRnXmqocjfe=pRt(3r`SP&3d&<`zWgE9J3`0XQP3aLyHg`g~; zU&^iu3YFMJ#9~}$A$;IO00suse@}@VH2%p4FKJXnv^)^>IV7SJ@P+?^0(bZr2hY#+ zlt%=5OTp*>vj~9+6Q>d+5b$d+kBC%#N3RG402f?F?i7qwErh{6wNQ=$`b8cER0QZ4 z_B`$q_>Fiv`-o@|CBL;l*i^MY5Zr`NMVJ&ZFR?KjmG8@o8anvfye-1@iKD02D~u;= zJm$PBnK4d3dn4o&4o?f|@q0mzjhDufVo(N1j4C`pLK7XNAY3@_V&O9<`%Xb*(P3ev ze?U)=7>YgFuYxzOX7+t+=xD(FUB2q?i`y^GziQX7LHF*ga{Yj`(<&mzl(z*zWk_67 zNPIpb05cf}(t;cee5PLo6I&a3z+m7G{X;g@6$hRnwx_he#Z+D+MM3l&jv4_BjvC4$ zW(N#5ltoM(IM^0YDU|VY;L!Dg<5WQn6Z-sBn8!7Xx0vY`$(P&YOmc51blBTy8PG8L znUfA*MW{GnM2`}oDz%QO3>A+D&>iC-R2?ExoSiUI7hqR7Ia#<5WGwV3n-1iTp7D9k#rQA5zM z1wtwD-@Go=Y8wC zUYB*YDzX2}s}}sfo;o}^VajrT_grUp*bQG&SVU(lfg^ZG^gS{2Df^z_w34Re&R0GF z==_O5H|fAa&%X-0D92yEeb)!ef9mu``Td4;)%)`G@!+tFe#dJwI=|bO&9u7PsIz^) zMsEXk6;Gf9mKa#X6X0=ysSye&oGWo=;7fCD6Deo*mrTPuw}>=d=9O0cBA9_6G%f>Q_OX?Bv$t zLyBYVfxcH4ox0LxZ1IO7(_B9n`VYIe%F!m%WXIv#cihrCEl(KaV{w%n6@jUeBm@hT zLBhNmDpWhT+ny=v?M`>Ug-%mbnhy=R5tDYw?x-R+tBG~`>t30QzkEf`B#ZECotpDY zAB@wzV8un(J=wNLEHzWuSLP({jvd4@3nY>AWyPexk0 z*iI59#c~y}ost65~05XHMNJLPmY$n2-6e=4liwbQqfazNj4su*4$a(MR00pLP zP~o5fS31lec_ze@9e7Va&aX?tUBTqJ zo_%iLrFS(Ui=>WjB`+(_&_@xIA|6~6ZxblHyTon(8`D)0y|UIm7)FPb5E&Arq#;dWDKYo`_aTLm zwuhy78bpRvGQLhcz~}PYtx@@f8jaEWc}Q8qt>gRSLi(TnoZ9ECW7Ue!KK-wG*Eg?b zzMeVT9j zV!`chyTXdfbqaT+9mvsJX?-cpc32yG&ES0`iu^1%gUCF zE1?KrF-qbpNLlg3r32tf60kM}0B+oY#DR=!?!fc2i6yaE6>A$; zdS2pY(Btnddo#@+^ETz(v{TcKIg%FLlz3u$_bz>%jOWZ@Ed6BQ5L`L!@|bja(^ku( z{-qvozo@{K&>=Fegf_Is6>dUfOR)bwu2`t;QCBv;tR(Z*BWUUD2Vh_8aPL{!-nX0n zI1pjKEwovBWVuzA=?7zfn-x-zs&tdxAH4iC5*F;3ey5`Um{dBhm}3|L30JTK+M@X+ z9bn^$NJr3DEYx=4ifbDg*IcdV6MCPk*wU9}RZf46ez4%b?(($$vQ&FQ8mn%~~2{n*$nUr|&IYoUe7RSyy;*-^`d^>A%l8#@uiy^5fl+=2aU%nLnC- zJ*@JmwBLnYEVXT~OD3rRmdL8Wi^djU33X`ASn#H}qs&}bsOP7@fkgA5_cxQsCgZdURYGPX@I7$W9c^8`W@wZ8=ZnYD?5klGgg*uZj8IG0$4(f z$iNcvKmis{OFDwYa!6v7#BJGSEWd&m1-2&m2JFfEFPntvQa1WoK0Z#p!A79 z4i_}k);Af@fyF$-5Xit1^3a;GTs$%92#m!-Z5OcgMc4O->QW!$sNOrqzT{dy$aab9 zH|NWd@w+GZq%#Xlf2fOB_PD&Pd9I??FEM#9=V0cyWOL?WsS03;%!&*wArBN_@yw({ z080|HHl=`z%Ntn=-fY%-bUTrs^ln2y!+uWmm@j)yCVfxcGI4F5;6l(JjQ6b4BDM0_ zS@}9wN3rEi_72AC6^;5TfF;z33@jlJt$~GSdOFCm3k$V9jOEdnT_1G~>oxT3mn4Xn z)GxI4>^V4BP{Z_f?NX#ENgjEA=)Z%8EPc>_eSttw6&1h|sTGN_JVG8QjKx!vjvxi_&>J!Rwhb&UZ)7RB zSh}ZMc?D}h<(%O%ZE?=ltOM7=uTQsj*IsG4{`$VlXWl%DoozP5v#;9(k7pm953cR@ za(lSC3SbE}A_Ggv0|i(-HR%w*lEkb{VEOcwS9QYVJl?C6uBL{wx|Btqi|=(dPs4nJ zdbb?DXz{Z2oXo*DnzraX-+Hn>sdIGv`pPLDISFH$=)hv0DN?|1br_&!i<{qZR$f@B z?a^31E^lPU=6*LkBQm`A{d7RhdFR3D8R`$O?J)ilo4<(D{CeJ$c_Xg=b}ZaflM~G0 z=G7-!*?NyU8*TbT1+at~kr<1;)>ei^%47K*XXS;3+Ad&mc_Rax9XL1Y*|;U9FYPzK znYg#-rgENT1hS;y+us*;h8m7vJ7dacjRKR*6yJoYa~qt?WNHlUS$Wq~086M58CXId zT1x>RPfa?46kwsY3s_v<$iR+B>(|rosbx+~?~2F9K0S{2^?n~>>Hi+-XVt~*#of1c z;g{FCiz?QMO!C5mroI}uCPFGM-=G3mLXAkkf|Eim(obTnpyRB(uu$6rtbo4qs(7_I z-dtzWo=5WNKQh-3db;$<%kLJ4b}U&pM<%J9Z+l#On@i5nuU**h42<_itTw)scJ<~m zITdoR?SJG8;g;#|w}1yjTix;!fz&|CKU6q?}`9jO9XBC{eBmQV)@uy|(D5tKkc(y}&_ z0#Lz0O=G_!hT7Cxk$;=3htFd-RI1@Kf5d?;%Lr? zwc2Q=P5JJzDmJ$;&lqEW?i#|%3?d06DFHZ6*iqI8Sg7q`tdPF&s*&jqITrW)AgkFV zPf_hH@~mh3*jN~R{B*5rWyU)r8?~X?pNwXk2hPms5^48&_q`#-jC2)yFqmfwutL=f zFIe%>K~}U_sOc&^>H|g2u*5i*$KhdQ?sAAzIB;=vB6bSLmq$5ZH7HYeI#pR8h6nt7SWa9Rj zm5+ngZYaEx{QJwb+AC_dUK_sX&!n8`TAUS|zkW$~E~|9=+nGD6YafH0kWIX?FI2pl z5fW-d(papbL>U&80(d4Lt0Qv@4T42B%0s>QD8joOk55@bpgbK9Yr+7-L0t^|z~1|U z4`nV4DmkE4c?z6^d*R@2uY-ZD00lJ;u;#(MT-SftcI%Zz z%L4A@{C-4paqrf26fEgx#rp8HN?!5KO=$X(`J2 zd8%=;hdV;l!oWk`WIj~yU9?H7z?S)ARaoV-!k1}ctCBl6@13;VWunupt5$8^1ad~R~zQ|}h+`mFK1ch-+HEH_*ATg@vw zaW!}E)J*#EWO@8;sY^`vwaCDizPWYxE;na}Pczx}IIAWNskYA1aLL*;HL5A$f+YX- zpB4UU+1uaFnXuqrYs1SGZZ`_vDjZ(Qhm70jH0yo6ct`D;i6uIlpTDThusmN|{p9rU z7xm@hfT!J_MWQtyTv?UbV|{nu;dcF+S5+{|F41oJD8s>D=O4)!8r;i#{$~q8)iB+} zed{l!t~k1`r0R-(Y^U$V6v)4Izr@Q#$KV?4_OTALp`7$bF zyKj2%qM=K5y_L^^fm5B_;s%9Ww>^LM!Ib>{cRQ`o+W(JfxzQ%Mk85K*cdnt9)qU3q zC*C!j>(It%d%Asr4uwGPVST7l&^WN#y>z=Wm1{(*cJLSG! z&~vxDM5}nb@7l0F?o&3fwb%FuX3Xz)EiT4c+kC(&#;|)=^$Y6{_KuccO5I*m*?r`k z+>l#APrRqSmL9!jZQ3Yh-&wUjbTn(+_K}nBrmvoIbW-&*W1&TfEc&2k)F}D-(?jYi z9{lOKvG&Em-jRjbZw@CtbePXIHW5qRGB!(WyW1UJx8{znzM^1e@KcATHGL$(`jeyd zQ$~tMssr$-OPTwq89GZP9CS{i=hm z^J5M(eU?eCjIikzViff-5RI;}D?Q9uSEc#6N8HYoS2tdbcU}2MeN}w-1N2z~FCs)> zg`%=36?`Ck9uK@=3?>RyIU*>-@aJdoDpo#AwQ*SVb{wc@lxunPVpA@kUgXNL1m}-6VP$t3*dnrN;?s~j|40_E&>*uOIlwm zV8hvlV&l+@i3MDE43g50Pv?+80H-}lI{}Yw6Txl$*6oBWIFV6oSSby~#)jo$6dRY$ z4I!6~fsjw^d#g;y}|pxS5{fI1gYhDB}1rHxCJMb`*W;t3D#QtlyyZ*{3Q z8U~=8fuu5|quOW6$Q%v>jy&;6kx=%xpkPx{by^lmqTUZ3m_R8U{di={7D* zNL$~R1B8-pqhr9K|1kjYmmcWYb3}9uxNO=V4M4dZ@_3{DF#r+z|5eeC3OLG|{{I2c Cimmwo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a4efba7a722b3a09106efc171bf51fa85a005318 GIT binary patch literal 17142 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 F{{T%;rN{sP literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/enc-R3,V2.pdf b/qpdf/qtest/qpdf/enc-R3,V2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80727887c4aac4f9514fc2eed8614317bd9a2fff GIT binary patch literal 17140 zcmdU1dss|c*mub#$vx*dq^(>cnc1`Fs)$NO7wIa6Moo#Dn5NuvNpi|9p_@ZTQbGs` zsSeVia@?X^Ln=}vG_`Ld!AE&G&65&zx!Rk^;^I7u088*jJ>&q zAv%exIi~XEty0ZCA{1dGfs2-C8XF^;EE_+mL@e`LE%8QB@NqUG;(`||#2rB~jE`_o zHZmVJLr?+AWrKG!5H2bZfj4#t20uF?D38PDAevLBBAODZH}s7BpMO@$BtDuTLJn}q zR{WrR1b>G}HTx(`LN%a z!v!#a5{q0W_Vbs>0KYU@j(}MRiej3qnNpuXL$425_ahyD^{djq$}8TPzYt*gh!V2NQ{SJTE?ngG$(59Pw0Rbde9+N8l~? z=J<$sB9trS3&mbMiAW;!;)r-&-c#oThH3`M#WFcgGPdTJF*9ac5M0&7@2s2@_F`X& zjd+p7KL`Pngk={T5CkR!8~{0Qz&v;mG_NHljSpUo5Df56D*M6f(I9t?*T zB99Br^YOp2AOt~(5KtQ*9;a2yBnZn)EEoF+`hqcmf3^+u1~%s)$?RacKai0iU{}5s z0Yczc+DhbNZ*UzV0#t_ zsP=$e6Fu~6eC8c$;+bS}w>mD~{qodf4-ePh#%r>i5q-PkJ<2O2rnRRsv{J)YZmf@K zeCqaKhr4uvhjf+GsMXOcK{I>A5JTBe=3Kxq0&SB>edUW0lp|~t90~?YDU<+fl*>av zC@A1CiwxDmUo4lHOT2I-NIzgSU`Js;gXA)aI6$*cfobET8TU3i8qLq${kQ+Ev@rv) zNuCxx3u^W(^@?%mr^VZKz1C+n-)2jauiL17k%bla60+hGZU=jJIo=etGvd`UAG?s5 z_kUm9Kg4m(keHr}Z$GML50O`y2Mox3{;^pL;;Fcm0$CIf0zwN0LJ2nzg73<27ATcV zr1BsHWrK;Y7%Oi-v1#B+oa}6b51a_V%zz7ky;uesey6|6_~IHEu@S>hWbe!ZgF%%1w*FvK)&4+mPJVKK38H_sa8>oBn|GSG82a>Q(5auK9?BS-Ru%u@z?5eu^P$2r}O;-yVoYEh#Z$* zC4!2OxRj9id_=(GgNaEC2KMPk!HlYi%yqMLo%!+pa}+zV>ixrmO&X;6t0u_FcV-KLa9*1i@~Yu0OzTk9wzkpqcD$q`u?%+S@`d>LUazUf3GpK z>iM4F>AE*FeHvASN&rTVC>g3k>{$2+qiiA`KzE#jP<6;i33kFrt;oqn8DbQqDL;-^ z{UKUm8xv4lc{lLFtlzUu)>-y&{i{Xisn4~MJsm#`9vUE7xDmUv*5Y%0q!XnFB)mA- z-(w_csD#h~fn$zxf%dTxfdJ14+r&r_N-$~gr9v?&zfYp3jX_o;b8S34_>IdVJfsJo z=y1Yf>VB!=k2C!IpzzYAw|~?c_SgD&Xus1T6(JG{0S*ROLP+pHu8I%y4`&KNogWSR zr1|kX_v}OC*82qA9`vbuT^FxkysmmLFshVWAMQ7;gc24x+6v@IB9enou6>HZCrPc~ zDRuM}9RQ>60)&%^EcE=Nu>bh->*Z3D*~1!qZ@fzS-EoMFRXH{>8WFpkFP!rF*W$Fg zy>GA+I(b1n6&+CEN=_`Y14LM0X@mj_*GlR{gZl)My&WF_*z!j`8OWY~2XkG$Ilj4i zn%dihyK(DE?i+<@sr_Bq>r?H0wy*P^&?Zq>{`oHI9@6if`7Q*CsQ4X^>VIEOzB9Mw zZr(ueGgyjQui~B~w(s5a2^%!dsP^94tpW31?MR!G&a-^$chzCW4I`&&YEUGm3XYH@ zP{hb1{`_N+N7)@&qCBKdg7cnPEgx@HRzGlGVR321l#Qv|GajGgXvb~(-9DmNqxH^~ zN6+hHGj@(v6{La(Byq_giO(GglCl)FpB=G@xdZis%#O+&FOFUK?b(?pb|d_aBc~P| z9EA)trD^vK6ThwwGjui5at=>!$te2m`u5q!cdJNwaL85MOdDDyCqFt(EadKLyFRbblgU=zAX z9ctO?v|baUx}`hm=I;8l_K9(*UfI;oOCxH}g=s$zh`BW zW;;KaSLAwb?1@#Zb$Q!j3UA8(oG^FT*ma_FA6<11ePKdMiVOu(%9MtQi(H>_w7|Jk2rmwUgj4|SdoM79H_qamz`eX=Gd~L=En=B?Ch(t z;!~gASyy7DtuB3=_A?iK^a+eQkHRn=on6N5$ zwp3h6MF5*o3RgkON+d3w09T5DwJQMN`4H?A6<3|6^D$wUFHe{n?=|nmQg03G2JfO8v@vt7ZXb^tU4KE;~t1SF1^3u=jO%sHZ{NQeLT4) z-6no|8GEn_TuB|G;!0{mTU_DOV0=gW-{&hHYDd%+K3S*nRm;s@O`})+ol?(vr4!bN z{-U*EK!|)3Qb?`)vz9DJgr!T4&aVq1QcAsBT%L0 zQ*?ksBqE)GuXv~(!j;fAstz;_Y6!0=Satc(^4w7moT_3?yBWSK>xxSI_lQnj)R2+Z zfBq8mY}Z`lzPp7Fks+3c6QcHJGx^FPm57QfsSPx~64^+nz?Gt8?dkxB&^9Wr*&jEQ z?|XK(8>>40*ScPbuh|iE4@@b(a@V>bxTK(@o^$wFreV&P^bcAqFx|wPf~u=#F_%@~ zN-7Z*S5g~jxROt1I)M&Ql&oD`!Iy<}9Y~s%dGTIUo$lh$S3jRUV;SS=yL3!mZqei$ zHY0x;KCk}Rq9uznwpqCJ>b~I6j9G`q@Bd}-inm9Zz~Y{9AplPR70`vlPm8YPwsQfWX@0Fma!O-m2?Irz(eg2u!Oo%l^|04hUJN{ zcUZXPz4~tvRpraaHYD!8AlqKyzBcewvytuQ{PE2zzu2tk`eu!AyVavV2XGzUpHTrU zDMnOaNqL|FOQa>80$7TewJ!yPyitK&^XJ4A-Ue~E-Npn!E9S5fh8!j0y z92szDfVGo>t)pD`g5L0ioSY9MmmDqGCihhVEU88mV8N*cRXG7X1<*-yEj-kYFqX^Q zbNOXQr4Q9u^?LNJvP&29vi@!DHe!oG_^biRE3c({It1*Hxty^;Qtr$#z1MGmTebmr z_JeaqmP}xA&oBfku%tY+Wh|FSOgaN&@lZPiEOXN})K}DXZTE2}mgd)d*4=KLf)uS zu-9oVf23CTc{Po@kA1$hwa%@wuxQRxjo6{Fk4q!bg>hO%hk7=wx0=qG;QVdoq^@Ge ztp{2*r~sB!BPy_@JkX?oNKHC}#)7k5N@}zVET6gaDoo;x>tm!hW|(;YKlbLb(jhAY zLznl}3>){V)y)5fe)DVX8-sH%T9p*ksqH#7>V0|kLo*Y63()qI5$>5L1^hOL0hEup z`JHFyg@@V^jpY;aMrEvas&J_J$c7y+%7b{l$8*>Adh7CG-L6fQzS_mBbdFWzT$Jzg z+->G9O3Z62do}5We_`pd0wX44anE#MNqK0?Sbpc(dEudU2v|bisK7SvjcT#_;C1!B zu)nU6>Fbo_1J4@E&*jT1&HpW5&TZ~?zT(j#tDpRWYpZ01j_4n!U%MsftH=t#K^9`t zP^5rQ$^#8pA~op@QoyH(S^H8z$Qu>dVH2I^X=g6n#AD}kHIup~POokb+nad&nC|DO zYvw-Dja7-8t<)zzoxXnHkr%aHIBLaJrQ5ctU@WOd6kx$gA*Di57B4~P*?Hlic7(A4 z=FZC`+Xe0CX&@Y~-$$#$|Aa|PZliEsea*kD`J-izN}CQ}(_lAFdpT-B;eZy@e#tZQ z*Sz^jOk8otxDtFn)F7bbDpXuM&&EqY(Xw_4D`0NCdRr~jofvY&Hd=kkTN^jWu$iXY z_J92xlJ>@R!Q{|-^;epkLyu?YvksPS+PJv;ym4M%(nsq@sQ{MDtf+(~)uF8t2#Cz2 zGbjNbYKI6*s2f!YHq89AuxL=c#;K?|e-3%tG+ub{T)qGkOOp$yd|vd)@4?;w2eNlb?V|3n=I)9fn{&5p;jrJz-~Cc{y)0qceBJevhj`6=znuvz?irVY z?~h}JsyAN3&a?5tL+uc-guGE1TeQXCK_BNQQI#Vj7sS_O3yV*66~~S|F}z^Tq{fjc zp~B>-tetCi>$y*{%Fp|KxnT945y7)m94CSWGWaHo!dM|G4>ZOSnMr4m0wG1r+SOPg zbK}*8KOr;q?~Q{dH|7=8q#P_T<`?bH4*HUOAZyl_y1sR-sVzFs%z_Pi*G-O3GqczA zD!ObtXqF1bl9?41SW+Goz``^6cp;g!pEs$ZgSil6HZ@_vd z@PdEu3tkktFsS5!R>diBjPL@>n}89291LEF83OCWppkHcKgMuC@J%;3j>99|;5!;{ z2AXh#XNwL9p4)&I!i|7%11r#gH+)ip7ezF%e1bSCNEFpj&kEuNQ4010QU!XO!G>o>|qNQvI=LuP6L&?Jw zktnNjzMpEGYiom$wJ`9IH+7=v=?oOH)^C{MpWfR4x9Lf9=fw1g`6J$V=SjR}>cOA8e30JI&kN`3Sbn)A$a~#;s*i;n$#bta z7`A@%?emSjPx6QOUOYKtH?pJHPTFdCz&B3sX|S}~a@X84`LqD%{68l;`Tl%m(ZrT+ z5BW!5dzY)6d(2xmV?XGNjyQ^eWYO_I- ziF)>HUlYmW3q38nWXjyaPn2J_O%1hw+I@V_8)I@t6sm>X7`AlfjQ-IH2I0L&%~f0U ziI?8^aguMD?0wK4yLTQf@vd%@9Z&fTnk-HWBUcAx(dos&Av%|^Mgu4W0z z!{XGlQ^p8Cn0#ybs2!VMIkt=ZctnY>ZAi_woP(pES0-vD?Ug)!J0zy|Y-6AFUjm!L zk@$nAy^3^-DvQ?jdFX4ScP(mG_?#W3`QrzB9e*Tv^lR{6ueUzpM|oV!wz1dO&fk*a z{63-n8uz%_h^-bTH`EGP{;t;-+ODW*^vu8xT*00$8EpT^u`1MXxJBdY**U%S+|Csq z9ntFiG=yE9Gdt+jz|3{65vHZBDQcVN4oO>AzF#-v@8xPOH}jTcVm2=)4L<##annts z-kIU&j}$cBZf!X2cl+wKjGGDei-zxUx@uX=Pu$q^BI|SVn4ja0W(OUKxLfUi@`dMx zVPOkC=uRGd>&wr_$M+21^j|*<;LE5>0d+c{1sR_$H4kZnZue2YhhIP>_!t?^$_u}ilSJ3 z-PGyMyN>3ry6iLfZETZ4E%#X;vlp|CqA#zDWAAZfzuRykO*<`THTw1X@Ye7n|L9J+ zePR6GVcU|LEYo{N`0Tk;Uaogsm~Igy-{9BK3*E1Ez~$W=X{m6@xT|1K4hgTCW7h;f4*0n;`Ot18wQK8Xzef#kQJJZ$E-Hx@|jhx zTt3`v)2 z{4m;a82m#yT!xmQ93B&U4v(SjC`SNyX>D=gh?v-OL=66+7|PIl6yq?l$2biBp%@oF zs%m>*Aa#uXVxVH4(T@4w08mWC#2y30r(etEF#c-*%EhSjjq%?AMCkulNk1yU6h;02 E16Y>7nE(I) literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/enc-base.pdf b/qpdf/qtest/qpdf/enc-base.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bac513072869b3418afc50f1e230e5d78a0c58fe GIT binary patch literal 16937 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 literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/encrypted-with-images.pdf b/qpdf/qtest/qpdf/encrypted-with-images.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dbceb4454f6f37ee83edfe519a0d4c46935a9a57 GIT binary patch literal 50219 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

5*$lR01@1n#dM;X)aJScKyK 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 b*2w;)iItEAVKwk&)O2jyi1ziRbD8LGQYP%b literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c368523e7e841e41d25b7c704c0217318cf61276 GIT binary patch literal 1227 zcma)5+l~@J5C!z9|G>9;A<;y4?l(h7goS8UcM&F86M{*@^x_bh-pn+c(a-Tm{2l+m zH)B=Lj1U9rgrcjad(NqvE2sSCVo1PxK+MGnJJN}0>UQccOpsoK$bP3Wty6}S$)gaaS+j})0praAr3`P zMIrb33j3frsKdz81Qc2j)N}yY6e`S^$Hg zZc6zeH~OOztH-{DY?^=QoYOQmO=CSAX&MxHQFcMMDVE&83z z;l3IN(*MxN`kq98v}F(zKgwsj5Z|F6*!VLcPSAgP(L58WxRNmATb?|Fc*92V3F!!& z7+se(wVD?8{3wg6ln+xuRL$LWX&#MRn4@SmnjXQalz16+wzxS;!950N5$g!Q!^=;pEoY1j@$m{?6#Nuc;TKKeEPg))PM{A>X&>o>ZZg;+;cZK$` Vb)x1%@m!TT78Lq)8Amr`_6uXkI1~T? literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/fix2.qdf.out b/qpdf/qtest/qpdf/fix2.qdf.out new file mode 100644 index 0000000000000000000000000000000000000000..ccccaa9e5f501a327f7aed9ce7dc6936d97bc4f9 GIT binary patch literal 1232 zcmah|-Hy^g6b3dXX5PTNb3>wuZae*@hLE@{M5FGq&}2;r7XzKe66kE&VS_%7FXDyo z;H!9NJZIW2tAVv)m^m};_nmXTZ`z~t;VXXXv-bC2-+r_9l?iReIM|@(E7t8Y04x4- zE5W*)uO@m!@dueL^=I(xkfIB4X&R<^p~2^@*JFjwrPweBZ017fF%NhUuyz{|LoPIw z=dX!^Lgyu!rDV96UX2(AZ z>(6Qd&O{+id#tx|eJ6Fg5GJu~p^`LPf_0r{Z?YmCR2y`7AvWmhq4CCKJJ-hKWOcJs zdY&*3w+u_VSN%ria9jF;46yHHby1>!`f?T%KkDar5Z~ZBbns_GoZ$NTY5k0p7FxkX ztVQwy;uRaj2ecz_V)P?AG;(tLuPn+^K8+<&-Ctghf@_$fY7P$L!Ld?!8%?%&I7z>v z#Z5Qfox`;2a*z9w6Zo#*iNeTr+>RGGf#V$4;()m2kI`g$n`GAqM{Dn$id~1{Q)j+IKBV? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..55b7a76466865404f9c20d2c258fc8a18dea563a GIT binary patch literal 813 zcmZuvO;6iE5Y2gi#k)i*ht}Utkq}Y?i7K^)D6zx=aoE_K#K?Hj?z&C+^~`Kc907Z< z$8X-u&YS1);(Goy`j&_YA@urDTwDksDE>by1Xt3@MsFEd$gQ%7iL?}#mqN7_lLZ6s zt2~u!e$|!5Jw-s`3xNm5uXNWsM5lc?|5=~I)kYEja5t6zQB^IcdXM{%s`4ntCHdS^;{TXy)d_tiM&ebvvXf zQ>-&eK8b0;b5oxcs$6nEXlCJfSto<(GFNn_VPKwBC2|iCE?@)mWCf|)8zZWb4J#U zG6(;HRsEu9KvJ~Sn*K5GBN-#cxapb(*0mF(ksS%L RQX1zKXIU=B> +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 <> + >> +>> +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 -- +> +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>

) > +(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 +> +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>
) > +(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 +> +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 0000000000000000000000000000000000000000..1a468202c18fc9d26f53031bcd55ea3094993c02 GIT binary patch literal 792 zcmZuvO>Yx15KRIXeBm$5WhFSkuDu^gq^c4rS%H8yN>(aT)Ps{X!BJzQwSxjbr+=hB ziyLCbaX}GX$?LJ_`OOv_m0%T!5tadQLVh8=ytNym zn#qlFkfVY*aV3zSAVZpPA9U+ri4i~%zyLS2e_{8=13#WE{yTdt(J90nYv7Sjs?~C0 z53tOTsp0~LV-d-WN2r5gERoKYv-@t162s+?;LffW%0n3;xK&%Ek9k^hsQxCgCjk6~ z-bzLtqCn`y zZL7@&(razr7^fdLNPseJ^a>*~oKc_uoPV&jAaF!Z8luIPL;=kgjE8t#B7>&I_{Ge6 z>FrBswrtuw!aq9UKfbKbb45JqLjP1Srs%zCRd8b*T)2iMmIEFZQBz(KaBi)~OnfU* sVGqB4?|E;4e;j=r0~}9qJnavj;Y#-&k>biue7#lR zT&{NuvnT(ZDz@e`NH-$y0sQN$z&!CAi# zh^ICN>a(wij$Hpa}ay^g@6#yoLf^uf1-Yk@XpxLqOO(99{gV6W#O$u-VHAO9{S8P1>1v`LMA2FZ?1k~^3QjVOemO)Dn;hqadeajpoueL{lTz`24Y zAT65hfVtNA4y-!dT;$)dx$L>OXRsV_Pk2G>%YX+_9LC(|k&wO=oJZUb<6!vz6Dvwy v6LklF-OiIv55H(#v>w_cw8!1vPn?~jed^p1a%Ixe97_x+lJpKHms9o!7upxM literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/good17-not-qdf.pdf b/qpdf/qtest/qpdf/good17-not-qdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53eadd790a14a62a8049ec7cc7d5d04c73e6813d GIT binary patch literal 9893 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 +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 + /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 +‘ê·„Q븆 U +$ +ó  ‘ `/þÍœk: اvEã²\Ã×N‰ð‚­?¦Ñ8cÊõ\‡î   ­!!A!©!Õ"="i"Ñ"ý#e#‘#ù$%$$¹%!%M%µ%á&I&u&Ý' 'q'((1(™(Å)-)Y)Á)í*U**é++}+©,llllllllll nnn5?n<… +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 + /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 +  n    µI鹉Y)ùÈ—f5Ó¢qAá± Q!!!ñ"Á#‘$b%3&&Õ'²((-(¤(à)H)t)Ü**p*œ++0+˜+Ä,,,X,À,ë-R-}-ä..v.¡//3/š/Å0,0W0¾0é1P1|1ã22w2£3 373Ÿ3Ë434_4Ç4ó5[5‡5ï66ƒ6¯77F7°7Ý8G8t8Þ9 9u9Š +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 + /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&FI&† + ÁÔbŒX$‰s â<Œ`8Â%B‚4m·Abé BÄ-±¬abŒÚpY‹Î"IŒQ. b1fÀX $ˆ1ÒA‘¦0^‰qÉ%þ›ÎþÂÄÀùŠ«È1 +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 0000000000000000000000000000000000000000..3ffc2db0860d2c19f273f915999ac61fc01468eb GIT binary patch literal 1032 zcma)4&2AGh5Y7)5eBl-5vJxC%*WSNGsw$C^6$ogf>`Fz7dT_EPI7-%N*Qo-J!;A1( zy;aO?T-uZtSjp?LXXcyvzOgrXlfC4xV&?t4`f<%T1YqVXc67u5{NmeJ1^(H5mD>%S zPa&o)({*DZ7qCS_u8xvpMUjlQ{{22@qLS)oM(XTf!3+deZGZ#gpzl&`V=wZFe;mPk72aZ+wW5Duh&aLA~x$h_sau4~BSY5G1R_tY|-{Khodn zAM~y2jFS{q+T9{1@%VDi%<)NodOmsKy$o3Y$FJ|dS^twwUB*0cp;&F%V88&J!RQ15+3bd>tfA>VI97a8ut5T?MVzH`LfSveF<-gE2~o zAJy~)B-c0&ef+zSq&R*$S38wHgJjFb$sNQ5Mhs}}wwCxG(z^1`Gfl|t7bM69&J`>G zSuv~uW<`OYfh`Uf=h-*(mfiRE92Nua2``9!8So&A!D)qnZ_3( literal 0 HcmV?d00001 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 +  +    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRòWkWWWWWWWWWW W +W W W WWWWWWWWWWWWWWWWWWW W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W0W1W2W3W4W5W6W7W8W9W:W;W<W=W>W?W@WAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQ2ý +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 0000000000000000000000000000000000000000..a3c624223ecdc316877a60d8b1501be11a1a3800 GIT binary patch literal 93593 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

0@H^dKuhIk%Ic`S=! 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�)TaotO>xD3*aa(@t4-rX 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 AKL7v# literal 0 HcmV?d00001 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 + +geese_w-anchors.pdf + + +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 +ÿØÿîAdobed€ÿÛ„   + + + +     ÿÀcÿÄ¢ +  + s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ +„”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ +&6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?õN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅV°<ºü±UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š´JŽ»b­â®Å]Š»v*êþ8«±Wb®ÅZS^ÔÅ[Å]Š»v*ìUØ«±Wb®Å]Š»v*×+A×®*Þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WUÃv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]ŠµJŠñVñWb­+Wov*ìUØ«±Wb®Å]Š»v*ìU¡Zoøb­â®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»hV›õöÅ[Å]Š´ÄöÅ[Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ZylÒqUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¦ñtrHàI¨¦ã¾*©Š»v*±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»Z¥MhkMŽ*»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«@Ö£ÃoZ¨ öøªìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«_E:wÅ[Å]Š»v*ìUØ«±Wb®Å]Š»v*àkŠµ¿.»w«x«±V•1VñWb®Å]Š»v*ìUØ«‡LUN8!F‘£@­)å!„šR§TÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUj’EH§¶*»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š­ïÓ犮Å]Š»v*ìUØ«‰¦*ኻv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÛÿLUØ«±Wb®Å]Šµ½}±VñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±W +Ó~¸«±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Ø«»ÿ UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V»â«dr¼@Zò4'Ãß]¾*Þ*ìUØ«±Wb®Å\HqWb®Å]Š»v*ìUØ«±Wb®ÅTna2¢€x•uzÿªkLU[v*ìUØ«±Wb®Å]Š»v*ìUØ«±W +÷Å]Š»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تЭ;Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»u7®*ìUتNJ7ûJ :W"b«•@ƒ$­â®ÅPwúmµè‹Ö.= XÌnñžKãÄŠlUŠ»v*ìUØ«±Wb®Å]Š»w~¿F*ìUØ«±Wb®ÅZf¢×ov*ìUØ«±Wb®Å]Š»XéÈ éBÞتüUØ«±Wb®Å]Š»v*ìUتÇb¨J‚Ä +…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ÈËNDh¹é•žªeHœ´¡¼PìUØ«±Wb®Å]Š»v*á^ø«±Wb®Å\EE1WWzb®Å]Š»v*ìUØ«±Wb«0€Óz’M}ñUø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¬‰c +Ç‘N­†%ˆ¡ïØü±!WaWb®¥zâ®Å]Š¸×¶*ìU¢h*{b­â®Å]Š»v*ìUØ«±Wb®Å]Š»v*ã^Ø«±Wb®Å]Š»Züø Øž˜ªìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅV©$n)튮Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZD +¡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å«té÷⫱Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»w¶*ìUØ«±U…Àp»ÔÔôÛo|U~*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«…;b¨ M*mBòò6<¯xcíÊ5ãÈ|ÆG…$£òHhV›ìqVñU¡~C©ëŠ®Å]Š»hîÅ[Å\1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*íë튴I¨ªÓ* D´A#ä)ýqUø«±Wb®Å\qWb®Å]Š»v*ìUØ«±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*µMEiO Uw¶*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å\kÛv*âh*qWb®Å]Š»v*ìUتдëîqUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±V‘h´Å[ÅZ&ƒÇov*ìUØ«±Wb®Å]Š»v*ìUØ«±U2$. ûB›œUSv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»i‚‘C¸=±VñWb®Å]Š»v*á^ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±U€¿#P)û&¸ªüUØ«±Wb®ÅT.`õ£ È ¨cÇb@5§ÓŠ«â®Å]Š»v*ìUØ«±Wb®Å\1Wb«\¤R: VC(•W± (AÄ*®v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]\UØ«±Wb®Å]Š»v*ìUØ«±Wb®ÀUØ…vv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUÕÀmb­áK±Wb®˜ª×uD,ÆŠ:œ‰4¡pÄV…wü2JÞ*Òò©¯NØ«x«±Wb®Å]Š»v*ìUØ«±WWzb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»uEißÃv*ìUØ«±Wb®Å]Š»v*ÕEiôâ­â®ÅV¨§}Î*»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¨yï- xÖi84‡Š ÷9 䢞z䉠Šo +»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*WÛ]Š»v*ìUØ«±Wb®Å]Š»wLUØ«±Wb®Å]Š»v*ìUØ«±U©ÎŸ+튮Å]Š»v*ìUØ«±Wb®ÅZ^]ñVñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]P1Wb®Å]Š»v*ìUØ«±Wb®Å]Š»p«±WÃv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU¢ |1VñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«]U…ÏîÅWb®ÅVÑëö¶ùb«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتɦœ5þ#mA ñŸ˜ªìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»uw¦*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«XR†Šñ$¼šØ) BÌzuéÞ’FȬ±5튻v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb« j€Ý϶*¿v*ìUØ«±Wb®Å]Š»v*ìUتÐ)_Ÿ|Uv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUi`^ç§ÑŠ®Å]Š»v*ìUØ«±Wb®Å]Š¬«ó§‡ù«ü1Uø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š­,¡‚×s¸,Uv*Ö6¶´( Hž§å‘áÝ$¯É!Ø«±Wb®Å]Š»v*ìUØ«·¯¶*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb­u\U¼UØ«±W}±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«LiÚ¸ªÕõPðÅWâ®Å]ŠµE­{ôÅ[5튻v*ìUƽ±W|ñWb®ùb®ùâ®Þ¾Ø«±Wb®=1V•h´Å[Å]Š»v*ìUØ«±Wb®Å]ŠµÄV´Üt8«x«±Wb®Å]Š»v*ìUت‹¼þ²*ÇX˜rV„ÛbªØ«±Wb®Å]Š´1VðZ» +»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تÕUUt1UØ«±WUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¥”;rpÉû”#犪â®Å]½}±Wb®Å]Š»v*ìUتœu”ö;|Žøª¦*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»u)ôâ®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š­f +µcAÜâ­ŠÆ*Þ*ìUØ«±Wb®5튻v*ìUØ«±Wb®Å]Š»v*ÕÞ˜«x«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»qìqV‘Vƒ¦*Þ*ìUØ«±Wb®®ôÅ]Š»v*ìUتÐZ¦£nتìUØ«±Wb®Å]Š»Z …ÜÔø⫱Wb®ÅV‘PGŽÛb«±Wb®Å]Š»v*ÒªŽ˜«x«±Wb®ÅZA°Å[Å]Š»v*ìUØ«±Wb®Å]Š»v*Ð` Ô„b­â®Å]Š»v*´²É§Ï]Š»v*ìUØ«±Wb®éŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»¦*ìUØ«±Wb®Å]Š»u7®*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb«T“]¨;b«±Wb®Å]Š»@Øêv·³]Á!%”¾ŒÁ…>*¨ñ¹$Ò:¹&6±$I+ÄÖ†‡æ1JüUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Šº•ëŠ»v*ÒòŠ»v*ìUØªÉ €Åji·sÐâ«ñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¨®*ìUتЪ nzäDV×d‘MtÛ·Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZe®*ØÅ]Š»v*ìUØ«±Wb®Å]Š´Pj> +stream +ÿØÿîAdobed€ÿÛ„   + + + +     ÿÀwwÿÄ¢ +  + s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ +„”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ +&6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?í¤iv*ì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®Å]Š»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®Å]Š»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®Å]Š»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®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»A~›Ñ¿å¾ÛþFÇýqGwé½þ[í¿äl×âý7£Ë}·üúâ¼Aߦôoùo¶ÿ‘±ÿ\Wˆ;ôÞÿ-ößò6?ëŠñ~›Ñ¿å¾ÛþFÇýq^ ïÓz7ü·ÛÈØÿ®+ÄúoFÿ–ûoùõÅxƒ¿Mèßòßmÿ#cþ¸¯wé½þ[í¿äl×âý7£Ë}·üúâ¼Aߦôoùo¶ÿ‘±ÿ\Wˆ;ôÞÿ-ößò6?ëŠñ~›Ñ¿å¾ÛþFÇýq^ ïÓz7ü·ÛÈØÿ®+ÄúoFÿ–ûoùõÅxƒ¿Mèßòßmÿ#cþ¸¯wé½þ[í¿äl×âý7£Ë}·üúâ¼Aߦôoùo¶ÿ‘±ÿ\Wˆ;ôÞÿ-ößò6?ëŠñ~›Ñ¿å¾ÛþFÇýq^ ïÓz7ü·ÛÈØÿ®+ÄúoFÿ–ûoùõÅxƒ¿Mèßòßmÿ#cþ¸¯wé½þ[í¿äl×âý7£Ë}·üúâ¼Aߦôoùo¶ÿ‘±ÿ\Wˆ;ôÞÿ-ößò6?ëŠñ~›Ñ¿å¾ÛþFÇýq^ ïÓz7ü·ÛÈØÿ®+ÄúoFÿ–ûoùõÅxƒ¿Mèßòßmÿ#cþ¸¯wé½þ[í¿äl×âý7£Ë}·üúâ¼Aߦôoùo¶ÿ‘±ÿ\Wˆ;ôÞÿ-ößò6?ëŠñ~›Ñ¿å¾ÛþFÇýq^ ïÓz7ü·ÛÈØÿ®+ÄúoFÿ–ûoùõÅxƒ¿Mèßòßmÿ#cþ¸¯wé½þ[í¿äl×âý7£Ë}·üúâ¼Aߦôoùo¶ÿ‘±ÿ\Wˆ;ôÞÿ-ößò6?ëŠñ~›Ñ¿å¾ÛþFÇýq^ ÚëKž)}` Jc× â è½>£ýù¿Ó:ßóGÈ4ÓcKÓå–ûµþ˜/ù£äK†•¦ÿË$ò-?¦Ëãþhù-7ú/L±µ‡ŠŠ“é/A¹; /ù£äv`>aóî›bZçLÒìî4ÈøÆ÷w#S)&»ÔqTo˜™ÎòçÒŽ8ÓÒQæû9€_„×~ôé–c†3)F?gØØhâNN¦‚A³€ÔzIý2ßóGÈ2áoôF—ÞÎÜ{zIý1ü¾?æ^ÿDiCþ<íÿäRL| Í ¼-#Kÿ–8äRL>?æ’Ó†‘¥ÿËò)?¦Ëãþhù!„~bk«¢Ïi§é66qÝÊY&–z©'ŒQ§ˆµ'¨Ê3ÇÇ‹ÜÔA2Ûéoö%æ2\[ýXy~ RþÌL¸Vþ†ÒiþñAÿ"“úcùx4|–›:F“×êP|½$þ˜/ù£ä‡ Iëõ(üòOéƒÀÇüÑò álhÚNßè0oÿGý1ü¼?š>KNý ¤Ë ¿üŠOéù£ä¼.ý ¤ÿË ò)?¦?—‡óGÉi±¢é;ÿ Áÿ"“úcàcþhù#…ß¡tùaƒþE'ôÇòðþhù-;ô.M>£üŠOéåáüÑòM;ô6‘ÿ,0ùäŸÓÍ$S¿BéòÃüŠOéæ’x\tm"¿ï ò*?éåáüÑòE;ô.‘ÿ,PȤþ˜øÿš>KÂïÐÚIÿ()ÿSúcùx4|–úIê, ùzQÿL| Í%áhhÚM?Þ>~’L| Í%áwèm#þX`óÅ?¦?—ÇüÑò ÂïÐÚNßèPȤþ˜þ^Í$ÓGFÒåŠùŸÓåñÿ4|˜Ó_¡´Ÿùb‚½¿vŸÓËãþhù&›ý¤õúŒðô“ú`ü¾?æ’Ó_¡ôùaƒ~þ’L?—‡óGÉh5úJÿ–(?äZL/ù£ä¼.ý¥Ëò-?¦?—ÇüÑò^¿Di_òÅËÒOéù£ä–¿Di_òÅoÿ"“úcù|Í ŽÆ‹¥³qvâ•%š8ª¨«36nN'1ü#ä´òMkób9µ§µò—–âÔt˜\ÄuY-$”NèO&…P*öÚ­\ÁÉ“5ñɆ’Rè~ óɺ†‹æ] _:{¸d6Ú•¡Ž2aœÀtèèC‡¦eã†)‹ ãÊ$ƒÍ;:>—ÿ,pùæŸÓ,ð1ÿ4|ƒZt}3þY!ßþ+Oéåñÿ4|“M®›§£’–°«TŸMz0£N>?æU_JBH¡Ûc^»xåÖ•n즔ÅÌ2L¤©‰dRõ´¥k\Bê؉¯ÄíürLÐúœ·0ØÌö¼ÅÛ6î‘4Åem˜Ô¿ ‰•¨s/Ôã¶:›Èú•Í¶¡o:4’½¤7‹pMˆäI[‡Ù *ô1hýöz}9!øütež.\<ºnI{zÝ\zfv©“ѱԒG“÷ƒcû]ó6Â-œ†ë©“UÀbŠvÝ1JÜïm•-¤ºrÊ‚(¸ò«ÅÊ€¼ºŸÃ"eA¾ƒô~>÷‡y‹Ì·ÚÏ™n"»¹»’ÖÒåik¥ˆHÞ‚xÇÛað‰8×Ç0sNfG»ñöµâqW㧒ëø|Ùyf×Úu½ôúµÄ¿X’óÄvêï*_ÓåDUFaÑ@§L®s2º¿Ç._gsd±¼‡ã¯?·½ ¡éïw :¤R}nkò,“K}–憊@xë¶Þ£0é±ï‚Žê\_Ž~OvÑt8´{­–9b”Ÿ†[©®Än©¼Q4§hիǹï\ÎÄÿ&ÙÃö£©¶ùc]ߦ*ê +⮥:ý'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ÿI ¡½]Zñ- +¥-Wzb*<3y ‡A®ß1z úæ{ˆ°Œ)k‰¯O–*ò†ü´ó|×ú¢Ã“M%ÉšId0·Ãj¼[í?!˜RÁ##¾Í#­ÿµŽYy'ó]F;5Õ»JÒQ³1‚²I !Жû>Ÿ2À£ÀŸsg«×îz·”¼ï¥ùž)V0m5{`¡¦IQ$geæ +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·õÅ[ú~œ +¡{ŸOº€Êaõa‘}phcøIæù4ùã¿Nl'\&þ—ùÂíZù<¿yòY¬2K©ŸT°‘Èp‹P}Gßö©üÛw×Ký­`Eí´n‡ãÉiçï0~†K›}L¯˜`I'ŸP½½‰ãõI~fÞ¢hÈVBœ•¾.í–Ç)"ºýŸŽi•q_/¿}¶û é&Ö<Ûysn&¶Iá­ÔvˆžˆUU«j‹ËŸ"ëûGuÊ¥¹ØtþÔ±·´þ[è×Öñ>¬u™õ +ØT}^y’ä³ áË"ðtP‚Š’/ ;õ˱  í_ŠeD_ÀfžÇ2UvõññÀ®¦œˆ©ÜŽ¿~¥+I%xË;e’Dû!OîÜZmör ݤŠV>»d¸ ÁëŠÓ€û·Åi®>;b´ê~8­7CN½ñKT ÅßÏüÆ*íûôÅ\@þ¸«Fø«_NÕÅ]ú»b«H©§Søâ†ÎçµïŠ)£øý;b­šý=N*ÑvúqV¨~ìUÄ~8ªÃ@ ;79%y¯ç?“Τtß0C4ÑêZ ++ÅfÐs·š æÛ”…“¶ü½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ÒüÁ¢ê¥†Ÿyé–ôܳ +Ž*ôcô 1È&Ñ QÊOvjP04Ünù+eKd¹¶‰¡I¥HZáŠ[¬¬Èê§*r?,lU±$îWÅý*,‡ñ~;ÓÓñÜ«nTKvõP­:ž~<¢Zoßa‚?QIä\ÝÛZÁ$ÓIÂ(©Ì€XÕP +Ô““$ ì„O0h¦Ù.í!VBþ”ß‚ŒW‰Mêj½› L€C7<¶±ú‚éÆc é° Ng Oøde’"ì„  ¤·ÿš|gi_IËŠHî"GZÉh:V½iü3&®1ä-1$û¼ÔbüÃ[ýÒ'³Öäš'†¨N!;£µXÈúzåpÕGÔNÝÉÉt[ßÝv¥­]ézÎ¥6©hâ™P*¿Q @§Ý~SôŒÄÔÈØîvÚ?V0|Ðí¯ÅÆ%,V&¾äßÛß®QnWO¼Ÿsgi%ûI"[BÐÄß¼p íRùüó3G '“…¬Ðì®IbŠ&šI"UäұˑcM©›;n¾”ä½²Ž(¥’æ$Š`Z)ZE +À/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Ük¾5½/ˆÑOÓK2$³AÄM0fNb«È +Ò£@Ù ´\[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ªõ¥·|æÛ8Pú©,ðÉãBGù Qø6dcêÑ”n5Þ›å¶ÕM7ØñÅ/¤žÝ-#d’X×—1©]¨+E¥â“Q†í›ˆŽ§’‡ÁÌ:qN;V0q RãjU¸´J£‹9û\wûLR´öÂ$X˜*+Ù^U⣓:°UAMÊufåL>$»—†š›P²’1ëÌ)’;€üÊì´¨eªuÂ&B z(0ib‰î•L¡½¼Èj|5qAÁ=Û) ÙpmÉQuËf`Í"Ps¨øPßå.ßÑÉŲºýP3\=ËšŽ²(]RzQJþAîdp¿ÔÓã.>º£Õ ÂN4QAPyWjûoÛ"y0àÛ/6:Y&³¸xýHÊ»)O²ÜGVVä+Ó®ç˜6ÈC˜äÔüÔ·Ý\Ï5À«@F'#5ø>#SOÃ%<²—6QÍtÿ˜š­ÍÜ7m{_ 4á‚° +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¶“EDS‰ƒAyœ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¸ÿ˜X˜Lr)a¾e’w@ÒMv®—S3‚ïêW–àøm÷aüüG(›bp“Ì…·iÓ2JÖÁY*¥ªœQxÍAAô䥭ÆhѾæø[žê &ŽXáônb+éÍ +~ 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ÿ:ÝM§iÚ}ÿ}y£—¥WœjꬠПݜÈÄ}Dç9ÚÇ{—_™MÝQ¥>€3&«ÞÑÅ}êM«Éê/+©ˆ­A­ð>ø‚ þ³ÎSHÑŒÂf¶uqûLÒ€)ÓnT9ÌñžöÿÊLÿñ¡h/0–HKQÉæëCÄ°-ñuÁÆ{ÓùIÿ8|š“Ë>^’#êB²ª’[”²ÕX-Zª·l|SÞËÌù)'–¼±fŠÒ5$™*“º=O~\ê>$ûÐ1Hìf²- A<ߢmRG¥dy‹Ÿ† nI*wÄÎ]嘀ïtžYòÇ6žçM¶û—gs õýåÓ[ÛH’ÜQ— +À…â#VÂpÇâ'’EÌðÇ™óü}¨ÿ=ùïKƒN ¤Þú×nñŒ¨ÜyêÇÔ:Ž4¯z`–qÁÅ‚L2D†è¯.ÛMe¦ésê%¼f(ÄvI$’F>£–_Œrøþ¯2qH=íiôífö`¿;z»Ò:**€ÆAUSA’²‚…6ã÷EV 'šJsPÈ¥ +Õ~~=pVìøöCëZšÃ®é¬-âr-d Ry#«Ž<@*^{ßÉ«)MµìNìǯ6h‰õo”jÉ°YiáL‚/gœ}f@(]¼¯lÖñ[ŸàÄtYêžä×èþ˜‰Ÿ +=È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ÿÒ+£¨RAúŒ€  ª9ÐŒk½l](Äþ]›T6·€A4$£$¤£ðèLmF¯Åô4ÆâK"Òô-,•I¤Éê”·œT¼]Ð VŒ§áø}²ÈÄuMR>÷ɳ\j°êsêHð/¥è© Œ-d5©1O–NXÉêÀwÕ†^ùgÔ¦Ól¯‹w§ÌÞ¡9ÅqË÷±.úòŒôß*‘¢Ó,àºMü½ªÈÖ×¥ìd‚ä:$ÑËéMõˆˆåOP…‘\0Ý|EW$!–À7?ŠP›WÒ¬u™-¯^k jM¤nìCMPXƆŠéQ€ÐrÀK„ýIíö§¤iP¢‹yî2a[[TÌ=¬ŸÎÞšý?Fù+ˆlœˆä/ܧ¡]èzÌ qœÖSxÜ$nŒH*ä‘]ê¤)4Èñ@ì˜ H RJµ‚-.ìD†ÎâUž#m«;˜Õd!™Ù!b¨üÑý“¸ÄeŒqzv'Ïu¬´Ñ6³f·czèv÷*òÚËz~¼R)¥ÂÈ´­G*V¢¹ 6èÈÂg ýIÏ-.Õ‚XÚ¼ºi¢—Oeõ"`d4çU? +ü[.݀ɜ‘™Œ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“]ÎÿF@“v˜Dó`ZŽ‡å=;QXô»ÙnÝcdœ;stŽ¤ñiP˜d¡é°o³ÕÕ§ƒªDÅõ1¤" +Ú¾9 +-¶)³6œ²‚–à)ƒ É¡­7ø°€Pgt—±˜Â[ÙC;Üʤ¯ÅØ×{XŸtC­â¸6â1AⱯ§¹,x¡¯Ù8’¾!¤DrjP–T’¤¯ÂG*îh¢€a´Jsb¤ln® DÒÆÌ}XA!Z»U¼rBú5ñE·—u ŸÔ˜H øT@©Z„ÀS,¤y³.v˜§•.¥dFfôWb¤vð¡9ltÒS0Œ²ò´NÕ‘GQAJS‘?å“–CI|ÐrÒ"ÓËÖþ¹NFq·Ú#¯Ë.Ž–6ÃÅ!m¤ˆ¡˜ª€Á§â8Šî(™d0€^-gYåãU”*” +íË&#¹E¢-¬î?zd•ž¦Š*E6§l”Açh4żçæhôMBÚ(¸´âfÕâe’o«TÇ ¢þíd^UÜ€@4Üæ·_rôƒðós´YM‘ñòc~g´X¯¦Õ®îîÌw\Fámd‰Ôp¹æ9¯§¿Úñ#01Xy'Y(Ê|C»›*Ó¿:,ôA7—¯/¤Ón­Lksõë)d·žF‹Æöí3­A§'@{æâ¢@§ˆçl½?1|‡sQÁæ=x¤ +~¯ú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ÿd1ñ7ÙF29ª_Iæ3s§JŽRÞÞW’b&PLoP¬)RðÇÄÛ™AÄx†Á ¨ùvËXç½¹Ž;Õ"ºZúéS÷n6W_åÈñOd(—[ùOËööæ)£†id!®) ¼rH›$ÔbËû\z÷®"Èa€CäˆÔôÍ&øÇ%ðk©`d0»"$Š Y ßÙäÊQ‰æ¥tš@šYm^D€äPÖ³'ÅÓ·Qˆ%d#½®±»´ú½·ÕÉõwv•Ç)±4lM¬e©¡/Ä°ðB¤W„@ñ"»€¦4SÄ¡Ö'¼-ßLNÒ?[ƒWz˜Ã*oÔ±¦<%‡Œ:"® ó¢£Ok<¯ÀŒÊéFÿðý=r^S–ù%'Ua,°›ƒ/¤¹DŒô£(åÒ‡Û:£Ä>jv3ß\‰e`‚8I£¯ö˜OýlxäÔ“Õ`[¹f‘¶yMQC>QÑ@ĈòS´‘£3¸I^‘rRÀq5/¾DÉ0‰KõØïï4û‹PT<1qZ !Ëq c-Ø䌪ÊOo`Ü6P'ãFTÛo +{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¼¤”…¥¶Ð|=3\I‘²D@Ú?‚·EyÎ;+ËC&‘ê´’X±(нj²@ûúr»-8?íøÊ@ujü¿¼Þ[ù·å=VËW¸ÖáAu£]˜ KÔQXæƒèÜF 0ÊTU{0û'­2ðHMf>wøêóHS›ðîi@b~üµŠ§kVIÔ›s‘ŽD§¼$H§­~WßjzŽ“¬Í¨]ÝÞ*J@—ÍpÉ¡wôÄŒhM{S15SU¸Ö4FXæ:šHfÒKF‘´¨¡­ƒ®ò+•cñxû ¯.;¶ãÉD‹ýZfCl7ªöÌ4À¢­ t¶øú•£S}«×|YÄÉtÝ"ÍlÒr94±™YIÛ“-z|ó?’2€‘çVãOQ(ÌÊÒ­b¹¹K€ KJê ô‘ˆÌ $D²žEÌÕšÆOr{§éöQ[ÄþšúÑ«C!* Z7*Ç–mñàˆÞ¼d²$Zñí°ì;fDbŒ›æ¾øPרìýimÜØiCŠ-ÁÜ÷ Á²]Èí¿Ñ†Ð[1û°$7Uÿ>˜Ú[  Ó%[è1µvýñµn[¸`‰¥™Ö8VIÑU|NBDe˜bÚÇš-o*¶æ« ‘P‹$réÈ þCçš­N LÐs1ݱ›H¢Ž%`üdcñNô,Õ$ñ«ÜõÌ)KEw4®=?Hì{ï@~g"CŒ ÇëyÿæN½«ùg]³Ô,š;›-RÈÚêZuÂm.’î®bøyΪÊC¯U æf–ˆ#ÍHá‰jþNÑuM:o2ù5¤“NŒÕôyM{¥·í ~þÙØEGGõÈâ#b¦7¸Hቀ€·5¯¨>Ó/Å’k{å]¬qùMK/šöv @ADᣟc5Ú“ë@ŽÿŠf•gUönuùnµ¦ùLK¹Å“ˆn¤.^NC‹™¸C^#ö€þS“¦À³ëL»´mÅV•-áR m-®ÔµÍ:ÂF/)2ý‰å@Üü?×-ŒIqg”²Ë[¶¼”27£é©f’Eæ´ìþxXŒ îÛköáçgbHN"?³Ð’wü± Äæ«HÚòÙ}Dxþ"= Æ5¡Osˆ âln†Î@Ê8š¿³%ÂÊÔÝÖI.eXYCzl TôG? )í "×7O=Í´¾¯¥eõLdê9†ÄÐ`>K{ÙY­ÞÜ]À,­%ú¼+F +eíJt¹-˜L“ÕZ=Ìžc0ɧZ\ÜÚ.шGK fr‘°ÿeˆº ‰ì¦WÞVó>‡hnn´9GE4Oå(yV'f ðîiA’àæâÇ¡In<Å-Õº.ZÅV¨ô÷ÀfÉNçëWq–m( N]:nMzäxI褅{=U"iÒ;kxFÀì+°èñÉÇ ÈºÙ‰Èlt[ÈäŒË7NÊÍöˆn¦•ý³#ò§«µòÄ +I4ÌüêZ¬ÍÔÔýªdÆŒ^å‰ÎŒ²Ñl­ù²êàq4…2Èi£Àå%;Ô59糎ÊÂ(4ëXÀ‚žä³÷¥}ó7gäÉW(…¹˜upÆn¤~4•èÖSØÞGu=ü·ÇÏ‘ø£ŽBêU‹Q˜µï˜ã³eŠ|Põ}ç´L|ÛÏŸÙÑ•Û^Ý2o+”èª*@n<’.<ñÄ'V‚æX9r+$R+)¶¡ïÌØÙ¸s ^]ù‰ai¤ùšQà¿Awƒ@¥Ø¬‹¾ßÞ+‘Ì,ðá“•ƒ%Çt›AšÆmR(ÁGœyq%ÙjžøéÀ3²Ì}6„QÇIW‚/]Í:o›xŽAÀ‘³j6öV6ÅZ(Õ”Sb(||r¼xcÀlžYK™T…•e(J—Yö«­}듈¢CYÜ*†_™É±o˜½·ÀÉ´fwá—nꢧéÈÎq€¹iŒ%#@"ÜÁn·WJ^n+L¼Éðð®j5}® G†8‡Sú°Óv‰øæšÝèºZ¥žo.áÔ¯b’ku0™aã=Nr¬|„þÓ-{fÀj €y¸!ô¥:…Ö›uõ{ *ÔR­xÈ£j©=ÿ™{}Ç/Œ¸˜l…æ¾94Ù”+B€iŠ³„P>ßšž+É>6c‡€óFÛÞXêRÝiÚeÁŸÐ´Æfµš&`®¥‚úª”zýžClÑöx0ËB\Qáü[´Ö Æ âý|’Ù¯Tº¹JÉÑÓ‘³þ,ÝÏ ‹¨P—Z°X Ëp~Ÿ¨ìÕI(׫rýž´ß+ž¢5v˜XƧæ>hÖ·N¾Œ»‰ª¬~b¿iW§ÌÓ5Ùu˜#£q”cÉ(i-‚¡äþ¡ ¥%#âä (_£Ç1h–©æÖáËz@׋/ć&RÞDÛ}ºãMBösª–Žu@òFÄ¢SF$¥HZÐWÛl tmŽü˜ÿ枃s©yk¹$ýþ— ½K›Rš+)ß®Y†@N»Ü¹@ð1 g +ºåÇæD#›§Ž"KIRIÐü2GÑãÕ†\Þ\›Öµ¼Šhîa!d†HÄo;žhÀ0Û–V`B|KdþJòúj¦§4?Xµ‡¢² eyAî¤`}Þ9‰ªÊ`‰õ9º,q‘&cnŸ¥ì¶ ©k>Q1Ùß~Š¼‘/`Ž9Lª‘Ž +:R™°Ðå90ƒÕ×ë± Yˆè˜ZØÞ[ZÚ¤ºŒ—ˆ³ÜÈ ™EÙ¥©û; ÍÓ)‚MFƒóo•ìa®­chŠBÞC¨U$€²"¶ÿh}8a“É#$¹1+˸-ã $‹ÉÈÄY—zo—ó[%"“ÌLÐ\zÀG7¦Ëè’hÀšò°\Æ:½÷3à+®<À$ŽiLëÎÞåeôªÃ’4ØpK8;¤Fˆu¾­}ªÎ«ÃÛÛÉ#±’[E +‘]ý²')™ØÖì„eJB¢¢Ÿ²vfDPj&Ê;NÓä¾cGX¡_µ++1'ÁUzæ6}d1žû›¡†RÉí×”´‹KO­^kÚÜñ¥Ä¡#ã QWa¹'nøF ‰tj ñUnè´›½6aŒ'„ŸÜν{†]èÃ+”Gm†K OU”ÄBPAB #¨?N^98Ç›üÎÐíõ ].å•KÃ$±1$Šz¨•åG–.6ÌY8m„éÚ)³¹Š^ux¬¹*W§Óƒ˜Æ@¶Ï0 „ç—zWç™vÐC¹l«ƒ'*Ó犷ϭ:⮜ŒAwc@«¹®3˜ŒL¤h&249¦réÞs’ÁmìǧjáH¢Š@y +ž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¡Å;»2XªE(B …5#­AÙÿbr2,¢kvCa¦Cl×>„QÀ‚gô—‰a1ZÓsNÃ5X±p’çfÌeeàQy˜OǨÊÖæÞ5Idº,œ£cBªXñ]ÀâNÇ*‘£vëLB&-r&—„иWˆ+˜Ûâ~Ôjk¡ë•œ}È Ú)/ìîK¡„+EHç;ºTÓán@€ª×l2‘ &:~•ªkçÙúÓ‹w>£8Ž$JƒÊ®Ô…è+Û¡ÁµZÇŸ!ºyþÖUŠæ[m<=]¥2z”U;Ñ‘xà ©Ê¥š14\¼zÈ_ö¦çÉ: 1ŸSSº´}‰ÆÈÜ”•bŸ U=‡Sá‘Žq°Ÿ'–ÎgäÞ:î;þ7û=ùCP¶Ð®´ûøDj–ò[ÚÞ¤oé F²) +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'™íʱ““±­ H©Í´´°Ùu^)*:´:&• S­¢Ü?%â øXìÔªpdÅŽéféi¡júÔsÙÙ&“DBËrª¿Ì°…%©þQQ˜õøãôÿ\ÌZ,’ÜšûþLÃB…­5{m:ÑÃÝHAží€Y‡Äyúb€øxf³l™ó‚OìÏ&(bÀvéó,ÛÌVžnºÒ'‹CÔaÓugÃs,"xPƒº²µµÛÀçK0HÙæàbü›ÒìüËkcÔµ8ïn㌠–Kq¼”ø›fª + †8ʽE–Ic'Ò1ù#KóMÕµõÐX/í¨¢êÙé$°T–·—o°NàõSÓ©Ã’Cd㘉LXׯ⹞×I±|b¶Í.¬òGÆ8ÏÖþ¤Ì 7g1òñ¦h'‹ÔD‰'­n~Úôå3@sþ>Í©9ò®½©A¥OÔÜ£iŒ–²¬BØTUGšY8òXæVŒœp1ø÷8ÚȉÌHe[×Ø™[ê¦y™#¸Vc±âÌií¶d †éÇ8Å]2«ƒÚ¼7¼¶™ +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ì´©€Ê¢y}kY$ +]•Gòª÷ÊòLÆ$lá#V¯q®yÞ*A5Ì—'hÞúÞs><#WûóQ©×dþOØìph·õG–ÿ’û}kN¹’ÚßOh$º„!• C“° HÝÚAñíš|Òˈȓg™ïv8áFÀ ®´>èCLžÓH’×IœGun-柔‰ë5O9yÈÔï,1pC†/9,Üsâ—/ЃÒmu©´(m¼Þ,¯50)s-š¸„µOE“âRqß}º bQ©xœ2¸1ÝRÓôv°–õ-ir¡¬Ý‰5§ÂѽiñW¦U=5 Ä~§'~-¥óOôMR¬ŒÆ7O »®]Ù£),Q¶ú¶¡umAH&uþÛ~—X d!ÜV'äYP#e$ZnE>,˜u¶q¡¨»òüW0žB};œNj„QI­X~¼Æ nC.;óu•ëéÅ57‰ßÕ +ü~@G9"?§%!vÍq–éŽ.ð™Al"‚9bv9¢v³… êBò +ðšôÈHÞÍë~„ÆHk"ðã0_Ò +J’j +råEÜV› ˆc-öéÏö¡ÒîÞ7)qš(÷P¬€Ük@\xI¢34Hú¾L£ÈöÏ«kòYIrÿU‚ g–î#xÈP©F‹µW½i×$%0HØ|œ¯å¼'rG>£õüS¯?]_þ’µ6«)¶ú²†‘¼³HŽÀó*?v¿]º·n§~3,‚Cº¿ rêævqÆbO[þÏÓòAC¤^\~^kµãH’Sond“ŠÅÊÌR?ûž”Ë1`¨q[šÉ€îý¯—|Ñd–ždÖ¡”Æb¸º3Æ  ”ÂaΛt9Ÿ„ÜC­æ¯ä}(_y‹OÑ[ÒŽÞ[´¤šdHR(}+<Ì)éQ¹;ni‚r¨’¦&[¯­,´Ï#j>[¹K$…µk,«rˆÍrÓCÉÚf”ž4—ˆnR†)˜°Œ%•Ôß<‰¡R~ÌÞüÇqÆHÖhnúÏ4(¯ÅIƒ‰$øªn¾àq‡&¬Yꄾž¿ŽôG¡‘ú¶²–´Z,’XK÷j³á¾Ëv#¦{ݶ),rûRÈl¦Ô €¾¯O$Ì´OJ‰Ò´¥_Zo^¹ :²œ¹3 汬ß[X™R?¬Î K(ád­ 7Ù +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âèþ8@î_ËÒ×^µ•Ö%Bæ¬ãáožÝrØÌ]†Äj’_=éäO±' Í ¨ ”j̈hè±"Àš‘Rz“¾YÄRËà)õˆ‰%~ .Ƈ®cê1Œ‘ó Ør'¤hÑJ!ž†&äŒFå[Äd1F…#4·b_˜:e5ŸQèc½‰jñ/ÀÃcü¼rþq¦˜<¯PÒäÓ/ã2*½³Ê$…ÏîÉÜ|C¯n¹®ËŒÂ[òr`mÆáÕ>"cRbD;¡ª¨ÛµzåFLÄSË ?YŽX§$lˆ™i•û5o ¶Ÿ0‚CÒÌú~Ÿ¤­–•¦;Ý>ó]\”Ž2Änä†æûôP,¸òd&>¯±³ŒH<~žî¬Vò WP”Ëwx •øQZED«À}ù‰ü—*þüw¹ƒ´at‘ÚeÄöv0Zsx½1£ó.d«–cJ·vé„CÒG \ä&L¹Û °7ÅÃòf.T cEbHöÛ2à%ÍÇ‘™ÔJÏäJQ]«µT홎¼óv»oõþ^M%¼T0RVŸHÈŽh‰¢òe%Ô5A T{Šå¶ÝÂß¾ÿ<.;Ó–Hp‰Qü[dq‘ÿRYwù-ª@A°Ö}X#‚Çqz”2Š£QÃÇ ;ï\„´\QÃÈlÅ/´?0èv1j·h®ê°A n(-‹+*PòÙ_¯€b3ã '3M)@ú?ËÚݼWkf†Þt‘.´—f’h¥ãêBM½ÀHß`nà“ð,Q÷ùìåþb·þÏ=ØÌÚ=ûOêGõwŠniCSJfÒz{•º˜Ê…&v––öˆ5OM  xõ¡Þ„~¬»1S"‹IåO²ì¿"GêËE±*2Ç ­ÊD«ŽŽ¥‘¿à©Ê§Šæ(ÎC‘^“_Ä¥#Ô.B0¡IÕZ²¦RtqþGÚÚ3ž .†æòM1š/õUJû+\¢zYGpl}­ÌÄ3]* {›Uš+’ç¨FZ¡#r­ÇðÉcŽk2AäœÞYÉ©h·v"åJÁШ•tßæ´Ì\IÞh’PÔ"£ñ铲ٲâôƒB:~¼R« J&Óàr˺%TuÜuT90ËÍ)üóå¥ÛÝ€[NˆþI‡>ð¹0ÇÝç7Ö^*¬ÑÇ/Qê™h>^›!Èd‡ío!£Ð´åZ=­°ø¹OÖRèy+]²¸à@ûTÈ÷¦ ÕÉÿxämól½‚ï ·Ãj¸7Àª½œ¨²åþâbüT•×Ýk÷eyq‰Å³ÌK&Ñë3Á:Õ usCð§‹mÔý¬§€Ae“rf[ mwˆ*+A°¥3"ÜL‚Š97]×c±§Üzà,^;©[>›©ÝX°£[HU;UÅìNO͸IêŠTôÃI´ßBÐîõ=E-ž9máPZâbŒ¼„`Lv~@˹$вˆó7–åÒ.‘r“Op¢9ܧ!!'àjS·¶"Ki7:wú>xY9˜°*hSñŸŽD”µúF´©Ì-I… êçnÆŽcfà‘þ“(ä1Û£&´´I}6Œ²<ˆ¯%1±GPÊÄ6ãcÐïŽ8‰{ÙNU¿FK¤¢ÅêÚ̼8ʬkÉYhVŸ#™@mN&CtBI²–ÎÆ×O”z’Úƶìàì}:ª8÷e +Ôí\„‹9Ê÷y÷æó ?0éó][*HÅ©FGdOÚê+ßlÁÖCÕ²##B˜<Ú¥ªA#K/?ªò^ ++ÈŸÚ|[n?EFbK1}åÛÓ´=>Å€çio .E@,ˆ¼OŠ¹·„j 1™Ýá>`·³ÓüŪۨjC}+€Á€,O0õ¯A]ûSÃ5³‰!¾D­%iÑ¢!¥d52†J¨ˆ¡ãN_CᑭѸ ¾Ú§)úÒ)e¿4_ÔjÊb+á×aÜâ°„ëøü|Ý '4 *ÛÛFÜajÄÉ1,xî~*u¥0›lê¾B€ÇäõW‘gayqI}0vˆn§ÀŠ|³71&ÑúZÖâyŽózÂ)¹+ÈǧdOÇ%Ž5+-™gé¤ÏÏæžHÕÚ…\CŽDõõPO¹Ë5#Ð\Hsx¯—¬ï5jÃN°Y®kó×€Hã,ò™2µ)Ö‡ðÍn8 ¸Œ¥’[ù÷Bó,pÜ[˜´‹&/.¯Äú~‹ƒG—"kñ•ã¹,¿3ž®LèìFÿ±1üýԼµæ1;E躿µ½ZÈUWŒ°û<€ †»Ö²:€x‰rôùÜ‹Ð0o`B·7‚`hÑoÈí±'T÷ÇrÏ&š'zdwo¨ùŠëJ¼°C éÜ®DÃÖ”úK#± >äUzïì2yŽIчÚÕŠñØÈvòOî­í>¹lò-Ä~îáˆõPÎÇ÷u N”Øwß2%’PãC$¸HIéÓg‹§3­ª—#iÜ»SlTáµ¥Àž¹$ð®÷ü:âJi”ù8FªÌ ’n(wïôÇD†ÙÂ7µpŒ§…8„®éJ÷9umN4žSªÛýKU¾´ŠÁpê€T„óJW²Ù#¹gé`Õ8̃Òür“i6 š²« ƒ! ïò9P;Œ¢Å¦¾fÓþ¹åëëe^R4Lу¹æŸ§¾Ù wi‰§‰9(`v"¢¹'!º×û14†Ã>^58«FP¿hñ#±ØãaQÖZ>·zÊ-,'›žèÜ +% "¥ßŠÒ£Ç +Ênü¡¤G¥Ád. ×Ò’M,gg&Œñðª´Ú>DPïãZ` ¿s1PžôÊÎÙÌ€SÔQö¶sP6aÓ§_|¸EŒ¤žX/§ÉâÜÀ“Ûjá–ÍDÚ6EuoQ—fZöñ\¬¢5È¥š¿•tMZe¹¼ÍÀNTw¸õ‚ =ð‚WŠÚ‘¼¿e2αÉq©© SMÁ5¦-l_Ïz¦›k¤¯¢2¥ÄžšÊ~›(äX;«€h?—¦FR¦Ì{nÀ ôµ-J ?I†f¸}Ùdš6PÅÍÙ>µ~Œ¢y÷Üš¡hÏ8éRùmô÷7K<· Û,UJ•Pµfqñ èN Ó”ÜÚÄÇÁŽùcCm_Y¶†w&ÎÝDw`TŽÖ…¡ ÷-Lj;ïì3ÌÑúXc;ýTº­Ï+BÜ[°bŽ\ì…TSáæ}ÙóoªÛ¢ej¦C ÕA`¼edÞ„}–û²ðãLÕ…icu½¤q”@0øk_lŠÄÜXçU—-/K»d ;XË/‰>²µº6ÜããÓ«f&®<¤† å}*íwG³²˜g™ ¬èB¤pŸ\ûD7¥¹Þ¤ô¦aâË›!ËÍïÖ·Q;·Ä¥ä;Ó±³h$p4ñßÍ;U´ó×66XîÐM‚)]=n^²ªH±‡öÛ03¦{›#¸ “]ÍF?Xi7ŒµP>«ÒÇñÌüÙ6Œ)Ø}£µ)•Œledþãî[u¤k0DVòÊx¬áRÓÆÑMHËòUšY$àŠU€ô åÐwƈ¶Ñ«ñø +: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ŽÎúiÒ‡ Œñß3è·N­,rFÆÚæVk9@¨p漟¶¥©N¹..­ø÷ +ú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"ÿ+ª°¯ÉȘƒÍ"DrC6œc,Ö olì8ó)n=Jž«võšuT§ÚS~ßådAõ,Ç¥›4MÑÔ—õO\¶Ü{y¯æUó(¡ÜÚÄXµ ã£##ɲXàaµ26ÜÌÿ/äÿG»PÚHÓ5‚¢€‘¶ùYú“ü,÷K½ÃFR¤1UZò ð¨Ã[LáHÆŠ7efUfBY€J±RµRzdšÂàß…-°8†+ji·^ØP‚šf(jÀ7€7é¾$2Š'Ù·g,åx¨­AÛo ¬l-¸‹’œ[H øãc·Jí–ÛQG[ʉ7"G¤ùž˜Ï’"Êê~]Qødæe¡©ªÖõ)ðýð -§ÆE}·Ä ÒâOn¾øP²XËS‹'©ÐõÀÆüï§ß,êÒèÏÅÔF^¨C2óX+ŸЀrœ—Âwn„…òyÆ‰æ ‹O³Ÿ‚^A +ÀÑFyD“àIvR–¼›cšÏ¹Úä[)¶ÖãHÖxAweW¸‚µn+±ö@ïO|¾3¡cŸV…š<º2í1c–Þ+ˆþ(åEpÕ$:•Ø¨?Ç6p1:¬»H‚ŠÔ-ÄÖÄ +FY½ŠÿfC$l# ødŠƒ™‰CWØ“±>øÇ’Ènª ø°”¬ªz€~`aKªT"¤t_öñ,RëÛ”pc–°¡ô£z ÿ™*2‰Lr¢ß g˜1øªI{la*Y¡.¤!‘]H=j:å¢b·kðͼ÷ó¸JºšµÞÝåžR¤óY£Š°U"B+δÛÇ1õD옋‰dš]‡Ôtý3M§#ik R1¤‚ìTq™Ø“ï—C`6G•¦¦_Fê2GÛ$U€¯ŽJfˆaØ-ù‹O“Tòî¡gÖy¡oACYPsŒAæ£èÈåHF3Ã'Ì:¥æ™i6Ÿ¡Z„÷)éƲ„”'%>«:ññãAJ{æ²1&éžIïË’V<£qiyk}m¨míBöjyüAÊÆ!CFP±mÉzCRKŒDsü}ìŽiBŒO¨~ûþÅ=GË‘D`ˆMs?£"¯Ö"JGŸ‘øåV%5bM YÏík†=Í2ÞÕ¬®[Nµ½’)^[iäyÚ"Cñ<¢S8uøh|8Œ&ÎÍØeFžÇù}qÏ—ôÙFñú@ñz†½Yœ0®ÛûåÑ +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(ÿ,ª®Þ?\´HžŽ9ˆQ‹Íy4…y}¤jvË(µå|-nùâ«I¡ëòUæ+Iï|¿©ÚÛ­g¹´ž(V¡Iw•~&Ønzåy7‰ ˜ù‚ñÿËßÌ {dÒ̬²!†H%fB#ÇŸ&rÛŸ†§Û5£‡1³Ÿ ±ŽÁŽ/˜ÖôbªªÐ¹©Éµk©¶v*Ùâ:¾ e±‹ÖŸ OBÄþ¬E!t>º™Ã´*Í"%(¦†œ€©ú2$ŽöB'¹(·TXêÌIZ*ò¶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õ@õ)-ŸSŠ5UDnRT¤a~/pTe±Êaàyìë[œz·`цÑn*?ÊÂ<ØÊu´^Gù×ç-5¸t=?ÓKñ, ÈÍY® X€vŒu^§¶bç¨!Ÿ”‚¾Ñ_ˆ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åÿ"hzJÇ!ˆ^ß ¼¸›—Z¢¢±ßÄœ¬@un–Ry2:AØ~cYÝÀSç[&KM|r,]¿l+jNë²…Z{OÙ;›#Gš[s0jªWì°<Ç.ÛPwÁÄz¶´FÎÂå“ÄÕw€Ë[—\¦0à‰nœøä’ð™™ãVuCYS ºº÷í7÷²0µ¼IØ/f V@•=è||2È䶹ã¤úeJ5+]€ì;fCˆW×l)m†æ½E{„!å +¨Ó1!ŠÕ”|4÷ï„@جw·MËãŠòèI?ü2$‚Û+ˆK?3ï™ä zá{s‘ªÀ=Ó¬‘F¨§Jey>–0;¾_}LÄ­®¥õ;QÇœ,#±ûA(YÂcÜuíLÃàï –{Öèú˜4Ý>Âî[m6óQfXäY$•=Awi{ž9;f!{ô}apé%YùÕ¤&8ƒ2†R܃ +†”¨ËYÕ&zd®Ñ†ˆI ¥.ý:m–@ØhÉ*ZÞ…mªÇM,°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ð§ÙQW Ì]Œœ‰ã<OT‘ך0uþd!‡Þ33ŠÜa]]¿dŸ¤oú†%?¥Õ"´¯|Y6ÉSغá×6–šN<@³T(;n;šÃ"I +¯¦ÛKs{m·¨^XÃPà’IÚò D¶b‰2aÓ‡2Þ˜T~o:ò(z0Z +á‹,›sNmíæñļ”PH =ÆÛå±ÜyHW4r+q©È +n2MGšá¶(q>ØY:»ï‹XÒ¢Ò§¯†øiTýgfâ´þ<4´çykðŸpR„¶íþj'í0ßîÁ ÛŸ`³3LÌ]ÐOÝþtÈB³&JÙKXž‘ƒ(aµ +ì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¬¥š¿ nM>yxÙǖ轊þ äÚÜ }Ø +Ž+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óæ¾_Ùøè݃ûÿoãªsa*ˆ@vWá&›æf),°Ýæ×ÿp’Æ+$1‰È§ìÄÁÛðÈêEÀ³Òí[Ì[]¸–ž€2öG!÷x÷Íh™vf &º˜.ó”K%Ã'Ñ¢…é¾ÿð¹|2‹L > ƒJÕÖæ³fúÍO'‰÷f5I ¡¿åuË"8¢"}_¹®B¤d6?£õ§GS¶Ž¹¶XÝP?©0+D*ÂOZ’:eþ% '³Ræù»ókUÖ<Íçë¿@ǧ Gia=ÔÆÝV¿èûûÙ8ñjq?Ì|“½ÈøscÊb15]Qö?—Ú´63]k2ÚË®y-ôõ£%²]KQ•}™ùð"‹¹éÓ5ÿ›°<={éÞÃK.fGPîòûVɹ˜;F†JrõGÂô,´lÜÈ‚ó¦êöÌK'kCʦ ìw?<‰ŠL Ý¥rß»¯’W²ÏßÓéÂf9(î[o…ƒ0¢¹On}Wð?«#)Ž&|”®æXÊ1£†`‡pEü09;FSÂS?+]¨óN›¯$33U¸¸ÄÄzŠË~Ò»æ\%q&HTãâŽY9²²ñ¥7Uo|±¤…e*Õ*Aà +ÒÉ$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¨ÿeQò̱Lˆ‡ãàOœ¯|êù_ÌÚã-úé÷ j.IôÚRŸ¶WÒi˜òÀáF ƒÂYNç;·XKÉÓ}˜OÃ!4í½èÈCtd$Ÿ§™¬¢ã+^Ý•/ª +¨^Á*ž=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ÿ¦Pݾq–Ò÷þ?o5>*…H»‚W¢È¶ÐÊn%XÜ•PÞš²õ_æÛqLIa0vú{¸¹_Þ>NÑõˆ5m>w—‹z±ŸQ¶GRôåSÇz¨è=ðK–ÍØã‰ùüOé{f‹ÂCqx³Bõ$ŠzÇ$$·Ù)¦µÆÉN[ücˆ§ŽNµO eqª×â ôWâiz>; 8>jQ[–Vô•Ð + "µ÷ßlV˃‡«O«¢ºÄ3±ë^(ëîpJ`lÊ8ÉÝ ÂH(Ç—Ôí]ºŒj”)JæúäŠy°¥BÒ•;\§$ÀnÇV“‹ñ>šžqyä‘Q×hútLošYwtáÂñdoÚu”ÛoJaœå²a•]ù¢8Yâ¨yTP(X‘µôÊ窡æÛ 5¼¿Ïzü·<¬¢”ýnR}y`_Á®Ýwû³ ’MÉÌŒGÒ´[KOÒ¡†ê2Ñƪ–²3 ü&RjA§Ý±íLÅ— ¤iË”%‚C"°Ö ``B8 +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$ îÿC™¤13>cöýÌùµ«›È–‚×iåt +Lp‡ ϱ¨“Ç­s +Wד¹åõ=OÕc’õ¸,Ρݨȭ1€÷'6xò­ÕdÄE×à&pjŠÀµU¤¹o¾ç2ã0C,t¾}bÞ%¯#êx¢î AóÆSˆcr>ä¶ëJ•ä·­ì¢é”³Û€C¥8ô¯|¦p–Û—"ûBZ,03ÆÕT·7`[añ• Ëá(±ùµJÉ݃úV nnœ„;[ÐlÁl×"aÅÍ'/ ùûÌš«hþ~ÕâRÁ ¸ô¦Oq“Çé5Ì ãÙÌi>¶óZúâ¸ü€z¨GíHÜW¾cr#RM'›eó£­ã˜å°‘÷÷@®à¢€I^22­y0¢ŠÖ¦™o ËÎÁ?µÖKGé‡nqVo³0 @q¹æ;“•r,̬2T‚6vw1mñš…kž;dŠ{+yÑE`…ÉYKF>™“‹žÔé–?6PÔ;Ó+_8^ZÍ%ì¶òÅm$|ÌU#%ÛÕh_߉!áw)ÕNÙÖ›çk2h:Mõ„Q˜ÔÉm ¿&õøQ'&*‚Ÿ7Õí¶SœÊ&#ømÙaàž)Ëø€åîÝ#†g$âkuçiwk~-ÙQ'‹‹,Uû)·˜5Cryo×ËõwºâÚhºÆ¡[ÝéÐŪ]ª¼±Ç3/ÿ¢$—ø€®ûR´_;ƒéütoñŸ«¿ð¼W²$5¸’âfXáݸ­ͽ>U;òÜÓ2ªœ8e¹ +îßñÔ&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¤­ûD $ +-P™t7øszí¿›d½ŽÎòæCÝÂVxã4ÙË"ñöQ‡¾P3HÿÞxq1¸òæE»Y¤æŠoPJuBcß2#®< GE4ÕV1•’ê§â58ŸAJäŒÀó÷±£ýˆ¸üÃÈb‹1¤@•$©§›L³ÄŸ&<É©<Ϩ^Hˆµ€V®Ê(P~Ê÷Èœ’–Ü‚F8Ç~kíªœg¼•™\"µó;+3T£"æYA™.Y}+kIIcF<|+Næ§Ñ ãeÉyqusI>±ÐR5,½’pÇ*7LÇ X«D\jRÛ¡VGÚò;ö¨÷íôäÉ W& 7Í.¾ó4+ Hä2J¡«^n{Ð{eG5lÚ0ÛÔüÙmgo5ÜìÞ»1"£µTÐ(¡l¦’Û:ˆyTg]Au;­F"nÛ×k"9oÏ?ëÔríÒ™|£*¾.$3Î&Áù2Û1j—–Ú5¹‚ò­ ɶ%X£# #N>H/ËocLÃŽž17îs§Ú'8@ïýˆ-:áÕTé³*,O阙Ø-h|™ ?›¨Ë¤W'éL©ª,Ť¨I¬Œx‚6øž¼J‹üë‘àìÌÍòÙM<ù§ÛÎðÊüe©)J² ìY€;5záð¤ÇÆ"Ÿi|Ónå±êeÛýÛƒïþKR¸“(óer,Î×UµxÛ”…ÝT€îÌÌ+ð(¨ÉñŠÝ&Øßœ|ç—§M{nü¯í¢­º¨²)ƒ‘ +õcÛ+ÚFƒ9“ñx”ºýÍõÚÞM|fÔÈa¶ä V%ZTä +šü]T‘ó̱S§É˜ÈÙ)„Wí/%h!Qð_Ä}R¤ÐJ†­Å¶aØV•ÀGrc|IŸ¯¥^È—¶ö°Éj’ª\ÚÆ\#TGG¡àÑÐÖƒç]²ªÚ÷RA鲓F4‰-ît餒Ý=°ú³E'8’E,~ö·`‹bÎŒHçÑ–ySÍz}âÉ5Œ¾˜’v[˜¨îÌ +ñ“âTúr‰ÄÇbíqe?±ŸéºÉú±ôçQ‹ÉEvó*­öiý‡3A”÷(ŸÓ¢£õ=PEPŠ_:xåÜ{5p£­|À‹9BÅhŒî(¿êü¾ü¶9Mµœa7¶¹¶¹‹Õ{–³£˜ácü…M¾&õ¯\²Ä†å;ˆ†{Ë«‚Œ>­Ì²4|À)¡æÙ¸”§QZäjS‘ŠIá„oñøêœOªAmý`ˆ¢XÔ»¸‚‘öœ …e ˆÜ?ÈíÞø«Ìþy‹WüÉ×5 +K¥jwµRœJÅ° x ÂŶ ú¸Q:¬’[i¯}HËë´ŸPLJÇP6äi”Ç7‘BÝ¥j¶–íXïlåŠð©FõWá‘)WcVÚ0ùwÁ8ßDÆUÔ#›Î‚Ѥ–ÞîÞø,Aý+dn( N} 3 †Db´À´žµo6;ßi¨¡4»B¿[,U_ƒ—¤ìÌ +«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ÄM„m5èo­?ïU¥¢P¬¼¾©àÊWí$€–FNNP¯/Å÷üR»§ƒôµÕ½¿5pªÐ½}P­Ä<è²{šŒäŽwÕ»ÔŒ/ù®¢BërÔÒE`>Üf‹UâzŽ»` t\0È(ë¨Þs,î$¨Žkh „#‰Õ(ÒUÚŒV鑶K‰¡ðFùo^¹tã( Áe¶»QÉ]ÞCŪ/&u?*l:Ö1Ža¿O“Ã$íÑ—[ùª8dá9õÛ”,ãÛ´l•Øòû$l|2º­Ã–d +©×¬¯½ º’#uoî0™w±t:ô@ŠF¡íEtˆcÖ‚ŒNøÝnž{Tj•`ån"†ª‹‡n,h~!Б„LÕ$e(Ô|ÒÒCp³\+Ç´”ªð +h ø@&„m2$ógµraúÿ˜ PBUL茀n]¾/|•[Í„kÿ\Šâ6™4KÑMzŽ#ì2Û˱Õ8Ú˜Ì|šÒ§‘g’ ”tÓeÙ#ôC·ª$e"¼¹3½ùaîæÕ‹—¹G©ÛºIi³ÛÃÉäFŽGVZ t~-Múÿ«×+à<Û†Py*j>mk­ÚÛÓh9Íhâ&¸SË”j¯*ËÈý¦Ú½ûdcŽÛeš€åøäÃ5Ï1êì²$œmbôU¨'àV/¹é×}ûdBy ¤—:ƒ€ëÊx_æßå“…Ú”W¾•àk¶g¶õ$˜,E~Ê•¯ÂBûã ¸äÝô<ãk>RƒP¹ . +²\–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—Œ´M®“ko1Ag˜}aÃ0Y;±'cU_€WöFù/DPýhàâ;°ÏÌO<Ø·”5ä¼æ§êßU´`x¼·2 -+·ÚjtÛ—…¦u—ʲ۫Ù[Ïsœ–øSeLƒEÖ4¨$ŠŽöö¨nc,ÒÎÇቕÍ*Çm†ß|ÇÉŽD_W?E¬Ž)T·ˆåøê +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;Ž_»ÿBâÍÇÕÚÝeÓíä–AîÒO,¤ÊÂÖNëZ½1†Û±€dˆÒ®.Ä’Hú{ÀMD±Æyªk'Ãv >WzÒƒ# ‹ŽÖŽ´]1.¢&ÞN<$çtÊ/ jÅ’BŒÉñ{¶ÛÓh›gŽ\ ?::tÓiþ­°`#*ñ”…Ñш•þШ_•+·#Eʸ·ÝÈðòݱ&šÑMeo©s§Æ£íè…c‘™XªËß­1£~ör1á>H7úõÌR¢[[Z;[òx.%VOQ¢ÂéBÑ*½öû;0'yrG<ÖÜBmⶈ³ŽoJU™šF5HV0Ü”7í õ§]ÐorÂQÞ‡5°ÚjïlÖ÷/—‘Jí¼J'*É•hÿhü4?gl6/ÉLH÷JšÚâÆÐ^_êë%b’JL1ÇëúrnJ‘qz|š¾¢\Ï&£°ÚUEÛ.§ ·‹à†I'uª×¯)¾÷åÔn¤SyGDDw(ƺѴËRÊ.I2Ë-ûªœa™WO„ö,p“Í™È"v ”^z¼‰ÉÐÇõuä"nRÈ@åiÍ·éßîÁàŽö™=̆-^MNÂ+¸uµ™€-oõe²jô'b­øe2h¹pŒ¦.<˜™µMfïT•WÖ²K9™@„úA˜ò}š«Çöi×2!Váåâ#¹2òï£}aõ~B[¨¿PClwß}ˆ¯L¯/¤¹ÚY ƺ§ÑÙ-ÙeÿIÓ¤–*YÅ|{x}ÙA•¹¹fDÞñüryäÍ»E<×–©rV­$’HK@]W—ÅØtã™ÁÑ¥·$ÏR×µxZȬy$QM$àêÂ7dUû[S®Õ9ÀsYÌòø¤7±[ÂŒÂP¡ã¬d/'ã#ר†WøZ­Çæ)–Å£‹d9ŽíÚ gÇ,it mð o@>…ƒžÙ&2()O§a:ú¡[ሺLKŠ/§Äô§ÅñbÊ%.¹›ŠÊ¯ jÍñrø¹£‡ÆOÙÅcMq­¿*­æH©u-ŠZZ*( e”u Eºf¯Â¼ç»ŠÿKÑþ`GL^sÎáŽm!K‰®£˜¢DcÓ…Œ$ÉÿìÛtï›>o2M¦ö×…œ imk<¦·€´ŸX’Þ)¹°A/N9?göG/³Ç"@%d(Y?WâÕî/Mimb´‰}}£//©rx!I”rIÛ‰ø[üœBíˆØ{•¯꺔úsH>²ò·Â¶à >%a;rã2É" ÚƒsØdxš¥°ÛoÓøý¬¥kù%†i!¶†[Vç¥ÈhÞ¤©öyu­Ôõ®BQáä±Ë@~>i¥“ýBso:˸„;;/œRXâB§Ô欟 xûW/Qá;ø«o­øùñ~=çîCY*Ïy1ý sÖ ôåMFAiksµ’gGà¨Q«½ +ö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é»Wãõ%·WÏÖlîÚh½G³g•#ýZ°cŒ}_ƒù½¾™ˆ°ñ*‡ãä‚¿‚p©<0*Ï)Qi¸(ñ3’Ï*'Ÿ®ä jœw´Œ×¶÷Ñɪ˜ax…7~aá‡e @­ðüB´é¾2ŽÔ9•”ÁÒè4æXlã +n’09šs þ•sJ­L ç¡;%—z=ŒVÒK-¡¬AY „ËëÈÄQ"¡ä£ÛÛ$$mªP5·ö¡'&Úˆœ&ŠRÌ㈑deïAŨ¿¯l—6<½èGŠ +©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 íê–§ã]ÿÕ®2Ï.ÆË 4¤Dxdõm{GÓ’âËMSÛè1¬Ö±JÅ"?RGs$œjëÉ‘Gú¯Qšý<8¹½¢`9Dr÷ucvÞ[²¸²²µ¡Kë~uòñX.dFôå!$«~æŒê( S3e”þ~N 뫵¥þ‘º´°šH};Ëh//>°¨òÂáÔq•ÂƳú¿k™ §Å1º÷21ßk£Ó,¯æ6¶7M¬ZGqSª[È!B°ÞGçZ¿]ª0q,ŠO…"hz¼ÄNÈ9ü³®}ifMPºšp!–V·”z±ª„ +ž'’¢í&Àž¹1”w…:\¤P„¾H¯.~Ykš“Ü&©º>‹ ó‘dž@•ýÚð“þSì?—(ͬ„~ÏØìtÝ“–fçéûÐþzó|:=ƒy_Êð‹8m”‹DÖHÖMÄ~'™×í¿aá‡#Ç6ýN¤c=¿{ÍVÑ’Csõ¡qU>±è¤îj­Ô¯ëÌÛuH³º“#Çë#|Ø»ý¯¶z)û\p1âA<Œ-ËËo@\3CûLOíÇjœR™y]šßU²¹¬Œ“/§U™¹ÉÁ€=6¯.]²9‚݇iƒÏvmç¹b¸ÔìôûÈ™ä´F¶ˆ¹,®~)d5?Æ6_zå:phžöý|Ljۄ tï.ªÙ­õ¼Côm͘k› y‡ŽSñBµ§J0ïÛ®LÌ]uuÄ—ÚÁró»ÁhϧN‚Ñ—X«H‘øÙéѸž^ÕÉKíe ±ù½Ë:.ž”¶1¢¥-)#”à « þì–`x®ÕÌ Ò•gíwºbÛ‡éïÿŠþmóû¿8yN;™P‰RmBOI¤ýe$?»D#íH wý›¦[§™tü[‡Ú91Î`ŸIóïé3ÜG0³Ì^^7Í=ÍÜ-"ÉCêЪÔLÍéÉ=ÏhÈì [¦ùn9Яǽ×äɱ$ï·ö!îìá“Scs¦¼â²_Éúr,gÓVD¢¿ÂiÇáþG.mg=Ê$~7EéúV§§[ê 5Ê ZÖDú½”´XV9¿|m…PŽ<¼ynpGwãg‘wø(ètø„ײM Iû‰T™[¡6¼ÞX˜’Ã÷h~UÈÊ[ ÿ_>LðB×ë:άÓ1‹øÕg´Ôná`’\­LMê†âTøƒ€w""6åÜåG!;©-ö…ªØÁÔe[…b°£¸õ@å%² Ä‘FGn‚§.ŒÁbDOã’¾¸š•œ¯¡ð¢ëMã¸rŸ`ü ܾŸjN€x +j>ž\þÄÁ.ô3§ýrë¤C©þí`VnD/"jÃÇè`Þé®xÈ®|]ìæ}®þå¤ Á”(«niZ´`q­}Îç(ô£OãÍ}–š–Ìçê‘€ k™cWiX“ñJ@¹7!‚E8áÀ9}…&› ãI4ð–ì­Fõ@**(•ø”S¾ÿI6—¦j:¥× Xýf·Q<רv/"ßd°î»õï†S”cÁ,†¢-U¼™¯ÙË"~Ž»fä ìÁ_‘‘~:±ßæ}ˆÊÆ|gø›%˜ ìÌo4k} Ë#OfýÜPO-Ô ‘Êió5QP7§1xøç~nÛÁððŸæîó{{) »KyÆbƒÐhÀ‘RI*”Ž8„?g•s› tQ6z>«kb%ã‚æá#{i#@(’I*¯¢âf^T¡nõÁÄ Yú)¡é7‹:Ç,A›ÓçÜÁž:´¦£Ú?ahXõjm‘œ…#„ Ê?ýÌ ú6qaevxÞGiFv•I2«\š·cð¥x–~-ZW?ÇF¹PÙ§[Ë%Œ0 U­®Ú'§ë5S)Eª±è(Aa–¿Á„ˆÙÐip^=“Êï @ʶñ°ŽI3È°Ã"§ x ð¨ÆR#’a½þ +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ÿ½&Õøbþ,9·ÓW†?¼ßiO÷’ø¶cë[Á ZmÕÌ–W¼’Ìdf¿gŠÄïQ$øŠÒ¤{ ´Q;ìuF\·³÷{Š?Ë·pËpÐO^ÛMlÖÍ}4†uo]89È +–õ8ñGø‚Óâ4Èä‰nö·5ßøûz/oü½¬Ûiš}£/—]ø]ªƒÈÝÌ@wøOîÏÆ¿ü¾TʳiüH’O«ñø·aÙÚóŽB<ã"íof»¶· +ÑßcR +Ç“2qc_‡5uGw¨'éåÞÝÙÝ5Ì/)Â\,VÑŸ³·zðÚ ó*Û_5½Í݉{Í6Y¬õ C€ŽË# yxŠ/5P¼¹mJf÷®Gc¸xýnQ)U1±þ•r?¡&²³úíÔÉu¼ú‘±¹_MWøê‹»?|k.”©Å<×~ŠI(e†K{U 9"É7‡ªÑ#M׶¯õ¦µìYïÓH]bdxГΠË’´«de½sòc ­ëÉ—Uý“A¦±K$µ{oB↊gf©~EÄwž¾uÝðùªêVbì aHîC¢Ì±Îæv(IaÀ1Næn—ñŽ«´µCèñsK´¿&Ïl‹4òEºÉ$ñpr¼úb:‚©mù9fû+^9r‚h:)@ôütDèþ_»[”·{ Ó]úÑÞŸï9V.‚ËQ,5G)ÁÅwŠÆy_ãñ÷$ ƒDÇã‘çÑ«½oOŸê÷µŽÚB¼â±Dõ&³àÀ2«;¯©ôÇÇ»(;`#oÁD`Gê­cko6‘:ÖIš6ôÌ~¹Yع¸¶æÎ@n+Ö¿³Ûv7ü{‹)“)p“·_Ö +T÷3FÑ<Ð3̶ÄUC8eåÈŸM½>.A}MÀ©Ë8{œc.þÿÅ~<Õu h5%ò´ÆXGÔ®‹F‹$Ž¼¸¤*…ÝxÖ…i½6®F&|[Jˆ%Vrjzd×C,-ÉÿOˆÇ,«»mB±€Þ“–å‚´øyR†RUC/#îëz•µ+«NBéu¨ér­lИ+Ì»påů ÅMóQˆO§ –´NªÌâïÝßA©ùúÑÏm5meˆ‘`Ï Ì¡þ?Þ¯-þÇÙïÖ0Ó¢?h#ô|ù¹:žÐ¸q@óèv©F^[ú¾\¼Ò]gU‘žÿÑ€_An;KQ"·ª.¨Äž%©1ãÒ­þNdcÇ°6£Q9ÌÊ}OãñßI!Õl9®ç³gžæÚHîd‘Œˆv¿©7Q+­=6áN=úåÒ‰äÑοGö.Ôo®5+‰í¡Óž;«dU¾¸‰’hÒ+fãÖ4ß8zž˜QÛ8ð€IÛ§ÇÞÆ[Ñçøè„žÚ i¬[jKªØI í¤vË +ˆæŒúªñÍ+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ø}ÿoº÷y}µÄšà–ò]9íWP¾¹QêBn¸ FHË&íÏ‹1­<;fį“¦ÔÌf?ˆ•ieÑôû Û2Å$Õ4õŠËSQ#´L®Æq"‡ŸÚ‰ù~Õ)]ð"w÷ÔÆPˆ'§àЄ¶·Òïôx$µ%kC/(¥Q"Ü‹QÏåðý®c¥)¾LØ;µGÞÎ-|᧴1r´»šRÂ7T0ÚF*Ì¥<ûýÁ–ž] ¾kbˆÄŽ©k©Ãé´‚>fEøÔíõyr¨iDPVŒvßzf<ñ˜nì´º¸å¿ïò¦+y¤Ö|ÈMÇ /Q¸Y@Üsw¥jK²/ìpߧ|Ì„ê1¾tóZÓyäcßøû[·Ý‹Qeÿz®T$FXä@¦y­k®­ÇÇ3z¿‹¯ìèÝcHÐí®&¸ž3=¦•™æâÏê‹eX½NMû#ÔâÝßcöi[#)æSAõ~<¿Ð÷ZnƒuébÏ-´ÿ¼–ÒÓŒ‚béýçÖÜúºñ¡ º° qŒ¥×ñûSÆvþ±%»Ñõ›û8£¶·I`ŽÞ¶¶27ÕL)èÇ›‚ÅêÝö5û5 ´Hà åö2-+Iˆ9ÓïÇîn —гZ4OX®B†B¯ñ}ÔW}ê–N¡¦qŸ/ÇÏo$Ÿ¢ØCÆæݯ'ÎÖÒ+FGôçñ`­º¸©Üä¥2Õ’àLIóý½ô™}wKžÖq8ô¸Ï$S4ˆì[ë¯Uõ»s¿¸QË!à ~ ö­‡wãö­‰tË™ujÇÔ5ix1 ݺ~Êrðz½ðï-Áb8bl¾_$MêÎc½F˜Ö+‰¶ Bõ8 +ñ­y¯ 0D†D^üøƒÉ.†Ìi‚9-=)¤…ÀŽxµys ëo€u—j ¶­2Ã+æÔc\ÿ³ª”$ §Ë¨j+êÈ‘ÙÏJé%Z±¿­ÁBŽ«ŠÐoñ¸ ®À6 b'Ëí]s«¦§¨Z^–²Ø¬ëRi!šhØ5c·þõÙõ"û_µ†ê$~>hžK˜?ÙýŸÚôKsÉ#¿ªò(büƒ–~<™EkÄ©éýk˜õaßÂ@¿ŠUuªêÓHÜn-í̇÷1JÎxÀIkÇ“8ߣ¾O„uq%–VOŸŸ¸A†çà‰®n¹ Š­ +*9‡_µ°§Pc•¹@›ë]J>²Šæ퀄´Hî"”DÌUáýªš)ξäXcÉÈŽgñö¥¶—ÿ\½ú­…¸–yÜô·h N-G,ÙiGˆTm3 a;•÷r÷tûÐÉt“z×–ÓAu3¿£é< } ä° +ÌjÍñTmö²GnmÊãVÓ4âòa4Ó†25¼K$1!4‘]—â ÝiN¸8IäÛÇÃÕõÒp¢­´D}npy—ñäò(yT÷ÁÄjšFHñ“~ÿÇÞƒ‹T…ç dï#z³^¼hŒ* + þÍ"§ìlJQXK!âæ–5ŒGs5ÁswÂIfœ*‰!,„’ŒP̼zFf'¼ïšÎ[?øëý¨;o6à ÷ÔZV{x­} =PreqwEc,x|tåÄmJòÁáuûNÛ½ Ê:æ›y¢C$—pO4,a¸º,©Ï@”©?·O»Ó5ºŒRŒ_ž—C©ñ1DÌŽ>¿¯â>ÛBk^v±´¼ŽxSco%Õä@Bà2:!¤eðëÛ,æ•oϹÂÕö”DdžOPš{ö1iµ @j$éqµµÄ>¥ÃÈ‚@¥Á,C!w=?m8ž‡3@êæée IünÕ•Ê\Éõ«ˆâº¸2¬–ì‰ó¢ÇT–&Bc©,>íÆ2–Û4ÅÝøòD¤âkH.9H}K¸#†Ý®@j†Y×–Û¨}·n†»`å¼ä±Aw¬!X¯áVI$D’TŽ3:I30™nzmÈÉË⪀ÌOÑ(ǧãÜ×<›Šzßâ’}Jæç[ÙÅÅœwO!6ët’^hãjò¯+ËâÐe±SQÜ쎸¹Ñ$x®ÒÚ+ÛyÇÖL×™£€sZ?x¢¿e¿WRª¿“:OíSö°mv»M¿«<´vJZU&)­çhL¡YknÆ#É9Ñz§ìï¸ÈÊ»ÿc7¿ÇzÏM›G’ÚëGW‚WÔšÞ`‘NʉÂ;y¶¢G,²S®ì0’'bH”v‘ú¾ï>{üÝtšėJºq ÅÁ+0>‰YéÍÿy->>ƒu¯o‡'doÑqã;P?´¡m´SÔm´¸m&ŽÒ8^). L–æxc2BŽú´f BZEþ\œ¢ =ÿc:ƒêçû?uú:^š´ßQ¾H^¯IËú±»ú“+¨¨åÇû΢Ÿå –ãa¸û™‹ðý¿{w7ši±KÙ#Ñ Sõƒh¬î`€5g·Þ@]™·-öM0p€n·óQ:ü_ÚŒÔ/ô»‡kKžQ˦zPZ"ÆÈìb Y! HÜIN<À5Ûج§µÇø¾·ºF§2Cñ…ŒÇÒåQÙ½{e˜Æ±°þë‹ýšw®5(ôÛñ͸¡0°¼F°Þ5ÌкÄdÔ!tWårTg—œÀ¹;šðŠ‚Q£a Ý¡u{Ù-EäÖzÓúñ5Äô¸n)3Í'¢Ü”£GñpsÒ¿9D_6S™4‹W»KÙgµ·åÄ}k€¦=Þ_ˆ¸o…¢-ÿڮø˜mDµø€]õþЇ’ßH¸(ŸÒd ‹½™ˆ†å ¨ªüŒ’†N5{·!îù– +þ—ãô|?T §ÂZÑ⻸æ¦_ï^¼!N/ÆF‘¢^NŒ?hrñoÍgˆŠþqûº*ÇúCM[«tÏ«›pnæ’YŒ±’褥THÿž Ÿ÷=2²·%Éƾâê¥wyqwwmo£ˆàÓRâHåT<¥EcæáX/ +<6®ƾ®lLAøø£ÞÛU†Â‚ØÜÉn¬Þ” eGn%L@ºý¦ø#¯JTÓ¾åLjÄÔ€âýß‹Dˆ®Vi⾬fÖæ!FÇJŒ­1Ç’+vçñý•"'—Ûøü{™O„ +'»ûUî &š+xÙȾ¬/Ì †.7Y@¯×âÜt$œ’7ú¿œp@"¹~=?±$»½µÒôó%‘’Y-¦/3z~›V_Jm€dv-Å›Ä7!Zå´dwc»÷~?‰²åw§]ð& tA Î~Ë0SÆfb½dÜø7µq–Ä~>^ä`‰3á????#øê¾ÚÇ̶²Gê³z‘ˆBÜÓí\8 ÂU|h·±##+ñîòr²iæ‘ôý¿ÙÜ«5•–«w²ÄU$S‘¨gu‘ªòJhW ±;²Ÿƒ`0 ˜š R_©è¦ùd»‚eyÜA1qVHÒ·ï8ÕyÀŒ»ˆÖÍfê¶FiiM¸úÊe™dâU¨)È«Wâd¾!‚aŒ.éZ[[«Èà·º·E»i¢œO‘>©nZ‘Ä\qäUëRK-k•ÊF"Èn0­Uìš]væ (¥n-’y´÷ +âãÓbÞPÌ™^?°i€K`O͉1÷õüròKc°ÓI–hµ&¥ ÂÇ5ôH(³¼¬"×íûýåœGŠ«fóà¡îý¯~ÿyoþY?䤿ó^aq®ïðg–ÿå“þJKÿ5ãÄW€;üå¿ùdÿ’’ÿÍxñàÿyoþY?䤿ó^> +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 +KPPLPG+Times-Bold+2 ø ÍБÚg3Times-Bold+2‡÷Ž|šøì½ +endstream +endobj + +%QDF: ignore_newline +29 0 obj +85 +endobj + +30 0 obj +<< + /Subtype /Type1C + /Length 31 0 R +>> +stream +KPPMKC+Palatino-Roman+2ø3 kû©ú/ù÷F÷J—° + "%(+.0369Š1Š]‡Šz‰€‡…‰†ˆ‰‡‰‰ˆ…Š„\oеš›ºŠ‰×Š§aŽpŽŽ†Œ‡‰Š‰ŽŠ‘‰‹˜ŸˆÄ‹² ÷BŽ¦Ÿ‹™˜ ŠŠ§•¼†Ž‰rqŠqY‰ñ´¦˜›“”–’“˜™Ž–˜‰‡•”‡•…•ƒ˜‡Ü€}~y{ˆ„~…{~vwlltq|w~„{†y„z‰m`mwt€qxÎŽûDØøŸû_…‹…†‰p‹sutz‘€Ž€“‚“„•…“…•‡‡—˜‰œ™—ŒŒ–––Ž—›–™˜š—…ž‰€‡ƒŠ‰ƒ€‹~yŽ„ƒ‘…†’‰‘‡”‰”‰•‹¨Œ¼÷[‰©£ŒœŒŠŸ—¹†ŽŠ„~Šz‰l{‹ˆŒ…|‹qçǦ•v~o~iv‹Y>xr€lvŸŒ›ŒøPäù%“ˆ‘‡…†yŒlŒ_Œ`_ûvŠ6Š\„Št‰z‡…‡……ˆƒˆƒˆs‰eŠl÷ Ž÷ +ˆŠª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> +stream +Courier$øøø …ûùù·¬ ÷N÷UÂM›szEuroCopyright (c) 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998 Adobe Systems Incorporated. All Rights Reserved.Courierã‡æ7aö¬Ãô(`™­ÌäNrÄ;l¾Jmè]•Âá!‹ < Š +( +x +Ñ  N © ä  J œ   > Š 士Ý/l¹]©Ãß";½hÆ!hÛ V®#™ë0™þKÒg¢ìN”Â(=£ò(–:QªãVl˜Ïð  € Ô ç! !@!a!•!¶!Î!ñ""M"š#Y#Á#Û#ô$$h${$¨$½$Ü%%^%„%·%Ù%ì&I&¼&ú'w'Ó( (Û(ù)1)­*K++$+;+‚+Ö,>,´,ä-A-ž-á..:.œ/J/00$0©0Ü1H1Ç2&2—33c3æ4y55o5Ù6;66Â77E7x7ö8R8Á9%9‚::à;B;·>¿?`?ó@±A‚BB|BõChCÒDD=D}D«EEE˜EúFWFªG6G×H:H­I"I†IÚJ=J‡K +÷ ødw÷‚÷(ÈÐ÷íøÐ=ü·à¹û«i¦kanmmm©m²³§§¬÷¬÷¸‹w÷;÷¢`øIøÐ- ¢û¸¼û,÷¸+¢û¸½÷ À÷7Áÿž€ÿ3€g¾g¿ÿp€¾hÿ2€ÿÿÜ€ÿ2€ÉÊøŸ÷ Àû•÷7ÉíÁ,™÷yX~ûyû$™÷yW}ûyûUÑ÷û7ä&Vì~ûm¾™÷m÷#~ûm¾˜÷mÒg÷l€û7û$•÷7’÷3û,Á÷í÷*IÀóÁ]À÷ÂíÁjÀ[V€ø‰÷;Èlµ'¥&¥Rš\¤¿ÂÓ§Å[¹º|u²k\Á÷*UW]l›k™hóT"KŠ)e#ŠuŒQæhZ€ÊrчÉn§~ xe=1zIZZ–ªg›ÃUû3Á[´¯w°¶‰û+Â÷,V€÷”ÇÍØÃ÷Â÷Ã÷ÂõÂÈáÂÉÁýÿ÷÷ø†ÌcÆ5@[OJI¼Q×ÒÀÄÏÿTŠjsh_cl¥´´¦©·¶¤jfý÷?üÌdÆ5@ZOJI½Q×Ò¿ÄÏýUŠjsh_cl¥´´¦©·¶¤jfýõ÷Œ|Àü3û1™XÂ`Â÷5Á÷kÁè‘Â÷p÷ zøËÂûr°¦°œ¸”µÚÁû a|Vpdvû"÷^‡k´²¦¨®Ä²±zu©Ÿº¦d]žX9YXRei¢h‹’€…º Q…6lQ°4öÂÁ¡³°z®YºKéusnnTY[®Îк¯±œøÐw÷F÷?÷ñøÐ,?ûË*ù}÷²ÂøbùUEûWû,&û'Êû&Å1À\ßC÷÷$÷³õÀî*ù}÷™Â÷Ð÷²ðW÷,E÷U§WÀ(³!ûû$Cû\7ÀÅåÊ÷&÷'÷—v÷âw÷›Íø{ø#zÒû$W‘÷.C‘û.û&¿{D÷!f4ûÈiÙ÷ +Öû +È­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ÁÎÓ¨Ä×Ï[;|‡}†}jQ#M§a»ròuFc16Ð;÷ò÷Ò×èìC÷ LWaCi3–çî蓨׻\Qòû¤9=pP\+šåí뜵ØÌbE~Ä÷IÃ÷ŒÂ÷ Á÷­ÁøŽ÷ÚÔ{âQ¿©j[›[û@7-0Å1÷ Æ˦À¬û7BL0rƒnj‡j„…„WRα²”²÷ +¨é÷÷PS²f}O\D4\ÂÒÓ½ٲ·|i¤ n›]Œc}÷ ÷$÷ ÷÷ø ÷Êœz´Vfkpjk¬p±¯«¤¯û›œz´Vfkpjk¬p±¯«¤¯÷÷ ÷Ž÷ø÷Êœz´Vfkpjk¬p±¯«¤¯mûQ+CûŽËŸvè¹øŠÂûô÷'÷ô÷'Ãü"û8=÷ÁñÂàøAø–÷žÂüATøAû0ÁüAU vøp¹øž÷7Ùü"÷7T÷ôû'ûôû'T÷ ÷-v÷¶Â÷ Á¦÷*Â÷Àöøuø4¦„¦€ ËjD¨BPP{y\ûÁÉ›­³–³÷¦Be)ûvB}"ÂÆÕŸ÷°÷ úû!üªo©cekpjm¨nµ«®£­}°ß¯÷n°÷°²¯ô¯÷«÷(°øÉ÷½Øt¹i´Ä[C¤AûF*ûû4ûÍû,÷QßᩲÌ|¯X3FzI@H«Ïcu°¿»÷Ç÷÷B÷óKû"2^GYqpŸ®¢”£‘ ®÷f}YÂzkŒ~JC+*požv~–›‚¡´¯©¬žn©iºÛÂÞöûe‘Jb,Qi„±¡Á¹ó½°’bz‹Â÷Â÷¹Âd²…÷h÷P÷eìøïÂUûdø™û‰T÷#ûKübMT÷hÂ0¶÷÷µ¸û)Tª÷tû‰Ü÷ ÷É‹Â÷[Ã÷cÂ÷ Â÷«ÂzÂôø·÷*ÙP¶K—ø™’«œš¡›£“«¨§„¦€¢Õh9‘?û”TÙüb=T÷ÌôÈÇ•·°ô¡¥˜®®ø.÷ n€nvyni^ˆ\û ÷c⧭‹†·º†²eXô±û¡m{lk|zffŠaû-÷[÷&¹ºƒs²£|šom~Âø|ÁÍÃøÁøÁÈsºdVHpGû*ç÷2÷M÷ÀÖËÆl\·:Á÷iUNmž¦aZšVû1#ûû-û9æû%÷KÚب¸È‹ÂøbÂ÷Á÷åÂøÂ÷¿÷8=Ú"¢‘mjŒgû†TÙüb=T÷j·µ’³õžÙã÷KTƒR~Rp^Le@}Aûøbî㳈`½«o§J4‹Â÷_Â÷`Â÷Á÷4ÂÕÂZÂüúø°÷STûû»÷_÷4BÂ÷^TAû4÷`ü÷µûÂ÷SüsTÜüb‹Â÷)Â÷–Â÷5Â÷®Âø½øâYíû,û TÙüb=T÷²Âû-÷)÷ÌΙ󡪗´´Tq„rwWlM†Rû÷–÷Á¾}Z©–yqtûÂ~ÁÂnvø¬ÂµÃø/®øÈ÷¬É}Èp½ÎfBËû16Y7\q\|SHžû#Ðûío§ƒnppnpizš^£¹ªšº¹²t~´®‡˜™‰™¯®˜¡¦u·}vqqŒ‚n›ccŸ]||†‰|®™’—’—–›®÷&÷ó÷PTŠû[ûfC1û¾÷M×¹Ÿ¯صծÅÃØo3¸Ÿe’[[‹Â÷PÂ÷oÂ÷Á÷¤ÁøØÂ&jÂQád¼Ì–ãµ÷ á\Òû û¹TÚübü™û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.=ÒôæÌÝ÷÷­ûQûVÂ÷Â÷äÂa¼Â÷éÁìøÚûVÂ8øšÞÂûÜGµmI²9>=e8c|lƒffûì)÷ÉϤĺûeû-T÷-ø1û/M996Í÷Å­÷÷÷Ï;.‹Â÷ØÂbÁ÷[ÂаøÌ÷úˆŸ‡€œ¤{q”l,LATJÐ÷ûHT÷ûØûTø +ÂûV÷]°ó÷¸¬¿¤¢…i’Â÷ñÂèÂ\Á÷¯ÁlÂèÔø˜÷ÞP FF/ˆ]¨|•€É㘶ØÂÂzpµPÁ÷2Uc¦^U˜SûCV5r’pžzÀ[ØÕ…ä·‡¿’¦e„{…AûƒfLTž°[ÆTû>¸t¼¼uÛÔ÷ÚÄáÂ÷äÂ÷#Áø—·…ÁwW@hGpq™pnšƒ¯ª÷€÷–Âû–÷UûDTÒû˜û÷y¿ÕÖ¨¦ÊÁaÂ÷ØÂ÷Á÷¢ÁxøÍÂ9øûTÞ¸û‡YcW_Kpn‘švm¡„¯¯÷©ûTÞûb—b®psª²‚³²¿‘Ô×xH‹Ájvøš÷n÷#÷fxøÞøÂûfTÔ¸û%ûÙû%÷ÙÕÂûnTá÷?üË÷?ø‹×Tvø¤÷7÷‡÷2xøáøÂû2TÒ¸7ûÃ5÷¦\7û¤5÷ÁÔÂû7T­÷üÊÚ÷ÚûÈôø‹Â÷Ø¡÷bûP÷Y÷÷NûK÷cØÔø×Â?û>÷AØ÷%÷+ØÂûNT´ûûû÷½ÂûYTÚ÷'û*äû>ûBAT÷bÂK÷÷÷ûMTûVÂøšÂ ÷Sû&÷’æ÷GèøâøÂûGTÃû:û¿û-÷¿ËÂûSTÎ÷Lûõ*û9ØûT÷’Â6÷¸øš‹Â÷ØÂ÷Á÷­ÂøŽ÷'T/û£÷Ú÷ܾüû$Áä÷•ûØûÛWûzÂøIvøhÂ÷¢Âø8ûzÂRešÍ÷>¼Šã?½×Ìټ÷BͱšÄÂZ‰P€sZ}n‡kjû ûxmDiWÔiœmûû jk™n£ZÆ€¼‰ûú{÷§¾÷Úûú{Xþ{ûzÂøIvøhÂ÷§Âø8÷…¿D­x©÷÷ ¬‡«}¨s¼P–ZTć±|IûBZŒ=×S?YŠ3Zû>Ie|R‡T¼Æ–£¼™¨«¬÷ ÷œ©Ô­÷#šÁƒvæøF°ø¡÷‚Y¯v~lTiymœjПfo™aQtf`fºf§Ÿž®®ž­zy®°z®°y£°Ç²»º©÷ß÷ ÷‚÷(È Àø ø©m©dcoojk­p«µ¨©© nüŸyø_{üåÂ÷L÷-JÃkwóÁ÷Â÷Ážø÷0|ºjWPrKû eݾ®ÓÃÎ츹}t®ÎXÁ÷-Užb®hšh˜e÷!Tû"A„+Nûû àGà†û#Â÷#žÏ©À­~ÂqÂ÷WÂ÷dÂ÷&Á‡Â¸øœ©v¶€zmwh´kkš“mt|||jk‚|nˆÆÀ–Ì£¦„¦…¢÷b¸ût‚©€¬«âÙ¥¾¾¾v]¤¼šÀpQÁ1"Â÷(Á¦ø©øÄøÎOŽ…„Œ…ZY€lliiƒ\ƒY‹ˆx‰€û…TóQûÊ‚Y…mnxzq†ezyŒzsRÎ÷,œÅõŸÆ÷Ðö’Â#‘¨Þœ¯ðžˆŠDÂøµÂ÷ +Á\Á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÷/Á¦Á~ÁðÀÀ Á÷"ÀÝ`-÷¨ø†ÌcÆ5@[OJI¼Q×ÒÀÄÏ-VŠish^bk¥µµ§©¸·¤jeÀ`øüÌcÆ5@[OJI¼Q×ÒÀÄÏÀ`VŠirh^bl¥µµ¦©¸·¥je€ûmŒÌcÆ5@[OJI¼Q×ÒÀÄÏ€VŠirh^bl¥µµ¦©¸·¥je@÷M÷ }Àü<û:™Xû$Âø:÷ ÷ Àã÷+ÂÏÁ¬ôø$ø©n¨akhsil§m³±«¦¬¬Üü‹÷UM{ic€cûpÔ±í÷ Ó™ôTPAwûfû p’p–vK¬ÒnÔÆÆ›ºø~÷E÷3÷¿ø^øû÷&i>÷´'ø~÷D÷<÷¿øgøâj×ûžû%—løìÎ÷ø øøû(÷3;û)û3´y÷(÷÷&ûøš¾¿}wñø!°ø‡ùY•q‚ocgptœtÐtrœoXWeGu¾€šž½¯¡¢zz¤°y¥¨z¬°É»¼Åžøµ¿ÜøHø™øµ¿üHWø‹½öø"øùQg}U^CRP¨¿rP™oF®ÖiØðÒÆÓ¤øš÷÷™ß÷íøš÷7ûøš÷÷IàÊÞø0øš÷8ûL÷6ûø{Æ×Æ÷gÆ×Æø)øÜÁ`¶UU``UU¶`ÁÁ¶¶ÁPvzzvvzœ  œœ  œzvûJ¸ÂÝÿ€ÿ0€ˆ¹àÐø(à³sŸx°]†4Пœ–z}}y|~“’}bˆ¥{¤дª²·ø~÷\÷d÷¼øŒù"\¯ûûE¨t¡÷8[¯ûûE©tû5Å÷îÕø…>~{~xwš±¶™¦›>ezlhdg¥i»¤£•šŸø~Í÷ø øùaŸû%ûû)÷bw÷*û0Û÷qÂŒøüøý÷qÂüüT‹Â÷¯Â÷_–÷XãÂÒÁ¦ÂõøÁ÷0T&û,÷`÷ÒQÁ÷>URD÷_ý÷,$Â÷2ü,TåûCübVT÷XÂ5³÷÷û<÷sû÷÷¹÷ì¶fµ¿µÃµ÷0µ÷$¶¼|øE÷òµ[ô®ˆ¥iš“zuŽvdd€€j•a–¥¬–ªÆ‘prŽvsŽt)w\r¼i«gÀ²®Ÿ£§|e¼Šãksgxeqw”£—¸°±…‹‹ÂøbÂ÷-Â÷²Âø¹÷•Tû^û²÷G÷BÓÂûBC÷x÷Âû²TõûŽ8hTÞ®û1!TÂø{²Âø/ÂøÄ÷³¿|áZ͹È`¬bU«eY¡HûE4û1û!8¥?ºUWF¶k¼Ël´¾yÅ÷6ë÷÷8T‰ûDûû]cš£k÷¨÷ÿ­V•Ib:÷^û©üi·xÆÉäÀ÷0÷.À³zq©‹Â÷`Â÷_–Â÷}ÂÐÁ§ÂúøÄ÷1T%û+÷`þÐRÁ÷Ü÷'÷'Ýâ÷ ª÷ì¶÷.¶÷@¶÷B¶øDødÌWÂ>RAg8/än³½Ü­á`ŒX_pa__§½µ¬­ÃЛVtÁ÷<ÃYÁ÷£Ã÷JÂ÷TÂÞøÈ•Âlf~gxw“zS¥xÌÇ÷Š“Œ““ÂÆq³¯sj¢WTkqbp™…~À-Uc~{`•U™­³™³ЙgS¾hyqŒ~izˆ„sPy\[:3ÌfÇ¥ÃâÅWž¾cÙÞ·¸––±T÷”ûR˲ÉÈ­ vz”™q’nŒjû‹ûueHLdm§¹¾¼¯±²“Ž›–¢Ÿ°†‹‹Â÷ØÂ÷ªÂøŽÂûAøûcT÷,ûØûDT‹Âø™Â÷¤Âø‰ÂûB÷~÷ÀÂûV÷¯ûuT÷>ûŽûUU÷ÀûhûCTÃ÷ñ¿ÃøÂøÄø.e´SX¬]TšPû6/"ûUT®eV\±bľiºÅÀ÷÷Ý÷)¿|¿j±„û#†]h‚a.ûbc“ j÷¦÷£n–fe?÷#û¨ûq§~³³öâÏ÷¬¹„r²Â÷<Â÷›Ã÷cÁ÷TÂø×–€Ânc~g@TÁð˜÷Š“Œ““ÂÆq³¯sl¢WDeZl|ºva¬Hû#sû"ûûS÷ |¯ç­Ë£”W¥³gظº–—±U÷“ûS˳ÊÈ­ uz”™q’nŒjûŠpG‹ûû+ˆ÷§äžô㪫{nš›k‘deÂ`Â÷ØÂ÷Â÷ÁãÀ÷Á§Â}½øÞ÷¦„«užfª_‘_›:¨pš«¨¨˜”¹¤Ê‘¤Ã‘—Œ˜˜§¦vž©jZ“.dRƒpigo‰[Up8TÞûØ9T÷ørÑ¡¢òØˈV}ˆ‚‚mjAhly{‚vsMÁo»y½ñd§€§€^:û†oY\™«cuTmºÃ{ĽÝ÷¨÷ +÷‡½÷¯w÷¨½ø7÷‡½.÷¯û$uYé˜ût.Y÷­Âø`Âø—é÷†üATø +ûO~ÂaÃ÷×Â÷Â÷¢ÂxøÑÃ8øûTÞû&¸3g$ûIaºÈ÷°ûTÞü¶Â÷Yt ¬w¼¿Ù£Ë°x@øÍ‹w÷c·m©÷·÷¶÷F¶nžø¶ø÷½;Wû{®V÷{<û½¶÷ Êû ÂžÇ÷ŸûŸ®û“÷‘·ûT_Õû‘·÷‘‹Â÷ZÁ÷fÂ÷Á÷åÂøÂ÷¿÷8=Ú"¢‘mjŒgû†TÙûf@UÖûZ=T÷j·µ’³õžÙã÷KTƒR~Rp^Le@}Aû÷Z÷<Áû<÷fî㳈`½«o§J4=½÷€¼}½÷¯w÷¼÷J»÷ ¼¾øìøÅb§üvý)´o÷2÷ë½.÷¯û#uYé˜ût.Yø²ûÕ½û.÷߶­ÌÞ¿f½@beylpQ¼ŠŽ‹Ž©©§²£nlinqrxû'\ Â÷†Â÷Pw÷¥Âø—÷RÂûO÷PTûPûOT÷OûPÂ÷P÷Oû½ÂüAT‹ÂÆÂ÷ÂÅÂ÷LÁ÷¸ÂøÝ÷²÷7È!û1Å÷Âû­T÷übûT÷ÖÂû-Æ÷ ÃÁ’®´±«¼¼T‰qƒpywchS‰Vû÷÷8ÍÉd:>½»¾÷?½÷¯w÷¼÷˽øç>½]»¹¾]÷GQûûVg÷[UYÁ÷)@Ö÷÷ øb§üvý)³o÷÷ë½.÷¯û#uYé˜ût.Y­ãÎÃÎã÷—ãà÷ï÷ø£wŸsswwssŸw££ŸŸ£÷>û;ÃüAS÷—û£wŸsswwssŸw££ŸŸ£ûtúH÷§¾÷Ú÷¨øTXüT¾üˆøTXüT÷¢Â÷`Â÷ Á÷`ÀøWøAÊ]çû1HD56ÍCäßÓËêV‰Q\_SOb¿½¶¬ÆÑÜŸ?qûVÂ÷Â÷ñÂ÷ÂïÁ÷éÂøº÷q°ƒ°|ªÞcA±>5Og\g÷›ûTÞý[8T÷¶Âû-÷dcªÂbæ÷ìí÷TŠû6I9.=ÒôæÌÝ÷÷­ûQ>½»½÷9½ë¼î¼‹w÷d½l¼÷X¼ù€øË>½]»¹½]÷HQûûVg÷[TYÂ÷(@Ö÷õ€÷øb§üuý*³p÷.øH¼u›q˜ú€Ÿœ•žªª~«rœ–{w’qefzwlž\œ£¥©§¨zlntuY…ù€Z™­½†bvxnVjj˜›o}X}§¸}±õ€ÆÆ°Ê÷‡½÷¼÷Y»÷¼ø4÷‡½û/÷ß·®Ì¿f½@bdylpQ¼ŠŽ‹ŽŽªª§²£nlinprxû'\÷§¯÷L°Ò°Ñ®ί÷ °â°÷®ø©ø•÷ûïûû û-û#ûõ#÷÷õï÷h‰û43û".á÷òÚí÷ ÷à0ûûû `÷©––¤§Âfœ_;ûŠ°ð´²&’÷Bmv…t`Òµ®•zy÷RÁáøAø—÷RÁüAUÂ÷ñÁ÷w¢w»ÃøÄÜø¾÷~èe÷1ûëå¿p»ìûGcž`™^‘gZ¬ˆ°‚«~;\§\÷ËÚY³6‘}«eS—UûQGû$û!÷3÷#Ü÷D×÷ ÷R{!5Fûû ;ØìíØØ÷’÷6ˆ­!J vàøCø˜³ûE÷C÷C÷Ed±ûCûDûD÷Cdd÷EûDûDûD²e÷C÷C÷DûC÷€½ë¼î¼÷ï½l¼èø3÷ä¼u›q˜🜕žªª~«rœ–{w’qeezwlž\œ£¦©§¨zlnsuY…èZ™®½†bvxnVji˜›o}X}§¹}±èÆÆ°Ê÷§¯Ó¯÷X¯Æ®ίۯ÷«®ø©ø•÷ûïûû û-û#ûõ#÷÷õï÷h‰û43û".á÷òÚí÷ ÷à0û24n¨suvqVd¸¿Æ¹³¹¤£~x›©ª¤js—g>VMD:ÌUË°®š¥¤‹Â÷Â÷¹Âd²÷{w…÷h÷P÷eîøïÂUûdø™û‰T÷#ûKübMT÷hÂ0¶÷÷µ¸û)Tª÷tû‰Þ÷ ÷É÷=÷Vj×ûžû&—m‹Â÷Â÷¹Âd²÷8΋w…÷h÷P÷eçøïÂUûdø™û‰T÷#ûKübMT÷hÂ0¶÷÷µ¸û)Tª÷tû‰×÷ ÷É÷M÷û'÷2:û)û2´yë÷)÷÷&û‹Â÷Â÷¹Âd²ã÷…÷hsßÊßx÷eëì€øïÂUûdø™û‰T÷#ûKübMT÷hÂ0¶÷÷µ¸û)Tª÷tû‰Û÷ ÷É÷÷÷7ûL÷7û‹Â÷Â÷¹Âd²÷{w…÷h÷P÷eîøïÂUûdø™û‰T÷#ûKübMT÷hÂ0¶÷÷µ¸û)Tª÷tû‰Þ÷ ÷É÷&÷û÷&i?÷´'‹Â÷Â÷¹Âd²¬Ç×Ç…÷h„ÇØÆŠ÷eí€î@øïÂUûdø™û‰T÷#ûKübMT÷hÂ0¶÷÷µ¸û)Tª÷tû‰Ý€÷ ÷Éë÷?«xÌÂÕÂZÂù€ù@ø°÷STûû»÷_÷4BÂ÷^TAû4÷`ú€÷µûÂ÷SüsTÜübmøNj×ûžû&—mÂø{Â÷+΋w²Âø/ÂÜøÄ÷³éX÷`ûbûE4û1û!û8ôû÷2÷6ë÷÷8T‰ûDûûû<÷÷äÁ÷0÷-÷;°û<>}÷üû'÷2:û)û2´yì÷)÷÷&ûÂø{ÂÖ÷²ÂêßÊßàÂøÄ÷³éX÷`ûbûE4û1û!û8ôû÷2÷6ë÷÷8T‰ûDûûû<÷÷äÁ÷0÷-÷;°û<>6ø ÷7ûL÷7ûÂø{Â÷nw²Âø/ÂøÄ÷³éX÷`ûbûE4û1û!û8ôû÷2÷6ë÷÷8T‰ûDûûû<÷÷äÁ÷0÷-÷;°û<>Vøû÷&i?÷´'Âø{ÂÖ¿¿²Âø/ÂÜøÄ÷³éX÷`ûbûE4û1û!û8ôû÷2÷6ë÷÷8T‰ûDûûû<÷÷äÁ÷0÷-÷;°û<>üøwX•q‚rceqtœtÜttœmRZZRx¾€ “ž·¼¢¢zy¥üz¤§y©üЭδ–Â_÷HÿAÂÿ6èõÿWT|÷M`¶Îåw²wÓÂnÁ÷¼Ái­ ­PøŸ÷3Âj¶bžFª/}F©ar¥»Ë̽å­ ¿Àyh¯µ 2Á÷MU­`m§dV™Wû#L)7,Ùkƒ­Üh÷§ÍT™~vvJNa#LK³Zm ÙTûH­ ³`É؃¹­P÷îÁ÷ ­rùaû%ûû)÷® bx÷)û1ÜÂønÂ÷{wîÁ÷ÎÁøìø™ÂûƒTõûÒû@j:fe“ n]¬ƒÅÁ÷À÷ÂûˆTÜû¶BAÅ\k³Ä~Á½É™®²´¯œÈË÷Ód÷fj×ûžû&—mÂønÂ÷8΋wîÁ÷ÎÁÜøìø™ÂûƒTõûÒû@j:fe“ n]¬ƒÅÁ÷À÷ÂûˆTÜû¶BAÅ\k³Ä~Á½É™®²´¯œÈË÷Ót÷û'÷2:û)û2´yì÷)÷÷&ûÂønÂã÷îÁ¶ßÊß³Áøìø™ÂûƒTõûÒû@j:fe“ n]¬ƒÅÁ÷À÷ÂûˆTÜû¶BAÅ\k³Ä~Á½É™®²´¯œÈË÷Ó-÷#÷7ûL÷7ûÂønÂ÷{wîÁ÷ÎÁøìø™ÂûƒTõûÒû@j:fe“ n]¬ƒÅÁ÷À÷ÂûˆTÜû¶BAÅ\k³Ä~Á½É™®²´¯œÈË÷ÓM÷ û÷&i?÷´'‹ÂøbÂ÷{w®÷ZºÂ¸÷WøÓø™ÂûWTÐû"û„û$÷„ÑÂûZTÏ÷Eû»û;ûT÷ÂÂû÷;÷A÷»o÷fj×ûžû&—m‹ÂøbÂã÷®÷Zdß‘ß^÷WåøÓø™ÂòûWTÐû"û„û$÷„ÑÂûZTÏå÷Eû»û;ûT÷ÂÂû÷;÷A÷»ê8÷#÷7ûL÷7û‹ÂøbÂÂÎåw²w÷Á÷ÃÂîø¢÷mTû6ûÏøøe¿ü/û^Á÷'÷®üücUø<ù¥aû%ûû)÷öbx÷)û1ÜÂ`Â÷2Ã÷ÃÅÃ÷ÂÁ|øXøâj×ûžû%—løü~Â9÷…¦‰§|¦²vY©6GFwsQ™UšªÓ¦Ï­¬ˆy¨¥{’hjl’_Z’[û8V4P¼JÄEñ×жÀÂ|7Š÷*¼OYH\:N`´±¦›¡Ÿ™¥°Áº·µ…„µÂ`Â÷2Ã÷Ã÷-ÎÅÃ÷ÂÁ~øpøû(÷3;û)û3´y÷(÷÷&û÷ +ü~Â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¸÷À÷ñÃÓÂÿ˜€ÿ1€ˆ¹éÂúø¨ÎuÂur=Q:û0`÷ÌäÓÝ÷ÄÀ}g¶FÂ÷CT[ª][œQûAFû0ûë5÷€†?öŒ’’’˜š„y†ws}}“’€}cx©Š“±­¯ºú²s x¥úÞ̪¶Á÷<Â÷ÃÊÄ÷óÆøgøâj×ûžû%—l÷øüKzÀ_==y\\^‘£eg¢mÁÀ“ø.÷H÷û5û!/ûû +Ðû÷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 + /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 +‘ê·„Q븆 U +$ +ó  ‘ `/þÍœk: اvEã²\Ã×N‰ð‚­?¦Ñ8cÊõ\‡î   ­!!A!©!Õ"="i"Ñ"ý#e#‘#ù$%$$¹%!%M%µ%á&I&u&Ý' 'q'((1(™(Å)-)Y)Á)í*U**é++}+©,llllllllll l +l l 5>ñ +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 0000000000000000000000000000000000000000..e9c59e2a5d7f0f28f2d6c5f0e80fc1fccd87c60b GIT binary patch literal 300684 zcmV)HK)t^uP((&8F)lI+CCBWKq6#!1Fd%PYY6?6&FHB`_XLM*FH6Sn`QZGhnY;{LMf47k>5Yzx3;0 z|MWNi=%;@(S{>W>eqF2CcCCMSyQA;l?_+$Mqn+RP(;EKyZy(?O@K0H0>#JY;D$}>` zC(DfQ-O9{!)pJCdtCl&x-&W>cf4=wYQRcY&_c^1?zGWeOd(Tz4J<44B`r|;EmSxV> zrF;Cpbnfo$d+#VTe!D`)cJAM2L!sk~-hDB3$3EA1cNF?9=izAQn%F4Q$~5fFhHsr) ze|~jt%=vv>DARt+cGf(6A6VBm{wec~0iA2U8`iZ|V%Rq;w92eCyxX(TwFqcnVcTyz z3-@T>53Fqer%^*RbZ*CL2n*YPOKMmn+P@DhY%kN$t^V`Nbv@g0f8W}BFZRtg<97ab z+p%xlkN^As^56c8zuNw}U;U&1{{Q~RfAW|9%76Bs{}2E5Kl#7@yWiXX!T1yv^;=FuOSbes|EK@T_TT*8U;VeYKmWV`#qWLl_OJc<-~Btk{x5&} z%YX3a|FS`U=hy%IU-{Lq{>Oj(`~OnT!aa}gYo-6%Vn%D|yLGOQHOe(HeJqZ7gBk`X zX#e*2e>(U1eP7hj@9X^D?r%RnAs>HX$iMe{ziaMy&Hb*q|Nl3)?`@qe`?q$l(`KC; zKNhl%klm1Re7~>t*}jka`&>X9>j*cXElz4*?EIpQX@rFk|C@5zW%k^xuV+B_;bJ27i;;rzMt#NS;Axw;9B*pFYf#M8Ng!jUgR=q@8i>e zK7RV;r+r&JKik5N_I=tQuXO^{qZ|KiCT7JLUZs4#?scr5t$*ul$lvF&s=B91 zSZiAMHN=H{{It#(E7$im2i<}5SY5geS-o`RTGO)zy^z)Z;jL|J^j>OyKLgnt>KRe- z>QOgoZXqq|;Q`W3&PF{kj=ryHMX9+;IdVpS_U-7l#0wcLWpbh;jiuI%o{ns6YtfCD z>L+`6qn<@FQS%x`^k=Q*3FHW*-TY>aD-e!--%;}#AHG>D?xWam*0Tu5d$@>h2XaTL zoqgWd+IgQh_7KFpkik-`_g2q#t3Unrwziw|ytav#+Ag&|qR-paKOq|_kEPB@YV9$H zHoG9#9<#9>2T8ogdfA$w6vnkp5qaxCPJV+Kv$e%H8%8m;SFje_TKD*7ySM1iU=Ozw zrPgSoKPHVjvStO}Ec)|OoqgU0YF@L8nq#jlgritm-}l{-7W1>jzSZT+5bVtRv_-xv z!p*cbjQuuNV;e4!MF8iL{0p+JrD(Gt*JX_#rRHlb%H7V29Jak`>(|;uK+xyQ7ODe6DWHZiAR0%+oYsYkY!_nL2bjFi`KlrhQZbJJ){cqZJ}NObT~| zgnHa-48z8GVC2Vj5W%R9%WCdr3mnD_$0*z6Ffs__ivApjwPmw&VQU}8Qv<>FKaR$4 zut|@3;hP(5sWb8&x zI&;po0=to%PAWG{7%}e+C(O0k4(JcWY93`WmX^9ojl!*$wz|Htq3<|_MDXI@=V<~! zo#xXHp+K}b&Tp)TXCZ|1I9woE2)XXq7`yD13{N{01Hs9l+1M^DX)**7__fCBCLT+PxM?vnj$iYB`G!u~OzFj+XebXvpGF~f<-(~{Z zYj^Hzg6Ff#x9RZvSx?E$cuk#)wQO#+T8K`r{R~8>?bce9;w&#@#>u5K+Rg(%>$zIH z@p?bYE=fmy$LTK#N{HkxmbxXap=LW{DVsrtS%(q7fwZ37;3YUkW$=5TqEyGt{#9eAH-oVMDf_i;zX+{j!}?e%+|A>D;rA>GQf zBCEYc;;)b;IUfcN>(J$`{aA>d4XZuCY6? z81NmyWq;{yZTj;GTv3OLEUMh2(q`=~;D|cZ%B5y+`^N$rzF5jr^mUO^eA0|_JA$4Z zizaRx;Zlq+9y3FY(-3s-SS;MnmZf>16wj!ov7pppyxdy9F@nRE&d!ZQOo6adqTQGn zof3)gR8PeAOs$40S3yj)3k2O+gA5U4DMB%S=e&ZOY7pY48mP{erSYNWMUl=sHDThE znpAPhwsy7GbFD$_j+llwEAP~5UHc5)*{;EFZhmv39uuJ*S^GS`X?C{krH7ZP4}oA@ zl>amt*RZC_e2E43#R;O!VSC0A(A#BNtTE*!?V*~rpt~{UCAXoT%cR-|avN(n44E;8 zd$UrrB8x5FCJQIhO%QJtna1w-QuA$sNh{sCuO8~C263CTx1VL8VoaJGF*wn?)KN{l zR0S=~ZnEpXm*rbXC?VR9QaQ9`cauYn;kHAqLy2w2#&3>L5!*aiv(cp^jit^|w^~;{ zP=VU6)~V>4NfwGO)a;A$-;0}>nc=)=2u7`WYd;prUm^6gfqBhMFt9uljM|!o*l?zK zJHlQ|H)uroZ39=Ak#dXt;Y>4ZM;Za&EE%Tb%G9Wli*t! zmUK@Mlti9(fWU9NUI_#|!|YkEpX&U%?WnLlnTQ=Pt)5ZZ+p0$ztJ=D*9y~(*x$Jtf z)kT+9t6`bN&3TPRp5F}dnt^&asqZNbTNio2SPXJ8y&oxxj75HnDHkKvFpXve5)(U? zP82(+Li<5CU10bO8DBNtYx;sCXA8l4n0)8RJi=Nq7S(!Nml={)Q)9=dbm)x5rvuq$ z9A~4UadCuUdZQy$Rz^p~w3RO1am`NmeQSHifHM~2Gy&PR4(^X^GtJmu!>onfH=HTa zj`S#X*d&`6G0ev32vyWXZ0DFbk_gq|tY_H9J!@MOebk@B?yrXr;zB)SqQg|(Kn{M> z_zjT`a>`O>bsUeHJJ#mtCPJNMQV+9G2Xf#WjiO=IC3tCZq@E9xe|;&|2^n+PKus>P1Zeq(l~@d)2-H)hbCBYg9l&J&2q(Y@>myIGxqU~Q&Z*#g1(P4g~r+T}Kx zCPM{+8Ju?GU;?-{&NRWx5zhOXVSLj#3NygYx|OEwNJmH+)6Bo~C=4qR(%dv7Z6MfP z`3>p2Ak#!dLu^ugpWG;={v0jnJNrxqn&Vn07QW%wm!citOj`?^pC!CRTdRqfu_ZD^ zf7UL&eV$M3u6f)*F6_W*CxNfv#ZlN96A1S9Tx8UZ62`@Gfmp^O)YzmTr?IFq_WEwr zZJhAJ$dA@T6&kC$`P}`B)Xv};rm&n9;SNaT*s&vp&{&v=_NWk=(1b`pQGaAYQ=d9X66z88{{@-fUZ=m=GfF+e<*Epc=5-f(PEu@FnWOlNjv9Y%YU>Tx7O8u<7mAH@A7 zF8cc1yaP)JHhJHs2uL1Y32-rlNH&~1j}J3w*rFyvQb@$?7e+2~=P^Wmd+t1{OoTJC zOT-wGiAS8lS!O4XFxy}tP`@ z=Qm~%2*kLmA!e=##Lg<~k13*#v;pL1TYU>IKX10B88fA~RqkviqiAc|{0u_|z9Hv5 zmK+%Mm<(>~er)U^Pt#+OYLv3=WYlu3;dl?pR*xNnI83=WDl~HRYIOXYIm!odn2KW5 zd@REBie*o-;!&|_N48HAq1bn^0S&tI2JHAnYZcOX02-#sGw5lg^jZkkB zxy=$&Yrc$DdM{nRZ2fwxh^GUnUH-qagRT z2Y=M^-TM}okY*|DftUg}%A(&Uy0%Ifckf|5wYBy^+$Q1$(ov6bEK_Pka<|<_8DfUa zCOydCgSEp-(^+M86c~I&Iw(=7^{s^b|ke? zPN2)=vUZe1N>@EP+Acdw+FcIB%VgWWmqSx~EstZ0CyBgH^{F zUm@AP5IdE;j{|2bZ@v;RHtYi%l6-LUH7AZ=nL-lbUe_@tMc-uXr<|jM>$=b22T6wH z2d2x!f^D|5XC+>f7y{uIOoSw#rLd7DcbW7aZ0??67}5bKQ;{~@WnNJ}t`mGkd`{c+ zGPTQR>;%WU#&F~Iyuj4t+>nSl@A$-X|DV?m+7L2#$ag|uR7}9UeqFvJqWgPu5NZGiXfPM|FY?8$Wh&N@53Yk+d+>i^S55 z8@m!c7b)&9q_dC^iXo~Ogu~k@(bi$o`7GpTB7+MCB3g+G;)^NNlGLSvX*);*(Y3o-xyeplqhExtlbq3CB^Q61ga>W6Nz02H&a zki$*|7jT5o?ZhZ12#$8GM8+K!p`(*fXh%wf^J)gJ{XtAeCkbK&&3*&QXrUS;LdE+S z6j{$6%7Te>K|NFr%yt#DLeq(Dgs8_{mI8t3Boo6iK~NHFZFQrRxfTRMx}?~DOwz9T zQ3gW#rjUOe8^vsh^fs5#!|e=F{5UYF)2{Rap)hO?B-1AB#NHpK{RV=ukK2?fM^1iY zBD5jq0PD$1X#gxqC$^n&<42Cwge- zgi+nuuW0MAbIU3om_jMKiJ0VJ^lc7AUa_o@=fKeAAe9I$r)DAXF3a&N5n7*xoaQ2E z`}Q>ZuOryn32^r(LMD;b&`Br}-l-+Rdn6%pY|RJRgZ^xM1=S|tqmLY_;R^?GizyqV-^hj5fKw}e1Ia*{Vq zql;3!H?akXQg+mu+-ets(H13H5&Ufy^gysUbRf|#G2dyQ(jBvNA2Yt#4t^0gb=rKC zvdyj@U(iidJ66h!J-+Ktb1uKTRiqz=br65rNRinrh9h2jYLzZ3WSDJO+O@vNOw>@vIHl>%e_Q&jIoD#)Cnc=6+MZG{H z*Acq$Y^EVk)1`A)Q<~;KPP?f+cOVn>&{!;_2(ALsTthS#Ny+ls?W|WQX&#c`*sjW`Oltf-E z<157c8tBw$w13toJZ5ItE59}d*B>X{HF+As(sNE8N@U>X9``zVCkR2l2WCEr!;Pi{ z+Y8voFiD&TcN+~EcDIB*3f^OmcdV_2>6w^dDB0Hb#qjFebG<{?uCqNMk{CRSx%r>h`C6fmG788e!Z5xHckfi zq87zYa^HDoa1U0>-6?w1j3t74MWE9xQqJ*6pyDuzP@A>m9~uj;NkqiD))o<`=5tW* zl6G{GFHv_DT}yX0aUe?Zf=ZO0y4guSNln#!`k~{s&^b+gfQEU7u4s1_GZ1K@+6{K2 zd|G#I%-67E&H;?vE{o#}49c$GZAWqChS}8o_i&mU=8@>XZ(nNtw);u{eR+l4I{G^( zQuUb;y0+KZUUbL=y4qv&cJ=yAh&z%UNq1Ac6^yZ>RT}t zn8Fm7f4HJEKdM=m@tW9rysorsoLG8zbC`(YMU3eMfK6dOSw>RV5mPA}ikXKWglSJe zA1)9AXsj`DuDXlsH;+95bOje+_dL#r2-w-+oC=Ldg%&_-6gw)HAr3{Cb{xHqL^}<_ z%K?wJID<07agKR~XVPqlTX-yHB3`^FgQpo+R&J$SdtK<63>Z(@U=hB0bW~2svZi z6a-Ec!`|kMs~nueUZ1opdo%12%jE!E|Au)JM>Tj*JnZR9R0C0aA=~%O5x97dZBa$k z1Ka*EKV>gPrGFtKN>S-w$R2G`=^y43?H!~RxR4`irrYB%PwJ={j^V?e0Y=Ssd^$2P zbc!$wIq(h40K?uO;+xQ1hrMOI?r&)r81@3P1rqYpu%|RfAQPol$F@Mid2^T-d3z#@ zUXB;i-}P*2y`hJT`cX58!`{h6&Ad~+7f&8{8RJ^* z9kM3S*&FYu+04O#G}O#n9y2cZH!}9zYu)`DDS>vS7~fDaGxLJCC5Kb9vK+B3;#$mv zQSY*DaPGD2QL*_?#5Wj(9;4d2MPvZp(j_uyC}uX7-nckLB4jT1fZyAa(@r9M5UNrV z^Ae%cP9nVKQGd)X;DTKu@sXd&d*h2RFCm+zZWBCHN9; z8QNBIze zu{>*d%<{!@vIm-s^Kib*C%Tu_x@;r$vY?W-xaJTJlYJy`zQ54Hct$IYXJ-hINsu@? zlV)MkOtMZnuxm6MM$ELKdk-ZsC@92Qw7>cRcy zuy{1lx;gGy2cLvfz}T1cHaw;UUJx&2 z$sU2+{N}2L2%u)kQv>fNi)CE9!&%+M@`X9F1tgM>l(w2is5y&kTXh2SJPb3 zyt|Ms>Y)#4&N6THhDC5ZYGj36QED(r2hxQ0gRRFU;{vcWx7kY#nAn~INXWRIO;T4K zoeCh;D~qHAgk5RaZ}Q*xMGyp5_ioCA|D@p?0P7rcju1$hV!o<|k=U7l}3WIZ60-d7empWIO2APV)acJSGj%oz4 zU^bY+xD^~0(+aa3w-QNDyb&E1Ei1mkJIaMjRIJq^o$}T+IWCpqWVyVh92Ryhwk&RF zljTw@*bnSa9{T$_?XI()@nXu9Y6^mwIJx!2V}$7ZP6W?73j!^>Ab2WN5c0f4@Q6G6 zBTktJZn<(?xPHlz<5_pkjaahgk8h;Pu?Bsid`l5}_; zh`P+7B>)OC@DWH7m4uQAJOq-|CD$YZpMiqBw$)dN2QYy`)tXQ0kCZ^{_57&et_ot_ zB6ft@OYb-yVftMN&MaDoM>}n85~~2CdGv#YVCWK#h0sT+AlAWV zbBg}axvU^?K+Aa-Atr)XaKl1l#265aVOaE&?I<+g%-(pEZEVp{qD;I|92N`(8{Hk| zhK0@;PoO}iXWdgXY5#b?~dM`YJcQT>nG-%PlSfO{cjJd9VWZf5Iw_Q|6UO=C0>-Q zZ#E+Fc4pPgz4vO}yF|C0VYZ=TSSV6B=?pU}9uaCFe6hxwgzuvU9~kC>+ajb4?i<(W5cj(z8F4i<-^RC zTMd;l?4e1N;(dcz+@f{Z+=rPxqZHml4SVJ?UdY9^SZb+D&EK!uR0o1N%>Jx>yp2bn z7k3+hKsGnSY?RX2*B-edSVUO!hdly9TewHDhX8??LyL*XcCEkFz!bx-AERb)5xWJC zLgwLO^kRPhR}FYE%-c7G~ z0XT+TsWu=pdPt&UY_gmTMq$fIEyxxNn59UnSu+VCTQ{w3K6*$pT%$OBTq0h^i5qqu z9pr;JXv2KEgH#b+ZrGJJzQG)txjVi=WVB(|>SYCFyZa71MQ`CG(|ON92h7g_6>XaJz}?mYm8$jM}Vk3 z4lD&-lM4d*cT8+0#=t5F-1ZU?gH|;Xq0~5UiL-+`Y&9&r3L5sFJqjTpb(Vk+D8b)N;<&tkV-uUO%mWXZ-LAD4-5|3e$Mew37 z*$9OMaT?l|hdn+&BIHcO4;}V=Eh@%4ujFBL-%K{gKvlz@Kt)p&rNtaia~|>5$v|~0 zZ|_Cpz@vtm2=q~$n}xa)!JD^&yiQwFqNSi?Eq;^^adjl6m zC#Z3rDfHP>&+(jA(vQ?RF-*y0<}>sD1~i}bY+zZE*+jik9mQs|hdjw8#p$%qMdiNG z*d;YE3~DlG`VAK8gGTN|UNavu8k~6-yYXrKktA)ZN-PJZ=|ngormDmOfxFlf`B)#Q znC6HcW$>VVnCcSC1E<7cV&PHagbZ`1AAv+z#bIh&dwyf?7uD}(7zep}-GqnT4#tZ( z=-c*eAig2{Gp|>C6H2-Y86e^wR8g&aCoqWv#xjWLx4K)hVHs3=Rg!gKuyhqKPcL6kqC1M_!?Wzbh z4YMU2A<%UX|NcPsK(>=e#B<}8{rI$rV`uZa**rI)oB9OLCvpoWV#A$Y=t9>i-w;2K23%R3IA|@(6 z>sc#+nj@Ibuxq|8N?oyW>@-3>5x;+!TkCitCSbmho&8}wb}=x8LkP&-nH~$E4t2cf#QBS-0O#}cP#>=qT8~W4KALs*S1&r0vS~PG} zN#u!8?K+#d5p1^w377YAZsed~sR>Z@Q6b51iM&V|)`jq$9_C*?np+p*iOH}{eZ*S_ zxNexC`G^+@u=*r|lS_rHS?}VFHGQ|_cL8w1&(?KJXGL(`&$f1pA#JV^1&RC|S!%Z% z5vLBe_HGNWD4_qCTiRwFkj4+>Lorbb!aFm&e{u4ZSEOCS9r0)i)(*4rZ}IpF_jBe8 zJIed4VHZ1BeZsXAKQa#9``HCUR6|~CkFcT?yyJ!i+dTHlvoB+1f#Ckey!P5&IlV<| zXpe8q!U6>1k6m-MN6q#^@2XFv7Q(i8!kS0t76@){Ec*_=fro+lc*Zw8F)Ud|jDqK~ zSu5fj-tgS!mk@}@HXdeRiBE7XYB}uU3*^HXcI6j6rsJ!5RK}=ysF+`9v`sPGt`4IV z;*t#W%!^W7bfco9zJnQdC%M(PGQ-^NMtx5+%q8;LD-SRWVU)t9r@hi_@y0Wf?+o+9 zi)zSR%qZiH%luG~2=HE!aRNa-j6j@iF=1eik{RY&8LeA3h`p@MZn+=!vYxwL(&5+#~2}?vwKXq*)bb9Qw-TWsh^z5I0R1L3#Cq-kyi+pc4dh3 zFG4;iuV7f{VNbPD3PP$F41-c96WYxa$J;WCU8|yzSQkTL5A(oBJ*Is>5!kWB0?qBp zWsyW^qe{j}dtoB+4!Hm?j{Ft!OWtsRo&8ARNDMAJL?k<%2oCLBW=qqxzYt98P0BV$ zsUVI6WNXe#z8Lq#JrfD53Q1AWFw+>m!4g{NLezYQppm4S2)77D7%|-3!(_Ot^$?E4 za3$23A)LHm0?{ZSH;XAVX++s=oS%YV4hsTN@$O`L2&PpLTs0&D30T!oMlJw+^b?`4 zzk00mTcgq|0*zcR4KzE9gqAa?Gd_A0bh=OMA}JT~w; zLe#_e?@3{@>Wd2Ho+3(>RX-8VPwoo7G)N>~{uki2xxPZ|76?fLhVAoX_k?tDjLyy6 zTE3-M#59N5dVi4so`EbNVtB^g&a^#OeP^b5D@IJuoq)H1cc#-M^!h$!8g)Ovm>X&c z=bLGJq?KiyYlA+TJYp0ig$2aVi$Cx9JI?sIoi&=lH02|*jYRgZ1%#tf-26;S0}~f5 z;hi*1e>w8_U%yA0{AmhL@YT4to0btKE>uDhn-=r`DExYw)^rs~pa8M?6NqGo<+o=; z)F9UY)-2eh?Pwyb9R-MUqyUj9Mib9$YST`o_ULzbP9ZLymM#Zs3Y`NH@lLBvE;7vt zH74uEWSM^V{2~a52gL%mZ+W#c%^q-+V`G|A?Q?cp%s=m@3J@F+L`)W`pTR??`SD`z zx0pHs!J89kc4Jq6Z!!5>3~D#mysn-1@o6vm2JI#TUuVg}`9?ne!jRuJ_q*nP*W5o7 z&3SbF_O03N?QQ;>eQX|FBQxjrv3t0+W^$Ehrj2NL55OV=S}I+Z@eqWT%(h2v-H7bH zKao4q;#%22A}B?(L(&tmd5D8?J&F6O)1Um5 zc`ys>c5ALaKFwZC=^1Z)n$7cRPI(>)r6pqR$6LCJSOhx*kdH6ICs|%$q?c2lZ)8*L z7A>Y5&{@YG!?dhe0a)N)1FlG8w*YIU+pD8!#l!O&fZUfE)>I_wXvpQMR+!baTkMFl2Fub>FY21ubS@FqXBqZgA`&mjQEB`WR?%Fhbe0F8_|SmAl@I5joCT8RLlMx(Uyqs z3eVtfK0f_9ik-A%kN6$gZhq6z)~5cn8S}Fx>v4bLO!e)NPXb{N%{9dt);+X>*!(xi zl6)k$w%vLhkKKRvH-i90RpiNNzCwN}loRuC|oil9GP^Ul^2!8~VwHnh%!svfP$zu8Zg zibqMAszi|XBiK)B%8~%tj$`KUh=*(dCon{_ zZWfykAT~M^fp_zhsCmG8}3>VGz zzG*C10Nj{hID6+V1k+N2a821hNG|3LbloLoxQ7Eg9MPg~EG4pw*V79TDeSR4x#d(! z1bxJ-@v>3Li*qv{5n`f{I2T@dygjU7)T2=l*)EkLqBVdtm`v)pFbZuIja|&{h!^T* zadA>VkRabIWe!@~3wgJ7#)I?H!!yDelu?}V!n}4Dv=H9dl?4gtTL?n;hxt z^Nce%iG>oZT@I23oLFUT<`aER+JH=3D1j_#B-=WJB@Hp?J*16-kg+BLNv|M~4+{c$ zwX}7Dt&3K#i=}jg++d^H1!ik@L_5Xe>;%H~x;KB~((O961G(&JN@4v%MB!#h54PTf zybnUVn!26`D*MBX;N6VlE{%!nm`{OAT4GEVwAE!e@h3r)@|Q z-R-4|(Nx=zc)Q!Bye9(RkaoBrteHsm(C#~$Bjf?*z2Ovnk*4gWi+^*GrtGHZFytgn z-SH@DA*3n0;17g*&TKK>`k7P@f#(!WaTlJNjT55FK@OyOK0XPJi8SyVA!i4NPJ~=@ zQUvm31y3L-Ol3S7Qw5$h2niaBE;3u21RXEtGuyOePvt7^b~XP(jv)FrkT-fwMhvu# zi}hf8D;aOMYfdjUk^Q>c&1E2sq=AW7n%{0Wpz+P6Z-6jea6y_%p&sVU?&h%Mqc{%s z5KO8a+;HmixxM>yi@tJd~LuUEg4y$M&AF&K0z1{$8r9&%H&du0C_UT2d5fz8#{> zV4|%J(esXPnrI%h(RS?%P{_;u31>$o^o)4)upU6bGP4-A>XW4H&tbH1<>T91)z#t~_`2P&@Z* zX#L_&A>&UDKoeSW348V6ZHbf6sMhXXtBiWYe=N>$lp>G9wZlR<8}?o)zBxo=NwB*) zXm~y2V9nQsZ<@YAf5xV7fb>J(pj7W_D^ADWZjB40XeYlpClK}dxPhq8II;S!6JlZ% z`|&zy`mS@Xvy{%}{Q{zs4{Di(j^IfXJF0Ku{y1s+ChiY0yCAq8DM$nusR&Myf^6?^ zxWlt`?x%uaKV_e(eCN1G^%m}eT#2Q$GjOh001T9h2y|=a#mit+umBjb?le4DxQiP| zs71M^H0Sib>6_rcNgIhA`i7-$eG@z}>5$gHJ|@4xS=a}XsEcd&iJa0ha`dTD475Hq z3eMQ%C@he}d;)df21mp-6h8WqhKDR>@%sbeKBXd?t&0-0b7`$Dea3Z385g*38GBqq z)%g*kIm9JP?q$j@IrH|4AP}w&C7x~mkO^-XMD%W=mZ29vT!!5l@{6)oTgzJcgu&y6t( zh~CO9t8Jj{v!0w{a|Ef@MdHe0E0(Ry>LPJv!}aj=+Y^D>q3r8Y#|v`5zcFuNJBAAa zdrCoY>}6X#ER~BlLWG}nTof-f_F)k%{2OM>9d<+Lt#ei*{P9_4J_3{;WpyG#=~33S zAiGLk7T=~@L}Zo;Jp?Dop5BCrqM41tl)sd5JZE@sVAPkKCMm=UZ3gkqo19_1n z$nOh@S;hAHc<;C1^w`bVU_a9Enp=*Xqcq=QT5}VcYx}Fy@XyL^X-}GtI(SKcxh+Ww zxh)eR`BFo-XcTMknAvtcVj7N=oZQwJ%omy2o1^wIfF+Q7t2sY3_2nG$WX^e}?w@NxT`AX#8$Q>R7P(w^8f%j_ zUi9-7;!b3^IJLMo)5(nDo-*ueS(WZLIUrLQ>pV~j_(;)kloZCp?D4*zPkmz^MMp{A zJnZT`5K?N!lTt^NzN6$Hj_{y0-E~1Q z8wJ_)4eDX;-eGq&-opW6h@iWMbn+Ju@8?J($2l<4E`Dbx=uz^pM*Gmty3AWS!pEJPkY`z#qybtEXesXD1dr5cEm zkVfGAqof=ak=uiAl)@q^6RxIFsX`Oku20Bhe~uBYGuvKdL9vXF_oeq>GMf&7n> z2vL2u%WHfyVk4N%4Bw0qrIbzBgK-}vOJ2mqKT3i}9kfb{7eUC+n#FYts6DNdBW_V`=c$T*_HKGIiqELRRUknPw5Ev zpxhVCzJPCFGf+Zdxh5zvv8)l|0GemzK$hEqGBAsAS%4vwf}Jk;4@LiTa9p&SCfBkk zPeuvi8}g{ivD4jFiHW62i?_(3A?J{)h*1RkbG~Pu$G13=ls9EB7G)}Zu>^x$!eUAYiRB`QLjavi4?Cn^RYS=iFsCLQQ6W8 z0vSwPRM+eUfwop(q1U{^?lr(U+jE9-(lG0Q&F`dAPMX*qV@spb68f}3-AM6v-P+LWZxHnZsTiArV*&l=AUiPxwr8i>q#$;Z&34vWh@h zP~ES3_&y|fRpc`Kk!*;`4YgmGBTuHW1mNVLA|!?cV1-Wr+P_jLdg>VmBLAsG0OeHl z6e$iwPP|Bw;=mDUA@v24EJo&)Gjl3RpuHwCKYHe&BhxTO;-Mq+`;9Fk;g*h_A*3rC zq`v5#m4?vHq^a2~a->RRS4K+8%*>H0iHs=$C1^5fs$@}ngA`qFA@(w9;ILORTLB`+ z&6$ZZwQmH_yQ%=eW0`wXM%V(xot%o$f|kI8#^|RFs`A{7PIqB~y{^d3sCyc7E`x0> z7_NzDvz~@-tB5JML$1DeEcm{AaBDZi`WIBF%zEncYMytS<^S0*ulw}SsBTU0Y1|{s zsGC=#NJJ}jzmF&qAx@ofN0HMb3cAx<^drJ^`bAFk;H|*(MA)H+~VCfLTuBi#_z#Y?i>az3Na; z*~$faH!srof;;mL24<&W(EGgu;8wk`BRE0YX7~2uRLJ)kFBpR-Aib06i!FGO52}?#?9RxDamhvrn60xHsU6V~hiP?0~puH^dLkZsGTaX-pUIK-0OnxKY^5j2X zA-@P?uD>6uDYO4ks4Dv#J`$NTFnW8Iyl#|<>fDp=n#LOTmy$^mmk)JS`HhlGs-CX7 zk2%XEZP}lZI|F@Yy0sh^=`P2fNJ#1xX~(W#cM+Z%5m|| zAjeLZ{K_@?4d*cHNnXpgn$D28Q_l6`$y3*K$E@bMlS?ISJn82vB!n)Pv6yx0N3wQh zgrju-K!TAgR~4n^2ZHT;T|5vt*v|-4dFGMz8Br;?0aPSR6%~ma{gjw?EiWMV8=UXQzE)1nBRIk;$O%gkNW7&G4&og*{L zUqL2&$Wl$CV9hQ2gVvb{h_~)z@0;cj-!zR&h-TxMXkBv{E@_!{kY=OW!+0B;)It}L zg1jj6DuT0@#9K8PP}BK;HXRu3dP**fyK(B3rKj=V7RnW;!TtQc*w zE%Ka-giN7QI(sYPvTkM{e2)veHB_%*&X>bqh~RC-XmP*(p-aBZUPGhvLXbW$yM1aP z5X6){Ny1t?Cu@d4r_4Fpn@X-jT`=?S(8iD{dgvgOS$wqm%KgI!p2OT#ulfdyV|Qf4 zBHkD40bTWNXInxh`xA!FVNPgo> z^$&S-WX>D9U5!3AmWqA55cV1GkcPPojrwM!B9o;!^LPbSkx*F*f@_sTXf&uuYe0~t ziq|}&56oeRk&YmHQ;3>J$x;;u^HJtGj@Tyx5m?!-=(~{_v9i>z{zT7ml_dt66C=Kf zJIJIBiOHfLUY=#{FJ9CQbCTYk$aTLjtMDibvUr`9N8N2lJ>*evr7JuN>VDx-aHT6e3a=h>mFY@XxDA|3lEx(A z^!?M0+sW(TYWP4xC>4d%aknB+i<4`K18^7c{bFq$#)jm6LbA_7roKU+x2A8vqnH6t zhK+XL>T~d)su^XBuPkY7^Z#hm>}>QF8{sR(^LgdFjW#sP<=G7dbI zD!r!ik$t=m(1QAii;Rj~;}gPqgxsL$teN|X2))ND2ZBX)RE7(hLWxxAl3F>3NzrhhuSmFxm7M`6w2C|_0hcfF;D7XB zyCxN$A*l9C$9245dLW@jpw!2wdgAgWZXHYAh%}Kkg?@QFk+7v?-LHBe&O$I9o9BS~ zp&Oww8q(h|tVTg7V~vjFO_G*IM?x&=NTUyyic8mpoGb+$V00v@pC7-WCa-%s&tri0a*xVnVO?gib>g5 zRz`6nB_b2qDs3H|t}?qLU4Jsg86WIqPDnof%cNeiL@BkMCQaEU-NDf7VMfY+hRHos z+sS^V)OLJQG|V%V2u5+JKm3L{>9U^VQ|qT%A0Vnzt#e%G#cwzp*UoxyGR#YJh%?8+ zHlkFx{wzd&zF5!6dg1|EL3l}}gi1*pi8N4x5MJgKWQII3FQl#G+l7k6^T080&LQQb zc_aOuq%`IAleCxf?4eGd2riDy{}}y&ETyc1be+h|gV{Q>6H2yIirirlGo#eT9>Rbx z`r&Jah3qU9*C50EkGB^xREmhk&U%>okFK-}Q4iTVQ~&X`NA5Vuthp;Gq2|t|y&`wF z=0_X=j-iE1P$x}JqE%)JL20Q4nHWVP&?pMhKb3;MS=x$c36*QbbI#IdUQFaj;b2;3 zgVKl6`bt+y9tHQZ!lS5jC67V`lER~?scDrZF(tR5IaD;Ji|aXa$Dz;6fXM*46~WbU zQaG(-6~SyI*Me;=cLD8+*}Awyaz7#cQz`K%);vy*Yr|}esXn8JOf;IK5PznsTrg#d*>dcP2jl%;eMs%9p6&DKQ=+RdUD+7NP{ z5l^Uc-*6W%v`H&eLE=ew<>I&~C|7+XM*J1Vsu=fL5vZo~4GMIFZ;btKTDrw!>9 z5z4Uw9%Qis9u}$s5ec@|8u18gPr~hCnET;|hXEls<^ZWO z!;%`Ko`(MHgKa^ru+w7zVe6bt%BZD>gQMUCQ%22^QWehGpqy`y^-$_$Dbg74dMwfC zfoB_`<`$%V`Uc8z)HKuoFb5!l0%zhtL?_7{qdKonjc<>$ z_f*&S=ok}>F2J{o@{2CONnHuT^aT@`u@2?KTYw+6N{q&iS$qzB;bBvTNyMnbqZMbq zwQll^eX%zd2}|3(tEVyRN}ngQq0+c94tqslkSs_z9cEHV=@JEr{0J3+mAfDjrZLmX z$zR0s%pQ1bgj0%X+~mrZ)5{ymg2aRPVdu`aKhCX7HKQ$altw8?ujcf9?T?e}%9AX1 zd(s1S<0Kin@g-H!#;*L7lBSi7G7;vU%u-V)8BfhAzQ(qucpt>u+*>+*wf%S#oLdw@ zBFi?WJ78{go%CV{^w>z2LFZ@FzELx7UJHVIlY+nqUy$~x6ufx~dxEE3_J@8jISRbs zFC(QZRn7)&sV41E#)^YA*%7Y*k{==1T46|%)x?o_O^~Zh`({!LLN65>6KiHJRS6YF zeOG;V^*}b1B8B4t>jT-*mUtERd+q{cJ1DIuB1R%a>>5{*%EX*)ojMrUpJc8Oa+K{= z&TxezLs(M&*PM-m>d)&i`wICb?ctcSa(kIOUb3{t!IL`2LEkE6t<{O2y{45Wdo2lE zhYvle3PP$c2-ELGz3RBztCf4GNJtzvMG%i(V!+8({6W>U$3iIL&!wiB_gfkMwA+Rezc0_E ziKM7Vv87~=khaS2hVSER7XkIl;)v-N)LH$6bf4qn8DnWNj|ayr2)I~9g74?#M?!}R z%%F->9CXH9pJJeMiy|qA0g$LhU{jH(gW1X#5X&P%Vm}Uvj4+cZGkFSgNuOZ2iBQH@ z_HsrmEC|g21&QEX+$FGjf5Nh!p(RPd@-3atN6ADhIyTTYQ0BtGvi7KwQR7 zb4sp<^|aSE)uVfw=i?|W97%0yY@FLXQDvCj7cdH!QTA3E*pZu+cX`viIL8x+RII$^ zRVvo3va^q2*H{Q<#U2g1SFfpZKrMEjWtLC&c&g5VLi~>d~^{K;x|G4j~u7=l?Uxoo%l-M!2~a5ZH}j_5o# zhdaI>QGW-!@n}Lj6DCIhqP;AW-8p&QUKml^jO4UjXuJE1zejUzkMhXsTY%S3_P32l zZadjwdthzA!5;TLnmp9yBZ`FYn%z9aPjq?gBQgsUcy2lud_ob#C+2Nt@k2|IqXn1d zjtVO-n>_p(ac(d2@IyR(MC}{`7Exp5Z%%@93eHiSn7P*?QDIJL=+2yRv%Y(h5jSbzXdFL`&N)E{{hBif zt72hb@!TTU07sXWD9)|2f(O=&D_kky^Y6v1r@b2APdy|1@d^3(3qyX_-0zzEU332| zG#7V3-3M*x5MDjAM|+Q!yEJm<+R7+TYH$_z9C6zskfw?}d5ubBjcw!({qv7xGb%8|kZt znMB4D3AHa1Q4O=6kG-TMi~H`qWMo`5yXKe4?1m{2+g|b=4&(V=s;RBvDoZ9HG&LiE-`6!Fob>$mB!g2vw$A5D<(s^r3EnLom`%#1=AG&xLxf zi={#z?fZ>HUBk{#|AuLThMl=S3Z`Njc6;xAW@@N$cC>YKo=-p0E8tRD1yGy1&ZN|@tHluC*BPKsS`eCa%3Sg^gw`z4S`km;b;Vou+%M}lb*fk}4 zETMKLi695NkH>7_?>S+pfobs6Mi*V77fccumxv|bo<_nHfy4C4RJLYu6*UWel$!6cCmD+Wv3Pk$bMD}_jaC@8=QnJzoK69Lp%B33KTmWCN0Zw>0&r76xCOMraNHu&D&4u~O(5M3 z(BW(mNON;-M)O^)Hg>8a84tT^^lua+nKD?$TDCVz{tcshE}n$86tkIfY{qpaPg0yt zafO0_msDg2qI&uSqP99}&i=I6-=)vZFJ&`w@G$2OBd9Xc-7n)y>}P#*aOqSJqa9~k znpO2@l7`G6jaI4MAFnuqNYC-SrqwNA#$YeiNWJq! z>y2|bVUNPrf>RYi+Z$EW?ZE%gljs(Q6pU8fS}Ksd3SPdbp_`EN?^3?M2`7J z&h{>KUT;LSsIzR_D0Pt{)W6u`4#M<|pI0a}E`2c_C-i%t*BHWUAE& z@%}){k()JRP3?@tH+PI8W6!&PwIl2y=|?fGMPnJ&o^+^~*4n3vX{|k&@$!$p136hw zKi|j*?OSoLwVNsuQb|GL4zAV{x4E_TxG$^-bpMRsf86Y$#&xrYh*!P%b8v}_=uc5t zalwaq@&&?~r{HT^FY4(Vkj_$&Tyoucf|!hjdO~thu;b7glHzzwDJ*{+W0!i5V~zpc z!^yowfhV9af5zgRSaN_ym~4!mNju`77M9M(67b7-Q`2xCaoN)b#SZ zF0_LD9&xenZmLlPqWCotN;H9!MF1RZR=`C7m7Z*c%`#xAddlddq_^uvkY9f`;Q%WQ z=K#g49d^X}j4`sTc`gs1LbO8RK;ddBq2D{E(7ffnNZS#1&o=wz2tt91tlU#OkR|uk zpCQ{6;B3#IE>0D|{EojxjPU?MPfq{>S9aps{3io5x(=>Ugq<)+$Nk^Gx%+w0WOp*x zyx5!mRwmB<&q_pIH%}<~E=)FB2=^B&p?2+Me=Cu8X~0paS=w*3`rIRCeu*lU^mRMH zHerUj+{@!5Ej5fin*d`^3t(hv0sUsPsI;pNG|Mp2>KJ1_o3EySv2O%?DjA(Q+#kRB zh521)%Pbl@Cie<}=}O%H@0&aSfn|hzZg=P?(tL)EZtz7cu$k}hMHpR7@4^@0LnjX% zkd!$K?#bHBfLAFlM{b9hy)TT32?fCDC}wVV0?CPM+c$rI0rGP$ses-7_@hMhc6B3{ z1%G8kaF(8G%e4`47YsEi0exf0Wm^g>e{hv!>nOhRc^{8oTOl*3srfs0s^UBQM$TUm zrdhupH5p6DUjy~9Rj?3slEz!HOp_?Ky$p+X9gUl;N)tn6NHa$RlBSj>0Yz}v7hIaN z#SyMOqDs4(eH}xzL@WBbddleQ8ViZb1cU&#?+-gf67=hYjAN75E`K+8e_MRzzQ^(H zH2%`(OJg2pbslHYn8(&Pvd<-L)t|00m+-5mF^{b?&Ux&}5{&ioXu68T8Z?@LSV5E- z2^CbB0h}R9Wc+5|j}bNPN>L<&rd@feWLRcs%o!<}R2A`m0||{e19fseBmVbQ4#lx= z2ntG#IYUZPW6sc&6h1QOB{k+q1QtkWdt>j6XAF%w17lKSu1ILi4`c_TdO{YeZFSU~ z{Rs&=Qk4O5y(GhFQb#O-RUwH-jP>U?8<$S?Z0Zl%%2{Q9wwsZpp)qH$Q)jL5`EtLrM6;R`{*1g#=ej1 zH9z}QTbRRrPL(>N=E?m9jd|=xLr6nt%nKO^gvd4Zd<}uz7{$5qn;ShmI|3n+emsZ6 zS!v9ZIGmLZJp;q}*r(UdQrz#1=}L|Hft)}X&Jh}OMX;MH;#xvQLSwGT2_BVgg$7f5 z7#edVmI&lV4|7~MdUzthBQ@s8EfL6$9-a-YLt`#84~@C34m9S4Y%JBmX|?V=LH0=s z4~=<|kItnf<`jy95hqzX|0Rv`>Job@QwA~~9ZCW@me{NWnK9^WX4E%{e(4B|NBc}E5d z7PnGp;0Q0&O4wiVrVPAG-jrc>&9~Is8VpBEPShtu*79WSkyEJ1D}5q3rRb+1ps|90 z%anRfmg3ltctlZq2wAO+;zsKXd91yYv%&q|-uyh)d@(3;IJcB3g>59`T+=vG;y9BZX8dK?Db_aOLco+! zVwA$#u{IYcPza;$CZY()iR?n6=5|aW(Rz!>tsioUSx6VMMLmOT4VIIIkVSCpVCf&U z92FiG)|3U1_4s_YriSf-V`YrtU$g*qBo;{F>emupmDiiYQenqeM2=S%+g1a~o0V<- z)YNQV71`_M+->7v%+9cWl12KP_b1R^!0Ae60gn3(^Z?YxjNz&e;qp}h_X96ufbLxe zNiiUgDQNIznxN#Dd8B}m#}teS<*=n#k_R%}9mD#=Ai`kuS&wE`ZJo&>v0hTR zCf19D;etjkFxhgFz=KG>09=8&d^r%a`iB5TR*pCc4(<>+?_(ClG10zvdy4{H$!;}P3+RMf)|$rf1I5wlVR(nB~HZLppt z{rD&v0`-o2pwIhcse!h3_Spi;dCi;pGcg+*H-%k)8Ip0p?S{*dn=H=mv|gn)^pHWE zhh>cn1hIH?4%HtE4;hH&`9#fouFj5e4c0@^O+9>)!N)Gq)Vy`EyKQ+Kz zcc>}~wkLzN%NBvaU|kRxtShnuQ9U?my)+Qioc)2hp!6ArW;f>o38l4+6zZp+dE@a- z;K6^gAavy9>$%V?WBg=P>1Ym}+PM*}4KoHI`YORgY|Fitg3q|Gb+8=$kC;q*T%c-We5v=MBBC zsheQ~fvL@$Gf@wWLT+5_m42M-^h#sqNQB)DI&?!zulv*<=w6TgZtiW^?=V>V10W#h z8-c;vb)sH(Q$<1|E(lCXr5+fpOY6`@3Ib!Po1o!i!yal}H+#6D6b;t?7r5Dg_u8=x zF2yI7<}yYxOYr zg<^Q=R8V}bkeXVF#wFgQaDZ_dv=R?cv#RJy;zWv^Bu=C_Ns$4XlNb+U(~4Mk4k zGntH>q_ba(OE-SEpuhVM=S&7!KE(aP zZq-)qQ}#!ZS=HzB()`2LY!OH~_E6}2x$A_v>Yfv-__>_$WHeB)EN))#PdDr*YYG=h zbMxZg{i$nVXSgdcH*0(mgyZ%GdCe6*3KcAwFU&E?v0*Y!rhXpyB2PcJ|K{;Q3rIos z_Yw06F~e85iZKH2k2DG^CN3=}1qgF=0nk52cg2I_vYg>@7iw{NNt7XC@lq^<_3Hdh zB8m95qR&0%;MV5Z$AijZM0IDAy_WI&NxyIW?3^k_S;2%=x6Gl2cCYP%*kCgDXb2?8}NgpNQ5v zk@2oa6vMWXs3bXw?%3xfOvzh}kSsev61PjHd)*K`iF41;CXw4p5}|e;*Q+2{)7-9- z?sEfgKyc=R3O8mV$V%tgl zy*p=v;_p40kPv_GakCzXqzdyWu~otMB-$!SVF?QO+pwDg+h<-nos4<3@Q`L9j>* zbDIrCVvivR7De5;&H24bx{8WLL03WfxVs7vVy@z5QOZpKLT&*<#w|dIxCQX`vyl*R zvs)qGX20X?%yGt9m@^YHio%JxY|Dub!FH{~jla2EJI#Nzh_$(JA=N6H9b_y;yK@mt zvGE|GDV823T7>GOIGcn8X?9xvY=qruQGmV;E;%Z8r-Vzz|C9il6fT5;M+?&42m@vo zWEXP85%chiVNkWIz}K{k081leS7F32WFgdm$t6M}4VS_rbqo*^hE2Ztb=OrC;l9u2P} z<}0KKvUk|TiXaQ*LxOApLXcI!Q1vf?5M&jIl!9!oF9cb|(xrf>h^G`}lP$X-tC*=2 zWEE94WJ*O{r68M3971TJ%n(x*4^}`@GlAn($91cY@z^3E$SSNZ1=;()9^)*hLHcd*U5-CO*MO>uM6 zI6Il!O`^ZnuN@M&+qCDtp@(tvI`_R%O0Xv9-nQ6KAd_PiL+(QD%T{0~|97@GbTC>49)HkzZ4pq-kf7sTT zEXDqeouxWvqn{erdvz#|S`@0+9Coe6gp7MZpu#m#0R}`?lBXCLZ&x9Gl3+Q+?K)nP z_C=AFvUt!iZpzkAFil*vD!4E2S(B_K{@;)?amz|l#}(_`H%O?|Cw9JWaSdti`_8|& z`1_7gKx0|}I*mKXX`u!guQ5~(dtTOoL_c$Wao<_i2?|r$Gl|@9WX?BoWX(kGcU$Ka zg8r<<+@F2EvSy6y-avmE`b|pG?A&S#6WF$b+%oz8h5L+HTIAc)0*fQBxNz5W_^@4&FlAk?8es4*RF0&oG2vTX-_7|3r--~ zdpP6^f=yEqKP@T(U9cc=cGkASj8Xd&igxYujUMK>ZuGEmpW|+I+Vd6gOs@z^#zjgRQ>4v66t0;h*HkI&o7Wt z%0k)A<4YuZ`0=UFh-Pan=d|E~h~emLYPaStge7!NHyuGlOlOw6b@D=ZLubIJBZzY9 zOx+QSDHX^%1Oq`t%!O<~E`DQAs;?5%&x3mJR|zoawuX6?V3uxO@NXE*(CrIn4HD_$ z#l2KJh%Bb)rMlW$N4mE@Hr6BLcq6m3bs~%gn#idcTidu_CGKeU=iWJEt41%yaHno% zu~9S&?l5CEf~bt~oj~qD7E_vmtX8`t2!7}Cpd)SLHy|@}o=44h%)CO|O?x31r4YZ* ziQ1d}nQHw+TcRI(>f-e< zq~|nmVQ-6Zh4Y)%-w30iX3Y%OnXPYG^B$$No7&Rt?Hk2Qp5|qIJ2F`cW6z!2EcokD zcQ@B7IeqMfbDvI*S$Tymur0xKMUh zUgyI6S$Unkn%>XK>v%v|oB<-i!xfi0#QU?-p^J@YrBxU24LLR;(Pw+ri*Ysd@YL9M zv|f+~gtTE48Ku-ZcuR7~eT%ce&TjDeJ2+dmZgbb4oE9fh_F3O(T&jl=xTno{aP@2* z{Tcha&s}5RF^65Nv!6gT&(HJpE94iWg|p70ow_ILK1GS3GW(Xu;k23j##K*W!}+3L z#h4D^=qzD|7XrG=k=-5iqLE?uD9rHMVO!L!k+lsy?Bajemj&55`b18&rFyXAOIs#x z9<@K@6WM1MWRJRHF6TKv6o!+Wv>I}hol{BUPi0)irc&v`bl_$oIwa}Wn zuzOajC*LZ2g)^TB*DH4zS2>X-v7S+mAY2`}fz&30#Y3?&JEd1G{)ECGile<4i@iU@Q+hXkd6KU7`o1Nb*<`jqpdv*k*=ywFukr8bz zWCwCYJ$_3Qr7o7bToqrlxUtmf7RiMSesj8AYatiwIqoQB!L@)yY`kI050D6sx721K z5gl*tYU_wp2y@Sx@r}j)de+m&t1ZuN)+>jz7a}KSEVlfdyO7w<(?XR2iP@MI-SUO> zcd4$KXU(P#VZCCWXH)Co!Jh9d5LgpDgBsR-1Fg0fZ6wuwLaNS>=)pzj_nek3q@R!l z&CKU9btP%d1CfEnfz8Y}fuK1HI~NFae)Gb>H_-V#_hlf^`OTJ*1_GVm9mHKn;FY=b;kkt7Vv0u7+woZM%a9W&1*=K#Daj71rcaYAn zSohhVw!izlYwXbZEieQ}dIHfrKhM*zkfQTr&Wg^TqbHTw)iQbwo!_pOiQHI2?p@Na z=XwT$6>CZ3H+rOzLFX^y!0z#kq1a)e^XJH@^LvKV$G$Ac&e11wqAk^f9bejlj-CA> zpD0`tx_Yh{_4!;?>ijty`lgGwv7W9o1m{)Z>+H|S9)`}JtD|w{i2)^4_ z1rG&Bb+j$WTdn9UXISY(m<2)Y*hSv`=$j(%y9kTvi8$&%3UDH#?zGq!w#Eg)*9jCdUXNXY2eNk{9rg4b{W&(4Y9U>i`_BM^ zn&;p*eFE88&xlj_9?ToLv_mtUbo0qZDU&=6>Fl#bF}od6e@xCaq@6@s>>LKCpJuml zfI;7Kq3%OMD7Hyr`R*!GYHwg&Fb+KmH;f9$^HXwdFubMe7 zXwnPmD%GRZv8j~v|I%lDqj9NbjU8H7nIG8U${a#=%Q!oK+(HKH z2|HXxPK--y3K^p!_x<{YWcC>WMSXmtu_xgnB1IuQy_2WPQjt)7DiU0!A~#AglEkzy zP+rRX-bUea8PSByJA8NoX|7b|tNdv(6}=Q=oRC##tP8U0jE6y1o$*V^sxz*}LQXH` zPj-OZ{*6N0%x)XXk;c~72C$m_0n8IQrb+>^SKrTihGv6p_3PcAzNtSmO0~|K&D3Ft zG1M7jKkUF+NE70RS80zsde9G)I2qZTePmY zH4C|;)S;OdBB~?8STYn(GIC6|ezHFhYBF*RPwk8x!&5svB1aLRGM3D=C}#bMbj(jd z*cL|$Lqdej1;SB~4%-}2^T|EfCe}jq+>RZydJDlQCijI9QMizPYZR!bcOoH94ztm= zXMdVzjD5Ce5kV~j)VuRou_%*4;RmU%%_t=bcmKq*Qn-cubk-^ghZ0e!*OE0ysbtY$ z>^F}>vGIH7fkjq->v#(DLq*2+{-&{qswdRq+Eysjr9V*9%dRws5P?R*Uk!n|NmTTmyd(gb2_dF{b1A#=7(6-IS^%uriF#@ z#IPjc@eRl7p1Wt|WH1s8yD7mw2qQr`Rorv;eC$gi;#-N_?|O8CsVzpl64mDnsn6mr z8kgowV;4_ym(V9Nf}#u3T}`j`v`=k8Oe_6?C|CL%Mx~7HH7zy6{un!VPtK3N(HyEC z2H}(VnQK9zHP0f7jb%+c*Hr5cA+gZLlYYKJs;YxkA} z;WKhgME9Vvy&_>qkHl#(k_Xo*2zHfXEU7>KzO|ao%bJomc>X&e!Snp()(dIu4-rPJ z$a-31>)7{-MnN-vMx&6rsAv>9(p^1-G@$qt@ha(oXbwLi*i9dw_SchJ-0@7Ra0@*L z6>s3r(bY7k7xjJvor)33$bl}&w3#gv*?ig?t8AyQ%xUKcto`ci#e2PR~SLGiVX|kBr zoBjgu=&%6i_u~QF*Yk^gQ$L(5xD;8vEt>6m00Ac;kj^S!4 zyN>(s92_ntlUw2TJGm7uzmr?x?px6}C@+#*;oe)(Jb2P5^vD0h-j%>Zy>@>gJK4%w z4Q0*po8`AjWeY`RYg3ApBnoNQMnxhmC`BcbRFZaWgwjG}Y2QPu(k{jS_h5#5=Qne? zf46rm?|naSy=v|}&w0*%zULgKA!ZFpVHUkv!$p`i??x$a4RdedtmcY0t3j0M>$2LK znMSbD#b|9OSmQ@Tcm`g9GD8Oxzf$*kY*OBTfVkAIA-;owwMg2 z9I^fe^DfMP2gD2_sLh(0^`%XxfKd3a=Va;b<_MzEv@~C>`Q=#@{fng|`9Vu*yO}^O zmFGWmxJwXSLt7ibM*Z*JOcVMmNfZ>*VBP!_{Bvl8nbO~ve1$7V_af-&U;YWkNl z@6jAw5K;sEJjf)&=WU+PkS<-Q2v)ELOMhEmOU;aCS3cTX?_u zEn1|b`T1IY@E7)IbfEmiAPVqza5|Nu58N7@@apx!`dVO2FbWOK^CvX7yN{Tm1M#cH zd@=i`4*|nYr|1J05GMpmAMAnydKLzs!GP0Be8y~)n4!5N#n8%dA_avEttm8`p_!dI z1v9iXwDdN#uroF`wDX@ebB=q!e18fRHZ-5_z0hag0^%&%M8-g!hDdruWbj8QHYQm?KNa@(*7mnD)ypvwV<;uYudeO`+H3d7T`xx$1OyeOO7pijn2shu4e;P_<>nMviK}6$%VJ zVc7Kn$P*_R23!mH9>jH8k)rjr5GuG9*0yUQROYoVlr&%KJ8`Yzq$8A33d&ED@^i&E zW^b3+vFXA@uc41q3j&XpQw~S3UX~zMsknFNpiSr|!Ii@tetesA!T9!)pVODs)h(YN z7bP&94kX5=kzI5Eo>iZM-1DykK7WD5)HZL~pym2J@lg^Ifw_&@Ijf#gi5Ib9daY zj8s`+@$tj-6F*e1O+2_ZE>}M)ba+EZR>bhAX}vVl5*9vpS*@-X5-k$bTlcVLFpGxb*+$19ojg3NmVG#M-NW{B}XPw!VYMb(BdV!L<4<`+r>D2Xv=lZQh>!~0HN zQ>*6wZmQH|iMxF?CV%X;zZ@H(xwrgn=nAi`b+7slJrqHYzg+Gu@B3hZ^|!i!pS|q) z?>YtOdfpuW^TlG}g0dow6dm7~ih@JvSEO`9; z2!_4Ru?U}cKKn>Vp~0_Zi?2bZv^|-B0KHUaoaeu}(d{#yozA_Oizt648Nr7K2(y$J8nyEFp9@ zARGvt7zkIT!hqVVRNj}`0O=cPf3IQR9IxNfa#P-ENbNLY_zQ`QV~qOLf6V6tpXiIj z@7&A9;;pU-<2%ae%M4?;@Q1IHE>X*O3Zdm?->mS}9P0hcnL2I#q1{K5`>n4mSUON< z%Fi*HgKxVlHoWw4{bZ&GImXf9fr=&axhD>r*^V>5thnxr=1!R}j^B<8INK^6A0zBu zYNg)l{$NS~9k33FlHf*F4BGL5PU1iTq>*>Ucixw0ORc7e2)V9k2ub#zIZN#2 zt*OG;($(|Fu8Y;F5X_TWTdb_;UpiDt#NqluJ*~b5$+g4cWGoeh%$FP(Z65nG&m+Ge zdKTiM2Je1r#Nt`6LG{c)@s-vdw?T0i|1$AB>9*uRgqT_C~F0H^rRnqIoN~ z^jeWSkAKEg1>qGUGKouvZqCkANjp86pG1~< zBIfTKRxwbI%!o8!wJqBi(EYoXAos+mGg@fu2j2*4k=@);`t9I18EXxpQ#8 zTg^$qQ-!N^vJa&=H++l^>NkPz9d$U=;(zD{_8p;_?nGf1npUP5EL=zFw9agb zL52i}2}?x>BO;KdYk`QChH<(U16V40TRDMcsR~L>#j+?87R5Jz_lb{5&F<%1FJkuS zr}~y~UGrWOW?%m0ANBpkis}IKrIvnnkkbp_IYavV-mvR};ivC-h0ny=4SRYIrf-`q zbBKS(_h%7T@5pUfx>2!ewn%9Iou8C16kpREzQ5?jt5i)x!yl#-JfzNTG*srM@o<3t zqA|LO#v>DWfYpOJI$Yge-a-Bihhc(bU}6j0=%i9XK9kB(;2AKWSsR^H2F#?{$+8Hk z%aDlR(@*t%9u<83aE5=DWrSu)pxcmP2cv!+>UZ|Zs?y2zTfS>u3mIE;;9a8J`SCtK z^OqN=xevFGA5ptfxoCh@@z7VNg`jtvN|xlF`8=UE^-^k_cZH~9YAF3wwO))*#M6cP zg+E5=J@G!g@M?_Ip7Q(B^L8zL?dz9TaQpen4dPRbE+3e>_UDPR9dgqi4;Vf6ux@6} z{(_2wc4^lt;mIKxb1%*R$Qb{-N?#(d(DcchkeU4t*ak_wpZfZRw~a0G^x#2!={)s5 zyW_w0u8TKbGA(Y-hr%241Ae}&-0*A4ieAw(W=WA)-&TPT6=Wd@L(I+k!tJ-d(Z#Yk zgeE=P(D3TS7^m>(*=q|=^!XVj`c~JHUusR#l_}}{69;M4-fY-9Xb^s2VATtAo7h0( zC+7Vh9P6JJ{MbS2#JOtR`qy;TWA`KRCC}zxUG%Hm{;h`nPd}?~4cYxCGCr)XdaD21 znNm4PCO+rdV$rBEL95P}<9hq5Wxf<;R?_A4#}ql9gQ2@>SE*l36nib4v{gCbz5KpS z*Y}+(7~V#VH<3Mh?!)mX2I)!|)oJWhH-HR4_)S&N7^O%J$Y4@!2axrch}+ z2F|&>O$f=8U1S+@L~hei&x0ZT)sw>Ryy%_d6Qamn(y3rz2-+j*oFtuT16#R+RFE3x z7-Tn^z_xmWtxRAUVFDo$3;PQV2|l|lx6QjgQRLOn-hx(%nz~8e(7J~+vFmwZ#wC&! zn%UXG3G=@BPnvz!Q)~CT3s+WMJ#j03t?M9d`i*qHkdUQ|Z!PuOW&9zx{D+)t{(%uU zYvYwJ_TDqM*U=q@GB1w#d+*w({3!NeM5)t<`g^_+wMMFU#gt2`)P8FpGEP`tBmPFq zQoEHz0s_#8c$`HEf&c(PM#DKV4GQ9Mf(&i5kF0q7QMrxmS|XORtE&$w)XPY7uuH`*uMQPmkbxM+rz&4f!Yi~3)B zd<{{*yMFej`0-Dz@PT7%CrAib9FPzhl^d@%cA3A3om-M}!|G()(#(L&%~L6zy4WiVcFYYgF7la!+XXt2r%+3q)ZqVf}V#JzRQ+ zPh*zL=&}>qQ&u}pQBE3bzt-P>*7ZJRDRcLkjGTYnVMF9N`?C!)j<5TPri{MxIK}z< z+-os0eUi-8=+7q!M=8chaAs%PYE?P_=(2)dxcfRRPOaV=PBiMtZyHF z-Ou_Dx5TK2qjcy&X2yFACa+Hd?aPXx`BEtr%i~Qu=r!*jVUtv^DgiW4I0wm zyzuVMFiWAI0g)o9`Q>4wZT+NeYox9HWGrfAOhh+lTt5B^yB8LWT6$gIIlD0Yi1vAz z#dcLX>B#eOb$UX%QzO&|Jq%YpK_+u zqm*UoMwZL3_j^?%GlE|CebjHC<3gY2xJ`LrGC0XFdCMiQ*Rly^vzIM>p%z&(awYxb zoWZR~%;fskh8d+ZNlcpb#M@z+5xhmozL&a8k?39Y==&;92ITsi|9;_!ebm)otR?1V z&pLJaO8WLU)BRi(C|U|ZN;$K?t?y?U60%+-P)b!uJl^GiX^@rH>YJW}!U@mSwCfIfb$G-U>VI#@I2FJud#KrN zYLbaRSTDff=mPbKe>=sWm2(86K;Xve4+>EGgnvL|U;vp%YQEZ-g7|C7QBX!&(C%x) zK%d!1WO4)g>M!5nYhtl7UxVy-e z7sF<~cB;;l*{?i7ddyt4?{hZ%RC;-MUhu?}(@KULq<8mL&d9b_8lpH@LqI;~u*9@M zM>DK$oB4~%M9WF4=~+@ z_+6`W5e^I1;;@ii2H>?(Py_m(UWUYz0zLC|2F9HgdpxOj#ow*UQULr$JU54D@2N|1 zNx6X$$aFeK&g@CKwJGJswC{8k(%iFt4_qH52-Q>zzKj}gJvrg5y1AFc3iZun2j@>n zrmUxizEst?{bMKp99g3zpTL(}dgoQCE0QQ;20#WPjqxS`Tcb3DlXNw@ee|{#)>&>} zUfDgMyL#JIH>_f~I7Fo*JLjx;Bcd8j?Prl|vG>Rt)Ia{2V=t+fx;a&0BlA>U$K&&b zjnDM0bUc-yEp$j&w!-CXqOFkJ)LGT`yYpVnH>k3ob9J}+uCw+B&s`olb<>xj8sijC zA6cGweOCS6nM$7>=S6)Q>e$Duz$uJ!WS`tnjaf_Tzv#&Iir!@(b|aQ*zq7j7Z`hVR zid@CnIlm@nSxx(JW5YUs#+x^U+(&l}9e2m-W(uYL@Vgct52-caIvh>Z3F&SJL)))NPJWAb_l+ zbucxLlt1ft8RUZiHB-y{AVc5y_uKca2-)g}-F08dpIMP|TJc`lsME7Xf3cf1BwX2F zJl-CgILVYYTX5uB`Xt7g;Du`;O6ZfQA3F}j7#@&Kj;-0BwRiLnIdT-HX)H zHGaLk>ZtR%z(Zdz{2q7x%Jl7rwG7pd{TPybZuZ(;E=x>36{gZW)?p5xb;Kvk*DadM#!1JvZ9D1Mwr$&XGT;1*xn@_Z z+SH<|&U4PWL7?$^myugPmLB`!z|ajr!19PwF2+88jOB7c4LU$VC8pW3n@W)0W$?(5 z?yX&;GXyQ*iw59p>{pts-wl9-@aJU$U^~YJf?$V`{!L5l9`G)s5 zWB{S;u}4E*3>w=?HP(p9+t5G_>WV4qw|9udeY%>Z8a{jLAD$0t0n6p*V$CtuHRLW> zoq4hSpQ<=WTqvH6>>S~{T<{?^90Xd8El_6)GX>EDeG2w614%r$@#i`koXh}DgDk~L z10yoSh71c>e5!yHIn|Y(xds-WRf&V?`SR-?ySpd2neg)=F5g&Xrt3EuOyTfIwHx#| z8Cn9%0NAH6uh2-oRctUrf%|QiHyNmJBE?23zcm#`yNu7g9qz&6a;-^_!b9RT7_GbE zoP`qi0*ttt`W_rALfFMoN80C9B!32ipr4J$d^KU-e!rPKDn?`3U$bUQUc6 zz8`76A{>qF|28!N2@G*edWBC@?E92`!1A}VINw>zL~M{8%w8Yfc}#g!`tL1BMBeX4 zUzl%^^7lU@`&*d4P|UgLgC4i{>*J#CoIsYRDfP1T@I8)Eb*ulcD`e&ge-E-M+aj`W zkV$E~Px$rs=nOUHL}kz@l0pt=0%_}w4pM5AAF(N&(B`M;-dm!o^ee@p=$)WH+F;J; z)(Zm#25!iKbB0V_S83!#xnUs1HTkcZy+&<-6*!Kp6G9%%YyKCvlGph=XKfGWDi!*0 zh-=!!cq8n-M1q)hlij~l!nJyS3V&ygY?daoSD(az2}G ztjdl^D{3Ua#N6Hiooc#Q`I;_36{X`GrS6?4po%7sX>4|ot^U=q&|&FXV{22YL}pKO zcC(=83YD*Y>>u-H%E%RZ2E)4GuIomU0Vf~r>c3HMYAGQl*#}ONEQUX z3GXx3{9jn03TF>E6u`D9+826Ld3Zw)e%zgGh68zCo7RFl!Cvqsu0N%Jm2B=4%60s) z$(XWhdKpD3O1kwWq1iocME!;Y>dY}9Hjq=)s!(0)I4wtr>Fv5+Ix2VHO%<|s7Df8} z4HPrQE4Ea3sq2g1HNaK`Y-qyJTr?v4PgLTzMdqCOrZK(Mbd>(BH?hxwV25h%9Mz-1 zy7R!kJ`d+45KHgccZ^EDLV98^xbrTo__4NYi^MNGBT1zvQxDhY4>*%tDQS6eN+V&3 zj$_Y5j)Ko!cJPh#OUh#BKiw=h+SmM(A&-BUxB;#f+;E4%Jm&eyy?F*@@R@K$9B{ID z@#gF)y{$9sC|2$z=9V6>tm0=|rq-G>C)OMh_rE27+O1kd*!UJDR)t+|p=qG!ZXcJ* zBLEHa>N-QtS6s+HVfUtLNCWGhX3RptFVpZE7$&}eMO3JGB^=vOHBs%6LD4-x3q{tm zE?*n1G@ESL%y{zlxH?F*G`A?(3S~4k5il~eNi1_#JK&(fI9heGU<9EOEackfTZ_GS zLqw)mu^_j(@Ak%gvuM(-5AT#uMwCl^3_oE#tDsHOe74BqN)V5za*|t2+YIG-zplQm z<$yRX$05gWCyF>*GdT9i{2Q3TfBwQJ*|p9j*?e|RP|ZJ2R3jH34(~Q~oY>Un^c;1* z>XFGPpP>b%-~?c}xY)lJ^BCr_y;4o_bVt~!E~I?7^+IOG$(|bgmPG0o?+C<+<>rgH z+Od4$F9H4lEM9CYW9ip}_nObO#)cCVg;vy?CDg0bMJ0CT2Ox*K5$1gl?cC%k_R{;> z8OSUXloS-65O?nwnCaG~>E-iUM%gBfr?qocbYuD3< ztMS>8?{?v%7I%q}3sLGG+ycd{WBUww%x-QvF(&-Ogj<@s6}+Em4x_&UPHNzC=*UuZ zWScV`4);u3ophSjdGQO4=dIS8kzJ{qs3yTu|}eX`oZsMWCldF9zP zmlF$5y0;mDHfzaIWBM`ZQkHsz{k-0ML#{F^eaOc^G#dYPg6K=ZQ`gUCg+}P})~x>b z^^A(PLHa_k(`ocqj(!}8^K=vZdZHeuHgV)Wl}-+uhejqhA!s6xVY9`#zSHMNgOYM3 zY|PC28nR^`v6Fr2eh8dzbzgir=`&oA+nb%<65v`a``NK&!;fcspW*_nU|8N|6jW#1uHR19`-r39hG=RS|MR+RE=e=H*FGxDX*>s){IHA9|Rp77YLJ;N~Bms3O<{cx?e zZpz9ALMm7L_;b^KzpexSTq&ND<3jBYA1aPTC#ID0)vCU)QfA_&Ed1T@h@CsQ*ij4uU(c} zY6qc{w=R9ScGD8#Zy5u-8F#z{=x|C`IJ==bIC-Vx-FUgO=>`G?h}k>QSok$$g9~4G zY!nyR793%!jNdzM0Jfnh1xnf#zeWaMK?eLRupM&?`0TPvKRbN&NBBz*uRAvMe;>?J zbsqrQQRH#^aY0$M=h{CweNu#!5v0ljkLgxQ1bx4{+>3=Rn(CFbqp14x=0sHY{I2eZ z4c@r;xLnA-b~e{GJqG=sBFJ@uk?$Y|a}Y$=6A?tewXPFi`?#9uj}m>v_gyPbQSmls zmSDN6VV1KEFbK-|96oOsh4pO>yC>CsyVi#t3}l$A3sI^0#~n7=G2v#_Y+g<^jBy~ zR!C;?FspA|X+5oNmgCbKfLthDCKik_yes3S(q*QHK9b?ZUwHZ%p6|78blAN7h6X9t zT_-2D5`{&%xt%S*^f%~yl_`?G;5Ta`rq1dv=a+=&y#_ped%bASApsYLF6{LS*?rUR zNunOia5MRJfv>?;F~1iOFEx4FKgwR_L>8c8 zw5AXGWPq7{+}YrNE8_Omoq~?C=9DVI5ADFU=gR@y-Diu`lpM(D=IAgiln z-P+`8X8d4z<)wQc$BFlicrhLyo44-S3a%M%F7oEssI7s%eZw5H%+d+p>5b#u0-cUw zecz7zrq$}gCaWu|Pv)!`?35=fZB8u6Oc<7D715Q+;|6+A*ahY?6>wl`yMP|`*Nxt3 zx*n7A^IEJdeB&ivekFfS{Q24XOSZqr4B(_o=Z}fILDzym;nFgLhp|XL*0#wA0>!8&BHmd>*@X!2O>qC#DeH%fcc(eq$Zi9`fJN-<7{;5%vE*Woz33NO^OW?> z1t~CS0Ys7qtdGygHn^f8F)iq-9G~V132#`m%>bUH5`6+11ACH!JuHnCB&IXiX`dT{ zry)YcD--UMgE|S}XL0gg9jpVdL&u>u8YNZrm|C3bx2qnF6FsH-2OxI3$z}vr^px+9 z%xf*3H$%R}>ZX&V|DG2-?!mKy-PR!2>@|otZKb~f z{4u8vMTw*2!B9^@wf;d`^c9h;GOsN8W3umZ_+?8$WvQK6Isg z&rBoW+zGT47`;2~Rqw-hHCqZnL_wU(q7ZRO6!`;_uQMR`#`9gU$;yKt5F=R&|KM`- zEnF3YwqTK{a6)r~UhP1QQT9ATTyBy&`~ zNU6c?@HymDkZmto$5VnV#LE%#AAUnb!mxRb6p%Zm?1#@GUT@fMOXW85Fiy3q=}a?S z)W37IR6@o3JW$5Q2K3zbB)fIQv3St)S_XcT1|GP*7&$NTZzh|y!3>>4Z4jcSNNKir zC!thz3?Ot<&b_qj?N~Sa*kkA_uM)8>7!9p!)@2SRcAk2P_Ix0Uk1}q;!A&JGVD}?n zA7a_jp|>CPLmnmKQAuHLeQue{q84!H)-*>rDW4o@*{Zjd!|ti#T~~C&egn<^1zXGt zb_Xf{Os%LYT*}InhVSsVn@+A1Rig~ds_Q6akAJw~HlqY`#)R=n79GZLO z!gjYP`iu|Dj8F=Nb2JdP4yfDyE8R|KLlSSO@#@y(l^(yjP;RUfE0ihW{-NdXcaufBu4m6wqD|i1D`ykp0>QiEOycR2NWvo@ZGNH{66WWt9_wAAM2enY8 zZ&qAAr(+YJEsVI5b;Go!Dr|X92Rb>w$7`MKZ6p?D;@Oh}mhyLJI@mq17b|Omm zq^EXA=xconkLJ$KS3Rb9iXhE`IV3#uri_se?R-dJ1Q=8l>$s&>AI;udReBv z;w@Eav2N=P3RSZ`lIed<*cJVz(C=mvqHM|_WiU`*VP+Qn^xU}^is%=0B&A!7a1PD# zD1H#R{GH2lA&xIup=zaH&$z*1VU$bXc&BnITKl0yL<(H7ID27&{h+)Bc0#a=DlBM8 zcfN+_`1mXMi>-;ZAm@H^rJBo^>)Q&iYgZ?Qe6 zj|PmF$lGq_yB3=-_RKvQ2D?Jz{yD|Zffg%ge(bDjwXMsBVoEl1FrN($#C*@(GAl4}<>f;Tog@4URVYp?Z953lM698rNtA%; zk~_B&RuhkPC&iwijHf4|9RU$j?NOm7K<}=8Kk}R3q2}^Yw&kb~sQy+2G+#sVY+>{A zTmK`u5<2(9G3{0GWy48HAV2o%>eCQ&iyX;;P(!!mL!KN}sGNIU*{S>roU{KD@7Xdv z$3(bJq^dc(ZXWTrWvS4h2KI3YU{)4U^=#ko9%jjr&_Qn&v<=ugpDV!x0(xmX4;G!3 zV1k-R`MeYiQ#P^lRAy0Ua+VGZjfF!f4Fv_Gq3{eYTh0nBP*GcP9yBef6LSH!%Bp;{+1W_Ds}k5y@H^L5P@T}`j<|H`_+WpnGY=R~JZy;?jXb2T{d%67 z>}j&Q$di-7*SGv^|N3AwofF@AEM4e|BG*5n1srLjVL$NP>CA(rYnR4QuzmKHA5QG>_Oh)BL9engZFPeM%*Df6dd5<~ z@i{#0td;Z~`KrkkLRDv8-}~p)EIutBJ)vrjN^`$fpTm%ysiyB7dqO$ow6}x15dj)# z{7bdy?Diw|t*KeCiPV@EJrAaI!h`%SoAKMSypQ_amUU~N45<&(`^2Aw2zxqmaIoQj zEC#I7`yf-J@_<%>q#$igyYdO)Dmq*V?DCqBU)u=2=q_8toh~}-K^z(V<~^TknK;@Y zk*pz@qn!N4zcr!|sP!BtKqhd)l#~z_t;5&%Pag2iH{9E^6FhfNYZy*P%bzAsi zTFDJdRI^mFh`WGkiw+_-wp#BYzG}fnD7j5)>Tez7Sh%;gKNwHKPw^#eJ$>m@V#IA! z$%S3|*JCO~?Phl!zuNj8!?~JhnN%T`G%p1wdWc1Y7+UUYHV4yVy8FaVX|V)N^17Ld zn}6f+FnTx)c9`h(_IYT+HTdg^wP7`7NQDW*B*XhI{#khUl8a=6Emv9mJHBnbAlBa# zAJ@be8WekBSzENUP13k!)w@QtPZ zw(K5sOSS!^(5Mhd&wrfGLUwR9k+&Nxp96W6K+$&=;rNSys;dK*?wFKgWMnFvtM;3= z{WKghJ$19adF9ZSn4Q_XU0a2_O$rjBs^b(T!VeX$Et7EGGR45p)L_IeEi^HB{k4N!aC1*MY=b3w9OpgMd`~R#OfqK)N$H_jQc-MX*Bc!XBQ0|3pV*g&(Fh{=%l?Q zazfwBPrQNiu?>3vXi4KOv$-=R4MtMO4?2Kn0!tdQkhvY9H3(jFRTidBHV8szKH5LH zY7?$QGG@M0Ab`7R7^?t5V)= z9iF)NU!EFhp4DF8Xy`JUuAo$^vUzu?(~_>A%7YJ#(f(lg+?+cw2ZOl2md19KXRdvo z3b;dnHFslD@Ja>N?-U1enuB4+)-Aja3H5qgXR`AWOimjW?h<91&3VH?@yYKi;9x)n zns6$P_SK?2UIzCbsN2X zve#46Kc}{kZwa2a)jLvE>*;j4j1YYueqz~?wJP7Q>HC2(Au?m%7;P4UTo$KmQ0D_4 zpTNo`%zKP?`$$eFZP^R!z*?$^_^7xv+SZ{&~kbKq;ZMqo@ zzOI|_HMU6qhlmu)fHwLShz>yuA+l=tC=loG7Xn{r0VBqas^hUTA8vBy+Ui)&K@1`) z0YW%ko9GXv(IQf2BJap0icp7*Co*~*1H?+~OFmMn)9hf&zXD|8F7p*qXPZP)*K%`Q zmSjG`VgGLCd5$H4)_@r7#e9#+fZxGk0C{u&qlXEdkYluL>o5!5KOi@>sev*w7vucU zVFeZiV1OXS|0|C%-IRr2_#EVH@{Nb0sKhhqZ0owS8r`4gAm@p{!v-k#CzmIO$_WkO zA}FvV023W5CtuLQ%a;0A4e&@o(?l@_Umv0m@g;IJ8W+iaveN|E&l|CdrfMm_lraE! zd8%hn+h=OiXy&?-CACv{MZ&`!zd}830b2-Tr~*_BUEgnC439_()qcJ;gdgvdk-f7g zjlsXBScP)gy0r*aceG6}+TP5)ReY$1X?0a1HXn<$O7pBg)Gm;mx ze7_pa~afel{`)k9SUM49v#Jv!h-h$GQ@GSvp9djO^mJSTkVij|4#c@ zMr%|sTBt- zA#>3!<$g2ig-{Y*6{@xz^j(kOf|~E-s@4lAb`66>>+41ug(($}$b8K`0wN3OxtT?x%?RMC7XxYX(Y_-?l5Fr`UMTMBsvB+vU(p9egUrTM* zagy72fN$E5$^yvRH!a&27Om~p34QWqv2Ho1g7NXPht;(>YKecn&VKU3Va5|ix z+M#ldI-D=*lwb%}_kloBiOMX(V(j9QMez~HI6w+J84>Drki3N!bH%0f!{A!AcBBG#^!f2E0Wc?Oj7W7HG z;!mG*f&<+@Ayo}|$GC#w@D83GHYDkw)dfz<=CI4Lo^}9|PBU6N_?*zGp@x`<1e55c z@alT2TGWo+T^nC;t=&2aTJ|ztn|vY9Hq4f}rDTYd(+lLC)0;g8%%*(Vy0+P+a&wqS zc+JYsuMUh;PN|A~tG_IcPQQe2bgCLer>(vCMmjE#?!4rx@f=f_d;%`iGE)BtW&e{( z4Jexpx9Z8Jtp@sL8#vj_aBcL>%>3Twbj}G~dV=dQ+ZY!o&l2vh`VkklkUOPAv_3T` z6A+`&Vs$v;G6|$XrF?Eeh<~VIoW~$|QYj;z%KM?5`OLDH_@bPjOVb%u_RWPft@1CN z8kcsRN~7W&h$+8HT#;3gQO2QjRo<|AB@zFC?)gnaTY~jfP;hs+o#gX2?`w!ts-w3o zr*&lh<<#*m_;8R>yOncuG3>?mrlM#ElT&lAEl6wZs#;9cxL}afOY~`BzMfX4s9Lx5pR3JQ#X>RiX!GAb_991hV)y}*iTCd#OlHgyJI%nh4o}BkpW>u_9e{m!1a7*^ z$?k@_GjV-whblgNemJK*D@xcOJDov2S*|5x+?);_nidrb?y_B7ILzngZr<7KtZr@DH=o^ok2dY%8HN#9g!_uM+6AToX~|wLkIWpC?n=9{w`^l$ zHn4n)js8~Xz?qoOClk53ggYfkd4>(9qx^%RAEa%zM0I3ZoSN$$&zT{)xqz(zs0Ti) z(D6j-z8)$rcLly8Uv4Aa`{>_K@&93_345}-ZlrHpn;=6a(-2=)4GMDNohGUJRKE>E z-e(zJg$oHLTFPPs?%Q8p>MNCh7n>fbN27mt`mwsD8BDk$cOFQ{xC$;)otYcPLqV35 znJaU?P+T%B?w`%$v?LlE5Yf!!WYJq0t$V`fCq(VgBca zRV#fkX>H(_B_l&XYUEEn1@-T%K+ljRp)LR%g0~Cvb)f z7$6@Lm^z#zeAI?QHhBwJ$iBw*X*(Tdvh6;W)N$>$*4J(#ruf{dCtetF`ebtA~dl!n^XNto;(UKxuALWTHe% zH(ltHaLL;I2E6Ls9zSA3N_y&fcvSZONeY$L2aY4jq%uuUJ9xfPOB|mKfba2~oaB6d zdJR38u63E$UQb% zQ`leJT4IY`(&KS&vKkL9%*ZU=IvSWT@3Sq!lA!RayAC8WoAY<^l1VKB=Xx8mG)ZoZ zN!CvpBA*N47QU@pXoKgw&SY8?J%41@e_T!VlI!YEx|)76!K- z%ldmVg%$f2QC1#@7Dc^ohQ{DuD0|fMKNcmRDgzrV);*$CS^f55u?AFeJI_&3RZFU@ zN^{Ua7y3o=+dIuaLEQ-;C2#~YAJu4P+X1`~V*@HfvSUeT~@LyW-X+Phy^zc%TA)ANisV`!{e#a7>@QriMV0Gcb$2+%NwOZ$b z8}Y-2u;uW*-k&Mr-#p^rGOz4|*SfWlT-obfaW1FdH;M^HxSy`qrqscQUC#-xIu@;v zj@l{k+w%L2;z6{2_G;KQBfeBDCB)|y0-+vU8wG18)A*`4ph*N8^+>{&Zq zB$PM)X9E_=k_^cvi-sqGjqqzX_HNC_R-;beVJ>S9h1BvpHpV{hN<(c*NaKs;vSZk| zkDBMVhjiXgHMnL!sZ(WDc9fs#b}YSXx&gjO_BM0ev(f<`CJ(!!;@7+>&p^g(D=y?g z@;}v7vY}e<`HGej{*-OU5qjHaUx}?MF)Cl(HubOn*fi@)rZ>@x3j(2V)e(}IOPF*5 zkH_UuhVUb&bO+@E4<6lwk!O%bPhLX4^5P_k+G5LxD~!m zYXagLcem*gx!RLaYSCP6T6oN#53)}JTs9XMCY79z&S@o$$76{_`{Urgq_y20n!Exv zRcFptkH3>X-1#t@a3CgFx&L9i%!Ox~jQ(ydUn1})ndeOL3zg;9H&|9# z$Tn2`A!uLz^S*=rh+McPz)fLEC&V_kEXUs|>!y@m82AlhTX-Z$wL~WO3_FeZt&DkG z94&yuV?AHCI)TZHhL2e-J+6*=@5wA|{&#<%8ljzt7SCpeP}QSrb9~6NaXwb=oCX#N z&HE#U|3$|OFqZls&}PaJZ<#X{Nd!hew5Vl&r_I~LbfzeP7*=EjsRx?2` zvrJ*O<3RK1D@s81ChVJeehau;{@6MZUK@d^hF&b_?x&tqz$ePgKt;0XI{a3Ys&G^~ z)AP&xg5b0MJd`e(3HiRPeaX5n(tpowJJb3);L1qCa`2RZ+ugVqBKdGT(LxFOSja>+ zODQv}+0m*3>4ltS3UY?#C)6GP?Yh=;GLBFeA*GwUY-vxVa z!aN3CcAq~X4Lax*2VgB(YKLvS6ExJ$m=-P7fKz0SwY=kY>4+wZ?hkKqSQ*-3vnk#$ zgN;E-6XBvc*N1Jga)pu&3`YzxHo4GfFF18521luOSU;RUI_=dgQG^jiz`is&jW6%H zp`!q;W^Y7=YrkB5>Ai)s2$mUxEe@yvN`el0G*!qgTWsS$=dmZ5{dHLFm|d{=j{Ova z&J^K;vtK_m@Yr+#BPhfZzLbgb_)X=&#}nw&z+Q`=S>+XKIcfmIdFpa7!=s+2lm_Ft z8?*VJLswC1xpm|anprl$2T#V$Zj-Eu8s?Vs3hUyN)LV&m z+0nVYgFo>e7|Gk>1{Ik<7lT{5dA7(NJ~M`{2k#Hyy#5sOmVa<1^mY;7+Y(g~r?~2Z z{cniRadz_Ndq*H32)=gB$Aau1kBp4S7P4aI~>Jj9;iU>vTy64C@cdZFj@w0RB3@Hn&K<8`A*Oj(@Z8ulpG*BeE&vvJ^c87z^%NawcUJia zBhjR|wl(5p-JbXxPZYSFU9G_C z8Uk?6k_d^qY!EYV9i>22<8o2S$&>kQrX!06hf(HNGXjtNJn<>C zKG0kAe1vf91~ra5WZ#uqa6kLd-EYvroSRTd)O?XkpY1u{7^@>bZIs#PV{gY6$ryo& zt%;6D*lZscv5+xwuhyon0H8~?KDAFuj3r=FZaU6dE3$k|9suum$(lM}xuF-z`eb80 zK54~RxWgekA!O#tS>S5bvL(^a|7o@$8%dBV9E(K%Uz#$ZnHg*A5mLl)wbje z?35gmLZ?}{$ul~^KPvIA`YpvH0*=*OzZ??YQkc`ad$*-VI_v?gArQgB`EgKYqDnj> z(0q1L$N)4BxaMV)o?t^!)>S3DA7Gb^<%DOdl;hZoK7`tJ=E?ar^VT#+Fbl|rEvN5P ze4ZtSA*wrRk61&^Sz*9@zpU;V$&R>BqpMDchvevoMcC2O+u$|F2e6-2m4Snum~3yV zSqZ!VBMVc-R$){B=GCOxQ+g|;{-H*1gJW;*i{?w6?pyG^@43x(-Ly(})6~=Nbu8N5 zIOA8-{_NN3RBCi#vnF;9J%LNZN;5zY{`w9tu?P9KaT*fZxB?1-jL&mL8NuXD^>`uQ zB?*4#sb{*j!Aq|Sybu|n`qFdPDYfrQxs!)2!8sWvx$nyeA4>wk<#K1nY}XD~8o!kr z>Vg5-0NratH6QMUp`Qns2-rf~8u~zhb?|zD{cVN>feD(IvbyEJWOw?91EWDTF6eV9 zwC%oWwFG{FKS)$?Imf%6BZpL#sFJkbpcxnTcPtf(u6nhc$I3b-wTvLUuxuZNwdAD( zqI9QpE9?*82g3oFja1W8)5 zU2@rRQ9tw@_mJv3kdpj}tJc`eJKO*Gv@bXJ>{fHPV8^++>`mr=)JFJXhFnsI5|U_A zq~(UmIlT=b8d!cQ*5^KyzDuvp9%XX8K_u3}9KIsgvd2u6zrZjc(r1dTGC$$aE5Ccy z3O|Xfa`z47Ok1H;R9RqVCOvF=!7Y57XyCMS7qYmG5*emrI{&q|Sn2a0oReppUc$SH zk37|vSzya^8~shEFdS#Z>@s`_ub^Ps+!*bFPulSwDI4yh{;kE)61)vMgKc67-Q%~Y}9mI4QNc%dVt%>)l6sugRDyNWT#_OSn*JKKg$ za;4!#hZTtbUujEby_g6w;NuU7_jC*@+@1+|miwyGz7f0XBjCGjo8EvGwwNl)8Q=T!OCO1bh_!zQm&$GEK=qe zcmHAs>{`;{5Wxki2*RC7HUviX;*I7T-mv+#5=gDNjC1gzjry-$Trz=;X1v768ZE0s znZ0AufT^rVVQfdg=WM;~wxq$Ub`|EON^9NJ$QsGs{&Pe+&+l}Hlt!+|S(5%?H&XMI z!Zp!TX1m^3u{4nB<6rrO)MG5}!`|`e-nfqG>`?*C#JrjUJzm$R`VzR(QN7SJe@|oke)gdC% zs%_DF^=bz0Q?Er7*#(yEO;S+*rou;k{wKY1gc`HW0Jq1UQ1RiXvVNF#AY86Ot6Aym zHsP435+n_Fb~TmgF zWj-&co7b*9r&Fr-j79NA4On4f1l|HC}fdMN|c5mDeNFf=~Y4Uqf_yz72MDy4|*+`f--B zS>_QYi4?e*#ksds;KV6fu=H+lkzq4M4hu=Vv^y0%!^9*|Y-oblop_)a&|r_`7cDj>f57AA z7!KHQ{ZBk7hsb_!K9mQbIlECq9r%S%8+H>Au*0~Ol!M@RsRfAy13*yx;FbFik)X2S zQ~TIr;9!e_&hkm&gKVaSk&22au$CSNneWcYTmN1|(iozGSN$?2YMITprrUgENFxIT z^zZ8a?-BMYOFS1t>9$t&PW|fdjZ0xXhH^~t%tDN>4n9?86x2lHdT4Sa9=ROLVq71b zN=H!)i@~04XCMrT6y0V1uXlnLB1xJ%>9WlKx*u9cR#3VyQ7I%;PVi(Gs@M=d;SPi! zZPUR_p-wKx2SqYAReHJso>{g6&5<69DjA<^F4#u}^{iMF8!n@p+n?H9+9gW2(WJ~4(-U7=n zobiBS9OS4d_D=9dV(_MVL{z1el~bX%)|!7 z*txOg0+*(|q@gNqjC1ZP(NxzD%}sx@A`mD-;OBo$Et4aX#Qhe)6IddKAYy#0XY(t@ zZE&t}MU*g;S4k{3GaY>7{#tSow$Ga{B*r;VQ85&7#G#dEXlPT0KL7uN(&!Ts3?e4d z!Wr`z{I6|^A_o)zZ<_WLF#Fo3VU2`|{>~IRDQFcLkAUwha$|)o4Rk(Ue@Ac>A=13} zQ}NmPR#q=kCzIn^K-7RX`w-HLnX8&!bpek|5$Uu9gJYL)QEmeq4`QV7atxq<9?)QZ~XBVOS?|LLK0m3l-l0eZDQtZzKVgOyT=_HR(_$8 zNuhRoB%^7D<#BB_Ax4xx#m-mYHyxe8E9XuZN`JKuL_Zms2`=RWiXv~cO(`6Fi&(2+ z+S?c8(VB8{Gt=ntK>#lSV`yCQK$ykQ#7_c=u*JLAAPm7cc=tE(C>$R z`<&GwXOdB57%4a8xbJUSb$A#z=m=uwSk9U#r*#(XRq9rwe8x>vF8*b;3?njOw$(ee zSLcq=2ckDE3OJ^GteC9p&i!Xr#+a3$W6Gql@5t_tyGQdSNM(e_LVB;ioa~T<=I~AD zgrHN;p!vkVZ7j+EE$z{K0N$vrP?_pir$$8(|ubp>F`WQY^LLt~st-=qyOGfW0x$AdCw z*sSLZVB<BfZm)Tou zR9@m$SYxDp+H3En_cp|Pp0K`vspZ=2tqM71& zoWWK24w1)*&gx0*VY?+c1hnLHY?>t1>00nm@*!R48LsTCOwj;ne6GCv>nO|wCH~38 z0fTyL-G=70DaX;fQ2vmtn(4&)RFV9zNMn-N~;=AtXmZT;e zV)ykcXMr6E6S*ETYc?EtXL(?nyATIeEDR-W!UUqtEHvuQ?-Je9%IQQ2GvhS5Q&smX zeIvsRNHL50+2P_o;2Wf|eH`b=D-Bqshe#BIQiAr<;f{r6AHaGN2PekJ)t!X3JCg^WV9^Wy?tYon>hd;TIqQrK!g@2$7KN+v3gk5|5Cx zRdZs_mSBxO^^27|`b=TgVCx0$*A$PmzPS@SgVndB0>Oxo`cM*lg#ETh4(f`+-F*1% zz~CDQu)VsILLsps#Y-?D9vqk`EUob#F1eE-K$nhqH!^rIs9ZEctMkus z$Dm_^@z6>CYv$MJRBqj~NLGZA04#HTNvegD)#f8d05_k>36~;tqFALVbX*b`wD@h3 zcq-iy7sA{nhn)AsaOblnWgXSfTyVEQ&PO3kJK!Lwvqi`>8JCPBq~uVtVc1v0hv-Ve zCg|8!&9#A8V`NuD1_{OH?dZw!)|ab?PiM;Hom2cCZW>Gfg+L5wWdo4*(^JW4f@UqF zdCah(Htt5zD6^~3`@Mh7o{Yw@UM#n#h~p|c-W+?CX$}e-T8$Wn^AhF8O`4g}K*AR! z%37RD45Vwy2J~%tsG|W!2Tf42>fC>RDPlYrI*`KO)P?RT#Rj@ugJ#F+;1Yv4VDh+6 z>$(k-S%P(>Q=!1@Uam>aAF-}Zk^WV*MEL4^H-?2lUXK0EH1JSU-A;pV3WesR1U z_&$ncM&xZC@}j>%F(bxVKC)tAHmr94Rd%^Sis{V1CqG>2QEx9=4YG~1(rPxMTnS@r z;w_JL-bm!%NkiXNTM`?N`LZ*p&A_wJn!4cVr{^sMYB8-(gTH;%*uvum z#jG%*BoF{>W*YafQpa-meqy8DOKity#%)f~40r=U!pXe&Jco82*1vDtFcv-6WhNl8 z-CUaFqjraS4obyXTX|*c#R-=#Bo))d@7ptRKRV!qZ9wT<&5>##Pz>rRjsmCSAiG zy6^$tB(;DD!6hnYlbD5(rQ-8iamwe`NHPOMwkkaUA@YMF6Nh>;AcnzS4ve~ z6DBY;JLG)183muOGOD)Wf=V_(*qWz;8*O5(tRAz+W37=CQ9y2b^5cy{_;6u~{9F0^ zCsw)Agd2kL&uketPDR1TF0w|DumgCRx!{w~rQcD|aUKYS~oH?~eLfK=Uqw1a2TOE#?nGnN6SFOh8KylY5{D z3T#QjJTf_=l$z7tm8SeM7zuR?iT58%(2k1tIQIVouH^69E;^(#malJ;bt#MA94h4f zPuG#v79<#!V#_6vB+^MfG(psW-)T~RNXA&>^G(K3BW!|$Y!HGkH+MefyE1NkuIV1E z@3*}^z8BOVBxk&GoTr^rX5O+CV1eB{u^a7^Hb)DE8JzWq1Y-UPy(qK)UEq@Z|HIum zICm1X?K;-R$;P&A+qUg&Y}>YN+uYc;tzWQ7HrC1eo;`K`hVQGIs(GrXuVGj9OwZHz z%_Zl%NQT|&ys)-^Uv|<4R?3cMM$7Wsjm!@xPK56At#XdX@@c&Lr359EXSUu>b!}#zf~Gi`HM{*A?xId+xh!Dm5tl2otJxc$#mT}s9j<(@YW05 z;kSH(&H4!MOh;}cd1-X`C-vB!kkPP!&0(!(gx5@sgSJsZUk^)Jlk9L_mUwmCc&}OF z)xEDlnfYPf=?&kh8{d%MK$7;L3(xKj-EQV{SkYkM@1hm&cY8jT)z{v|81bZ_5iu{f zT;4{zrGqR+dg8FmZj4ZG7Qfv;={wDQtjsdm-~C>;=U_5}%={0ac*5VGa>$oL@8O1# zd4Ztnl{*is1Aj`e3bx@}9o<yLII!qvkK}676Y2Hp@(^U#!mh6_K2M|dCDN6dpP^0n?)esT zoX!&LDo{E5+#uu(eCe=R58tCJ--JrFe_#RFhST=)f zrk{yp!qon>Sg&?GWWP7|+NSKKntJE1OzZvVO%lFt4zKM!MrkfUHfM=90uwc=2TG&h zSh6dx9uJjDXk<(UA!>O^qo%rtWlfnd3<>;>kWBL#zh)~2-F|8^?SP#HOrp>M_{>NEP|x|A)twnnVK$e z9+z?~@pWa?tpzT0e4_|Ff!?NS#zplw3MxHcP=)X)&R#d7G; z2{s*;)5iVW2%Ep%Y3uBCQBI$K%et^}`)vJ<58cftKSwl9_c!&O<ZR|VN8D8;+HMug7TSqw^u3{sN)4YHJgBEK`M^5~6G|Z86pjr_8U3DfzM?%zK;R!T zMZuU{mBy{2o-P8mf@~^cv}iu#6KW$?dYD6TaS4Td)^I zhh@b7?x2*Cr+ES{ONy%P0keJ`dzO1@NG zqbTQJ@^JH}B$suPM$)x$Jc9YmVH+*&Y#-}-%{Jz$&?(+*D%v^uH}Uao!Uq0_UZUGv zO%8d@+WVL!$BwXR>}UgJLneYO&W+_0TULk~+oS(`mkJ5lTh0^XC#lDELjyyC_wYs) z#clFvOJ7PfNZm9=*WKH3xuP!ek`J2n^%Af+%E0{@5&-8*pegC+tZ-rvn8F#DC zBbM#rb@MiZo?ZP(zzpc?^)Ke;KSh}VdVNK{ih#4=5r|F4=6AJXTpXXT!9U=>pf`2w z8)gl4i^fk~TI7UFs{{ylgnd1 zH}6%sImz&~joak=VUHm5RNoyQ*YOiNX7E<@8LB$Ta0Qn}PM#{oJ(#>5R;MABBwHyV zE#E-mlSnX$@By&!YGo}I%+BO(`bcE_C}CoO6Uj!Blys4tAb&rCdy+l7;Rm7VUuZ?o zY8I{YW;NR5?SC?C$5X5l8pLKms_F@v=AH~Uw{w`vdL6seEsI#2yxUw9@NXt>Eh(SV z34fG<%MVL0IVLfb-8pGEZ=%$G&xe=W;Az&Doo@2h_jo+$s+!E{RG{#Jee zHL7ddKv*}(^mr+aVBzeeoGlxAH|{3?{R`_5-XJtosb zvt*JD3fHjW6oi1=RoO-ZHWX0%IgHth^dk`ZSWz@Pv|LFPWJC~TuR$4{2`8c#B7gyC ze{$BG<6uqzOq6u>n!-6mz&k_6mGHK3OeDl#KvU>#1EgeZtHzNFCm9@Q43#PhKsby6 zNZGnC_D7(ctfA^i6jx-?Lj^?msx7+V3~H4A6sQ*etWu~m?p=UmPPw2!?vF-}$-g9n zqy!uJ@)V=2Iu>eWxD&+4-J54PtkC@v$?vS6H^sFhcXM}HQuG>o8O}cWwwK;!*a&R1 zD=%DT9sN@HT<+wMwIyUHD&Dz1t%1^c75ORrb}g;uPAc$p??%d7&uxG{w>?rZj|K21 zCloE`)@l7Cf3{-uR#03$MRpT<5zDR2P!|Trsk3Xc(Gvx#f3uUZy(M@4^NwbqsoGlR z9t~a;msL&X44<*}crwZQ1I1;R_HI?L&Wnu9F@C(Opw`YSn$#23yUbFg$@@9FoFNfR zh4QCpK!6h}5$%BDo_ngytfIeEH<7BrfP_GbWbO-9JFM`8K}H}31cT5|Oo)g9fAAF^ z7)8Mp^ZA~{%l9Y~PT2tJ*=#r2gm(Yb24@lHWfqkv?P}AR-~ixm4HmHKwUl})K}1AY zV5`K)LSla-o0NSNL}=tGKb9Gh`V8iGd4jxW0+~wE4mX?-8jt zre)~93TJ0OdTe-_WkRSNw13#Xmdq~6Tb|eD`MS@X@9GlKWyxC|bkPiVw*jbngk?`d zremP=DaWMd7`%IY?kK)o%T)HKdsNEU9U|Q`P<4Ed>K7pS>32cm43lu*w|+Dxckrk{1*Rq_X^8a|;wTQ5Ywv=zD#4!ho0@aTUH%$$!^e^ZREF5{68Zw1)?F zjl=OK*pKwY>XLES-sysBjz}OXlgKSD2*aGAg;y#4e&uSE(M^$lRDZ6nYp6dWAS4RN zEM%1Gy$SaYWEO!nGLtiaDVHo%unof+fi_7b0^qSTn+4Q+)TNaH+75S^b|xX@LWh1L zbMPrB$@HA2@~}K;D>S?$C~j}U4(Mq1{f55`fg%`o6r2(2r-on=dn^XkN{Uv9I7n0x z0~B##Q~r}s7MGJlY!QX|)2m;On7;!86E4W%GO6^rzBEr$M`8h~Wau{h8L4JmYnFBN z3uk_`>zyYmmQpBLymqTtxLL&Q9CCt+Aw*lexwa@8=_qbB>sK>LaY5?(KJ@-h zkGS@+Dt*Ve#~Obj(ydKIj1cy3=*`nZ0>K~!X{cVMhynw?wmFGXl)A`#KEenDVxYMz z`9)AR)ICpuy|{+~{w*T@1V@=j2vmeb(S!DJBy z4nr>KCM`Jptc*bPGO*{d<3&b^H6Ji>B4DqFr9_h|5$^Jf08OO`}blWUoavJ$aKYeoadfhlK7^gZgP-la3n?KUZ4*clS_aby+qe zkEkGsNGSun|1dL@i1+yl3QMHaw!3bh`$<=;u(HaPp@>P{?ZiH^WOzar30|-`T>|kd z5h1ek^Xu6URG$Qfs0{GywU@dg`h>jH%gJ~sU@e>2PpBIYR`#4-=_J`P`t7goXa?Eq z-KRj|#3Vg;55V|_<>q}&nvafo?(VEa)yH)#-2C!}?YTDpJ+ zK_0570UkIl5IqzM#gETHP4E;jpfSxJgrzYwT|A7)+ePek9k);v0ub{Mk3~Vkb_o`+ zKp^+zpPXQ)Xz1~nq6x#`;Q=DKfhI(#lC{ZPgEmq0F(wuA$2c$`G^G)Afq@GBqJKKl zM;x+H;Rjll$_NEeiVfrItukEGCk-1@vJ>CN0r^A3xCwRUaaP+`M9uTb~ogWt4%3N7H0Y?^HubQlg=g?cvc_J`jlh_ zE5sIoMudzOf`q^c;EZ4lD3BRG&cBtK-!`V1(@7Yi7UXb2719KaZ#?P7`%VeY<`VKL z=o?^+Mw`2v(FQdjHv#K+he+Q}jt%4xL=DSPsD?4f#R!3a6p<3D=e5)XM1&*E>UGjg zlLG&!FRU}X6Yk%j?x60Ej7~IZ$b#V(AF5bI4TVz3*w_W4SPQ?-C{&y~AnQf_#lezX zY5=UKjaqb<5Me)51s049)Gy=Ht<~h7;%_nHit4r!F^JE^2qVG5^BC5z)O%Kl1Xb^# zBS-xLM3Z%c zz9fNxu3&*6UkNvHP#qH!x&cUDR8YnN{EkFK0H_g56#fV}9V(b?eKj-K5C;hMRWcoF z9*#*f3`l9sRNQD>f{jxWtOz(;T%S~VknEIw{L;0-vI4g1gjo{(qw;ueiO;o{7NTVV zdTtDA6>#ikDQpoZ4#pI$)mq{F7h*Pe-#C-j*BGy)mE!R=^cOCu;Li8l4YLl)tI{XC zUyf_TVpxPlqarkMXGzD&71hio% zm3+^(>`dLNpf)6T+XeRa8V9T_q!dUotNEBLm-FX8W$mzb&iM>YHEfd?be7*2+i)G- zNTEvA67?SQ$lvH~mdl>%-d6Os9i9BOPLAE}WVN4o*`KVP32kQGGR-ZLusukoOA5PR zHZ~EspQ%e))5Dj})EJUeN%&vw=t7EkgpD}Hjp4~^SFw%J;aB;0wh%~1jyBR+#*&5H zE(JUwAsAaJV_qUgEg|Os-&*PL0Tv;sAlwv`uz}#25@;Al>KOiz!MBJ053(>Ze17SGzc_qF^bOMH(*N+7W2B!k9Nkn#P3&aR0d27K=0 zy9y;?mk_R!bMf9iPC6S9dVRzAHlT8u;WINN>gnE$9};mtpj)H0)F&r6L5PtDOrr%L zgDnR%e5qX>Fe&qkQ8zCLWp{t##}E*_%lAB6op`Nx;7FQ4`gzy=HCKkA5be#CjdetW zZa9KxQkwy}LivsHgG>Vr6C}7g;ogM^hmu)SlvXK^X_e%fTrn9MhNQ#U&vk2d-&-;n z+M84njcMOo5zE>6#jzL1fj?p&h$KKJ>?4121alR3@j=5M>zZf;Df}huS8V{YZVOR$ z0En0>5%3<3p+F63nhT0rK;LN<(*eu9#e`X-&Q${XHhh3EkP!l>n6baVJCR{L4K0da zf;&)uwFISPBqP(GWQaK6CLP}-A!`Tpq$ySu|7Vm03kxw8|CO$65CsnB;8G~y%5bo3Pz@ z#XXj_1-Uo*oMlM&gN#&^PAYvd)cN}C>F_u&01s0;m!X0`2F%J5wot{NNX1<7c)Y0ZVUUnYOtYo0JaZlE4*9iBt&(po~! z+MvQ~rG64!*bi(sIkq0swXMak8e)1qmO!#}_EOG}3BMe5kuT~7JA}1PNm5F4 zZoFzF+IR}&X9V4jhF;MSb(jYaBNq!~Ielh*;*K&hgo6pleBLXX-sXuD_IDO*>ETlF zK9VwEiIfu#HqZw!dq~s(V;mLofRQBqqyz#k0O}4RN*Iqs4V%XSR@8P8U6;<}AQ3(w zD1{GUqpTIk4iv<;cgG2L+UA8L_JHcEeiBnCnTc5ol_qD~hkA&ClsyrfBV zOOR+oMkYGn*yI{irrwwGl*9ms_UD(R7q1BjhDL;j)VG4uVWmMfL(02T9wb5Y7!3|0 z5{WPyt0RT?X--Vkp@Kv%FhzWKoWt=mRsag9H-sMsa_GB8oH9@)>bjU{V7~;>cUqtg z_@DSOdJO1viSS}U#{EPRZrC~$VmamFbOFgk{UH8QsIeds@iIf$`oHDykPkzUhPeb9 zsjc+D;?q!p<1uS>1?8_bJi8gJpv5w(@PYp6qr%9aLs{9-bB#4h#vtDb)Ub_fjX$@+ zr)nKkw%{ZQ+6yIEprj-ZWKf}MC{jTIS4Z5ar=DF*>mbnw2n$@G?uc~j{07&)j2|MnC2I$Yd5MgZ+XIn8Ml9`j>IJf*Nr**; zf(4RaCSymlCgiw7AT5%}%qbX9#9~w&1C~NQ41EtOJz^;pR2-%b`nJs37jalp_eOx?Utko4OhgDl?1UW3cOzkE2XF=T8 z7sV#EL-`JX&Yul@uY0HG3-bWWhJa9OWA#dKGx(27r`LerXC~W_pT0LBwrX2+_B;x6 zR+}efZQ2|^EpKEr4RTt~$FfSeM{+s+=p355b}M=)(Vq~UJ`LLTc4Ey6Cd?uE&-S)! z8VAp=Dbcz4|90Gxom|9-+OV58f7Dyb5w8{kgAtHb>h+;ip#T0v?&hu>dFZlZoL}zA z`~laD#p#XMs$b&pnAYTBqmnsPIm0}~J_ z10w9l+K&0)y_^b@bls1cwk^8^e9UeZTP`wJ9lmWxfUn&F>v!<}IU5&O>yiPR%GE(pP54gDQU zVONErvLP5rCo`1ynScVJr-9z4ey#zv>)9g*0((z;dkl1-=9ri_|7`mM36c{bD!lJ6 zonk(RnZ`na1rFysaqFu<(4J#PgKIh@XxzfVNg1|?t!gDKG({bB>*g)&sUR#wLKpL( z$rgl#EH<`*eU!|pFHaEt(|C!0T9X6|OcdBSk>d{ZB%1hOviDJi7hB0j=l$C0ep(YU zf?T*PEqXD7!B2H=9t?7ITXghxfl!mL!rdAD9wN$!cIo|B;IiLlskTAS&=4(Csa@_x z$BXgR`&18DMCiD-ag7@d*QNag2N5&XNz8oi;Ch!tUw{?wyMIui*o8r(A^WU6Ctzy;KJi%m;&_%^8o_i%w=T7w@I& zk05Bps&kjodmj*%&+ekt#;ZiHI2?Hh`Dt0}1jbsRjZ7_uUd7UYyou#YBp<89F2(?` z@bdO+F%VJp2%`KBt{r!rSn&`M2MvMcI56MU1VavK6Z+M0O#2-P6RS%+;!irgO0y&u z*(N6{j;ILGe$IUS04IUv?x2oOjt}e$8_4&@4V7Kfz5cDC!%*7PU+Q0XH%t!@t8DL} z*!A%nI-H&8|SBjA3&qY|a6wLp}f1wudaOBw#GGz7iRYIf~fYgP$Wz0dd)VTI4V z`|SvK4rXBz40yQfY9?$RB?iG1qTN*C@(eN`_`~@9=aVr`NgLJ6N4PaMfZ)bgQL$+& z*>&-aosIL-Xz9!DFdj}mjE29+q146pLTeUAoVF&%lQ<@R-k2y=+}Y~t{9dH|;dH6g z>apqX{nI+6OPqAAw>n?HrK4e6G=^@@<)|=jb}jw(`keU^WRtK|MeQLG68`CmuF`<` zsaOa+^ZStwmw|Cf)yqyz-4$1AaoFjT+kFWi3lz7pIvhI4MmS|64mfZ{&exTcjJC^( zp?a^%tB2;qLDm{Qui{}+m2E``cJ~iz0W%~gNOe?fJ^)HLWq~(0uba|jL)i8y73i)^bDX)jv*Ni`hXjXh?|ibEjh8qnx*avI z%l`S4{I2y*SD)~D3vG*UL7S5gTq7P%M~3Fp8K>+ zED;8}x^_pVcREfvB-sK^X3j~<^lh7+eDL#K#uCKP4ozQ*xZ+$uy}Gnd3V3u=yEKT9 zV55O(!24$Y;QQf#2p6bkJRtIR9QG6`0G=)rLMy z*id#y)imPZ#IxTN`cK%(|1M@cM=`3|^~+I+*!JBi{<{`5j8D^sW5vN+>opOv0H_J|;FA4u9eMHbz!Q`0s_z8n zG%Og>MXvt{Cvi8uWXZW&hVIrHB?L7TCVJ4zOIuI0+F~E&OcW~@f z`y)2On+Z+@o3k4wbT{_VabhY@*LUtl$v#e$FlUQvisBVie~xH7-{$}n?ymZT%O@;= zDu8V|DO2tTLev2i>;A zC%yK@z;l6qabxOLNdo9o7#4{dOP3jfq;}_EhhyRNm4)H;+U&Qn zEiH}x2rzuX1{A!kl0FZ~OuOtj**kie!XRe0-KW3eSxBEiW_X^GOsy2$Lxw*TkhOge z->S)@AnFtn7;xv1U&MvNLQUBhw)P+23GgqHQ2k^r7f|VC4=Uw+Axa^x5cj{M-Ug%EuGWA2m zRe&CspJ$sZ-q!vFT}@Shrsd3&ooE{c-77K8+gLFuJ^wU!*Q4NIX%=qRwV%~Z^U}b> z&e?bYCwjek?BS}pjym66;8GtL^sRy@!xouiYFet`Ga8d)^$P z5gqlyI?sJpm?sG^&^@FJf~~_wP#Dleyw%O$acjVEhWQ`!j+}1;l#pa@@t5I~WjMu~ zsL;Q|fhzKVUu$K7$()CYOa?$fB=}UMQ97ZttBTU!iq>~H1J&eri|6hKF2NI7-`^NM z;@;tuRC}HGmG9^AHaqQX?3o)@&;I5^xC6)@i}-Ohi%Sq7`CqDhP@?YpcCTI7e*4Dv z1i6_=lV2q$uU2C+z26x{G6CCiO@K|$v>;7jJa~lRKgTf zUOu87VOFuj#W`HobVHYVs|tSv(cv2KKRK$Ti>?$M*sqBLe7dR0-F_C2Q0?k~eMOCJ;|g*aAe~T0DyC4pFRDRw&5(7ha!yD9dE;r4x0p91mf=ao9&lxj4kR-LOr# zDYl6>8i}?|Jte)IkJ-Y&>BqUxR%Vjae)%4e;M^22jUKKgYfOic#XdEAWlalFV|xjF z>QW&meayUJd?oTct!bo7^cr2MCc94@ZtO~l1+1DS>%M$A4*PWVCqV{9k>NblgffFp z|BiBoGwoO<75BfehtDn2lQ)VEO8fQWW75$lx1cn!<04{8s9^m~MRmEB4TWkkFa1FY z`&bUZc7@HSH{Hg=XqlivfMZYIRsGa4^swaC#~l%qr2~q0LMtUmJWd!bO*Y^n&#qDkPZ(?+i-8HOj-Y#JOrta~LAg=<`6iJrr zF~@F^Pz*E=KWn4SZ4~zn+ZAKp(*RH!rN#pH=n@glx!|Xo@wz-F-@vY4;DJk>lJ(-{ zd}13PZW5Uwab+`+%E^FTju|+>Fx_Z!zySlgap-LuYQM!SR{%3515AY;b(7IAP!025 zf$pSB{hN=xrNvX6?lmjX#pYHtDOymvHm~-$ldW78l-UztX!K;A4m$ZkEUprVX`l9@s}BO$&*XdGP&f?T(7eU^ShsXPC-CSF`mtFDqy;- zn7%&Lk}HA|13q*3zd=+$6VYgt_zm+nOtSw>e}940x%S=N3fMOdQ@_FW++%OBmNlIx z9IR`P)B!M&(F>kTu9uIz7|p%1`Pa|GA48SB20QuTp~ru$xuvEJ8OR;-}d6h&;e9CSVPF8E6Q zfK2{@M!Levz;NCdDyrIHhb%a^5iI(%RcCBLzWZmW+k^{A(Un|Yt`|J&$zP-Jmt@%E7M1&xEHW z7M@m}OZSZv*S8PytLb*J4@K0nwMMG1?;zXEZG8E6Z6kApP!zhfu@?b z`^XB(w~o81CY>oby^I2ZDR^7=OHs8>nmBTP6SdShJYq;BU5ZhnxMb-k7Y%0wf)L{> zx%A-yff&;5>f9xss3eF3A5&zwOt9H)V#{)Hir|-+0F(sK`>mZ$93ybUw=H@V`BXtQ zSoA_mTbLjnA}G*jkKIC{qJQ)AKp**s3lUejHsU0Lp*7Im6=uhd8Au2N5G|Nr zo>@NwwUkk{6S)EiGNJ%q;Fo9m&w382Y6FZyi62&^n7+fAp$(#v9va#Ny;?ZK0$b29 zi5~V=ymIp(Fg&63VOsPT3ZTuoIaokY2jU~>eXQkQbZ4WFX*6M_KMwbJjs<&SKdu42 z-H^F)IxapZMp=)=c@yMS+cnkln8mCP3?1%EcLV)zRj=k1R-4**>ahse@$$o`p{5%l zp_;N5uh zO;{;If?D9-p?n?kGDGA!q0`Cn4n1Y8B0(SPbst&D@a>DjdKVtVxuT0&$?#I3nlaD( z(Jv5Q0dB~l3viTtKGTnxfUj*%pmYIrYN9|S5Rt}Min{2AgA2PBNw)?Xg=k~~scV`?4l*_EHB)%ok)Gi~@%5$YCb- zVxv~FOpcowNRm+o&}pVrZKyAZfe<;_Hyxy_x(o>rKh%!Sb?tMraiLDG#slU&qb1cX z)3@n?kvqGE0l=3UMuUY=P(Zj9KAtp;Xdnh#mul4Gs_6Rph^%T9jHpJVDRnL4Y++rz zbeq0Ot+Ui|2Ui6_4>X&)UY0I4zal@+9#6^2FZmvyV-3Xr02=JjVf_%T8XoRrEmPC* zU0v|=zjnTMKIVdXr)BwmQEWMGa_r6RhW)+#bZ?aqu+4Q^=D*n~ft=^&-B--f0>kOt zRCfPUhogNJxgHZ7`&Ex0J6l4C3>27nJ_}x2a&RN6*#EFnR`QjV>Ij|iordh+UV(lP z2c19y2+;r~1Tmu)Aqrl90+GN_ly3ToGtURCOkf2s8v7W4YnRZDh=x{40cWRhD@6mP zby0}PNvr38f#fb8DTIww&PeCzj*-M9A=K^;D}LAv<_aN|C?gV!9_5hY0F4tW0Pwt+ zY|l@_Cl@fGcKLgEhzh<(l|b(eZ?7Xj;^SIYP9hHDHv;a@!^;8IaEm1vFA$jKnVVa8 zhh6#UXKznyXliTXdSQ-l1xf5tJeAi%OWFlbaWYUHC-s)&->rBA(U8n>@uVm_E=i+E=>O{c9 z^G!P187rGQ6KK;bh=>u;OWJ(zN$8u=kTIsS!g zFzjsqLKYZymVY4=4EukN^Iew#hW#JL#sS0j4`XA4Vf%-%vB0qX!`PT$*#2Q`3@~i} zu1Etp6}p1{l_V7z+ms%Rh{T4Tj|(#=-)_@(*KS zf?@fGu`s}}{KJ?zV3_}5%xo~s|1f4280LQ%GZPH+Ka80HhWQ`H!~w(f4`X73Vfu$L zvA{6>!1oQm>|9hE?3^0uUFbzaXRYRJ^A1y1HO7WuTMvgbF)vM-cO#|2pE4sG<>1@;xPz$ zvD_n=Ktvg4mQMd_pPh0;e6(i92pd8aY5Fp!X1CEMmuJ>S-?TNWuc5xTqedWSo>*C5 z@o2ZPjysvQ;T?g+I^#CjDrcNBZj~zvjl*Yjtj63b3~AN2Zj#&w?ZpmHR!L57-fXx0 zHqom=B_gv#Wos&cVw56Aee;3_K`O$q4V_~k8=-te-*hdtZ(1pW!5@%hlsgR1fD2%h zHy)Y|Q(&Co2^L}?85#HMqZMPUi!v_p(vLpS<8U&~_N~q+U95S3FF@&XV`R~>cF_Ey zZ9G`vXm~98z_n(T@N#~KSg0(TmQa5Ecw4ug&2*J!#%0tzzaP4X7||S^fw`FwHMrAWw zuCK@1y{cGeUL#KHySmvJ-petS7)cYVLIO4?=I^DiX8K)0@#S_uDb^TrnwC?!w3KeAP@9X*URi<(Q-T^L)!H&i8a=#K%%& z)^HaYU^`f-oK{!JykUJ@_N%Yw=<~Uu%;rLL8=ukJtjx+dtoDYj2XF+K9HGZ5UWnP5 z`*T>iFPSF>xD3B8FLZOCSL<{8v9YFq-M!MKpZYL*-*x4-EoJ%Gxw`eMJ?Q)|c$D(Z zl&$BJ*-%1ih6f-8!$%pCVl@@WBCo*}PJ}0sk{o2wMab1U@gZzxX_o79LDgsE`psS5ty)CV{&33BJzxM%pzKbWhIH< zOdY$C>JrC;9Ia{@4Q~e@S#jTFY3a(3TeC_~%EJK?tUAt5xld!niRY(y7 zy@;t;NV7+xu!Q(0)qHdYrNb)`v+9F5cPCAN>Z+(B=rK;gM`h zxAzz>wztv3wODhpj-O%m)J1Rzo32fo!DofxTW*KGjJYwn*BfSbED=(Qp*mpDByl*! zlwT5_H;$3eavn`by*5q3s`Bm}aaWfVjk+|&Xf$==B40mqu`KzVymwjp>}Wn!tdr~I z$uWuRf}*cX5}gHj$X^r>4cV|XUL^M|s#%YRe5#8y{St#z z=icG4KZ?gi!^9;DD|4Om#@nQQUt;#F<4wC(xk2BswG;BuPa8YOQwM~srXM8tI?DkF zvFnD*ZYnz0SzgE0L5nc2eifgEMOtEw`u$W%HDp+VC8bc28DRQ5I7v{Bp(n!6eyAB= znmO9=K3%u*B$e&8d@9nY6^DmDAC5)T`SlP-+ZQ&)gx`0rm8gq`*5(L!Wcf0w=^pnQ zX~jlgVmzN1di}BLrd4+GQjhoOdYII&4Gfuj=FQ6|T?EfVrs+1i@u~8wP5y+67%Stb z*m`eNjn}WWEbBLSUorh`_dQvedCSh()@?)_(hkAzft&Fms*Kf5S|2rY;i0fU_ttj2 zd7V~Yc&f7j#649p%1-B94ljg3lXm7eIp{9m*33!DjhkNzN8O? z9?z&9Vq9n-XY6u*Hi`m#;pE30&zh@Wos?vqtavw7MjOSXNPflH?DYBhjY_1{KwdQ{ zZLmeoci!1-xc6X0awZ{yB!?N}po|}Jm39e=vJyjz zNxE2>UMn=c`P!HIlhos)g9fm||9YkyQD)ZmMr zb98}c)WqC!70uT@uCxr$HNC0MaS<9&s{~Z@f4T(FF%_j=1*5`BXA%xQSB z$;6P+{D^3Gc%RNLe;+C*58I47tPZWwE$j5E^T3zgg*byM`hB${|AZ4UAN*7gybbL? z3cbe;YgR5dj*LMG+9&CeO=+VUr@VY<@_B-bwAOJ3+#y&alUS{mHPrJ9_5JVq$trrc z3`%D06*{(+sJ7d}qK32maVGpMgt@MCOXNj+zNKu~gWZkKWywwN3X#*pBwmhJOA`l6 zkL*yh+7+|D+PR0J*PF{w_!h*dsQSpu1#mVgA}AqL5u%9;xgHwC>#$~~O=;D|Z46Sm zlQ0W=7hI3G=XzudU0U@?`A(x#9ug1#>0~+^ANy%s96nn$^gdk5G2GHg3kA>$$0{X?ePJC#R#fbF>>`GY?Hq^&o(oT2-gH{FCwN zW2VpABg>Vr*Fr_Z#cK(mP(?gv(mE_{MtlHqWQ>4mzju##JsI9-AiW(zgdf<43e6|c z-Kv_Yut8tQ5VnYrk>s!`0sM%@ltM;o%;U>U`w+yDDX^<&#nq}WB=qeu=!<1tf7Y?+ zB4KDYBEhW{;mkVMb4<<;opWf%$9v?|q01HE!X|YlwZP5lRuZGpuyunNx~^MggX6O* zH+dsX(=ouQqTgjG5x90|GROA>oKZx6v!ZBy^U*6k{YlU5g6Fw$sUx4|d!N^P^KoLa z8YhhVjdGdiapkA*8Lnn#i*1frbX*K!??iGOu+@v(0t~4kBk{A! zX+3i8m!HL|a^!JSGjhBZeDig4wa#E;YMOSsI)*n(Exw3LzzxC;^{}E9jXCaRB_Ko# zCV>RzM9-d86E*^|gZ7Vp+GI{^)ceI2#9AD(cx@~7LIV>URrBnc0QhrkL*W#WU$DBU zQXX*`%DpRqeIX6nXU~7Kxt5shC+@;MWnt!-(ypC$cf@S4OJOcdbE=G*Oa_cQC7Z!b zjp40-r0%Gt4VP{7DQdkM+@D)J%xJpnC^Ze8jp}Ck`dwc>eK-Vbx8K~V#$B5f(@tzu z=GmKc{to$8#2{gN#p2q}wVMvQzGofBeNuLQf5NGG!JV0w&}wa}^_eY$zSS4f#~IhG z$Z{M9nA~5}*I*sh%{JehrFo6$y9Ew2T^oV^eX}pt{35B1)u4 z&@IWrHQGYTPoBg=S^8rqabU>aW1lo7IZ4ng!59?P2o{Y}c<*aW5@?@S)K2KPk&0UR z5zGxRVNxP!KZCGT2Iv?s%lJ6fgqrePqhcI^wJER#2^d{u5D9D`11wQi>WAbWQ`MFe z^`;uXdFgp_y18SX_c5SFh2>MXeWj;X`XXnPeTuE`ysS|G^ZNLH>t0(SPaNXVQ}!Yc z%bU=<(>FAQzZ$uvDRZ8gcF<{D4TbHYyN!c+?X3NBva#xC zr={v#>HbC`byRfWb*EW**(g_4Zuf?rbZ+R^(PbSHx!A?}j=Fy4yHbzc_M5AGmj;`g zJf>yx<+4Ogn_z6)^1JX7biGX;; z=s|%Zs4O%x0n7bB#65O_YW7$2Dd%Nx$9q_`TC22|_eH@v;2&b#h(nab4?$OIT;8!P zo8II5a>?O|FtCEs4=pUD!viS$0XO5j}Hl9giV}EBS(e0SMov`*1N4tWo7P^BTWMNGrILmNq^>T z4-<&lGh`6l_kn(r=u7m0I_X0F!9Cmc451535g8q^piGftHHMOjpu8)yGTW(^V7;fn zfepbxOL7_hDSrrbmx4Tz54%nAhtQ8$-=l_eO+|*Q4Z*zuu&-){5PAui7`0Cc@1r@F5wre^QzYGZ{VQ9ROkXXe8uH29x zL?9CW3qNQb)&L<`yg!xSCBDC<^jSD@d3yXfKUBIaG^Zx?2UH>|aiec{d=f1i`Q&6Q z2@FYDe{6{`b(EyyIJ#CuQzfE!fB~wQVRRH>mND@ph?pe2{n^OzML_h!gT$;G$IkLW zv~Az9S0bLD#X|4nVs5FiXLMI0gUM~Sww9B3+8PI7@4S6XLcQ~U=mx<+*)D0T*Eh;d&lA=O-Hb-#Uo;~w|eY-uaMF^MYK zO@$`-Dr~tH9B2!8vdo+6g~6Nul~;PXHS&|DLuJMLD$vMQBJBp-1&MJU+8|CO zAv3ukp8$XDsmdI-7;r83M|ql%RMknG@oQM)+#c~qKY>QmH+iV_a8ZxYWt%C z!R-|uoo-%GMeF|UUxaZvX#N3mT;!jgTTbJf(aE&CAqi%zgL&?@K;tfqC%d+~et!Dk zd{Hz0p00*r`RzBZYWY?|uRPCDmP` zl&^H30XWD@O&Zso^e^ZQ4Ne3C?E0iG5FhTS`ytapXyFOfyWleii8ujp{Q)ZOrdfkT zhQ5iVL+P{{gzYKE$7)KD_1>yP+fqOXIL@`~7b*u%ff)EHIe$?@=8!N6g&!S_ zE9C(mF$EaoZjOY}Rpdtnlets-9yRGa%|@2Cx3BOo5T-oZuH-Tcsw#frq6HOMdg3w=wu_`{Kj6SHv#<`uS!M#{yRoO zk|;7!MgOHz+&`eClJTea{!NA`tN>QmL{j0fF3^w&F-yoORfsPUfx76#*8>XakuV7x zV(bH>rnw!%`Yb?qUTx$Io510AxEP!azEo15Op{VWZRnKq@4SlCiC4Ax$*VT zA_}LLpx2G{>Bq7CU|BRp>JpZHXM3-oeoKp;UdURSTTbWzC3Q*=@{C4u`V1v4~0@O$o5>;EdLRd z?JqfIags6ryoNpcsCBN;LQ@WsNK8SioMz*7=GbZXOp6nip*4N(cD+*RiL!h;*&p^9 z4n=R8%Q5=a8LfypFz+`O?Aj{2Y3Z&_lc5#+VP94EbWRTxFnBAiF`sOFGoz9ZN(T8Aeo@j&V2=J7q%Z5j|A=u=Gm^xN2i|7_CLD(PGz`} z&K}~&ke@qXkenI2m%(E_Hyh$C4JPfe3%@MgmW^4p+Cxg0b3;XBbBC7PWb0UL8xv^Ie@mx)oT$u0DHx{n2(Ny%6V`dbw`UQ&S;mftPV)R6|r?PA{9VrF${hQsC z^z1q5X?v!xSo2!`YwU_s^6Yq6It{av?zJzM<8Wp-&lF5_N_zRHs{h=!ljeTE#EMI8NFDl>h{+8 zIQ03igQ9)JCeF|A0spXfs0Tl1rDoM2OOV zbab%W7mo;S`c1cL31m^8X@=QJ$eb^Ic6BEuui~C%G2&v&+>>Gz-c$)gj6_p z=g&0ZVYso+1g6?0664+`rB;zqr8~SU`{vInC-#dW6&YWGWwdmH3iQ zo6Wx?GFDU>`K|0+%&mN{ya4W&AGj_v?6OO`Rmyb3)s=D=7a`-Lff3&S>RTAN>TGv2 z^>)78Zi@S!Gizqmd$~D`g%>#=M~?|uR(%Zk7t8~HZ&Qkwj7#}iyKOeU?Y-kLO>QD# znV+8HY5*D84c5;}VNk=+NUCO-?72KD{?IJ71cy$b=6(HMRvqx+(y!JoS=`CiqTcv9 zN1)Ho1X)i)uoGqPPPA=k)_3_RC=D&#CT>+q`ok92?%eO+T{UYBB5%v+G9C&ytC))I zGbKBfms5YH%2l(-Ut>gG%M2hud_sXI2J0BxZp0F%k@7z6!z*DsmgT;tQt7$$^yI|y zb0hK1cY)+Wv`dSlcRqlwO;!0#n?T3f%5{gyHI>L@u~PAtTwhqI;xTANJ+oP^3q#3z zo|fZS_cmX_I!9t{XuPmU4=XwIINeQTkz9n?V|ykwsk9Osl{E$jRMX)8(R?N)F`b_l z7tZeEP!*fHh+0g4(B`^NHOlmd;UrJSF?ZkO{zxY8L`f{Z#g`P^#XvR!-)OuI7>EpNhnYkXG3Xypl2lpqx z7dVssi@)b2D#L!TgB$On#Qd`DVdbdrC388?dpR!maJf`F;v8_{S}Rz)_Ig-Ed%^D} z@xD}X+>~@1GG->veU+8IV)#`})E%1#=WuDBeG?+&K>6y#xI%ecA*U^@junsx!NbSh zhs9%-fBB_zFwOqfA77g}+r|?dnxkdcsL!f*VH&W&zIrYkr=n@ob`Nu3;4ZM#SC7!9 zx?DdGXa%bCT z$3E`!gl-1~jqUR;!Ja@nPnV6Wi8QR!L$f8)a_` z{O&!6r8V|hAGZaVV0NU`8Bj;<_wsM4{S}0BvI1lIVWbSU=lvqR-G?%|>vuQf2^;xz z|H!5x93TfI@y(5_qn{tMgg?18dsDi^!oUPIvv;}V`#C+$qYhi{XPMPfSr!dN-t;sp z{>xE;*XeUB^{7+NZ=LT7rWUp*PlfFq&Y#O>$k>-2e%GaZt($n83=QrpZ%k4cUp{Xt3Rr{L4Kb|>xD|(4yXPUKa zuO9wPAa>_+KgN31srUFF?1@_SGxT$Ht@YX!-4dY-{T3?A^^7>mdnEIO4TDqIP`b;E z6VO8tJA_ihG$VFj-=6_LFocLKDd|Fw^@FVvyAzrz{105>`8#H-vQVoVO5+5SQ@Ha* zqqI3qtKZMi!>~k4*1`-1is_+njYQ4}4CYst5f+jKB;tNLv|1|k^+aWaQxT!{gX@pU z%R&n)K`?njMT^`GfQ{bM8RReJ9U+o}XSUIz>wWL5VZsGcjo?!P;%=!7BTb5h=lV@? zQK^UsVw7w&ND+V2ejf0J6cEF^)ic8OBT(ozb!btCLR8Q1sD@ubs)f1+Dfj)t zTl_|vMrr)enJTN*+2e7&z9~*+zO~*kQJ7L|eLa+0lT==EsmTACa=+X}lgTnslWE-R zYJHx|E_m|5<$^ra1yQTQp7R&~ef{HN=MuRNf^OONt~}uRlfWW+S>|E<4$jUj+jA4G z?45WNiI=LR1DyWW7`*y{%o5gk%lvm~FYswDc*dPJHuQe%pg*r_iZmN z6_fc(wS#Pl(kE%#*;*y!NAkaGZ6$rHr}Z|A>O7%+d5G=Hw^tkCzS6(W?6h9$Ta_QJ zU71O}!m9p=>f`4yO?GHr4Z*>|{HHB%f247{T=A zk2UM3gH!7^(A;Yb=ZG0NXLK@YMD7M3s0Ih|U%%CVc7qBMi9R16qtX!wV3wv2N3%28 zCoo1Z?9LJ zn;JIupygCN(l1nzm?;Fu#T-nkGyyz;JHv+&3f5Q(F*tC_u$(SlkO~GUi9{B!z6y~f z8&Sl5`;(CL1Yl5FvnMnz*-Q2PIH+Y1EK6UqPGHkTg-JIzGr2xr!m0yF&>% zZk}&bqL^1G*}UehLs&0)VjpSbkep*^$y-~z&Hk;-^fnF|MZfyKbJd;K7oyS>Q-eg% zRCKCkJPbwm2Oh9SW7j@PIwaARB(6?yW4V(D&YkIM8z0Ch`Oe286M+(q^vEQj5S23g zngE|(D|+#J%0*Rc5&rArGgZ zyGRE%wK%>6|Kodm+^Ne_xH*L2^jZ9UtLZH8b^Wjp52Hf1!`fRww#q)4C= zkshLwayq>$@5j+=D;FUwy<7L#gP7IsJ<&9zy?)rXvOHGaWVpl{lTW@VBm85u@|Ewy zA}IsI`LFh(Z<*fHM3$S`w%Ienw9Y^NE+p5Uqx;9d+aE{3IJxWc*fB1!Cru*X1 z_v~FWY0r#hb~TM(;^WnQrI^G_laqgDCDybN{lZuxSiTx9{&H{@O{DsCv=X6vW=qiB zxmj8CvL&XA#=c6x`}EO;Uqw+`{q12s(LGrAfE3efLaa})aHGOPJK72EQiE3=5&g{TaTv46P>2*8EIuLBtrqd>6%JWxaw)5tqSz~AUwL^IUV z>*U$Jy*N-RgEad#+2oP8{u-6LK_5m1d0jOh8KLt46D>5;C2aYJdhrxo-fXlWDLiH6e~*~s zu!jxM!E7HK z`EYT4XVcUd)2KD2Xz;?Y(=h>rA`T=m{Eq;Xd_jg300jg%OSZ-yFs;lK5sf%BDX`Ky zD%S{MhQkGk3XbB?E`ab)8D#dQJ|r3TDB^LzuVT{tXzxfN%f41`Fp8vQy-NkVb=+Vf zPH@8XXk*Ask+p^-a2d74p8@<$l9>%D$Tbh32JL|ueJ=qG$~E|88&Q)nmm zjC`#ESo?))5)RLT3$9-=4b?T#aCj90W5LdTr<%G!QL}b}n}sNtX#oBhW?e9g=a$*4m39x$k4~kiw zM3Z*Hccqg}IPv7cF``I18N$j0oRq_&C4ALDDTaUxO$A}nZiNr31IpKnQBCCO}5 z;uI~5@|IbdH_hfFdcE8*-Z(!h3%&YEo-k);6W03bW}8Z{Gi4ZZn-{O2&SU<)bCNT4 z{5>q~Rngk|7$4{`#{c1QTR0PZ`eaY>sbS@GUoI&VH5!hq%~QEp*!h_j$F%-=$^WCL zh->5P^Rx}`%G+fug1fW8Z#BG5SxzLMm!QY1%UGM{=7SDy8daU$%lGZ?Td1<|+~wjr zvRPN>QHJk-7h6S{E@|f-Vz5M6q{MG(Q~_yfR7xNCP=(_1H0Tn+!Xe$`W-=UK2D24_ zs*pfe<1M@d(lq_L2qAtx64Az{j|uCFyItF2%9E@{g?i#~jJj|MX8sgeQ3QM=%OTic z#=RF}qNwLG%`TzqA%h6$X?Z2mzYu139MD0MA=~vtCU+hw=wb22>E+2)$Yj|;2e9Q= z;T2t5Ml0hzZfV(jPS5gq#2eFJ!IMOE9hG9Ud|{eUsA4FG})V%Q)qO zCL(X1stD%+cBCJ%Ypo*L&2uSB7UnxD#v4h%_nzG4@XK}Hm!NUI&8;N!I2~M`68nQ( zA8Bpv&Dgq&DOqQCx{?}`G$5K#j)kQMhI!BLvDa#N$!KUU02q;x)Cqu8Ck!H9w5y{F zEz8)|E1UiKW2Su{MYq0ddD3?Fg%?&cd86_o%QY=C`=>loTm78^7o2P$ORIL}PaPHJ zNQ-QhHoFl_I`3~}^`N}Vn!`p7_4k)iaVok^T5BCTqSdYS0_&WUI9ohDYTw3Ohg~K+ zv(&>hxQ4cQ%ouNtklJpQnpx*&<6b^F=fj$N;zeyy43#Vy=dKN}-3u5I&H@owFsz;#Mgh zzSaJ-hk>{pk1}i2+8;gk@gxHYNp!K8nPJ~^C}8`X=$)VGWQ-4*ZoH%Rhn#jJO@y+n zZV!`HPu-}edXJn5)hk7#qAZ1B5!e2o#*;ThO;e-x9jPX1p~E#>9lX>0nl$$JxeZq% zP_8l^zZ$*<9&=VIJo&1_ySHCRZ`Jw&$+-06W*5pK;v`qL8(R4>Hm{QYOhky0bNpxb<#pg4(Z|Pz_H0@0 zMz8p?^Pa?w)!~xPo1Ko|*xvo-y7#H*w%+dZQS#*zf3nJrTpL44B>Iziay9X*369Pq z*_ca)2~P9$Z)X*URz$Ux*V?Jg?3bgAJ_iM2t$1^)>a44jK81RAStFBqO3~_K>|eM^ z;OZ{wM_QEQQF{S)xAz1w;MAQ7UEq>qwGdd9b^-%hQA{(V#{+&^Uo;7e~b2Csl0RAx25bsS-V+9|kzbZ=E!n-p;DhsM2We{~rnDM*a5wG^R^|S*{vKI3i^b4ya_MxA!pzlbj5MKu}TZwQ3pb)-k( zV1yJxRSf45nnOx8uBqJmIxmklcU50j3m-)g>GlIYrY9>~Dlyrvj($&eg1fyUp4pju zVB*Be)ufvFw)bj0+bsR_uk_JdJk2v$O)cqix%GOV_*JRWDhCy+7~TCx|3c*!^;{*r z44%tL5jH#$r_M2vK=afO>mdVm5rZ`c58YCFhhRhygV_noQu+hR(pCTVTB8AqNkwz1 zdq|(d{h{_w6El1E|2S4RBt?udZb&I$q-bHFC4k!dcXJV>1$Bpy+Iny^Mi`j(%;YZ! zvGYpJO|#OfgVr1=O$JUs?bcg?n;H#Nbr&2@I~WDwMuQ#QO>qfkrU}#&Ue& z_?AYIGgNS_l%EoykfC}b@4u7PPO~*O+Ml?_x@ZqF*GY9g-Kmiyy$GuvtFDsW4=-Ws zC+wdpn3RLvKDpk02GuhUZtiU^y^jwrTAE^7X(0G z!m?%$JkY-)+YiZ}YN0 zSr3LJcsJkArIYk4pKH8#uPw1APp+v*ViLP?DjwO!?pibbBfL!OeJ6&ru1BFo{{6lG zEtEw;(DQyjeTk36MQOh4*9yje&2hfeGDk=B==9lf_(7N*64BR)0v1e@60%4MxsgjH z@j_tafa`1ogw*M%xCQADLHwr_RU5gFai1q@42lIBNkFSm zJ{M{zXf_-rMn&R+jzuM~-oWS}ikjEhDI`>6#-Ptry7NNiGbNJepN~UrDf!k$AS{g0 zLn4SYZ3K1zwtDNOjOp7rANrGQ-`qf!eBKX!eL|WVQ@??CkSKFOgbl4uK7(J8;%Cek zHnT2k-qwG{P1S}e-?z)0bzji@4@k!eiBE&hlplE{(`@=q?P#VlFP9rvIu8kv7W>|H zD;ES87VBh)o{@RHTe4K!Bd$t`52E~?dT8bC`*3t(v9cUmtXINZ_}@=`T~}vbd7Tw_ z`f86C!eSjJ*ID~a4R2&l_NneS#b0H$>pwQuitMhiEP3y_=8&zBzEY2N@20~ab~+%Y za^=0c7-xCT$3~M`y~1}(S@jM&gc(ZZwXwom=uT`nR57yn46@QR!;uTtzJ|SR=QXuz z@UzS{MgQA~P^%h+zS(E9cxO!i(SBzkoftZUN@vD5en1sPwJXSr{ zIZqX7FDIZjmmCP}$Ec0Ul$YNF4veL5Rl((}3V`NG760<>6OW+~F$5q}z8{?-Y*F?Qr$h{98=%bH0CRuM4a@PHd7g>pHn zbcU@s$2Ay;@P;=<*g5LT&Q|YHBwqkmxf;vyfsl$OGY6>S!;y^)r-2}7;y9cRVB18p zQy{Z@C*|(Z`(F?P63&8V39DElC7q}fX8||>aziLo<4Zb@T2$zOPa!HyWy-o7Q~$E* zla?OzqR}H?DeAnt5+Z?{-mUc=Vq>CXwuYa&h9VsVp{$rDa3h5V+lcSzvXP1fWLd~d z^rRT@D3IkP2kwGbW+UdBrf;0~c12GyN?|U}KbD!+oeb`AOEe*v8^zsvOWOWp0Toa7 z$*Fv6K5tst&Y1XVOSDXHj;p1+dED>5{$l-D#Gv+AH z7EoO*3kZu~hd9V0%VjvB1r*R3edVv4sp{(^Iw8>u!P0J5V`5L4kSL`BpJLUt76FkY z97=)ek<=QE1nD#fM_}RxeW_ECFebzQJ|l z&XGEfII3gOewVuZw@966;#5MWuo!rpCS@myBT*qm-8P)woHvnbMDpGXfeiuW9GwZi ze4;k6p~^Q}nk}9Ft*;u*Gl3Qis}mg%l}?j)f7EmYno3n3Q;@o*<;(-?GdL*=7F#pl<7I`p2Azj;h1C63}I1z~meu@xfjw82Uk z!NEuQ;nE8T4j=0O8S_8`f~cawp>J`b=Laei8yWUeZ*hVI@`(^4k1Wt^2w1{C;Wr#k zg&o`LNkirbid`VU2-FRuW1$V=z|~U{s~ljV`ds0MRr_vZ4w17BaR2~yxIy-Oj74t#C5cZ4t1YF@I==Oqzdym6Xr1e z0g4p)w~eYM3hO#OfT)KdG)mww9}gY=m>7`6=Fu+!L<|xH+U+rvfAHl&x|c*MD%E)H4Pcc>YD`I5R>J)X>3LSSxwe;8}M*(#p0{*(^E^2Z^G z3>Z>*Er{}uVmbi3WWwqHZ=~;x1n^X{^uRJK!v5=D5;yNGn&TnRx$oOLfs_$hG#-}w z_-JpAczv*P1H~fVY25p zz+cLfCsDeHX)gIk=zzeB2AH8A^=1f}MJ<2q4^C(yY_y2)yi#VTv}mO*DdLs#Kxh#O z?>0zT44zOXuC{bm_<>(3{2Ha;(e)f|hT)zQsND;q8j!N+@xcNTb4M`~_(p+Y=8m`` zjF<=tf%zVTO)pcJ<8tvBTrN_F{R+`wN|zsWbt#4E_CX{J{Su$Q6O61C6(BF=>xXan zt-&??gJ=!^X%Uea0imSKCb4@ECa^H^e+C;?w%hm|Ph#D#6C#?eg#*lEF(#n{>t$l` zfQS&J=TNlD9WNl2`H}g$^naZS3u-o!KM6#_nDhZo|D0eF?lNIV#3GnD^DGBX(~PEI z_5k47N|+o_^%-eKuR(9>b@)`vRTOuKCGXAfc|t^}EcY2AlXGRFQs~p4S++3<=t#zG zZL1q{S8a0+yMDKMty^M>ZZ<4meSedwbA+E;vm;6ZwQ~_SPWcF({~c{}SzUGSx>u}! zo0iQ8%V*_WST5RsEk1Ye;$CqpF0L+>T*pv#vf=4`c~!1x*AS?B!R#(EJ+(N@HR#m6 zwXQdwWE@8G;;?5s5nkn5cXQj->HW9xwsfo5v>l zmA@1<&cWCZG?C%`ZGmM8L6*&tsDUYV)2!JeIaY98>e$RZj4Svvr9d6<>p}%w$W(ZG zF!>a2Sl%KK$>hCEzX6V>lbYK<#G@r=+=zxsA9*uCb51Tu@RQHQe_iZBoCS5 z;I(79tnrHz+t`6AhorYs=gs$etm7Xlm^JjzxP%VwsG)^WX^6Qxbk%ayam$hm1+)|@ zeTu8_Y6uh7RF=trD=17_)4x8th(SQ$C!~Ix&23spHssK`)}OdL56vKQfH_d3&?7ZI zT^Dd2+;4M=P@h!WTpw2*-eT}QQ%uJjM)Ui}Gm9Oes-JKZCIBqczXET%HOCMh+Qto< zH?)wDM;#2p51%B6Neh?^0gRS_ldk6=?^i6ZzX>;`t8g;q^G7EE78A2U|3Cj(%S8K& zkBQ(Jg>=wYs9yi%PH+n^5d>bCN4%VR`-TqRD45RBK1!Jko?XzWCUtlGn=ulabrsgL zkbf5K&I%>dHVYDqmO2s>>>AeaLy$>SstrA5G&Ww__HiAL2w(X=r{{6)@0nTnkIwJ= zjWU%*=`1mkvf}Gpu6*mVdcgu15mvn=J_@;ro*vRc{{(e5pI7<@gLv1m( zjPDcCe=ZL+^10AHYTIue^IvG(TILbN1o%D|TYCf7n`JyBZT%ywQjw ziMb5Ja=fc*mi6Al5y%$gLvaV)ro{SzhB)|>ZOmlz_5Th)MCX8rHsAjF>)Vd%GHCD7 zaQ|ycRLi-0?FR*cQIUm+{DS@|yq@6&&-WHQsy(7WPAUXxQtZL@B1w)|G#oLY?sR7< zj~gb4CPY*A1W67_mP|}3aG=A48nlHC3kwrXQ&WuzSc@Ig1h6TjPTNmfau=#3hYIqm zdNWm& zB~mEhk!0Z#Yc1{f3#*%qdq8kTyfs)Pk`q8?)+0g$356>F!1`v99Cn0-pYIEFg+KmJ zjRD7B4YHxhDyW%oz`+^Gj)dR}88!RC(^>r4B#28u&)n$W>9Rk_^3$QW@M(c}WRpn`-1&^91NRrDewOtRqwD$m_96qyg3Yy{r_ zH|k=grlt@%bi{K-G;~F(ZnnsQD9!(bZ4R3PJXrABy<8AdC6z$0wrD9(!R?k?@LSs) zU56Zc5Ryq5MGGeTnF1_WRSVxDXz8_AX)&8&k&b_#42 zx(ki~q~H*(p{jeCQ-$n?xIdw8f*?v@$j(!Y7K8UHCnnPHkB%iHO?0;5^@WiaB3K{; zpKMf}V*X2GEkf2K$qJZ$)eB`O{lHC}c2F5hltBz+TIm(Ez|2eiMj;aDjOml{7|jJE z8EWoAR)o=%9w!4Nb;GO4K}65M*TIISOW-ovJ=w?32$aGao(k{V*fr_=y#2ydhJ?33 zFohIdYeWJ|r@Kgwu?mNbCeU^xOa{y6IeIt9>(>YVE?;|=qhm2 zpCo@VekC0 zAFWle0-WnbK#qgr4~O363}-*wchVB2xWVm`W`WqDzK?_gWv9JneP78L7WiLOR2aH~ zs(3qt--nV)$68RgZ5+8im}y2??cYwplPe?6i_f@ zxrHnq(nDRv;R{4CcAYX?0=+pb0&LxBEK*Ybr32aU#p@EDG1YCan`}-99?&hNHXe`R zBHIq`Q{g0QAhUx%XOWJGA}k;i>G((1J}U|+kn$+Aqfk0u(EAB;wMgaTvIz4Hs&CqsggdR<^-yU z#DE%B(W3~lEJl<4D^;Eih(GZgXD`mOht0@E0FusfzEVFD2J3#HL?*+{PW2 zPrN99S4kX3s?oM=TyYpMN+c6GlWf9Dg=U97@Ervsh&gpo-W8(3hshu^Eh@ldS-8#c z$phu*tE(QI3)$Y2Rn*ZZzGfk%`PI^hdV#<&Snz^B^g8D(->9FK-hY{*5uDQ z0Yu<&_N(~-sTf6n_Ga`$@NuGY(bO(g=ep8NJg`qoCJ2cv!vJo?05$#&b;amwTuX*8 zCP)#KZ>|Q&{c=!>6(MxQg(1Vh7$?5-lw|Deka4rS_1`ukYN3mOpfCUz9tse^V;F2D zq*_kE8BKkyBsD+f{@2Xf!~bvPOm))d{d`0@Ol;dlcBk7>%VUt|wRu`OCG=~Qz|+0+ zSKB_v!w5I1ma4AuIKki?sp|L3dzIm(z2QV6aOxb0L2L%Jpd69!I#3t6bh z=B*9dmoQa*aiIri_Ak3^SNXH}=f8%U0bD$mR<)i&7JM5VK}Ptw%NmO{7WrIoLBkPH zp!un44-ZtGKw&jnF+f`L^#$7)QVH`ymC^4+l@s(ELXOg$8b*PQ0!6}&k}E%0k1`9w z_L8Qt6@5s$u|!dGt=cJ5zlS@R2p6U}gqqRs^cpctqT?e` zIfcdIP??``%E}mO)(#vVM2Z-~NS=#%F6dVlAP5gkt4A0ZBSEA!prpg6ufoQ>+|6h% z8Fe6=-_IREDn9UO{eddnhXY>{UnoP4_#hvi#t1R;(cG2U@Fm5l@Lx>5K%f&ALz3=R zi{qp(;NepoGj?A!Q7p<64K-*8cG$5|g^DJR0V0Woh<1<$!c_<6$k`xj+43Dxc6v}fcs4}r^VU7HwMCmBsT!~)TBd;Tm9k+&7XP& zGD8YlFp)d=L}o|NgdY)7W_1d3(ovfnUM0|2+~r&tYDqv_JY5clj1RV$TR zYt2a%^f&Np$ISViIs2Lx99%70nUDKlM%zt_i{BOZp0auVK_zW*f$+Peqk}{$h>}~P zRQd2GTo%!PBp?l8Lh6w?Lgk6b{-rw08`4sWjlVAG0$=2eZHk9*1I+l88z23gV0s`1 z_^uHz(@AjZ(dA*^Baz+(&I3s(`bUf)`z66AZbTgA6KEqt5biMJUJoTiiP}L7{GgNX zln=<<+cK?U3$aCNjv1uLvG$+E>*T5e9d%A(Ci!bwhmfEk%f6*S`0OzCf8-#=9_Lpn zex$g=tOLNBR3)k46;|Q}xbYvSWk0ZuB^pnEw-PdgJ)L3u^J7y9#9^>)RPg(|a8oB# z`o4^_io$sD9s#HkMTLy+Y$$4aU|Y zJTCh8#!IVEJ1vZ6%l6i@3F4yi&RXpAzYQ~$6m?IViDmozobT2{zZ1M#pO@3fdsS|< zpL@0!=~Jh-mBnz#yjhhlY~v4YS-*jg69(_ezgxEAkRr|&kI_QeqEp^U5qgD#`1L?U3{@)pZQtcG2F6 zfX0@QVDA`YPlv)&zzFCZ`7a>zZ)a*#8SE2dAFGfY7pT77ibli*y8rHFH#m8w>2o9$ z{*K{2%3QB9m(5eF?^+hN{)c1Pf|{ zPklmtw$@^Svdt>?bET%jdj~RO_F|3~`0%4$Y1^gL`_lZO&bx`f>qoOn+i(&1&a;0$ zlN$3h#VAF4hU1B?{Mm#+(n}wh;hkEo{Nl7w*T6|nrK5zuo)mM!;J!^8&wNp6C3Wyq zv?9|~mnMTlx`m^{2s(rI@tReOLJfUzvrkXdpjkx9pi^{_Q*zSoHUiuozrlk22FU%Z z7%+`l(#T?-H21xl4e0Ms2SK~2pr9vCz!94KMduGvY6c|^3qqEa(jo=%*l`E#_icE* zI&FF)3oHgyTEB7u@+yb0wF$EbP*jfdDy8Oz*g;0(YW-%E!*5vG^o6gkC=Uw#*$B}F zWo+~7;JjCM*&Q!iZ)}h z4@deHi|KW|f$+(99U4rf;hu(!6+V6uhvHu$P5jb)6t}7J`t0iJ%~sAztVJtgefl4H zW)~^%Rx~?Na1=u;(JNBd^(AB+itOPm- zp3GgK_jqU$iv=h}=&!sUd$1Lqqz0!fase8Dskk={o%>?9b8&*mTZqe2^XhUDLC<5%~2HwFTKaVy5_ zHpnp3gTpW-D||tbRI9QLYJfvf%713!^@ka01 z%kE#x1(}!P@t&XAm4n4ciGivKGvo5xdd zl6MfF)GH{0K-_lK(!>oO{8^A7idY>L+c`{Tct0MpafrSfc*<7X;NA z%@A70LfZc^vDds8MUiKw7K=XYOHcfwv;Q+`KsMjNq@}b@8aX_$?qjiU9uaC{>Gp-T zNha(>Mw_kzhXC{+pp1aZU1PGXhxDhW3ZLK=VWx$W(EhJl78>>sx}Fr1*0ueJ&dZn} zYV_RRuW3?$X3l_lS0YZzR?(|(ctH#)mf>C*0XRF4WR$w?j5@ps!X!&w1@$G{zQxThNP^@k0Gnwxskt_nw zoRFiW=PdIsO&ZLA?;ywoC50{xtX_XlkpY;>NWRt@{r4oaz^Y%D;GQBD1Nm=iUxG-8 zq@bI_X_%Wf7^ra-3|O~x1roAwtcDwQaxz~^uV&>`qVFbDbb87n-IqiInxG?YAZZK} zp`+(dKaiPeb`vd?%&Y)Om^y)1Q1+moHGt+6kV7Hbb_S_jx)nTuS{p{^ntiZ_fSFj{ zU_1rgFfcd=2)2U%79HxSKj~#XFE>;G&lnxMm;r{0?XGZ5*k`_DVz~POt@7MEp@Cy%zITaN@t@q|A4|yWMAgF zn14K=oC!dHx2Y|FpI*?wnL0E@nO=rRc%T`h@?`k#I5~(XFt}8FBLh=zC@w0rMDW+t z;jVHl3-oveRci2Igf9S!7}yXAl?nvJWVr3Vj{zd}{YzJRdp~RlFq{EgNODAv4l4af zGYE^6dP@-$G=9XltY|POKr`8XTW^j&9Gj9IVkgzl(XxIHSx?0E|D$d&IxS&2IPgQK zAXIU;A~8Uua;=Xf>l?l6m@I_B#*i_j9Mn=(kRMDKM&e2AKU?L@3z{KG>SL>P)__J8dLqNz^|sQ&vy z(>z+xPv+}SjL~wDp%lJ2_BA z9^pfS`BRPgSfk{KTYIPJ@Bj+l=@B#-Jt8Aj#EQ=d1y|?Bj^5#rHU$=z_&G}cZ#L4r z&G^VYI_HXL4mVl4)_2Z82EDAb*tUM4Ct|+JW3;y_JKxRFZfx97$KFzUkZ{~^GB=Kn zME4b=xZ_G~hdiYdgQl6Pya`Guf`m@s7LQh1ufXpV3^FJUI6FFe;BqNQZL%;2S<0tS zTD|QcZjzwg+-&T&@s68tt)VNqqXrGsf_oqVKfR`Lm6Msc1QSvAF}k#PZd7!oM^a8u z+u8=XM`eX2)jV5b0I{v_Wsy%rfu_{7kQ^4zf|u(cy#C9d$d8z=6QI)lRdg^Vu%T-C zg3>xN9p~nnaBS(?XY?o{Hk#5p91pjrZD|8~v&2>II{krC%vwJ@4@eIYS7w)qtqBBJ z;Xx1M&+E@aJeRA{rw25H7bKLRld)f3Ao1=H;>uZ;w;oh$uuP zC}1Rp08evqrEu1Lp?R*~!ui_*m zHD5v_YpN;Ne0cjP6M>oKsLikL5jF?b?_h)4h?QNXnm7KZ5i$A2Bh`~g?GCLYb^1Pu zaMYj9^Su*WFjf`Jq|`0P5`mi6x!OVdy&a+@#~a$VlEJ=>KwOH zWxoD;KV_XBtU4Uz!b;0nuD+ieEJX}lJlr7|;k>5M46$7aL~YdlQ;X=7ZVZK&GXhsgD+pF+)3B60;@Q7FO1ZK(fsxwYd!0V^nk8w;%3cbE5LmT!4_Wk;E5}gN4 z+!AI_5md1 zW5tS(#bl)@k;m{qohq_IBuO&^2Ww)oq9Kf*TB}w$DAME?45{RNp=xz zXInrsq@LkB{-arV-I! zNNygd{B&Nvo^p*&U`y$1<*#fj2k2N9qF=;Zz^Zvc!kF^ikjpJg z#foS^px$WBewfC=an3?msJ&PZ-;^8YGRl98rMHfVIqp-w{%b-hS-8Q^ktT)^pC&>u ztZ`f$f;Pr4>E2lC7E1BY?2;(B_L+7#$v*Q!ry$_Y6dKjM3Pd7g5_B3&*aqY98+Z0P znz%*_sB}Fl>b&ybvC%Q9UvT$s-l8Sat^E1&{ba+3nBtm$#oJZEKcCk8P)yxNX&s$*eR*pR=2Ak`7?RS;K!XtFdw6s_K z^!JokPEfb%-Llrl`M?+qM#+;VDz7EA?xC7ehHfY#P7N40f_5+2!iZ|yCP@(Wu#MJL z%;mvffm$FD@TeC{hxM*2@M1F%#R&?$iYm(0LOB7^fs~YZ)u3VusUBz#ccoecfP<(K zP?2t{am0hiRbiq_IMg_sc4Bhh$sYF)Wa$w0W^&2>wNYq;xd31 z1u$mN1U~@CDj&~=X;WLb_PQI-rub0EP1u!#qfLccyY44VK_Ei`mE0prfU}M_*$gBG zI?uCS*%YqxFc_85Gn3*EH+z=qy4-iY#YM375tizYtS~)mUvdV6rB`j*-n^ejc*x1q z{$s6i|9fF;Rbz+z0H`<@7hx=eWR|b#j5HYZg&42bohOKd!!m_L2xr+A5}6+u_W-GZ z`YKlx=1)_L?0ctY+0r&D2vd32*|5MoiMatU<)|%q6yRAzRAAq~)jXc*HoFuYsaFe{ zIG9_cac~w;uwHMW%fh&a87n45GnI;|LfvgT>MkL^!x`-hCx$~~vDs!cz9Qy=(6l6S zjJ*-<-M5xFcyIy?X3o3`pAauY#wcTfUPmbx%RgVqmbP^vyNW7zyA1^rE?0MnDp!f2 z!*fbPWNA4K9U~2kDhmXZ7!ZMoT>o9kf0pXYzl;1HHA0KElO{}rx|?9;l~g=!g%=G& zfxY52!5~yP43}4{+k_&_WsvUsvQ!GEMCD14dH12qsmtE-`s#zvr|-14^pUKfeqOo# zq`F2sG*0WZjrBxj`8l+Nw}Hmj(q$0cq=j+K1^TP&yvJGliL6af)3!fHedW(%COf+x zx3nscHp%m`B$_s;4*u@(tJHYhWky(DvAu_=P36L^T~6P{rq=oUZ!4A3fv#cc_N!-} z`F6o~O7@&)x7LcS+{!JOWg2(q(RJgEtlI55|!4ba#qhLh1&FRYNg9SORxMb?#+?BQyPsP+4_S<3%(_P;8t7 zWV3z*h-SI7q}Ee@`Asn=Cez#UTRaATY@I8BwuX|&af$gK*?#p#V%-G78zln3#dPeY z2>-#138RPw$jzwri;anS*u;q4k&GQE)L-tb5yv5lIFJ#Ap_WG;UChO0h+#uvrdYfU z!c0i!VkNNgv*W#cjiU+)IY-;k<2a8TQezrKC*}EutyqjbnNIZa%EJ-&!VCF@`uUir zg3NzK8DRce^2(JLYwLQ39pY6$24)09P3G`y_kr*zsaBcz-MrC zdZClcIR#(PgchwOlc8QHnsK13@ynO;{ggu2IMc8z?QLv!^y^DeOu7wguon-REP$X~ zx0q=*KAt!16b(P1ed&8FKi03RO|IJ`a0 zVxF&?FOI{6=%YbqV?26#?+kl1 zS~Y%EPN1#87-sK8b^l0pcx>fy!n90|HR~KIc-)8mjv4k=EfZVqovqRbx#%fA9*S5x z_Q<9ZpvT^1zW+E-<}*p5VA+eTrktVi5obbx&1}wgYhpnS=P2r61fSKUvFV3YPZN} zkt{9nrYX%*$*La-2)b5Ulj)Q@qCtx)RS;p0z8<2gQ>fraoswl%VU`l}REm2EY?em& z>4c_^D2F;K(Ormt(Ku~CjMQKl8&j} zYyLqP9iiN8-QEmK+o*4jJmx9~UGeFpe#MXpL_A%rs%SJjHS(&1JXgzm>g%`LyJ1rI z4Dd2o5N`a>Hr=*^o;Ni?f&+hyYi+?gb0qDP?HW~8iU$kHisx7D`(^}JhwsPfEtHV# z>*lj!#gM;)X%)(EmRcPy4{4T{OjdjvCYQY5#uy0J&WS5AbT(V7_zA#_Vst*KFy+PlUnw0z`?maY>u-78xHQN*%CRhq~= zp3Y*qK5?tDX%5S@&*xp#CNGWRh*V%su)m$&H=mrEG>z072X7_(Zblraq(aY;?9Nx$ zj4v`KtD5NF1^2$H?D)RxpO5gBaj&W|v$Y(s!))Tf5T(p9-t;8#_>b^F(ubRN7!+YQ;JG7s&SobwH_jt7&^O zvxiiUl59r>Eq0JQe--b6v)G+2%fV7FNeogEhy)Ca3LEp3sa#J2`GLgGSMk$LBNJq) zBYR!LUw?^;MvRNX1K69d6Co^}_9!Lnd|GxXN8x|9fuuZJw+O)o>^KsokYIIXvEjBp%vAZ-dbYN_Dqb<%Ki1(JQ zw0Iss?nHg+m&p#`c(Bsb!Qyn0SCNGEC$gb; zg)HekC0X&mPGA+??OB7a_`@zlC9h zYLrU<82U@k2izE6D&BP$F}m$j z;yPi!11XIv24Z(QU|+NPVuNsiS^~d^0uPfA*&k#A1%Vh}Ih4YM#Uyf^9m)*ygn>75 z6>DTT%JGO?VDo)fPpHnVSfb%f*yoV~g3`iub*$q}lBqV1KKVc70qv#^&Gel6k(f+l z%(x$t)5}qqFWi5BgQ3fj#X7rhn$9cPv928v8_0|Pw(@JEZ>QiME+NO~2uV$C?n~NR zsEDl>jV{5e#Oclc#mQSu1F-dZ(hFK~D+R}vkXRRUILMRHwuThxFNw+9-H}&tqbMXK zP1pd21V#~YyE}C<{Vi)}X$&6;gX(DX<9X64tCvE8UmG*oqkJ&nKP_CP*qix_0?$tl0W#V?D$U+;8C9@PR!iSTW+_+)#M&e8 zN3==|`{u8)Qi|6mCN;k+Hn$(;{0zyT_^zF6_YZFKrZHd?CC|3~5X0+n>NjtUb0WEQ zSawVPRXjOPxpk(wJhl~ibb2i8k6=lgAZ)NPRj&of_2k(U+Zxj^;@6iud7io46ED-K zy%~+kl$6L6$0_IhGWd;Jwlti#wX4vuGxMwApy{H&BJWysF~(h<$NE8LWq*L__2X2M zyuf0jaC8>8xF$Q#LbVqPf&-$ro@N;GiPM1hK?ZB--wN9&vkaE1f!NWm{LKgokSYf` zD3|NQTp%_LmYKvA8w_exg`Cmmun{gc@(d}oKWkk2^Hwu1w!1s6_$*xU-Au_vu7Q(k z-r-;_Yb{*0YXTBhx=NToMW@1UVTLU1aX`qM{~|f_ZC?Uq=L>d|@xx$XrzVWIQICrt%~0Mc>lC)-OikoL{`{|bj^0a$BB$Nflun_Sefv~E z%lCK}mB852R@+>~3v|&%O7!XcylK3qADSj)j0^6@+1!Kmu6Fmg zW2h_*iha4l>hT3_cT~qE3c!W8_9@@G4>q6vcX;}*4kppl>Ahbg!JqO>l@A-@p!6=( zjaAc$m7D3*NY-5e&S>GF*T1sT?@i^em)V67d$Ju(PcmMwkVZ1Dt3DRG?nqJ4`JSvX zZ>&AC95%wxAw3}-bTF04cs_IJlleG7jw9&uZB~`;M}VMU=y;S7&}2%q&b= zenTynjD-S>YA4y)iRyqyWr{b#p1(zeqkWgxsWaIi{cg zE@p=tL_KECqk#V|MyQD=vVR1fO`NC!ikes6Uq&4aLjfm~5ofGvKtV??w9Y0DATa^O zVxbheMk9ho$M7-?sfmqN5d?`J0kgo=5NA?0rhP%dM6pr(SQy=xjgNIPr&VS%wOa5X z5>v>P3arwkawJiV&xevKjMQI|iPF~8WX=?fLqn}C$C5!R#}-}vz%h?ip0W+sd-xkX zAYTaGkNFENk-;MP!rle%qfYF1@2MHYS3IK^14%&XG6iz>KGEKti0ls0o?4ZrhB&fF z|E1)GN~mHH5EDrR9s7(OnXmb+8QJuAE;R3?-R#2F(6x5wNF(^;uO08YDz}j`uk!kT z-CAiaOBuS4OYSpABNaNEi5ZWY9n&RpjR^ydB~w0Xo?BB*24*Q4lX-Zwc-JbWj~A3V zJ|I+IJh6ypNE$_|J+sgRkqh zl5tvfS+BUCR}qQW46{Jn;cwMg{r)W5hR6TSeSWb$cmGtgQZj_G(|GSTc)jK_D4dk0 z{8##k*Xm-q@=Y}9R`ThnD8xl;X|tiPLHr>Z3#YTRu6n5kRA;Z?e{tvkDyFJi&z=-Sg_rL(%>?&>lpdu zQb~g0Nl--s;;7EeoMCd;Siph&yXPc0Gh*Y}NI+^JK{D7gp-as9dJkU<`BVhy zDJcaCaoCfT?q^B&P7WE5^Ut>^Di}IbHk3(4)8|$`Nm~k)n+hjc`ZfK_x>{Rx+P4lH z)W>QQPPf&}yK@y^e^-oc;;9?K$v@JZtdwTl96*~F9ETP}>}|T0=2&+hfvvM=3USxE z(=aWlT3jB6x$y9xu{x)xin^~COoF&J|85puc+U`5Q8(t;-{vTR^#6_VmWNny0j=LZ;jJBN0+gb+#P(i;UvA9j4qc>G=*zddVTBsE9c&! z&vtv+Xutm(r+7+6|7_*d#cg|eZ6i^0exWgOX*)gIo7KeKU=;muQ>C%)?XPJS$d0>H?}y>y7y=V4m{(BajKEOa`|az9rM|> z`te1f6ij}{e=Y9eaB)HTp7=>NHk0ECKX>h_YcUTz(0q{OAkG*{s^VOk(aH;QE)8zD zB-vO_5t{pu01sJXXEbFUvxd;n2zhXd6|#jPaEvkmi4`yB@xa*HKAx#a!k^&8SEE9M z{Yo*mdgqkguzBDZF zC6+~#sZUBUSxkm(e-`cu#Q%A6STA`PP4O3y`dBdKGrXLo8A=EH`%Rr2e_I%CXl4{R z9O#C*uFHfgCX6pc#MihSlg@|*cv>=~93B)v4s0|}QK#D%Xdp=piSmYM2k)^Zst)8G zWN6xAw3O{1qU7C2=MVz|I=E$b%w9a>A!2h&6b(3AuyO$NLn$kyo%IhBZ;;t?uDLxO zB?YPH46BO~W6+PUiwzF|5|EEq{FE&9&o9E~hk`4YGzvu+BZOgq$X6gL078CjW=FPD z#Ji&_Kr~)5!)m|nCx7j~&`-#Rw=7oB5u^iEseNJ!KS#+0>jPt1E##*H38IiZwi6aZ zfRsI%oby1o09%6USRySo|Fw`IGVw72R-JCl#ae})QlxWh(*W1OIM<=Q@S*L${EAOq z+jp_GEyVqOi$70CLy?!6lA<~QsVf^=u1JkF6E6(MLaN6Uba_ELqTy3`pfAVQAZz`; zC*BG|6^2$DiCXS!RC&0rCN|RFU(nB@%@*lj#sG7U$qOX9$CPI^d74M;W>=}#uS7JN z8;?P!AjV~u-G9uvp`8n8F2o)IMkNrwg#tELmcQJ5v@Ffnc-U}_X^vXXacbMw(4V~T zm`lk=cdFrL5#3AXTw9LNvatC*cQUtnO@#)HgW1k1rT4kA*y&og?m44KdMXm2=?rs` z<>NlK^Y-|De#S2QIt87$aoK)jKSYgE zY8%Mnan$@@YBOo@-nK`WFBb4p)}loy)}l#~Xa!AT37BS0h;NlLiIr~v5oH1G@RtY% z^*o_hHh-4E?G_W9`m^C1pTxtk18Q|~kv2G@fw6v=FBnWyC0lwo89f;^h=e6G(YT^j zNa7776#6b#8Fq2QA}cxu6gv2^17O8hUW!Db%tj&s0BM?3AOJ~*)sR5dtI{ZPL_}3_qfCFZYo;z8pm?#7k1(5znLa@EMmQ-Bom0Ql4b)_<-R@dL)ayfJ6SojU_16#{x_$nZDTD2|0i0f^r;~Kk+aSQGyrhdRA!3b7O+H@*5c$$O?vN&8HnD z)B@9BbDT7J!)Z+o+0T>locGI_MJ9=ln~m-sL5vZTK6HFnXzKT?jgL6*?MmJ(b)T^( zqLN*l3n!!2A$_D@>vbQ4v$Hp>ZKJJoAO36^IjGW@P9r`BH6n&|txD;wVH4U{Gd9s7 zIpz-)14Ws9M-qEMhodZxs2jZ3L+&8P+YUYT1iDEr%mi12;G)XH zVMgH*(#8cu=p~hi%D4M3m;7Y`U-sBPx*!0Qu2^U+$xq~}sAn$e6w64Wnd3CC8%7G= zy#f1$?{B!NJK^O41LUy#1CLg7W^)}TfcecY|KQPkxnszS#DmdoEqB+i+Xf>{AVfv3 zvM@MOoJtXqE(1mt$znm%i>2*#h2rOA?UW!GM;9v}olN9{gC{WMesTQiZ42r-jRcl* zfJpZ>3Y_f|bkxht#_Hq@xH1kXC!eM_JB7l>f+^9G&k|Pbh^u3S57^5xoCFIbib{}U ziVE(-UtmyMXo~rBRH#1OZb4E;g{$WluG}8W5-OkpQo=DBWVCHCiXp{wFhx9(sq&E9V(FD)>>7JMCpdLRsO9{LV-(-Yaa;w$3C7F)xXfy@~GO#?>Xh^hRg%(4GR}mox|2x&HHVQ%7|>f`3eRPP@MR z2i7wp?MCthv&$f)yESNS?n|AhLnb-cjETh{%Y@F?d>$FQ#__gXiBk7XYVn1?>5OJ8 zdCo~B2&_xUt@2Z1hpw?S|FL0LNW~~nHVcmz@`O0pLkdeQ2Q;|CusDzab8D=v(5zTg zZk|vV5RjHj`?pkA(yq|ItIbp8kHGmyNl{1hGv=|X-tek`5$@>Ahg0L49HNGrN=`%F z&yeVb8oC`Hu0ir-XijBH%lk+4o#Cw~=+KT|Y98_}yWn#e_#)CV+G)g&C$=$$178$a zDsPvCekmPj>nf%aD%Mj;P%Ya69WXmN3MUYv@e0poCNfK<#`|$0}af-AR^^b{=I0av8K!8reFtR*>&L>VK z^fEHyM#snsZzN*T$u~Z(r(~K@pof-aEwl+eRgTR)u7hyDxavzCzU&#RTt0Z2i`Q@d z8m=!tM5eh9U-RdVVCE!GO#jR@?Y7q*>Z)iD4l{M9J5mP@ciU;6-+0Vkfg>Mlbch@+ z{*t&G&Z8{e!>8|Vc!+L^zq&eJQ!lSSMc>?TA94QtivGp^viXhphgo06z>=La&tfxQugJ#wPYF7m z!{rOvVl18W?I^?`==fusnTN3R`qdM7| z#nS0}va-*1=kQ|h+3Uw$w~$dp<`v;)w|di$c%cMpR*usJcAv$~=r*C|t^Esx zG~T@$a-;y}oE(QeA-Tzz1pKPMjC%X*s`QS4Bon1^uyRn9x)|>0@?Drok%xqbjSV<*nL5g@iBY44R z3+RXe0zpi-A#n<#(WL%IACI_(P%bB@)Ylc=q14-6X1%jR)osOI4m9^ow^{C7+mY=H zr8f_V18kj}FGijSgwH}X&I#DRF&nu%d#gr_C9GWgc*}Ts8Yj$KZa*lx_a;p}gYJeVlrPU9PM3b!RBt>_@vyX7(XcvX4C)?pIg6 z-M(6iulI)@LW+n>M7g%VAFY$-ztD1im)%JoT{`i0K7Va@%s)LJWTxYlZRa{%y4M-2 z{PEuDEK~$7dA-)EpuydK)7z||!r3rxyVlM%+e(_LZ{F5swz#728Rp<-#pWQqxa;@8 zcu^J~cBkkGq_ObLjXUWvy2z{6>lJuaj)-=Y+HS54EMcr#{U&u@A@TlP#72XxMLmXern*iY!ke-N(# zXIOg-PA;CzIQOItB=8)qNb;9tu`t^Be2XT1=<$Tv8vWRW5w-WIYISK!P%AsHQX*m& z)e{VgtIP;KT~fpfNduZ{%lk?AOMW!RojuROHbMb%YhwnU%jr{n?M=kGnQpa3`8y#` z+axl^5$`&sMXoQj#fq>V?_u&I&1a2bE7XjW+a45mqLoR$OG~>#klpT z{XmKr)0OL-Z%%#9`U308t;zP%N%Gb0m2?EYDN7os<;G~M35MWjaCcgNQkR_1X!-JO z(auziT7%wM0x5S^Hdopo6)*SDSGhtJoDk;#$tiC>kICqjYS^0KZhU#ZbCKKDId1I; z#EHZE0vje}a)N50a}!C$$gsVrdK7c~T^b}}A%2Ob+w&f^HE|ujsZ=n8jP*F3`UK%} zIODa6Xj?O@;WMnBgvg6)q+%t|d@pXNLJdogr#PVrJ7%uQ}FifjG(~Jq5#XUrx zFazpH3U6Lfc9FTzvU?DleFh{aES_=2Ydlo7X|U5qOQ+0ri!`PzSRPME#-w0ovmvxB zQ4j!2OvDMpudv0kRVFTAX)JSv_D2LGYhbZO97)5d+A?=YcOHmX3VxNp(qp+i5Ge$d zIV>UrJwrH(|M&zH$RM#<;~D6@?+ie?!%s|Ok%6Mtw=pp|%vWk6DT4K-0_R!8d zH|AX0DAb&daJ$3FX9nmQGarfH{Df55QlvTl`|RwZI|+=R4c<+cbE6oh@jinb#4GBB zcFtlmbJoWRnqjqb&R}Erj>Za#*F(K^dUFnMjolzVJ$kK&{e1iP5>$Cn7hw@{oiV6f~4FOL!gnPgKHCWyYD$dh*Fh~LO* zwUd;vvq5p2@q2@r_G)VQPPisR+8{^7g=W=`ibEsJR$uuf`nn>My1_UF@UKw$ziOiW1{7kazK=#~ zgZK+fsl-P~--inZV0s1&!9j5DS{$l@o?0~av-QruLc@^ojTQJs`mvTrg~Y80Wz&8W z7)VQ{KY8@)nrelyxWT_9EB*;$;r(uoHa=qiN1dB8)ARA^>IyV$3Y=a`&^Fp%x7_P+yqlwwWWm#ieHk<>S`6^Q_E|d( zgLZ2{{Wy1jtl#-m-zKkE*kjaF4=KBfx=XQqDn7R%L_iSIKvzn$uyfKty%T|tL(}{v zStK_J5F=n!c=I2E^COqPWeT`UDE35UBAaD-iXw;h6CJ}uHZOxacDJX8CRkQqi|Q|j zI|fWcqv{kAioZnO)Z+vxrxiZ_!jJc#SZ-FRtr~$$$*i&TCF7KeNu}rH)Sa0XU<#$( z+gQR(j*h8y)RT^2LA}Xyl?6@w%5&R=+sLm@3pLsO_8mou9bu^Y`NUyD1RIiAnxG$t zFPZUath&!B6PFAXO1h_8oJC|cvIJ#^!~-`akT@5MNT{y0v3Wj0uM>pkQ`pfba3(#Q zeBMZV3rU?PIXHt-dK>d(kAvLqEtBZaSE)LCtdMV8RbqsV4v^AR=c3h=J!3=%rhIK| z?vRCmh93+%86O0P0s@3bzHA-_^7GsFj&g~|aX<-IdfPH~Fca*4HLqai}eOXH|Xk^IvzKl}ZTtDId;+PM_DXsPeM78yOD}BZp^TsId z;t0JV9M3p8lG^)suek-;O~cM*@wI46)YIwreGT4p6lb%UYqaQ*2WW}3&+&xQ1nWuM z%^he;(;NBUuquRWW}np!n~|NN65x_;trb>lR`y{P8XogC|G5cwBL@yn-j!m>reDV0 z9=#)O*FBf2gQjP^FGm}_Js!r-?eT8TFI|(D;W}lm4eD*2`W-FPjtKFnIeGu zMWFayJKoZ$mSdD|R&mUvdGbqz<0O)CewhkappF(WJtu5*x#NTURT5ewtk!-UHcQ1~ zTP4_MNil@E4uM8rbHyZm`q=0>&|Le5_3qs#R}4PZ&6)=^I(YuUWbY588^zg5w} zo7v^-{^*V{h0uy*1OfJB+TxL-SqQb9C}-qhx3>DJr#=U*jU%MF=yqo+{Ms?b(3x6R zBYNuJT_(+uGV!^)c(s>6jJs>#UoDz!>BM3v@H~_bJ8<(2B_M=Yi?495Pou{<@K!1S z9>}88`{FgT^jtYe9H;LVNg;`}?all0l z!4&keZWy4V#!P|%`aDJ$=q=bc#Ab~Y=8>%?XAde74U~|C>ULcS9BG5=nZG~{ML=EX za3@aGoZ#z>OH(l@8VGuF$YRb?&Wv0fd|n7#pe}TtUc5jFVCOwS0YAv6ZK`+~MI;`U zf4GxOP`*Zyj(pb7Bms`(v%w?*dMmrKwum}icV~$#Ee1eKk{bm!`IMvzUAo@=@A4Vv zn`Vnq{83^^x&6fOOR_Rif6(|dHL>C`cXMR!OJCur+)Rc{CxI$#Fw_4e@hjv17ZBL* zTUDaLb82)6Ca{_>34b-OAtb5%|B2r~Rpar0e7_{@)Za!D^of2>UtJ4P|D@du~R^a!3ha^71H>P~$cc1&aW4Z{tLW|8YMB=VOTJ@MeI? zPYnZOqjf7y6$gj*SYZ|Uy_8&7TD<+4QgvfZ`Y$S58v6PAJ4uWGCoET23}~4sap?Sh z5?K%>Vg4X-R^iN@|1TrBA*>jDat^pZNF@PHmN%bMLmPae4SMF+2#3B=BXedzv*M%> zF6-LCS(KH2Nd&5Sfy+IjX?!Mu{ip;;sj2#q3RbEjwy{l>n@jkYnn@6FDk%#DDY6cp zyVwH09kZlG`ap19ukAye+iG{|*j7 zK%c*qsw7nSnk0`M>eD{GtmHQ*7iQ!tZbK&52l{gaYPjDy=73#!jZx^5>gfD{{P_=3 zZ`A1Je7;A@x^>6lu$_;pAmjB#OFwLV9Ls$|0;yT1GY$n;ZPcR+u=*3QhMNze_6hR? zS+s-tQ_v)HWT^OAigBnh9r|wo|8nS5g1SJZHzeeLR8u0Cls~qPNbaB(qH#$PnRcfR z8-+3GE-U}vV>97oM;}73J^#<0dML-}maL#Z4`cAi&GFyJf4uR9n1lK>>*N)mdm zO(>7V%=%SHpwbf%@E={Ms2PH^YUgQBkkE~Paten0JFgg>I+Ua5|FZ3mB2T{ak|nY* zE6x;umc&$FCBeRp=AZv5!wiWx{$gT5tFQz@Dk^=TFq)5Y-FZQp0+#>4p8Am&CfWQyr zu-<({jb-qelp0g@AJ6uH!=NKIe$-&lWu`$Bw@Z%aRR9$`eFFc(nyo{5IC@Z}7Li~z zYuFh3Vxx!*4heXqla~KWD=-rBSqm8gA({qg3gko;>0*dfA9dD0KhwZS+oDoLAXt+T zp^%b0qo2lUsn5p$lX+(TT9cY$@EE4T5Sac9SpR3aC{JaU>GxB|+xE{XrWsiC;l)hiQb3JTT)P zm8@Xfp0_wE*;z&`J942mrG&9stHJ=8dw5c>f=WoIa+0cLxUx_-A>Xig0+M-lCBR_; zbBw~%bZ<$V3>e{{Jj`$`d9Vyv+%hQUYl<5|^%}^YtGTmaKLn`xwtGowQ(CK{&N}$O z+&)YmwqzOY6M%>UU_NzYStMWCXriG`NW2#-Z(>@=$_&GXX+9MhDHNQnGCJz|r(5>k z9n*L!RzvMC6sdkv+)P$pAzFENoQj!WtmnQBfsX6NnqQ#M1RYSCYl&}cZJypQ1^*X# z%5SDl2RU~61Ax8bJe+=!jhtND3w$2G@V0Rtmj>X#gC>z5wvYoRcASFXi>c3o;EtY| zzn==Cp9&C`ozzjOHy|h<`zDgE%7FMS-HG8JiH~)EBUPwaT*zJOFNUdD+c%4>q6~n( zN5>ss1exJOiYg0o5-YVJ1G{f(LN_8+!kaqQQ9HHsvLRf z`;EHD?d79~+8>~XGKH6*d`C|L(-fdWRbUzWiM7Pb-4HwA2=i#6u`i~*F1T);~Xnp$Th-jV34 zO8Ut}sOttBsMNhTxFbI;n1%-`?;XP0a;-cwR6qIxy&^QaV|$D~c8)gg(ZX-^K~Wgm zkBV{$TW_~~zKJ$T-I$jdEm+M$$m|o8UwI}+GA*2O872bNuGmOU36uwzDOfU^D9;b>2pzM7X-c^Py4CdE?sfj@gWb{C!1uRad zih&^=*`a{}u%Qf_(KMEY5`MCiZmy6nxrU)|H|ap>5n_hsquv)YXuIejP$m<|4}wkz z2QUr6kPNmZ0{c;L0FTtv+gQi zCT_yT8zS!D0%z|inS7jcD5P;qvnKn*13;Cm=O#1b4T0F8V2oEMz& zkMJ_n5=?VCSmB4Y@?{zcj&d(X7V6LXNYmhCRf^F9O!J^vi$Zxg>S=_-djm{?Ozpk~ zl7WGS+#^=W^}-`CESY}9qDs+41OnmTu;MWOjRKSf9CoNxlS3%`6n}oZh->-*RKD!3D{G4UxtpD|gEDb=vQcTFFEy%j8pxN~2_z*{2xK1oBg&4l#wzWF?)h3F1Tw z-xo4r5bMKjW2PY#DXLs`2+r`UBf=vql95)4g69qH)bStUl=#bq`G|H;+~nL{CYPop za^eVyxy;s^2(EYZH=)W1QsFAZa^Q3xF^R^v<@6)E>EMc>z?c?@`~rUz4tu}7^T@N+ zklDWFS823Hfyi68d~lcBK!t%)^bqgR!$JaRsi?xl z)`E_}j&MxX8#-N<4fx_(1A}ZvU1mYzcF52I=RAq4(v&Mn3mXMtN61)lHH*Py<~05O zvmm4laL3tGP7;${)fXxg@^Rjh4eG`3`xMXA)@TzeEu| z_mhUZ$hpB1zyd_oz11s_$~TH6t2qWbEzma6x`yJek+ff( zO3mV1P^o_zg@nR_(u+I`c*HT$UljDqKYkR{Qk5h`##C{)o#ev=Ks|)B>^CK-#LNn| zzUieT2_4~1Y6MJalm)1$;wElOtcfP7jLu_~dC2c*p-(tLPGZBJOTgj~DF2JSZ)nbi z3)YQo+qP}nc6Myr`C{9)ZSU;Zwr%STZ|)u5(fI*q(zPbN*668P)%^hdZ$nFljAiEx zoeEIUJC~B6s1s(CFf@z%Bj*Hgp?6Zr^Nw`pI?XOnq_}PaFd0W3(toC5Du08v?*PG zZP&gEi*zedFFfrqWJ&FpVX0=?m|QcmDc!qbp%j-@AH&iqL@u7qx z+wy?7|4RkJu#kzeJUnQuaY5tYNV;`_^3@dvXePqqNS{`pd+5&iXuqH7tc@88;-}tZ))vj#JK^L= zS%xML21~2u{vwx*bjL@Cvk7YZo^rd zqh)W4Sae>jYK%M#LyqzCTFQNaQ8JoW6ihbR!DR|M2XrO^xogrLO6GcOumXxc0Xhe@ z3XP+cFr}}+bh?T#<+RL{q6Fmw?0gS8&pa&b(pk%%j0mMSi})wanOLkZ7&{O36Lqx& zWu(S1?%8L}nb=j9YN6`i|AG~Ou;GTQ=Ant&F_7tsQ3sUyN<}CyH0=#yf)xT`5))~B zlh~-^l<%zS$bQ?sx5Tc-&r+~MV&qN9I37h|IndRl*Gdw?2C5sS6Gs-2|gnq0{blLCu}(q#w9gX9LS)liW5Po{ja zQ-LB`T5wXyXoe-KoS={KndP-dN<%rv#>8g3JF|j<=fzZjwN zFWy6$SpPFD0Ge(UExQyB_RTQ-n1>EjMK+kdsXoUy1WoFhq{JldO8=};PS?8(JV<NhA7fu zVQm^JP~gFUV_0_=S z7T_4ScY(1_n|L={X8vRhs5i@%mn|POEzy44r5STlc(>bR^~=uj{Fs1qc=m4kSe^=g zi*AI1lczjBJXpW&T|z6nS?}LqhUv~LO(+zRdq)w9Oe+6Qcenp8Zl8bfL+|J21dKiZ ztMVr#2`$v5Q7dlZ;Zl1%&?FptJmNXr+hc;EbNLSXxlBFkaUg_-htA4r^dwxQ!=+V;>*1vfi2MI6^N z+h)igQD5EuF&SBd&^+`jqU=W$xHI1E=JA_7#c%HNC;raofp6k0EdSJ6F&T4UTx8C0MxCx+hHE1vN+^pG_QQ>z1torcuSTX7t`E`4IM#`7T7s)|T^-#!v zL|+Q%km&*ODOAt&Psk+j>NcY!$%>yECaFR_7%msHvl=?qeGC84>R8;R-UJpBMx5l%<&blLbuiywM} z7Rv-5kGqbu9;G}1L6bUP$*n^g;jfv3SJ&-_w+D-Xst$FRIPF=uCbSrNEw+Ep%=nwQ zb8_-*7E5*FS$6sN4trjAUuX}Sp9nr5?Dlqhn|$=g`FKAKPTa-o)q2)z^p1Iud!0i$ z8Lt;c4r6~kgEs*m1l8eiG$FugjLV?zNy1UVnqe{Rd{-*LIm3MXBwe@RU=8#vB zsGP5-*~{}jnbSVb^SI|h_?$kV9c7CKonVBcCK-ZTaT1 zDP?>gt;>A56r`W7>g6M%%Okr(;1-*!Ti&4k-2X$TmiShW8!BLwc~c50%ZT>!|Y5j&DcF$NWyGi&T@u91CZ%i&mcT)y`kIjeqq9U#_HYS_riZ&={Nct9>asa_b5&E!=dWqcGmPyDpUmY{zTRRt<-N3ua9K*(2buoCp^o066 zc+F5XIC@|inkjaEsIP#T3at2eQov?;q8Kp3Fsh9MlP7%%nQi=giA+nBEvk^MT^>0@ z&2_c$;dd>1sgT&bRx4CJy+%5mynD%jv&2#AAj43ns+5bSpCPI`6ma(WXA z?w=(xXs55npy@d{YtGw|xghM((xgg*+zM12nt&vs_ zM}u>|UNTI_2p?=WLs2VRM`tqw)(Y%w<^|E51UDJ`Z0a1x49T|HELVp_9+{(_BL;H^ zFY<9X+=2q9oJ3s$2Cp2KmyzHh`?tPMlksCa|JbjI2cG~m%`M|%hbmy)+@b0l<6w`e z#O$wa)iE(;b6`IU6>#Rt8Xr(%6fY>$^LtKN9pCz!!a83j-il!5afS#E(vT^GPZ_X& zBr1JJ+_9M7f&y020CCMjgdA9yj<*9iSZnSQ+RpBM|<-K!J^EYE-1X z(3aR~ZGh(CBWpJokL#p9ZRk}#39!iln|TnMA?SZ)=2SMADNPV5hZXGdj+IWr)Cw!t z7K%rNp+(j=6l(DH$`=JbADzPGb%M0I{bSQB;2&)l0W2+(G53jehhGmEG+6g7zEWkC z9<0rp`Rew!-W3Cls2}+ryju77Z%U`Ip_Qesw*!#k>+st4Z%v9L_>4GrsxRt3T_=1y zQ{C@d3;a91R`-W76s+NPxY(;#A{D!HoT?p7m=}oJ%RGHg-2h}83_8Ci)AB`C%EhrN zMMP%8s3q&eIeW*-^;?Vh_4|!qkBYfh(hJF6DgsXLa+`bOOke+}QdLiC>ZlYEJ$QUt z?1eID7nB1^O1mpuVth<_n2f-jpLdCzZvy;umsU<_+U_smc--_`l~``^Vok-|&r?FX zG(tW!l)j#k5In-3R{=wB^Q}9G9YTs#=(pYDyQbnV(6?rv_p}d>dArq}eTNq{->Zko zb=cT6JMGuYyNBpeler37Ph0SL8qa5sAN;iYtVp#4QP1F?pca#ije{>LNIGI<>seJCGdCUY1Kw(APgGUvAa=U$LLAfq#OZ(p`~! z;ta5{qV-q3^NW0WbjR}PiUaRj%}w#Q4Q1}nwZX~SE#=jx@%fZPk9@O;PCmfH{~21o zTksfy!S-&+_(%7&>=KnAH~ZZ*_b2;90M@VmsJ8QMIXoGi;Wx~Q%6m+I`qaTTo z!vNYHuPd-Np=nYc6d0G^^w;Lc&1e!T&6;wp%e}}aNV-D!;XJjdOtucKDlbI?L$Mq4 z(bW*$g`bJO>grs5o*dkT-Hx3d?md7{|{W6T8eWa&HFDZnhiV7pRBs+ifR-6o%V zb8FHE&ffVe0G<$Wy6t(mPM|w(6#SWL-^-=_Fq5{wbq#slwy-^}H7Mp9^8pj!5gwWG7>QTNKe`LeyaG|!{1A>@mHcOQOeo_`Z+Rl5_f z386~5zC%9G3JHU4gqFhpYqIgw;oA3UCz`v1Z9n`!fJ4k$_VE!*yt`L43bEe|BERRh z)6DTtF0G4K((9N8Web$42svxIygO9y1x$Pe<>)31sgN6W@#6HF2x=_D+uA zWy~h~E}mxq`$OG%x=QPhpTWUHzQ}(w>V1A)rHdJt>Qx#xCkM~B1r4OdF1!5qzRtaI zlVR}gjHlg}qYWRk2b3|Nxt&jfc$T3I9PF74 z7*>MLtSU^oxV?&09Q2Ay)wc1?A4fN$G1UuYE47*SvTF~;>2y~bA6ebSszZVOW$b89t;?@%5cfB)jAroBY|>T46urE6uc`n|jf z?&^JS{tT9YZ2l5&I1c2eja~XX-Fq)qKvoH!&hB1rq5owFeBo{Z{O;n$Eu4S+$*k3Z ze~SMr_psi;H?`JI@@8=uX_gVC1q@^K=G87QO|EwbhRbo zNaIO?@9xnZjBSlTNwe3DDssJBNW~AByM8*j^ddm$<#K)LJ!2qZ5-|Fh0__&7g-XQv zL=uaoEg!S^d>$szHcV9(i4)d3KHq#@9cAF+_SJF!JBb^dobo9dt0)@Gxu>Mj1(0 zPH1**EVe+(B3IDWr)`_v0jX?d0^?v-rRGtf0jBPr!{DNKC9@xoizPyJnaLxrChm&< zO;f`Fc3VDJJG_#%@N9At$HCo-fNp0&vc$p$hy+a_L2yn`YRe5r1iZ)JEArqaNj#@8L$&i_RF3{x z;6ONvHfLsw>|!m|)>yar!|d%0AG=|l*k%Z&<$-u|vWr8%eDYE->6HZK)F3$X-{ar} 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%0ArKqK7kR* zG=lGdrH9-PSdP$sFt~^w&>3KL$iK(rRTvR`2a}-fBfXc&Mf8AE`#!Q3PLg?#`rrmS}Q%Ler&_l?a!<;!NH@@2D8 z`Ep?4C;uLYLH6$%bTAPle}ljfJ5Gmq1kw+1rI2?(JOa^OE}I-5Vt|1r`$Ggq_J;st zA!7<7MfUk2`<9OA5Jbnx`%q}dMaC2`WKChfA96ncLiz@)C3(GsW=Kp1gn`NfFhm{< z@cGGl3K(K{;Ysq|0KN{1ufal##BKnC;0;MP7&zjqKs#i=#b7`niL3{JA$kBMsmS{Z zcorTezn4uz<~al6tjPDVIf&jf*c?Rf8L+G(a)S*Q@_QT(vJS%b4Os^np!a0^0vI`V z$Y5}BbX>T+<8T362N5Xb9T1r#`)~{vEp(Ny~1c1 zVzU85_5m2Jy=Nh)Mfzrp&P3)aU_?a}f&M}`k$esY0YNYlicVs|m<9MU)VWU?$_${_1LV92_ULD&}QFI+)I#s!B! z4Y?mUha9hC5U)l03wsEpzbrPgzG2`#Bj3WNBYr2;w?ljenEHsnL6`&d_mJ2t><}S9 zN$wkmm)0hzLl8_u#+d_=F63F{yn+GlDLH;mV2CVX7mw%=V2E!EVGzXT5TOyWjBq*) zv8R9`_7vEK5PJ$3qE|q)L5`(?yTO54qk{7d$OI5u2N*dv0w)e!#Qwo0N5uZYMJ)0; zCpf2YfJuHY#97I92zKnq+5_7Fw7;-5K%NCtOr8sHiipS(2lYe79?lKO`hv3{a7O-S z*qWm4*r<$Hun3T!h514DBj7|6u{jXELgp4=Xx|`cPM$O1=^_3&gbEN}05HS{!MSwA zzXA-g**F(N)+4~s@#AvIu{m&0Y2bECY>su)u*P&o@{-5WNBn(JL^;h#d#@L+m&UgX9@< zKQM4c5sZcS@{qlO%vBZ`9i(qyV94_gqAF0b01S~4oMR(<2*42C zh0_$oP6CG5NjObLYz|=LvoVMO(2%(R7~;pmkr(1i0Y*L(fs+`Bev$MUF!Y;Yp&{FQ zh~^+R5nLZ6W(gP+I1*f^*k*Z1UL{WLwbCcYvuw-b?3I_ZIM3!9z#v6<~+abRnY{2pwvk>3Mnlx+XtgasWd^c;}^Cnw07 z2X966k2q5&ua_KHe30*hBY))kU@J+U3xvysd^5O-=(EWAK7_u&)h5k-z|e2za1c8V zVKY>BVLwCCKO*0@?Rw*s)y0TN|J2*JY!U)LDmz|=!&e{P` hn2)maMW;^}b#h+r=*-LPB{IG+n&|lP+H+@#{udsWLZScw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a7b20ae251927c51627e01f294046a9e6cfc7f41 GIT binary patch literal 13382 zcmc&*ONb;%8Qyi&L!AWipr>H9Wd@zDjL5eP?e0uZGmGnW-4<7d7MMMQb{Qh`kWkzJSbk|A_bWhb^k@3I3 z_$%}4t^M7->wG&LY`y)@pZ#Z$a2Bw|(HnysH`ws*bS{hK^c!-_INmWXL>95(9rlQ2 zJYqcO>@gcYU`fb^w^G zKBL@+iOKiy)m`@JMiB8yz_8gUHip}yjvW}8AOPm72R8mB^!QWC94b6$`y+dC|Y#z z^`}^Ht0;@v;-pr^6v(PQ_NKEE!5Hq%ic;>%W3}l+#zA@P z9X$WZ@!{d&(c$4Aj}ME(!+-tm*S~q;3QInG<~@XF*v%folR z^NZKseCK^{e*C*Pe*gaOUHQb1zyFt)Uc5RveCy=TSI_<~|M1fve*WLT`sP>e-TT(* zM_&KaN8kOyFJJ!HyPy5X^o6&7^wQ6%^;V@)X_^p?x;FpTVqVI5iO3+sEzXw5h%*(!9`?~MI7`rM*lK5oDq(T_P@+Uo^G2kj zN;#>8RB5*fH1Ud(TDWc=06d0!oT0K0CU~8~E)lSUFO_wXY0IX0F?iTc>QHE8K))dj| z=1u_SU5RTSF>~?jU-~kepUq~qUr43amYQZz+ET)NsJ>6eTGb}ywvi5|O z!dY;AhsB>^Ltn!+8yI7AJj+v5*(9>#7`6iX&wXu zh(Ae#un2?jh~sCBp9nwr4082(h-(C{39*>gi!ol~J-w#SFb!Y>^BMF+3HHbJDRe}c zS%iI$4%*#~%Jo`UOg<2n*MPG@Eo}zYbXZLERE?+R8WW>tSWx4O)$|zE zj>MVN37tBn;Jo}b;g$LuNMTFMDD|7BX0pag4FWVQP^CFm>P(uFtlF|>vTg}7*;jR* z@f0pwe8%R`M9trbY}T;<~fc@Ek)H=Ic#EvMKxm@AuSr>$zqAG z0o%ql17_})=havJ$TIb%<`Ir7H*HhRDs&Emi>9y%x@IOaW!%q5R0q6E zPeiGhN0I%-_n;jq);It)|}nGru5x^SZP>GOL6UTL?_ zt?0$gaM({bEA1QCcGm54D}eD{5lm^{*yp_4=T;2EeU2V$TWNQFPA__IhIikbp_`D^ zz*+&f=oQ42_RXE{p1(vZiqU=B{!S~UeRHR~XE4zUW1?3WQ`$Fox_b^2tvH4o!+mDD zZ4|qBPj}B^>ZYEJYSq(tD%7LXO1rhm4r3R0x_cT6TY-$8?ey2vO8e$ccaLLXE0Be~ z0-4gjxzpYAn7Sus6|Bp7WE2b zO8dr6i|&bx9$WhpS=1|#Deap(-93@1JGNFq)zeY0K&G@?n=W16qI)6(J)F$Y4(X*@q zO`svR;pe8~6?iY^X(ILg2s{${O_ecX6snP-#i-lnBgXaTL?XmTT(97SlOv{XO5s1f zMBTW+JH5m(R@B!$DA7yIV{$blL#TIAgVczbhr#Nw#XG%=0%TaHO;t^cciI+}*bzOO z)r1J5ORefW8iH*bgZpQvH*9L_vToZLG+fD~N5y5E#15 zZh{91W|v*Hi%@Igrchs~ce5Abo?+ucY(zFW+wmkoGUgm83ZL^^b2IYD7lmT^KpMFRaLkcKUVrca#kO8oCsr#iHJa!D#hm6zVz|?TEf9Lx zuAIqIvZqALohh!grrQT>jjbS0SJ;Zz>kj~}^g%K&2@TmXv#DKG-cM* rYKj5!=+nBnPNPgyrl*9aOe0i7*44DmUvW@dHvi7UY1=$YP22t#4INDV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4c2173d3e2c307b2b6ddefca5f4eeae9991f79d7 GIT binary patch literal 3138 zcmcImO>Epm6pn(j3MN5F^iT>Ck3u*lv1ew-UW;f|^0P_=Y0}L~6^bIoyE_SnjSaTb zZh=ECaB2|hg-cHekhmePNO0*P6{^Gm!GTh#T)1$814vYeH{+ePvrZ#^f=|2ln>X)$ z-#2f*iPibq6q#nm#FxK)@TWm+upn%{V$95d`Jx{PFY@0IZ6Np$7-1DK7hxT^Z3E#P zHo#l~;)1yVgt%oe&jSau0n~O~s8$UTv}H2*kB`xf#FnhhHLTu4IH+F`fPTjF`vr|Yl%gi!L@|2LOw!ln#CoN=XXQ|64QDZCLohQ9n3Yv7APXN8i`91 zG)n_zF3rRGOiQ?&lP0%Y+;aqL@}|}F>@Ck~(+Z)kU7ca1Ot?#J&UnRjTt-=?Y*V|; zScOr?<<$*IL!5X~qA;|KiHU`knxQJtJTHeKvYD2&>TQb{2qGy9Y+QLwfH~(SUMJkn z5lSjKnbiDFg58<5j+cme(F)tRW(~N5ni0Wv@-jG1T16zh9iw}_wYj-De3q5AN~L$+ zAA4fV8fr53>Cj7)+B7!6aYNZV=i?;90hFzfL^u?+dVL-p( z3%g$HRUo#-QPg!2hr3Y=@sNti@Q@hgz)-n0mc5R-g?Jo+iz1^3Lu}lwuYP@*H7t5z zbm@W5Ztd?KoO|k-k%MnX56q>>n-{Hb8lyLVjK=Q{58XLyJXUB`Ri!tsVXI1EH3AgH zhvinQQdwbZO(Z~5Mzb@iV)Wu!FBU3+IfotlBAQxhcKp|Ok;sJr3H5_*FfaPS^Fi!q zFV1^A7=ZhkYrD-vNks|<|EIc98FM?z66B8SSk`4Lu|jBk5;J7I$oLT$+8C z6zF<0UR9&!zoeD)RFRfDNNa9C%__F`&sjZnb^q$A+4^2*fA8M48`s_%d3yQn_a>*m zdt`d(hhL4;1zI&sa$NKq?a8&@C`lXX&lT88e!#^VKa zRaF|^yh2Di=8u$!9#bktFV47G6rD>V@mtfftrp0)*qt2XvOmXJ0S@l~p`uhkz8SOw zN<{-)Nr4U^ZvZ$2G8>UIMJsgieix}9#I1agCmv)U~J?*edj zoes!bATS&d@Pe>voL0_@9^e31qX$Nw7a&Nu4 z;?FI(IHnu(j#yah_ck+Y9?sf0e5_p7myPFaR^<9xUjr}i78hL%Tq@fx*0Y%+^*~xV zVm#@Oo{l3ABVGs#BB42xxM18 zv-XL+)Vw^=L_Ibfj}^Lc)xnj#Q{bF}8{l*ZMm^M=so=dx)S!~k8gN1sW}}C(?1Zxw z6cpFUxp|Mvf>;Ra9%2D86H5VFJHlWXC#6Vi$XHF?*u2s3#j|9Sf@sXBNjWt;*gsSD z=*F~}uQF!jH8OvT;!0D7{|DFo^U0#Q0xUmHR$LYH;n3C^*e;XM9i)-K z6(<5x$!}V->VrusyD!~z`fAz5k>AfNr^cCYPc1C%0f#Rfxn?@P()`mo>Gj3NN!bQA z_tp*Hlw;vwV7h!+qb<4g#+M(tsz=|l_kZs9Z@S)g*_gerZ#*zYa!JqF>RR$Y9`MpP zubo*)_sX&)BNxU4p0`bbliD-VPpSS;|pm$}n@ zv`6dqcyip-a&qg^yL3F=$TCRhb~q}68K}|_pd*rUvC$bd9ttiP82{II;nx%TE;bV* zwu3pHs0iFOCRQ3=zLafubCU z1sYC~wTTj{HAEDg`cJiXC(N;Fv%Z)utC(*msI`Qt^7l}QCg*>_iH;*Z%%|YFq=yF& zs%9gsM0Bd~783_k34Jy6D4_!q1<(38;K3*xb7|OyI0wWAPt*b7M2%WKR3@Z?2Bd~Y zM`$E#??V4b2?pDf(AiI|4`S0Q;w&Xnw&^z0{E1q1-H{~GE@|qH_@g({1KrCJwnU6e@VdB8 O45w+Vu&}y8kNpMzRY)QL literal 0 HcmV?d00001 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 [] +>> +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 0000000000000000000000000000000000000000..4c2173d3e2c307b2b6ddefca5f4eeae9991f79d7 GIT binary patch literal 3138 zcmcImO>Epm6pn(j3MN5F^iT>Ck3u*lv1ew-UW;f|^0P_=Y0}L~6^bIoyE_SnjSaTb zZh=ECaB2|hg-cHekhmePNO0*P6{^Gm!GTh#T)1$814vYeH{+ePvrZ#^f=|2ln>X)$ z-#2f*iPibq6q#nm#FxK)@TWm+upn%{V$95d`Jx{PFY@0IZ6Np$7-1DK7hxT^Z3E#P zHo#l~;)1yVgt%oe&jSau0n~O~s8$UTv}H2*kB`xf#FnhhHLTu4IH+F`fPTjF`vr|Yl%gi!L@|2LOw!ln#CoN=XXQ|64QDZCLohQ9n3Yv7APXN8i`91 zG)n_zF3rRGOiQ?&lP0%Y+;aqL@}|}F>@Ck~(+Z)kU7ca1Ot?#J&UnRjTt-=?Y*V|; zScOr?<<$*IL!5X~qA;|KiHU`knxQJtJTHeKvYD2&>TQb{2qGy9Y+QLwfH~(SUMJkn z5lSjKnbiDFg58<5j+cme(F)tRW(~N5ni0Wv@-jG1T16zh9iw}_wYj-De3q5AN~L$+ zAA4fV8fr53>Cj7)+B7!6aYNZV=i?;90hFzfL^u?+dVL-p( z3%g$HRUo#-QPg!2hr3Y=@sNti@Q@hgz)-n0mc5R-g?Jo+iz1^3Lu}lwuYP@*H7t5z zbm@W5Ztd?KoO|k-k%MnX56q>>n-{Hb8lyLVjK=Q{58XLyJXUB`Ri!tsVXI1EH3AgH zhvinQQdwbZO(Z~5Mzb@iV)Wu!FBU3+IfotlBAQxhcKp|Ok;sJr3H5_*FfaPS^Fi!q zFV1^A7=ZhkYrD-vNks|<|EIc98FM?z66B8SSk`4Lu|jBk5;J7I$oLT$+8C z6zF<0UR9&!zoeD)RFRfDNNa9C%__F`&sjZnb^q$A+4^2*fA8M48`s_%d3yQn_a>*m zdt`d(hhL4;1zI&sa$NKq?a8&@C`lXX&lT88e!#^VKa zRaF|^yh2Di=8u$!9#bktFV47G6rD>V@mt> +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 0000000000000000000000000000000000000000..aac12916cdd0c0c9f6e030e5fc5e0c817fbb29db GIT binary patch literal 13103 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 L0-^ov#|8fd7nVuw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e33c701937e792f51892670e90da65e9e3f443a1 GIT binary patch literal 16937 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®{0V`)_o}OBx@x+2wcBBOVRpJ-*T=7Z z@1tLLy}7o(+rKGp$!_P`5C8hxKe`>|G0tX3pL9Fh+ucrYZ#+$t`S@4qhzUGpLh>Mh zqxOQMa?R)9s|w5sl0){@3k1pQk4T zQ*}E${}YPQ5t|mWkVm#m2rqPGUL+lvjNHBf5A1dv*I&$=&6DvYo#(tA0A)-e5&QG> zGbBL)-ris~%b0>0*#OQS?6N1@-bu{GC{9Nw$7v!$?kg|lG7%%LB0dty&e<)1f24Pj zCG$+v1Jqx;cJEQY+qpQ^4fF&(;aZpGw4Xdp_mZP@vS8cWtoQKr*#hi{)5$)&euM4o zFptg-SZ~gH2N@G6Q>7L$oB@4BlMtH-QEDTKVRmU4kJlUldqrf&-7(D=oL(6)^M2rsCA5XFrkn|@>mhPs$9C`6_!j!^5M)!+-whovUA8jehdh=dWM?>tDY6^LKyWdi&*-cV51H@%fcE zA76Rx&2NA4`>i+rxb>&6?sq=?-OCrZfAiwMfB62#-+s}3{nx)`U;g{GcOP$U9bJ8U zuR~tG$n^Ne;gw&)e0Mg@(rLC}3Vez@;r(0_Q6BD6s4&b7;FHYmhEx zr}JZA2l?&8Q2IbH1>VR8NHaLy?D!xBSA)PnBH%!?jMSH-5rJ5mXik+MmZ`ck1Xt?y z1@nA1Jb_~fl*;35ID+Hr`?D;`W{lrp!%sT*h7~LzzU4%Bl0{1Jd-v1HXK6M*P5|Y- zDX45beadFwTHT^f0B0_p?h>!%LAsXuQN3SA8$~J^Z0?`l+ z^%WFDJw#xY(t175Dn2#pF_%u5GmUbA_+u8G}I@NvLZyvHiSq5 z(GU&wS){B8k$xLOB!Os#2CqJg^eaN7--ZxLAR3~fK8y4#LZsh@5J?~!qM<&E^eaLn zZm?}UizE;Y(NLd7`V}G4Z$pSA5Dn2#pGEo=Arf}hHg63Cq9GdUv&f(#Lj z()WNW0hSy1i}D^fl}Rkg(CthS1#DjS$MZ!7MFqGnINeL|%mh(QUB26I_Qa`e#fUJ% zaGXt2cKyNPKMP>^<_-(qWxdBA{)|meCzIvB8_+Z_Uoe#%Jv|+kNo-W$O&oZ~TGlQ6DK@@p`UAHw+1U%?!Hl(&PiB*>(v%ZaE&rqGPmlQE^7 z9&)FG9&^*s^mr@mXtzUl?wcB%l4;@fGgXPEwHP0NJexz^;4LrLs8;BJp_#xA9+nO& z#a9(dhX)(IfUeFG%oYgh+0{&-7!1P;+cZ%@O87_dFho)_Nww2a6f7 zNC1sjc$&nYGO(0Y=8U#AbH@6$?v=@#De@`fMY(INDxXFnx1$LhUUA%4L#?9=qOOmR z2EXRj_;PN$6!;3;HD?+>7C#x!&f&W=ISautUU4DXh`qCyV#v=?<+r>w>$g#no?Z== zF^lL-f(@l)AcYO&81sAfc`%~&yedX*1o62sk`WYEYcSFZ*4dHGV_pLb^?5}(Fo$xz zFbH6sP&`aEyBrIZm*u;;ER4ay@o!m5EL02{wPZ17DP@_*F;}r<9@cAEGKu^4mdr91*6TmMo5(z7dB?Vyj)`;WJ0MZzNq`hyvGt zqYx`jtiHtEff>pF@3#>`!Ov0hUq}28QrtWx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a41aa3440b8e8640dc9f0953690e2485d4313abb GIT binary patch literal 27464 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d76545f6bbe5171f648da865d6ab9f0d63273a45 GIT binary patch literal 24824 zcmd^HYiuLeb>3v{csusCfD;#XV!J~b9 z*_&;#UKe>dM$;~FRsI}Y5gQ@3eiCw1ed z=)IR54u><`T`siZj|$LZF7Lf_?z!JR-#KSSXE5NNGm&QIBsTckkN)AslbAr_1YSz+ zp2Y0-lbFSuD@tM|cUns0B)r5ahNnPpiwEDrNec9)XbO*k20t#);MXip@d5|_@ZmH8 zey!pZ#dDy+;W&v&#Wb24zv8cx*r|$?L1I$WNsMTGksOZx!i&u|fh5}7NGnBa+BhJ8 z+gOrkt(rE0*Yu+Zl5OutQLN@36s?sHYDqIz=N@3F(B6-xDb0OpM$q=-1kE~VK`S3a zQhfV87@E|KWvmoH2mDg>%&?qhy$sK2bq}%999yf1xx7?qfGh;?g_9(NPoN^*0TIKp z;9{YeDd9X=79Ipw!BVM)3t$t_)q)$}va?*8l#&8PaA0;mNs%naXC#IslW8fHlmy46 zdjRM{WL9fprB;U)K<(h*tbgt#cEu>YvVj2AaCOSz3y4|CD<-9U6}Q`Qi|?RN1*eWc z7XjQjf;${Ig|0%lrGi^RHJpTPoT`Tau7LWQU0B$KBvpOL<}_|J4Tbtx<+e_b3fd%Y8w2};#AAITC{0ewKrb0T?9Vpak*Lm|PP60c_xQX)|iUlpClZa;qmef;|4^T&_B?`7=9l=$+uo+0l3oOt~DC$9PRk6jzR z;d=hT6W{)mW3T&uwtBbW{1@*$Or7hVv* zT#kA^yZjeV7^P3<=l|funMXo5-~89q-@fOmZ;96(yX#9+8yK><)mmL5+4u_JytaUB zrc|s+#aa~?n5LG}Inh-*g|J58EYJ%FkO_@^K&*hi%3cJeYU!Yo0^0+(Zw^dV|AWM# z<-vn+7r~h>r9u)oyTE9nCNNQb6XDLni=Bf)5{LE>ZSYK`w6A~rV5tUlkAoB1x^YNw z<@f;M%8NI`NccVf;Jm#Ph2s zzVlk;ki7BjxXqYPpmM7CKu5sL2(xxMe+8oGw;# zas&9xCl&yN=OD|54w5wla;PQPP}dfmuWjW}qv)nvK+Wzs+_Ea2s==LVZZ=e^B345; zp!alWW?_N1)^V%?HQMO)TpFO7gI3rh<+3|q_rSro%#`w_N@!n9Nw^@NM^~;^4M>%l zQenSTMCbq=8^?lgI~BZbGqyn_jitnpX`T^NsfoGuJ)ierGq>m^gF=LyUmGE33w^G_ z=J13)CGHG{H^lhtc+6?rAMklCfz))sy9u0V9Z6r7CP-1*^vaTPOiu2N}x zJ2b(O#${h@b0uOKn@Jv+^GkjE90Q=SI#@NkHwK5I*9 z&Bx2^yxTpDrI$)x1HUBp&xXgHVMBD6-<(VCv$L~yAyu68vAgzVer0N_pX*DPhe-!f z%-D=Wwv{zDx#k`oNjamKU`j{b)03%9V#SeNSRNR#rP7q&IV9R5Xif$;3$ zR45b6r9JF=aI@^0FUK|u_Jf&RUu+5s)v`u=Hf-_;K9@Z-9bKKQ`bHM=gGQHoLEPgk zo}oh6uvc)em6(W)x5dJafHAf}iouj|iQGPr99VYFVjP2%6`pE=>Ql}aPC?yT)lUPNx>YexmsSr zjSJO(uL2LiHxFxc&i5Cy@dF96l=-RO03MbZY2wi#~v>hZNOCk#j>7qqYnI+s3 zkQ>AR=wrRR!IPz4gqmMfno$<9T9Nj}J>b`XWsveZSQh83EKcjL0QroHLK}iHErQ9z zwIZpxu!Bg`1+kbGang)*OOimjbGe#I7I`-tI+T?p>rke)#%9Z=v#xs+bbK39(`X_z zzgAc{>m@({oU@FS$q-Piz&#kg(GSc;gEpF~yKl&6P&TNs zUox&_9U+GSXriGbqEb|5+kxlk0;F-+_)F_qR%{(CO*Ayb zv?8w3+boUx(9mwhtiwULd@<{AXku6v6CJ

sX2o1vLZ$;(ntA~X5Kb{m+f`To%3 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 O_w@}(FkQ9pK>9!0lKngY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..388a21a252995b43c5234b24b506363e5a658153 GIT binary patch literal 24875 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dec1d70730dfef832373b34a152826e722046907 GIT binary patch literal 18204 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a7a3a93ce91b2a5e43499f3335e3d4c3aaa3f086 GIT binary patch literal 16022 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 + ] + /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 [<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 0000000000000000000000000000000000000000..6370cd65890ce4570e7f932aabec62696a530b5c GIT binary patch literal 60960 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3b5e10fb8841b27a4b2f2217f1480f2b48957538 GIT binary patch literal 1250 zcmcJP&x_MQ6vwOXLJj&qJi&TWCzIcSrRcUBwy3+cEqEw}%%-z7(oL3Rx?2UYe}LWu zFP{7p{0H>lq06Fp(u1c8{taG4e3Le9v4RINmu6n(&3p6tzHdwQs&|cEHY&9%@4N1`*^j!%|mbveDo7S(?2Pv+dPfM_rA%>Qb&qSlH(Y zNLGzF7N8@%29PEq0~bg=;YY~AG4lJ9S{2$GIyI>2YL=;+j%&NRraOkES%$7Vx@Nm( z`R_YAl5Q$kA~GWTYc&}rF(vjb)LGVpz$`Tmd7!rIfv7Y++t*GJzbqxBCj0{_Xo z=U?6y3dfzbD{=}_k>$+h0i~O_S&1XTBawnL?eq@shHNt);*cSIuqcX-!-RuYX9;f1 zZ`9yvJV*k(qNMNPDbp7UC=iNJE=&G#(BuNFd1T5#qFI6 zCua+%XU>mT)Q}^RSFOZ@3^BPCc2ntd{ML~07vRz*a?{}hEq5R~4J;Gq8uoKnX8#Lw T2QE7%bBPB3%M;YHX0G@JWw1wo literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/object-stream.generate.exp b/qpdf/qtest/qpdf/object-stream.generate.exp new file mode 100644 index 0000000000000000000000000000000000000000..3f86a1732d9bc74f3f3e60b9cd861094bbc1c276 GIT binary patch literal 1526 zcmY!laB^%&OEB1w$ZD!O+ymOhMm6 zAzH!I#8|=5$Uq@hLEm2iDCVkQXlQ1xpzjA#7y{y$DcIR@rRJr8%u=8ja2X>xE2Od@ zRY5-@C^Ze}sMNglk_-hCBL#i8%$$3ZMXx3-)GEetrp1mw`f% zf_^YCNI;rEMwCH(4)vkFr;9?gjj^GLp{b>jnW?dlbn?DAUz=|VFsUygsnr1Vn;M%k}u1~QxY>I{--rY@bn}w zF(h7KQ3M4zR1@}~=K}cv7QF$9>8ZsEmJmNd0@XROBrzvH9VzZiku+cp;a~-0U;==} zgE6YR6A}{A5)vk*GcX;K=P6)FHD)yAb`n`4)*~r#O5(=Z8Tkeb3~6_mH)1;649Q;S z{JfIXypm!CbBJ4gff1MJln;s?10Xa5MuoYh5h&Jx5e-xb^HWf2aeir0GSHKtsCNUJ z0$~^e;|y#PDAogt@{@y8OF+>Kid>KoBrHI|gA@=TyI~;*^Q{H;REHdO#as`A0xpyr zhZq$o zl3aL*1CttdM*#DpF-WGU80a@}ZiFW%*WS}yhYUnqzW?p|*?ikUlxyh&Z4nkh(U>WE zN!6N+zFeNJ|LB1R=6!R{g+{&iosRCt zMGmp)YoDy0HY;8*cGo)Jgtt$9dGF7c$<24LzW)2*F2Rzmc~6`EinD(fSR{76a^KOG z|6W(lPmNggi{aQ4gLn)NgCYhN%vdry&?i*R=-|u@%*(XOxeQEdZqw@67#PDCW@09D eic3bq1^|nZ#G;alqSQ1lV6n`ls_N?R#svVa<+DNn literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/object-stream.pdf b/qpdf/qtest/qpdf/object-stream.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1a468202c18fc9d26f53031bcd55ea3094993c02 GIT binary patch literal 792 zcmZuvO>Yx15KRIXeBm$5WhFSkuDu^gq^c4rS%H8yN>(aT)Ps{X!BJzQwSxjbr+=hB ziyLCbaX}GX$?LJ_`OOv_m0%T!5tadQLVh8=ytNym zn#qlFkfVY*aV3zSAVZpPA9U+ri4i~%zyLS2e_{8=13#WE{yTdt(J90nYv7Sjs?~C0 z53tOTsp0~LV-d-WN2r5gERoKYv-@t162s+?;LffW%0n3;xK&%Ek9k^hsQxCgCjk6~ z-bzLtqCn`y zZL7@&(razr7^fdLNPseJ^a>*~oKc_uoPV&jAaF!Z8luIPL;=kgjE8t#B7>&I_{Ge6 z>FrBswrtuw!aq9UKfbKbb45JqLjP1Srs%zCRd8b*T)2iMmIEFZQBz(KaBi)~OnfU* sVGqB4?|E;4e;j=r0~}9qJnavj;Y#-&k>^%&OEB1w$ZD!O+ymOhMm6 zAzH!I#8|=5$Uq@hLEm2iDCVkQXlQ1xpzjA#7y{y$DcIR@rRJr8%u=8ja2X>xE2Od@ zRY5-@C^Ze}sMNglk_-hCBL#i8%$$3ZMXx3-)GEetrp1mw`f% zf_^YCNI;rEMwCH(4)vkFr;9?gjj^GLp{b>jnW?dlbn?DAUz=|VFsUygsnr1Vn;M%k}u1~QxY>I{--rY@bn}w zF(h7KQ3M4zR1@}~=K}cv7QF$9>8ZsEmJmNd0@XROBrzvH9VzZiku+cp;a~-0U;==} zgE6YR6A}{A5)vk*GcX;K=P6)FHD)yAb`n`4)*~r#O5(=Z8Tkeb3~6_mH)1;649Q;S z{JfIXypm!CbBJ4gff1MJln;s?10Xa5MuoYh5h&Jx5e-xb^HWf2aeir0GSHKtsCNUJ z0$~^e;|y#PDAogt@{@y8OF+>Kid>KoBrHI|gA@=TyI~;*^Q{H;REHdO#as`A0xpyr zhZq$o zl3aL*1CttdM*#DpF-WGU80a@}ZiFW%*WS}yhYUnqzW?p|*?ikUlxyh&Z4nkh(U>WE zN!6N+zFeNJ|LB1R=6!R{g+{&iosRCt zMGmp)YoDy0HY;8*cGo)Jgtt$9dGF7c$<24LzW)2*F2Rzmc~6`EinD(fSR{76a^KOG z|6W(lPmNggi{aQ4gLn)NgCYhN%vdry&?i*R=-|u@%*(XOxeQEdZqw@67#PDCW@09D eic3bq1^|nZ#G;alqSQ1lV6n`ls_N?R#svVa<+DNn literal 0 HcmV?d00001 diff --git a/qpdf/qtest/qpdf/old-and-complex.pdf b/qpdf/qtest/qpdf/old-and-complex.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74b8c2553b658be9fd6f615a69de86b86c6ea896 GIT binary patch literal 335662 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..22440b518f00466fe1b827e41b9a9dd0eda9f66c GIT binary patch literal 61 zcmV-D0K)%xoGautGBQ#y074@ZAhysmRj@QuNY3Te_slg^aLMNl`ZX6J literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c2a3483fbc53b215e27d8ce443675863252a7b62 GIT binary patch literal 39109 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3ecf4ed4055c2b59771a5d6a84c653a7fbc7accd GIT binary patch literal 52 xcmZQzU|?Wm;0Iy{1||q(1ky}E%*@Ex#=ywL$-p?fih=RqbOy#l96)@70RTjm1> /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 [] +>> +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 [<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 [] +>> +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 [] +>> +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 [] +>> +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 [<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 + +#include +#include +#include +#include +#include +#include +#include + +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 keys = qtest.getKeys(); + for (std::set::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 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 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 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 pages = pdf.getAllPages(); + int pageno = 0; + for (std::vector::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 images = + page.getPageImages(); + for (std::map::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 content = page.getPageContents(); + for (std::vector::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; +} diff --git a/qtest/QTC/perl/QTC.pm b/qtest/QTC/perl/QTC.pm new file mode 100644 index 00000000..2f78b3a6 --- /dev/null +++ b/qtest/QTC/perl/QTC.pm @@ -0,0 +1,26 @@ +# -*- perl -*- + +require 5.005; +use strict; +use FileHandle; + +package QTC; + +sub TC +{ + my ($scope, $case, $n) = @_; + local $!; + $n = 0 unless defined $n; + return unless ($scope eq ($ENV{'TC_SCOPE'} || "")); + my $filename = $ENV{'TC_FILENAME'} || return; + my $fh = new FileHandle(">>$filename") or + die "open test coverage file: $!\n"; + print $fh "$case $n\n"; + $fh->close(); +} + +1; + +# +# END OF QTC +# diff --git a/qtest/README.txt b/qtest/README.txt new file mode 100644 index 00000000..a4e21b04 --- /dev/null +++ b/qtest/README.txt @@ -0,0 +1,3 @@ +This is a copy of qtest (http://qtest.qbilt.org) which is distributed +under the terms of the Artistic license and has the same author as +qpdf. diff --git a/qtest/bin/qtest-driver b/qtest/bin/qtest-driver new file mode 100755 index 00000000..9ca1ec44 --- /dev/null +++ b/qtest/bin/qtest-driver @@ -0,0 +1,798 @@ +#!/usr/bin/env perl +# +# This file is part of qtest. +# +# Copyright 1993-2007, Jay Berkenbilt +# +# QTest is distributed under the terms of version 2.0 of the Artistic +# license which may be found in the source distribution. +# +require 5.008; +BEGIN { $^W = 1; } +use strict; +use IO::Handle; +use IO::File; +use IO::Socket; +use Cwd 'abs_path'; +use Cwd; +use Config; +use File::Copy; +use File::Basename; +use File::Spec; + +my $whoami = basename($0); +my $dirname = dirname(abs_path($0)); +my $cwd = getcwd(); +my $top = dirname($dirname); +my $module_dir = "$top/module"; +my $qtc_dir = "$top/QTC/perl"; + +unshift(@INC, $module_dir, $qtc_dir); +require QTC; +require TestDriver; + +if ((@ARGV == 1) && ($ARGV[0] eq '--version')) +{ + print "$whoami version 1.1\n"; + exit 0; +} +if ((@ARGV == 1) && ($ARGV[0] eq '--print-path')) +{ + print $top, "\n"; + exit 0; +} + +my @bindirs = (); +my $datadir = undef; +my $covdir = '.'; +my $stdout_tty = (-t STDOUT) ? "1" : "0"; + +while (@ARGV) +{ + my $arg = shift(@ARGV); + if ($arg eq '-bindirs') + { + usage() unless @ARGV; + push(@bindirs, split(':', shift(@ARGV))); + } + elsif ($arg eq '-datadir') + { + usage() unless @ARGV; + $datadir = shift(@ARGV); + } + elsif ($arg eq '-covdir') + { + usage() unless @ARGV; + $covdir = shift(@ARGV); + } + elsif ($arg =~ m/^-stdout-tty=([01])$/) + { + $stdout_tty = $1; + } + else + { + usage(); + } +} +usage() unless defined($datadir); +if (@bindirs) +{ + my @path = (); + foreach my $d (@bindirs) + { + my $abs = abs_path($d) or + fatal("can't canonicalize path to bindir $d: $!"); + push(@path, $abs); + } + my $path = join(':', @path) . ':' . $ENV{'PATH'}; + # Delete and explicitly recreate the PATH environment variable. + # This seems to be more reliable. If we just reassign, in some + # cases, the modified environment is not inherited by the child + # process. (This happens when qtest-driver is invoked from ant + # running from gjc-compat. I have no idea how or why.) + delete $ENV{'PATH'}; + $ENV{'PATH'} = $path; +} + +if ($stdout_tty) +{ + TestDriver::get_tty_features(); +} + +my $pid = undef; +my $pid_cleanup = new TestDriver::PidKiller(\$pid); + +# $in_testsuite is whether the test driver itself is being run from a +# test suite! Check before we set the environment variable. +my $in_testsuite = $ENV{'IN_TESTSUITE'} || 0; + +$ENV{'IN_TESTSUITE'} = 1; + +# Temporary path is intended to be easy to locate so its contents can +# be inspected by impatient test suite runners. It is not intended to +# be a "secure" (unpredictable) path. +my $tempdir = File::Spec->tmpdir() . "/testtemp.$$"; + +my $file_cleanup = new TestDriver::TmpFileDeleter([$tempdir]); + +$| = 1; +$SIG{'PIPE'} = 'IGNORE'; +$SIG{'INT'} = $SIG{'HUP'} = $SIG{'TERM'} = $SIG{'QUIT'} = sub { exit 2 }; + +TestDriver::rmrf($tempdir); +fatal("removal of $tempdir failed") if -e "$tempdir"; + +mkdir($tempdir, 0777) || die "mkdir $tempdir: $!\n"; +$tempdir = abs_path($tempdir) or + fatal("can't canonicalize path to $tempdir: $!"); + +my $errors = 0; + +my $tc_input = undef; +my $tc_scope = undef; +my @testcov = (<$covdir/*.testcov>); +if (@testcov > 1) +{ + fatal("more than one testcov file exists"); +} +elsif (@testcov) +{ + &QTC::TC("testdriver", "coverage directory", + ($covdir eq '.' ? 1 : 0)); + $tc_input = $testcov[0]; + $tc_input =~ s,^\./,,; + $tc_scope = basename($tc_input); + $tc_scope =~ s/\.testcov$// or + fatal("can't get scope from testcov filename"); +} + +my $testlogfile = 'qtest.log'; +my $testxmlfile = 'qtest-results.xml'; +unlink $testlogfile; +unlink $testxmlfile; + +my $totmissing = 0; +my $totextra = 0; +my $tottests = 0; +my $totpasses = 0; +my $totfails = 0; +my $totxpasses = 0; +my $totxfails = 0; + +my $now = ($in_testsuite ? '---timestamp---' : localtime(time)); +my $msg = "STARTING TESTS on $now"; +print "\n"; +print_and_log(('*' x length($msg)) . "\n$msg\n" . + ('*' x length($msg)) . "\n\n"); + +my $tc_log = undef; +my $tc_winlog = undef; +my %tc_cases = (); +my %tc_ignored_scopes = (); +parse_tc_file(); +tc_do_initial_checks(); + +my $tests_to_run; +defined($tests_to_run = $ENV{"TESTS"}) or $tests_to_run = ""; +my @tests = (); +if ($tests_to_run ne "") +{ + @tests = split(/\s+/, $tests_to_run); + for (@tests) + { + &QTC::TC("testdriver", "driver tests specified"); + $_ = "$datadir/$_.test"; + } +} +else +{ + &QTC::TC("testdriver", "driver tests not specified"); + @tests = <$datadir/*.test>; +} + +print_xml("\n" . + "\n"); +foreach my $test (@tests) +{ + print_and_log("\nRunning $test\n"); + print_xml(" \n"); + my @results = run_test($test); + if (scalar(@results) != 5) + { + error("test driver $test returned invalid results"); + } + else + { + my ($ntests, $passes, $fails, $xpasses, $xfails) = @results; + my $actual = $passes + $fails + $xpasses + $xfails; + my $extra = 0; + my $missing = 0; + if ($actual > $ntests) + { + &QTC::TC("testdriver", "driver extra tests"); + my $n = ($actual - $ntests); + print_and_log(sprintf("\n*** WARNING: saw $n extra test%s\n\n", + ($n == 1 ? "" : "s"))); + $extra = $n; + } + elsif ($actual < $ntests) + { + &QTC::TC("testdriver", "driver missing tests"); + my $n = ($ntests - $actual); + print_and_log(sprintf("\n*** WARNING: missing $n test%s\n\n", + ($n == 1 ? "" : "s"))); + $missing = $n; + } + + $totmissing += $missing; + $totextra += $extra; + $totpasses += $passes; + $totfails += $fails; + $totxpasses += $xpasses; + $totxfails += $xfails; + $tottests += ($passes + $fails + $xpasses + $xfails); + + my $passed = (($extra == 0) && ($missing == 0) && + ($fails == 0) && ($xpasses == 0)); + + print_xml(" \n"); + } + print_xml(" \n"); +} + +my $coverage_okay = 1; +tc_do_final_checks(); + +my $okay = ((($totpasses + $totxfails) == $tottests) && + ($errors == 0) && ($totmissing == 0) && ($totextra == 0) && + ($coverage_okay)); + +print "\n"; +print_and_pad("Overall test suite"); +if ($okay) +{ + &QTC::TC("testdriver", "driver overall pass"); + print_results(pass(), pass()); +} +else +{ + &QTC::TC("testdriver", "driver overall fail"); + print_results(fail(), pass()); + print "\nFailure summary may be found in $testlogfile\n"; +} + +my $summary = "\nTESTS COMPLETE. Summary:\n\n"; +$summary .= + sprintf("Total tests: %d\n" . + "Passes: %d\n" . + "Failures: %d\n" . + "Unexpected Passes: %d\n" . + "Expected Failures: %d\n" . + "Missing Tests: %d\n" . + "Extra Tests: %d\n", + $tottests, $totpasses, $totfails, $totxpasses, $totxfails, + $totmissing, $totextra); + +print_and_log($summary); +print "\n"; + +print_xml(" \n" . + "\n"); + +exit ($okay ? 0 : 2); + +sub run_test +{ + my $prog = shift; + my @results = (); + + # Open a socket for communication with subsidiary test drivers. + # Exchange some handshaking information over this socket. When + # the subsidiary test suite exits, it reports its results over the + # socket. + + my $use_socketpair = (defined $Config{d_sockpair}); + if ($Config{'osname'} eq 'cygwin') + { + $use_socketpair = 0; + } + + my $listensock; + my $for_parent; + my $for_child; + + my @comm_args = (); + + if ($use_socketpair) + { + socketpair($for_child, $for_parent, AF_UNIX, SOCK_STREAM, PF_UNSPEC) + or fatal("socketpair: $!"); + my $fd = fileno($for_child); + close($for_child); + close($for_parent); + local $^F = $fd; # prevent control fd from being closed on exec + socketpair($for_child, $for_parent, AF_UNIX, SOCK_STREAM, PF_UNSPEC) + or fatal("socketpair: $!"); + if (fileno($for_child) != $fd) + { + fatal("FOR_CHILD socket has wrong file descriptor number: got " . + fileno($for_child) . "; wanted $fd"); + } + $for_parent->autoflush(1); + $for_child->autoflush(1); + binmode $for_parent; + binmode $for_child; + @comm_args = ('-fd', $fd); + } + else + { + $listensock = IO::Socket::INET->new( + Listen => 1, Proto => 'tcp', LocalPort => 0) or + fatal("listen: $!"); + my ($s_port, $s_addr) = unpack_sockaddr_in($listensock->sockname()); + @comm_args = ('-port', $s_port); + } + + my $pid = fork; + fatal("fork failed: $!") unless defined $pid; + if ($pid == 0) + { + if ($use_socketpair) + { + close($for_parent); + } + chdir($datadir) or fatal("chdir $datadir failed: $!"); + + if (defined $tc_log) + { + # Set these environment variables in the child process so + # that we can actually use the coverage system + # successfully to test the test driver itself. + $ENV{'TC_SCOPE'} = $tc_scope; + $ENV{'TC_FILENAME'} = $tc_log; + if (defined $tc_winlog) + { + $ENV{'TC_WIN_FILENAME'} = $tc_winlog; + } + } + + # Clear this environment variable so that nested test suites + # don't inherit the value from this test suite. Note that as + # of perl 5.8.7 in cygwin, deleting an environment variable + # doesn't work. + $ENV{'TESTS'} = ""; + + exec +('perl', '-I', $module_dir, '-I', $qtc_dir, + basename($prog), + @comm_args, + '-origdir', $cwd, + '-tempdir', $tempdir, + '-testlog', "$cwd/$testlogfile", + '-testxml', "$cwd/$testxmlfile", + "-stdout-tty=$stdout_tty") or + fatal("exec $prog failed: $!"); + } + if ($use_socketpair) + { + close($for_child); + } + else + { + $for_parent = $listensock->accept() or die $!; + $for_parent->autoflush(); + $listensock->close(); + } + + eval + { + # Either CHLD or PIPE here indicates premature exiting of + # subsidiary process which will be detected by either a + # protocol error or a timeout on the select below. + local $SIG{'CHLD'} = local $SIG{'PIPE'} = 'IGNORE'; + print $for_parent "TEST_DRIVER 1\n" + or die "--child--\n"; + my $rin = ''; + vec($rin, fileno($for_parent), 1) = 1; + my $nfound = select($rin, '', '', 5); + if ($nfound == 0) + { + fatal("timed out waiting for input on $for_parent"); + } + # Setting to DEFAULT should be unnecessary because of "local" + # above, but there seems to be a race condition that this + # helps to correct. + $SIG{'CHLD'} = $SIG{'PIPE'} = 'DEFAULT'; + }; + if ($@) + { + if ($@ =~ m/--child--/) + { + error("subsidiary test driver exited"); + } + else + { + die $@; + } + } + else + { + my $line = <$for_parent>; + if (! ((defined $line) && ($line =~ m/^TEST_DRIVER_CLIENT 1$/))) + { + error("invalid protocol with subdiary test driver"); + kill 1, $pid; + } + waitpid $pid, 0; + my $results = <$for_parent>; + close($for_parent); + if (! ((defined $results) && ($results =~ m/^\d+(?: \d+){4}$/))) + { + &QTC::TC("testdriver", "driver test returned invalid results"); + error("invalid results from subsidiary test driver"); + } + else + { + @results = split(/ /, $results); + } + } + @results; +} + +sub parse_tc_file +{ + return unless defined $tc_input; + + my $tc = new IO::File("<$tc_input") or fatal("can't read $tc_input: $!"); + while (<$tc>) + { + s/\r?\n$//s; + next if m/^\#/; + next if m/^\s*$/; + if (m/^ignored-scope: (\S+)$/) + { + $tc_ignored_scopes{$1} = 1; + } + elsif (m/^\s*?(\S.+?)\s+(\d+)$/) + { + my ($case, $n) = ($1, $2); + if (exists $tc_cases{$case}) + { + &QTC::TC("testdriver", "driver duplicate coverage case"); + error("$tc_input:$.: duplicate case"); + } + $tc_cases{$case} = $n; + } + else + { + error("$tc_input:$.: invalid syntax"); + } + } + $tc->close(); +} + +sub tc_do_initial_checks +{ + return unless defined $tc_input; + + if (! exists $ENV{'TC_SRCS'}) + { + fatal("TC_SRCS must be set"); + } + + my @tc_srcs = (grep { m/\S/ } (split(/\s+/, $ENV{'TC_SRCS'}))); + + my %seen_cases = (); + foreach my $src (@tc_srcs) + { + my $s = new IO::File("<$src") or die "$whoami: open $src: $!\n"; + binmode $s; + while (<$s>) + { + # Look for coverage calls in the source subject to certain + # lexical constraints + my ($lscope, $case); + if (m/^\s*\&?QTC(?:::|\.)TC\(\"([^\"]+)\",\s*\"([^\"]+)\"/) + { + # C++, Java, Perl, etc. + ($lscope, $case) = ($1, $2); + } + elsif (m/^[^\#]*\$\(call QTC.TC,([^,]+),([^,\)]+)/) + { + # make + ($lscope, $case) = ($1, $2); + } + if ((defined $lscope) && (defined $case)) + { + if ($lscope eq $tc_scope) + { + push(@{$seen_cases{$case}}, [$src, $.]); + } + elsif (exists $tc_ignored_scopes{$lscope}) + { + &QTC::TC("testdriver", "driver ignored scope"); + } + else + { + &QTC::TC("testdriver", "driver out-of-scope case"); + error("$src:$.: out-of-scope coverage case"); + } + } + } + $s->close(); + } + + my %wanted_cases = %tc_cases; + foreach my $case (sort keys %seen_cases) + { + my $wanted = 1; + my $whybad = undef; + if (exists $wanted_cases{$case}) + { + delete $wanted_cases{$case}; + } + else + { + &QTC::TC("testdriver", "driver unregistered coverage case"); + $wanted = 0; + $whybad = "unregistered"; + } + if (scalar(@{$seen_cases{$case}}) > $wanted) + { + $whybad = $whybad || "duplicate"; + foreach my $d (@{$seen_cases{$case}}) + { + my ($file, $lineno) = @$d; + &QTC::TC("testdriver", "driver coverage error in src", + ($whybad eq 'unregistered' ? 0 : + $whybad eq 'duplicate' ? 1 : + 9999)); + error("$file:$lineno: $whybad coverage case \"$case\""); + } + } + } + foreach my $case (sort keys %wanted_cases) + { + &QTC::TC("testdriver", "driver unseen coverage case"); + error("$whoami: coverage case \"$case\" was not seen"); + } + + fatal("errors detected; exiting") if $errors; + + $tc_log = "$cwd/$tc_scope.cov_out"; + if ($^O eq 'cygwin') + { + chop(my $f = `cygpath --windows $tc_log`); + $tc_winlog = $f; + } + unlink $tc_log; + print_and_log("Test coverage active in scope $tc_scope\n"); +} + +sub tc_do_final_checks +{ + return unless (defined $tc_log); + + my %seen_cases = (); + my $tc = new IO::File("<$tc_log"); + if ($tc) + { + binmode $tc; + while (<$tc>) + { + s/\r?\n$//s; + next if m/^\#/; + next if m/^\s*$/; + if (m/^(.+) (\d+)$/) + { + $seen_cases{$1}{$2} = 1; + } + } + $tc->close(); + } + + my $testlog = open_log(); + + $testlog->print("\nTest coverage results:\n"); + + my @problems = (); + foreach my $c (sort keys %tc_cases) + { + my ($case, $n) = ($c, $tc_cases{$c}); + for (my $i = 0; $i <= $n; ++$i) + { + if (exists $seen_cases{$c}{$i}) + { + delete $seen_cases{$c}{$i}; + } + else + { + &QTC::TC("testdriver", "driver missing coverage case"); + push(@problems, "missing: $c $i"); + } + } + } + foreach my $c (sort keys %seen_cases) + { + foreach my $n (sort { $a <=> $b } (keys %{$seen_cases{$c}})) + { + &QTC::TC("testdriver", "driver extra coverage case"); + push(@problems, "extra: $c $n"); + } + } + + if (@problems) + { + my $testxml = open_xml(); + $testxml->print(" \n"); + foreach my $p (@problems) + { + $testlog->print("$p\n"); + $testxml->print(" \n"); + } + $testxml->print(" \n"); + $testxml->close(); + $testlog->print("coverage errors: " . scalar(@problems) . "\n"); + } + my $passed = (@problems == 0); + $testlog->print("\nCoverage analysis: ", ($passed ? 'PASSED' : 'FAILED'), + "\n"); + $testlog->close(); + + print "\n"; + print_and_pad("Coverage analysis"); + if ($passed) + { + print_results(pass(), pass()); + my $passlog = $tc_log; + $passlog =~ s/(\.[^\.]+)$/-passed$1/; + copy($tc_log, $passlog); + } + else + { + $coverage_okay = 0; + print_results(fail(), pass()); + } +} + +sub open_binary +{ + my $file = shift; + my $fh = new IO::File(">>$file") or fatal("can't open $file: $!"); + binmode $fh; + $fh; +} + +sub open_log +{ + open_binary($testlogfile); +} + +sub open_xml +{ + open_binary($testxmlfile); +} + +sub print_and_log +{ + my $fh = open_log(); + print @_; + print $fh @_; + $fh->close(); +} + +sub print_xml +{ + my $fh = open_xml(); + print $fh @_; + $fh->close(); +} + +sub print_and_pad +{ + TestDriver::print_and_pad(@_); +} + +sub print_results +{ + TestDriver::print_results(@_); +} + +sub pass +{ + TestDriver->PASS; +} + +sub fail +{ + TestDriver->FAIL; +} + +sub error +{ + my $msg = shift; + warn $msg, "\n"; + ++$errors; +} + +sub fatal +{ + my $msg = shift; + warn "$whoami: $msg\n"; + exit 2; +} + +sub usage +{ + warn " +Usage: $whoami --print-path + +Prints full path to ${whoami}'s installation directory and exits. + + - OR - + +Usage: $whoami options + +Options include: + + -datadir datadir + -bindirs bindir[:bindir...] + [ -covdir [coverage-dir] ] + [ -stdout-tty=[01] ] + +Subsidiary test programs are run with the -bindirs argument (a +colon-separated list of directories, which may be relative but will be +internally converted to absolute) prepended to the path and with the +-datadir argument set as the current working directory. + +By default, this program runs datadir/*.test as subsidiary test +suites. If the TESTS environment variable is set, it is taken to be a +space-separated list of test suite names. For each name n, +datadir/n.test is run. + +Test coverage support is built in. If a file whose name matches +*.testcov in the coverage directory (which defaults to \".\") that is +a valid test coverage file, the full path to the file into which test +coverage results are written will be placed in the TC_FILENAME +environment variable. (If running under cygwin, the Windows path will +be in TC_WIN_FILENAME.) The test coverage scope, which is equal to +the part of the testcov file name excluding the extension, is placed +in the TC_SCOPE environment variable. + +If the -stdout-tty option is passed, its value overrides ${whoami}'s +determination of whether standard output is a terminal. This can be +useful for cases in which another program is invoking ${whoami} and +passing its output through a pipe to a terminal. + +"; + exit 2; + +} diff --git a/qtest/module/TestDriver.pm b/qtest/module/TestDriver.pm new file mode 100644 index 00000000..6e1fa313 --- /dev/null +++ b/qtest/module/TestDriver.pm @@ -0,0 +1,1566 @@ +# -*- perl -*- +# +# This file is part of qtest. +# +# Copyright 1993-2007, Jay Berkenbilt +# +# QTest is distributed under the terms of version 2.0 of the Artistic +# license which may be found in the source distribution. +# + +# Search for "PUBLIC METHODS" to find the public methods and +# documentation on how to use them. + +require 5.008; +use strict; + +package TestDriver::PidKiller; + +use vars qw($f_pid); +$f_pid = 'pid'; + +sub new +{ + my $class = shift; + my $rep = +{+__PACKAGE__ => {} }; + $rep->{+__PACKAGE__}{$f_pid} = shift; + bless $rep, $class; +} + +sub DESTROY +{ + my $rep = shift; + my $pid = $rep->{+__PACKAGE__}{$f_pid}; + defined($$pid) && $$pid && kill 15, $$pid; +} + +package TestDriver::TmpFileDeleter; + +use vars qw($f_files); +$f_files = 'files'; + +sub new +{ + my $class = shift; + my $rep = +{+__PACKAGE__ => {} }; + $rep->{+__PACKAGE__}{$f_files} = shift; + bless $rep, $class; +} + +sub DESTROY +{ + local $?; + my $rep = shift; + my $files = ($rep->{+__PACKAGE__}{$f_files}); + map { TestDriver::rmrf($_) } @$files; +} + +package TestDriver; + +use IO::Handle; +use IO::File; +use IO::Socket; +use IO::Select; +use POSIX ':sys_wait_h'; +use File::Copy; +use File::Find; +use Carp; +use Cwd; +require QTC; + +# Constants + +# Possible test case outcomes +use constant PASS => 'PASS'; +use constant FAIL => 'FAIL'; + +# Input/Output keys +use constant STRING => 'STRING'; +use constant FILE => 'FILE'; +use constant COMMAND => 'COMMAND'; +use constant FILTER => 'FILTER'; +use constant REGEXP => 'REGEXP'; +use constant EXIT_STATUS => 'EXIT_STATUS'; +use constant THREAD_DATA => 'THREAD_DATA'; +use constant TD_THREADS => 'TD_THREADS'; +use constant TD_SEQGROUPS => 'TD_SEQGROUPS'; + +# Flags +use constant NORMALIZE_NEWLINES => 1 << 0; +use constant NORMALIZE_WHITESPACE => 1 << 1; +use constant EXPECT_FAILURE => 1 << 2; + +# Field names +use vars qw($f_socket $f_origdir $f_tempdir $f_testlog $f_testxml $f_suitename); +$f_socket = 'socket'; +$f_origdir = 'origdir'; +$f_tempdir = 'tempdir'; +$f_testlog = 'testlog'; +$f_testxml = 'testxml'; +$f_suitename = 'suitename'; + +use vars qw($f_passes $f_fails $f_xpasses $f_xfails $f_testnum); +$f_passes = 'passes'; # expected passes +$f_fails = 'fails'; # unexpected failures +$f_xpasses = 'xpasses'; # unexpected passes +$f_xfails = 'xfails'; # expected failures +$f_testnum = 'testnum'; + +# Static Variables + +# QTEST_MARGIN sets the number of spaces to after PASSED or FAILED and +# before the rightmost column of the screen. +my $margin = $ENV{'QTEST_MARGIN'} || 8; +$margin += $ENV{'QTEST_EXTRA_MARGIN'} || 0; + +my $ncols = 80; + +my $color_reset = ""; +my $color_green = ""; +my $color_yellow = ""; +my $color_red = ""; +my $color_magenta = ""; +my $color_emph = ""; + +sub get_tty_features +{ + my $got_size = 0; + eval + { + require Term::ReadKey; + ($ncols, undef, undef, undef) = Term::ReadKey::GetTerminalSize(); + $got_size = 1; + }; + if (! $got_size) + { + eval + { + # Get screen columns if possible + no strict; + local $^W = 0; + local *X; + require 'sys/ioctl.ph'; + if ((defined &TIOCGWINSZ) && open(X, "+ {} }; + + if (@_ != 1) + { + croak "Usage: ", __PACKAGE__, "->new(\"test-suite name\")\n"; + } + my $suitename = shift; + + if (! ((@ARGV == 11) && + (($ARGV[0] eq '-fd') || ($ARGV[0] eq '-port')) && + ($ARGV[2] eq '-origdir') && + ($ARGV[4] eq '-tempdir') && + ($ARGV[6] eq '-testlog') && + ($ARGV[8] eq '-testxml') && + ($ARGV[10] =~ m/^-stdout-tty=([01])$/) && + (-d $ARGV[5]))) + { + die +__PACKAGE__, ": improper invocation of test driver $0\n"; + } + my $fd = ($ARGV[0] eq '-fd') ? $ARGV[1] : undef; + my $port = ($ARGV[0] eq '-port') ? $ARGV[1] : undef; + my $origdir = $ARGV[3]; + my $tempdir = $ARGV[5]; + my $testlogfile = $ARGV[7]; + my $testxmlfile = $ARGV[9]; + my $testlog = new IO::File(">>$testlogfile"); + binmode $testlog; + my $testxml = new IO::File(">>$testxmlfile"); + binmode $testxml; + $ARGV[10] =~ m/=([01])/ or die +__PACKAGE__, ": INTERNAL ERROR in ARGV[10]"; + my $stdout_is_tty = $1; + if ($stdout_is_tty) + { + get_tty_features(); + } + + my $socket; + if (defined $fd) + { + $socket = new IO::Handle; + if (! $socket->fdopen($fd, "w+")) + { + warn +__PACKAGE__, ": unable to open file descriptor $fd.\n"; + warn +__PACKAGE__, " must be created from a program invoked by" . + " the test driver system\n"; + die +__PACKAGE__, ": initialization failed"; + } + } + else + { + $socket = IO::Socket::INET->new( + PeerAddr => '127.0.0.1', PeerPort => $port) or + die "unable to connect to port $port: $!\n"; + } + $socket->autoflush(); + binmode $socket; + + # Do some setup that would ordinarily be reserved for a main + # program. We want test suites to behave in a certain way so tha + # the overall system works as desired. + + # Killing the driver should cause to to exit. Without this, it + # may cause whatever subsidiary program is being run to exit and + # the driver to continue to the next test case. + $SIG{'INT'} = $SIG{'HUP'} = $SIG{'TERM'} = $SIG{'QUIT'} = sub { exit 2 }; + + # Unbuffer our output. + $| = 1; + + $rep->{+__PACKAGE__}{$f_socket} = $socket; + $rep->{+__PACKAGE__}{$f_origdir} = $origdir; + $rep->{+__PACKAGE__}{$f_tempdir} = $tempdir; + $rep->{+__PACKAGE__}{$f_testlog} = $testlog; + $rep->{+__PACKAGE__}{$f_testxml} = $testxml; + $rep->{+__PACKAGE__}{$f_suitename} = $suitename; + $rep->{+__PACKAGE__}{$f_passes} = 0; + $rep->{+__PACKAGE__}{$f_fails} = 0; + $rep->{+__PACKAGE__}{$f_xpasses} = 0; + $rep->{+__PACKAGE__}{$f_xfails} = 0; + $rep->{+__PACKAGE__}{$f_testnum} = 1; + + # Do protocol handshaking with the test driver system + my $init = scalar(<$socket>); + if ($init !~ m/^TEST_DRIVER 1$/) + { + die +__PACKAGE__, ": incorrect protocol with test driver system\n"; + } + $socket->print("TEST_DRIVER_CLIENT 1\n"); + + bless $rep, $class; +} + +sub _socket +{ + my $rep = shift; + $rep->{+__PACKAGE__}{$f_socket}; +} + +sub _tempdir +{ + my $rep = shift; + $rep->{+__PACKAGE__}{$f_tempdir}; +} + +sub _testlog +{ + my $rep = shift; + $rep->{+__PACKAGE__}{$f_testlog}; +} + +sub _testxml +{ + my $rep = shift; + $rep->{+__PACKAGE__}{$f_testxml}; +} + +sub _suitename +{ + my $rep = shift; + $rep->{+__PACKAGE__}{$f_suitename}; +} + +sub _testnum +{ + my $rep = shift; + $rep->{+__PACKAGE__}{$f_testnum} = $_[0] if @_; + $rep->{+__PACKAGE__}{$f_testnum}; +} + +# PUBLIC METHODS + +# Usage: report(n) +# Specify the number of tests that are expected to have been run. +# Please note: the purpose of reporting the number of test cases with +# "report" is as an extra check to make sure that the test suite +# itself didn't have a logic error that caused some test cases to be +# skipped. The argument to "report" should therefore be a hard-coded +# number or a number computed only from static features in the test +# suite. It should not be a number that is counted up during the +# process of running the test suite. Computing this number as a side +# effect of running test cases would defeat the purpose of the number. +# For example, if the test suite consists of an array of test cases, +# and the test suite code iterates through that loop and calls +# "runtest" twice for each element, it would be reasonable to pass an +# expression that includes the size of the array as an argument to +# "report", but it would not be appropriate to have a variable called +# "$ntests" that is incremented each time "runtest" is called and then +# passed to "report". +sub report +{ + my $rep = shift; + croak "Usage: ", __PACKAGE__, "->report(num-tests-expected)\n" + unless @_ && $_[0] =~ m/^\d+$/; + + # Message to test driver system: + # n-expected-tests passes fails unexpected-passes expected-fails + + my @vals = (shift); + push(@vals, map { $rep->{+__PACKAGE__}{$_} } ($f_passes, $f_fails, + $f_xpasses, $f_xfails)); + my $socket = $rep->_socket(); + $socket->print(join(' ', @vals)), "\n"; +} + +# Usage: notify(string) +# Prints the string followed by a newline to standard output of the +# test suite. +sub notify +{ + my $rep = shift; + my $msg = shift; + &QTC::TC("testdriver", "TestDriver notify"); + print $msg, "\n"; +} + +# Usage: emphasize(string) +# Prints the string followed by a newline to standard output of the +# test suite. The string is printed with emphasis if the terminal +# supports color. +sub emphasize +{ + my $rep = shift; + my $msg = shift; + &QTC::TC("testdriver", "TestDriver emphasize"); + print $color_emph, $msg, $color_reset, "\n"; +} + +# Usage: prompt(msg, env, default) +# If the environment variable "env" is set, its value is returned. +# Otherwise, if STDIN is a tty, the user is prompted for an answer +# using msg as the prompt, or if STDIN is not a tty, the value +# specified in "default" is returned. Note that careless use of +# prompt in test suites may make the test suites unable to be run in +# batch mode. +sub prompt +{ + my $rep = shift; + my ($msg, $env, $default) = @_; + &QTC::TC("testdriver", "TestDriver prompt"); + my $answer = $ENV{$env}; + if (defined $answer) + { + print "$msg\n"; + print "[Question answered from environment variable \$$env: $answer]\n"; + } + else + { + print "To avoid question, place answer in" . + " environment variable \$$env\n"; + if (-t STDIN) + { + print "$msg "; + chop($answer = ); + if ($answer eq '') + { + print "[Using default answer for question: $default]\n"; + $answer = $default; + } + } + else + { + print "$msg\n"; + print "[Using default answer for question: $default]\n"; + $answer = $default; + } + } + $answer; +} + +# Usage: get_start_dir() +# Returns the name of the directory from which the test driver was +# originally invoked. This can be useful for test suites that are +# designed to be run from read-only areas or from multiple locations +# simultaneously: they can get the original invocation directory and +# use it as a place to write temporary files. +sub get_start_dir +{ + my $rep = shift; + $rep->{+__PACKAGE__}{$f_origdir}; +} + +# Usage: runtest description input output [ flags ] +# Returns true iff test passes; i.e., input matches output + +# Parameters: + +# description: a short textual description of the test case + +# input: a hash reference that defines the input to the test case +# input keys and associated values: + +# STRING: a string that is used verbatim as the test input + +# FILE: a file whose contents are used as the test input + +# COMMAND: an array reference containing a command and arguments +# or a string representing the command. This is passed to exec, +# so the rules that exec uses to determine whether to pass this +# to a shell are followed. The command is run with STDIN set to +# /dev/null, STDOUT redirected to an internal file, and STDERR +# copied to STDOUT. + +# Note that exactly one of STRING, FILE, or COMMAND must appear. + +# FILTER: if specified, it is a program that is run on the test +# input specified above to generate the true test input. + +# output: a hash reference that defines the expected output of the +# test case + +# STRING: a string that contains the expected test output + +# FILE: a file that contains the expected test output + +# REGEXP: a regular expression that must match the test output + +# Note that exactly one of STRING, FILE, or REGEXP must appear. + +# EXIT_STATUS: the exit status of the command. Required iff the +# intput is specified by COMMAND. A value of undef means that we +# don't care about the exit status of a command. An integer +# value is the ordinary exit status of a command. A string of +# the form SIG:n indicates that the program has exited with +# signal n. + +# THREAD_DATA: If specified, the test output is expected to +# contain multithreaded output with output lines marked by thread +# and sequence group identifiers. The value must be a hash that +# contains required key TD_THREADS and optional key TD_SEQGROUPS. +# The value of each key is an array reference containing a list +# of threads or sequence groups as appropriate. When THREAD_DATA +# is specified, the single call to runtest actually generates t + +# s + 3 tests where "t" is the number of threads and "s" is the +# number of sequence groups specified. See the documentation for +# full details on how multithreaded output is handled by the test +# driver. + +# flags: additional flags to control the test case; should be +# logically orred together (e.g. NORMALIZE_WHITESPACE | EXPECT_FAILURE) + +# NORMALIZE_NEWLINES: If specified, all newlines or carriage +# return/newline combinations in the input are translated to +# straight UNIX-style newlines. This is done before writing +# through any filter. Newlines are also normalized in the +# expected output. + +# NORMALIZE_WHITESPACE: If specified, all carriage returns are +# removed, and all strings of one or more space or tab characters +# are replaced by a single space character in the input. This is +# done before writing through any filter. The expected output +# must be normalized in this way as well in order for the test to +# pass. + +# EXPECT_FAILURE: If specified, the test case is expected to +# fail. In this case, a test case failure will not generate +# verbose output or cause overall test suite failure, and a pass +# will generate test suite failure. This should be used for +# place-holder test cases that exercise a known bug that cannot +# yet be fixed. + +sub runtest +{ + my $rep = shift; + + if (! ((@_ == 3) || (@_ == 4))) + { + croak +("Usage: ", +__PACKAGE__, + "->runtest(description, input, output[, flags])\n"); + } + + my ($description, $input, $output, $flags) = @_; + $flags = 0 unless defined $flags; + + my $tempdir = $rep->_tempdir(); + + if (ref($description) ne '') + { + &QTC::TC("testdriver", "TestDriver description not string"); + croak +__PACKAGE__, "->runtest: description must be a string\n"; + } + if (ref($input) ne 'HASH') + { + &QTC::TC("testdriver", "TestDriver input not hash"); + croak +__PACKAGE__, "->runtest: input must be a hash reference\n"; + } + if (ref($output) ne 'HASH') + { + &QTC::TC("testdriver", "TestDriver output not hash"); + croak +__PACKAGE__, "->runtest: output must be a hash reference\n"; + } + if ((ref($flags) ne '') || ($flags !~ m/^\d+$/)) + { + &QTC::TC("testdriver", "TestDriver flags not integer"); + croak +__PACKAGE__, "->runtest: flags must be an integer\n"; + } + + my ($extra_in_keys, $in_string, $in_file, $in_command, $in_filter) = + check_hash_keys($input, $rep->STRING, + $rep->FILE, $rep->COMMAND, $rep->FILTER); + if ($extra_in_keys) + { + &QTC::TC("testdriver", "TestDriver extraneous input keys"); + croak +(+__PACKAGE__, + "->runtest: extraneous keys in intput hash: $extra_in_keys\n"); + } + my ($extra_out_keys, $out_string, $out_file, $out_regexp, + $out_exit_status, $thread_data) = + check_hash_keys($output, $rep->STRING, + $rep->FILE, $rep->REGEXP, $rep->EXIT_STATUS, + $rep->THREAD_DATA); + if ($extra_out_keys) + { + &QTC::TC("testdriver", "TestDriver extraneous output keys"); + croak +(+__PACKAGE__, + "->runtest: extraneous keys in output hash: $extra_out_keys\n"); + } + + if ((((defined $in_string) ? 1 : 0) + + ((defined $in_file) ? 1 : 0) + + ((defined $in_command) ? 1 : 0)) != 1) + { + &QTC::TC("testdriver", "TestDriver invalid input"); + croak +__PACKAGE__, "->runtest: exactly one of" . + " STRING, FILE, or COMMAND must be present for input\n"; + } + if ((((defined $out_string) ? 1 : 0) + + ((defined $out_file) ? 1 : 0) + + ((defined $out_regexp) ? 1 : 0)) != 1) + { + &QTC::TC("testdriver", "TestDriver invalid output"); + croak +__PACKAGE__, "->runtest: exactly one of" . + " STRING, FILE, or REGEXP must be present for output\n"; + } + if ((defined $in_command) != (exists $output->{$rep->EXIT_STATUS})) + { + &QTC::TC("testdriver", "TestDriver invalid status"); + croak +__PACKAGE__, "->runtest: input COMMAND and output EXIT_STATUS" + . " must either both appear both not appear\n"; + } + + my ($threads, $seqgroups) = (undef, undef); + if (defined $thread_data) + { + if (ref($thread_data) ne 'HASH') + { + &QTC::TC("testdriver", "TestDriver thread_data not hash"); + croak +__PACKAGE__, "->runtest: THREAD_DATA" . + " must be a hash reference\n"; + } + my $extra_thread_keys; + ($extra_thread_keys, $threads, $seqgroups) = + check_hash_keys($thread_data, $rep->TD_THREADS, $rep->TD_SEQGROUPS); + if ($extra_thread_keys) + { + &QTC::TC("testdriver", "TestDriver extraneous thread_data keys"); + croak +(+__PACKAGE__, + "->runtest: extraneous keys in THREAD_DATA hash:" . + " $extra_thread_keys\n"); + } + if (! defined $threads) + { + &QTC::TC("testdriver", "TestDriver thread_data no threads"); + croak +__PACKAGE__, "->runtest: THREAD_DATA" . + " must contain TD_THREADS\n"; + } + elsif (ref($threads) ne 'ARRAY') + { + &QTC::TC("testdriver", "TestDriver threads not array ref"); + croak +__PACKAGE__, "->runtest: TD_THREADS" . + " must be an array reference\n"; + } + if ((defined $seqgroups) && (ref($seqgroups) ne 'ARRAY')) + { + &QTC::TC("testdriver", "TestDriver seqgroups not array ref"); + croak +__PACKAGE__, "->runtest: TD_SEQGROUPS" . + " must be an array reference\n"; + } + } + + # testnum is incremented by print_testid + my $testnum = $rep->_testnum(); + my $category = $rep->_suitename(); + $rep->print_testid($description); + + # Open a file handle to read the raw (unfiltered) test input + my $pid = undef; + my $pid_killer = new TestDriver::PidKiller(\$pid); + my $in = new IO::Handle; + if (defined $in_string) + { + &QTC::TC("testdriver", "TestDriver input string"); + open($in, '<', \$in_string) or + die +(+__PACKAGE__, + "->runtest: unable to read from input string: $!\n"); + } + elsif (defined $in_file) + { + &QTC::TC("testdriver", "TestDriver input file"); + open($in, '<', $in_file) or + croak +(+__PACKAGE__, + "->runtest: unable to read from input file $in_file: $!\n"); + } + elsif (defined $in_command) + { + $pid = open($in, "-|"); + croak +__PACKAGE__, "->runtest: fork failed: $!\n" unless defined $pid; + if ($pid == 0) + { + # child + open(STDERR, ">&STDOUT"); + open(STDIN, '<', \ ""); + if (ref($in_command) eq 'ARRAY') + { + &QTC::TC("testdriver", "TestDriver input command array"); + exec @$in_command or + croak+(+__PACKAGE__, + "->runtest: unable to run command ", + join(' ', @$in_command), "\n"); + } + else + { + &QTC::TC("testdriver", "TestDriver input command string"); + exec $in_command or + croak+(+__PACKAGE__, + "->runtest: unable to run command ", + $in_command, "\n"); + } + } + } + else + { + die +__PACKAGE__, ": INTERNAL ERROR: invalid test input"; + } + binmode $in; + + # Open file handle into which to write the actual output + my $actual = new IO::File; + my $actual_file = "$tempdir/actual"; + if (defined $in_filter) + { + &QTC::TC("testdriver", "TestDriver filter defined"); + # Write through filter to actual file + open($actual, "| $in_filter > $actual_file") or + croak +(+__PACKAGE__, ": pipe to filter $in_filter failed: $!\n"); + binmode $actual; + } + else + { + &QTC::TC("testdriver", "TestDriver filter not defined"); + open($actual, ">$actual_file") or + die +(+__PACKAGE__, ": write to $actual_file failed: $!\n"); + binmode $actual; + } + + # Write from input to actual output, normalizing spaces and + # newlines if needed + my $exit_status = undef; + while (1) + { + my ($line, $status) = read_line($in, $pid); + $exit_status = $status if defined $status; + last unless defined $line; + if ($flags & $rep->NORMALIZE_WHITESPACE) + { + &QTC::TC("testdriver", "TestDriver normalize whitespace"); + $line =~ s/[ \t]+/ /g; + } + else + { + &QTC::TC("testdriver", "TestDriver no normalize whitespace"); + } + if ($flags & $rep->NORMALIZE_NEWLINES) + { + &QTC::TC("testdriver", "TestDriver normalize newlines"); + $line =~ s/\r$//; + } + else + { + &QTC::TC("testdriver", "TestDriver no normalize newlines"); + } + $actual->print($line); + $actual->flush(); + last if defined $exit_status; + } + $in->close(); + if (defined $in_command) + { + if (! defined $exit_status) + { + $exit_status = $?; + } + if (($exit_status > 0) && ($exit_status < 256)) + { + &QTC::TC("testdriver", "TestDriver exit status signal"); + $exit_status &= 127; # clear core dump flag + $exit_status = "SIG:$exit_status"; + } + else + { + &QTC::TC("testdriver", "TestDriver exit status number"); + $exit_status >>= 8; + } + } + $? = 0; + $actual->close(); + $pid = undef; + if ($?) + { + die +(+__PACKAGE__, + "->runtest: failure closing actual output; status = $?\n"); + } + + # Compare exit statuses. This expression is always true when the + # input was not from a command. + my $status_match = ((! defined $out_exit_status) || + ((defined $exit_status) && + ($exit_status eq $out_exit_status))); + + # Compare actual output with expected output. + my $expected_file = undef; + my $output_match = undef; + if (defined $out_string) + { + &QTC::TC("testdriver", "TestDriver output string"); + # Write output string to a file so we can run diff + $expected_file = "$tempdir/expected"; + my $e = new IO::File; + open($e, ">$expected_file") or + die +(__PACKAGE__, + "->runtest: unable to write to $expected_file: $!\n"); + binmode $e; + $e->print($out_string); + $e->close(); + } + elsif (defined $out_file) + { + &QTC::TC("testdriver", "TestDriver output file"); + if ($flags & $rep->NORMALIZE_NEWLINES) + { + # Normalize newlines in expected output file + $expected_file = "$tempdir/expected"; + unlink $expected_file; + my $in = new IO::File; + if (open($in, "<$out_file")) + { + binmode $in; + my $e = new IO::File; + open($e, ">$expected_file") or + die +(__PACKAGE__, + "->runtest: unable to write to $expected_file: $!\n"); + binmode $e; + while (<$in>) + { + s/\r?$//; + $e->print($_); + } + $e->close(); + $in->close(); + } + } + else + { + $expected_file = $out_file; + } + } + elsif (defined $out_regexp) + { + &QTC::TC("testdriver", "TestDriver output regexp"); + # No expected file; do regexp test to determine whether output + # matches + $actual = new IO::File; + open($actual, "<$actual_file") or + die +(__PACKAGE__, + "->runtest: unable to read $actual_file: $!\n"); + binmode $actual; + local $/ = undef; + my $actual_output = <$actual>; + $actual->close(); + $output_match = ($actual_output =~ m/$out_regexp/); + } + else + { + die +__PACKAGE__, ": INTERNAL ERROR: invalid test output"; + } + + my $output_diff = undef; + if (! defined $output_match) + { + if (! defined $expected_file) + { + die +__PACKAGE__, ": INTERNAL ERROR: expected_file not defined"; + } + if (defined $threads) + { + # Real output comparisons are done later. + $output_match = 1; + } + else + { + $output_diff = "$tempdir/difference"; + my $r = safe_pipe(['diff', '-a', '-u', + $expected_file, $actual_file], + $output_diff); + $output_match = ($r == 0); + } + } + + my $outcome = ($output_match && $status_match) ? PASS : FAIL; + my $exp_outcome = (($flags & $rep->EXPECT_FAILURE) ? FAIL : PASS); + my $outcome_text = print_results($outcome, $exp_outcome); + my $passed = $rep->update_counters($outcome, $exp_outcome); + + my $testxml = $rep->_testxml(); + my $testlog = $rep->_testlog(); + # $outcome_text is for the human-readable. We need something + # different for the xml file. + $testxml->print(" print(" >\n"); + $testlog->printf("$category test %d (%s) FAILED\n", + $testnum, $description); + my $cwd = getcwd(); + $testlog->print("cwd: $cwd\n"); + $testxml->print(" $cwd\n"); + my $cmd = $in_command; + if ((defined $cmd) && (ref($cmd) eq 'ARRAY')) + { + $cmd = join(' ', @$cmd); + } + if (defined $cmd) + { + $testlog->print("command: $cmd\n"); + $testxml->print(" $cmd\n"); + } + if (defined $out_file) + { + # Use $out_file, not $expected_file -- we are only + # interested in dispaying this information if the user's + # real output was original in a file. + $testlog->print("expected output in $out_file\n"); + $testxml->print( + " $out_file\n"); + } + + # It would be nice if we could filter out internal calls for + # times when runtest is called inside of the module for + # multithreaded testing. + $testlog->print(Carp::longmess()); + + $testxml->print(" test failure" . + Carp::longmess() . + "\n"); + + if (! $status_match) + { + &QTC::TC("testdriver", "TestDriver status mismatch"); + $testlog->printf("\tExpected status: %s\n", $out_exit_status); + $testlog->printf("\tActual status: %s\n", $exit_status); + $testxml->print( + " $out_exit_status\n"); + $testxml->print( + " $exit_status\n"); + } + if (! $output_match) + { + &QTC::TC("testdriver", "TestDriver output mismatch"); + $testlog->print("--> BEGIN EXPECTED OUTPUT <--\n"); + $testxml->print(" "); + if (defined $expected_file) + { + write_file_to_fh($expected_file, $testlog); + xml_write_file_to_fh($expected_file, $testxml); + } + elsif (defined $out_regexp) + { + $testlog->print("regexp: " . $out_regexp); + if ($out_regexp !~ m/\n$/s) + { + $testlog->print("\n"); + } + $testxml->print("regexp: " . $out_regexp); + } + else + { + die +(+__PACKAGE__, + "->runtest: INTERNAL ERROR: no expected output\n"); + } + $testlog->print("--> END EXPECTED OUTPUT <--\n" . + "--> BEGIN ACTUAL OUTPUT <--\n"); + $testxml->print("\n" . + " "); + write_file_to_fh($actual_file, $testlog); + xml_write_file_to_fh($actual_file, $testxml); + $testlog->print("--> END ACTUAL OUTPUT <--\n"); + $testxml->print("\n"); + if (defined $output_diff) + { + &QTC::TC("testdriver", "TestDriver display diff"); + $testlog->print("--> DIFF EXPECTED ACTUAL <--\n"); + $testxml->print(" "); + write_file_to_fh($output_diff, $testlog); + xml_write_file_to_fh($output_diff, $testxml); + $testlog->print("--> END DIFFERENCES <--\n"); + $testxml->print("\n"); + } + else + { + &QTC::TC("testdriver", "TestDriver display no diff"); + } + } + $testxml->print(" \n"); + } + else + { + $testxml->print(" />\n"); + } + + if (defined $threads) + { + if (! defined $expected_file) + { + &QTC::TC("testdriver", "TestDriver thread data but no exp output"); + croak +(+__PACKAGE__, + "->runtest: thread data invalid". + " without fixed test output\n"); + } + + my $thread_expected = "$tempdir/thread-expected"; + my $thread_actual = "$tempdir/thread-actual"; + copy($actual_file, $thread_actual); + filter_seqgroups($expected_file, $thread_expected); + + $passed = + $rep->analyze_thread_data($description, + $expected_file, $actual_file, + $threads, $seqgroups) + && $passed; + + if ($passed) + { + $rep->runtest($description . ": all subcases passed", + {$rep->STRING => ""}, + {$rep->STRING => ""}); + } + else + { + $rep->runtest($description . ": original output", + {$rep->FILE => $thread_actual}, + {$rep->FILE => $thread_expected}); + } + + unlink $thread_expected, $thread_actual; + } + + $passed; +} + +sub read_line +{ + my ($fh, $pid) = @_; + my $line = undef; + my $status = undef; + + if (defined $pid) + { + # It doesn't work to just call <$fh> in this case. For some + # unknown reason, some programs occasionally exit and cause an + # interrupted system call return from read which perl just + # ignores, making the call to <$fh> hang. To protect + # ourselves, we explicitly check for the program having exited + # periodically if read hasn't returned anything. + + while (1) + { + my $s = new IO::Select(); + $s->add($fh); + my @ready = $s->can_read(1); + if (@ready == 0) + { + if (waitpid($pid, WNOHANG) > 0) + { + $status = $?; + last; + } + next; + } + else + { + my $buf = ""; + my $status = sysread($fh, $buf, 1); + if ((defined $status) && ($status == 1)) + { + $line = "" unless defined $line; + $line .= $buf; + last if $buf eq "\n"; + } + else + { + last; + } + } + } + } + else + { + $line = <$fh>; + } + ($line, $status); +} + +sub write_file_to_fh +{ + my ($file, $out) = @_; + my $in = new IO::File("<$file"); + if (defined $in) + { + binmode $in; + my $ended_with_newline = 1; + while (<$in>) + { + $out->print($_); + $ended_with_newline = m/\n$/s; + } + if (! $ended_with_newline) + { + $out->print("[no newline at end of data]\n"); + } + $in->close(); + } + else + { + $out->print("[unable to open $file: $!]\n"); + } +} + +sub xml_write_file_to_fh +{ + my ($file, $out) = @_; + my $in = new IO::File("<$file"); + if (defined $in) + { + binmode $in; + while (defined ($_ = <$in>)) + { + s/\&/\&/g; + s//>/g; + s/([\000-\011\013-\037\177-\377])/sprintf("&#x%02x;", ord($1))/ge; + $out->print($_); + } + $in->close(); + } + else + { + $out->print("[unable to open $file: $!]"); + } +} + +sub check_hash_keys +{ + my ($hash, @keys) = @_; + my %actual_keys = (); + foreach my $k (keys %$hash) + { + $actual_keys{$k} = 1; + } + foreach my $k (@keys) + { + delete $actual_keys{$k}; + } + my $extra_keys = join(', ', sort (keys %actual_keys)); + ($extra_keys, (map { $hash->{$_} } @keys)); +} + +sub print_testid +{ + my $rep = shift; + my ($description) = @_; + + my $testnum = $rep->_testnum(); + my $category = $rep->_suitename(); + print_and_pad(sprintf("$category %2d (%s)", $testnum, $description)); + my $tc_filename = $ENV{'TC_FILENAME'} || ""; + if ($tc_filename && open(F, ">>$tc_filename")) + { + printf F "# $category %2d (%s)\n", $testnum, $description; + close(F); + } + $rep->_testnum(++$testnum); +} + +sub update_counters +{ + my $rep = shift; + my ($outcome, $exp_outcome) = @_; + + (($outcome eq PASS) && ($exp_outcome eq PASS)) && + $rep->{+__PACKAGE__}{$f_passes}++; + (($outcome eq PASS) && ($exp_outcome eq FAIL)) && + $rep->{+__PACKAGE__}{$f_xpasses}++; + (($outcome eq FAIL) && ($exp_outcome eq PASS)) && + $rep->{+__PACKAGE__}{$f_fails}++; + (($outcome eq FAIL) && ($exp_outcome eq FAIL)) && + $rep->{+__PACKAGE__}{$f_xfails}++; + + ($outcome eq PASS); +} + +sub analyze_thread_data +{ + my $rep = shift; + my ($description, $expected, $actual, + $expected_threads, $expected_seqgroups) = @_; + + my $tempdir = $rep->_tempdir(); + + my %actual_threads = (); + my %actual_seqgroups = (); + my @errors = (); + + $rep->thread_cleanup(); + $rep->split_combined($expected); + $rep->analyze_threaded_output + ($actual, \%actual_threads, \%actual_seqgroups, \@errors); + + # Make sure we saw the right threads and sequences + + my $desired = "threads:\n"; + $desired .= join('', map { " $_\n" } (sort @$expected_threads)); + $desired .= "sequence groups:\n"; + if (defined $expected_seqgroups) + { + $desired .= join('', map { " $_\n" } (sort @$expected_seqgroups)); + } + + my $observed = "threads:\n"; + $observed .= join('', map { " $_\n" } (sort keys %actual_threads)); + $observed .= "sequence groups:\n"; + $observed .= join('', map { " $_\n" } (sort keys %actual_seqgroups)); + + if (@errors) + { + $observed .= join('', @errors); + } + + my $passed = + $rep->runtest("$description: multithreaded data", + {$rep->STRING => $observed}, + {$rep->STRING => $desired}); + + + foreach my $th (@{$expected_threads}) + { + create_if_missing("$tempdir/$th.thread-actual", + "[no actual output]\n"); + filter_seqgroups("$tempdir/$th.thread-expected", + "$tempdir/$th.thread-filtered"); + $passed = + $rep->runtest($description . ": thread $th", + {$rep->FILE => "$tempdir/$th.thread-actual"}, + {$rep->FILE => "$tempdir/$th.thread-filtered"}) + && $passed; + } + if (defined $expected_seqgroups) + { + foreach my $sg (@{$expected_seqgroups}) + { + create_if_missing("$tempdir/$sg.seq-actual", + "[no actual output]\n"); + $passed = + $rep->runtest($description . ": seqgroup $sg", + {$rep->FILE => "$tempdir/$sg.seq-actual"}, + {$rep->FILE => "$tempdir/$sg.seq-expected"}) + && $passed; + } + } + + $rep->thread_cleanup(); + + $passed; +} + +sub analyze_threaded_output +{ + my $rep = shift; + my ($file, $threads, $seqgroups, $errors) = @_; + my $sequence_checking = 1; + open(F, "<$file") or die +__PACKAGE__, ": can't open $file: $!\n"; + my $cur_thread = undef; + while () + { + if (m/^(\[\[(.+?)\]\]:)/) + { + my $tag = $1; + my $thread = $2; + my $rest = $'; #' [unconfuse emacs font lock mode] + + $rep->handle_line($file, $., $tag, $thread, $rest, + \$sequence_checking, $threads, $seqgroups, + $errors); + + $cur_thread = $thread; + } + else + { + $rep->handle_line($file, $., "", $cur_thread, $_, + \$sequence_checking, $threads, $seqgroups, + $errors); + } + } + close(F); +} + +sub handle_line +{ + my $rep = shift; + my ($file, $lineno, $tag, $thread, $rest, + $sequence_checking, $threads, $seqgroups, $errors) = @_; + + my $tempdir = $rep->_tempdir(); + + if (! exists $threads->{$thread}) + { + my $fh = new IO::File("<$tempdir/$thread.thread-expected"); + if (! $fh) + { + &QTC::TC("testdriver", "TestDriver no input file for thread"); + $fh = undef; + $$sequence_checking = 0; + push(@$errors, + "$file:$.: no input file for thread $thread; " . + "sequence checking abandoned\n"); + } + $threads->{$thread} = $fh; + } + my $known = defined($threads->{$thread}); + + my $seqs = ""; + if ($$sequence_checking) + { + my $fh = $threads->{$thread}; + my $next_input_line = scalar(<$fh>); + if (! defined $next_input_line) + { + $next_input_line = "[EOF]\n"; + } + $seqs = $rep->strip_seqs(\$next_input_line); + if ($next_input_line eq $rest) + { + if ($seqs ne "") + { + $rep->handle_seqs($seqs, $tag . $rest, $seqgroups); + } + } + else + { + &QTC::TC("testdriver", "TestDriver thread mismatch"); + $$sequence_checking = 0; + push(@$errors, + "$file:$.: thread $thread mismatch; " . + "sequencing checking abandoned\n" . + "actual $rest" . + "expected $next_input_line"); + } + } + output_line("$tempdir/$thread.thread-actual", $rest); + if (! $known) + { + &QTC::TC("testdriver", "TestDriver output from unknown thread"); + push(@$errors, "[[$thread]]:$rest"); + } +} + +sub strip_seqs +{ + my $rep = shift; + my $linep = shift; + my $seqs = ""; + if ($$linep =~ s/^\(\(.*?\)\)//) + { + $seqs = $&; + } + $seqs; +} + +sub handle_seqs +{ + my $rep = shift; + my ($seqs, $line, $seqgroups) = @_; + my $tempdir = $rep->_tempdir(); + $seqs =~ s/^\(\((.*?)\)\)/$1/; + foreach my $seq (split(',', $seqs)) + { + $seqgroups->{$seq} = 1; + output_line("$tempdir/$seq.seq-actual", $line); + } +} + +sub filter_seqgroups +{ + my ($infile, $outfile) = @_; + open(F, "<$infile") or + die +__PACKAGE__, ": can't open $infile: $!\n"; + binmode F; + open(O, ">$outfile") or + die +__PACKAGE__, ": can't create $outfile: $!\n"; + binmode O; + while () + { + s/^((?:\[\[.+?\]\]:)?)\(\(.+?\)\)/$1/; + print O; + } + close(O); + close(F); +} + +sub output_line +{ + my ($file, $line) = @_; + open(O, ">>$file") or die +__PACKAGE__, ": can't open $file: $!\n"; + print O $line or die +__PACKAGE__, ": can't append to $file: $!\n"; + close(O) or die +__PACKAGE__, ": close $file failed: $!\n"; +} + +sub create_if_missing +{ + my ($file, $line) = @_; + if (! -e $file) + { + open(O, ">$file") or die +__PACKAGE__, ": can't create $file: $!\n"; + print O $line; + close(O); + } +} + +sub split_combined +{ + my $rep = shift; + my $combined = shift; + my $tempdir = $rep->_tempdir(); + + open(C, "<$combined") or die +__PACKAGE__, ": can't open $combined: $!\n"; + my %files = (); + my $last_thread_fh = undef; + while () + { + my $thread_fh = $last_thread_fh; + my $thread_out = undef; + if (m/^(\[\[(.+?)\]\]:)(\(\((.+?)\)\))?(.*\n?)$/) + { + my $thread_full = $1; + my $thread = $2; + my $seq_full = $3; + my $seq = $4; + my $rest = $5; + my $seq_out = undef; + $thread_out = $rest; + + my @seq_files = (); + my $thread_file = "$tempdir/$thread.thread-expected"; + if (defined $seq_full) + { + $thread_out = $seq_full . $thread_out; + $seq_out = $thread_full . $rest; + foreach my $s (split(/,/, $seq)) + { + my $f = "$tempdir/$s.seq-expected"; + my $fh = cache_open(\%files, $f); + $fh->print($seq_out); + } + } + + $thread_fh = cache_open(\%files, $thread_file); + } + else + { + $thread_out = $_; + } + if ((defined $thread_out) && (! defined $thread_fh)) + { + die +__PACKAGE__, ": no place to put output lines\n"; + } + $thread_fh->print($thread_out) if defined $thread_out; + $last_thread_fh = $thread_fh; + } + close(C); + map { $_->close() } (values %files); +} + +sub cache_open +{ + my ($cache, $file) = @_; + if (! defined $file) + { + return undef; + } + if (! exists $cache->{$file}) + { + unlink $file; + my $fh = new IO::File(">$file") or + die +__PACKAGE__, ": can't open $file: $!\n"; + $cache->{$file} = $fh; + } + $cache->{$file}; +} + +sub thread_cleanup +{ + my $rep = shift; + my $dir = $rep->_tempdir(); + my @files = +(grep { m/\.(thread|seq)-(actual|expected|filtered)$/ } + (glob("$dir/*"))); + if (@files) + { + unlink @files; + } +} + +sub rmrf +{ + my $path = shift; + return unless -e $path; + my $wanted = sub + { + if ((-d $_) && (! -l $_)) + { + rmdir $_ or die "rmdir $_ failed: $!\n"; + } + else + { + unlink $_ or die "unlink $_ failed: $!\n"; + } + }; + finddepth({wanted => $wanted, no_chdir => 1}, $path); +} + +sub safe_pipe +{ + my ($cmd, $outfile) = @_; + my $pid = open(C, "-|"); + my $result = 0; + + if ($pid) + { + # parent + my $out = new IO::File(">$outfile") or + die +__PACKAGE__, ": can't open $outfile: $!\n"; + binmode C; + while () + { + $out->print($_); + } + close(C); + $result = $?; + $out->close(); + } + else + { + # child + open(STDERR, ">&STDOUT"); + exec(@$cmd) || die +__PACKAGE__, ": $cmd->[0] failed: $!\n"; + } + + $result; +} +1; + +# +# END OF TestDriver +# diff --git a/zlib-flate/Makefile b/zlib-flate/Makefile new file mode 100644 index 00000000..90899055 --- /dev/null +++ b/zlib-flate/Makefile @@ -0,0 +1 @@ +include ../make/proxy.mk diff --git a/zlib-flate/build.mk b/zlib-flate/build.mk new file mode 100644 index 00000000..57d2c98c --- /dev/null +++ b/zlib-flate/build.mk @@ -0,0 +1,22 @@ +TARGETS_zlib-flate = \ + zlib-flate/$(OUTPUT_DIR)/zlib-flate + +$(TARGETS_zlib-flate): $(TARGETS_libqpdf) + +INCLUDES_zlib-flate = include + +SRCS_zlib-flate = zlib-flate/zlib-flate.cc + +# ----- + +OBJS_zlib-flate = $(call src_to_obj,$(SRCS_zlib-flate)) + +ifeq ($(GENDEPS),1) +-include $(call obj_to_dep,$(OBJS_zlib-flate)) +endif + +$(OBJS_zlib-flate): zlib-flate/$(OUTPUT_DIR)/%.o: zlib-flate/%.cc + $(call compile,$<,$(INCLUDES_zlib-flate)) + +zlib-flate/$(OUTPUT_DIR)/zlib-flate: $(OBJS_zlib-flate) + $(call makebin,$(OBJS_zlib-flate),$@) diff --git a/zlib-flate/qtest/1.compressed b/zlib-flate/qtest/1.compressed new file mode 100644 index 0000000000000000000000000000000000000000..3d05ab1c703911c5bdf311ef40c2f7a27f7d326f GIT binary patch literal 193 zcmV;y06zbCoF$Jja>OtQMSGv(cWIoxMJ8pMy#OoWmDaM@2o#NPA8a=a%;&!kKQ%D= zTPg^aH-;r{jFSI2df%AwD`V&lxF_BbbF3fc`pS4q%kjz6)g`VwvkfA2++T`i0#@qA{(D-4<{xeruntest("compress", + {$td->COMMAND => "zlib-flate -compress < 1.uncompressed"}, + {$td->FILE => "1.compressed", + $td->EXIT_STATUS => 0}); + +$td->runtest("uncompress", + {$td->COMMAND => "zlib-flate -uncompress < 1.compressed"}, + {$td->FILE => "1.uncompressed", + $td->EXIT_STATUS => 0}); + +$td->runtest("error", + {$td->COMMAND => "zlib-flate -uncompress < 1.uncompressed"}, + {$td->REGEXP => "flate: inflate: data: .*\n", + $td->EXIT_STATUS => 2}, + $td->NORMALIZE_NEWLINES); + +$td->report(3); diff --git a/zlib-flate/zlib-flate.cc b/zlib-flate/zlib-flate.cc new file mode 100644 index 00000000..33a3cdd9 --- /dev/null +++ b/zlib-flate/zlib-flate.cc @@ -0,0 +1,92 @@ + +#include +#include + +#include +#include +#include +#include +#include + +static char const* whoami = 0; + +void usage() +{ + std::cerr << "Usage: " << whoami << " { -uncompress | -compress }" + << std::endl; + exit(2); +} + +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)) + { + std::cout << whoami << " version 1.0" << std::endl; + exit(0); + } + + if (argc != 2) + { + usage(); + } + + Pl_Flate::action_e action = Pl_Flate::a_inflate; + + if ((strcmp(argv[1], "-uncompress") == 0)) + { + // okay + } + else if ((strcmp(argv[1], "-compress") == 0)) + { + action = Pl_Flate::a_deflate; + } + else + { + usage(); + } + + Pl_StdioFile* out = new Pl_StdioFile("stdout", stdout); + Pl_Flate* flate = new Pl_Flate("flate", out, action); + + try + { + unsigned char buf[10000]; + bool done = false; + while (! done) + { + int len = read(0, buf, sizeof(buf)); + if (len <= 0) + { + done = true; + } + else + { + flate->write(buf, len); + } + } + flate->finish(); + delete flate; + delete out; + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + exit(2); + } + + return 0; +}