diff options
author | Ed Schouten <ed@FreeBSD.org> | 2009-06-03 13:29:08 +0000 |
---|---|---|
committer | Ed Schouten <ed@FreeBSD.org> | 2009-06-03 13:29:08 +0000 |
commit | 922a2097733e49b869978a264837ad60eca82891 (patch) | |
tree | 4075b1f9165f6c8d2b9a7e98b89a1348669f78fe | |
parent | ec2b103c267a06a66e926f62cd96767b280f5cf5 (diff) |
Notes
26 files changed, 1897 insertions, 52 deletions
diff --git a/docs/PCHInternals.html b/docs/PCHInternals.html index d90c446e9f29..ef1dd37b5555 100644 --- a/docs/PCHInternals.html +++ b/docs/PCHInternals.html @@ -63,9 +63,250 @@ with the <b><tt>-include-pch</tt></b> option:</p> PCH file generation serializes the build when all compilations require the PCH file to be up-to-date.</li> </ul> + +<p>Clang's precompiled headers are designed with a compact on-disk +representation, which minimizes both PCH creation time and the time +required to initially load the PCH file. The PCH file itself contains +a serialized representation of Clang's abstract syntax trees and +supporting data structures, stored using the same compressed bitstream +as <a href="http://llvm.org/docs/BitCodeFormat.html">LLVM's bitcode +file format</a>.</p> + +<p>Clang's precompiled headers are loaded "lazily" from disk. When a +PCH file is initially loaded, Clang reads only a small amount of data +from the PCH file to establish where certain important data structures +are stored. The amount of data read in this initial load is +independent of the size of the PCH file, such that a larger PCH file +does not lead to longer PCH load times. The actual header data in the +PCH file--macros, functions, variables, types, etc.--is loaded only +when it is referenced from the user's code, at which point only that +entity (and those entities it depends on) are deserialized from the +PCH file. With this approach, the cost of using a precompiled header +for a translation unit is proportional to the amount of code actually +used from the header, rather than being proportional to the size of +the header itself.</p> </body> + +<h2>Precompiled Header Contents</h2> + +<img src="PCHLayout.png" align="right" alt="Precompiled header layout"> + +<p>Clang's precompiled headers are organized into several different +blocks, each of which contains the serialized representation of a part +of Clang's internal representation. Each of the blocks corresponds to +either a block or a record within <a + href="http://llvm.org/docs/BitCodeFormat.html">LLVM's bitstream +format</a>. The contents of each of these logical blocks are described +below.</p> + +<h3 name="metadata">Metadata Block</h3> + +<p>The metadata block contains several records that provide +information about how the precompiled header was built. This metadata +is primarily used to validate the use of a precompiled header. For +example, a precompiled header built for x86 (32-bit) cannot be used +when compiling for x86-64 (64-bit). The metadata block contains +information about:</p> + +<dl> + <dt>Language options</dt> + <dd>Describes the particular language dialect used to compile the +PCH file, including major options (e.g., Objective-C support) and more +minor options (e.g., support for "//" comments). The contents of this +record correspond to the <code>LangOptions</code> class.</dd> + + <dt>Target architecture</dt> + <dd>The target triple that describes the architecture, platform, and +ABI for which the PCH file was generated, e.g., +<code>i386-apple-darwin9</code>.</dd> -<p>More to be written...</p> + <dt>PCH version</dt> + <dd>The major and minor version numbers of the precompiled header +format. Changes in the minor version number should not affect backward +compatibility, while changes in the major version number imply that a +newer compiler cannot read an older precompiled header (and +vice-versa).</dd> + + <dt>Original file name</dt> + <dd>The full path of the header that was used to generate the +precompiled header.</dd> </dl> + + <dt>Predefines buffer</dt> + <dd>Although not explicitly stored as part of the metadata, the +predefines buffer is used in the validation of the precompiled header. +The predefines buffer itself contains code generated by the compiler +to initialize the preprocessor state according to the current target, +platform, and command-line options. For example, the predefines buffer +will contain "<code>#define __STDC__ 1</code>" when we are compiling C +without Microsoft extensions. The predefines buffer itself is stored +within the <a href="#sourcemgr">source manager block</a>, but its +contents are verified along with the rest of the metadata.</dd> </dl> + +<h3 name="sourcemgr">Source Manager Block</h3> + +<p>The source manager block contains the serialized representation of +Clang's <a + href="InternalsManual.html#SourceLocation">SourceManager</a> class, +which handles the mapping from source locations (as represented in +Clang's abstract syntax tree) into actual column/line positions within +a source file or macro instantiation. The precompiled header's +representation of the source manager also includes information about +all of the headers that were (transitively) included when building the +precompiled header.</p> + +<p>The bulk of the source manager block is dedicated to information +about the various files, buffers, and macro instantiations into which +a source location can refer. Each of these is referenced by a numeric +"file ID", which is a unique number (allocated starting at 1) stored +in the source location. Clang serializes the information for each kind +of file ID, along with an index that maps file IDs to the position +within the PCH file where the information about that file ID is +stored. The data associated with a file ID is loaded only when +required by the front end, e.g., to emit a diagnostic that includes a +macro instantiation history inside the header itself.</p> + +<p>The source manager block also contains information about all of the +headers that were included when building the precompiled header. This +includes information about the controlling macro for the header (e.g., +when the preprocessor identified that the contents of the header +dependent on a macro like <code>LLVM_CLANG_SOURCEMANAGER_H</code>) +along with a cached version of the results of the <code>stat()</code> +system calls performed when building the precompiled header. The +latter is particularly useful in reducing system time when searching +for include files.</p> + +<h3 name="preprocessor">Preprocessor Block</h3> + +<p>The preprocessor block contains the serialized representation of +the preprocessor. Specifically, it contains all of the macros that +have been defined by the end of the header used to build the +precompiled header, along with the token sequences that comprise each +macro. The macro definitions are only read from the PCH file when the +name of the macro first occurs in the program. This lazy loading of +macro definitions is trigged by lookups into the <a + href="#idtable">identifier table</a>.</p> + +<h3 name="types">Types Block</h3> + +<p>The types block contains the serialized representation of all of +the types referenced in the translation unit. Each Clang type node +(<code>PointerType</code>, <code>FunctionProtoType</code>, etc.) has a +corresponding record type in the PCH file. When types are deserialized +from the precompiled header, the data within the record is used to +reconstruct the appropriate type node using the AST context.</p> + +<p>Each type has a unique type ID, which is an integer that uniquely +identifies that type. Type ID 0 represents the NULL type, type IDs +less than <code>NUM_PREDEF_TYPE_IDS</code> represent predefined types +(<code>void</code>, <code>float</code>, etc.), while other +"user-defined" type IDs are assigned consecutively from +<code>NUM_PREDEF_TYPE_IDS</code> upward as the types are encountered. +The PCH file has an associated mapping from the user-defined types +block to the location within the types block where the serialized +representation of that type resides, enabling lazy deserialization of +types. When a type is referenced from within the PCH file, that +reference is encoded using the type ID shifted left by 3 bits. The +lower three bits are used to represent the <code>const</code>, +<code>volatile</code>, and <code>restrict</code> qualifiers, as in +Clang's <a + href="http://clang.llvm.org/docs/InternalsManual.html#Type">QualType</a> +class.</p> + +<h3 name="decls">Declarations Block</h3> + +<p>The declarations block contains the serialized representation of +all of the declarations referenced in the translation unit. Each Clang +declaration node (<code>VarDecl</code>, <code>FunctionDecl</code>, +etc.) has a corresponding record type in the PCH file. When +declarations are deserialized from the precompiled header, the data +within the record is used to build and populate a new instance of the +corresponding <code>Decl</code> node. As with types, each declaration +node has a numeric ID that is used to refer to that declaration within +the PCH file. In addition, a lookup table provides a mapping from that +numeric ID to the offset within the precompiled header where that +declaration is described.</p> + +<p>Declarations in Clang's abstract syntax trees are stored +hierarchically. At the top of the hierarchy is the translation unit +(<code>TranslationUnitDecl</code>), which contains all of the +declarations in the translation unit. These declarations---such as +functions or struct types---may also contain other declarations inside +them, and so on. Within Clang, each declaration is stored within a <a +href="http://clang.llvm.org/docs/InternalsManual.html#DeclContext">declaration +context</a>, as represented by the <code>DeclContext</code> class. +Declaration contexts provide the mechanism to perform name lookup +within a given declaration (e.g., find the member named <code>x</code> +in a structure) and iterate over the declarations stored within a +context (e.g., iterate over all of the fields of a structure for +structure layout).</p> + +<p>In Clang's precompiled header format, deserializing a declaration +that is a <code>DeclContext</code> is a separate operation from +deserializing all of the declarations stored within that declaration +context. Therefore, Clang will deserialize the translation unit +declaration without deserializing the declarations within that +translation unit. When required, the declarations stored within a +declaration context will be serialized. There are two representations +of the declarations within a declaration context, which correspond to +the name-lookup and iteration behavior described above:</p> + +<ul> + <li>When the front end performs name lookup to find a name + <code>x</code> within a given declaration context (for example, + during semantic analysis of the expression <code>p->x</code>, + where <code>p</code>'s type is defined in the precompiled header), + Clang deserializes a hash table mapping from the names within that + declaration context to the declaration IDs that represent each + visible declaration with that name. The entire hash table is + deserialized at this point (into the <code>llvm::DenseMap</code> + stored within each <code>DeclContext</code> object), but the actual + declarations are not yet deserialized. In a second step, those + declarations with the name <code>x</code> will be deserialized and + will be used as the result of name lookup.</li> + + <li>When the front end performs iteration over all of the + declarations within a declaration context, all of those declarations + are immediately de-serialized. For large declaration contexts (e.g., + the translation unit), this operation is expensive; however, large + declaration contexts are not traversed in normal compilation, since + such a traversal is unnecessary. However, it is common for the code + generator and semantic analysis to traverse declaration contexts for + structs, classes, unions, and enumerations, although those contexts + contain relatively few declarations in the common case.</li> +</ul> + +<h3 name="idtable">Identifier Table Block</h3> + +<p>The identifier table block contains an on-disk hash table that maps +each identifier mentioned within the precompiled header to the +serialized representation of the identifier's information (e.g, the +<code>IdentifierInfo</code> structure). The serialized representation +contains:</p> + +<ul> + <li>The actual identifier string.</li> + <li>Flags that describe whether this identifier is the name of a + built-in, a poisoned identifier, an extension token, or a + macro.</li> + <li>If the identifier names a macro, the offset of the macro + definition within the <a href="#preprocessor">preprocessor + block</a>.</li> + <li>If the identifier names one or more declarations visible from + translation unit scope, the <a href="#decls">declaration IDs</a> of these + declarations.</li> +</ul> + +<p>When a precompiled header is loaded, the precompiled header +mechanism introduces itself into the identifier table as an external +lookup source. Thus, when the user program refers to an identifier +that has not yet been seen, Clang will perform a lookup into the +on-disk hash table ... FINISH THIS! + +<p>A separate table provides a mapping from the numeric representation +of identifiers used in the PCH file to the location within the on-disk +hash table where that identifier is stored. This mapping is used when +deserializing the name of a declaration, the identifier of a token, or +any other construct in the PCH file that refers to a name.</p> + </div> -</body> </html> diff --git a/docs/PCHLayout.graffle b/docs/PCHLayout.graffle new file mode 100644 index 000000000000..bd92b381aca8 --- /dev/null +++ b/docs/PCHLayout.graffle @@ -0,0 +1,1495 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>ActiveLayerIndex</key> + <integer>0</integer> + <key>ApplicationVersion</key> + <array> + <string>com.omnigroup.OmniGrafflePro</string> + <string>137.11.0.108132</string> + </array> + <key>AutoAdjust</key> + <true/> + <key>BackgroundGraphic</key> + <dict> + <key>Bounds</key> + <string>{{0, 0}, {576, 733}}</string> + <key>Class</key> + <string>SolidGraphic</string> + <key>ID</key> + <integer>2</integer> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + </dict> + <key>CanvasOrigin</key> + <string>{0, 0}</string> + <key>ColumnAlign</key> + <integer>1</integer> + <key>ColumnSpacing</key> + <real>36</real> + <key>CreationDate</key> + <string>2009-06-02 11:19:43 -0700</string> + <key>Creator</key> + <string>Douglas Gregor</string> + <key>DisplayScale</key> + <string>1 0/72 in = 1 0/72 in</string> + <key>GraphDocumentVersion</key> + <integer>6</integer> + <key>GraphicsList</key> + <array> + <dict> + <key>Bounds</key> + <string>{{35, 338}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>13</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.175793</string> + <key>g</key> + <string>0.402929</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Method Pool}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{32, 58}, {110, 14}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>ID</key> + <integer>12</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Pad</key> + <integer>0</integer> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Precompiled Header}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{35, 190}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>11</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>0.796208</string> + <key>r</key> + <string>0.324589</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Types}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35, 227}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>10</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>1</string> + <key>g</key> + <string>0.382716</string> + <key>r</key> + <string>0.524072</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Declarations}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35, 301}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>9</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.54645</string> + <key>g</key> + <string>0.242877</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Selector Table}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35, 264}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>8</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.99938</string> + <key>g</key> + <string>0.457913</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Identifier Table}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35, 153}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>7</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.669993</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>0.254644</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Preprocessor}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35, 116}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>6</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.258332</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>0.593784</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Source Manager}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35, 79}, {104, 30}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>5</integer> + <key>Layer</key> + <integer>0</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.270873</string> + <key>g</key> + <string>1</string> + <key>r</key> + <string>0.979351</string> + </dict> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1019 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 Metadata}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{21, 47}, {132, 337}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>ID</key> + <integer>4</integer> + <key>Layer</key> + <integer>1</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>FillType</key> + <integer>2</integer> + <key>GradientAngle</key> + <real>90</real> + </dict> + <key>stroke</key> + <dict> + <key>CornerRadius</key> + <real>9</real> + </dict> + </dict> + </dict> + </array> + <key>GridInfo</key> + <dict/> + <key>GuidesLocked</key> + <string>NO</string> + <key>GuidesVisible</key> + <string>YES</string> + <key>HPages</key> + <integer>1</integer> + <key>ImageCounter</key> + <integer>1</integer> + <key>KeepToScale</key> + <false/> + <key>Layers</key> + <array> + <dict> + <key>Lock</key> + <string>NO</string> + <key>Name</key> + <string>Sub-blocks</string> + <key>Print</key> + <string>YES</string> + <key>View</key> + <string>YES</string> + </dict> + <dict> + <key>Lock</key> + <string>NO</string> + <key>Name</key> + <string>PCH Block</string> + <key>Print</key> + <string>YES</string> + <key>View</key> + <string>YES</string> + </dict> + </array> + <key>LayoutInfo</key> + <dict> + <key>Animate</key> + <string>NO</string> + <key>circoMinDist</key> + <real>18</real> + <key>circoSeparation</key> + <real>0.0</real> + <key>layoutEngine</key> + <string>dot</string> + <key>neatoSeparation</key> + <real>0.0</real> + <key>twopiSeparation</key> + <real>0.0</real> + </dict> + <key>LinksVisible</key> + <string>NO</string> + <key>MagnetsVisible</key> + <string>NO</string> + <key>MasterSheets</key> + <array/> + <key>ModificationDate</key> + <string>2009-06-02 11:33:35 -0700</string> + <key>Modifier</key> + <string>Douglas Gregor</string> + <key>NotesVisible</key> + <string>NO</string> + <key>Orientation</key> + <integer>2</integer> + <key>OriginVisible</key> + <string>NO</string> + <key>PageBreaks</key> + <string>YES</string> + <key>PrintInfo</key> + <dict> + <key>NSBottomMargin</key> + <array> + <string>float</string> + <string>41</string> + </array> + <key>NSLeftMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + <key>NSPaperSize</key> + <array> + <string>size</string> + <string>{612, 792}</string> + </array> + <key>NSRightMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + <key>NSTopMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + </dict> + <key>PrintOnePage</key> + <false/> + <key>QuickLookPreview</key> + <data> + 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 + xcryXYOE70kNEkobxshDE4ypYRSoiytISv3yGZm4zKPE7Ywp+IglQYJWgwTChjH4nUX7 + mChyz8RFU/Cm0djBxsKYYY4xxtFQMIZNZwzFl4KkF+0p2TuF0grZUZVbJo9nCC4avHX6 + 5TPu21THQ6ZDTlXfKWwJGV+6jt4pVAFzTKRsFyuFrh91Y2NCdsnMMciehgIyG7t8IK5B + wo+Fr10+Szwn6ruc9/gg1lBejRunB4nffX8eGiNabux1eRgluoXNvU0b8TPK+aftZbPm + c6VqTqXO+GwX9tPSUmCBaVQtVsBWSKvfPFX6rfLilG9geF9Wfu3U7pHc+Amvv8a632rU + ApatUJXChqpQ5X1pE+GgiuWEkxS6ftSNjZWqZo75zdFQUhWNURXiG1SNiz1TKK2QHVVC + jst4hVBhsScMHldYivqOQbdRNekzJaFVqkLYQGY/eWgTRe5XWNIrbNPISXBjoeowxyDD + JnmmsOmQKX4TVWuaX6Aq6oQQA94Op1R9PaliIYQ+k+q2LFr2Obclni+Ewui/o+Qf98GW + tPxoiQALXr8Mt8b1Tx/CeB+2pYAMp4Zi/fG4wEtixMfj2HTEzgi0Ycb4amPP5b9ZnI0v + PSMUx9gx+2svFAQHa+CwjxMeK/hmrJdEXipcJkUApJWGeI3y4wOqhoVfJ5F2RZGP7iKN + pyNOWiJvLddz41RQDa1EHoUNDamCejZRZCyn9YM8HV2WBl+wrRsbS+QNcwYNaSjLCjSd + horp1RcK/1egQ4a0hQxVsJVkuQT45Tu3dI8PBLnl00oKPFHIfFLRHHQcQZaLwCYKZCyn + kOUDAXIRNuPBWDc2VshmzgoZhnIPNAYZ4hp5b7xQ8Dh9gdC4JNo847I6I7Tjd8b+WdHy + /yfrGPwedDTqfhg/DeHhwq3vkJ//D8Opeh8KZW5kc3RyZWFtCmVuZG9iago1IDAgb2Jq + CjIzNDUKZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAzIDAgUiAv + UmVzb3VyY2VzIDYgMCBSIC9Db250ZW50cyA0IDAgUiAvTWVkaWFCb3ggWzAgMCA1NzYg + NzMzXQo+PgplbmRvYmoKNiAwIG9iago8PCAvUHJvY1NldCBbIC9QREYgL1RleHQgL0lt + YWdlQiAvSW1hZ2VDIC9JbWFnZUkgXSAvQ29sb3JTcGFjZSA8PCAvQ3MyIDEzIDAgUgov + Q3MxIDcgMCBSID4+IC9Gb250IDw8IC9GMS4wIDE0IDAgUiA+PiAvWE9iamVjdCA8PCAv + SW0xIDggMCBSIC9JbTIgMTEgMCBSCj4+IC9TaGFkaW5nIDw8IC9TaDEgMTAgMCBSID4+ + ID4+CmVuZG9iagoxMCAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5 + cGUgMiAvQ29vcmRzIFsgNjYuNSAtMTY5IDY2LjQ5OTk3IDE2OSBdIC9Eb21haW4KWyAw + IDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMTUgMCBSID4+CmVu + ZG9iago4IDAgb2JqCjw8IC9MZW5ndGggOSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5 + cGUgL0ltYWdlIC9XaWR0aCAzMDggL0hlaWdodCA3MTggL0ludGVycG9sYXRlCnRydWUg + L0NvbG9yU3BhY2UgMTYgMCBSIC9JbnRlbnQgL1BlcmNlcHR1YWwgL1NNYXNrIDE3IDAg + UiAvQml0c1BlckNvbXBvbmVudAo4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVh + bQp4Ae3QMQEAAADCoPVPbQsviEBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwMB7YCAeAAEKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjI5MTYKZW5kb2JqCjEx + IDAgb2JqCjw8IC9MZW5ndGggMTIgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9J + bWFnZSAvV2lkdGggMjUyIC9IZWlnaHQgMTA0IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xv + clNwYWNlIDE2IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAxOSAwIFIgL0Jp + dHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt + 0AENAAAAwqD3T20ON4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw + YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG + DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA + AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBj4 + HhgzLwABCmVuZHN0cmVhbQplbmRvYmoKMTIgMCBvYmoKMzY2CmVuZG9iagoxNyAwIG9i + ago8PCAvTGVuZ3RoIDE4IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2Ug + L1dpZHRoIDMwOCAvSGVpZ2h0IDcxOCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50 + ZXJwb2xhdGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVj + b2RlID4+CnN0cmVhbQp4Ae3a6VdV5xkF8Dgh8ySDDJeAUAZBBgVRXBBEi1FREwNqQmWB + VKNEIAuLmIVBYqiINqAsMZgQcECJExJUUGNW/7U+5wJGtxh32n7JyX4/NNm6e/H99R3O + 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 + 9kXAeVN796bzAm3uWWP1ymSPvajFl9v21wHOq21PcuZq52+d/t48Y3bLzKbNzMVKMDUz + mzYz70vHr040/935m6fVmV4zP/gLAZnN2skMFhERZUYgQUVmAEJEmRFIUJEZgBBRZgQS + VGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVG + IEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBR + ZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEI + EWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZ + gBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQV + mQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFI + UJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZ + gQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJE + mRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYg + RJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVm + AEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJU + ZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYg + QUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFm + BBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgR + ZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmA + EFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZ + AQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQ + kRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmB + BBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZ + EUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBE + lBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYA + QkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRk + BiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBB + RWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYE + ElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFl + RiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQ + UWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkB + CBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCR + GYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEE + FZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkR + SFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESU + GYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBC + RJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQG + IESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFF + ZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBRZgQS + VGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEIEWVG + IEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZgBBR + ZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQVmQEI + EWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFIUJEZ + gBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZgQQV + mQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJEmRFI + UJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYgRJQZ + gQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVmAEJE + mRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJUZAYg + RJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYgQUVm + AEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFmBBJU + ZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgRZUYg + QUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmAEFFm + BBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZAQgR + ZUYgQUVmAEJEmRFIUJEZgBBRZgQSVGQGIESUGYEEFZkBCBFlRiBBRWYAQkSZEUhQkRmA + EFFmBBJUZAYgRJQZgQQVmQEIEWVGIEFFZgBCRJkRSFCRGYAQUWYEElRkBiBElBmBBBWZ + AQgRZUYgQUVmAEJEmRFIUPl9Zr5BYdGe5JWrizbt2FffdOKrc/1XRm7enXg49fT5L7/A + J7s2/mJmUw8n7t4cudJ/7qsTTfX7dmwqWr0y2RMdFuS7ZNGCd14aCxYu8Q0Mi4pPXpn3 + wuzi4MjNOw/M7Ofnfx6z5z+b2YM7N0cGL74wy1uZHB8VFui7ZKHM5tktv8hsHpXf/qXf + Y/aO9qYX8y1mL51m9q9vMftz3AK/2BXwm+eZzF7bpjJ7jeStv/C/mTXa89nLzxp/0r3Z + 6H0++/VZY/69mWHPZxV76xvbOnsuvPR89ic0u9DT2dZYv7diU1Fextzz2XxmcSu8ZnsO + HD3umA2Pzj3T2qp968r+wxdsknN3wOjwoJkdP3pgj9dsRdzMM+1rZgGhkWaWu76sYk/d + 0eOnzvZ9a2bjk97vAc7H/eFN3jIBZ45es8nxO6PD3/adPXX8aN2eirL1uRkr4iJDA+x7 + wHxmsUkZues2bq+q/ay1o9sxu21mT57ZF05nvOVn/sF/e2aOz589mZocv+2YdXe0flZb + tX3jutyMpNg3mkXEJqbnFJZuq6xt+EdHd+/lH27cvv/T4xdmrkabIfvFzB7/dP/2jR8u + 93Z3/KOhtnJbaWFOemJsxHzrbLFvQIiZpZnZ1o9qjhw7+c9vBoauj5nZ9LPnswvNxWhz + ZM+fTZvZ2PWhgW/+efLYkZqPtppZmpmFBPguxr25eGlAcERMYuqqtSXv797/aUt7178u + fX9t7N7Eo2nnxcbs+IPvvzf+8efmZ18Dph9N3Bu79v2lf3W1t3y6f/f7JWtXpSbGRAQH + LJ3HzD942fKEv2TlF5d/UH2o+YvT9gLt6q3Zi/MFmvPhb/zJf8jfmONy/vl89qvTrav2 + +uz0F82Hqj8oL87P+kvC8mXB/q+bLfLxDw6P9qRkrtmwedfHzgPaWedh4/b9SedAe7E7 + nU/+Q9K88Q/tzGh22DTtOJu8b1fA4IWzzuPZx7s2b1iTmeKJDg/291mEe3ORj5+9qI1P + nnmorbOL80yvc6Ddc97UAprzI974Z/gD/cac1Utkzlvae85x1nvGrs26uUdae03r95rZ + gkXOi9rIuCTn4txaWXO4pf3r8/Z223lCezz99NnP9r+Bd8DPcUWcm9vPz55OP3aezuzN + 9vmv21sO11Q6V0B6Ulyk85r21Vfb77zjvNz2Xpyp2QXFWz6sPtjU1tndd3no2tjdB5OP + p548NTYbc5/utn86c3v29OmTqceTD+6OXRu63Nfd2dZ0sPrDLcUF2akz1ya82vaa2cVp + l0BKlh1oO/fVNRxr7zrfPzh848d7DyYfTU1NG5u7x5PpqalHkw/u/XhjeLD/fFf7sYa6 + fTvtOMtKca6AgKXzmC1e6h9sB5p9e1pnT7X7DzW3neruvfTdyOjY3fGJyYePHk/NjGnX + jdmJPX70cHJi/O7Y6Mh3l3q7T7U1H9pvT7T2LWBFfHSY99p85a9Q7HvUwsU+fnagxdoT + WkFx+S5baC3tp3v6Br4buTF25974xMRPkw9dPSZ/mpgYv3dn7MbIdwN9PafbW2yZ7Sov + LrCns1g7zvx88PHMzOwSsANtuSfF/rqubHvl/oONrSe7zhna8LWbY3fu3rt/f/zBgwcT + rhw2sfH79+/dvTN289qwkZ3rOtnaeHB/5fayoryVKZ7lzreAJfioMXOg2eaMiktKy1lb + Ygut9tPmtg5DuzQ4NHJ99NbYj7fveMdd142Zed3+cezW6PWRocFLRtbR1vxprS2zkrU5 + aUn2Isi25mvHmWPmbM7QiJiElMy8oo1bd39Sd+RzQ+vp7R+4MjR89dr1G6OjN23cct1w + ZjU6euP6tavDQ1cG+nt7jOzzI3Wf7N66sSgvMyUhJiLUuzXxODMzZ3PaV4H4pLTs/OLN + FZXV9YZ28nT3+b7+gcEr3w/9MDw8PDIyctV1wyZlU/th6PsrgwP9fee7T580svrqyorN + xfnZaUnx9iXAuzVfM3tn4cIlS/2CnIWWnJFb+F75jqq/1R9pbm0/1dV9vvdC/6WBy98O + 2rjiwuHM69vLA5f6L/Se7+461d7afKT+b1U7yt8rzM1IdpZZkJ9tTfjm5Lx/tM3pXWhR + dnVmrV5fumVnVfWBw40tJ9o7vz7Tc+6b3r6+Cxcv9rtyXLx4oa+v95tzPWe+7mw/0dJ4 + +EB11c4tpetXZ9mlGeVdZotf/T9rzLyxdTbnUudEc3bnqvyi0i07Kj+pPdjQfKytvaPz + dNeZ7u6zPedcOnrOdnef6Trd2dHedqy54WDtJ5U7tpQW5a9ydqZzmi21W/P1rflioYVF + xHiS07MNrbxi9779dYcamlpa275o/7LjVGfnVy4dnZ2nOr5s/6KttaWp4VDd/n27K8qN + LDs92RMTEeacZvMuM8fMFppdA/Zga0dadv769zZv3VVpagcPf9b0ecux1tbjbSdcOtqO + t7Yea/m86bPDB02sctfWze+tz8+2w8weZ43sTcvMHmvtRLPdGRIeZWjpq1YXFpeVbze1 + 6pq6+kOHjzQcPdrY2NTU1OyyYVNqbDx6tOHI4UP1dTXVJra9vKy4cPWqdCOLCg9xdubi + +W6AmVtg0WIfX/+gkGUOWlpWbkFRSVn5tp0fVu39uLqmprb2wIF6Z/zdVcM7pQMHamtr + aqo/3lv14c5t5WUlRQW5WWkO2bKQIH9fn8Xzn2azaEt8fAOCQg3NsyI1IztvbVHxxs1b + tlXs+mD3R1VVe/buc+nYu6eq6qPdH+yq2LZl88biorV52RmpKzxGFhoU4OvzhgvAe3cu + WGhHmoMWEh4Z40lMTsvMyStYt6GkdNNfy9/fum17RcWOHTt2um7YpCoqtm/b+n75XzeV + lmxYV5CXk5mWnOiJiQwPmSWb99Kce95wjjQHLSwiOi4hKSU9Mzt3TUFh0YbiktLSjWWb + nLHZZcM7qbKNpaUlxRuKCgvW5GZnpqckJcRFR4Q5ZN7DbL7njBky5+40NDvTAoPDIqJi + 4t9NSknNyMrOyVuTv7awcN36ol/HBheMX2dTtH5dYeHa/DV5OdlZGakpSe/Gx0TZQ0ag + nWXO+f9bZL+iBQSHhkdEx8QnJCanpKavzDK4nNw8G6tdOJx55eYYV9bK9NSU5MSE+Jjo + iPDQ4ACK7J0FsyvNLyDQq7Y81pOQmGRuqWnpGRkZK2dGpmvG7IRsaulpqeaVlJjgiV3u + FQsM8JtdZb+9zGyPOheBc6j5BQQ5apHRy2PjPJ53ExOTklYku3asSEpKTHzX44kzsEhn + jQWZmB1li962MV9cBIZmav621kLCwpdFREVHx8TGxsbFxcfHe1w4bFpxcTbBmOjoqIhl + 4WEhwYG2LZcuoclspc0sNR9nrdliCw4Nc+AiIiOjokzPjcMmFhkZ4XCFhQbbEnPWmB3+ + ziJ767586fp0NqjdoL5+/gEBgQYXEhJqdu4doaEhIcYVGBDg7+dr55hX7C0X5hzX7P60 + pWZqDttSc3PgjM5GkCuHMzNnhv5+5mUrbMliZ439jkU2q+fs0IWLnNXmwJnc7PBz3Zib + me9Sh8tZYf8V2EurzQvnrDj3j8W2vByu/2KFvbJNF9jwfoz3Pxa5dPw6Q2e+rwD8L8H5 + MHeP/0VH/10JSEACEpCABN4g8B9kKxEFCmVuZHN0cmVhbQplbmRvYmoKMTggMCBvYmoK + ODExOQplbmRvYmoKMTkgMCBvYmoKPDwgL0xlbmd0aCAyMCAwIFIgL1R5cGUgL1hPYmpl + Y3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNTIgL0hlaWdodCAxMDQgL0NvbG9yU3Bh + Y2UKL0RldmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUgL0JpdHNQZXJDb21wb25lbnQg + OCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtnPlXUukfx01LRZBFQUPA + QBgBRZRcUDwYLoOpqGW4lKNH5aupiXZwlDqYMuaIy+TCUdMyyaXM3cilmub0r83nuUA2 + LmXf+uHa5f2LnTjn8n49n+V57uU+j4+PV94R8I6AdwS8I+AdARiBc2dGPyxciNj3k/xw + rk9GfZHv7xkEN7Wf3/nz5y+cIYFdPz9sGP5PfgwcsBGzf0BAoEck3MrjMDAgwB+5dg3A + N+O7wFG0/YGaRAoigyigYFwLOUROg0ikwEA0AJAAEP9vwkcVjiLuD9yATQmmUmk0Op1x + BkSn02hUajAMQRDwI3yM/rSlj4IO5BBxEpkM2MAcEspkslhhYWHhuBYYZLGYzNAQBoMO + A0Amk1D0Ef0pQ+8ivxAQGESmUGkIG4jZERERHA6Xy+XhWGCPwwGj7PDwMDQANCqFHBQY + 4Ir9abq+Cx3FPJhKD2Gywi9GcHi8S3y+QBAlxL2iBAI+/xKPx4m4GM5ihtAh+BB7V+i/ + lvco3yHdgZyCyAGcF8kXCEXR0WKJVCqNcSkWd3IbA4sScXS0SCjgR/IAH9FTgB4S/+t5 + 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 + nxn0jx898FDwrzdWFp9Njdi6f2+ugdUNNHpgp8Oq9nDOI3ZWhABWdZkFpTXQ5m2jj6HV + bTr3PrHjKsAnmnHBQ7Pbc25Cs3s8aoNGX1NakAkrO0EE60R2Dqxo07J0ZbUtnT0DiB1m + d9TqsOud+G04+wAzi5odmuGBfaCns6W2TJeVBqtazgnsFLiBjcKm97K6FrN1EE1x7jaP + Loczwi/YQW7djR5NcoNWc0tdGTbBR8FtLCxujuY8sHuWNmh6B3bHiwP2L3wX7j46YH/h + wNiNBs/i5kvscPOeXVhhMN77Y2j852AfH/rjntFQUQgLuxgh9xTsrT8Xe6uX3Rv3E3ud + u94P5zzu2tlXDHn6PPQ6VO/flfNf+Srcffwj2c/S9I6ta93z+4+Iu5cdd6l9gqH/rG2+ + ud4JubZxPa4j4pr24F6m82e6l+n86r0M3L8T9h6W2M8uiPrM6jyBn1US+hk1gX+bIPJv + UgT+LZLIv0ET+t0DQr9zQtx3jXwI/I6Zz3HvFnad/XcLu07zbiGR3ykl9rvExH2H3IfA + ewd8iLxnhMh7hTyBJ+IeMWAn7t5A6HaE3ROKAk/YvcBY1qPt7wTcAw7sUPIE3fuP4KHk + CXnmAxxS5zrhJYiAZ30cwBPwjBc4ndAVeSKe7YNFHg7yIuKZTrCbAnV7OL+NiGd5AbyL + nohnuLlCj8WeeGf3IXgIPdAT8cxGtIfKhY8qn2BndSJ4Nz7En3BntLrwIfxYAmCnvaJh + wLfcNuEP8u1G+P4/6GJnQ9/P6r2CdwS8I+AdAe8I/BQj8C9ppK71CmVuZHN0cmVhbQpl + bmRvYmoKMjAgMCBvYmoKMjc2MAplbmRvYmoKMjEgMCBvYmoKPDwgL0xlbmd0aCAyMiAw + IFIgL04gMSAvQWx0ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl + ID4+CnN0cmVhbQp4AYVST0gUURz+zTYShIhBhXiIdwoJlSmsrKDadnVZlW1bldKiGGff + uqOzM9Ob2TXFkwRdojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo+83s6iiEb3k73/v9/X7f + e0RtnabvOylBVHNDlSulp25OTYuDHylFHdROWKYV+OlicYyx67mSv7vX1mfS2LLex7V2 + +/Y9tZVlYCHqLba3EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6sGvAjogMPmrkw09GcdKWy + LZFT5qIoKq9iO0mu+/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3RKG8D65EGc9fVPZsNRSn + DeOcSEMaKfKu1d8rTMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT4/j2EKU+yWCoibXpspkd + hX0AdirL7BDwBejxsmIP54F7Yf9bUcOTwCdhP2SHedatH/YXrlPge4Q9NeDOFK7F8dqK + H14tAUP3VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67qJe57 + AnfT4zvRmzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtURG2ej + UoFWeo1Xxk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL3f/H + MoSP2Sc5psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktUbinU + 6j2DSqwcK9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPNs0Rm + lLFbo+TdeNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l5/VB + /TwJPa2f0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0PQBn9 + ZgplbmRzdHJlYW0KZW5kb2JqCjIyIDAgb2JqCjcwNAplbmRvYmoKMTMgMCBvYmoKWyAv + SUNDQmFzZWQgMjEgMCBSIF0KZW5kb2JqCjIzIDAgb2JqCjw8IC9MZW5ndGggMjQgMCBS + IC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+ + CnN0cmVhbQp4AYVUz2sTQRT+Nm6p0CIIWmsOsniQIklZq2hF1Db9EWJrDNsftkWQZDNJ + 1m426+4mtaWI5OLRKt5F7aEH/4AeevBkL0qFWkUo3qsoYqEXLfHNbky2perAzn7z3jfv + fW923wANctI09YAE5A3HUqIRaWx8Qmr8iACOoglBNCVV2+xOJAZBg3P5e+fYeg+BW1bD + e/t3snetmtK2mgeE/UDgR5rZKrDvF3EKWRICiDzfoSnHdAjf49jy7I85Tnl4wbUPKz3E + WSJ8QDUtzn9NuFPNJdNAg0g4lPVxUj6c14uU1x0HaW5mxsgQvU+QprvM7qtioZxO9g6Q + vZ30fk6z3j7CIcILGa0/RriNnvWM1T/iYeGk5sSGPRwYNfT4YBW3Gqn4NcIUXxBNJ6JU + cdkuDfGYrv1W8kqCcJA4ymRhgHNaSE/XTG74uocFfSbXE6/id1ZR4XmPE2fe1N3vRdoC + rzAOHQwaDJoNSFAQRQRhmLBQQIY8GjE0snI/I6sGG5N7MnUkart0YkSxQXs23D23UaTd + PP4oInGUQ7UIkvxB/iqvyU/lefnLXLDYVveUrZuauvLgO8XlmbkaHtfTyONzTV58ldR2 + k1dHlqx5erya7Bo/7FeXMeaCNY/Ec7D78S1flcyXKYwUxeNV8+pLhHVaMTffn2x/Oz3i + Ls8utdZzrYmLN1abl2f9akj77qq8k+ZV+U9e9fH8Z83EY+IpMSZ2iuchiZfFLvGS2Eur + C+JgbccInZWGKdJtkfok1WBgmrz1L10/W3i9Rn8M9VGUGczSVIn3f8IqZDSduQ5v+o/b + x/wX5PeK558oAi9s4MiZum1Tce8QoWWlbnOuAhe/0X3wtm5ro344/ARYPKsWrVI1nyC8 + ARx2h3oe6CmY05aWzTlShyyfk7rpymJSzFDbQ1JS1yXXZUsWs5lVYul22JnTHW4coTlC + 98SnSmWT+q/xEbD9sFL5+axS2X5OGtaBl/pvwLz9RQplbmRzdHJlYW0KZW5kb2JqCjI0 + IDAgb2JqCjczNwplbmRvYmoKNyAwIG9iagpbIC9JQ0NCYXNlZCAyMyAwIFIgXQplbmRv + YmoKMjUgMCBvYmoKPDwgL0xlbmd0aCAyNiAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZp + Y2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7ZlnVBPrFoa/mUlP + CJDQmwFCb6FoAAUh9M6hBxATQmhSYgiKiChioVgQrNhAjg1UVCygKAioCB5EEXtBrNiO + BRuinAksPHfdu86ve//d7LVm5lnv7NnfN5P82Gu/AGil8UWiNBgAkJ4hEYd4cRhR3GgG + /jbAAgiQgB4w4AuyRK7Bwf5oyj/E5xtoLhp9FtJa/5D0T7KiGF0QACgYTVBKmuAEKcdP + cI6U50tEEjRnlZQFyXz0PlSFsrk4LMQN5csAEChJ40y8JeX4cVZ8ImU+X5wEgPo7NJ/B + 5yehrKEwwfFSZkl5niAJra8h3QMrIyElA+UlKNsnCLMEKDeinJSQJUgHQJOBrgfS0zPR + PWihDIwFIjH6rJY3ykzpt0OvaIi+AeBQCgBy9m9tdgAADb0AqAj/1gzLAKDtBqCJ+Lf2 + 8cr494TU4rMSbW3Gy0EUDQCwrWNjH8YAwPMA+NEzNvZ989jYj43oGsMAtAQKssXzxnMB + RnrBor+ePFAC6kAH6ANjYAFsABtMBy7AA/iCIBAGuCAOCEAySAdiMB/kgQKwApSCMrAB + VIKd4HewHxwCR8FJ0AzOgQugG/SCfnAHDICn4CV4Bz6B7xAE4SEKRIPUIB3IADKDrCF7 + yBnygPygEIgL8aBEKB3KhvKgQqgEKoe2QNXQPugw1Ai1Qp1QL3QLGoCGoPfQCAzDZFgJ + 1oINYEuYDbvAvnAoHAsnwiJ4AVwIr4Y3wdVwHXwcboG74OvwQ/glPAyPISREGWEgZggb + 4SABCBcRIiIkDylC1iNVyAGkCTmPXEMeIK+QrxgMRhGjgzHHOGA8MWEYPiYTk4cpwWzG + 7MEcw7RhrmIeYt5iRrFkrAbWGMvGemEjsEKsBLsMW4GtwTZg27F92MfYjzgEp4Rj4qbi + PHARuCRcDq4YV4mrw53B9eAGcB/wCF4Zb4R3wPvj4/AifCF+I34f/jS+B/8IP0wgEDQJ + VgQOIYKQSsgnlBP2EE4RegiPCV+IFKIucRrRj8gjZhNLiFXE48Ru4gDxM4lC0iM5kIJI + QlIeqZy0n9RKukl6S8aStcl2ZD+ygLyQXEGuI7eT75I/UigUJsWJEkHJoKykVFNOUfoo + b+Rwcgw5R7kwuQy5Irldcs1yN+XeUylUIyqHOouaQ62g1lO7qM/kYXkdeUf5CHmx/Br5 + OvlO+ScKkIKOwnSFKIV5ChUKRxR6FF4rkhSNFT0VExQLFasVWxUfKv6kadNm0GJoubRK + WhPtNu0bXZ3uQOfSc+mV9NP0u/RRJW0lZ6XZSgVKu5Q6lJ4q45VNlP2U05XLlI8q9yt/ + UdFQcVLhqRSq7FXpUnmrSlOdqspVXaS6S/WC6ks1eTU7Na7aIrUatU61N+p0dXv1OPVl + 6rXqveqfNbQ13DRSNco0Tmo80MRpWmiGaeZp1mh2a37U0tRy00rTWq91RuuZNlWbrc3T + LtFu0L6vg9Nh6UTrLNM5pHNrCjLFYkrUlMIph6bcZmAYLEYMYyWjgfFAl6TL1hXortVt + 1h3SU9bj6In0tut16X3VN9AP1S/Qr9e/z6QwHZkpzE3MC8xPBkyDMINCgwaDQUOaIcdQ + bFhj2GeEGNkZCY02Gl00+mpsahxjvNr4rPE7Ez2TcJOVJk0mr02nmIaYLjdtNH1lpmMW + YrbC7JTZW3M98wjzEvMW82ELE4s4iwqLTosflraWKZY7LK9bka1creZbHbJ6wtJkhbCK + WedYX61Z1knWO61v2sjbeNsssWm0eW9raiuw3Wbbbydv52231K7Z7vNU1tTUqbunPpym + MS18Wtm0bjaOzWHns5vYn+yt7dPta+2fOeg78By2O9xxVHUMcyx3vDJdbrrf9OLpF2fg + ZrjPKJzR5gQ5uTgtdmpx+uns7JzvfNb558yZMxfPbHUBLq4uS106XLGuXq5Frl0cCieQ + s47T56biFuW21e2Bu6670H2f+2sPlofEo9Fj1NPFc7lnlxfVK9Rri9cDb33vFO96708+ + 030KfC76Un3Dfbf6DvqZ+s31a/QH/t7+Zf63AhgByQFHAkYCOYGrAvuDdIKSgo4EfQ/2 + CF4bfPs35m8ZvzWFYEKCQipDnoZah+aFdoYphfHCDoZ9C/cMLw9/GGEekRtxMVIpMj7y + cOTPKP+oyqghrj13Bbc/mhktiW6PoccIYo7GIrGhsTWxw7PcZ22Y9SyOHVccd2e2+ez8 + 2b08PZ6Ed5Gvzk/jt8TT4oXxTQKKgCc4lkBIiE04IsQKo4X1iZhEbmJ9EiYpOulwMi45 + NvloCjFldsqJVLnUhNTmOfQ5c+a0p2mmZaV1p+un56X3Z1hmrMwYyHTMrMh8I/ISVYu+ + z42Ye1hMFieKz2VpZeVk9UmsJKWS59lu2VXZo/O4807Mp88Xze/JMcspznm+wGNBTS6c + y8ttWaizcNHCe3kz8rbmfV8Us+h0vmZ+Xv69xU6LdyweW8Jb0lagX7C84PlSn6V1hdRC + UWHfsmnLtiwbXc5b3r7CaEXpij9Xhq1sLNIuKih6VuxffKREpSSvZLDUu/TQKqVVC1cN + rvZeXb9GdU3+mqdrA9YeL9MuW172dl3EupZy4/J15SMVCRV/rGevr95A3pC9YWCj78bj + mxibSjd92Ry/uWeL45Y9lbTK/MpXWyO3dmyz3rZzO2X7gu3Pd4TvaN9pvbOqSr5qUdXr + 6pjq7l2Ou2prNGpKakZ+T/397m7/3c17LPfs3Kuwd+ne4X3Cfbf2++5vrrWq3VWnXFdU + 9/1A5oHHByMOdh+aeaih3rh++2HFwysPjx6Ze+T50VlH+xp8GlqOTTt28Djz+NYTtBPF + J6GTC06+b0xpfNQU3XTtlN+pjtPOp082s5przzDP7DirfraihdpS3IppXdw6cm7eufdt + 6W1D7Yntgx2zO+6d556/cSH0wtWLgRcvd/p2XrrkdelCl0dXR7dbd9tlzuVzf7j+ca6H + 09N2xe1Ke69774WrXlc7r/leu9wX2Nd7PfT6jf6o/rs34m4M3hTeHLqVfuv97ezbI3cW + 30XuFt2j3qu4r35/xwPmg9qH1g9PDjgPnH/k/6hvMHpw8HHq4w9Pcp/CT0uf0Z9te27w + vP6F/Yu2If+hGy95L1++yn419rrkjcqb6rfmbxv/dP+z913su6H32R/gD2s/an2sHWYP + n/8U+unR58zPP7+s+qr5tfabw7dLI9yRF99zRgmjW36Y/Dj10+/nvbEMWS8g6wVkvYCs + F5D1ArJeQNYLyHoB2VxANheQzQVkcwHZXEA2F5DNBf5/5wIivpg/3gsg6BlOTATgw14A + 5LgA0FFfgoz8t/cnfJTxFaBxD0OKUm9o3B/6T57wWqRJgAVATSsAYS4A+KPXrUsAMPwC + gOJCAIIBqqP7tbWdPCZ8GVRGN+/u4e/PsGGz2JGe0sT/aaSnZaP+z3jQ0DMlIy1Q6oOp + oceLBL673ySL0sb9sXFdmBEeOqlnxAcGTXKi2DNkkkUSzr9wMPpyEzVzk90CJ1mY5fGr + TirfV/pu4/XF2SHhk5w1L9RjknOTwyInOUHo/ktPTPH0mdRTJD6/1pqT6fdrD8AddYXQ + cSxgjLtELNQpigSeIHjC50KfBgoHAOilszztQzsY6N/m30IizJFIJbdM0QJxSlKyhOGK + OoFCc4ZPhsDSnGHDYjmAvwAu1Fg1CmVuZHN0cmVhbQplbmRvYmoKMjYgMCBvYmoKMjcz + OAplbmRvYmoKMTYgMCBvYmoKWyAvSUNDQmFzZWQgMjUgMCBSIF0KZW5kb2JqCjE1IDAg + b2JqCjw8IC9MZW5ndGggMjcgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBs + ZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAx + IDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZXB10IBAAAAwP// + lYoQkTQUGVFpJxqUSjRUKBlf4OHuptO5JmiM/tEI/aFfNEQD1Ec/6Bt9oR76RB/oHb2h + LuqgV9R2L+gZPaEWekQPqIka6B7doVt0g+qohq5RFV2hS3SBztGZO0Un6BhV0BE6RAeo + jEpoHxVRAeVRDu2hLMqgXbSD0mgbbblNtIFSaB0l0RpKoDhaRTEURSsogsIohJZREAXQ + ElpEC/PNAF1KR/EKZW5kc3RyZWFtCmVuZG9iagoyNyAwIG9iagoxNzcKZW5kb2JqCjMg + MCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNdIC9Db3Vu + dCAxIC9LaWRzIFsgMiAwIFIgXSA+PgplbmRvYmoKMjggMCBvYmoKPDwgL1R5cGUgL0Nh + dGFsb2cgL1BhZ2VzIDMgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjI5IDAgb2Jq + Cjw8IC9MZW5ndGggMzAgMCBSIC9MZW5ndGgxIDExOTQ4IC9GaWx0ZXIgL0ZsYXRlRGVj + b2RlID4+CnN0cmVhbQp4AdU6eXxU1bnnnLvOmtn3yczNZGYyWSZ7SEggY0hCWBIhQUiQ + YBIIBIQaMUahwouKAhFRRBbBWnEJWzVDSGEA8VEeCrQ+RYugVG37RGv7zLOvD60FZuZ9 + 905IIa/tzz/89fd798539nvut53v+86Z27Xs3nakQj2IQtNmt3YuQNKVeT9CpGDe0tbO + RF2fihDeMq+7y52oM2kIUUsWdC5cmqjzTyMkdy5csnz4ecO3CJlRR3vr/EQ/ugZ5UQc0 + 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 + SVODphgnms8Y6UrmTYasYfpQH97F7DYzqWmMxWg2QRxgVCqSnLxaNNAmO0iGQbjfbLT0 + K58wgZ0+JywUV7gVzj0vWaIlJfCzSlKxJMitjZbkWbMt5WVlZeKah1O0kM5oRCbTUp3Z + bGEwXqpDyLImmKFZeVLKeMixeGhzN2yimnE+SxGOSMpYKAbCRWPG4zE4H1OUcMr3cFvF + sz3P+gLJ2emavGwNM14d63oLuzCdvTC2Mfblq7EFgyz/kooVLPzTqXTdtW3UQ6J/gv8E + qPuZ90C+dohxW0NF9s+siHOycieFkwwlTpOKdWnlAtBqTw5YXGqVNmDWcboktUtN1NcM + VrfwnrBweEc1oornQR+HowY4MBT1sXzoHCx0nJujE8OzEfsmaifchfmF3sJ8Iwdi/6mn + fFCbanZYFfXugcGBzZuJfhAupqJgDiEvEXzbqxuuzaee3bDb9dZbp66el3QUEvh6rR2+ + sfpbl/ivB4X8cMKVCedx+agIjUGVqApVS19vTZa+0LpV+oKsHr4Kuw3NRLNQI5qDjkuT + YfgPAkslVvxXYkp9w231kzJq2pd0t3ctmtcKPYleccj9ABA/oqcBXgKAzynh6yiEzgFc + ArgMg2kAA0AqQAFAJcAMgPkAXQCrAZ4GeAlgEOAkwDmASwCXQblpAANAanz4gnnRSBkj + 96h65ah6zag6BCk3PV87qj5tVL1hVH3GqLrIkRvxaRtVnzeqPn9UXZLhDfQsHNXfMaq+ + aFRd/B7rxvdL33XfMN8PRvXfNareOaq+bFT9nlH1rlH1e0fVl99cvyppy/8CowT99Apl + bmRzdHJlYW0KZW5kb2JqCjMwIDAgb2JqCjc3MzYKZW5kb2JqCjMxIDAgb2JqCjw8IC9U + eXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDcxNyAvRGVz + Y2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJd + IC9Gb250TmFtZSAvS1JTVVJJK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAovU3RlbVYg + OTggL0F2Z1dpZHRoIC00NDEgL01heFdpZHRoIDE1MDAgL1N0ZW1IIDg1IC9YSGVpZ2h0 + IDUyMyAvRm9udEZpbGUyCjI5IDAgUiA+PgplbmRvYmoKMzIgMCBvYmoKWyAyNzggMCAw + IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg + MCAwIDAgMCAwIDAgMAowIDcyMiAwIDAgMCA3MjIgMjc4IDAgMCAwIDgzMyAwIDAgNjY3 + IDAgMCA2NjcgNjExIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjU1NiA1NTYgNTAwIDU1 + NiA1NTYgMCA1NTYgNTU2IDIyMiAwIDAgMjIyIDgzMyA1NTYgNTU2IDU1NiAwIDMzMyA1 + MDAgMjc4IDU1NgowIDAgMCA1MDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg + MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAw + IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg + MCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw + IDAgMCAwIDAgMCAwIDAgMCA1MDAgXQplbmRvYmoKMTQgMCBvYmoKPDwgL1R5cGUgL0Zv + bnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvS1JTVVJJK0hlbHZldGljYSAv + Rm9udERlc2NyaXB0b3IKMzEgMCBSIC9XaWR0aHMgMzIgMCBSIC9GaXJzdENoYXIgMzIg + L0xhc3RDaGFyIDIyMiAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2Jq + CjMzIDAgb2JqCihVbnRpdGxlZCkKZW5kb2JqCjM0IDAgb2JqCihNYWMgT1MgWCAxMC42 + IFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKMzUgMCBvYmoKKERvdWdsYXMgR3JlZ29y + KQplbmRvYmoKMzYgMCBvYmoKKE9tbmlHcmFmZmxlIFByb2Zlc3Npb25hbCkKZW5kb2Jq + CjM3IDAgb2JqCihEOjIwMDkwNjAyMjAyMTMzWjAwJzAwJykKZW5kb2JqCjM4IDAgb2Jq + CigpCmVuZG9iagozOSAwIG9iagpbIF0KZW5kb2JqCjEgMCBvYmoKPDwgL1RpdGxlIDMz + IDAgUiAvQXV0aG9yIDM1IDAgUiAvUHJvZHVjZXIgMzQgMCBSIC9DcmVhdG9yIDM2IDAg + UiAvQ3JlYXRpb25EYXRlCjM3IDAgUiAvTW9kRGF0ZSAzNyAwIFIgL0tleXdvcmRzIDM4 + IDAgUiAvQUFQTDpLZXl3b3JkcyAzOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCA0MAowMDAw + MDAwMDAwIDY1NTM1IGYgCjAwMDAwMzIxMTAgMDAwMDAgbiAKMDAwMDAwMjQ2MSAwMDAw + MCBuIAowMDAwMDIyOTk5IDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAw + MjQ0MSAwMDAwMCBuIAowMDAwMDAyNTY1IDAwMDAwIG4gCjAwMDAwMTk3MDQgMDAwMDAg + biAKMDAwMDAwMjkxMiAwMDAwMCBuIAowMDAwMDA2MDQ3IDAwMDAwIG4gCjAwMDAwMDI3 + NjUgMDAwMDAgbiAKMDAwMDAwNjA2NyAwMDAwMCBuIAowMDAwMDA2NjU0IDAwMDAwIG4g + CjAwMDAwMTg4MDcgMDAwMDAgbiAKMDAwMDAzMTcwMSAwMDAwMCBuIAowMDAwMDIyNjM5 + IDAwMDAwIG4gCjAwMDAwMjI2MDIgMDAwMDAgbiAKMDAwMDAwNjY3NCAwMDAwMCBuIAow + MDAwMDE0OTg1IDAwMDAwIG4gCjAwMDAwMTUwMDYgMDAwMDAgbiAKMDAwMDAxNzk1OCAw + MDAwMCBuIAowMDAwMDE3OTc5IDAwMDAwIG4gCjAwMDAwMTg3ODcgMDAwMDAgbiAKMDAw + MDAxODg0NCAwMDAwMCBuIAowMDAwMDE5Njg0IDAwMDAwIG4gCjAwMDAwMTk3NDAgMDAw + MDAgbiAKMDAwMDAyMjU4MSAwMDAwMCBuIAowMDAwMDIyOTc5IDAwMDAwIG4gCjAwMDAw + MjMwODIgMDAwMDAgbiAKMDAwMDAyMzE0NiAwMDAwMCBuIAowMDAwMDMwOTczIDAwMDAw + IG4gCjAwMDAwMzA5OTQgMDAwMDAgbiAKMDAwMDAzMTI0NSAwMDAwMCBuIAowMDAwMDMx + ODc2IDAwMDAwIG4gCjAwMDAwMzE5MDMgMDAwMDAgbiAKMDAwMDAzMTk1MyAwMDAwMCBu + IAowMDAwMDMxOTg2IDAwMDAwIG4gCjAwMDAwMzIwMjkgMDAwMDAgbiAKMDAwMDAzMjA3 + MSAwMDAwMCBuIAowMDAwMDMyMDkwIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgNDAg + L1Jvb3QgMjggMCBSIC9JbmZvIDEgMCBSIC9JRCBbIDxkMDljYzExMTQ0M2YyNWM5M2Ni + ZTBjMmNkYWM1MGFmNj4KPGQwOWNjMTExNDQzZjI1YzkzY2JlMGMyY2RhYzUwYWY2PiBd + ID4+CnN0YXJ0eHJlZgozMjI2OQolJUVPRgoxIDAgb2JqCjw8L0FBUEw6S2V5d29yZHMg + MzkgMCBSIC9BdXRob3IgKERvdWdsYXMgR3JlZ29yKS9DcmVhdGlvbkRhdGUgKEQ6MjAw + OTA2MDIxODE5MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4x + LjEpL0tleXdvcmRzIDM4IDAgUiAvTW9kRGF0ZSAoRDoyMDA5MDYwMjE4MzMwMFopL1By + b2R1Y2VyIDM0IDAgUiAvVGl0bGUgKFBDSExheW91dCk+PgplbmRvYmoKeHJlZgoxIDEK + MDAwMDAzMzIyNyAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8ZDA5Y2MxMTE0NDNmMjVj + OTNjYmUwYzJjZGFjNTBhZjY+IDxkMDljYzExMTQ0M2YyNWM5M2NiZTBjMmNkYWM1MGFm + Nj5dIC9JbmZvIDEgMCBSIC9QcmV2IDMyMjY5IC9Sb290IDI4IDAgUiAvU2l6ZSA0MD4+ + CnN0YXJ0eHJlZgozMzQ0NwolJUVPRgo= + </data> + <key>QuickLookThumbnail</key> + <data> + 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 + bmRpbgAAGoAAAAA4ZGVzYwAAGrgAAABnZHNjbQAAGyAAAAEAbW1vZAAAHCAAAAAoY3By + dAAAHEgAAAAkWFlaIAAAAAAAAHD5AAA5iwAAA75YWVogAAAAAAAAX00AALPQAAAWZVhZ + WiAAAAAAAAAmkAAAEqUAALkJWFlaIAAAAAAAAPPPAAEAAAABGGJzZjMyAAAAAAABDBoA + AAXA///y/wAAB2AAAP3O///7mP///ZYAAAP0AAC/TmN1cnYAAAAAAAAEAAAAAAUACgAP + ABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsA + kACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2gDgAOUA6gDwAPUA+wEBAQcBDAES + ARgBHgElASsBMQE4AT4BRQFLAVIBWQFgAWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAB + yAHQAdgB4AHpAfEB+gICAgsCFAIcAiUCLgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKr + ArUCvwLKAtQC3wLqAvQC/wMKAxUDIAMrAzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD + 0gPeA+sD+AQEBBEEHgQsBDkERgRUBGEEbwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUo + BTcFRwVWBWUFdAWEBZMFowWzBcMF0wXjBfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0G + zgbgBvIHAwcVBycHOQdMB14HcAeDB5YHqAe7B84H4Qf0CAgIGwgvCEIIVghqCH4Ikgim + CLoIzgjjCPcJDAkhCTYJSwlgCXUJigmgCbUJywngCfYKDAoiCjkKTwplCnwKkgqpCsAK + 1wruCwULHQs0C0sLYwt7C5MLqwvDC9sL8wwMDCQMPQxWDG4MhwyhDLoM0wztDQYNIA06 + DVQNbg2IDaINvA3XDfEODA4nDkIOXQ54DpMOrw7KDuYPAg8eDzoPVg9yD44Pqw/ID+QQ + ARAeEDsQWBB2EJMQsRDOEOwRChEoEUYRZBGDEaERwBHfEf4SHRI8ElsSehKaErkS2RL5 + ExkTORNZE3oTmhO7E9sT/BQdFD4UXxSBFKIUxBTlFQcVKRVLFW0VkBWyFdUV9xYaFj0W + YBaDFqcWyhbuFxIXNRdZF30XohfGF+oYDxg0GFkYfRijGMgY7RkTGTgZXhmEGaoZ0Bn2 + Gh0aQxpqGpAatxreGwYbLRtUG3wboxvLG/McGxxDHGwclBy9HOYdDh03HWAdih2zHd0e + Bh4wHloehB6uHtgfAx8tH1gfgx+uH9kgBCAwIFsghyCzIN4hCiE3IWMhjyG8IekiFSJC + InAinSLKIvgjJSNTI4EjryPdJAwkOiRpJJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMn + Ayc0J2UnlifHJ/goKihbKI0ovijwKSIpVSmHKbkp7CofKlIqhSq4KusrHitSK4Yruivu + LCIsViyKLL8s9C0pLV4tky3ILf0uMy5pLp4u1C8LL0Evdy+uL+QwGzBSMIkwwTD4MTAx + ZzGfMdcyDzJIMoAyuDLxMyozYzOcM9U0DzRINII0vDT2NTA1ajWlNd82GjZVNpA2yzcG + N0I3fje5N/U4MThtOKo45jkjOWA5nTnaOhc6VDqSOs87DTtLO4k7xzwGPEQ8gzzCPQE9 + QD1/Pb89/j4+Pn4+vj7+Pz8/fz/AQABAQUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEOb + Q95EIURlRKhE7EUwRXRFuEX8RkBGhUbKRw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVK + m0riSypLcUu4TABMSEyQTNhNIE1oTbFN+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5 + UgRST1KaUuVTMVN8U8hUFFRgVK1U+VVGVZJV31YsVnpWx1cUV2JXsFf+WExYmljpWThZ + hlnVWiRadFrDWxNbY1uyXANcU1yjXPRdRF2VXeZeN16JXtpfLF9+X9BgImB0YMdhGWFs + Yb9iEmJlYrljDGNgY7RkCGRcZLFlBWVaZa9mBGZZZq9nBGdaZ7BoBmhcaLJpCWlfabZq + DWpkarxrE2tra8NsG2xzbMttI218bdVuLm6HbuBvOm+Tb+1wR3ChcPtxVnGwcgtyZnLB + cxxzeHPTdC90i3TndUN1oHX8dll2tncTd3B3zngreIl453lFeaN6Anpger97Hnt9e9x8 + PHybfPt9W327fht+fH7cfz1/nn//gGCAwoEjgYWB54JJgquDDoNwg9OENoSZhPyFYIXD + hieGi4bvh1SHuIgdiIGI5olMibGKFop8iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9Nj7WQ + HZCFkO6RVpG/kiiSkZL6k2STzZQ3lKGVC5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+ + muubV5vEnDGcn50MnXmd555VnsOfMZ+goA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUyl + vKYupp+nEKeCp/SoZajYqUqpvKovqqKrFauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8 + sXGx57JdstOzSbO/tDa0rbUktZu2EraJtwG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9 + JL2evhm+k78Ov4nABMB/wPrBdsHxwm3C6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclH + ycbKRcrEy0PLwsxCzMHNQc3BzkLOws9Dz8PQRNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvW + Xtbi12XX6dht2PHZddn62n/bA9uI3A7ck90Z3Z7eJN6q3zHft+A+4MXhTOHT4lri4uNq + 4/LkeuUC5YvmE+ac5yXnr+g46MLpTOnW6mDq6ut16//siu0W7aHuLO6470Tv0PBc8Onx + dfIC8o/zHPOq9Df0xfVT9eH2b/b+94z4G/iq+Tn5yfpZ+uj7ePwI/Jn9Kf26/kv+3P9u + Y3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkA + XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDa + AOAA5QDqAPAA9QD7AQEBBwEMARIBGAEeASUBKwExATgBPgFFAUsBUgFZAWABZgFtAXUB + fAGDAYoBkgGZAaEBqAGwAbgBwAHIAdAB2AHgAekB8QH6AgICCwIUAhwCJQIuAjcCQAJK + AlMCXAJmAnACeQKDAo0ClwKhAqsCtQK/AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA00D + WQNlA3ADfAOIA5QDoAOsA7kDxQPSA94D6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSY + BKYEtATCBNEE3wTuBPwFCwUaBSgFNwVHBVYFZQV0BYQFkwWjBbMFwwXTBeMF8wYDBhQG + JAY1BkUGVgZnBngGiQaaBqsGvQbOBuAG8gcDBxUHJwc5B0wHXgdwB4MHlgeoB7sHzgfh + B/QICAgbCC8IQghWCGoIfgiSCKYIugjOCOMI9wkMCSEJNglLCWAJdQmKCaAJtQnLCeAJ + 9goMCiIKOQpPCmUKfAqSCqkKwArXCu4LBQsdCzQLSwtjC3sLkwurC8ML2wvzDAwMJAw9 + DFYMbgyHDKEMugzTDO0NBg0gDToNVA1uDYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO + 5g8CDx4POg9WD3IPjg+rD8gP5BABEB4QOxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHA + Ed8R/hIdEjwSWxJ6EpoSuRLZEvkTGRM5E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUV + BxUpFUsVbRWQFbIV1RX3FhoWPRZgFoMWpxbKFu4XEhc1F1kXfReiF8YX6hgPGDQYWRh9 + GKMYyBjtGRMZOBleGYQZqhnQGfYaHRpDGmoakBq3Gt4bBhstG1QbfBujG8sb8xwbHEMc + bByUHL0c5h0OHTcdYB2KHbMd3R4GHjAeWh6EHq4e2B8DHy0fWB+DH64f2SAEIDAgWyCH + ILMg3iEKITchYyGPIbwh6SIVIkIicCKdIsoi+CMlI1MjgSOvI90kDCQ6JGkklyTGJPUl + JCVUJYMlsyXiJhImQiZyJqMm0ycDJzQnZSeWJ8cn+CgqKFsojSi+KPApIilVKYcpuSns + Kh8qUiqFKrgq6yseK1Irhiu6K+4sIixWLIosvyz0LSktXi2TLcgt/S4zLmkuni7ULwsv + QS93L64v5DAbMFIwiTDBMPgxMDFnMZ8x1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8 + NPY1MDVqNaU13zYaNlU2kDbLNwY3Qjd+N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6 + zzsNO0s7iTvHPAY8RDyDPMI9AT1APX89vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEF + QUdBiEHKQgxCTkKRQtNDFkNYQ5tD3kQhRGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH + 3kgjSGlIr0j1STtJgUnHSg5KVUqbSuJLKktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7V + Tx5PZ0+xT/tQRVCPUNlRJFFuUblSBFJPUppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixW + elbHVxRXYlewV/5YTFiaWOlZOFmGWdVaJFp0WsNbE1tjW7JcA1xTXKNc9F1EXZVd5l43 + Xole2l8sX35f0GAiYHRgx2EZYWxhv2ISYmViuWMMY2BjtGQIZFxksWUFZVplr2YEZllm + r2cEZ1pnsGgGaFxosmkJaV9ptmoNamRqvGsTa2trw2wbbHNsy20jbXxt1W4ubodu4G86 + b5Nv7XBHcKFw+3FWcbByC3JmcsFzHHN4c9N0L3SLdOd1Q3Wgdfx2WXa2dxN3cHfOeCt4 + iXjneUV5o3oCemB6v3see3173Hw8fJt8+31bfbt+G358ftx/PX+ef/+AYIDCgSOBhYHn + gkmCq4MOg3CD04Q2hJmE/IVghcOGJ4aLhu+HVIe4iB2IgYjmiUyJsYoWinyK4otIi66M + FIx7jOKNSI2vjheOfo7lj02PtZAdkIWQ7pFWkb+SKJKRkvqTZJPNlDeUoZULlXWV4JZK + lrWXIJeLl/eYYpjOmTqZppoSmn6a65tXm8ScMZyfnQydeZ3nnlWew58xn6CgD6B9oOyh + W6HLojqiqqMao4qj+qRqpNulTKW8pi6mn6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6xv + rOOtVq3Lrj+us68or52wEbCHsPyxcbHnsl2y07NJs7+0NrSttSS1m7YStom3Abd5t/G4 + abjhuVq50rpLusS7Pru3vDC8qr0kvZ6+Gb6Tvw6/icAEwH/A+sF2wfHCbcLpw2bD4sRf + xNzFWcXWxlPG0cdOx8zISsjJyUfJxspFysTLQ8vCzELMwc1BzcHOQs7Cz0PPw9BE0MbR + R9HI0krSzNNO09DUU9TW1VjV29Ze1uLXZdfp2G3Y8dl12fraf9sD24jcDtyT3Rndnt4k + 3qrfMd+34D7gxeFM4dPiWuLi42rj8uR65QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr + /+yK7Rbtoe4s7rjvRO/Q8Fzw6fF18gLyj/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ + +ln66Pt4/Aj8mf0p/br+S/7c/25jdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgA + LQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACp + AK4AsgC3ALwAwQDGAMsA0ADVANoA4ADlAOoA8AD1APsBAQEHAQwBEgEYAR4BJQErATEB + OAE+AUUBSwFSAVkBYAFmAW0BdQF8AYMBigGSAZkBoQGoAbABuAHAAcgB0AHYAeAB6QHx + AfoCAgILAhQCHAIlAi4CNwJAAkoCUwJcAmYCcAJ5AoMCjQKXAqECqwK1Ar8CygLUAt8C + 6gL0Av8DCgMVAyADKwM3A0IDTQNZA2UDcAN8A4gDlAOgA6wDuQPFA9ID3gPrA/gEBAQR + BB4ELAQ5BEYEVARhBG8EfASKBJgEpgS0BMIE0QTfBO4E/AULBRoFKAU3BUcFVgVlBXQF + hAWTBaMFswXDBdMF4wXzBgMGFAYkBjUGRQZWBmcGeAaJBpoGqwa9Bs4G4AbyBwMHFQcn + BzkHTAdeB3AHgweWB6gHuwfOB+EH9AgICBsILwhCCFYIagh+CJIIpgi6CM4I4wj3CQwJ + IQk2CUsJYAl1CYoJoAm1CcsJ4An2CgwKIgo5Ck8KZQp8CpIKqQrACtcK7gsFCx0LNAtL + C2MLewuTC6sLwwvbC/MMDAwkDD0MVgxuDIcMoQy6DNMM7Q0GDSANOg1UDW4NiA2iDbwN + 1w3xDgwOJw5CDl0OeA6TDq8Oyg7mDwIPHg86D1YPcg+OD6sPyA/kEAEQHhA7EFgQdhCT + ELEQzhDsEQoRKBFGEWQRgxGhEcAR3xH+Eh0SPBJbEnoSmhK5EtkS+RMZEzkTWRN6E5oT + uxPbE/wUHRQ+FF8UgRSiFMQU5RUHFSkVSxVtFZAVshXVFfcWGhY9FmAWgxanFsoW7hcS + FzUXWRd9F6IXxhfqGA8YNBhZGH0YoxjIGO0ZExk4GV4ZhBmqGdAZ9hodGkMaahqQGrca + 3hsGGy0bVBt8G6MbyxvzHBscQxxsHJQcvRzmHQ4dNx1gHYodsx3dHgYeMB5aHoQerh7Y + HwMfLR9YH4Mfrh/ZIAQgMCBbIIcgsyDeIQohNyFjIY8hvCHpIhUiQiJwIp0iyiL4IyUj + UyOBI68j3SQMJDokaSSXJMYk9SUkJVQlgyWzJeImEiZCJnImoybTJwMnNCdlJ5Ynxyf4 + KCooWyiNKL4o8CkiKVUphym5KewqHypSKoUquCrrKx4rUiuGK7or7iwiLFYsiiy/LPQt + KS1eLZMtyC39LjMuaS6eLtQvCy9BL3cvri/kMBswUjCJMMEw+DEwMWcxnzHXMg8ySDKA + Mrgy8TMqM2MznDPVNA80SDSCNLw09jUwNWo1pTXfNho2VTaQNss3BjdCN343uTf1ODE4 + bTiqOOY5IzlgOZ052joXOlQ6kjrPOw07SzuJO8c8BjxEPIM8wj0BPUA9fz2/Pf4+Pj5+ + Pr4+/j8/P38/wEAAQEFAgkDEQQVBR0GIQcpCDEJOQpFC00MWQ1hDm0PeRCFEZUSoROxF + MEV0RbhF/EZARoVGykcOR1NHmUfeSCNIaUivSPVJO0mBScdKDkpVSptK4ksqS3FLuEwA + TEhMkEzYTSBNaE2xTfpOQk6MTtVPHk9nT7FP+1BFUI9Q2VEkUW5RuVIEUk9SmlLlUzFT + fFPIVBRUYFStVPlVRlWSVd9WLFZ6VsdXFFdiV7BX/lhMWJpY6Vk4WYZZ1VokWnRaw1sT + W2NbslwDXFNco1z0XURdlV3mXjdeiV7aXyxffl/QYCJgdGDHYRlhbGG/YhJiZWK5Ywxj + YGO0ZAhkXGSxZQVlWmWvZgRmWWavZwRnWmewaAZoXGiyaQlpX2m2ag1qZGq8axNra2vD + bBtsc2zLbSNtfG3Vbi5uh27gbzpvk2/tcEdwoXD7cVZxsHILcmZywXMcc3hz03QvdIt0 + 53VDdaB1/HZZdrZ3E3dwd854K3iJeOd5RXmjegJ6YHq/ex57fXvcfDx8m3z7fVt9u34b + fnx+3H89f55//4BggMKBI4GFgeeCSYKrgw6DcIPThDaEmYT8hWCFw4YnhouG74dUh7iI + HYiBiOaJTImxihaKfIrii0iLrowUjHuM4o1Ija+OF45+juWPTY+1kB2QhZDukVaRv5Io + kpGS+pNkk82UN5ShlQuVdZXglkqWtZcgl4uX95himM6ZOpmmmhKafprrm1ebxJwxnJ+d + DJ15neeeVZ7DnzGfoKAPoH2g7KFbocuiOqKqoxqjiqP6pGqk26VMpbymLqafpxCngqf0 + qGWo2KlKqbyqL6qiqxWriKv7rG+s461WrcuuP66zryivnbARsIew/LFxseeyXbLTs0mz + v7Q2tK21JLWbthK2ibcBt3m38bhpuOG5WrnSuku6xLs+u7e8MLyqvSS9nr4ZvpO/Dr+J + wATAf8D6wXbB8cJtwunDZsPixF/E3MVZxdbGU8bRx07HzMhKyMnJR8nGykXKxMtDy8LM + QszBzUHNwc5CzsLPQ8/D0ETQxtFH0cjSStLM007T0NRT1NbVWNXb1l7W4tdl1+nYbdjx + 2XXZ+tp/2wPbiNwO3JPdGd2e3iTeqt8x37fgPuDF4Uzh0+Ja4uLjauPy5HrlAuWL5hPm + nOcl56/oOOjC6Uzp1upg6urrdev/7IrtFu2h7izuuO9E79DwXPDp8XXyAvKP8xzzqvQ3 + 9MX1U/Xh9m/2/veM+Bv4qvk5+cn6Wfro+3j8CPyZ/Sn9uv5L/tz/bnBhcmEAAAAAAAMA + AAACZmYAAPKnAAANWQAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAA + CwNwYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3ZjZ3QAAAAAAAAAAQABAAAA + AAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAAMAAAo8AAAFRA + AABMwAAAm4AAACb3AAARewAAUAAAAFQAAAIzMwACMzMAAjMzZGVzYwAAAAAAAAANREVM + TCAyNzA3V0ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAABIA + AAAMbmxOTAAAABgAAADoZGFESwAAABgAAADocGxQTAAAABgAAADoZW5VUwAAABgAAADo + bmJOTwAAABgAAADoZnJGUgAAABgAAADocHRCUgAAABgAAADocHRQVAAAABgAAADoemhD + TgAAABgAAADoZXNFUwAAABgAAADoamFKUAAAABgAAADocnVSVQAAABgAAADoc3ZTRQAA + ABgAAADoemhUVwAAABgAAADoZGVERQAAABgAAADoZmlGSQAAABgAAADoaXRJVAAAABgA + AADoa29LUgAAABgAAADoAEQARQBMAEwAIAAyADcAMAA3AFcARgBQbW1vZAAAAAAAABCs + AADQEzBGOFPEIGYAAAAAAAAAAAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxl + LCBJbmMuLCAyMDA5AA== + </data> + <key>ReadOnly</key> + <string>NO</string> + <key>RowAlign</key> + <integer>1</integer> + <key>RowSpacing</key> + <real>36</real> + <key>SheetTitle</key> + <string>Canvas 1</string> + <key>SmartAlignmentGuidesActive</key> + <string>YES</string> + <key>SmartDistanceGuidesActive</key> + <string>YES</string> + <key>UniqueID</key> + <integer>1</integer> + <key>UseEntirePage</key> + <false/> + <key>VPages</key> + <integer>1</integer> + <key>WindowInfo</key> + <dict> + <key>CurrentSheet</key> + <integer>0</integer> + <key>ExpandedCanvases</key> + <array> + <dict> + <key>name</key> + <string>Canvas 1</string> + </dict> + </array> + <key>Frame</key> + <string>{{117, 235}, {710, 887}}</string> + <key>ListView</key> + <true/> + <key>OutlineWidth</key> + <integer>142</integer> + <key>RightSidebar</key> + <false/> + <key>ShowRuler</key> + <true/> + <key>Sidebar</key> + <true/> + <key>SidebarWidth</key> + <integer>120</integer> + <key>VisibleRegion</key> + <string>{{0, 0}, {575, 733}}</string> + <key>Zoom</key> + <real>1</real> + <key>ZoomValues</key> + <array> + <array> + <string>Canvas 1</string> + <real>1</real> + <real>1</real> + </array> + </array> + </dict> + <key>saveQuickLookFiles</key> + <string>YES</string> +</dict> +</plist> diff --git a/docs/PCHLayout.png b/docs/PCHLayout.png Binary files differnew file mode 100644 index 000000000000..4236de6c832b --- /dev/null +++ b/docs/PCHLayout.png diff --git a/include/clang/AST/Builtins.def b/include/clang/AST/Builtins.def index 671c4bd6cd4a..11f3264faa2d 100644 --- a/include/clang/AST/Builtins.def +++ b/include/clang/AST/Builtins.def @@ -356,7 +356,7 @@ LIBBUILTIN(fprintf, "iP*cC*.", "fp:1:", "stdio.h") LIBBUILTIN(snprintf, "ic*zcC*.", "fp:2:", "stdio.h") LIBBUILTIN(sprintf, "ic*cC*.", "fp:1:", "stdio.h") LIBBUILTIN(vprintf, "icC*a", "fP:0:", "stdio.h") -LIBBUILTIN(vfprintf, "iP*cC*a", "fP:1:", "stdio.h") +LIBBUILTIN(vfprintf, "i.", "fP:1:", "stdio.h") LIBBUILTIN(vsnprintf, "ic*zcC*a", "fP:2:", "stdio.h") LIBBUILTIN(vsprintf, "ic*cC*a", "fP:1:", "stdio.h") diff --git a/include/clang/Basic/DiagnosticGroups.td b/include/clang/Basic/DiagnosticGroups.td index 700826fa658f..7c6b090a33a0 100644 --- a/include/clang/Basic/DiagnosticGroups.td +++ b/include/clang/Basic/DiagnosticGroups.td @@ -30,6 +30,7 @@ def : DiagGroup<"conversion">; def : DiagGroup<"declaration-after-statement">; def : DiagGroup<"disabled-optimization">; def : DiagGroup<"discard-qual">; +def EmptyBody : DiagGroup<"empty-body">; def ExtraTokens : DiagGroup<"extra-tokens">; def FormatExtraArgs : DiagGroup<"format-extra-args">; diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 672e473678dd..41e73c178870 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -909,13 +909,13 @@ def err_array_init_list_required : Error< "initialization with '{...}' expected for array">; def err_excess_initializers : Error< "excess elements in %select{array|vector|scalar|union|struct}0 initializer">; -def warn_excess_initializers : Warning< +def warn_excess_initializers : ExtWarn< "excess elements in %select{array|vector|scalar|union|struct}0 initializer">; def err_excess_initializers_in_char_array_initializer : Error< "excess elements in char array initializer">; -def warn_excess_initializers_in_char_array_initializer : Warning< +def warn_excess_initializers_in_char_array_initializer : ExtWarn< "excess elements in char array initializer">; -def warn_initializer_string_for_char_array_too_long : Warning< +def warn_initializer_string_for_char_array_too_long : ExtWarn< "initializer-string for char array is too long">; def warn_braces_around_scalar_init : Warning< "braces around scalar initializer">; @@ -1029,7 +1029,7 @@ def err_offsetof_record_type : Error< def err_offsetof_array_type : Error<"offsetof requires array type, %0 invalid">; def ext_offsetof_extended_field_designator : Extension< "using extended field designator is an extension">; -def warn_offsetof_non_pod_type : Warning<"offset of on non-POD type %0">, +def warn_offsetof_non_pod_type : ExtWarn<"offset of on non-POD type %0">, InGroup<InvalidOffsetof>; def warn_floatingpoint_eq : Warning< @@ -1130,11 +1130,11 @@ def err_typecheck_sub_ptr_object : Error< "subtraction of pointer %0 requires pointee to be a complete object type">; def err_typecheck_sub_ptr_compatible : Error< "%0 and %1 are not pointers to compatible types">; -def ext_typecheck_comparison_of_pointer_integer : Warning< +def ext_typecheck_comparison_of_pointer_integer : ExtWarn< "comparison between pointer and integer (%0 and %1)">; -def ext_typecheck_comparison_of_distinct_pointers : Warning< +def ext_typecheck_comparison_of_distinct_pointers : ExtWarn< "comparison of distinct pointer types (%0 and %1)">; -def ext_typecheck_cond_incompatible_operands : Warning< +def ext_typecheck_cond_incompatible_operands : ExtWarn< "incompatible operand types (%0 and %1)">; def err_typecheck_comparison_of_distinct_pointers : Error< "comparison of distinct pointer types (%0 and %1)">; @@ -1443,9 +1443,9 @@ def err_typecheck_cond_incompatible_operands : Error< "incompatible operand types (%0 and %1)">; def err_cast_selector_expr : Error< "cannot type cast @selector expression">; -def warn_typecheck_cond_incompatible_pointers : Warning< +def warn_typecheck_cond_incompatible_pointers : ExtWarn< "pointer type mismatch (%0 and %1)">; -def warn_typecheck_cond_pointer_integer_mismatch : Warning< +def warn_typecheck_cond_pointer_integer_mismatch : ExtWarn< "pointer/integer type mismatch in conditional expression (%0 and %1)">; def err_typecheck_choose_expr_requires_constant : Error< "'__builtin_choose_expr' requires a constant expression">; @@ -1717,7 +1717,7 @@ def err_typecheck_statement_requires_integer : Error< def err_multiple_default_labels_defined : Error< "multiple default labels in one switch">; def warn_empty_if_body : Warning< - "if statement has empty body">; + "if statement has empty body">, InGroup<EmptyBody>; def err_va_start_used_in_non_variadic_function : Error< "'va_start' used in function with fixed args">; def warn_second_parameter_of_va_start_not_last_named_argument : Warning< @@ -1789,9 +1789,9 @@ def ext_invalid_sign_spec : Extension<"'%0' cannot be signed or unsigned">; def warn_receiver_forward_class : Warning< "receiver %0 is a forward class and corresponding @interface may not exist">; def note_method_sent_forward_class : Note<"method %0 is used for the forward class">; -def warn_missing_declspec : Warning< +def ext_missing_declspec : ExtWarn< "declaration specifier missing, defaulting to 'int'">; -def warn_missing_type_specifier : Warning< +def ext_missing_type_specifier : ExtWarn< "type specifier missing, defaults to 'int'">, InGroup<ImplicitInt>; def err_decimal_unsupported : Error< diff --git a/include/clang/Frontend/CompileOptions.h b/include/clang/Frontend/CompileOptions.h index 1af5e48ea119..34815c8cb54f 100644 --- a/include/clang/Frontend/CompileOptions.h +++ b/include/clang/Frontend/CompileOptions.h @@ -23,12 +23,17 @@ namespace clang { /// is optimized and passed to the backend. class CompileOptions { public: + enum InliningMethod { + NoInlining, // Perform no inlining whatsoever. + NormalInlining, // Use the standard function inlining pass. + OnlyAlwaysInlining // Only run the always inlining pass. + }; + unsigned OptimizationLevel : 3; /// The -O[0-4] option specified. unsigned OptimizeSize : 1; /// If -Os is specified. unsigned DebugInfo : 1; /// Should generate deubg info (-g). unsigned UnitAtATime : 1; /// Unused. For mirroring GCC /// optimization selection. - unsigned InlineFunctions : 1; /// Should functions be inlined? unsigned SimplifyLibCalls : 1; /// Should standard library calls be /// treated specially. unsigned UnrollLoops : 1; /// Control whether loops are unrolled. @@ -37,6 +42,9 @@ public: unsigned TimePasses : 1; /// Set when -ftime-report is enabled. unsigned NoCommon : 1; /// Set when -fno-common or C++ is enabled. + /// Inlining - The kind of inlining to perform. + InliningMethod Inlining; + /// CPU - An optional CPU to target. std::string CPU; @@ -50,10 +58,11 @@ public: OptimizeSize = 0; DebugInfo = 0; UnitAtATime = 1; - InlineFunctions = SimplifyLibCalls = UnrollLoops = 0; + SimplifyLibCalls = UnrollLoops = 0; VerifyModule = 1; TimePasses = 0; NoCommon = 0; + Inlining = NoInlining; } }; diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 29bca29f230c..3b405267e8de 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -2785,7 +2785,7 @@ QualType::GCAttrTypes ASTContext::getObjCGCAttrKind(const QualType &Ty) const { } // Non-pointers have none gc'able attribute regardless of the attribute // set on them. - else if (!isObjCObjectPointerType(Ty) && !Ty->isPointerType()) + else if (!Ty->isPointerType() && !isObjCObjectPointerType(Ty)) return QualType::GCNone; } return GCAttrs; @@ -3033,26 +3033,52 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) { if (RHSClass == Type::ExtQual) { QualType::GCAttrTypes GCAttr = RHSCan.getObjCGCAttr(); if (GCAttr != QualType::GCNone) { + QualType::GCAttrTypes GCLHSAttr = LHSCan.getObjCGCAttr(); + // __weak attribute must appear on both declarations. + // __strong attribue is redundant if other decl is an objective-c + // object pointer (or decorated with __strong attribute); otherwise + // issue error. + if ((GCAttr == QualType::Weak && GCLHSAttr != GCAttr) || + (GCAttr == QualType::Strong && GCLHSAttr != GCAttr && + LHSCan->isPointerType() && !isObjCObjectPointerType(LHSCan) && + !isObjCIdStructType(LHSCan->getAsPointerType()->getPointeeType()))) + return QualType(); + RHS = QualType(cast<ExtQualType>(RHS.getDesugaredType())->getBaseType(), RHS.getCVRQualifiers()); QualType Result = mergeTypes(LHS, RHS); - if (Result.getObjCGCAttr() == QualType::GCNone) - Result = getObjCGCQualType(Result, GCAttr); - else if (Result.getObjCGCAttr() != GCAttr) - Result = QualType(); + if (!Result.isNull()) { + if (Result.getObjCGCAttr() == QualType::GCNone) + Result = getObjCGCQualType(Result, GCAttr); + else if (Result.getObjCGCAttr() != GCAttr) + Result = QualType(); + } return Result; } } if (LHSClass == Type::ExtQual) { QualType::GCAttrTypes GCAttr = LHSCan.getObjCGCAttr(); if (GCAttr != QualType::GCNone) { + QualType::GCAttrTypes GCRHSAttr = RHSCan.getObjCGCAttr(); + // __weak attribute must appear on both declarations. __strong + // __strong attribue is redundant if other decl is an objective-c + // object pointer (or decorated with __strong attribute); otherwise + // issue error. + if ((GCAttr == QualType::Weak && GCRHSAttr != GCAttr) || + (GCAttr == QualType::Strong && GCRHSAttr != GCAttr && + RHSCan->isPointerType() && !isObjCObjectPointerType(RHSCan) && + !isObjCIdStructType(RHSCan->getAsPointerType()->getPointeeType()))) + return QualType(); + LHS = QualType(cast<ExtQualType>(LHS.getDesugaredType())->getBaseType(), LHS.getCVRQualifiers()); QualType Result = mergeTypes(LHS, RHS); - if (Result.getObjCGCAttr() == QualType::GCNone) - Result = getObjCGCQualType(Result, GCAttr); - else if (Result.getObjCGCAttr() != GCAttr) - Result = QualType(); + if (!Result.isNull()) { + if (Result.getObjCGCAttr() == QualType::GCNone) + Result = getObjCGCQualType(Result, GCAttr); + else if (Result.getObjCGCAttr() != GCAttr) + Result = QualType(); + } return Result; } } diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index b2ee58f3f355..f573744083a4 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -1410,7 +1410,7 @@ void FunctionProtoType::getAsStringInternal(std::string &S, const PrintingPolicy if (getNumArgs()) S += ", "; S += "..."; - } else if (getNumArgs() == 0) { + } else if (getNumArgs() == 0 && !Policy.CPlusPlus) { // Do not emit int() if we have a proto, emit 'int(void)'. S += "void"; } diff --git a/lib/Frontend/Backend.cpp b/lib/Frontend/Backend.cpp index 44aa3a81a96e..697ba941af23 100644 --- a/lib/Frontend/Backend.cpp +++ b/lib/Frontend/Backend.cpp @@ -294,10 +294,16 @@ void BackendConsumer::CreatePasses() { PM->add(createPruneEHPass()); // Remove dead EH info PM->add(createFunctionAttrsPass()); // Set readonly/readnone attrs } - if (CompileOpts.InlineFunctions) + switch (CompileOpts.Inlining) { + case CompileOptions::NoInlining: + break; + case CompileOptions::NormalInlining: PM->add(createFunctionInliningPass()); // Inline small functions - else + break; + case CompileOptions::OnlyAlwaysInlining: PM->add(createAlwaysInlinerPass()); // Respect always_inline + break; + } if (CompileOpts.OptimizationLevel > 2) PM->add(createArgumentPromotionPass()); // Scalarize uninlined fn args if (CompileOpts.SimplifyLibCalls) @@ -341,7 +347,16 @@ void BackendConsumer::CreatePasses() { if (CompileOpts.OptimizationLevel > 1 && CompileOpts.UnitAtATime) PM->add(createConstantMergePass()); // Merge dup global constants } else { - PM->add(createAlwaysInlinerPass()); + switch (CompileOpts.Inlining) { + case CompileOptions::NoInlining: + break; + case CompileOptions::NormalInlining: + PM->add(createFunctionInliningPass()); // Inline small functions + break; + case CompileOptions::OnlyAlwaysInlining: + PM->add(createAlwaysInlinerPass()); // Respect always_inline + break; + } } } diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 9f9b3b4e09c6..80e863bd7110 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -347,6 +347,7 @@ void PCHWriter::WriteBlockInfoBlock() { // PCH Top-Level Block. BLOCK(PCH_BLOCK); + RECORD(ORIGINAL_FILE_NAME); RECORD(TYPE_OFFSET); RECORD(DECL_OFFSET); RECORD(LANGUAGE_OPTIONS); diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 1212d070f699..e3cea5be4283 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -60,7 +60,7 @@ static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t Val, // Not va_list. Ty.getUnqualifiedType() != Context.getBuiltinVaListType()) { S = "'"+S+"' (aka '"; - S += DesugaredTy.getAsString(); + S += DesugaredTy.getAsString(Context.PrintingPolicy); S += "')"; Output.append(S.begin(), S.end()); return; diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 81ac21123e91..cd19d97c5be9 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -107,7 +107,7 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS, if (DS.isEmpty()) { if (DeclLoc.isInvalid()) DeclLoc = DS.getSourceRange().getBegin(); - Diag(DeclLoc, diag::warn_missing_declspec) + Diag(DeclLoc, diag::ext_missing_declspec) << DS.getSourceRange() << CodeModificationHint::CreateInsertion(DS.getSourceRange().getBegin(), "int"); @@ -125,7 +125,7 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS, Diag(DeclLoc, diag::err_missing_type_specifier) << DS.getSourceRange(); else - Diag(DeclLoc, diag::warn_missing_type_specifier) + Diag(DeclLoc, diag::ext_missing_type_specifier) << DS.getSourceRange(); // FIXME: If we could guarantee that the result would be well-formed, it diff --git a/test/CodeGen/always_inline.c b/test/CodeGen/always_inline.c new file mode 100644 index 000000000000..d159bd2233e4 --- /dev/null +++ b/test/CodeGen/always_inline.c @@ -0,0 +1,13 @@ +// RUN: clang-cc -emit-llvm -o %t %s && +// RUN: grep '@f0' %t | count 0 && +// RUN: clang-cc -disable-llvm-optzns -emit-llvm -o %t %s && +// RUN: grep '@f0' %t | count 2 + +//static int f0() { +static int __attribute__((always_inline)) f0() { + return 1; +} + +int f1() { + return f0(); +} diff --git a/test/Parser/cxx-ambig-paren-expr.cpp b/test/Parser/cxx-ambig-paren-expr.cpp index 6f23b35d3e6b..1712d849d516 100644 --- a/test/Parser/cxx-ambig-paren-expr.cpp +++ b/test/Parser/cxx-ambig-paren-expr.cpp @@ -5,9 +5,9 @@ void f() { int x, *px; // Type id. - (T())x; // expected-error {{used type 'T (void)'}} - (T())+x; // expected-error {{used type 'T (void)'}} - (T())*px; // expected-error {{used type 'T (void)'}} + (T())x; // expected-error {{used type 'T ()'}} + (T())+x; // expected-error {{used type 'T ()'}} + (T())*px; // expected-error {{used type 'T ()'}} // Expression. x = (T()); diff --git a/test/Sema/vfprintf-invalid-redecl.c b/test/Sema/vfprintf-invalid-redecl.c new file mode 100644 index 000000000000..02c5061d8cd5 --- /dev/null +++ b/test/Sema/vfprintf-invalid-redecl.c @@ -0,0 +1,6 @@ +// RUN: clang-cc %s -fsyntax-only -verify +// PR4290 + +// The following declaration is not compatible with vfprintf(), but make +// sure this isn't an error: autoconf expects this to build. +char vfprintf(); // expected-warning {{incompatible redeclaration of library function 'vfprintf'}} expected-note {{'vfprintf' is a builtin}} diff --git a/test/Sema/vfprintf-valid-redecl.c b/test/Sema/vfprintf-valid-redecl.c new file mode 100644 index 000000000000..cc8e2c40d30b --- /dev/null +++ b/test/Sema/vfprintf-valid-redecl.c @@ -0,0 +1,6 @@ +// RUN: clang-cc %s -fsyntax-only -pedantic -verify +// PR4290 + +// The following declaration is compatible with vfprintf, so we shouldn't +// warn. +int vfprintf(); diff --git a/test/SemaCXX/const-cast.cpp b/test/SemaCXX/const-cast.cpp index 39d61db0dc94..ee0048bd73be 100644 --- a/test/SemaCXX/const-cast.cpp +++ b/test/SemaCXX/const-cast.cpp @@ -58,6 +58,6 @@ short *bad_const_cast_test(char const *volatile *const volatile *var) // Function pointers. f fp2 = const_cast<f>(fp1); // expected-error {{const_cast to 'f' (aka 'int (*)(int)'), which is not a reference, pointer-to-object, or pointer-to-data-member}} void (A::*mfn)() = 0; - (void)const_cast<void (A::*)()>(mfn); // expected-error {{const_cast to 'void (struct A::*)(void)', which is not a reference, pointer-to-object, or pointer-to-data-member}} + (void)const_cast<void (A::*)()>(mfn); // expected-error {{const_cast to 'void (struct A::*)()', which is not a reference, pointer-to-object, or pointer-to-data-member}} return **var3; } diff --git a/test/SemaCXX/decl-expr-ambiguity.cpp b/test/SemaCXX/decl-expr-ambiguity.cpp index bff333464b91..05e25e9bb868 100644 --- a/test/SemaCXX/decl-expr-ambiguity.cpp +++ b/test/SemaCXX/decl-expr-ambiguity.cpp @@ -19,7 +19,7 @@ void f() { (int(1)); // expected-warning {{expression result unused}} // type-id - (int())1; // expected-error {{used type 'int (void)' where arithmetic or pointer type is required}} + (int())1; // expected-error {{used type 'int ()' where arithmetic or pointer type is required}} // Declarations. int fd(T(a)); // expected-warning {{parentheses were disambiguated as a function declarator}} diff --git a/test/SemaCXX/member-expr.cpp b/test/SemaCXX/member-expr.cpp index 60ee10df7f6a..28b1224d8d8f 100644 --- a/test/SemaCXX/member-expr.cpp +++ b/test/SemaCXX/member-expr.cpp @@ -28,6 +28,6 @@ struct B { A *f0(); }; int f0(B *b) { - return b->f0->f0; // expected-error{{member reference base type 'struct A *(void)' is not a structure or union}} \ + return b->f0->f0; // expected-error{{member reference base type 'struct A *()' is not a structure or union}} \ // expected-note{{perhaps you meant to call this function}} } diff --git a/test/SemaCXX/reinterpret-cast.cpp b/test/SemaCXX/reinterpret-cast.cpp index fd5ca8cf39d4..91b72cc02207 100644 --- a/test/SemaCXX/reinterpret-cast.cpp +++ b/test/SemaCXX/reinterpret-cast.cpp @@ -80,11 +80,11 @@ void memptrs() void (structure::*psf)() = 0; (void)reinterpret_cast<int (structure::*)()>(psf); - (void)reinterpret_cast<void (structure::*)()>(psi); // expected-error {{reinterpret_cast from 'int const struct structure::*' to 'void (struct structure::*)(void)' is not allowed}} - (void)reinterpret_cast<int structure::*>(psf); // expected-error {{reinterpret_cast from 'void (struct structure::*)(void)' to 'int struct structure::*' is not allowed}} + (void)reinterpret_cast<void (structure::*)()>(psi); // expected-error {{reinterpret_cast from 'int const struct structure::*' to 'void (struct structure::*)()' is not allowed}} + (void)reinterpret_cast<int structure::*>(psf); // expected-error {{reinterpret_cast from 'void (struct structure::*)()' to 'int struct structure::*' is not allowed}} // Cannot cast from integers to member pointers, not even the null pointer // literal. - (void)reinterpret_cast<void (structure::*)()>(0); // expected-error {{reinterpret_cast from 'int' to 'void (struct structure::*)(void)' is not allowed}} + (void)reinterpret_cast<void (structure::*)()>(0); // expected-error {{reinterpret_cast from 'int' to 'void (struct structure::*)()' is not allowed}} (void)reinterpret_cast<int structure::*>(0); // expected-error {{reinterpret_cast from 'int' to 'int struct structure::*' is not allowed}} } diff --git a/test/SemaCXX/static-cast.cpp b/test/SemaCXX/static-cast.cpp index 8399e77085b3..b5c515d5e161 100644 --- a/test/SemaCXX/static-cast.cpp +++ b/test/SemaCXX/static-cast.cpp @@ -115,7 +115,7 @@ void t_529_10() // Bad code below (void)static_cast<int*>((const void*)0); // expected-error {{static_cast from 'void const *' to 'int *' casts away constness}} - (void)static_cast<void (*)()>((void*)0); // expected-error {{static_cast from 'void *' to 'void (*)(void)' is not allowed}} + (void)static_cast<void (*)()>((void*)0); // expected-error {{static_cast from 'void *' to 'void (*)()' is not allowed}} } // Member pointer upcast. diff --git a/test/SemaObjC/objc2-merge-gc-attribue-decl.m b/test/SemaObjC/objc2-merge-gc-attribue-decl.m index 4e3b3ec7a4dd..9dae1efdcd2a 100644 --- a/test/SemaObjC/objc2-merge-gc-attribue-decl.m +++ b/test/SemaObjC/objc2-merge-gc-attribue-decl.m @@ -10,3 +10,21 @@ extern id p1; extern id CFRunLoopGetMain(); extern __strong id CFRunLoopGetMain(); +extern __weak id WLoopGetMain(); // expected-note {{previous declaration is here}} +extern id WLoopGetMain(); // expected-error {{conflicting types for 'WLoopGetMain'}} + +extern id p3; // expected-note {{previous definition is here}} +extern __weak id p3; // expected-error {{redefinition of 'p3' with a different type}} + +extern void *p4; // expected-note {{previous definition is here}} +extern void * __strong p4; // expected-error {{redefinition of 'p4' with a different type}} + +extern id p5; +extern __strong id p5; + +extern char* __strong p6; // expected-note {{previous definition is here}} +extern char* p6; // expected-error {{redefinition of 'p6' with a different type}} + +// FIXME. We do not issue error here because we don't put the attribute on the pointer type. +extern __strong char* p7; +extern char* p7; diff --git a/test/SemaObjCXX/blocks.mm b/test/SemaObjCXX/blocks.mm index 3d421a878e59..e3304a41b730 100644 --- a/test/SemaObjCXX/blocks.mm +++ b/test/SemaObjCXX/blocks.mm @@ -3,12 +3,12 @@ void bar(id(^)(void)); void foo(id <NSObject>(^objectCreationBlock)(void)) { - return bar(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (^)(void)', expected 'id<NSObject> (^)(void)'}} + return bar(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (^)()', expected 'id<NSObject> (^)()'}} } void bar2(id(*)(void)); void foo2(id <NSObject>(*objectCreationBlock)(void)) { - return bar2(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (*)(void)', expected 'id<NSObject> (*)(void)'}} + return bar2(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (*)()', expected 'id<NSObject> (*)()'}} } void bar3(id(*)()); // expected-note{{candidate function}} diff --git a/test/SemaTemplate/temp_arg_nontype.cpp b/test/SemaTemplate/temp_arg_nontype.cpp index fe18fe657c16..534030dba0ea 100644 --- a/test/SemaTemplate/temp_arg_nontype.cpp +++ b/test/SemaTemplate/temp_arg_nontype.cpp @@ -3,7 +3,7 @@ template<int N> struct A; // expected-note 5{{template parameter is declared her A<0> *a0; -A<int()> *a1; // expected-error{{template argument for non-type template parameter is treated as type 'int (void)'}} +A<int()> *a1; // expected-error{{template argument for non-type template parameter is treated as type 'int ()'}} A<int> *a2; // expected-error{{template argument for non-type template parameter must be an expression}} diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp index a0ccafa9afce..0e0a07275892 100644 --- a/tools/clang-cc/clang-cc.cpp +++ b/tools/clang-cc/clang-cc.cpp @@ -667,6 +667,10 @@ static llvm::cl::opt<bool> OptSize("Os", llvm::cl::desc("Optimize for size")); static llvm::cl::opt<bool> +DisableLLVMOptimizations("disable-llvm-optzns", + llvm::cl::desc("Don't run LLVM optimization passes")); + +static llvm::cl::opt<bool> NoCommon("fno-common", llvm::cl::desc("Compile common globals like normal definitions"), llvm::cl::ValueDisallowed); @@ -1420,16 +1424,26 @@ static void InitializeCompileOptions(CompileOptions &Opts, const llvm::StringMap<bool> &Features) { Opts.OptimizeSize = OptSize; Opts.DebugInfo = GenerateDebugInfo; - if (OptSize) { - // -Os implies -O2 - // FIXME: Diagnose conflicting options. - Opts.OptimizationLevel = 2; + + if (DisableLLVMOptimizations) { + Opts.OptimizationLevel = 0; + Opts.Inlining = CompileOptions::NoInlining; } else { - Opts.OptimizationLevel = OptLevel; + if (OptSize) { + // -Os implies -O2 + Opts.OptimizationLevel = 2; + } else { + Opts.OptimizationLevel = OptLevel; + } + + // We must always run at least the always inlining pass. + if (Opts.OptimizationLevel > 1) + Opts.Inlining = CompileOptions::NormalInlining; + else + Opts.Inlining = CompileOptions::OnlyAlwaysInlining; } // FIXME: There are llvm-gcc options to control these selectively. - Opts.InlineFunctions = (Opts.OptimizationLevel > 1); Opts.UnrollLoops = (Opts.OptimizationLevel > 1 && !OptSize); Opts.SimplifyLibCalls = !LangOpts.NoBuiltin; |