<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE TIP SYSTEM "http://www.tcl.tk/cgi-bin/tct/tip/tipxml.dtd">
<!-- Converted at Sun May 26 09:08:25 GMT 2013 -->
<!-- TIP AutoGenerator - written by Donal K. Fellows -->

<TIP number='268'>
<header><title>Enhance &apos;package&apos; Version Handling</title><author address="mailto:jeffh@activestate.com">Jeff Hobbs</author><author address="mailto:hlavana@cisco.com">Hemang Lavana</author><author address="mailto:andreask@activestate.com">Andreas Kupries</author><author address="mailto:dgp@users.sf.net">Don Porter</author><status type='project' state='final' tclversion="8.5" vote='after'>$Revision: 1.12 $</status><history></history><created day='28' month='apr' year='2006' /></header>
<abstract>This TIP proposes enhancing the Tcl <emph style="bold">package</emph> command to understand version numbers containing &quot;a&quot;, and &quot;b&quot; and extend the semantics of <emph style="bold">package require</emph> to allow multiple requirements and various types of ranges of versions.</abstract>
<body><section title="Rationale">
<para>The current Tcl <emph style="bold">package</emph> command is limited to understanding package versioning based strictly on an infinite number of dot-separated positive integers. Regardless, Tcl extensions and the core itself use version numbers that have &quot;a&quot; for alpha and &quot;b&quot; for beta. This proposal seeks to make those identifiers properly understood by Tcl&apos;s <emph style="bold">package version</emph> semantics. It also extends the logic to allow ranges. This allows users to exclude package versions with known bugs/incompatibilities as well as accepting a range of major versions, which was previously only possibly through multiple <emph style="bold">package require</emph> calls and <emph style="bold">catch</emph>. The addition of <emph style="bold">package prefer</emph> is created to handle nuances in how the new package requirements mechanism interprets alpha/beta versions, because sometimes you want the bleeding edge version of a package, and other times you want something you can depend on.</para>
</section>
<section title="Specification">
<para><emph style="bold">Current version specification:</emph></para>
<para>(Summary of <url ref="http://www.tcl.tk/man/tcl8.4/TclCmd/package.htm#M15"/>)</para>
<para>Version numbers consist of one or more decimal numbers separated by dots, such as 2 or 1.162 or 3.1.13.1. The first number is called the <emph style="italic">major</emph> version number. Larger numbers correspond to later versions of a package, with leftmost numbers having greater significance. For example, version 2.1 is later than 1.3 and version 3.4.6 is later than 3.3.5. Missing fields are equivalent to zeroes: version 1.3 is the same as version 1.3.0 and 1.3.0.0, so it is earlier than 1.3.1 or 1.3.0.2.</para>
<para><emph style="bold">Proposed version specification adds:</emph></para>
<para>In addition, the letters &apos;a&apos; (alpha) and/or &apos;b&apos; (beta) may appear exactly once to replace a dot for separation. These letters semantically add a negative specifier into the version, where &apos;a&apos; is -2, and &apos;b&apos; is -1. Each may be specified only once, and &apos;a&apos; or &apos;b&apos; are mutually exclusive in a specifier. Thus 1.3a1 becomes (semantically) 1.3.-2.1, 1.3b1 is 1.3.-1.1. Negative numbers are not directly allowed in version specifiers.</para>
<para>A version number not containing the letters &apos;a&apos; or &apos;b&apos; as specified above is called a <emph style="italic">stable</emph> version, whereas presence of the letters causes the version to be called is <emph style="italic">unstable</emph>.</para>
<para>The syntax of [package vsatisfies] is extended to</para>
<quote><emph style="bold">package vsatisfies</emph> <emph style="italic">version requirement</emph> ?<emph style="italic">requirement</emph> ...?</quote>
<para>where each <emph style="italic">requirement</emph> is is allowed to have any of the forms:</para>
<enumerate><item.e index='1'><para>min</para></item.e><item.e index='2'><para>min-</para></item.e><item.e index='3'><para>min-max</para></item.e></enumerate>
<para>where &quot;min&quot; and &quot;max&quot; are valid version numbers. The current syntax is case 1, and the addition of cases 2 and 3 does not interfere with keeping backward compatibility.</para>
<para>These three forms are called, in the order as listed above:</para>
<enumerate><item.e index='1'><para>&quot;min-bounded&quot;</para></item.e><item.e index='2'><para>&quot;min-unbound&quot;</para></item.e><item.e index='3'><para>&quot;bounded&quot;</para></item.e></enumerate>
<para>Given the above the <emph style="bold">package vsatisfies</emph> functions like this:</para>
<itemize><item.i><para>The version has to pass at least one of the listed requirements to be satisfactory.</para></item.i><item.i><para>A version satisfies a &quot;bounded&quot; requirement when</para><itemize><item.i><para>For min equal to the max if, and only if the version is equal to the min.</para></item.i><item.i><para>Otherwise if, and only if the version is greater than or equal to the min, and less than the max, where both min and max have been extended internally with &apos;a0&apos;. NOTE: min is <emph style="italic">inclusive</emph>, max is <emph style="italic">exclusive</emph>.</para></item.i></itemize></item.i><item.i><para>A &quot;min-bounded&quot; requirement is a &quot;bounded&quot; requirement in disguise, with the max part implicitly specified as the next higher major version number of the min part. A version satisfies it per the rules above.</para></item.i><item.i><para>A version satisfies a &quot;min-unbound&quot; requirement if, and only if it is greater than or equal to the min, where the min has been padded internally with &apos;a0&apos;. There is no constraint to a max.</para></item.i></itemize>
<para>A new subcommand [package prefer] is added with syntax:</para>
<quote><emph style="bold">package prefer</emph> ?<emph style="bold">latest</emph>|<emph style="bold">stable</emph>?</quote>
<para>With no arguments, <emph style="bold">package prefer</emph> returns either &quot;latest&quot; or &quot;stable&quot;, whichever describes the current mode of selection logic used by <emph style="bold">package require</emph>.</para>
<para>When passed the argument &quot;latest&quot;, it sets the selection logic mode to &quot;latest&quot;.</para>
<para>When passed the argument &quot;stable&quot;, if the mode is already &quot;stable&quot;, that value is kept. If the mode is already &quot;latest&quot;, then the attempt to set it back to &quot;stable&quot; is ineffective and the mode value remains &quot;latest&quot; [*].</para>
<para>When passed any other value as an argument, raise an invalid argument error.</para>
<para>When a Tcl_Interp is created, its initial selection mode value is set to &quot;stable&quot; unless the environment variable <emph style="italic">TCL_PKG_PREFER_LATEST</emph> is set. If that environment variable is defined (with any value) then the initial (and permanent) selection mode value is set to &quot;latest&quot;.</para>
<para>The syntax of <emph style="bold">package require</emph> is changed to:</para>
<quote><emph style="bold">package require</emph> ?<emph style="bold">-exact</emph>? <emph style="italic">package</emph> ?<emph style="italic">requirement</emph> ...?</quote>
<para>and its package selection logic is modified to both agree with <emph style="bold">package vsatisfies</emph> and to additionally support a multi-mode selection logic based on the result of <emph style="bold">package prefer</emph>.</para>
<para>The requirements arguments are of the same form as accepted by <emph style="bold">package vsatisfies</emph>.</para>
<para>The logic is:</para>
<itemize><item.i><para>In the &quot;<emph style="bold">stable</emph>&quot; selection mode the command will select the highest stable version satisfying the requirements, if any. If no stable version satisfies the requirements, the highest unstable version satisfying the requirements will be selected. This implements the behaviour that</para><verbatim><vline encoding='base64'>IHBhY2thZ2UgcmVxdWlyZSBmb28gMS41LjM=</vline></verbatim><para>will load version 1.5.4 in preference to version 1.6b2.</para><para>By default</para><verbatim><vline encoding='base64'>IHBhY2thZ2UgcmVxdWlyZSBmb28gMS41YjM=</vline></verbatim><para>will also load version 1.5.4 in preference to version 1.6b2, while still accepting 1.5b3 if it is the best available. It will also accept and load version 1.6b2 if no stable version that satisfies the requirement is available.</para><para>This fallback strategy employed for &quot;<emph style="bold">stable</emph>&quot;, i.e. the ability to accept things outside of the declared preference makes programs combining several packages less fragile. This comes directly from implementing things as a preference to apply when possible, and not as a threshold that rejects nonpreferred, yet satisfactory solutions.</para></item.i><item.i><para>In the &quot;latest&quot; selection mode the command will accept the highest version satisfying all the requirements, regardless of its stableness.</para></item.i></itemize>
<para>All other <emph style="bold">package</emph> subcommands that accept a version number argument are also revised to accept the expanded set of legal version numbers.</para>
<para>The calls to <emph style="italic">Tcl_PkgProvide()</emph> in both Tcl and Tk are revised to pass in TCL_PATCH_LEVEL and TK_PATCH_LEVEL where they currently pass in TCL_VERSION and TK_VERSION. <emph style="bold">info tclversion</emph>, <emph style="bold">info patchlevel</emph>, <emph style="bold">$::tcl_version</emph>, <emph style="bold">$::tcl_patchLevel</emph>, <emph style="bold">$::tk_version</emph>, and <emph style="bold">$::tk_patchLevel</emph> are left unchanged.</para>
<para>A new public function <emph style="italic">Tcl_PkgRequireProc</emph> is provided, which has the signature:</para>
<quote>int <emph style="bold">Tcl_PkgRequireProc</emph>(Tcl_Interp *<emph style="italic">interp</emph>, CONST char *<emph style="italic">name</emph>, int <emph style="italic">objc</emph>, Tcl_Obj *CONST <emph style="italic">objv</emph>[], ClientData *<emph style="italic">clientDataPtr</emph>)</quote>
<para>This function implements <emph style="bold">package require</emph> at the C level. The existing functions <emph style="italic">Tcl_PkgRequire(Ex)</emph> are re-implemented in terms of this function. It returns a standard Tcl error code, leaving either an error message (TCL_ERROR), or the version of the found package (TCL_OK) in the result area of the <emph style="italic">interp</emph> argument.</para>
<para>The API between <emph style="italic">Tcl_PkgRequire*</emph> and the package unknown handler is changed as well. The unknown handler now has the signature:</para>
<quote><emph style="italic">unknown name</emph> ?<emph style="italic">requirement...</emph>?</quote>
<para>All existing unknown handlers (init.tcl, tm.tcl) are changed to this API.</para>
<subsection title="Examples">
<para>Valid version numbers:</para>
<verbatim><vline encoding='base64'>IDEuM2Ex</vline></verbatim>
<para>Invalid version numbers:</para>
<verbatim><vline encoding='base64'>IDEuM2E=</vline><vline encoding='base64'>IDEuM2ExYjI=</vline><vline encoding='base64'>IDEuMy5hMQ==</vline></verbatim>
</subsection>
</section>
<section title="Discussion">
<para>Tcl RFE 219296 proposes similar support with the addition of a <emph style="bold">threshold</emph> method to <emph style="bold">package</emph>. This proposal operates by modelling the <emph style="bold">a</emph>, and <emph style="bold">b</emph> specifiers as negative version specifiers.</para>
<para>A disadvantage of this proposal compared to the previous one is for folks trying to do integration testing of unstable packages. They will be required to take the additional step of either defining the environment variable TCL_PKG_PREFER_LATEST or call</para>
<verbatim><vline encoding='base64'>IHBhY2thZ2UgcHJlZmVyIGxhdGVzdA==</vline></verbatim>
<para>in an initialization script in order to overcome the default preference that would otherwise fail to load the code that needs testing. It doesn&apos;t seem too great a burden, but anything that makes testing of untable packages more difficult means that on the margin there will be less testing of them. The impact of that is worth pondering a bit.</para>
<para>An important thing made possible is the sequence:</para>
<verbatim><vline encoding='base64'>IHBhY2thZ2UgcHJvdmlkZSBUY2wgOC41YTU=</vline><vline encoding='base64'>IHBhY2thZ2UgcmVxdWlyZSBUY2wgOC41</vline></verbatim>
<para>so existing scripts with [package require Tcl 8.5] aren&apos;t broken by a Tcl 8.5a5 release. This support comes from the rules for interpreting a requirement&apos;s implicit demands beyond the fields it explicitly names. A requirement of 8.5 gets interpreted as equivalent to 8.5a0 and not equivalent to 8.5.0. Note the language about <emph style="italic">internally extended with &apos;a0&apos; </emph> in the rules of <emph style="bold">package vsatisfies</emph>.</para>
</section>
<section title="Footnotes">
<para>[*] Yes, this means <emph style="bold">package prefer stable</emph> is a verbose no-op. Sometimes a verbose no-op can help code readability. I also think documenting a setter/getter that is a no-op for some set values is easier than explaining why the set of valid returns from the getter differs from the set of acceptable arguments to the setter. Ability to do things like:</para>
<verbatim><vline encoding='base64'>IGludGVycCBjcmVhdGUgaQ==</vline><vline encoding='base64'>IGkgZXZhbCBbbGlzdCBwYWNrYWdlIHByZWZlciBbcGFja2FnZSBwcmVmZXJdXQ==</vline></verbatim>
<para>is a factor here as well.</para>
<para>Lots of discussion and rationale ensued on the tcl-core mailing list. Lars Hellström provided a good interpretive synopsis [<url ref="http://aspn.activestate.com/ASPN/Mail/Message/tcl-core/3214264"/>].</para>
</section>
<section title="Reference Implementation">
<para>C implementation, see SF Patch 1520767[<url ref="http://sourceforge.net/support/tracker.php?aid=1520767"/>].</para>
<para>A reference implementation written in Tcl now follows.</para>
<verbatim><vline encoding='base64'>IHByb2MgaW50TGlzdCB7dmVyc2lvbn0gew==</vline><vline encoding='base64'>ICAgICMgQ29udmVydCBhIHZlcnNpb24gbnVtYmVyIHRvIGFuIGVxdWl2YWxlbnQgbGlzdCBvZiBpbnRlZ2Vycw==</vline><vline encoding='base64'>ICAgICMgUmFpc2UgZXJyb3IgZm9yIGludmFsaWQgdmVyc2lvbiBudW1iZXI=</vline><vline encoding='base64'></vline><vline encoding='base64'>ICAgIGlmIHskdmVyc2lvbiBlcSB7fSB8fCBbc3RyaW5nIG1hdGNoICotKiAkdmVyc2lvbl19IHs=</vline><vline encoding='base64'>IAkjIFJlamVjdCBsaXRlcmFsIG5lZ2F0aXZlIG51bWJlcnM=</vline><vline encoding='base64'>IAlyZXR1cm4gLWNvZGUgZXJyb3IgImludmFsaWQgdmVyc2lvbiBudW1iZXI6IFwiJHZlcnNpb25cIiI=</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgICMgTm90ZSBvbmx5IGxvd2VyY2FzZSAiYSIgYW5kICJiIiBhY2NlcHRlZCBhbmQgb25seSBvbmU=</vline><vline encoding='base64'>ICAgIGlmIHtbbGxlbmd0aCBbc3BsaXQgJHZlcnNpb24gYWJdXSA+IDJ9IHs=</vline><vline encoding='base64'>IAlyZXR1cm4gLWNvZGUgZXJyb3IgImludmFsaWQgdmVyc2lvbiBudW1iZXI6IFwiJHZlcnNpb25cIiI=</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIHNldCBjb252ZXJ0ZWQgW3N0cmluZyBtYXAge2EgLi0yLiBiIC4tMS59ICR2ZXJzaW9uXQ==</vline><vline encoding='base64'>ICAgIHNldCBsaXN0IHt9</vline><vline encoding='base64'>ICAgIGZvcmVhY2ggZWxlbWVudCBbc3BsaXQgJGNvbnZlcnRlZCAuXSB7</vline><vline encoding='base64'>IAlpZiB7W3NjYW4gJGVsZW1lbnQgJWQlcyBpIHRyYXNoXSAhPSAxfSB7</vline><vline encoding='base64'>IAkgICAgIyBSZXF1aXJlIGRlY2ltYWwgZm9ybWF0dGVkIG51bWJlcnMgd2l0aCBubyBzdWZmaXg=</vline><vline encoding='base64'>IAkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJpbnZhbGlkIHZlcnNpb24gbnVtYmVyOiBcIiR2ZXJzaW9uXCIi</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlpZiB7W2NhdGNoIHtpbmNyIGkgMH1dIHx8ICRpIDwgLTIgfSB7</vline><vline encoding='base64'>ICAgICAgICAgICAjIFZlcmlmeSBlYWNoIGNvbXBvbmVudCBpcyBpbnRlZ2VyID49IC0y</vline><vline encoding='base64'>IAkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJpbnZhbGlkIHZlcnNpb24gbnVtYmVyOiBcIiR2ZXJzaW9uXCIi</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlsYXBwZW5kIGxpc3QgJGk=</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIHJldHVybiAkbGlzdA==</vline><vline encoding='base64'>IH0=</vline></verbatim>
<verbatim><vline encoding='base64'>IHByb2MgY29tcGFyZSB7bDEgbDJ9IHs=</vline><vline encoding='base64'>ICAgICAjIENvbXBhcmUgbGlzdHMgb2YgaW50ZWdlcnM=</vline><vline encoding='base64'>ICAgICBmb3JlYWNoIGkxICRsMSBpMiAkbDIgew==</vline><vline encoding='base64'>ICAgICAgICAgaWYgeyRpMSBlcSB7fX0ge3NldCBpMSAwfQ==</vline><vline encoding='base64'>ICAgICAgICAgaWYgeyRpMiBlcSB7fX0ge3NldCBpMiAwfQ==</vline><vline encoding='base64'>ICAgICAgICAgaWYgeyRpMSA8ICRpMn0ge3JldHVybiAtMX0=</vline><vline encoding='base64'>ICAgICAgICAgaWYgeyRpMSA+ICRpMn0ge3JldHVybiAxfQ==</vline><vline encoding='base64'>ICAgICB9</vline><vline encoding='base64'>ICAgICByZXR1cm4gMA==</vline><vline encoding='base64'>IH0=</vline></verbatim>
<verbatim><vline encoding='base64'>IHByb2Mge3BhY2thZ2UgdmNvbXBhcmV9IHt2MSB2Mn0gew==</vline><vline encoding='base64'>ICAgICBjb21wYXJlIFtpbnRMaXN0ICR2MV0gW2ludExpc3QgJHYyXQ==</vline><vline encoding='base64'>IH0=</vline></verbatim>
<verbatim><vline encoding='base64'>IHByb2Mge3BhY2thZ2UgdnNhdGlzZmllc30ge3YgYXJnc30gew==</vline><vline encoding='base64'>ICAgIHNldCB2TGlzdCBbaW50TGlzdCAkdl0JOyMgdmVyaWZ5IHZhbGlkIHZlcnNpb24gbnVtYmVy</vline><vline encoding='base64'>ICAgIGZvcmVhY2ggcmVxdWlyZW1lbnQgJGFyZ3MgeyAgOyMgY2hlY2sgYWxsIHZhbGlkIHJlcXVpcmVtZW50cw==</vline><vline encoding='base64'>IAlpZiB7W2xsZW5ndGggW2xhc3NpZ24gW3NwbGl0ICRyZXF1aXJlbWVudCAtXSBtaW4gbWF4XV19IHs=</vline><vline encoding='base64'>IAkgICAgIyBNb3JlIHRoYW4gb25lICItIg==</vline><vline encoding='base64'>IAkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJpbnZhbGlkIHJlcXVpcmVtZW50OiBcIiRyZXF1aXJlbWVudFwiIg==</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlpZiB7W2NhdGNoIHtpbnRMaXN0ICRtaW59XX0gew==</vline><vline encoding='base64'>IAkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJpbnZhbGlkIHJlcXVpcmVtZW50OiBcIiRyZXF1aXJlbWVudFwiIg==</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlpZiB7JG1heCBuZSAiIiAmJiBbY2F0Y2gge2ludExpc3QgJG1heH1dfSB7</vline><vline encoding='base64'>IAkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJpbnZhbGlkIHJlcXVpcmVtZW50OiBcIiRyZXF1aXJlbWVudFwiIg==</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIGZvcmVhY2ggcmVxdWlyZW1lbnQgJGFyZ3Mgew==</vline><vline encoding='base64'>IAlsYXNzaWduIFtzcGxpdCAkcmVxdWlyZW1lbnQgLV0gbWluIG1heA==</vline><vline encoding='base64'>IAlzZXQgbWluTGlzdCBbaW50TGlzdCAkbWluXQ==</vline><vline encoding='base64'>IAlsYXBwZW5kIG1pbkxpc3QgLTI=</vline><vline encoding='base64'>IAlpZiB7W2NvbXBhcmUgJHZMaXN0ICRtaW5MaXN0XSA8IDB9IHs=</vline><vline encoding='base64'>IAkgICAgY29udGludWUgOyMgbm90IHNhdGlzZmllZDsgb24gdG8gdGhlIG5leHQgb25l</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlpZiB7W3N0cmluZyBtYXRjaCAqLSAkcmVxdWlyZW1lbnRdfSB7</vline><vline encoding='base64'>IAkgICAgIyBObyBtYXggY29uc3RyYWludCA9PiBzYXRpc2ZpZWQh</vline><vline encoding='base64'>IAkgICAgcmV0dXJuIDE=</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlpZiB7JG1heCBlcSAiIn0gew==</vline><vline encoding='base64'>IAkgICAgc2V0IG1heCBbbGluZGV4ICRtaW5MaXN0IDBd</vline><vline encoding='base64'>IAkgICAgaW5jciBtYXg=</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlzZXQgbWF4TGlzdCBbaW50TGlzdCAkbWF4XQ==</vline><vline encoding='base64'>IAlsYXBwZW5kIG1heExpc3QgLTI=</vline><vline encoding='base64'>IAlpZiB7W2NvbXBhcmUgJG1pbkxpc3QgJG1heExpc3RdID09IDB9IHs=</vline><vline encoding='base64'>IAkgICAgIyBTcGVjaWFsIGNhc2UgZm9yICItZXhhY3QiIHJhbmdl</vline><vline encoding='base64'>IAkgICAgc2V0IG1pbkxpc3QgW2xyZXBsYWNlICRtaW5MaXN0IGVuZCBlbmRd</vline><vline encoding='base64'>IAkgICAgaWYge1tjb21wYXJlICR2TGlzdCAkbWluTGlzdF0gPT0gMH0gew==</vline><vline encoding='base64'>IAkJcmV0dXJuIDE=</vline><vline encoding='base64'>IAkgICAgfQ==</vline><vline encoding='base64'>IAkgICAgY29udGludWU=</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlpZiB7W2NvbXBhcmUgJHZMaXN0ICRtYXhMaXN0XSA8IDB9IHs=</vline><vline encoding='base64'>IAkgICAgIyBXaXRoaW4gdGhlIHJhbmdlID0+IHNhdGlzZmllZCE=</vline><vline encoding='base64'>IAkgICAgcmV0dXJuIDE=</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIHJldHVybiAw</vline><vline encoding='base64'>IH0=</vline></verbatim>
<verbatim><vline encoding='base64'>IHByb2MgbGFzc2lnbiB7bGlzdCBhcmdzfSB7</vline><vline encoding='base64'>ICAgIGZvcmVhY2ggdiAkYXJncyB7dXB2YXIgMSAkdiB4IDsgc2V0IHgge319</vline><vline encoding='base64'>ICAgIGZvcmVhY2ggdiAkYXJncyB4ICRsaXN0IHt1cHZhciAxICR2IHZhciA7IHNldCB2YXIgJHh9</vline><vline encoding='base64'>ICAgIGlmIHtbbGxlbmd0aCAkYXJnc10gPCBbbGxlbmd0aCAkbGlzdF19IHs=</vline><vline encoding='base64'>IAlzZXQgbm90YXNzaWduZWQgW2xyYW5nZSAkbGlzdCBbbGxlbmd0aCAkYXJnc10gZW5kXQ==</vline><vline encoding='base64'>ICAgIH0gZWxzZSB7</vline><vline encoding='base64'>IAlzZXQgbm90YXNzaWduZWQge30=</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIHJldHVybiAkbm90YXNzaWduZWQ=</vline><vline encoding='base64'>IH0=</vline></verbatim>
<verbatim><vline encoding='base64'>IHByb2Mge3BhY2thZ2UgcmVxdWlyZX0ge3BrZyBhcmdzfSB7</vline><vline encoding='base64'>ICAgIGlmIHskcGtnIGVxICItZXhhY3QifSB7</vline><vline encoding='base64'>IAkjIENvbnZlcnQgbGVnYWN5IHN5bnRheCAoZGV0YWlscyBvbWl0dGVkKQ==</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIHNldCBwcmVzZW50IFtwYWNrYWdlIHByb3ZpZGUgJHBrZ10=</vline><vline encoding='base64'>ICAgIGlmIHskcHJlc2VudCBuZSAiIn0gew==</vline><vline encoding='base64'>IAkjICRwa2cgYWxyZWFkeSBwcm92aWRlZDsgY2hlY2sgc2F0aXNmYWN0aW9u</vline><vline encoding='base64'>IAlpZiB7W3BhY2thZ2UgdnNhdGlzZmllcyAkcHJlc2VudCB7ZXhwYW5kfSRhcmdzXX0gew==</vline><vline encoding='base64'>IAkgICAgcmV0dXJuICRwcmVzZW50</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlyZXR1cm4gLWNvZGUgZXJyb3IgImhhdmUgJHByZXNlbnQsIG5lZWQgJGFyZ3Mi</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIHNldCBwYXNzIDI=</vline><vline encoding='base64'>ICAgIHdoaWxlIHskcGFzc30gew==</vline><vline encoding='base64'>IAlzZXQgYWNjZXB0YWJsZSB7fQ==</vline><vline encoding='base64'>IAlmb3JlYWNoIHYgW2xzb3J0IC1jb21tYW5kIHtwYWNrYWdlIHZjb21wYXJlfSBc</vline><vline encoding='base64'>IAkJICAgICAgIC1kZWNyZWFzaW5nIFtwYWNrYWdlIHZlcnNpb25zICRwa2ddXSB7</vline><vline encoding='base64'>IAkgICAgaWYgeyFbcGFja2FnZSB2YXRpc2ZpZXMgJHYge2V4cGFuZH0kYXJnc119IHs=</vline><vline encoding='base64'>IAkJY29udGludWU=</vline><vline encoding='base64'>IAkgICAgfQ==</vline><vline encoding='base64'>IAkgICAgaWYge1twYWNrYWdlIHByZWZlcl0gZXEgImxhdGVzdCI=</vline><vline encoding='base64'>IAkJICAgIHx8ICFbc3RyaW5nIG1hdGNoIHsqW2FiXSp9ICR2XX0gew==</vline><vline encoding='base64'>IAkJIyBFcnJvciBoYW5kbGluZyBvbWl0dGVkIGhlcmU=</vline><vline encoding='base64'>IAkJdXBsZXZlbCAjMCBbcGFja2FnZSBpZm5lZWRlZCAkcGtnICR2XQ==</vline><vline encoding='base64'>IAkJcmV0dXJuICR2</vline><vline encoding='base64'>IAkgICAgfQ==</vline><vline encoding='base64'>IAkgICAgbGFwcGVuZCBhY2NlcHRhYmxlICR2</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>IAlpZiB7W2luY3IgcGFzcyAtMV19IHs=</vline><vline encoding='base64'>IAkgICAgIyB1c2UgW3BhY2thZ2UgdW5rbm93bl0gdG8gZmluZCBtb3JlIHZlcnNpb25z</vline><vline encoding='base64'>IAl9</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIGlmIHtbbGxlbmd0aCAkYWNjZXB0YWJsZV19IHs=</vline><vline encoding='base64'>IAkjIEFjY2VwdCBiZXN0IHNhdGlzZmFjdG9yeSBhbHBoYS9iZXRhIGV2ZW4=</vline><vline encoding='base64'>IAkjIHRob3VnaCBvdXIgcHJlZmVyZW5jZSBtb2RlIGlzICJzdGFibGUi</vline><vline encoding='base64'>IAlzZXQgdiBbbGluZGV4ICRhY2NlcHRhYmxlIDBd</vline><vline encoding='base64'>IAl1cGxldmVsICMwIFtwYWNrYWdlIGlmbmVlZGVkICRwa2cgJHZd</vline><vline encoding='base64'>IAlyZXR1cm4gJHY=</vline><vline encoding='base64'>ICAgIH0=</vline><vline encoding='base64'>ICAgIHJldHVybiAtY29kZSBlcnJvciAiY2FuJ3QgZmluZCAkcGtnICRhcmdzIg==</vline><vline encoding='base64'>IH0=</vline></verbatim>
</section>
<section title="Copyright">
<para>This document has been placed in the public domain.</para>
</section>
</body></TIP>
