<?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.7.35 (Ruby 3.4.9) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-cel-nfsv4-copy-implementation-experience-02" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title abbrev="NFSv4.2 COPY Implementation Experience">Network File System version 4.2 COPY Operation Implementation Experience</title>
    <seriesInfo name="Internet-Draft" value="draft-cel-nfsv4-copy-implementation-experience-02"/>
    <author fullname="Olga Kornievskaia">
      <organization abbrev="RedHat">Red Hat</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>okorniev@redhat.com</email>
      </address>
    </author>
    <author fullname="Chuck Lever" role="editor">
      <organization abbrev="Oracle">Oracle Corporation</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>chuck.lever@oracle.com</email>
      </address>
    </author>
    <date year="2026" month="April" day="30"/>
    <area>Web and Internet Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFSv4.2</keyword>
    <keyword>COPY</keyword>
    <keyword>CLONE</keyword>
    <keyword>WRITE_SAME</keyword>
    <keyword>offload</keyword>
    <abstract>
      <?line 72?>

<t>This document describes the authors' experience implementing the
NFSv4.2 COPY operation. It recommends and motivates updates to
the specification of that operation. This is not a normative
document.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://chucklever.github.io/i-d-update-copy-spec/#go.draft-cel-nfsv4-copy-implementation-experience.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-cel-nfsv4-copy-implementation-experience/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        nfsv4 Working Group mailing list (<eref target="mailto:nfsv4@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/nfsv4/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/nfsv4/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/chucklever/i-d-update-copy-spec"/>.</t>
    </note>
  </front>
  <middle>
    <?line 79?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="RFC7862"/> introduces a facility to the NFSv4 protocol for NFS clients
to request that an NFS server copy data from one file to another.
Because the data copy happens on the NFS server, it avoids the transit
of file data between client and server during the copy operation.
This reduces latency, network bandwidth requirements, and the exposure
of file data to third parties when handling the copy request.</t>
      <t>Based on implementation experience, this document reports on areas where
specification wording can be improved to better guarantee interoperation.
These are mostly errors of omission that allow interoperability gaps to
arise due to subtleties and ambiguities in the original specification of
the COPY operation in <xref target="RFC7862"/>.</t>
      <section anchor="executive-summary">
        <name>Executive Summary</name>
        <t>This document addresses several areas where the copy offload specification
in <xref target="RFC7862"/> has shown to be insufficient to ensure good interoperability:</t>
        <ul spacing="normal">
          <li>
            <t>The specification does not clearly state which copy offload operations
are mandatory-to-implement for servers supporting synchronous versus
asynchronous copy (<xref target="sec-sync-v-async"/>).</t>
          </li>
          <li>
            <t>Multiple issues affect copy stateids, including
inconsistent terminology (<xref target="sec-stateid-terms"/>),
race conditions between operations (<xref target="sec-reply-race"/>),
and
unclear lifetime requirements (<xref target="sec-lifetime"/>).</t>
          </li>
          <li>
            <t>Insufficient guidance exists for when callback services should return
specific status codes (<xref target="sec-cb-offload-status"/>),
which status codes are valid for reporting
completion (<xref target="sec-completion-status"/>),
and
whether callbacks are required after cancellation
(<xref target="sec-cancel-implementation"/>).</t>
          </li>
          <li>
            <t>Several operations lack clarity, including the meaning of "optional"
fields in OFFLOAD_STATUS (<xref target="sec-status-implementation"/>),
permission for short COPY results (<xref target="sec-short-copy-results"/>),
and
requirements for polling when callbacks are lost
(<xref target="sec-completion-reliability"/>).</t>
          </li>
          <li>
            <t>The description of the FATTR4_CLONE_BLKSIZE attribute lacks essential
details about units, semantics, and scope (<xref target="sec-fattr4-clone-blksize"/>).</t>
          </li>
          <li>
            <t>No guidance exists for handling asynchronous copies during server
shutdown or client state recovery after server restart
(<xref target="sec-server-shutdown"/>).</t>
          </li>
          <li>
            <t>Missing recommendations for denial-of-service mitigations specific
to copy offload operations (<xref target="sec-security-considerations"/>).</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>This document is Informative. However, it utilizes BCP14 compliance
keywords in two ways:</t>
      <ul spacing="normal">
        <li>
          <t>As part of quotations of Normative RFCs, or</t>
        </li>
        <li>
          <t>As part of suggested improvements to Normative language found in
Normative RFCs.</t>
        </li>
      </ul>
      <t>These BCP14 keyword usages are Informative only.</t>
    </section>
    <section anchor="sec-sync-v-async">
      <name>Synchronous versus Asynchronous COPY</name>
      <t>The NFSv4.2 protocol is designed so that an NFSv4.2 server
is considered protocol compliant whether it implements the COPY
operation or not. This means that NFSv4.2 server implementers
are free to not implement COPY.</t>
      <t>If implementers choose to provide it, the COPY operation comes
in two distinct flavors:</t>
      <ul spacing="normal">
        <li>
          <t>synchronous, where the server reports the final status of the
operation directly in the response to the client's COPY request</t>
        </li>
        <li>
          <t>asynchronous, where the server agrees to report the final status
of the operation at a later time via a callback operation</t>
        </li>
      </ul>
      <t><xref target="RFC7862"/> does not take a position on whether a client or server
is mandated to implement either or both forms of COPY, though it
does clearly state that to support inter-server copy, asynchronous
copy is mandatory-to-implement.</t>
      <t>The implementation requirements for these two forms of copy offload
are quite distinct from each other. Some implementers have chosen
to avoid the more complex asynchronous form of COPY.</t>
      <t>However, NFS clients must be able to detect what an NFS server
provides in order to fall back quickly and gracefully when the copy
offload facility of their choice is not available.</t>
      <section anchor="detecting-support-for-copy">
        <name>Detecting Support For COPY</name>
        <t><xref section="4.1.2" sectionFormat="of" target="RFC7862"/> states:</t>
        <ul empty="true">
          <li>
            <t>Inter-server copy, intra-server copy, and intra-server clone are each
<bcp14>OPTIONAL</bcp14> features in the context of server-side copy.  A server may
choose independently to implement any of them.  A server implementing
any of these features may be <bcp14>REQUIRED</bcp14> to implement certain
operations.  Other operations are <bcp14>OPTIONAL</bcp14> in the context of a
particular feature (see Table 5 in Section 13) but may become
<bcp14>REQUIRED</bcp14>, depending on server behavior.  Clients need to use these
operations to successfully copy a file.</t>
          </li>
        </ul>
        <t><xref target="RFC7862"/> distinguishes between implementations that support
inter-server or intra-server copy, but does not differentiate
between implementations that support synchronous versus asynchronous
copy.</t>
        <t>To interoperate successfully, a client and server must be able
to determine which forms of COPY are implemented and fall back to
a normal READ/WRITE-based copy when necessary. The following
additional text can make this more clear:</t>
        <ul empty="true">
          <li>
            <t>Given the operation of the signaling in the ca_synchronous field
as described in <xref section="15.2.3" sectionFormat="of" target="RFC7862"/>, an implementation
that supports the NFSv4.2 COPY operation <bcp14>MUST</bcp14> support synchronous
copy and <bcp14>MAY</bcp14> support asynchronous copy.</t>
          </li>
        </ul>
      </section>
      <section anchor="mandatory-to-implement-operations">
        <name>Mandatory-To-Implement Operations</name>
        <t>The synchronous form of copy offload does not need the client or
server to implement the NFSv4.2 OFFLOAD_CANCEL, OFFLOAD_STATUS, or
CB_OFFLOAD operations.</t>
        <t>Moreover, the COPY_NOTIFY operation is required only when an
implementation provides inter-server copy offload. Thus a minimum
viable synchronous-only copy implementation can get away with
implementing only the COPY operation and can leave the other
three operations mentioned here unimplemented.</t>
        <t>The asynchronous form of copy offload is not possible without
the implementation of CB_OFFLOAD, and not reliable without the
implementation of OFFLOAD_STATUS. <xref section="4.1.2" sectionFormat="of" target="RFC7862"/>
ties the requirement to implement these operations to the
condition that the server's COPY operation returns a stateid,
rather than directly to declared support for asynchronous COPY.
Tying the requirement to the declared capability instead can
make this requirement clearer:</t>
        <ul empty="true">
          <li>
            <t>When an NFS server implementation provides an asynchronous copy
capability, it <bcp14>MUST</bcp14> implement the OFFLOAD_CANCEL and OFFLOAD_STATUS
operations, and <bcp14>MUST</bcp14> implement the CB_OFFLOAD callback operation.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="copy-stateids">
      <name>Copy stateIDs</name>
      <t>There are a number of areas where <xref target="RFC7862"/> is mute or unclear on
the details of copy stateids. We start by defining some terms.</t>
      <section anchor="sec-stateid-terms">
        <name>Terminology</name>
        <t>An NFSv4 stateid is a fixed-length blob of data (a hash, if you will)
that represents operational state known to both an NFSv4 client and
server. A stateid can represent open file state, file lock state, or
a delegation.</t>
        <t><xref target="RFC7862"/> introduces a new category of stateid that it calls a
"copy stateid". That document lacks a specific definition of this
term. The term is applied to at least two different usages of a
stateid, neither of which can be used for the other use, and
neither of which can be used for existing categories of stateid
(open, lock, and delegation).</t>
        <t><xref target="RFC7862"/> refers to what is returned in cnr_stateid result of a
COPY_NOTIFY response (<xref section="15.3.2" sectionFormat="of" target="RFC7862"/>)
and what is to be used as the ca_src_stateid argument in a COPY
request (<xref section="15.2.2" sectionFormat="of" target="RFC7862"/>) as "a copy stateid":</t>
        <ul empty="true">
          <li>
            <t>The cnr_stateid is a copy stateid that uniquely describes the state
needed on the source server to track the proposed COPY.</t>
          </li>
        </ul>
        <t><xref section="15.2.3" sectionFormat="of" target="RFC7862"/> refers to what is returned in the
wr_callback_id field of a COPY response as a "copy stateid":</t>
        <ul empty="true">
          <li>
            <t>The wr_callback_id stateid is termed a "copy stateid" in this context.</t>
          </li>
        </ul>
        <t>A field named wr_callback_id appears in the WRITE_SAME response
for the same purpose, but <xref section="15.12.3" sectionFormat="of" target="RFC7862"/> avoids
referring to this as a "copy stateid". It also appears as part of
the argument of a CB_OFFLOAD request just like COPY's wr_callback_id.
It is not referred to as a "copy stateid" in that section.</t>
        <t><xref section="4.8" sectionFormat="of" target="RFC7862"/> is entitled "Copy Offload Stateids",
and states:</t>
        <ul empty="true">
          <li>
            <t>A server may perform a copy offload operation asynchronously.  An
asynchronous copy is tracked using a copy offload stateid.  Copy
offload stateids are included in the COPY, OFFLOAD_CANCEL,
OFFLOAD_STATUS, and CB_OFFLOAD operations.</t>
          </li>
        </ul>
        <t>The term "copy offload stateid" is not used anywhere else in <xref target="RFC7862"/>,
therefore it is unclear whether this section refers only to the values
that can appear in a wr_stateid field, or if it refers to all copy
stateids.</t>
        <t>Note also that <xref section="15.8.3" sectionFormat="of" target="RFC7862"/> does not refer to
the oca_stateid argument of an OFFLOAD_CANCEL request by any
special name, nor does it restrict the category of stateid
that may appear in this argument.
Likewise for the osa_stateid argument of an OFFLOAD_STATUS request
(<xref section="15.9.3" sectionFormat="of" target="RFC7862"/>)
and the coa_stateid argument of a CB_OFFLOAD request
(<xref section="16.1.3" sectionFormat="of" target="RFC7862"/>).</t>
        <t>To alleviate this confusion, it is appropriate to construct
definitions for the specific usages of stateids that represent
the state of ongoing offloaded operations. Perhaps the following
might be helpful:</t>
        <dl>
          <dt>copy stateid:</dt>
          <dd>
            <t>A stateid that uniquely and globally describes the state
needed on the source server to track a COPY operation.
A copy stateid begins its lifetime when an NFS server forms
the response to a COPY_NOTIFY operation.</t>
          </dd>
          <dt>offload stateid:</dt>
          <dd>
            <t>A stateid that uniquely describes the completion state of an
offloaded operation (either WRITE_SAME or COPY).</t>
          </dd>
        </dl>
      </section>
      <section anchor="use-of-delegation-stateids">
        <name>Use of Delegation Stateids</name>
        <t>According to <xref section="15.2.1" sectionFormat="of" target="RFC7862"/>:</t>
        <ul empty="true">
          <li>
            <t>The ca_dst_stateid <bcp14>MUST</bcp14> refer to a stateid that is valid for a WRITE
operation and follows the rules for stateids in Sections 8.2.5 and
18.32.3 of <xref target="RFC8881"/>.  For an inter-server copy, the ca_src_stateid
<bcp14>MUST</bcp14> be the cnr_stateid returned from the earlier COPY_NOTIFY
operation, while for an intra-server copy ca_src_stateid <bcp14>MUST</bcp14> refer
to a stateid that is valid for a READ operation and follows the rules
for stateids in Sections 8.2.5 and 18.22.3 of <xref target="RFC8881"/>.</t>
          </li>
        </ul>
        <t>The first sentence appears to allow the use of delegation stateids,
while the second seems to clearly exclude the use of delegation stateids.
Since the specification does not describe how a server needs to respond
to operations that conflict with delegation stateids, one must assume
that the first sentence is incorrect.</t>
        <t>In terms of implementation guidance, in light of types of open permitted
by <xref target="RFC9754"/>, in particular, OPEN4_SHARE_ACCESS_WANT_OPEN_XOR_DELEGATION,
OPEN operations performed to acquire stateids for a COPY operation might
receive only a delegation stateid. When preparing for a COPY operation,
NFSv4 clients need to indicate that a delegation is not wanted.</t>
      </section>
      <section anchor="cnrleasetime">
        <name>cnr_lease_time</name>
        <aside>
          <t>olga:
