Honor flags when flattening annotations

This commit is contained in:
Jay Berkenbilt 2019-01-03 11:51:58 -05:00
parent 06d6438ddf
commit ca94ac68d9
13 changed files with 5049 additions and 362 deletions

View File

@ -6,6 +6,9 @@
2018-12-31 Jay Berkenbilt <ejb@ql.org>
* Add --flatten-annotations flag to the qpdf command-line tool for
annotation flattening.
* Add methods for flattening form fields and annotations:
- QPDFPageDocumentHelper::flattenAnnotations - integrate
annotation appearance streams into page contents with special

View File

@ -89,4 +89,53 @@ enum qpdf_r3_modify_e /* Allowed changes: */
qpdf_r3m_none /* no modifications */
};
/* Form field flags from the PDF spec */
enum pdf_form_field_flag_e
{
/* flags that apply to all form fields */
ff_all_read_only = 1 << 0,
ff_all_required = 1 << 1,
ff_all_no_export = 1 << 2,
/* flags that apply to fields of type /Btn (button) */
ff_btn_no_toggle_off = 1 << 14,
ff_btn_radio = 1 << 15,
ff_btn_pushbutton = 1 << 16,
ff_btn_radios_in_unison = 1 << 17,
/* flags that apply to fields of type /Tx (text) */
ff_tx_multiline = 1 << 12,
ff_tx_password = 1 << 13,
ff_tx_file_select = 1 << 20,
ff_tx_do_not_spell_check = 1 << 22,
ff_tx_do_not_scroll = 1 << 23,
ff_tx_comb = 1 << 24,
ff_tx_rich_text = 1 << 25,
/* flags that apply to fields of type /Ch (choice) */
ff_ch_combo = 1 << 17,
ff_ch_edit = 1 << 18,
ff_ch_sort = 1 << 19,
ff_ch_multi_select = 1 << 21,
ff_ch_do_not_spell_check = 1 << 22,
ff_ch_commit_on_sel_change = 1 << 26
};
/* Annotation flags from the PDF spec */
enum pdf_annotation_flag_e
{
an_invisible = 1 << 0,
an_hidden = 1 << 1,
an_print = 1 << 2,
an_no_zoom = 1 << 3,
an_no_rotate = 1 << 4,
an_no_view = 1 << 5,
an_read_only = 1 << 6,
an_locked = 1 << 7,
an_toggle_no_view = 1 << 8,
an_locked_contents = 1 << 9
};
#endif /* QPDFCONSTANTS_H */

View File

@ -23,6 +23,7 @@
#define QPDFANNOTATIONOBJECTHELPER_HH
#include <qpdf/QPDFObjectHelper.hh>
#include <qpdf/Constants.h>
#include <qpdf/DLL.h>
@ -76,10 +77,20 @@ class QPDFAnnotationObjectHelper: public QPDFObjectHelper
// content stream that draws this annotation's appearance stream
// as a form XObject. The value "name" is the resource name that
// will be used to refer to the form xobject. The value "rotate"
// should be set to the page's /Rotate value or 0 if none.
// should be set to the page's /Rotate value or 0 if none. The
// values of required_flags and forbidden_flags are constructed by
// logically "or"ing annotation flags of type
// pdf_annotation_flag_e defined in qpdf/Constants.h. Content will
// be returned only if all required_flags are set and no
// forbidden_flags are set. For example, including an_no_view in
// forbidden_flags could be useful for creating an on-screen view,
// and including an_print to required_flags could be useful if
// preparing to print.
QPDF_DLL
std::string getPageContentForAppearance(
std::string const& name, int rotate);
std::string const& name, int rotate,
int required_flags = 0,
int forbidden_flags = an_invisible | an_hidden);
private:
class Members

View File

