<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.14 (Ruby 2.6.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wright-http-patch-byterange-00" category="exp" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.1 -->
  <front>
    <title>Byte Range PATCH</title>
    <seriesInfo name="Internet-Draft" value="draft-wright-http-patch-byterange-00"/>
    <author initials="A." surname="Wright" fullname="Austin Wright">
      <organization/>
      <address>
        <email>aaa@bzfx.net</email>
      </address>
    </author>
    <date year="2022" month="August" day="02"/>
    <workgroup>HTTP</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>HTTP</keyword>
    <abstract>
      <t>This document specifies a media type for PATCH payloads that overwrites a specific byte range, to allow random access writes, or allow a resource to be uploaded in several segments.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Filesystem interfaces typically provide some way to write at a specific position in a file. While HTTP supports reading byte range offsets using the Range header (<xref section="14" sectionFormat="of" target="RFC9110"/>), this technique cannot generally be used in PUT, because the write may be executed even when the Content-Range header is ignored, causing data corruption. However, by using a method and media type that the server must understand, writes to byte ranges with Content-Range semantics becomes possible.</t>
      <t>This may be used as part of a technique to protect against interrupted uploads. Since HTTP is stateless, clients can recover from an interrupted connection by making a request that completes the partial state change. For downloads, the Range header allows a client to download only the unknown data. However, if an upload is interrupted, no mechanism exists to upload only the remaining data; the entire request must be retried.</t>
      <t>Byte range patches may be used to "fill in these gaps."</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>This document uses ABNF as defined in <xref target="RFC5234"/> and imports grammar rules from <xref target="RFC9112"/>.</t>
        <t>For brevity, example HTTP requests or responses may add newlines or whitespace,
or omit some headers necessary for message transfer.</t>
      </section>
    </section>
    <section anchor="modifying-a-content-range-with-patch">
      <name>Modifying a content range with PATCH</name>
      <t>Although the Content-Range field cannot be used in the request headers without risking data corruption, it may be used in conjunction with the PATCH method <xref target="RFC5789"/> as part of a media type whose semantics writes a subset of a document, at a particular byte offset. This document re-uses the "multipart/byteranges" media type, and defines the "message/byterange" media type, for this purpose.</t>
      <t>Servers MUST read a Content-Range field from the patch document that completely indicates the parts of the target resource to write to, and produce a 422 or 400 error if none is found. (This would mean the client may be using a yet-undefined mechanism to specify the target range.)</t>
      <t>Currently, the only defined range unit is "bytes", however this may be other, yet-to-be-defined values.</t>
      <t>In the case of "bytes", exactly those bytes are changed. However, a unit MAY define write semantics different from a read, if symmetric behavior would not make sense. For example, if a Content-Range field identifies an item in a JSON array, a write to this item may add or remove a leading or trailing comma, not technically part of the item itself, in order to keep the resulting document well-formed.</t>
      <t>The client MUST NOT send the unsatisfied-range form (e.g. <tt>bytes */1000</tt>); this is not meaningful.</t>
      <t>The client MAY indicate the anticipated final size of the document by providing the complete-length form, for example <tt>bytes 0-11/12</tt>. This value does not affect the success of the write, however the server MAY use it for other purposes, especially for preallocating an optimal amount of space, and deciding when an upload in multiple parts has finished.</t>
      <t>If the client does not know or care about the final length of the document, it MAY use <tt>*</tt> in place of complete-length. For example, <tt>bytes 0-11/*</tt>. Most random access writes will follow this form.</t>
      <t>Other "Content-" fields in the patch document have the same meaning as if used in the headers of a PUT request.</t>
      <t>Servers SHOULD NOT accept requests that begin writing after the end of the resource. This would create a sparse file, where some byte ranges are undefined, and HTTP semantics currently has no way of representing such undefined ranges. For example, writing at byte 601 of a resource where bytes 0-599 are defined; this would leave byte 600 undefined.</t>
      <t>Servers that accept sparse writes MUST initialize unwritten regions to not disclose contents of existing storage. From the client's perspective, this is equivalent to another client or the server writing out any regions that it did not write to. Future specifications may define a way for the server to list uninitialized regions, for the client to act on, without needing to perform this step.</t>
      <section anchor="the-multipartbyteranges-media-type">
        <name>The multipart/byteranges media type</name>
        <t>The following is a request with a "multipart/byteranges" body to write two ranges in a document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
Content-Length: 206
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

--THIS_STRING_SEPARATES
Content-Range: bytes 2-6/25
Content-Type: text/plain

23456
--THIS_STRING_SEPARATES
Content-Range: bytes 17-21/25
Content-Type: text/plain

78901
--THIS_STRING_SEPARATES--
]]></sourcecode>
        <t>The syntax for multipart messages is defined in <xref section="5.1.1" sectionFormat="comma" target="RFC2046"/>.</t>
      </section>
      <section anchor="the-messagebyterange-media-type">
        <name>The message/byterange media type</name>
        <t>When making a request, there is no need for a multipart boundary, and this may be optimized away. This document defines a new media type "message/byterange" with the same semantics as a single byte range in a multipart/byteranges message, but with a simplified syntax.</t>
        <t>The "message/byterange" form may be used in a request as so:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 272
If-Match: "xyzzy"
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Content-Range: bytes 100-299/600
Content-Type: text/plain

[200 bytes...]
]]></sourcecode>
        <t>This represents a request to modify a 600-byte document, overwriting 200 bytes of it, starting at a 100-byte offset.</t>
        <t>The syntax is defined in <xref target="messagebyterange-media-type"/>.</t>
      </section>
    </section>
    <section anchor="segmented-uploads-with-patch">
      <name>Segmented uploads with PATCH</name>
      <t>As an alternative to using PUT to create a new resource, the contents of a resource may be uploaded in segments, each written across several PATCH requests.</t>
      <t>A user-agent may also use PATCH to recover from an interrupted PUT request, if it was expected to create a new resource. The server will store the data sent to it by the user agent, but will not finalize the upload until the final length of the document is known and received.</t>
      <ol spacing="normal" type="1"><li>The client makes a PUT or PATCH request to a URL, a portion of which is randomly generated by the client, or computed based on a cryptographic hash of the document (the exact algorithm is unimportant to the server and need not be indicated). This first request creates the resource, and should include <tt>If-None-Match: *</tt> to verify the target does not exist. If a PUT request, the server reads the Content-Length header and stores the intended final length of the document. If a PATCH request, the "Content-Range" field in the "message/byterange" patch is read for the final length. The final length may also be undefined, and defined in a later request.</li>
        <li>If any request is interrupted, the client may make a HEAD request to determine how much, if any, of the previous response was stored, and resumes uploading from that point. The server will return 200 (OK), but this may only indicate the write has been saved; the server is not obligated to begin acting on the upload until it is complete.</li>
        <li>If the client sees from the HEAD response that additional data remains to be uploaded, it may make a PATCH request to resume uploading. Even if no data was uploaded or the resource was not created, the client should attempt creating the resource with PATCH to mitigate the possibility of another interrupted connection with a server that does not save incomplete transfers. However if in response to PATCH, the server reports 405 (Method Not Allowed), 415 (Unsupported Media Type), or 501 (Not Implemented), then the client must resort to a PUT request.</li>
        <li>The server detects the completion of the final request when the current received data matches the indicated final length. For example, a <tt>Content-Range: 500-599/600</tt> field is a write at the end of the resource. The server processes the upload and returns a response for it.</li>
      </ol>
      <t>For building POST endpoints that support large uploads, clients can first upload the data to a scratch file as described above, and then process by submitting a POST request that links to the scratch file.</t>
      <t>For updating an existing large file, the client can upload to a scratch file, then execute a MOVE (<xref section="9.9" sectionFormat="of" target="RFC4918"/>) over the intended target.</t>
      <section anchor="example">
        <name>Example</name>
        <t>A single PUT request that creates a new resource may be split apart into multiple PATCH requests. Here is an example that uploads a 600-byte document across three 200-byte segments.</t>
        <t>The first PATCH request creates the resource:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 281
If-None-Match: *

Content-Range: bytes 0-199/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This request allocates a 600 byte document, and uploading the first 200 bytes of it. The server responds with 200, indicating that the complete upload was stored.</t>
        <t>Additional requests upload the remainder of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>This second request also returns 200 (OK).</t>
        <t>A third request uploads the final portion of the document:</t>
        <sourcecode type="example"><![CDATA[
PATCH /uploads/foo HTTP/1.1
Content-Type: message/byterange
Content-Length: 283
If-None-Match: *

Content-Range: bytes 200-399/600
Content-Type: text/plain
Content-Length: 200

[200 bytes...]
]]></sourcecode>
        <t>The server responds with 200 (OK). Since this completely writes out the 600-byte document, the server may also perform final processing, for example, checking that the document is well formed. The server MAY return an error code if there is a syntax or other error, or in an earlier response as soon as it it able to detect an error, however the exact behavior is left undefined.</t>
      </section>
    </section>
    <section anchor="registrations">
      <name>Registrations</name>
      <section anchor="messagebyterange-media-type">
        <name>message/byterange media type</name>
        <t>The "message/byterange" media type patches the defined byte range to some specified contents.  It is similar to the "multipart/byteranges" media type, except it omits the multipart separator, and so only allows a single range to be specified.</t>
        <t>It follows the syntax of HTTP message headers and body. It MUST include the Content-Range header field. If the message length is known by the sender, it SHOULD contain the Content-Length header field. Unknown or nonapplicable header fields MUST be ignored.</t>
        <t>The field-line and message-body productions are specified in <xref target="RFC9112"/>.</t>
        <sourcecode type="abnf"><![CDATA[
byterange-document = *( field-line CRLF )
                     CRLF
                     [ message-body ]
]]></sourcecode>
        <t>This document has the same semantics as a single part in a "multipart/byteranges" document (<xref section="5.1.1" sectionFormat="of" target="RFC2046"/>) or any response with a 206 (Partial Content) status code (<xref section="15.3.7" sectionFormat="of" target="RFC9110"/>). A "message/byterange" document may be trivially transformed into a "multipart/byteranges" document by prepending a dash-boundary and CRLF, and appending a close-delimiter (a CRLF, dash-boundary, terminating "<tt>--</tt>", and optional CRLF).</t>
      </section>
    </section>
    <section anchor="caveats">
      <name>Caveats</name>
      <t>There is no standard way for a Content-Range header to indicate an unknown or indefinite length response starting at a certain offset; the design of partial content messages requires that the sender know the total length before transmission. However it seems like it should be possible to generate an indefinite partial content response (e.g. return a continuously growing audio file starting at a 4MB offset). Fixing this would require a new header, update to HTTP, or a revision of HTTP.</t>
      <t>This pattern can enable multiple, parallel uploads to a document at the same time. For example, uploading a large log file from multiple devices. However, this document does not define any ways for clients to track the unwritten regions in sparse documents, and the existing conditional request headers are designed to cause conflicts. This may be addressed in a later document.</t>
      <t>Servers do not necessarily have to save the results of an incomplete upload; since most clients prefer atomic writes, many servers will discard an incomplete upload. A mechanism to indicate a preference for atomic vs. non-atomic writes may be defined at a later time.</t>
      <t>When a PUT that updates an existing file has been interrupted, it may not possible to know how much of the request was received by the server, and which content already existed. This requires use of a more sophisticated synchronization mechanism, that may use a byte range PATCH, but is otherwise outside the scope of this document.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="unallocated-ranges">
        <name>Unallocated ranges</name>
        <t>The byterange media type technically permits writes to offsets beyond the bound of the file. This may have behavior not be predictable by the user.</t>
        <t>Servers will normally only allow patch ranges to start inside or at the immediate end of the representation. Servers supporting sparse files MUST NOT return uninitialized memory or storage contents. Uninitialized regions may be initialized prior to executing the sparse write, or this may be left to the filesystem if it can guarantee this behavior.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes. </t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns. </t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed">
              <organization/>
            </author>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein">
              <organization/>
            </author>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC4918">
          <front>
            <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
            <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault">
              <organization/>
            </author>
            <date month="June" year="2007"/>
            <abstract>
              <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
              <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4918"/>
          <seriesInfo name="DOI" value="10.17487/RFC4918"/>
        </reference>
        <reference anchor="RFC5789">
          <front>
            <title>PATCH Method for HTTP</title>
            <author fullname="L. Dusseault" initials="L." surname="Dusseault">
              <organization/>
            </author>
            <author fullname="J. Snell" initials="J." surname="Snell">
              <organization/>
            </author>
            <date month="March" year="2010"/>
            <abstract>
              <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification.  The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5789"/>
          <seriesInfo name="DOI" value="10.17487/RFC5789"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIALGp6WIAA91bXXMbt5J956/AKg8rpUialGUnkutWrWLL19prWV5LTmor
lYrBGZDEajgzO8BIpl3Ob9/T3cAMhpKdu1v3vmweYomcARr9cfp0NzSZTEbe
+sKcqJ+23qh3ulwZ9fb0+vmrUV5lpd7gm7zRSz+5a+xq7Sdr7+tJrX22nizw
RkMvTGazkWsXG+ucrUq/rfGSLXNTG/yv9KNMe7Oqmu2JMh/rka2bE+Wb1vnD
2ex4dji6q5qbVVO19Yl6dX39dnRjtvgoPxkpNVHnJTYpjZ+8ICn4I37IeV3m
v+uiKrHZ1rhRbU/Ur77KxspVjW/M0uGn7YZ++G000q1fVw2WnGAJBenciTqd
ql/4UPyRnPUUYtky/dxstC1OlNb63xaflh+nkGU0Kqtmo729NSTku5fPD+fz
4xP1N7NVJLlTy6pRrTPYh7518tDxfD6TI6orrFp6m/XfHMo3j+bT+Whky+Xu
BrOjpydq76ItvK3bpq6weFSNuoCE6uyjNyXp36n9i/OLswP1VjdeXd9VJ+rC
5FaraxjG7cl6R8fzH7EeC5O8SXL/YhbqhXW+sYvWmxwqIdXZcqWgcfWzaehR
+nUfT744/fkgLPnkhx+hgz12HuyIl3Jej/bYG+G/yWSi9AIL6wwqvF5bp+Bj
7QYuolxtMru0ximtNiwtuRG/LwvWeltUGqr1a+1VdWsaOKTn58O7mSKHVOyR
Y+UrpYuiuqPf82qjdJYZ55S8NFZYV77WqjGuapvM0CsLo9qa9sG5YTtnsI8u
8O+KpHTTeIyNzfPCjEbfkRGaKm8zD6WMRi9tYdzWebPB67DOUmNXOorNsN1W
1U11a3MDF90Ydae3tCeLpHCo5CSwr6UVSQitllgVvrrGP+I+rq1rOLmD7Don
U/QnV9Vy6Qy+ah194dcxqNd41DRq//PnK8PSqvkRHo6O+eXLAZRGNvEmW5f2
v1ujMl2WlVcrU5IWID6px4lq3r6/HuP3TJOb0y5yjI3mp8xHk7HzQIGlulvj
f/TMc6AD9DgZSIQt7QoBZfKxouVI7Fx7rbKqadqaRJ2qV9Ud2QJbbsPJyE/Y
x8grE5dh/6DNnGnwhtogolULIGoYMsbBBdjandbgGNavd+RzMUjpnDCYI7M4
u4AxgvuG07JONL6mgINKdaJDbAOj43fYd6WBO148g06Gt8Tb3FRd2TIL1sXC
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
w5bC0cCvKZQy79KmVQD/Hge66qrbSMr8LtmIrTdhsiUwFiB5B0oGRb5WH3aY
15MZl/LEuT5E7HJdnzIMVr/S0+iOVDcV9XKCJCF0JOIpfIWPBVMR4Fkfhzet
LRgI3l6i6Mc2DAOhkg5mAaY1q7jqznhU0k7YsCMBbAKXNQy01F+RiVMcfulF
dWtiuQD9Bukpv/KdFi+cT2QaTFMLW964LjUmG4TjtHXedfW6RoSIL22exGey
vpd3T97gYWGmji8vLn8+Swf5x9PjMMmnax1fvhwwkR2mM0mdsQA7C+UAmFuo
VxIfDcOMkLWHlCuSRocaBTDGNRf2qPr24w45VK9CxcZKkNYrrx9Z7gNEPPJN
v26MIbSXr5NbGJIRydpDTHyIavwzK6Af56NdzvKVamY2mf9ZLXO/FTH7Zn0T
qjzpHpugSbVT0pBf9xnWd3rbKW8GASzRGSsQPDmOeCJrBBzoEDk4bp/gqSTo
M1zXKU0iUxIe8a8davVPtdbjv9da5HOP/7H2ciiAGAOj2VzVAWIkNFxKgc80
/XMxTPpskNQH//8V93WfFIWFezPMAZPxa2gex3nGA6V+ekMosunYFQ16lkQA
lx8MjpBy1ia7GURCWgrS/EyF+VkaVDQyCfyVoJDHuVmFqscu+7aWjh2EbnDE
DzL7sPKibpAx+msM0uWhWs8xMYVnLQoTSTrVdGVcI51VSb3XTTqxdWGWftCb
p6bEO3BhurAXLrwgc3y7bfe1RlXSUKsTlhKLlaRZRsNomnvEC4F5172YKnXO
GnZ2Y+kCQci8f8cFAfORJwtQDl3okL37nqEz+Ed7UhEXg5VUEt1Fp5AhO/kW
iXQ0WvOhGy7rRgMuZTYTb4jEGRPtQH3wKR0mDDek+r1/CyRUqMzDuhIjLhhK
wa75EPoBNJzlq1Y+zqxIf9oOL+ANS+CwwftwaQv+UAK4a6T4jJ0pfSxMZKjq
l0t7XTbGl5OCpxd8IY+lnHDLv+5uSMoMq7ctxPo1XOH5bSoAphflctR3yrrQ
+ov6fj/d5fm71y/VAV/RvfcffffwN78OJUsBOhkbuj/r7gbe8/VRR99d6Wka
N8EDUaP2OBO1JpTjsUiWQuhw9lTtvw3384LRDviiXusENdJ7nE+mj6c/DO9y
TtXpg4HYyRV4nG/srQyjpaxi3BJG9+dn46k73/IWipxrt57EDjy7ARlCoopu
icXneE43yU2BQKYGxb4ODw4WAEZzk0FYx96HyeRDuO5W1fE2Ht46CFD1HGWi
9nIrr5sR8JVP3eTdPG33skZwbeoRxsYBMfE+EqwgIpU/IeI6Ww0bwplpOMyk
H/ws4JtDlJBl4l3LeBusG51QnrfSfOrurTIv4tE8N70q33d+FmbJHU4yVrhv
n5TB3HnYAMvtDd8/CEX8wnQ3V+mksYcobdjueLsidueU+xwxd/H3tmyr1lE/
spEpoG5zW0l1NVTL0cVPQSXwyZf2o+TNbjYcjh+qDLHGWConlpUwVG5rK2oo
uUB86ON4pbCmHgUkoxLKlAxYsRgZ06Hg3aboeVSVjBpjRcuR7u1m93ZPT5x1
KNyKaiWn5O5OV/TkkC0zLrmKNLyE2TUz4oAXMQ+XlAv3sYSlfNbo7Cbcrdmd
c1N7XkbjcVnXla19fUkkc4d497mniS4Zmup8eRtvLIH0lGDTS806zxuq4get
xK4B2o/ucxm/x3uRlu8eyHzCxfsXcs1I5g9l2ssRBT8jWKXaku6DRG0AWZbU
nvVI2Vl3b39DmnNha+4J0tyfIvyhhQkFB/fc+iAP6xval4FB9rmFFpD8JoNt
o0oiXWHHFoWw04RxpTR6QnGbS0mWVP7sNl0vctB1DW0+0mMaqAwBscPat1xC
M0i7vv/TJf9G7sHBK2R2EINZF9Rf3oo0wkxtAj6tXLnTMAFfPKnXJLQ0kEBo
snVTlfYT08BeoWM5K0lO7+uUxoX+G/VnsQ9T2TtLm7Te2UB2XFbV4SpXEivd
OCxrG2oeAq/pjZSDvi9j0RtvrwgHeYiTDi/HUULxLvkTgPjXEguzrUIocf7p
G3CFSeKCPbtjzWH8AU+CV3lGnmTMlMRImDI1G5aiZ5eh+x+mwb4S7KS/TiId
sVdKF2fDB/I7vbcw4NTyJxJxs9Ao41sv/aUi19/fC0g+vEeyMTD9lvYMV2US
3v3+oRsnMSjSr+qG1IJzSK8qdhzSGz1jVQ3vhXLdEaj8MvnzGR4DEqavWmA4
RAlVXtT+NPwpzgKIOfofFmmZdcg2AAA=

-->

</rfc>