COPY_NOTIFY produces a copy stateid. How long should it be valid?
Perhaps it's indirectly discussed by the 15.3.3 in cnr_lease_time.
So copy stateid is valid for
cnr_lease_time or while copy is ungoing? That's what Linux server
implements laundry thread revokes if lease period has gone by without
it being marked valid.</t>
          <t>I was going to complain about the uselessness (in my point of
view) of the spec's cnr_lease_time. Source server sends that value to
the client. Client doesn't propagate that value to the destination
server. How can the client control the destination starting the read
by the cnr_lease_time (the destination server doesnt know by when it
needs to start the copy)? But I can see that the source server wants
to protect itself from "unauthorized" (really late) reading. I just
find that telling the client isn't useful.</t>
          <t>I believe the Linux server implements the safeguards and requires the
start of the COPY operation to happen within a lease period. My grep
thru the code for "NFS4ERR_PARTNER_NO_AUTH" comes up empty. So we
don't exercise letting the destination server know the copy isn't
meeting "copy progress" constraints.</t>
        </aside>
      </section>
      <section anchor="use-of-offload-stateids-as-a-completion-cookie">
        <name>Use of Offload Stateids As A Completion Cookie</name>
        <t>As implementation of copy offload proceeds, developers face
a number of questions regarding the use of copy stateids to
report operational completion. For completion, these issues
need to be addressed by the specification:</t>
        <ul spacing="normal">
          <li>
            <t>How is sequence number in a copy stateid handled?  Under
what circumstances is its sequence number bumped? Do peers
match copy stateids via only their "other" fields, or must
they match everything including the sequence number?</t>
          </li>
          <li>
            <t>Under what circumstances may a server re-use the same copy
stateid during one NFSv4.1 session?</t>
          </li>
          <li>
            <t>How long does the client's callback service have to remember
copy stateids? Is the callback service responsible for
remembering and reporting previously-used copy stateids?</t>
          </li>
          <li>
            <t>When does the client's callback service return
NFS4ERR_BAD_STATEID to a CB_OFFLOAD operation, and what
action should the server take, since there's no open state
recovery to be done on the NFSv4 server?</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-reply-race">
        <name>COPY Reply Races With CB_OFFLOAD Request</name>
        <t>Due to the design of the NFSv4.2 COPY and COPY_OFFLOAD
operations, an NFS client's callback service cannot recognize
a copy stateid presented by a CB_OFFLOAD request until after
the client has received and processed the COPY response. This
COPY response both confirms that an asynchronous copy
operation has started and provides the copy stateid. Under
some conditions, the client may process the CB_OFFLOAD request
before processing the matching COPY reply.</t>
        <t>There are a few alternatives to consider when designing the
client callback service implementation of the CB_OFFLOAD
operation. Among other designs, client implementers might
choose to:</t>
        <ul spacing="normal">
          <li>
            <t>Maintain a cache of unmatched CB_OFFLOAD requests in the
expectation of a matching COPY response arriving imminently.
(Danger of accruing unmatched copy stateids over time).</t>
          </li>
          <li>
            <t>Have CB_OFFLOAD return NFS4ERR_DELAY if the copy stateid
is not recognized. (Danger of infinite looping).</t>
          </li>
          <li>
            <t>Utilize a referring call list contained in the CB_SEQUENCE
in the same COMPOUND (as described in
<xref section="20.9.3" sectionFormat="of" target="RFC8881"/>) to determine whether an
ingress CB_OFFLOAD is likely to match a COPY operation the
client sent previously.</t>
          </li>
        </ul>
        <t>While the third alternative might appear to be the most
bullet-proof, there are still issues with it:</t>
        <ul spacing="normal">
          <li>
            <t>There is no normative requirement in <xref target="RFC8881"/> or <xref target="RFC7862"/>
that a server implement referring call lists, and it is known
that some popular server implementations in fact do not
implement them. Thus a client callback service cannot depend
on a referring call list being available.</t>
          </li>
          <li>
            <t>Client implementations must take care to place no more than
one non-synchronous COPY operation per COMPOUND. If there are
any more than one, then the referring call list becomes useless
for disambiguating CB_OFFLOAD requests.</t>
          </li>
        </ul>
        <t>The authors recommend that the implementation notes for the
CB_OFFLOAD operation contain appropriate and explicit guidance
for tackling this race, rather than a simple reference to
<xref target="RFC8881"/>.</t>
      </section>
      <section anchor="sec-lifetime">
        <name>Lifetime Requirements</name>
        <t>An NFS server that implements only synchronous copy does not
require the stricter COPY stateid lifetime requirements described
in <xref section="4.8" sectionFormat="of" target="RFC7862"/>. A stateid used with a synchronous
copy lives only until the COPY operation has completed.</t>
        <t>Regarding asynchronous copy offload,
the second paragraph of <xref section="4.8" sectionFormat="of" target="RFC7862"/> states:</t>
        <ul empty="true">
          <li>
            <t>A copy offload stateid will be valid until either (A) the client or
server restarts or (B) the client returns the resource by issuing an
OFFLOAD_CANCEL operation or the client replies to a CB_OFFLOAD
operation.</t>
          </li>
        </ul>
        <t>This paragraph is unclear about what "client restart" means, at least
in terms of what specific actions a server should take and when, how
long a COPY stateid is required to remain valid, and how a client
needs to act during state recovery. A stronger statement about
COPY stateid lifetime can improve the guarantee of interoperability:</t>
        <ul empty="true">
          <li>
            <t>When a COPY stateid is used for an asynchronous copy, an NFS
server <bcp14>MUST</bcp14> retain the COPY stateid, except as follows below.
An NFS server <bcp14>MAY</bcp14> invalidate and purge a COPY stateid in the
following circumstances:</t>
            <t>o The server instance restarts.</t>
            <t>o The server expires the owning client's lease.</t>
            <t>o The server receives an EXCHANGE_ID or DESTROY_CLIENTID request
  from the owning client that results in the destruction of that
  client's lease.</t>
            <t>o The server receives an OFFLOAD_CANCEL request from the owning
  client that matches the COPY stateid.</t>
            <t>o The server receives a reply to a CB_OFFLOAD request from the
  owning client that matches the COPY stateid.</t>
          </li>
        </ul>
        <t>Implementers have found the following behavior to work well for
clients when recovering state after a server restart:</t>
        <ul empty="true">
          <li>
            <t>When an NFSv4 client discovers that a server instance has restarted,
it must recover state associated with files on that server, including
state that manages offloaded copy operations. When an NFS server
restart is detected, the client purges existing COPY state and
redrives its incompleted COPY requests from their beginning. No
other recovery is needed for pending asynchronous copy operations.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="status-codes-their-meanings-and-their-usage">
      <name>Status Codes, Their Meanings, and Their Usage</name>
      <t><xref target="RFC7862"/> specifies the use of certain status codes for use with copy
offload operations but provides insufficient guidance on when and how
these codes should be used, particularly for the CB_OFFLOAD callback
operation. The lack of clarity around error handling creates
interoperability risks, as client and server implementers may make
different assumptions about compliant behavior.</t>
      <section anchor="sec-cb-offload-status">
        <name>Status Codes for the CB_OFFLOAD Operation</name>
        <t><xref section="16.1.3" sectionFormat="of" target="RFC7862"/> describes the CB_OFFLOAD command, but
provides no information, normative or otherwise, about how the NFS
client's callback service is to use CB_OFFLOAD's response status codes. The set
of permitted status codes is listed in <xref section="11.3" sectionFormat="of" target="RFC7862"/>.
The usual collection of status codes related to compound structure
and session parameters are available.</t>
        <t>However, Section 11.3 also lists NFS4ERR_BADHANDLE, NFS4ERR_BAD_STATEID,
and NFS4ERR_DELAY, but <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> does not give any
direction about when an NFS client's callback service should return them.
In a protocol specification, it is usual practice to describe server
responses to a malformed request, but that is entirely missing in that
section of <xref target="RFC7862"/>.</t>
        <section anchor="nfs4errbadhandle">
          <name>NFS4ERR_BADHANDLE</name>
          <t><xref section="15.1.2.1" sectionFormat="of" target="RFC8881"/> defines NFS4ERR_BADHANDLE this way:</t>
          <ul empty="true">
            <li>
              <t>Illegal NFS filehandle for the current server. The current filehandle
failed internal consistency checks.</t>
            </li>
          </ul>
          <t>There is no filesystem on an NFS client to determine whether a
filehandle is valid, thus this definition of NFS4ERR_BADHANDLE is not
sensible for the CB_OFFLOAD operation.</t>
          <t>The CB_RECALL operation might have been the model for the CB_OFFLOAD
operation. <xref section="20.2.3" sectionFormat="of" target="RFC8881"/> states:</t>
          <ul empty="true">
            <li>
              <t>If the handle specified is not one for which the client holds a
delegation, an NFS4ERR_BADHANDLE error is returned.</t>
            </li>
          </ul>
          <t>Thus, if the coa_fh argument specifies a filehandle for which the
NFS client currently has no pending copy operation, the NFS client's
callback service returns the status code NFS4ERR_BADHANDLE. The
protocol specification does not mandate that the NFS client's
callback service remember filehandles after a copy operation has
completed.</t>
          <aside>
            <t>cel: Is the NFS server permitted to purge the copy offload stateid
if the CB_OFFLOAD status code is NFS4ERR_BADHANDLE ?</t>
          </aside>
          <t>The authors recommend that <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> should be
updated to describe this use of NFS4ERR_BADHANDLE.</t>
        </section>
        <section anchor="nfs4errbadstateid">
          <name>NFS4ERR_BAD_STATEID</name>
          <t><xref section="15.1.5.2" sectionFormat="of" target="RFC8881"/> states that NFS4ERR_BAD_STATEID means
that:</t>
          <ul empty="true">
            <li>
              <t>A stateid does not properly designate any valid state.</t>
            </li>
          </ul>
          <t>In the context of a CB_OFFLOAD operation, "valid state" refers to
either the coa_stateid argument, which is a copy stateid, or the
wr_callback_id argument, which is a copy offload stateid.</t>
          <t>If the NFS client's callback service does not recognize the stateid
contained in the coa_stateid argument, the NFS client's callback
service responds with a status code of NFS4ERR_BAD_STATEID.</t>
          <t>The NFS client is made aware of the copy offload stateid by a response
to a COPY operation. If the CB_OFFLOAD request arrives before the
COPY response, the NFS client's callback service will not recognize that
copy offload stateid.</t>
          <ul spacing="normal">
            <li>
              <t>The NFS server might have provided a referring call in the CB_SEQUENCE
operation included in the COMPOUND with the CB_OFFLOAD (see
<xref section="2.10.6.3" sectionFormat="of" target="RFC8881"/>). In that case the NFS client's
callback service waits for the matching COPY response before taking
further action.</t>
            </li>
            <li>
              <t>If the NFS server provided referring call information but the NFS
client can not find a matching pending COPY request, or if the NFS
server did not provide referring call information, the NFS client's
callback service may proceed immediately.</t>
            </li>
          </ul>
          <t>Once the NFS client's callback service is ready to proceed, it can
resolve whether the copy offload stateid contained in the wr_state_id
argument matches a currently pending copy operation. If it does not,
the NFS client's callback service responds with a status code of
NFS4ERR_BAD_STATEID.</t>
          <aside>
            <t>cel: Is the NFS server permitted to purge the copy offload stateid
if the CB_OFFLOAD status code is NFS4ERR_BAD_STATEID ?</t>
          </aside>
          <t>The authors recommend that <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> should be
updated to describe this use of NFS4ERR_BAD_STATEID.</t>
        </section>
        <section anchor="nfs4errdelay">
          <name>NFS4ERR_DELAY</name>
          <t><xref section="15.1.1.3" sectionFormat="of" target="RFC8881"/> has this to say about NFS4ERR_DELAY:</t>
          <ul empty="true">
            <li>
              <t>For any of a number of reasons, the replier could not process this
operation in what was deemed a reasonable time. The client should wait
and then try the request with a new slot and sequence value.</t>
            </li>
          </ul>
          <t>When an NFS client's callback service does not recognize the copy
offload stateid in the wr_callback_id argument but the NFS server has
not provided referring call information, an appropriate response
to that situation is for the NFS client's callback service
to respond with a status code of NFS4ERR_DELAY.</t>
          <t>The NFS server should retry the CB_OFFLOAD operation only a limited
number of times:</t>
          <ul spacing="normal">
            <li>
              <t>The NFS client can subsequently poll for the completion status
of the copy operation using the OFFLOAD_STATUS operation.</t>
            </li>
            <li>
              <t>A buggy or malicious NFS client callback service might always return
an NFS4ERR_DELAY status code, resulting in an infinite loop if the
NFS server never stops retrying.</t>
            </li>
          </ul>
          <t>The NFS server is not permitted to purge the copy offload stateid if
the CB_OFFLOAD status code is NFS4ERR_DELAY.</t>
          <t>The authors recommend that <xref section="16.1.3" sectionFormat="of" target="RFC7862"/> should be
updated to describe this use of NFS4ERR_DELAY.</t>
        </section>
      </section>
      <section anchor="sec-completion-status">
        <name>Status Codes for the OFFLOAD_CANCEL and OFFLOAD_STATUS Operations</name>
        <t>The NFSv4.2 OFFLOAD_STATUS and OFFLOAD_CANCEL operations both list
NFS4ERR_COMPLETE_ALREADY as a permitted status code. However, it
is not otherwise mentioned or defined in <xref target="RFC7862"/>. <xref target="RFC7863"/>
defines a value of 10054 for that status code, but is not otherwise
forthcoming about what its purpose is.</t>
        <t>We find a definition of NFS4ERR_COMPLETE_ALREADY in
<xref section="15.1.9.1" sectionFormat="of" target="RFC8881"/>. The definition is directly related to
the new-to-NFSv4.1 RECLAIM_COMPLETE operation, but is otherwise not
used by other operations.</t>
        <t>The authors recommend removing NFS4ERR_COMPLETE_ALREADY from the
list of permissible status codes for the OFFLOAD_CANCEL and
OFFLOAD_STATUS operations.</t>
      </section>
      <section anchor="status-codes-returned-for-completed-asynchronous-copy-operations">
        <name>Status Codes Returned for Completed Asynchronous Copy Operations</name>
        <t>Once an asynchronous copy operation is complete,