@ -24,6 +24,7 @@
#include <qpdf/QPDFDocumentHelper.hh>
#include <qpdf/QPDFPageObjectHelper.hh>
#include <qpdf/Constants.h>
#include <qpdf/DLL.h>
@ -92,14 +93,23 @@ class QPDFPageDocumentHelper: public QPDFDocumentHelper
// the annotation from the page. Handles widget annotations
// associated with interactive form fields as a special case,
// including removing the /AcroForm key from the document catalog.
// The values passed to required_flags and forbidden_flags are
// passed along to
// QPDFAnnotationObjectHelper::getPageContentForAppearance. See
// comments there in QPDFAnnotationObjectHelper.hh for meanings of
// those flags.
QPDF_DLL
void flattenAnnotations();
void flattenAnnotations(
int required_flags = 0,
int forbidden_flags = an_invisible | an_hidden);
private:
void flattenAnnotationsForPage(
QPDFPageObjectHelper& page,
QPDFObjectHandle& resources,
QPDFAcroFormDocumentHelper& afdh);
QPDFAcroFormDocumentHelper& afdh,
int required_flags,
int forbidden_flags);
class Members
{

View File

@ -81,7 +81,8 @@ QPDFAnnotationObjectHelper::getAppearanceStream(
std::string
QPDFAnnotationObjectHelper::getPageContentForAppearance(
std::string const& name, int rotate)
std::string const& name, int rotate,
int required_flags, int forbidden_flags)
{
if (! getAppearanceStream("/N").isStream())
{
@ -168,11 +169,24 @@ QPDFAnnotationObjectHelper::getPageContentForAppearance(
// appearance matrix.
QPDFObjectHandle rect_obj = this->oh.getKey("/Rect");
QPDFObjectHandle flags = this->oh.getKey("/F");
QPDFObjectHandle flags_obj = this->oh.getKey("/F");
QPDFObjectHandle as = getAppearanceStream("/N").getDict();
QPDFObjectHandle bbox_obj = as.getKey("/BBox");
QPDFObjectHandle matrix_obj = as.getKey("/Matrix");
int flags = flags_obj.isInteger() ? flags_obj.getIntValue() : 0;
if (flags & forbidden_flags)
{
QTC::TC("qpdf", "QPDFAnnotationObjectHelper forbidden flags");
return "";
}
if ((flags & required_flags) != required_flags)
{
QTC::TC("qpdf", "QPDFAnnotationObjectHelper missing required flags");
return "";
}
if (! (bbox_obj.isRectangle() && rect_obj.isRectangle()))
{
return "";
@ -188,8 +202,7 @@ QPDFAnnotationObjectHelper::getPageContentForAppearance(
QTC::TC("qpdf", "QPDFAnnotationObjectHelper default matrix");
}
QPDFObjectHandle::Rectangle rect = rect_obj.getArrayAsRectangle();
bool do_rotate = (rotate && flags.isInteger() &&
(flags.getIntValue() & 16));
bool do_rotate = (rotate && (flags & an_no_rotate));
if (do_rotate)
{
// If the the annotation flags include the NoRotate bit and

View File

@ -68,7 +68,9 @@ QPDFPageDocumentHelper::removePage(QPDFPageObjectHelper page)
void
QPDFPageDocumentHelper::flattenAnnotations()
QPDFPageDocumentHelper::flattenAnnotations(
int required_flags,
int forbidden_flags)
{
QPDFAcroFormDocumentHelper afdh(this->qpdf);
if (afdh.getNeedAppearances())
@ -97,7 +99,8 @@ QPDFPageDocumentHelper::flattenAnnotations()
// test suite
resources = QPDFObjectHandle::newDictionary();
}
flattenAnnotationsForPage(ph, resources, afdh);
flattenAnnotationsForPage(ph, resources, afdh,
required_flags, forbidden_flags);
}
if (! afdh.getNeedAppearances())
{
@ -109,7 +112,9 @@ void
QPDFPageDocumentHelper::flattenAnnotationsForPage(
QPDFPageObjectHelper& page,
QPDFObjectHandle& resources,
QPDFAcroFormDocumentHelper& afdh)
QPDFAcroFormDocumentHelper& afdh,
int required_flags,
int forbidden_flags)
{
bool need_appearances = afdh.getNeedAppearances();
std::vector<QPDFAnnotationObjectHelper> annots = page.getAnnotations();
@ -168,12 +173,12 @@ QPDFPageDocumentHelper::flattenAnnotationsForPage(
while (next_fx <= max_fx)
{
std::string candidate = "/Fxo" + QUtil::int_to_string(next_fx);
++next_fx;
if (names.count(candidate) == 0)
{
name = candidate;
break;
}
++next_fx;
}
if (name.empty())
{
@ -182,11 +187,18 @@ QPDFPageDocumentHelper::flattenAnnotationsForPage(
// number of keys we're checking against.
name = "/FxConflict";
}
resources.mergeResources(
QPDFObjectHandle::parse(
"<< /XObject << " + name + " null >> >>"));
resources.getKey("/XObject").replaceKey(name, as);
new_content += aoh.getPageContentForAppearance(name, rotate);
std::string content = aoh.getPageContentForAppearance(
name, rotate, required_flags, forbidden_flags);
if (! content.empty())
{
resources.mergeResources(
QPDFObjectHandle::parse(
"<< /XObject << " + name + " null >> >>"));
resources.getKey("/XObject").replaceKey(name, as);
names.insert(name);
++next_fx;
}
new_content += content;
}
else
{

View File

@ -103,6 +103,8 @@ struct Options
newline_before_endstream(false),
coalesce_contents(false),
flatten_annotations(false),
flatten_annotations_required(0),
flatten_annotations_forbidden(an_invisible | an_hidden),
show_npages(false),
deterministic_id(false),
static_id(false),
@ -176,6 +178,8 @@ struct Options
std::string linearize_pass1;
bool coalesce_contents;
bool flatten_annotations;
int flatten_annotations_required;
int flatten_annotations_forbidden;
std::string min_version;
std::string force_version;
bool show_npages;
@ -475,7 +479,7 @@ class ArgParser
void argNewlineBeforeEndstream();
void argLinearizePass1(char* parameter);
void argCoalesceContents();
void argFlattenAnnotations();
void argFlattenAnnotations(char* parameter);
void argMinVersion(char* parameter);
void argForceVersion(char* parameter);
void argSplitPages(char* parameter);
@ -644,22 +648,23 @@ ArgParser::initOptionTable()
(*t)["pages"] = oe_bare(&ArgParser::argPages);
(*t)["rotate"] = oe_requiredParameter(
&ArgParser::argRotate, "[+|-]angle:page-range");
char const* streamDataChoices[] =
char const* stream_data_choices[] =
{"compress", "preserve", "uncompress", 0};
(*t)["stream-data"] = oe_requiredChoices(
&ArgParser::argStreamData, streamDataChoices);
&ArgParser::argStreamData, stream_data_choices);
(*t)["compress-streams"] = oe_requiredChoices(
&ArgParser::argCompressStreams, yn);
char const* decodeLevelChoices[] =
char const* decode_level_choices[] =
{"none", "generalized", "specialized", "all", 0};
(*t)["decode-level"] = oe_requiredChoices(
&ArgParser::argDecodeLevel, decodeLevelChoices);
&ArgParser::argDecodeLevel, decode_level_choices);
(*t)["normalize-content"] = oe_requiredChoices(
&ArgParser::argNormalizeContent, yn);
(*t)["suppress-recovery"] = oe_bare(&ArgParser::argSuppressRecovery);
char const* objectStreamsChoices[] = {"disable", "preserve", "generate", 0};
char const* object_streams_choices[] = {
"disable", "preserve", "generate", 0};
(*t)["object-streams"] = oe_requiredChoices(
&ArgParser::argObjectStreams, objectStreamsChoices);
&ArgParser::argObjectStreams, object_streams_choices);
(*t)["ignore-xref-streams"] = oe_bare(&ArgParser::argIgnoreXrefStreams);
(*t)["qdf"] = oe_bare(&ArgParser::argQdf);
(*t)["preserve-unreferenced"] = oe_bare(
@ -673,7 +678,9 @@ ArgParser::initOptionTable()
(*t)["linearize-pass1"] = oe_requiredParameter(
&ArgParser::argLinearizePass1, "filename");
(*t)["coalesce-contents"] = oe_bare(&ArgParser::argCoalesceContents);
(*t)["flatten-annotations"] = oe_bare(&ArgParser::argFlattenAnnotations);
char const* flatten_choices[] = {"all", "print", "screen", 0};
(*t)["flatten-annotations"] = oe_requiredChoices(
&ArgParser::argFlattenAnnotations, flatten_choices);
(*t)["min-version"] = oe_requiredParameter(
&ArgParser::argMinVersion, "version");
(*t)["force-version"] = oe_requiredParameter(
@ -702,10 +709,10 @@ ArgParser::initOptionTable()
(*t)["json"] = oe_bare(&ArgParser::argJson);
// The list of selectable top-level keys id duplicated in three
// places: json_schema, do_json, and initOptionTable.
char const* jsonKeyChoices[] = {
char const* json_key_choices[] = {
"objects", "pages", "pagelabels", "outlines", 0};
(*t)["json-key"] = oe_requiredChoices(
&ArgParser::argJsonKey, jsonKeyChoices);
&ArgParser::argJsonKey, json_key_choices);
(*t)["json-object"] = oe_requiredParameter(
&ArgParser::argJsonObject, "trailer|obj[,gen]");
(*t)["check"] = oe_bare(&ArgParser::argCheck);
@ -722,13 +729,13 @@ ArgParser::initOptionTable()
(*t)["accessibility"] = oe_requiredChoices(
&ArgParser::arg128Accessibility, yn);
(*t)["extract"] = oe_requiredChoices(&ArgParser::arg128Extract, yn);
char const* print128Choices[] = {"full", "low", "none", 0};
char const* print128_choices[] = {"full", "low", "none", 0};
(*t)["print"] = oe_requiredChoices(
&ArgParser::arg128Print, print128Choices);
char const* modify128Choices[] =
&ArgParser::arg128Print, print128_choices);
char const* modify128_choices[] =
{"all", "annotate", "form", "assembly", "none", 0};
(*t)["modify"] = oe_requiredChoices(
&ArgParser::arg128Modify, modify128Choices);
&ArgParser::arg128Modify, modify128_choices);
(*t)["cleartext-metadata"] = oe_bare(&ArgParser::arg128ClearTextMetadata);
// The above 128-bit options are also 256-bit options, so copy
// what we have so far. Then continue separately with 128 and 256.
@ -1123,9 +1130,17 @@ ArgParser::argCoalesceContents()
}
void
ArgParser::argFlattenAnnotations()
ArgParser::argFlattenAnnotations(char* parameter)
{
o.flatten_annotations = true;
if (strcmp(parameter, "screen") == 0)
{
o.flatten_annotations_forbidden |= an_no_view;
}
else if (strcmp(parameter, "print") == 0)
{
o.flatten_annotations_required |= an_print;
}
}
void
@ -1769,7 +1784,8 @@ familiar with the PDF file format or who are PDF developers.\n\
preserve unreferenced page resources\n\
--newline-before-endstream always put a newline before endstream\n\
--coalesce-contents force all pages' content to be a single stream\n\
--flatten-annotations incorporate rendering of annotations into page\n\
--flatten-annotations=option\n\
incorporate rendering of annotations into page\n\
contents including those for interactive form\n\
fields\n\
--qdf turns on \"QDF mode\" (below)\n\
@ -1778,6 +1794,12 @@ familiar with the PDF file format or who are PDF developers.\n\
--min-version=version sets the minimum PDF version of the output file\n\
--force-version=version forces this to be the PDF version of the output file\n\
\n\
Options for --flatten-annotations are all, print, or screen. If the\n\
option is print, only annotations marked as print are included. If the\n\
option is screen, options marked as \"no view\" are excluded.\n\
Otherwise, annotations are flattened regardless of the presence of\n\
print or NoView flags.\n\
\n\
Version numbers may be expressed as major.minor.extension-level, so 1.7.3\n\
means PDF version 1.7 at extension level 3.\n\
\n\
@ -3139,7 +3161,8 @@ static void handle_transformations(QPDF& pdf, Options& o)
QPDFPageDocumentHelper dh(pdf);
if (o.flatten_annotations)
{
dh.flattenAnnotations();
dh.flattenAnnotations(o.flatten_annotations_required,
o.flatten_annotations_forbidden);
}
if (o.coalesce_contents)
{

View File

@ -388,3 +388,5 @@ QPDFPageDocumentHelper replace indirect annots 0
QPDFPageDocumentHelper replace direct annots 0
QPDFObjectHandle replace with copy 0
QPDFPageDocumentHelper indirect as resources 0
QPDFAnnotationObjectHelper forbidden flags 0
QPDFAnnotationObjectHelper missing required flags 0

View File

@ -1461,7 +1461,7 @@ $td->notify("--- Flatten Form/Annotations ---");
# - page 4: non-trivial matrix, rotate
# - page 5: rotate 180 with /F 20
# - page 6: rotate 90, /F 20, non-trivial matrix
# - page 7: normal -- available for additional testing
# - page 7: flags: top is print, middle is screen, bottom is hidden
# - page 8: rotate 270 with /F 20
# - page 9: normal -- available for additional testing
#
@ -1493,7 +1493,7 @@ foreach my $f (@annotation_files)
$td->runtest("flatten $f",
{$td->COMMAND =>
"qpdf --qdf --static-id --no-original-object-ids" .
" --flatten-annotations $f.pdf a.pdf"},
" --flatten-annotations=all $f.pdf a.pdf"},
$exp_out,
$td->NORMALIZE_NEWLINES);
$td->runtest("check output",
@ -1501,6 +1501,20 @@ foreach my $f (@annotation_files)
{$td->FILE => "$f-out.pdf"});
}
$n_tests += 4;
foreach my $f (qw(screen print))
{
$td->runtest("flatten for $f",
{$td->COMMAND =>
"qpdf --qdf --static-id --no-original-object-ids" .
" --flatten-annotations=$f manual-appearances.pdf a.pdf"},
{$td->STRING => "", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
$td->runtest("check output",
{$td->FILE => "a.pdf"},
{$td->FILE => "manual-appearances-$f-out.pdf"});
}
show_ntests();
# ----------
$td->notify("--- Merging and Splitting ---");

View File

@ -506,7 +506,6 @@ endobj
/XObject <<
/Fxo1 101 0 R
/Fxo2 103 0 R
/Fxo3 105 0 R
>>
>>
/StructParents 0
@ -518,9 +517,9 @@ endobj
25 0 obj
<<
/Contents [
105 0 R
107 0 R
109 0 R
111 0 R
]
/Group <<
/CS /DeviceRGB
@ -535,15 +534,15 @@ endobj
]
/Parent 4 0 R
/Resources <<
/Font 113 0 R
/Font 111 0 R
/ProcSet [
/PDF
/Text
]
/XObject <<
/Fxo1 114 0 R
/Fxo2 116 0 R
/Fxo3 118 0 R
/Fxo1 112 0 R
/Fxo2 114 0 R
/Fxo3 116 0 R
>>
>>
/Rotate 270
@ -556,9 +555,9 @@ endobj
26 0 obj
<<
/Contents [
118 0 R
120 0 R
122 0 R
124 0 R
]
/Group <<
/CS /DeviceRGB
@ -573,15 +572,15 @@ endobj
]
/Parent 4 0 R
/Resources <<
/Font 126 0 R
/Font 124 0 R
/ProcSet [
/PDF
/Text
]
/XObject <<
/Fxo1 127 0 R
/Fxo2 129 0 R
/Fxo3 131 0 R
/Fxo1 125 0 R
/Fxo2 127 0 R
/Fxo3 129 0 R
>>
>>
/StructParents 0
@ -592,10 +591,10 @@ endobj
27 0 obj
<<
/K [
131 0 R
132 0 R
133 0 R
134 0 R
135 0 R
136 0 R
]
/P 5 0 R
/Pg 3 0 R
@ -609,9 +608,9 @@ endobj
/Nums [
0
[
132 0 R
133 0 R
134 0 R
135 0 R
136 0 R
]
]
>>
@ -1672,15 +1671,11 @@ q
1.00002 0.00000 0.00000 0.99996 129.84900 542.75100 cm
/Fxo2 Do
Q
q
1.00003 0.00000 0.00000 0.99998 294.14900 430.25100 cm
/Fxo3 Do
Q
endstream
endobj
99 0 obj
207
139
endobj
100 0 obj
@ -1766,39 +1761,18 @@ endobj
113
endobj
%% Contents for page 8
105 0 obj
<<
/BBox [
0
0
72.8
98
]
/Resources <<
/Font <<
>>
/ProcSet [
/PDF
/Text
]
>>
/Subtype /Form
/Type /XObject
/Length 106 0 R
>>
stream
q
0 0 1 RG
5 w
0 0 72.8 98 re s
1 0 0 RG
5 5 15 15 re s
Q
endstream
endobj
106 0 obj
58
2
endobj
%% Contents for page 8
@ -1807,20 +1781,6 @@ endobj
/Length 108 0 R
>>
stream
q
endstream
endobj
108 0 obj
2
endobj
%% Contents for page 8
109 0 obj
<<
/Length 110 0 R
>>
stream
0.1 w
/Artifact BMC
q 0 0.028 611.971 791.971 re
@ -1842,14 +1802,14 @@ endstream
endobj
%QDF: ignore_newline
110 0 obj
108 0 obj
240
endobj
%% Contents for page 8
111 0 obj
109 0 obj
<<
/Length 112 0 R
/Length 110 0 R
>>
stream
@ -1869,16 +1829,16 @@ Q
endstream
endobj
112 0 obj
110 0 obj
208
endobj
113 0 obj
111 0 obj
<<
>>
endobj
114 0 obj
112 0 obj
<<
/BBox [
0
@ -1896,7 +1856,7 @@ endobj
>>
/Subtype /Form
/Type /XObject
/Length 115 0 R
/Length 113 0 R
>>
stream
q
@ -1909,11 +1869,11 @@ Q
endstream
endobj
115 0 obj
113 0 obj
61
endobj
116 0 obj
114 0 obj
<<
/BBox [
0
@ -1931,7 +1891,7 @@ endobj
>>
/Subtype /Form
/Type /XObject
/Length 117 0 R
/Length 115 0 R
>>
stream
q
@ -1951,11 +1911,11 @@ Q
endstream
endobj
117 0 obj
115 0 obj
113
endobj
118 0 obj
116 0 obj
<<
/BBox [
0
@ -1973,7 +1933,7 @@ endobj
>>
/Subtype /Form
/Type /XObject
/Length 119 0 R
/Length 117 0 R
>>
stream
q
@ -1986,28 +1946,28 @@ Q
endstream
endobj
119 0 obj
117 0 obj
58
endobj
%% Contents for page 9
120 0 obj
118 0 obj
<<
/Length 121 0 R
/Length 119 0 R
>>
stream
q
endstream
endobj
121 0 obj
119 0 obj
2
endobj
%% Contents for page 9
122 0 obj
120 0 obj
<<
/Length 123 0 R
/Length 121 0 R
>>
stream
0.1 w
@ -2031,14 +1991,14 @@ endstream
endobj
%QDF: ignore_newline
123 0 obj
121 0 obj
240
endobj
%% Contents for page 9
124 0 obj
122 0 obj
<<
/Length 125 0 R
/Length 123 0 R
>>
stream
@ -2058,16 +2018,16 @@ Q
endstream
endobj
125 0 obj
123 0 obj
207
endobj
126 0 obj
124 0 obj
<<
>>
endobj
127 0 obj
125 0 obj
<<
/BBox [
0
@ -2085,7 +2045,7 @@ endobj
>>
/Subtype /Form
/Type /XObject
/Length 128 0 R
/Length 126 0 R
>>
stream
q
@ -2098,11 +2058,11 @@ Q
endstream
endobj
128 0 obj
126 0 obj
61
endobj
129 0 obj
127 0 obj
<<
/BBox [
0
@ -2120,7 +2080,7 @@ endobj
>>
/Subtype /Form
/Type /XObject
/Length 130 0 R
/Length 128 0 R
>>
stream
q
@ -2140,11 +2100,11 @@ Q
endstream
endobj
130 0 obj
128 0 obj
113
endobj
131 0 obj
129 0 obj
<<
/BBox [
0
@ -2162,7 +2122,7 @@ endobj
>>
/Subtype /Form
/Type /XObject
/Length 132 0 R
/Length 130 0 R
>>
stream
q
@ -2175,13 +2135,13 @@ Q
endstream
endobj
132 0 obj
130 0 obj
58
endobj
133 0 obj
131 0 obj
<<
/A 137 0 R
/A 135 0 R
/P 27 0 R
/Pg 3 0 R
/S /Standard
@ -2189,7 +2149,7 @@ endobj
>>
endobj
134 0 obj
132 0 obj
<<
/K [
0
@ -2201,7 +2161,7 @@ endobj
>>
endobj
135 0 obj
133 0 obj
<<
/K [
1
@ -2213,7 +2173,7 @@ endobj
>>
endobj
136 0 obj
134 0 obj
<<
/K [
2
@ -2225,7 +2185,7 @@ endobj
>>
endobj
137 0 obj
135 0 obj
<<
/O /Layout
/Placement /Block
@ -2233,7 +2193,7 @@ endobj
endobj
xref
0 138
0 136
0000000000 65535 f
0000000025 00000 n
0000000219 00000 n
@ -2259,126 +2219,124 @@ xref
0000004132 00000 n
0000004556 00000 n
0000004979 00000 n
0000005393 00000 n
0000005824 00000 n
0000006231 00000 n
0000006371 00000 n
0000006491 00000 n
0000006550 00000 n
0000006592 00000 n
0000006911 00000 n
0000006955 00000 n
0000007220 00000 n
0000007241 00000 n
0000007264 00000 n
0000005373 00000 n
0000005804 00000 n
0000006211 00000 n
0000006351 00000 n
0000006471 00000 n
0000006530 00000 n
0000006572 00000 n
0000006891 00000 n
0000006935 00000 n
0000007200 00000 n
0000007221 00000 n
0000007244 00000 n
0000007526 00000 n
0000007546 00000 n
0000007566 00000 n
0000007899 00000 n
0000007920 00000 n
0000008196 00000 n
0000008239 00000 n
0000008298 00000 n
0000008340 00000 n
0000008659 00000 n
0000008703 00000 n
0000008967 00000 n
0000008988 00000 n
0000009011 00000 n
0000007879 00000 n
0000007900 00000 n
0000008176 00000 n
0000008219 00000 n
0000008278 00000 n
0000008320 00000 n
0000008639 00000 n
0000008683 00000 n
0000008947 00000 n
0000008968 00000 n
0000008991 00000 n
0000009334 00000 n
0000009354 00000 n
0000009374 00000 n
0000009765 00000 n
0000009786 00000 n
0000010062 00000 n
0000010105 00000 n
0000010164 00000 n
0000010206 00000 n
0000010525 00000 n
0000010569 00000 n
0000010833 00000 n
0000010854 00000 n
0000010877 00000 n
0000009745 00000 n
0000009766 00000 n
0000010042 00000 n
0000010085 00000 n
0000010144 00000 n
0000010186 00000 n
0000010505 00000 n
0000010549 00000 n
0000010813 00000 n
0000010834 00000 n
0000010857 00000 n
0000011205 00000 n
0000011225 00000 n
0000011245 00000 n
0000011636 00000 n
0000011657 00000 n
0000011933 00000 n
0000011976 00000 n
0000012035 00000 n
0000012077 00000 n
0000012396 00000 n
0000012440 00000 n
0000012706 00000 n
0000012727 00000 n
0000012750 00000 n
0000011616 00000 n
0000011637 00000 n
0000011913 00000 n
0000011956 00000 n
0000012015 00000 n
0000012057 00000 n
0000012376 00000 n
0000012420 00000 n
0000012686 00000 n
0000012707 00000 n
0000012730 00000 n
0000013012 00000 n
0000013032 00000 n
0000013052 00000 n
0000013385 00000 n
0000013406 00000 n
0000013682 00000 n
0000013725 00000 n
0000013784 00000 n
0000013826 00000 n
0000014145 00000 n
0000014189 00000 n
0000014456 00000 n
0000014477 00000 n
0000014500 00000 n
0000013365 00000 n
0000013386 00000 n
0000013662 00000 n
0000013705 00000 n
0000013764 00000 n
0000013806 00000 n
0000014125 00000 n
0000014169 00000 n
0000014436 00000 n
0000014457 00000 n
0000014480 00000 n
0000014823 00000 n
0000014843 00000 n
0000014863 00000 n
0000015259 00000 n
0000015280 00000 n
0000015556 00000 n
0000015599 00000 n
0000015658 00000 n
0000015700 00000 n
0000016019 00000 n
0000016063 00000 n
0000016327 00000 n
0000016348 00000 n
0000016372 00000 n
0000016661 00000 n
0000016682 00000 n
0000017017 00000 n
0000017039 00000 n
0000017317 00000 n
0000017361 00000 n
0000017422 00000 n
0000017465 00000 n
0000017786 00000 n
0000017831 00000 n
0000018098 00000 n
0000018120 00000 n
0000018144 00000 n
0000018428 00000 n
0000018449 00000 n
0000018784 00000 n
0000018806 00000 n
0000019084 00000 n
0000019128 00000 n
0000019189 00000 n
0000019232 00000 n
0000019553 00000 n
0000019598 00000 n
0000019864 00000 n
0000019886 00000 n
0000019910 00000 n
0000020194 00000 n
0000020215 00000 n
0000020550 00000 n
0000020572 00000 n
0000020850 00000 n
0000020871 00000 n
0000020967 00000 n
0000021063 00000 n
0000021159 00000 n
0000021255 00000 n
0000015239 00000 n
0000015260 00000 n
0000015536 00000 n
0000015579 00000 n
0000015638 00000 n
0000015680 00000 n
0000015999 00000 n
0000016043 00000 n
0000016239 00000 n
0000016260 00000 n
0000016284 00000 n
0000016573 00000 n
0000016594 00000 n
0000016929 00000 n
0000016974 00000 n
0000017035 00000 n
0000017078 00000 n
0000017399 00000 n
0000017444 00000 n
0000017711 00000 n
0000017733 00000 n
0000017757 00000 n
0000018041 00000 n
0000018062 00000 n
0000018397 00000 n
0000018419 00000 n
0000018697 00000 n
0000018741 00000 n
0000018802 00000 n
0000018845 00000 n
0000019166 00000 n
0000019211 00000 n
0000019477 00000 n
0000019499 00000 n
0000019523 00000 n
0000019807 00000 n
0000019828 00000 n
0000020163 00000 n
0000020185 00000 n
0000020463 00000 n
0000020484 00000 n
0000020580 00000 n
0000020676 00000 n
0000020772 00000 n
0000020868 00000 n
trailer <<
/DocChecksum /DA785F789D02970D387C264D0A6C8CB0
/Info 2 0 R
/Root 1 0 R
/Size 138
/Size 136
/ID [<976442cb303b8d5e88a36a127de2a19f><31415926535897932384626433832795>]
>>
startxref
21312
20925
%%EOF

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -590,7 +590,7 @@ endobj
/Font 83 0 R
>>
/DV <feff>
/F 4
/F 36
/FT /Tx
/Ff 4096
/P 84 0 R
@ -618,7 +618,7 @@ endobj
/Font 83 0 R
>>
/DV <feff>
/F 4
/F 0
/FT /Tx
/Ff 4096
/P 84 0 R
@ -646,7 +646,7 @@ endobj
/Font 83 0 R
>>
/DV <feff>
/F 4
/F 2
/FT /Tx
/Ff 4096
/P 84 0 R
@ -2616,121 +2616,121 @@ xref
0000006350 00000 n
0000006685 00000 n
0000007020 00000 n
0000007354 00000 n
0000007688 00000 n
0000008022 00000 n
0000008356 00000 n
0000008690 00000 n
0000009025 00000 n
0000009360 00000 n
0000009696 00000 n
0000010042 00000 n
0000010406 00000 n
0000010597 00000 n
0000010777 00000 n
0000010828 00000 n
0000011049 00000 n
0000011097 00000 n
0000011364 00000 n
0000011413 00000 n
0000011623 00000 n
0000011671 00000 n
0000011889 00000 n
0000011937 00000 n
0000011998 00000 n
0000012375 00000 n
0000012644 00000 n
0000012693 00000 n
0000012905 00000 n
0000012953 00000 n
0000013232 00000 n
0000013280 00000 n
0000013341 00000 n
0000013708 00000 n
0000014035 00000 n
0000014084 00000 n
0000014296 00000 n
0000014344 00000 n
0000014628 00000 n
0000014676 00000 n
0000014737 00000 n
0000015117 00000 n
0000015444 00000 n
0000015493 00000 n
0000015705 00000 n
0000015753 00000 n
0000015971 00000 n
0000016019 00000 n
0000016080 00000 n
0000016461 00000 n
0000016730 00000 n
0000016779 00000 n
0000016991 00000 n
0000017039 00000 n
0000017318 00000 n
0000017366 00000 n
0000017427 00000 n
0000017807 00000 n
0000018139 00000 n
0000018188 00000 n
0000018400 00000 n
0000018448 00000 n
0000018671 00000 n
0000018719 00000 n
0000018780 00000 n
0000019147 00000 n
0000019416 00000 n
0000019465 00000 n
0000019677 00000 n
0000019725 00000 n
0000019943 00000 n
0000019991 00000 n
0000020052 00000 n
0000020433 00000 n
0000020702 00000 n
0000020751 00000 n
0000020963 00000 n
0000021011 00000 n
0000021229 00000 n
0000021277 00000 n
0000021339 00000 n
0000021708 00000 n
0000021979 00000 n
0000022030 00000 n
0000022244 00000 n
0000022317 00000 n
0000022638 00000 n
0000022689 00000 n
0000022861 00000 n
0000022988 00000 n
0000023115 00000 n
0000023436 00000 n
0000023487 00000 n
0000023614 00000 n
0000023935 00000 n
0000023986 00000 n
0000024113 00000 n
0000024434 00000 n
0000024485 00000 n
0000024612 00000 n
0000024933 00000 n
0000024984 00000 n
0000025111 00000 n
0000025432 00000 n
0000025483 00000 n
0000025610 00000 n
0000025931 00000 n
0000025982 00000 n
0000026109 00000 n
0000026430 00000 n
0000026481 00000 n
0000026608 00000 n
0000026929 00000 n
0000026980 00000 n
0000027107 00000 n
0000027234 00000 n
0000027361 00000 n
0000027488 00000 n
0000007355 00000 n
0000007689 00000 n
0000008023 00000 n
0000008357 00000 n
0000008691 00000 n
0000009026 00000 n
0000009361 00000 n
0000009697 00000 n
0000010043 00000 n
0000010407 00000 n
0000010598 00000 n
0000010778 00000 n
0000010829 00000 n
0000011050 00000 n
0000011098 00000 n
0000011365 00000 n
0000011414 00000 n
0000011624 00000 n
0000011672 00000 n
0000011890 00000 n
0000011938 00000 n
0000011999 00000 n
0000012376 00000 n
0000012645 00000 n
0000012694 00000 n
0000012906 00000 n
0000012954 00000 n
0000013233 00000 n
0000013281 00000 n
0000013342 00000 n
0000013709 00000 n
0000014036 00000 n
0000014085 00000 n
0000014297 00000 n
0000014345 00000 n
0000014629 00000 n
0000014677 00000 n
0000014738 00000 n
0000015118 00000 n
0000015445 00000 n
0000015494 00000 n
0000015706 00000 n
0000015754 00000 n
0000015972 00000 n
0000016020 00000 n
0000016081 00000 n
0000016462 00000 n
0000016731 00000 n
0000016780 00000 n
0000016992 00000 n
0000017040 00000 n
0000017319 00000 n
0000017367 00000 n
0000017428 00000 n
0000017808 00000 n
0000018140 00000 n
0000018189 00000 n
0000018401 00000 n
0000018449 00000 n
0000018672 00000 n
0000018720 00000 n
0000018781 00000 n
0000019148 00000 n
0000019417 00000 n
0000019466 00000 n
0000019678 00000 n
0000019726 00000 n
0000019944 00000 n
0000019992 00000 n
0000020053 00000 n
0000020434 00000 n
0000020703 00000 n
0000020752 00000 n
0000020964 00000 n
0000021012 00000 n
0000021230 00000 n
0000021278 00000 n
0000021340 00000 n
0000021709 00000 n
0000021980 00000 n
0000022031 00000 n
0000022245 00000 n
0000022318 00000 n
0000022639 00000 n
0000022690 00000 n
0000022862 00000 n
0000022989 00000 n
0000023116 00000 n
0000023437 00000 n
0000023488 00000 n
0000023615 00000 n
0000023936 00000 n
0000023987 00000 n
0000024114 00000 n
0000024435 00000 n
0000024486 00000 n
0000024613 00000 n
0000024934 00000 n
0000024985 00000 n
0000025112 00000 n
0000025433 00000 n
0000025484 00000 n
0000025611 00000 n
0000025932 00000 n
0000025983 00000 n
0000026110 00000 n
0000026431 00000 n
0000026482 00000 n
0000026609 00000 n
0000026930 00000 n
0000026981 00000 n
0000027108 00000 n
0000027235 00000 n
0000027362 00000 n
0000027489 00000 n
trailer <<
/DocChecksum /DA785F789D02970D387C264D0A6C8CB0
/Info 2 0 R
@ -2739,5 +2739,5 @@ trailer <<
/ID [<976442cb303b8d5e88a36a127de2a19f><1f7f023bcea1641cee1f72048a9d0676>]
>>
startxref
27545
27546
%%EOF