the NFSv4.2 OFFLOAD_STATUS response and the NFSv4.2 CB_OFFLOAD request
can both report a status code that reflects the success or failure of
the copy. This status code is reported in osr_complete field of the
OFFLOAD_STATUS response, and the coa_status field of the CB_OFFLOAD
request.</t>
        <t>Both fields have a type of nfsstat4. Typically an NFSv4 protocol
specification will constrain the values that are permitted in a
field that contains an operation status code, but <xref target="RFC7862"/> does
not appear to do so. Implementers might assume that the list of
permitted values in these two fields is the same as the COPY
operation itself; that is:</t>
        <artwork><![CDATA[
 +----------------+--------------------------------------------------+
 | COPY           | NFS4ERR_ACCESS, NFS4ERR_ADMIN_REVOKED,           |
 |                | NFS4ERR_BADXDR, NFS4ERR_BAD_STATEID,             |
 |                | NFS4ERR_DEADSESSION, NFS4ERR_DELAY,              |
 |                | NFS4ERR_DELEG_REVOKED, NFS4ERR_DQUOT,            |
 |                | NFS4ERR_EXPIRED, NFS4ERR_FBIG,                   |
 |                | NFS4ERR_FHEXPIRED, NFS4ERR_GRACE, NFS4ERR_INVAL, |
 |                | NFS4ERR_IO, NFS4ERR_ISDIR, NFS4ERR_LOCKED,       |
 |                | NFS4ERR_MOVED, NFS4ERR_NOFILEHANDLE,             |
 |                | NFS4ERR_NOSPC, NFS4ERR_OFFLOAD_DENIED,           |
 |                | NFS4ERR_OLD_STATEID, NFS4ERR_OPENMODE,           |
 |                | NFS4ERR_OP_NOT_IN_SESSION,                       |
 |                | NFS4ERR_PARTNER_NO_AUTH,                         |
 |                | NFS4ERR_PARTNER_NOTSUPP, NFS4ERR_PNFS_IO_HOLE,   |
 |                | NFS4ERR_PNFS_NO_LAYOUT, NFS4ERR_REP_TOO_BIG,     |
 |                | NFS4ERR_REP_TOO_BIG_TO_CACHE,                    |
 |                | NFS4ERR_REQ_TOO_BIG, NFS4ERR_RETRY_UNCACHED_REP, |
 |                | NFS4ERR_ROFS, NFS4ERR_SERVERFAULT,               |
 |                | NFS4ERR_STALE, NFS4ERR_SYMLINK,                  |
 |                | NFS4ERR_TOO_MANY_OPS, NFS4ERR_WRONG_TYPE         |
 +----------------+--------------------------------------------------+
]]></artwork>
        <t>However, a number of these do not make sense outside the context of
a forward channel NFSv4 COMPOUND operation, including:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_BADXDR,
NFS4ERR_DEADSESSION,
NFS4ERR_OP_NOT_IN_SESSION,
NFS4ERR_REP_TOO_BIG,
NFS4ERR_REP_TOO_BIG_TO_CACHE,
NFS4ERR_REQ_TOO_BIG,
NFS4ERR_RETRY_UNCACHED_REP,
NFS4ERR_TOO_MANY_OPS</t>
          </li>
        </ul>
        <t>Some are temporary conditions that can be retried by the NFS server
and therefore do not make sense to report as a copy completion status:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_DELAY,
NFS4ERR_GRACE,
NFS4ERR_EXPIRED</t>
          </li>
        </ul>
        <t>Some report an invalid argument or file object type, or some other
operational set up issue that should be reported only via the status
code of the COPY operation:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_BAD_STATEID,
NFS4ERR_DELEG_REVOKED,
NFS4ERR_INVAL,
NFS4ERR_ISDIR,
NFS4ERR_FBIG,
NFS4ERR_LOCKED,
NFS4ERR_MOVED,
NFS4ERR_NOFILEHANDLE,
NFS4ERR_OFFLOAD_DENIED,
NFS4ERR_OLD_STATEID,
NFS4ERR_OPENMODE,
NFS4ERR_PARTNER_NO_AUTH,
NFS4ERR_PARTNER_NOTSUPP,
NFS4ERR_ROFS,
NFS4ERR_SYMLINK,
NFS4ERR_WRONG_TYPE</t>
          </li>
        </ul>
        <t>This leaves only a few sensible status codes remaining to report
issues that could have arisen during the offloaded copy:</t>
        <ul empty="true">
          <li>
            <t>NFS4ERR_DQUOT,
NFS4ERR_FHEXPIRED,
NFS4ERR_IO,
NFS4ERR_NOSPC,
NFS4ERR_PNFS_IO_HOLE,
NFS4ERR_PNFS_NO_LAYOUT,
NFS4ERR_SERVERFAULT,
NFS4ERR_STALE</t>
          </li>
        </ul>
        <t>The authors recommend including a section and table that gives
the valid status codes that the osr_complete and coa_status
fields may contain. The status code NFS4_OK (indicating no error
occurred during the copy operation) is not listed but should be
understood to be a valid value for these fields. The meaning for
each of these values is defined in <xref section="15.1" sectionFormat="of" target="RFC8881"/>, or,
for NFSv4.2-specific codes, in <xref section="11.1" sectionFormat="of" target="RFC7862"/>.</t>
        <t>It would also be helpful to implementers to provide guidance about
when these values are appropriate to use, or when they <bcp14>MUST NOT</bcp14> be
used.</t>
      </section>
    </section>
    <section anchor="sec-cancel-implementation">
      <name>OFFLOAD_CANCEL Implementation Notes</name>
      <t>The NFSv4.2 OFFLOAD_CANCEL operation, described in
<xref section="15.8.3" sectionFormat="of" target="RFC7862"/>, is used to terminate an offloaded
copy operation before it completes normally. A CB_OFFLOAD is
not necessary when an offloaded operation completes because of
a cancelation due to CB_OFFLOAD.</t>
      <t>However, the server <bcp14>MUST</bcp14> send a CB_OFFLOAD operation if the
offloaded copy operation completes because of an administrator
action that terminates the copy early.</t>
      <t>In both cases, a subsequent OFFLOAD_STATUS returns the number
of bytes actually copied and a status code of NFS4_OK to
signify that the copy operation is no longer running. The
server should obey the usual lifetime rules for the copy
stateid associated with a canceled asynchronous copy
operation so that an NFS client can determine the status of
the operation as usual.</t>
      <t>The following is a recommended addendum to <xref target="RFC7862"/>:</t>
      <ul empty="true">
        <li>
          <t>When an offloaded copy operation completes, the NFS server sends
a CB_OFFLOAD callback to the requesting client. When an NFS
client cancels an asynchronous copy operation, however, the
server need not send a CB_OFFLOAD notification for the canceled
copy. A client should not depend on receiving completion notification
after it cancels an offloaded copy operation using the OFFLOAD_CANCEL
operation.</t>
          <t>An NFS server is still <bcp14>REQUIRED</bcp14> to send a CB_OFFLOAD notification
if an asynchronous copy operation is terminated by administrator
action.</t>
          <t>For a canceled asynchronous copy operation, CB_OFFLOAD and
OFFLOAD_STATUS report the number of bytes copied and a
completion status of NFS4_OK.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-status-implementation">
      <name>OFFLOAD_STATUS Implementation Notes</name>
      <t>Paragraph 2 of <xref section="15.9.3" sectionFormat="of" target="RFC7862"/> states:</t>
      <ul empty="true">
        <li>
          <t>If the optional osr_complete field is present, the asynchronous
operation has completed.  In this case, the status value indicates
the result of the asynchronous operation.</t>
        </li>
      </ul>
      <t>The use of the term "optional" can be (and has been) construed to mean
that a server is not required to set that field to one, ever. This
confusion arises from conflating the the term "optional" with the
BCP14 keyword <bcp14>OPTIONAL</bcp14>.</t>
      <t>Moreover, this XDR data item is always present. The protocol's XDR
definition does not permit an NFS server not to include the field
in its response.</t>
      <t>The following text makes it more clear what was originally intended:</t>
      <ul empty="true">
        <li>
          <t>To process an OFFLOAD_STATUS request, an NFS server must first
find an outstanding COPY operation that matches the request's
COPY stateid argument.</t>
          <t>If that COPY operation is still ongoing, the server forms a response
with an osr_complete array containing zero elements, fills in the
osr_count field with the number of bytes processed by the COPY
operation so far, and sets the osr_status field to NFS4_OK.</t>
          <t>If the matching copy has completed but the server has not yet seen
or processed the client's CB_OFFLOAD reply, the server forms a
response with an osr_complete array containing one element which is
set to the final status code of the copy operation. It fills in the
osr_count field with the number of bytes that were processed by the
COPY operation, and sets the osr_status to NFS4_OK.</t>
          <t>If the server can find no copy operation that matches the presented
COPY stateid, the server sets the osr_status field to
NFS4ERR_BAD_STATEID.</t>
        </li>
      </ul>
      <t>Since a single-element osr_complete array contains the status code of
a COPY operation, the specification needs to state explicitly that:</t>
      <ul empty="true">
        <li>
          <t>When a single element is present in the osr_complete array, that
element <bcp14>MUST</bcp14> contain only one of status codes permitted for the
COPY operation (see <xref section="11.2" sectionFormat="of" target="RFC7862"/>) or NFS4_OK.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-copy-implementation">
      <name>COPY Implementation Notes</name>
      <section anchor="sec-short-copy-results">
        <name>Short COPY results</name>
        <t>When a COPY request takes a long time, an NFS server must
ensure it can continue to remain responsive to other requests.
To prevent other requests from blocking, an NFS server
implementation might, for example, notice that a COPY operation
is taking longer than a few seconds and terminate it early.</t>
        <t><xref section="15.2.3" sectionFormat="of" target="RFC7862"/> states:</t>
        <ul empty="true">
          <li>
            <t>If a failure does occur for a synchronous copy, wr_count will be set
to the number of bytes copied to the destination file before the
error occurred.</t>
          </li>
        </ul>
        <t>This text considers only a failure status and not a short COPY, where
the COPY response contains a byte count shorter than the client's
request, but still returns a final status of NFS4_OK. Both the Linux
and FreeBSD implementations of the COPY operation truncate large COPY
requests in this way. The reason for returning a short COPY result is
that the NFS server has need to break up a long byte range to schedule
its resources more fairly amongst its clients. Usually the purpose of
this truncation is to avoid denial-of-service.</t>
        <t>Including the following text can make a short COPY result explicitly
permissible:</t>
        <ul empty="true">
          <li>
            <t>If a server chooses to terminate a COPY before it has completed
copying the full requested range of bytes, either because of a
pending shutdown request, an administrative cancel, or because
the server wants to avoid a possible denial of service, it <bcp14>MAY</bcp14>
return a short COPY result, where the response contains the
actual number of bytes copied and a final status of NFS4_OK.
In this way, a client can send a subsequent COPY for the
remaining byte range, ensuring that forward progress is made.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-completion-reliability">
        <name>Asynchronous Copy Completion Reliability</name>
        <t>Often, NFSv4 server implementations do not retransmit backchannel
requests. There are common scenarios where lack of a retransmit can
result in a backchannel request getting dropped entirely. Common
scenarios include:</t>
        <ul spacing="normal">
          <li>
            <t>The server dropped the connection because it lost a forechannel
NFSv4 request and wishes to force the client to retransmit all
of its pending forechannel requests</t>
          </li>
          <li>
            <t>The GSS sequence number window under-flowed</t>
          </li>
          <li>
            <t>A network partition occurred</t>
          </li>
        </ul>
        <t>In these cases, pending NFSv4 callback requests are lost.</t>
        <t>NFSv4 clients and servers can recover when operations such as
CB_RECALL and CB_GETATTR go missing: After a delay, the server
revokes the delegation and operation continues.</t>
        <t>A lost CB_OFFLOAD causes the client's workload to wait
indefinitely for a completion event that will never arrive,
unless that client has a mechanism for probing the pending COPY.</t>
        <t>Typically, polling for completion means the client sends
an OFFLOAD_STATUS request. Note however that Table 5 in
<xref section="13" sectionFormat="of" target="RFC7862"/> labels OFFLOAD_STATUS <bcp14>OPTIONAL</bcp14>.</t>
        <t>Implementers of the SCSI protocol have reported that it is
in fact not possible to make SCSI XCOPY <xref target="XCOPY"/> reliable
without the use of polling. The NFSv4.2 COPY use case seems
no different in this regard.</t>
        <t>The authors recommend the following addendum to <xref target="RFC7862"/>:</t>
        <ul empty="true">
          <li>
            <t>NFSv4 servers are not required to retransmit lost backchannel
requests. If an NFS client implements an asynchronous copy
capability, it <bcp14>MUST</bcp14> implement a mechanism for recovering from
a lost CB_OFFLOAD request. The NFSv4.2 protocol provides
one such mechanism in the form of the OFFLOAD_STATUS operation.</t>
          </li>
        </ul>
        <t>In addition, Table 5 should be updated to make OFFLOAD_STATUS
<bcp14>REQUIRED</bcp14> (i.e., column 3 of the OFFLOAD_STATUS row should
read the same as column 3 of the CB_OFFLOAD row in Table 6).</t>
      </section>
      <section anchor="inter-server-copy-considerations">
        <name>Inter-server Copy Considerations</name>
        <section anchor="managing-foreign-file-handles">
          <name>Managing Foreign File Handles</name>
          <t>A NFSv4.2 COPY operation operates on file handle arguments that
are provided by PUTFH operations that precede the COPY operation
in an NFSv4 COMPOUND, as described in <xref section="15.2" sectionFormat="of" target="RFC7862"/>:</t>
          <ul empty="true">
            <li>
              <t>The COPY operation requests that a range in the file specified
by SAVED_FH be copied to a range in the file specified by
CURRENT_FH.</t>
            </li>
          </ul>
          <t>Typically an NFSv4 server performs checking of a file handle
presented by a PUTFH operation. <xref section="18.19" sectionFormat="of" target="RFC8881"/> gives
examples of such checking, which might include access control based
on security policy. In fact, <xref section="15.2" sectionFormat="of" target="RFC8881"/> permits a
long list of possible status codes in response to a PUTFH:</t>
          <ul empty="true">
            <li>
              <t>NFS4ERR_BADHANDLE, NFS4ERR_BADXDR, NFS4ERR_DEADSESSION,
NFS4ERR_DELAY, NFS4ERR_MOVED, NFS4ERR_OP_NOT_IN_SESSION,
NFS4ERR_REP_TOO_BIG, NFS4ERR_REP_TOO_BIG_TO_CACHE,
NFS4ERR_REQ_TOO_BIG, NFS4ERR_RETRY_UNCACHED_REP,
NFS4ERR_SERVERFAULT, NFS4ERR_STALE, NFS4ERR_TOO_MANY_OPS,
NFS4ERR_WRONGSEC</t>
            </li>
          </ul>
          <t>Setting aside status codes having to do with NFSv4 session
management, at least NFS4ERR_BADHANDLE, NFS4ERR_MOVED,
NFS4ERR_STALE, or NFS4ERR_WRONGSEC might be the result of the
server's examination of the presented file handle argument.</t>
          <t>During an inter-server COPY operation, at least one of the file
handle arguments presented via PUTFH is for a file that does not
reside on the server receiving the COPY request. Special
considerations must be taken to avoid treating that foreign file
handle as a local file handle; otherwise the PUTFH operation fails
and the COPY will never be executed. <xref section="15.2.3" sectionFormat="of" target="RFC7862"/>
therefore notes that:</t>
          <ul empty="true">
            <li>
              <t>If a server supports the inter-server copy feature, a PUTFH followed
by a SAVEFH <bcp14>MUST NOT</bcp14> return NFS4ERR_STALE for either operation.
These restrictions do not pose substantial difficulties for servers.
CURRENT_FH and SAVED_FH may be validated in the context of the
operation referencing them and an NFS4ERR_STALE error returned for an
invalid filehandle at that point.</t>
            </li>
          </ul>
          <t>This section appears to permit PUTFH in this scenario to return
NFS4ERR_BADHANDLE, NFS4ERR_MOVED, and NFS4ERR_WRONGSEC by omitting
their mention.</t>
          <t>The Linux NFS server implementation's PUTFH operation, for example,
is likely to return an NFS4ERR_BADHANDLE status code for a file
handle that is foreign to it. A server implementer can reasonably
extrapolate from the above text that other status codes, in addition
to NFS4ERR_STALE, are to be excluded; otherwise inter-server COPY
will not work at all.  However, an explicit BCP14 "<bcp14>MUST NOT</bcp14>" for
NFS4ERR_STALE but not for other likely status code responses
is potentially confusing.</t>
          <t>Further, this NFSv4.2 COPY-related usage of PUTFH re-purposes the
PUTFH operation. In all previous usages of PUTFH, careful checking
of an incoming file handle is a critical part of the mission of the
PUTFH operation. However, if a COPY operation is present in a
COMPOUND, the server must defer assessment of file handle arguments
until it is clear that the client has requested an inter-server
COPY. Because PUTFH is used in nearly every NFSv4 COMPOUND, this is
a significant new burden for servers that implement inter-server
COPY.</t>
          <t>A protocol design that enables more efficient server implementation
might have been the addition of a new operation that enables a client
to provide a file handle that might be expected to fail local
checking on the server, for the sole use of inter-server COPY.
Call this putative operation "PUTFOREIGNFH".</t>
        </section>
      </section>
    </section>
    <section anchor="sec-copy-notify-implementation">
      <name>COPY_NOTIFY Implementation Notes</name>
      <section anchor="ip-addresses-in-a-copynotify-response">
        <name>IP Addresses in a COPY_NOTIFY Response</name>
        <aside>
          <t>olga:
If Linux server were to ever interoperate with other server
implementations of being either the source server or the destination
server: I don't know how important are the IPs being listed in the
copy_notify reply. I don't believe either the Linux client or
server does anything with them.</t>
        </aside>
      </section>
    </section>
    <section anchor="sec-clone-implementation">
      <name>CLONE Implementation Notes</name>
      <section anchor="sec-fattr4-clone-blksize">
        <name>The FATTR4_CLONE_BLKSIZE Attribute</name>
        <t><xref section="4.1.2" sectionFormat="of" target="RFC7862"/> states that an NFS server that implements
the CLONE operation is required to implement the FATTR4_CLONE_BLKSIZE
attribute:</t>
        <ul empty="true">
          <li>
            <t>If a server supports the CLONE feature, then it <bcp14>MUST</bcp14> support the
CLONE operation and the clone_blksize attribute on any file system on
which CLONE is supported (as either source or destination file).</t>
          </li>
        </ul>
        <t>Although the Linux NFS server implements the NFSv4.2 CLONE operation,
it does not implement FATTR4_CLONE_BLKSIZE.</t>
        <t>The specification has very little to say about what this attribute
conveys. <xref section="12.2.1" sectionFormat="of" target="RFC7862"/> states only:</t>
        <ul empty="true">
          <li>
            <t>The clone_blksize attribute indicates the granularity of a CLONE
operation.</t>
          </li>
        </ul>
        <t>There are no units mentioned in this section. There are several
plausible alternatives: bytes, kilobytes, or even sectors.
<xref target="RFC7862"/> needs to make clear the underlying semantics of this
attribute value.</t>
        <t>There is no mention of what value should be used when the shared
file system does not provide or require a restrictive clone block
size. The Linux NFS client assumes that "0" means no alignment
restrictions; it skips clone alignment checking if clone_blksize
value happens to be zero. That implementation also appears to
tolerate a server that does not return the FATTR4_CLONE_BLKSIZE
attribute at all.</t>
        <t>The change history of draft-ietf-nfsv4-minorversion2 suggests that
at one point, the NFSv4.2 specification contained much more detail
about how FATTR4_CLONE_BLKSIZE was to be used. For example, older
revisions of that draft stated:</t>
        <ul empty="true">
          <li>
            <t>Both cl_src_offset and cl_dst_offset must be aligned to the clone
block size Section 12.2.1. The number of bytes to be cloned must
be a multiple of the clone block size, except in the case in which
cl_src_offset plus the number of bytes to be cloned is equal to
the source file size.</t>
          </li>
        </ul>
        <t><xref section="12" sectionFormat="of" target="RFC7862"/> does not specify whether FATTR4_CLONE_BLKSIZE
is a per-file, per-file system, or per-server attribute. Per-file is
perhaps the most appropriate because some modern file systems can use
different block sizes for different files.</t>
        <t>Note that <xref section="4.1.2" sectionFormat="of" target="RFC7862"/> states that the attribute <bcp14>MUST</bcp14>
be implemented, but <xref section="12.1" sectionFormat="of" target="RFC7862"/> defines this attribute
as <bcp14>RECOMMENDED</bcp14>. This contradiction needs to be rectified.</t>
        <t>An alternative to correcting the missing details is to instead
deprecate the FATTR4_CLONE_BLKSIZE attribute. Server and filesystem
combinations that cannot provide a fast, unrestricted byte-range clone
mechanism would simply not make an NFSv4.2 CLONE operation available to
NFSv4 clients.</t>
        <t>It might be that was the intention of the redaction of the alignment
text from draft-ietf-nfsv4-minorversion2, and the FATTR4_CLONE_BLKSIZE
attribute was simply missed during that edit of the document.</t>
      </section>
    </section>
    <section anchor="sec-server-shutdown">
      <name>Handling NFS Server Shutdown</name>
      <t>Asynchronous copy operations present unique challenges during server
shutdown and restart events. Unlike other NFSv4 operations that typically
complete quickly, asynchronous copies can be long-running operations
that are still in progress when an NFS server needs to shut down.</t>
      <t>Additionally, clients must be able to recover the state of pending
copy operations after a server restart. <xref target="RFC7862"/> does not provide
guidance for either scenario, leaving implementors to guess at
appropriate and safe behavior. This section addresses how servers
should handle ongoing asynchronous copy operations during server
shutdown, and how clients should handle state recovery after detecting
a server restart.</t>
      <section anchor="graceful-shutdown">
        <name>Graceful Shutdown</name>
        <t>This section discusses what happens to ongoing asynchronous copy
operations when an NFS server shuts down due to an administrator
action.</t>
        <t>When an NFS server shuts down, it typically stops accepting work
from the network. However, asynchronous copy is work the NFS server
has already accepted. Normal network corking will not terminate
ongoing work; corking stops only new work from being accepted.</t>
        <t>Thus, as an early part of NFS server shut down processing, the NFS
server <bcp14>SHOULD</bcp14> explicitly terminate ongoing asynchronous copy operations.
This triggers sending CB_OFFLOAD notifications for each terminated
copy operation prior to the backchannel closing down. Each completion
notification shows how many bytes the NFS server successfully copied
before the copy operation was terminated by the shutdown.</t>
        <t>To prevent the destruction of the backchannel while asynchronous
copy operations are ongoing, the DESTROY_SESSION and DESTROY_CLIENTID
operations <bcp14>MUST</bcp14> return a status of NFS4ERR_CLIENTID_BUSY until pending
asynchronous copy operations have terminated
(see <xref section="18.50.3" sectionFormat="of" target="RFC8881"/>).</t>
        <t>Once copy activity has completed, shut down processing can also
proceed to remove all copy completion state (copy stateids, copy
offload stateids, and copy completion status codes).</t>
        <t>An alternative implementation is that ongoing COPY operations are
simply terminated without a CB_OFFLOAD notification. In that case,
NFS clients recognize that the NFS server has restarted, and as part
of their state recovery, they can reissue any COPY operations that
were pending during the previous server epoch, as described in the
next subsection.</t>
        <aside>
          <t>olga: This graceful shutdown seems like putting too much
requirement on the server. Say the server was in the middle of doing
lots of WRITEs, does graceful shutdown terminate the writes and send
short write response back? Or read....</t>
        </aside>
      </section>
      <section anchor="client-recovery-actions">
        <name>Client Recovery Actions</name>
        <t>In order to ensure the proper completion of asynchronous COPY
operations that were active during an NFS server restart, clients
need to track these operations and restart them as part of NFSv4
state recovery.</t>
      </section>
    </section>
    <section anchor="sec-security-considerations">
      <name>Security Considerations</name>
      <t>One critical responsibility of an NFS server implementation is
to manage its finite set of resources in a way that minimizes the
opportunity for network actors (such as NFS clients) to maliciously
or unintentionally trigger a denial-of-service scenario.  The authors
recommend the following addendum to <xref section="4.9" sectionFormat="of" target="RFC7862"/>.</t>
      <ul empty="true">
        <li>
          <t>Restricting Copies of Special Files</t>
          <t>Certain files on Unix-based systems act as an infinite source of
data. One example is /dev/null. Another example is the system's
random data generator. Server implementators should recognize
these data sources and prevent unlimited copy operations from
them (or to their sink counterparts).</t>
          <t>Limiting Size of Individual COPY Operations</t>
          <t>NFS server implementations have so far chosen to limit the byte
range of COPY operations, either by setting a fixed limit on the
number of bytes a single COPY can process, where the server
truncates the copied byte range, or by setting a timeout). In
either case, the NFS server returns a short COPY result.</t>
          <t>Client implementations accommodate a short COPY result by sending
a fresh COPY for the remainder of the byte range, until the
full byte range has been processed.</t>
          <t>Limiting the Number of Outstanding Asynchronous COPY Operations</t>
          <t>It is easily possible for NFS clients to send more asynchronous
COPY requests than NFS server resources can handle. For example, a
client could create a large file, and then request multiple copies
of that file's contents.</t>
          <t>A good quality server implementation <bcp14>SHOULD</bcp14> block clients from
starting many COPY operations. The implementation might apply a
fixed per-client limit, a per-server limit, or a dynamic limit
based on available resources. When that limit has been reached,
subsequent COPY requests will receive NFS4ERR_OFFLOAD_NO_REQS
in response until more server resources become available.</t>
          <t>Managing Abandoned COPY State on the Server</t>
          <t>A related issue is how much COPY state can accrue on a server
due to lost CB_OFFLOAD requests. The mandates in <xref target="sec-lifetime"/>
require a server to retain abandoned COPY state indefinitely.
A server can reject new asynchronous COPY requests using
NFS4ERR_OFFLOAD_NO_REQS when there are many abandoned COPY
stateids.</t>
          <t>Considerations For The NFSv4 Callback Service</t>
          <t>There is a network service running on each NFSv4.2 client to
handle CB_OFFLOAD operations. This service might handle only
reverse-direction operations on an existing forward channel
RPC transport, or it could also be available via separate
transport connections from the NFS server.</t>
          <t>The CB_OFFLOAD operation manages stateids that can have a
lifetime longer than a single NFSv4 callback operation. The
client's callback service must take care to prune any cached
state in order to avoid a potential denial of service.</t>
        </li>
      </ul>
      <section anchor="securing-inter-server-copy">
        <name>Securing Inter-server COPY</name>
        <t>To date, there have been no implementations of RPCSEC GSSv3
<xref target="RFC7861"/>, which is mandatory-to-implement for secure
server-to-server copy (see <xref section="4.9" sectionFormat="of" target="RFC7862"/>.</t>
        <t>There are several implementations of RPC-with-TLS <xref target="RFC9289"/>,
including on systems that also implement the NFSv4.2 COPY
operation. There has been some discussion of using TLS to
secure the server-to-server copy mechanism.</t>
        <t>Although TLS is able to provide integrity and confidentiality
of in-flight copy data, the user authentication capability
provided by RPCSEC GSSv3 is still missing. What is still missing
is the ability to pass a capability token. GSSv3 generates a
capability on the source server that is passed through the
client to the destination server to be used against the
source server.</t>
        <aside>
          <t>olga: If we're ever going to "require" GSSv3, I think the
overhead of establishing the krb5 context would greatly
impact copy performance.... Even if we are going to require
TLS. That might be even more? Not sure how krb5 handshake
cost compares to TLS handshake cost.</t>
        </aside>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7862">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 Protocol</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document describes NFS version 4 minor version 2; it describes the protocol extensions made from NFS version 4 minor version 1. Major extensions introduced in NFS version 4 minor version 2 include the following: Server-Side Copy, Application Input/Output (I/O) Advise, Space Reservations, Sparse Files, Application Data Blocks, and Labeled NFS.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7862"/>
          <seriesInfo name="DOI" value="10.17487/RFC7862"/>
        </reference>
        <reference anchor="RFC7863">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 2 External Data Representation Standard (XDR) Description</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides the External Data Representation (XDR) description for NFS version 4 minor version 2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7863"/>
          <seriesInfo name="DOI" value="10.17487/RFC7863"/>
        </reference>
        <reference anchor="RFC8881">
          <front>
            <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
            <author fullname="D. Noveck" initials="D." role="editor" surname="Noveck"/>
            <author fullname="C. Lever" initials="C." surname="Lever"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 7530) and protocol extensions made subsequently. The later minor version has no dependencies on NFS version 4 minor version 0, and is considered a separate protocol.</t>
              <t>This document obsoletes RFC 5661. It substantially revises the treatment of features relating to multi-server namespace, superseding the description of those features appearing in RFC 5661.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8881"/>
          <seriesInfo name="DOI" value="10.17487/RFC8881"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC7861">
          <front>
            <title>Remote Procedure Call (RPC) Security Version 3</title>
            <author fullname="A. Adamson" initials="A." surname="Adamson"/>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document specifies version 3 of the Remote Procedure Call (RPC) security protocol (RPCSEC_GSS). This protocol provides support for multi-principal authentication of client hosts and user principals to a server (constructed by generic composition), security label assertions for multi-level security and type enforcement, structured privilege assertions, and channel bindings. This document updates RFC 5403.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7861"/>
          <seriesInfo name="DOI" value="10.17487/RFC7861"/>
        </reference>
        <reference anchor="RFC9289">
          <front>
            <title>Towards Remote Procedure Call Encryption by Default</title>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <author fullname="C. Lever" initials="C." role="editor" surname="Lever"/>
            <date month="September" year="2022"/>
            <abstract>
              <t>This document describes a mechanism that, through the use of opportunistic Transport Layer Security (TLS), enables encryption of Remote Procedure Call (RPC) transactions while they are in transit. The proposed mechanism interoperates with Open Network Computing (ONC) RPC implementations that do not support it. This document updates RFC 5531.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9289"/>
          <seriesInfo name="DOI" value="10.17487/RFC9289"/>
        </reference>
        <reference anchor="RFC9754">
          <front>
            <title>Extensions for Opening and Delegating Files in NFSv4.2</title>
            <author fullname="T. Haynes" initials="T." surname="Haynes"/>
            <author fullname="T. Myklebust" initials="T." surname="Myklebust"/>
            <date month="March" year="2025"/>
            <abstract>
              <t>The Network File System v4 (NFSv4) allows a client to both open a file and be granted a delegation of that file. This delegation provides the client the right to authoritatively cache metadata on the file locally. This document presents several extensions for both opening the file and delegating it to the client. This document extends NFSv4.2 (see RFC 7863).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9754"/>
          <seriesInfo name="DOI" value="10.17487/RFC9754"/>
        </reference>
        <reference anchor="XCOPY" target="https://www.t10.org/ftp/t10/document.99/99-143r1.pdf">
          <front>
            <title>T10/99-143r1: 7.1 EXTENDED COPY command</title>
            <author initials="" surname="Unknown" fullname="Author Unknown">
              <organization>T10 Organization</organization>
            </author>
            <date year="1999" month="April" day="02"/>
          </front>
          <seriesInfo name="ISBN" value=""/>
          <seriesInfo name="DOI" value=""/>
        </reference>
      </references>
    </references>
    <?line 1212?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Special thanks to Rick Macklem and Dai Ngo for their insights
and work on implementations of NFSv4.2 COPY.</t>
      <t>The authors are grateful to Bill Baker, Jeff Layton, Greg Marsden,
and Martin Thomson for their input and support.</t>
      <t>Special thanks to
Area Director
Gorry Fairhurst,
NFSV4 Working Group Chairs
Brian Pawlowski
and
Christopher Inacio,
and
NFSV4 Working Group Secretary
Thomas Haynes
for their guidance and oversight.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V963bbVpbmfzwFRvkRp5uk48Spil09TsuSbGtKllySXKl0
r15aIAlSaIMAGwClsNLpZ5lnmSeb/e3LuQCQnKo1qydrpksmiYNz9tn363Q6
TZKu6Mr8ZXpwnnf3dfMpfVOUeXq1b7t8k97lTVvUVfp89k16dPHhp/RimzdZ
h49ON9sy3+RVJ/88+Zm+KfJqkR8k2Xze5HdY8s3VnXv0kQcWWZev62b/Mi2q
VZ0ky3pRZRva1LLJVt10kZfTatXePZ8u6u1+WkQLTXO30PTrb5Jt8TL9165e
TNK2bromX7X0134jf9C6m2y7Lar1vyVtl1XLm6ysK3rPPm8T2vC3SdLu5pui
xaG7/Za+OT25fpMU2+Zl2jW7tvvm669f0FuyJs/ofD/m85RWSU+rLm+qvEuv
m6xqt/TigwSwXDf1bvsAaP9soD1I6nlbl3mXty+TT/mefrl8maTTVKGHPwFA
/t+zi/MT/PHj5en1yc3V4Xv+V71alXW2TJJs193WDZ5OUvpvtStLAeRFuc7S
P9ZNVeR37aesyPj7ullnVfFXhuPL9DJfpu+yjr+xK6TP7KNFvas63NHHqujo
p1cE/7yld6eHG7qAhSyZb7KifJnWn+Rd/9zky9usmy3qzXBTR7e7xaf0LCcs
42+aGoiYL4uubkb2d9FkC4LfUd0QhPmzaKvy9d++1QV2MSuxi3+ueQ3ebVLV
zYbecpcTONPLN0e///533/g/v9U/v//++2cvkwR4O/j5M/3zxTffv7A/f//d
c/z5F9zoS97G9KX8i//RZc06716mt123bV8+fXp/fz/rnn09I0g8XXXbp/T3
U8LiHdB/9uLF0xcvps+ef9s8m22XK1lAqfmafmhfvkx/P3uWnvzl+uT8+ORY
qJGOuCHUPRAQGtrwf1P935SosQUMP1X1feU+lLs75EcGX9I+X6b0broNf3X8
bQsibQEne8/p1etz+/v44lT+XNJNvUyfvaC9f/0cBM0ow7C13344fvN3Aii5
y6sdX5BSJnMV+qfQ+o9Eo8Qb0rf4kj4V/ODf/HORdyu8hD7OmsWt3wB+hE/o
5mf2o6f44Om8qe/b/Ck//5Sea/Jt7Z9bF93tbg5Ue8oYyAj4tJgup7stgCC8
rt3mC3q0BP4GaOGfmOk6RT367NMv1vXsb+Ois9tuUybJdDol0mo7ooguSa5v
izY1uKbLvF00xZxIqrvNFXvaL1O/RupWBzzpR0kkCmqTIrP0tCO4ABnzatky
M93UREVMr3IYekmd4D04T7Ei6mX5QcTcEWcJ1+JN0v+r6i7NUke/icMHOdWm
WC6JUSRfgG839XK3YCRNfvlFqfzXXwnz5Rt6e5auskVRFt2eNsIH5rOk26Ym
OVOXwE58lC5KOnvXJvSrJv+PHV2Y7DCr+GsiALqvFMAHltOyTb1JSfykK4gF
eiqjjd/SlSav80W2a3N+Gf+UH7ol0ZVXxMYq24WuOUkLestdXSzlQjpIoaJL
CES8NC8xJxmU55XukiGtO1ruGr0leY+HqFw7sXAGBJCwWuwnaaXibE6L3BfL
7pbPWzR84SRmsTZWI3yo212TxxthIBbNMt1mTUcsIb2/pW3d0kNltA2FIV3a
66wlJk7HjnE2wLcJlgwQFKTWdAwqiGp+B+0jxiAIWrxxQRc0Z5Rt6jt6EW2Q
gEUSPV3vMgJll+fAh7yJAJPT/dDahK5tV+7TvGmIBoCVteoPevllWd8Hj88F
k9bZlvE6awpaZ7nj+yfdg5g3wwQgzDbzYr0r+N+F3HndFOuiysoBLTCBxLSF
ZwKUJjh+8QVpXfliB6JIr3YkAJp9n7Sz5bLJ25Ze2YK90KsCAAY4IhpHvI8k
fiPdKa1yS+JBQApxslvRjxkB6SNCZsKOdF3XywGESKZOiaD7VL+sc6FvEtNZ
Q3BvIdppd8XiNt6Zg0PLLJsuimCakWaxn3a1535MvUIItNndFngDpGj31eK2
qat617IWvONlwk/5bU9++aXNF1N8Pr2b8ve//vrVjPb+fld2Bb2EGFK7w42u
Vvmik6d400StRLjVotwBCxNI2wXttiDtEODJm01R1WW99i+Rp6b4qqW3TCBT
sgVupCKdCUd1VO5Pb08TSZT7KX6vjxI46P/uKoZkWhYrwrxNHpGyPWtf6tFO
w3skDF1mYPn5z7T1luHJFL0g1J9npOABugUYCOHCrlzSG7pdA6XArpbhwRAl
wWLvXMynepVT+Vq3LVcdPYHbvcvKYskvF9oXkJJg2YKiCHNsWfdJvKxAgzYO
Duz2LmsrSIgiVx1/ScctS1NtbGH+tCdWFWBXSkrBrZSAzII0B8L1AA2YwjY5
qU70NzGTg3qL32clFLVVkZdL5gUXb96cXRwe31xdH15/vAoRZNcOt4DzbYFP
wpcY40lid8IwiNwJVR3c+RtREfSbCEIRemClbV0y347uXOBWEmsMAOQh3+Rl
oXSuEAKli1ax9dI9T98cXl9fPr9hs+fm9dkfr07/5STNuo6Ujx2RfcmvArsi
RSMr6V3LvCN9jF4/r3cdIXcBedSSpk8/WKhoaulwue1qhdVIJYIdOJ2Xn9ri
r4bm5/UocjtJ1ecG4NMqS4WhAMVvd90SHJAeVMkrHAtKD/1krzilopggThZA
ADT5fGrLGG/BTdJrnOakSIXtLfOKQEG0M1W6I32nK9b6CyM56Lz1QwzTv3yx
A35OmS8t7WveBGlPlyEqnGUVSct1DnmSp2TGsnht04P3H6+uDybyv+n5Bf99
efKnj6eXJ8f4++rd4dmZ+yPRX1y9u/h4duz/8k8eXbx/z3YM/kmfptFHycH7
w58O5J4PLj5cn16cH54diPiMxFyTO6FE8N8STwJ9t4mptpBI6eujD//nfz97
TkLtf5BU++bZsxck1eQf3z/7/XP6B7Be3lZXJI3kn4S5+wTKGvFVWoVogghj
W3RZCQw0mQiBSnD8h38FZP7tZfpP88X22fNX+gEOHH1oMIs+ZJgNPxk8LEAc
+WjkNQ6a0ec9SMf7Pfwp+rfBPfjwn34gksnT6bPvf3iV9HUO+vvU28+z9F19
n5taS8pKSSTZ4i7oJpiJFCBJc5WIbnRfp/fZvmWt4bBl1RI85D92dac4Tf86
t1fAEqerqJv41+1uvSYCxN2LLiioTXjinywVz4nWdhWQhCgpXneWqHYoO9Zt
pruWnhK+GByW0Yap6WqgcNDWgs+YV//yxUDbEIIz88oZJYAvmdvrik7T1qEh
wr9TBlWAcQlt0+/cwwblzglEugknVsTIYJeFVzaJ85BapjYYBFgr74xf6Beh
E8KLRkZQzpQInc4rZVicoHK6ih5IF7d13fLPcT20a9rXJB1RfekAeZsoYiyJ
dZOAJVWvJCOpESQJQDsJlFvHh8V+wEcrUbhF4RC5RHfu37UkHriACaA6OvHw
LcE0N2tR2P6XrUlbtmpoB9njW8jWBBlGPtnMYC/YhEhJvxdcMttpTcrK3F2R
0QdOE3M/jI1dp1R32Scyakikt4VcauUQIDPx5dRlII/o1GIz+dvLC36Efjkn
g5a9Nww5AADXVe/Wt3RzCb83VuQZZ9gUYk1cuPM0MJ0nEdwSlmBuI33lXkix
bzYOVJiOyRWo4rYaSkbGU3qEtudRCbZ7npEmKiZ7ekUYFyPrbUbkTRhLyglc
Amyfi3pXN7lqpj/HSgReb4CivTs+GHgX0s2u7SC3srk4DUjjgV1xP/A0JEoj
zCCJAwEn6ISQRowMdKLFJwI8hNcadgEcsyLCnJ2XmHLgXCCCckWDk0G5MHfL
HdxgtCUxM495U1BRrvQi3xCcmWUQ5l3l7HFJn8+eEWegFT0qMhaAQl+JUz2+
enhlsh42MBMOP4Ymx2wW10PrmDRKVzmRTeONaeJ8Xf6zcH5Vs8BSsO4sTQ+N
EDfZnlZR1lNUy3xLChddRbmPsT6rDDqb8PHQE0br+F/Ram5H9A7cqcn4eOFF
3pBSW9HDXkWjN1wIkXmtDWd2hx2eMaMF2OWy2JHZYe9On7TEgK8Zm77DU3Y5
z779KiUlW7cGhkrP2wYnqYCBrZTKjjrPCeeLmqghPVJsrXJhDurNavPoFELp
C7INW0E+JruMnUWzHo9iyiN9vKVVnJkbU7aKHOUdScQ76mYMe3BAx/2WBZno
DZsSXZ78lleMeAmG7AlMqA4dSHl05olnrYFPLqTyRKkcDgFzdUQ8lW/e854l
L+QJHW4m8YaWdIGHx085eDSds1eNIc40X+XYU9bsZ2yNrWp4roC02VK8C/Q4
4xL8ZRtIClaphZuBiTPVviWlpupJJRVT0EYytpwMObObiPvBvAWJtGmkhXuG
8ey72TezbyOOAQ7QuyNaIryk1vtsB/7nlFXtkdsExTMuEiRJvXU/GXiAhN+9
d+Lnup66QKePlrYiiMZ4fWSDOVwUunHaA1RVxYyINYQnM5/A0eH50cnZpOcj
YG336PWNfhqykiR5T3dYs6QxXeqG9P3TN5E3sfV+EGfrEHySnnQNpE6Pf9sp
gV8gFDJMq2Kz2ySkpYD9BNCZ8htEuMfLA/nWOV0EqfvpPSkaSRRq4OdGFELc
Ix4lPL0TNYvldtLdQv8MOBIvVENrZoVsVwV0perEqMiOrlGFIulRbYGTYZ/1
rmMnbe88IGF3KyLO8Kh4SPyjrHUOH43veJY+JlsTdiSLhuoUoAE6tXmPP+PF
zsGo+pnTUk2r9YAW5x5uV92Vk4S+gaSiRwNlmXka/F+wT5S4oItlfZtnllzv
zTHW2ziHR2wRsrDNuV5UZMRlfOGJZ1Thw8yvcuFYPwoehzGah1CafjVgAOAU
7tVssjJPiWk0pk2+5fjqIrEoaDCyTEC/Q52ercgj514+PRam04gyRBJgt5lD
EK4ij34U9IJ22SHK4NzCxE0FyuJWM0Q3B/Ys/TFP2WWVzvf0K7JP2P0FZZjd
1MIerwNntpqwkS87SQ7VNLWVsRfoAT/ny2mZV2syI+ZlPccGOIj0JEN04Zbg
vUr39Y7IpCy/Shg7yVwilYq1DwcbNZrylKPV7PmBZWIGcSCAlc3OoMDpVsA3
3KJYs5JoFn8/kb/LGo5u+YAYbUawKPO13cuDkcUqv08t+YX1UH0lH6To+Jbp
d8lBCPUDMNCs8/4TcYNm3p8uF+Flb9EmALQIdvzF4N2SjS/aGS1Gt414JZvL
qgaZy4J1R6Nm2rJadyuLukj4bAdtQq0pYa74iFE5+ewz7F6VWBwDo5DX6kuT
JwD6hIEstOGh+1UPvE2+gvFFh2KLiOkeHElUiUXV3BiMxbstpwtFnrPfn0SK
x7c9dvpVgo3YS8SXyOfJWqfcNAv3tqxZq7OLeIhYQhYkftJTcHrvwYIHWUR3
B8y4cJnhgZhkwp8JGpEIo/eU+17Unn9Dq0DTkOgqf1rvmoXzQYDHNqxC0lfE
BUmg0U/VOn1ULfvMPUCo3Dc3xsRuELqB9se34cIScg0ZjnUwfvzeGgEkgOW4
jN6TzhOshhGd41BfjbyWZX9F8eI6k9GnXbn9JYbzLT2fbncNgCSWRQShZwMQ
ScQ+YUhJBL6WvY2cmBMlsrKt3Y4y57dkDu3wSyDoBYVh2b/DoiiLT6IakeCO
TzpLTjvTW2RHyhqGexFgQMGW081im/77+JS0JlSqrqT1Dlg8XaiWdKVC5GDC
pBSY/qHtjcgVK1nZA+GKSCSXbLpXbEX0Y7XACmBzDmcsB3B6sWzZD6xXkeu9
L8TCllCdQ2N1avWUb7gdeuo3jviQ/u3Y8sHYhg7sXoS9VHuR3HnJ/ohQgk+A
CnR7MMkKvk6T4+bGY/zSezMaFZ1Z1Km7rCRsEUEKJh1EMYAwRmBMMRM2qld4
k6d2DnYAfE5FSJLzmiQvIy+vG5HF932qcCYQr2m5PzXYaZ+VAtWrvm5l+D6H
8baXlA8S/6DuCaxgeQHvue2aYtEptx4IYQECMNADQchT3z9Lzoic7pHA4eRe
+9ltasjW/MAx83/Rg4YIGXHkPLDyCK1Hi/6ODIHeouKRoJvK7wpxugpDXO0Q
H54o6tCpieM38oua4wRds1t0idcunPvUqx5eZ3BUE2tliRM+nCxTrWsJdTPK
58vIx/Uhb245USbyR2yK9S07R27zcrvalcQyQv70MnkZKG+xCGRfJ+mRWfmA
PPxN0jDrZ7GRDInk7jxfkw1CcGx9XsX90MxgJ07Sjxlk4wY4XVqPLzx20Phs
QRqEgzzZRiNAT5+oqhZIOvXcfiW6/MeWHz92Gpjj4yRKFwvNqaJz9PSDZxEO
egUmu1m2nUNtNnqM8r0RqQpxG6R5ZLLF0HASvxfjiRq6uzIXHHXI6D2cbfo9
bes7VlBfpc+IEamE/ldN6/03kgRwW8PBNPRFD3U8WoW3P9c8qUjXVN2H4wac
G5c1pH034V2HR0FACHbFyr0/dl321UsPN3i/Pgc5eAE/BzZa5/OAA9i+GYBN
BNqqaFroCFXHGaGmt4iMqO/5TTtBJq/O+9SoRAAgvgY4IOh/8g0/byGj/GcW
xZ9ZaZZcFdjAMIXUe36VWtJb2ldm5AleoAE4UOcSftjQN8IykrhmCSECP83o
OTjDk925WdsS206cC6UHIOSuVkQ/cJAg9lmJBY1T9fwRlpWCgAgxGHBDmHn7
rTBetlA536fr8mVCgpBVBKSew19Kz/gwAGkuH07On99cvTu8PLk5PDo6ubq6
+fHw/PoGn9/85eLy5vjk7OTtIcIKkwQfhjBQ3UxVxQU7WDzKCLL1HETMvUnp
XeQW/k6zEcDNxC9DQoM2C44yttgkCc13H20oqiXuWMOJ0fKqSt1n6tAjjgZC
hfmb34BRkzL7MkMg6FfQY7nOXtL/hhx56833kOlz2gKZqHB/SJ5bwUKK6e4H
WsOEWYFYMHaonrBl0S52LVS7ubgu2dj81sxVv7MZLXJVx5ImJGx4oqIHUk7F
AxWZ/rsTcfsDOxBgAwA+Z0W1+9mChq/COH+Z7aplg1018Kc1+V39CcrTit0F
Oa6/qJec57kGms/3ztX5So6Pm9tkDXRu3iedAaE9gj8eUUnB4imDjjlXVyfI
mXhQW9H/T5/QNxuyA+jnbO68Su+K/P4rF1Ygmqaj9GBFkApld8vp5YwOrOJC
r3wVONhnGrFinlB92bG1m60dDtlD6nOEs8JiDeYwwvVDZQ689jAym7rsPyQe
M+/UzCA69PJ7N/hk8KjmbGObHbuzGOqglaJTc17iauyVs0DuVz+krwm0p7xD
RPy8IzeCE+iiFRGCbBBElkmLycuVSK6DXSXZ/sVfc7JLntDeoUkh4+ArPggd
ikxVNjYhQIpKBVCXlz67W4BTMJzpokmFM7SY5/SdOuhDtOwnn7TZKkdytpYM
qGuXv8ONdJrQMxIIoINJHj1jKts1IS7P0vf7dE1Mh7Gj2SkAlyKJUdD2/OTy
8ubD4eX1+cklsYSbw4/X7w4k4STdbdN8s+32wL70HltZ1jhk/nPeLGAnkBLm
7n3kVvk6XY41A4jW2OQ5PyTGIV3LGhnaB6qRE910baSa9e1rpDgdkk3rdMCj
uv5UEKOjz4chhcgCpZctgFCI997lJcDYIhcgT0J/MhsdLA8aYrONy2NVmRx5
jEF4mtASeme9hjpjncv/e6JRCUmjTozFIzaqqeqOcUbSnbN8QJNs8NIWIWN1
z3ztER/lpM58+UOafqyWnLnJrHFRNIvdBqWCYPiFqPT91ea7zRaPHhPN5Mhr
QuVQZ/no7uDIxbHwVEG4xD7SA03qZVsaWgISM2/zva6A9I890HTdSxHu7eEH
HJZ3PrZvtmF9atPUSkvYY8XGeuoAoQms4OYSWHxGD3Le8A8GUJZxrDtF6U39
fG9JgGH1aZNjk5yPHUDkh/TUXKW9J9Uc4tjZimsBbQ122zDFW6I+aQh3BXt+
pjsX0HavwJ5ZkfgN+3V56Ublr9VcPzk9VsNsxH8jnh1AHTnSYvCoAhBkcyGz
apK2pog2+ZfQQ0RVE8sz9SnBgt5L3IGv9UFshNf6gWmd2dolcvrTywyX/CMU
0GCDl+oHkXhLkP2fJMeRKCvWLkIfBcnZYQW9R1dM4gBVkJQ0BkySM+LEWdTr
iqRF0iM49QYI8Y46LHdVV5SSHp0EYgPKhmqPkujAPIrZgGP3Zk5LOmIS+5M5
8gO9vYB2bYmRw7ielxlcxwKZ4t8o8UDHqp0OKNyD41++KmMSij12acqW+zE9
c9/MxYOnv3JVAeAI+IceZ8uJo2GEb5WT9VKiFJlzS1tz2xTCF0AFfN1Wk2da
Sv/uhkIh3qgHzSw93IAbSLxHVqfjmoQP0+FE73cZnMye30N4ZcKNs8UtS4td
xQfNlyOQMT88EQtqvxZ+g9kAPBY9aJrijvnnBukzSNuaIb3+OKvWGg1dLJod
fuHfHDPu+k7TKeEBIRYIthbtDWzDMQ0ylw5/gorcRw5U+JhnU4mCECbYSFGx
Xw3BxBo16vK6j5IATSf0gQLcGBl+rWiYBMDAHf365urkTx9Pzo9OuKTIM/qj
i/cfLj6eH6dPegk29Dvvq/nm68AJCXMeEaheApJmhFb8AlZGQngULYcZxKcs
YmxgBModWkEE/o9n43TqH53pL5WCAVILHplLVjglUwdqTea7kpSGKRFOvZoI
n2XSIO2kLK0Qiy31orMCs0ZzGH29aJQpYA52AQWkdOBvZ2HNFmZfTR27LI3r
i3fVyqYlkAJ+sa23nJg3moPAmE+KFwwU4BBAH6YGbFxSzUNErQxZ8vaQO1w9
gFJitIUJnVMzjvp7YrcGJw0vtKCC7DgoJbWkhSHlg1+Fj6rpIJ3dI8SWXWGC
oGRArPzlceXR3q+H1fhuLdt67ASqjosRmaRSGFO0UlGZsd4wwl0sv0fqmX11
jTeWepyRAJo7H/hodpURaORNBxYQ/yqLReHr5ySOSDemdhIiphl8PGH6DCEa
b0GOzQog6dMBgoohcGZO56hERzQBV8tnSRdORWFHobezWFcdBNHMZ5Yokajv
HIEU9WY6ET9eUug4TxKl9vXjhmECBut1TLZZOkj+LlnS8WZFYxgx+iDA1aJg
p8+lM1OGUUI1fSZJ4HncZk22brLtLbb4SKwzCmGOhfI4T8V5hXTD6nF/cvhV
qCewPycuC2vBfp68jn5m+VYaRRBjfr5nZifKchCL1BBZVLURrYWMkLav64Z+
6ZnW7niIBEFGcd+wAXLgluSdH0hJyMRlmnBthrk3+QkXQcrUyeyYqmnTXJzA
ujaSQW7r+4QtkSzGujBPUYwPkB/DW/iv+Hhlf4lzlzBr1eK9qEBPEJEwBFKa
v5Jsb5w1Gcf3haSkooKIwevLyFnKDwqdLQdtcBCXHzOmoJoS7tFEgwDMbxwV
uMSd/OdFvoUX2vn652TR38OrGDMC5LsWFUPMuNV216zzwQYr9be40Fxsd75k
p04tVdwq1Cr5zmH0bPgb4ozmy0lJRvKyZmawq2bkGTUIOEPv5C9H7w7P357c
kNVGoDs+ubq+vPjp5ujs9OT8+tRr2a/QWMTCMdGLLGIpdbEKTLhrGmkVYb0n
eIm/aW8PxKp72wjWTTUIDb20HVzqo28TE2FguPbfyS8bOf7D70xOQ72erXwp
hovCtK4agHOA0C7iPi+5WUZi7no2SZTOPOFJQWzW4339VE2ftAf/ec3l+z1d
zHBNLEY14CbimWbNRV9t723belFwNRPLGuT1abMNznXRThuuYP9VWLK0ySqN
e1tINW6l0c5G8kxpCd2XlOvB3Uo7DFkyE17r8+P8TWjckthcw/dddBI/UikX
VZu17raLRoLTFTtqz+EEF9vNOR+K1lLCuLpbizxG5GSYwPIFOxuh1qEgfwKE
pDe9lzp21Xvls48tFwmHKXvK+RXXzGkoRS9xoT92hO/5fqL6pCAmhcyrIAl9
rFWB1LVVJg4S8TDKO1TaaDbfJIiVETFZusNIIm5oFIMeucAfB5Eaf1JlmUa4
T4ivIV80OVSGZNAgpCnaT1ItPCwOie3qbM/VGInP2+RA41alKMtkX9DpanRY
UQxvbexwvt2bKI/DpgxRHuAw16SXiBDCTRpQcaacL1Wr6tS10oJvzRtltDnG
VOTbTPRYt+ouhxR82BUl6ZnAG//6L1vvIghRbKa8lJvnuBhqjIVs4EqZcFSc
0j87d4mh9+7Yv02WqRMe0XJNXloJJa6JsUREDVrnyLVL4wYoXZucb50dPoGJ
5koFo91wzhWbnqFPk6Tj8dnJZMzNKZl4kStjkMo4dskWSF/jppB2JdFNTi5Q
pdAzv4dvKmoQImYt4uCZr0yOXPyWqSQg3qJTVbHQokgN6CujtbtW3XaTlRq2
VgYph7RUCeQrNnBgbLTPgiY8Jq2/wn5nnS+GEO6lyD4LkmDUm8CZVPnI5Yj9
d5+JdnhaInxdMvAglSRY4eh1sWsa8aNIIPI6+Mz/HHoa4UuurXYk6KLtZhb7
lGT94lPrHIriEmERKO0K6971PeATSoL9WWwaAm3XypHizPThucVDRoD23v8+
44htEf7q8uQIXQ96SQaimsxz9RRsiNrKkQVDxh35wb7p+cGi4lTx7+lJTYK5
yh/u6iXR98VtKM9va3RwQSmmz0kwRb4HCpEUQeI0nxe14s65mN2sbn02oJej
WR9N3D6S4AYVR8o9a0hV7YR9LN8nxmId4SYPhE58Ip0yt+GpGDuTcXL2bETL
yr3f5XNvl+BQcOrWqZHxYXDUJHQFBMkei7x8aSGpwBzyUgD+LTaEnGu3Z95D
t+w7yyN4FGO0/sOjbqfHOa/TVhJplreMuB+TnCpUw6sYsC2TAgPG9Z2rSYgo
IbUOD4NoGVv7nOlk+dwWXrQr3rK2I5mKqAtlhXavfhH+teZA3cZFzA/E4A6C
Bw98OnKivhUjl34G7UQpY1A6MVHXSL9K4eEH+1nk3L2ij7tDkRekO2tQwBER
EGrg3x8/xYPvSeKQ6rJ1frQAK2PssEucuc4iPmODKJN+n91D/ahXD9KBxPRc
hYRLao0aPw4IxSxTDtlwkfdKnL55HMF75LgOrOxn64OVJPgDV5X+Q3odU30g
QVQ5XQ795aMxl6gDX79WQEMwfAm946MQH48HMmj27OvZ7/rRGAKd2qSLTAP5
EXuE72AAjqzwvS4eCpUZvLNP0jwtXe0akepW5kFgCpDa+KOBZwAcp8erdiWK
uvdtwE+GO+I0oSCCZ3IoNGGt2CBYxVKhiqVxFG4J8/A2RiTZGLBchJYbAZGW
CKcAx6UuLI/0ceRjmZ0t95pFhYUmUs1XQROty7s8KMh4gIQGlG/lF8SGEifz
zUuTBdJ8XIwzxRW+3YE4uB8/yONMIxlnGv8/JaoTQP/tMjUAQChV2YQayNNn
fc3yNlP9GIl7yNZhoylahAWppKPvRRL6BCzU87o8A/HiI4UKp1DK0HSDoo3y
5YtKfO/3HBHON8rjsJi0l+FMymuvvipowE64l8lSA3HNXl8tHFzRBdWtbVmb
70IzljiVkoO8v8UkfEA+Rs6f2CE9KOEzWgmYkGEitMGAdzzGw1hLD6N4oXgT
F2HR7VySsfHaR0+X+OTyz8hlRoFAIsehEVK/9QZGY5CaZF0WG3RDTzze4H5h
zwTiL2DN7W4ul8ZMpS698dSrJ+FeVLE+4N69c/krvQKo0Iyj9x/S9azXe06D
yxAZhaMx2lCfS0seQIm2bz51KzSlJBMjAOhEffpq0nNdRZByoZwGqwQgrnJx
EdfbVuAMz+ngIqzjw2/nbPS25LfxtfDu/5sYmr3yIRfhZ/sZBK1PzHU4aLwa
d67rPR8u2Q9btpLDBceWk0FQrc5Ork9uDs9Q3fKTFK6OevCiBoOJWezmWww6
gHA3zZXJ4NDj4/7x7a+/JubFyTRLnOD47Ouvv3uu0Mq6GAfBhvovRfC/uyUQ
sa/dh1GhtWlJMT0DppmbtjTuSRmAoaj6wudFzws10+arbjm4aaw4wTsnGVmJ
o6PBmmWGXp4cnR2evndvDS0yPaaHK/w6O83WlZjDoAZ2iN1k2tecvvXgAV0c
i1M/zGurjVcG0YNx5E0e4k3tCA1culouFMa5eEvcrJHrnIPuP6w5jkVx4w47
5plwytkYafjcNo25ubTNYSohN1qouUO79C+KmIzGOVdwTavzRjpTAfXhLdyx
nZcYD9P2jj0+JUsLkdQtCV89hC/px/U8cAjfLd4sW+sENZJ3GLSE58aC0g+Z
jbSM65/wTLVqscxz2ux+Wyy4QMHFDM3z1G8FX5Slz6fn10oltMYUmzxgJRAd
iWzRasCgqXOA19/mgOb7HRdZ8fB5bEvS/OpZejrImdS6Me8MU0RP/I50r7Jz
a2WozaKtYGKTW2eKXudOqe/4g3m/SR34r//6ryT9x2nvv8EHn//vH5P0P8WK
8//9pyNlqTbzcYjD4/en5zeXJ3+++CM6zAWPYJnef/8ZKt9/Ob4cD2fEjzy6
zDFxkyvaD+rc+hGQv2mZs5O3/hDu4z99vLie/PZlTv7yQfrs2QdvXp++nfR/
/9ll3rwbLPT28vAoCP6cnv/58GzymWVOL4IHro5PA2ifXRwFt/X4Mu8v/hzu
5PzizenZiUWjfvuhzi+uPhz5ZYyxHJ+cn/4teHNxFuCJ+/DDyfn7i+OTv2GZ
DygMJDjeOOwZ/+/xZXoVRQ8t8tuXub76+OGDP9gH+oPu8ebdhQD7M8vg17QV
wv6Lj9d+lcuTDzfXFxc3DhkfXyb4Of0vCdyjdyejJ/vcMn/yb/UfXl/+dPPx
nBc9xqs+h8WXF28CbnN1cvnnk8s3hx/PrvtbenwZwpkwenr10/uz0/M/jhzr
8WVwoPeH5z8RAgW7+vHy4pxg9dOHk3CZ/ze8GGzdB4pD/4FIDcksltaOCMCR
NN113BI1dsInGVSf+6xZpovbrKryUoWrc28GaqDLl2H/RY9nB5+E7Df4eEhd
wZchNo5/7LEu+v5P448NECr4NryuJOFuv5zynG8wjKzZB+Ue5pzlFlcwGQtf
ohYk/6jeo+1ahsD3nZ8zF2QYGN4RVEVaBR8Irw8+UGmgB7DlK0v3CzqLSDAt
ref/jhpQ6FbsgeVMdWmdGDVXyzsUP3KGvZo8Lo3GqYfshkAVnI8SJubncFlm
btU+vvgUhejAgbANvhCpFn7AUiv44E3v9lWOBZ+ItAo+iORViKOxAAq/ORvd
thMywWd9/j/6lfD0EGfB0oJ/GzMKPvIcRVN3uQVma04h1Ay5aHsvLwWZs1qi
LZeYaAmFqr24YFG+McWoCgdJxXlwMZayKhRehVNSwgu7iEEPkR/CJBRn/c+9
4ApBE/D78GNw84esT19zmbmmSUy24h0FFJDxIj1cfATSgdCp7JFZxL1InbGT
qKKOqINaEpqE1Iuj31z8EaXw3NkAW6pqSRFI6gX7/pcPD/L6yhwOmrcEcyRw
CqFmre0whUkLa/Us4s7wHdJlp7I7m1GDfE7pg25ixIyRNnaehD6IyP8AvjJJ
dIga7NipSwVfSDZhP80qbiWDSGuX3vNpOOHJdwaKuptqgyoLE7lkQMnktrbn
/gCcYhX3QOKGhjbfqEOZro3qYDi20lGi72DoDT4956IRdYqNDg0ad4z1vWCT
uIjr0a5aE5dNDmc1J+1IxN0TatLzRsxdGzFD3FabSJecEx9VfCXSs1gbSLts
r7EGQ361uU65Y41CIKF5IFKf6t8QJrh1PtdZmjfn7A4bdXyrQ/ehpNzRvbCX
ZonWxHAGYBKpFvVqHwOFXVD8yc1oJFtBakuzFlibBQ70oQvH58uIGoZ8w/ke
69Lrdpk2Qy+04nQ0LgCG0NUJV3Su9p7ZDN1KxCpKKWBodpr6izScOIhQz/O9
ZuAinc5X77gmSi7w4hIQeinTdo3cBfPhetp4HkkYcvAZZUEmkTqgwoZ/skdr
NORSzgtJe1f2jV0sl/THbiP9qOLuUz8OkPQh7Jj0VDfpJoIA2GhHXi2tVmeV
z6uPUsARHXXnJpCNNxcOqf02oABf88H9EEB9QzqgT72Hy92fXpA2OAclx7E9
XySYcotAlBNINNmpnuHCgAJnWhXRSR4E6jAeJHwtLjJ6NShKYbcjvHThjITH
zyyx4887XR1NS95KRPuvXPLDKwu/PoLj4XUFm5JM/QELcFNdvCEmHCAkfL6n
ntIfMIBI3ujKj8gbeX4obz64cq5v4hK3kZ6EI2mQNqRuzP2LYjGp9RcyyuIu
+w8V6aWS5QKfeGYpP3p6UUusx1OrfXx8O9/+WwYZo8ro8TvpuumG7JnV9oQr
A7KWs0e/st6HIj6h+SS9UhMLUfu6M1hE/CN1FNdSt5prhm4B00cbLor6rDUa
3FAsc01ixvZoyUNJPGDKRn/0+vnT3sjUlq7ZBTJ5wSQlaqr3Igqdeca/5N8H
TR6DnD12OPeaGPLcoNpSnXjDMsihYNey78XQZ9bsTYC9y904/RgJn5Jg0055
tlLHHF36BtYupeHBxpqT3ja54Ic7rllfInCpXYcaIZ9sFFao92qgdN0vW20H
5uK4vh3oK6OIrBvMYjX2pQ0vIz1GhnkECXOvVJz24ilZ03gjAXv+a96QEVDa
3F2y2EvXIuGVPrurDAdd0lmf3/gOGnM/PCGizRaDgxodn5hrrAjrRwEbDEoz
tvTKcweX16VTjAMydzkZPh+DEWqfQ6DlPPOm6XX48PO0wnDXttyPwVRKrCRc
9ttgitRtBanL8WRx60YORAPBQgfGIOGq+7uvhHHoPvddQNzlGPr1GtCM3coD
92FtJLNKCKGq+0JxgPyuW0sP+SOQP4YY474c4gnSmxF17dW6zKcG+YfvaJhk
zvZDHyb8oyjGF3ZG63JXgF+K5hyW4cpeHBZ4CebGMA92N0m1INQeYtvEiv/Z
18LtfHq1Pz6EZ00E+rcr85ki87ffH14sZ6cN8POP2ZzD6e+/SpR7OBNWtYbh
SFhL34pyNLlEG4yM67JhPIxx4UTHPovCyDAqqp11igK4rP2TtI+y+kTr0cDc
n+Ro1fW+EgE6x5QA5rBxrWWvdQOHVic6fCDDdxNWHheuaWR8D8gTkcxYM6W0
IYM40Ba1ja/31jUd0EzDx3vlxwpV5iLvLHjZu6PdL4cl4PfGT6yxAErXXhmn
ekCxHLYxFGdvkHD9SstPzLdkdf8yAEp7Cnknom5YcduG2GTBmGGdcOjnlDu2
7MPnvMtUzsNPGpRDtp9EJVsiVP3Qmf6wRiOMlBMGsA63FWTn+5smz19fHQ+6
mjzQOJBMZ+4pWmZI6wonOLSuNTipVaJNSRKlzqPG5tSJ2CcxCJeoyiUUhNbq
jhb7BPe6EhZDqUHbIOZm6FhEJnqiyhZ3gNCxXHQvKLHI0KOplWwirb2epR9b
8TIwe9cUI7a0uU0+n9XsIxteOBgtzE6PsC1dT7tzk8LGTu4ZcBKk7HgqMDHF
HaPanuNKVvI+qkirUNvWbWrHKMJXhRRPhpzRxMTab4QeIFrAkqjdAOdQrwxs
RDApMQjZM6irqE0SNtX0YMz8YCiBaKoTCAtu6duhAQPrLVwFOQK6cFrokIyE
fMWL9Khp+SCx4AY8QgcD6qR5qPijvG+Ld+bll48beEQlKIPpy41knYsfWjNL
Ky2RdKthKlXQvPLSzw4fZhaGg8WT5GLVoVPIedA8b0DsGndDmC6rWpg38OFo
XNMR+Ew7RWUyuXMDlXiRV2S41TZIyeq9s3AtzfhnQsdVBms7obnWnqDLpt5u
6W6s+nSGU9ObEv8mNbKsdZWrgNAnNUxbqagxjKZ9YBJ7ymHb3I6WKlxc1Q3n
IPN0xY4HoWqpgy/3DM5FnEPGz3KCopJKsLqTybrRt1dXg7aZxCaIsFKOPkxX
xDaIcKfpIbG9jttFcOG95DeqELKCMGC7+Fjt1XIU54FzfNmm0GMIRdQp2lfT
tzrfSVpBsOc6SDRtd2hf1ia+yFTneLw9ucZs+nRdW5Xwy/RQSw6XeZlF1khi
nZNF7Lpm1Dw3PGoVBU2o5aE0fGWRe3HX9ltYAk6cU4wWG8jJx3hSyWjWZgVZ
6D0SpUlMC66P4tRmKbeaJLuqlCIBxPZ8r8Us3fCtFu1GOkI09dw4a1ioAw3B
8u0mnC5uXbuDHdhgaF9QwJ7UB634GWuu5vqUvflZpaFa1VOpymwOT2Q/Kdm7
SKI8O5X4V0dXp77UnCObLnhtE7kKHivNndiiEX/c6+6TrvEXGdb9C/8vD0OS
aX5JMM3PvFAKqZll4PsGnDvFc2l8n1ThaC5TOKTh7iPJ4aFMfswbHjJJoZu+
Rysgf8bNkE++8vo5C+/IsR/0FPu7Buj1MTDoGAONn/3wfWpx+BNC1V2ttZuA
RV7lQuT+HWrk2WTH0Fc9UruA/gQ6IHXicDNoIuIz7hk/emP/nDf7STHLZxP0
idhtqvTbB17cEMOUtRPuyB6mdvYfDaGBNsiV7u53Osgjmq+sUlb0ekta/kIm
m2ZrgPoNcXe0in0DS+GdFFmDT52PD1bVUbfcQIeNC61GN2+ZMBoere2Kb+b7
9MPH6zfvBlMWtghDqHOxb5YFDYEs/2jymRGy45NIBoMsVYaoOShqo+FGEVb9
J9y9/erwzyfHN7T7eR4YWo8+SI/B4P94eXlyfk2PhjzUH8tXzYlTi1s1yNAc
rfRX4Ca9pro9YIbtDZ59P3v2Iq5Bk0wGNYZlgg/owt5mFc+Sk2zu3kzSxa3R
Pc8UTrihOYlsqGjE3orFnmtWwTQn41ehWxB3CNx2bOi4jP56LJ3fOwp0bA4f
t582NNLsJMoWfiDvTBN/H8hc/c1ZaX9XTtpvzEiLEhgfSE6Mkgz7SUFXJ0dJ
cqXaJ9dsxgBGoyDJ/iElmT2Vho/cjiaRnldSgO4mSD4Cek2o6m1VvVfhrlI3
4WkQ2Enc3FkgqnkvlON59B/jODM0vtYG4vFAn4E/1Q6jLjsj3GTAw/wbkdcm
9FbY4JNVYUlCQdNMBrN29Y5atplOFTrUZumVjC9LFhFrduPB4XCrvGXZoZtU
aGQxx462Lu454jAhjP4QlOlgDz3Gwf6d1o0i4x0GCuQczlSidw7bPerpCsbT
SetU53kNLf5obvdwirQOrp84BicKjrHhjBkxfexSc3oNmhnvxPGnU0mDuDMk
QSvtCdHSNDQR2UMCs7fLMCK+ZG0MncF4rjLPShLtaRbxdFbynWxAlpe1/8y6
sK2Da3GhkYJAEEmrV0WQjRjv/fOIu64Ja5O49adldgYNYTK1AXigijn2XHqb
H9Ok4T7FalU4zRhVjRBVl58l+TRsKuWIHGVgcH6j2UDHveG08k61WZn/EaYA
RKY7sYAemsbe3CTqQ23OlLFGO2EswVOuUYw1hTJqQqyzm/kRlUF+mVqSWj69
J1lKGjMJQHisXIvHbM5tQXHZvLT4sEPGywlvplMmGsQJOKa2Wmayk/4SIf0O
OFviemGwWZ2x9T5LfREkbdp1I5aQ8oHRzgHn98WYBrcrd22wjmwG5hCOruEW
rmFLtM4kw0lNHPXmGto30l9Co9ShIjm1ukMeJwiqkLtu8qn6KsXPNdBwoI2X
pesmHowj5J9OuFE1MgNNrUkk44s7J7JFEUgOae5Cagw0Mpu2KiHNQjqyKbkO
tuELTN082ygWHMSTMHzY1NZAKDCHX/IgvKyFxLWBj6PKdCKdhKUdmkTRfTpY
ODfBnKA9EcgNVmbpa/UYOUHGKYMFYmcycI07RPaVbb49sosROEMqGkGr6rj4
f75rlnkV8sY07jI9sgnYFM5Q0/EU/FDOPQnUs527po6jzCEZawBmJKXdE2h/
vYinvcF1Bw7SRSNFWwOkpqXILALR9yEqRcAmXk8Pxf3Ez8ysS+cFGFDtLDkC
IjNst7tOeyC6/R7gii4uT07fnr95d+Difjaj7HPhP06TGo8Cnn5ID3WwTuuH
VdvCl5aiMDYljYR4NLSJ49cEk1zasVqHy05D8cr5BnPHfBhGWtEHPZziYVUK
x7FxXC/TU529xDOV0CiyQKUGZLcwUHrw9EOrr/D9HEX6Akg3AiTJLZi59WxE
VbArOfRI327W+7JKJ/hYsH8j13V2cX7y6EWRDZSPXhGk4xt4H5/f8Co3r8/+
eHX6LyfpYUdaC/HnXJdYZfTBc11pXn5qi7/mv8bTmvvh5Ki1V/ZYg3gJ5fEp
It4W+oyiGQWje04y2/PjeqC8yOl+nQw80xRg+aHFz3tbcvXFgMKNQiF1r5XO
hnu1zK3ZIVJw2NyV1aD4yEvoXJifobev+MiNAuJgKpwshyW8fesg7jiqzrj+
OCL+4u2THuPthwCeY7BUxSlOewDfZ7Zdkq4ljkrfYeZehAQEncEDpsZdvm8j
Vf6bwQBXwxNEgP0w1wdA7HL1+KTrJqt22hVXWrrhEEm/y7zFW6oaY20JSr4x
g1NGdQB5EJ1pwWyI+W5LkmTsNAgn4ry0oN+noqz1T+iMdzm7LLoa2ntYqO2S
Rth5Z5I1l6hFySHGNt/AIFioGxmC0B3cet1cB0019Riu8b2kM8Zth12FAX2e
IfIRYmfYQ49lU90Y0UkSmZgud3ofkhGR4ErEHeox0VoLc4G50vzB19qsH3sl
02FdYcNJaBH9AZTXfiq2rb7B/cz7popVjA2JHFNm77WqvyJ/bcazKPuTNaJR
92g+QbKykchvyI2C7kDWMvYzXMb0XyEVuHxJv6RL63T497LJVt20yLvVtFq1
d8+npBXWrLrQtr4hLrBeO69gkomLgA2pSUTFMQ36Xl4bdjVzwR/69JeJb2Q8
ytGRBimw4uoSzkB2+Sp1uZTYUtH6xAVABWcQApWESU5+WJQ8MbherZDLxkVI
Jc9e1k/Mp8CX6bNE+BZhWgOLUibsmC0IUg0S2HjT/PBS0n5eSWnRBgYzRphY
0pzHUV7dDSowyziTMffMjjlrPjzGttyFVRQPvB89ff8D4XA39VMZt5AVKCPK
0emJRIdlcqt717xtFNUKbTwzxeIT95dSL/Obrdf1HGLytHP5JbGQbTD5fMPB
26ASyQK7XIyJtrZNFYoviWgiC8HHizx8Wx2GY99wj1/ER2truPqb1QNWqh1h
QRQn82BGTr4c9I4eSBHrndOTQYT1lydkYbw/OT8+Oda2I+xkzpbChDxn5hLT
RccO9RkPtQnHRXFXbZ6p7OaoaVNnIcBWM1wwLQCDWJeYU6+zgx/QsoIru9JL
rJZBr2T0l52rLuCLgUOGjYwppJLsKmOr7LLv8qkEC4TmfERKitt49M/elwlb
gGCoNPjW4MD4KPIt1XKBg1Vzrc3X5mSTuF6X2SL8wMsDdmCwU+Nxjun7u3yG
L2MTekLcUFjOCNOMTDfbxLJemEP3C4lEaQqAXceV5exo+iJ/OrVMHgw+emSa
gbPNSekgaxkioizzCl4Emw8jFovLDJJ5lDLHgUPsyK6q4BRRE0cuoB/U6izS
4/oRpyTDF58QPu8HSeFh1NIEREamWsYVrJm4RjU67KzyyTX3g8kTQTIsnSLF
MUA6aiBLCN9SJZxc0DC3pUpYGq5EsSUTIOkDc3yYx2zQDCfUZxJXmhk4ac3v
OOH6ZRnop3ymFnflescFASSVe6O2MCzYzz1IY3enM3UhgtVJkagypsa+puw/
OgPjAdzwE4cMmvHS8aghhZYMAgE0B3Bj8+8t5oLBh2V43nPh2kBxHe8dqFwP
niSY7TmGLThOy1hitZkPFEn22joOHufwvkN87aqHGOKW2TMclInzlGoiUOBN
G95AIUkwvfTJhBNXSmnCKstDeTrn8lWXYERy4ZPY5eofdfmFiQEKv/uD+6Fs
l3Ne4T3iRSTnWEbm2YusT3vGCQ/iOjPvYQ8sAlQ/6dNpkVacefXu4uPZcZSt
7rIgfwtizjRvtylIcW1aTrjpjb8La+ZEO+CCbl8W1y8NJtqSsT7Ya5jSRnJL
RCv4SXqS8QxkS/5JonpEooN7IboNrG+reojLLKUZGfI3rRo28TnK/aIFlmJR
KZ/YT0IjuBSfOG5uo2igU3yWe55BmQ3mzYXMrcnjeh6bNaVRYSb+/vypkNRs
YJfmeUaJmNzsTp+5ef3x6iedFmec9lFuJKOX/QX2iwi+n3339aCvtHap47VA
zncw0KPE2skozrJkgsGWWNdkSeVHnCPjvmrDziV5+iQasjoZ7eiqk4PGW59I
sOSrocrXMyULlbdGLbE3nm8xUcUjQB/L1HqwujRuwz0JBiu0vabjfbSO51FJ
OI8n6vHQGQmFxYKBsWuv4SVpsgKi6Z+EbVIpGlIqDzpCuJCIjVnb1ovbYaYM
fGgVdDtO8DWm3nf2ihBdmyByqhBnqnE8CE5rUbnrmq1ezRGzuaqRT5wU6Wwf
Rj9Ay2r/bYrlUqzFZS1jt8q6Yyr58fL0+gSj6aE/DPfi+SSWuW8KLq7nvE+u
x5W0av486IFOHOCH9KLhBt4z+k+GbYuf5NLk9OFCM6ROMUIR05Xh5ZayFoE1
biVEWfi5+uNPk75GyFeXietm6VIVAsxRrHG6WWIlAiSEFywE2zxC7UAzldBx
Gwqiu+dJb9YhT/Ky1J04Hcwp0/LtNM5IQLY1mfEuWOYmuEuidr3qnWRAown7
2JBQwjnF2pYXJj73t7ayBg5I3Gd7i8BUxYZtWqBtzQ5a+Aol99XkfMZ+vfSJ
5vIGnq/2K3Htab9hUsUxYKxydpAUSIjo5LzeXv2D00pnaRokYCa/LQHTW9kv
IqN4BpfNpfnbwLHEAKDfaDoIJ+G1XNN3pHPS3LS6j1Xx85TzsJw7AMmqoou4
fsfmuF7REigNnqW4PvUsgWU+XeZ3T6sdIsWHlZgxwbdMqrw618OS1bqEJYga
43Ve5awSOus4uGvcg+tZbZPhXyni8uN20TJnXaT1rtLW1QM5p/mfjNtPnE4C
/llUn6SSKG+A8ZATANcZFgJMr8CdCaKnxCjJ6IBziNlp0LT1lSRMPVQ5wDJW
CmNRpNJKIg7vVJQJUmkENhLB7nFrX3iyB5pLEhZd48/5UhepLRrV9225CkVe
ElJBhXFYGOLiala45DqWFOpssNKMurcHFO6R6ONBEygEk236MvyIIVnh1aBI
ReD9wOBoUpVR27BUj+6gNoj3U+mYRYIKfXwb1ZlolcnS9a+LTuQGAaPWG9U/
QcmUVfX7wtoeZvARHcQvghLxw8EA6x62nMr4MJKV3DG99TOsQu3AGlewG7jX
DiGe2sjFbzH/V/LApYsN2fMJZ0FjEaYzmTCIrC+uWxOnpOvcb9UfzisrzgbI
eXUm44Evxfkm/iPuzZGu0S4KPlVw23GmrqaLuB7t8EqxLJMA082IIiMe5bGC
TbhBkRrLNfygFHhS9bhMNBP1veqO9DNO6lnuq2xTLOQzeKOZR0bOMgdfbdXC
ABBidGjTwDiSOaL9Gih3b/dSlMiTWAdt4s4vkO15xblZXvEQlGWUGFy2zDMP
5/3hDlxm9uEc7LeymZ9X4pMR7elKuQDfmSXViAZZqPkFqRiMFWVlfrFodhIZ
9XxELf8HMu2tLZhM7mol6TqaN/6r1wCDKA6nZvGA9PgUspmwnoUHFYfF603O
vQlhig90K38XnGyUDLv16TW4SJvGDxkf470kr5w9okwtVoxAf9cW+0mPrAjp
Smc8vJLgaKP5RKaVuBkr5sqrxOw2l66ru6LH1Vs01uOqdQ6tcCyC81yVe4Y6
vFr51A9lDEQoh7/9gNleZ09oIh+OUq78gHYlY3iMt1i7NU9BSINtcwyqZOHn
ngvq0vww2oC1zQxM4428bLyu3YPzqmv/QVgF1q8qLs9WSdkrEItntTqWOTaA
hN2fPHt8oYl3W7oyMcAWzAoMP7j/uVkDvtRTc9+GtZ7aW54VaoL86SBxDx4L
UNNE8dOnM1X1WLoM3RQSK99eXd1966LY3GHPDSsT+qybPdr4+2wCydBaYOCo
esvp6zDptudAGFFZByH4B3Y4hWU9vT67Eh/wi2++f0E7THyrRRj4qriKTxtI
FieShKmCvbm7TSDhOT6m3lA1wqT9FN6Ozml84kBb6p/aRWDCZA48DEpWd7jF
dGA0rGXSL7ssSNNeys3TZwmneE1XJVMnrw1tV/SpXQvrYgd53LmIsauISsLy
mPCGfU8ZjWhBaEmuavRxovq6Fc1iz1nLWW7uJfThp5wAKAurCg9NMwl+YyZ7
lINl6bFYksvkGst4SXzlaC9LK2D+lu+QrVG7LCk80QvGnA+nKzKVv0QWIFYR
rw6tdaDS5UCOMUlPEVasPqkiCAv3FkVTdBewiedl0d6awvepmX/nkrAl3LaG
4sT8k5APJhRfm1bhIDwB90B6gtSRAhti3Heb0b2AqZ1daY6DTxjEQ5D1PyDj
K2W/AWQx7wK8u73FRGfkobXSf5HWZsURyOd+wF+zzX56eH44KN9iuWDBMi8Q
iXfwz8Vjj4DgdDplxwdWOlwgYa7Ml2tJ8vrlpVgf+fJ/HqyIFPMDMvXNDAWP
/cT7uiyIZb6nNUpNUD/OivR8XZu+XvA8dpxf6ghYBMLwH/KIkLh7hY0MYWCm
9vZ8DTR/TZBoJun/yler9Czbd0gEf9vka9pO0xIJykzj96xv0j3UG2vMYNva
7nRClWR4zUbOlxwSMqTHLD/rJnlbN80+fZMVze2uaTt2/v35efqjxgneEg1s
06Nb+r5NXjcFCaIP2X1Z37efCmwmObptkHGyhV11WmWLouZNji5DLBcaUrNP
sHdibe+yfUUauj+B72SKcmIOvBKcZ8n/BUeGUKzeyQAA

-->

</rfc>
