<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.9 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc rfcedstyle="yes"?>
<?rfc toc="yes"?>
<?rfc tocindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc compact="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>

<rfc ipr="trust200902" docName="draft-lubashev-quic-partial-reliability-02" category="info">

  <front>
    <title abbrev="quic-pr">Partially Reliable Streams for QUIC</title>

    <author initials="I." surname="Lubashev" fullname="Igor Lubashev">
      <organization>Akamai Technologies</organization>
      <address>
        <email>igorlord@alum.mit.edu</email>
      </address>
    </author>

    <date />

    <area>General</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This memo introduces MIN_STREAM_DATA and EXPIRED_STREAM_DATA frames to enable
partial reliability for QUIC streams.  The EXPIRED_STREAM_DATA frame allows a
sender to give up on retransmitting older parts of a stream and to notify the
receiver about this decision. The MIN_STREAM_DATA frame allows a receiver to
express its disinterest in older parts of a stream.  The content of this draft
is intended for merging into QUIC transport, recovery, and applicability drafts
as a negotiable extension and/or QUIC Version 2 transport feature.</t>



    </abstract>


  </front>

  <middle>


<section anchor="conventions" title="Notational Conventions">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be
interpreted as described in <xref target="RFC2119"/>.</t>

</section>
<section anchor="introduction" title="Introduction">

<t>Some applications, especially applications with near real-time requirements,
need transport that supports partially reliable streams – streams that deliver
bytes in order but allow for applicaiton-controlled gaps.  These applications
communicate using application-specific messages that are serialized over QUIC
streams.  Applications desire partially reliable streams when their messages
expire and lose their usefulness due to later events (time passing, newer
messages, etc).</t>

<t>Examples of applications that can benefit from partially reliable streams are
real time video (all prior data is to be expired when a new key frame is
available) and data replication (expire previous updates, when a new update
overwrites the data).</t>

<t>The content of this draft is intended for <xref target="I-D.ietf-quic-transport"/>,
<xref target="I-D.ietf-quic-recovery"/> and, <xref target="I-D.ietf-quic-applicability"/> as a QUIC
extension and/or QUIC Version 2.</t>

<section anchor="stream-per-message-alternative" title="Stream-per-Message Alternative">

<t>It is possible to avoid the need for partially reliable streams by encoding one
message per QUIC stream.  When a message expires, the sender can reset the
stream, causing RST_STREAM frame to be transmitted, unless all data in the
stream has already been fully acknowledged.  Likewise, the receiver can send
STOP_SENDING frame to indicate its disinterest in the message.  The problem with
this approach is that messages transmitted by the application typically belong
to a message stream, and applications may need to support multiple concurrent
message streams.  Hence, a message-per-stream approach requires each message to
contain an extra header portion to associate the message with a logical
application stream.  In case of short messages, this approach introduces a
significant overhead due to STREAM frames and message headers. It also places
the burden on the application to reorder data arriving on multiple QUIC streams.
Furthermore, splitting each application stream into multiple QUIC streams
renders QUIC’s per-stream flow control ineffective and requires an application
to build its own.</t>

</section>
<section anchor="partially-reliable-streams" title="Partially Reliable Streams">

<t>The proposed single-stream mechanism keeps aplication messages arriving in order
on a single stream, while allowing the application to control message
expiration.  In this proposal, both the sender and the receiver are able to
control expiration of messages in a stream.</t>

<t>A feature of the proposed protocol is that data is seen by the receiver
application at the same stream offsets used by the sender application.</t>

<t>The key to partially reliabile streams is notifying the peer about data that
will not or should not be retransmitted and managing flow control for the
connection.</t>

<t>To facilitate flow control, this proposal introduces a new QUIC per-stream
value: Exempt Stream Bytes (<xref target="exempt-stream-bytes"/>).</t>

</section>
<section anchor="exempt-stream-bytes" title="Exempt Stream Bytes">

<t>Exempt Stream Bytes is the number of bytes sent on the stream that do
not count toward connection flow control limit.  Initially, Exempt
Stream Bytes is 0 for all streams.</t>

</section>
<section anchor="offsets" title="Minimum retransmittable offset and current receive offset">

<t>For fully reliable streams, the smallest unacknowledged data offset is treated
by the sender to be the minimum retransmittable offset.  Likewise, the current
receive offset for a stream is the smallest data offset that has not been
received by the receiver.  Note that due to loss and reordering, the current
receive offset may be smaller than the largest received offset.</t>

<t>Partially reliable streams allow the sender to advance its minimum
retransmittable offset and notify the receiver to advance its current receive
offset.  The receiver can also advance its current receive offset and notify the
sender to advance its minimum retransmittable offset.</t>

</section>
</section>
<section anchor="new-frames" title="New Frames">

<t>This introduces new MIN_STREAM_DATA (<xref target="frame-min-stream-data"/>) and
EXPIRED_STREAM_DATA (<xref target="frame-expired-stream-data"/>) frames.</t>

<section anchor="frame-min-stream-data" title="MIN_STREAM_DATA Frame">

<t>The MIN_STREAM_DATA frame (type=0x??) is used by a receiver to inform a sender
of the maximum amount of data that can be sent on a stream (like MAX_STREAM_DATA
frame) and to request an update to the minimum retransmittable offset
(<xref target="offsets"/>) and Exempt Stream Bytes value (<xref target="exempt-stream-bytes"/>) for this
stream.</t>

<t>The MIN_STREAM_DATA frame includes MAX_STREAM_DATA frame functionality solely
for encoding efficiency, since any increase in the minimum offset of the stream
is likey to come with a corresponding increase in stream flow control window.</t>

<t>The MIN_STREAM_DATA frame includes Minimum Stream Offset and Exempt Stream Bytes
fields in the same frame, since both affect connection flow control. It would
significantly complicate connection flow control accounting, if both fields were
not updated at the same time.</t>

<t>The frame is as follows:</t>

<figure><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Stream ID (i)                        ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Maximum Stream Data (i)                  ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Minimum Stream Offset (i)                 ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Exempt Stream Bytes (i)                  ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>The fields in the MIN_STREAM_DATA frame are as follows:</t>

<t><list style="hanging">
  <t hangText='Stream ID:'>
  The stream ID of the stream that is affected encoded as a variable-length
integer.</t>
  <t hangText='Maximum Stream Data:'>
  A variable-length integer indicating the maximum amount of data that can be
sent on the identified stream, in units of octets.</t>
  <t hangText='Minimum Stream Offset:'>
  A variable-length integer indicating the minimum offset of the stream data
that the receiver is expecting to receive on the identified stream, in units
of octets.</t>
  <t hangText='Exempt Stream Bytes:'>
  A variable-length integer indicating the amount of data on the identified
stream exempt from connection flow control, in units of octets.</t>
</list></t>

<t>The semantics of Maximum Stream Data field is identical to that of Maximum
Stream Data field in MAX_STREAM_DATA frame.</t>

<t>Since Stream 0 MUST be reliable, Stream ID MUST NOT be 0.</t>

<t>Upon receipt of a MIN_STREAM_DATA frame, the sender advances the maximum amount
of data that can be sent on the stream, the minimum retransmittable offset, and
the Exempt Stream Bytes value to the corresponding values of Maximum Stream
Data, Minimum Stream Offset, and Exempt Stream Bytes fields.</t>

<t>If the minimum retransmittable offset becomes larger than the current send
offset for a stream, the current send offset is advanced to the minimum
retransmittable offset.</t>

<t>The receiver MUST NOT reduce the maximum stream data value, minimum
retransmittable offset, and Exempt Stream Bytes value for the stream, but loss
and reordering can cause MIN_STREAM_DATA frames to be received out of order.  If
Maximum Stream Data field does not advance the maximum amount of data that can
be sent on the stream, or Minimum Stream Offset field does not advance the
minimum retransmittable offset, or Exempt Stream Bytes field does not advance
Exempt Stream Bytes value, the corresponding stream parameter is not updated.</t>

<t>A MIN_STREAM_DATA referencing a closed or a “half-closed (local)” stream SHOULD
be ignored.</t>

<t>An endpoint that receives a MIN_STREAM_DATA frame for a receive-only stream MUST
terminate the connection with error PROTOCOL_VIOLATION.</t>

<t>An endpoint that receives a MIN_STREAM_DATA frame for a send-only stream it has
not opened MUST terminate the connection with error PROTOCOL_VIOLATION.</t>

<t>Note that an endpoint may legally receive a MIN_STREAM_DATA frame on a
bidirectional stream it has not opened.</t>

<t>An endpoint MUST terminate a connection with a MIN_STREAM_DATA_ERROR error, if
one of the three fields is advancing its stream parameter, while another field
is trying to retard its stream parameter.  An endpoint MUST terminate a
connection with a MIN_STREAM_DATA_ERROR error, if Maximum Stream Data field is
smaller than Minimum Stream Offset field or Minimum Stream Offset field is
smaller than Exempt Stream Bytes field.</t>

</section>
<section anchor="frame-expired-stream-data" title="EXPIRED_STREAM_DATA Frame">

<t>The EXPIRED_STREAM_DATA frame (type=0x??) is used by a sender to inform a
receiver of the minimum retransmittable offset (<xref target="offsets"/>) for a stream.</t>

<t>Sending EXPIRED_STREAM_DATA frame does not change the stream’s current send
offset.</t>

<t>The frame is as follows:</t>

<figure><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Stream ID (i)                        ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Minimum Stream Offset (i)                  ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>The fields in the EXPIRED_STREAM_DATA frame are as follows:</t>

<t><list style="hanging">
  <t hangText='Stream ID:'>
  The stream ID of the stream that is affected encoded as a variable-length
integer.</t>
  <t hangText='Minimum Stream Offset:'>
  A variable-length integer indicating the minimum offset of the stream data
that will sent (or re-transmitted) on the identified stream, in units of
octets.</t>
</list></t>

<t>Since Stream 0 MUST be reliable, Stream ID MUST NOT be 0.</t>

<t>Upon receipt of an EXPIRED_STREAM_DATA frame, the receiver advances the current
receive offset for the stream to be Minimum Stream Offset value.</t>

<t>The sender MUST NOT reduce the minimum retransmittable offset for a stream, but
loss and reordering can cause EXPIRED_STREAM_DATA frames to be received out of
order.  EXPIRED_STREAM_DATA frames that do not advance the current receive
offset for the stream MUST be ignored.</t>

<t>If the current receive offset becomes larger than the largest received offset
for the stream, the receiver MUST advance the stream’s Exempt Stream Bytes value
by the difference between the current and the largest received offsets.  The
largest received offset is then set to match the current receive offset, and the
receiver SHOULD send a MIN_STREAM_DATA frame (<xref target="frame-min-stream-data"/>).</t>

<t>Note that receipt of an EXPIRED_STREAM_DATA frame may cause the current receive
offset (and hence the largest received offset) to exceed a previously advertised
maximum stream data value for the stream.</t>

<t>An endpoint that receives an EXPIRED_STREAM_DATA frame for a send-only stream
MUST terminate the connection with error PROTOCOL_VIOLATION.</t>

</section>
</section>
<section anchor="flow-control" title="Flow Control Update">

<t>Flow control changes are designed to allow a sender that desires to expire a
large number of bytes that have never been transmitted to do so efficiently and
without closing down the connection flow control window (thereby blocking other
streams).  That must be done in a way that does not open up the connection flow
control window, allowing a different stream to use connection credits not
designed for it.</t>

<section anchor="flow-control-connection" title="Connection Flow Control">

<t>The connection flow control calculation is redefined to be the sum of the
current stream offsets (current send offset for the sender and the largest
received offset for the receiver) minus the sum of Exempt Stream Bytes values
(<xref target="exempt-stream-bytes"/>) for all streams, including closed streams but
excluding stream 0.</t>

</section>
<section anchor="stream-final-offset" title="Stream Final Offset">

<t>If a STREAM-with-FIN or an RST_STREAM frame is received with the final stream
offset smaller than largest received offset for a stream, it is only an error,
if the final receive offset for the stream is smaller than largest offset
learned from a STREAM or RST_STREAM frames.  If the final stream offset is
smaller than the largest received offset, the final stream offset is advanced to
be the largest received offset.</t>

</section>
</section>
<section anchor="interface" title="QUIC Interface and Behavior">

<t>QUIC library interface needs to expose additional APIs to allow applications to
take advantage of partially reliable streams.</t>

<section anchor="sender-interface" title="Sender Interface and Behavior">

<t>It is recommended that a QUIC library provides a way for a sender to update the
minimum retransmittable offset (<xref target="offsets"/>) for a stream.  A typical sender
would call this API function whenever data previously enqueued for transmission
expires, per application semantics.  The sender would keep track of the message
boundaries and request expiration of data on a message boundary.</t>

<t>When an application instructs its QUIC transport to advance the minimum
retransmittable offset for a stream, and there there is any unacknowledged data
(including unsent data) at an offset smaller than the new minimum
retransmittable offset, the sender SHOULD transmit a EXPIRED_STREAM_DATA frame
(<xref target="frame-expired-stream-data"/>).</t>

<t>An application may decide to conditionally expire messages based on the delivery
status of prior messages.  For example, an application sending large messages
may wish to ensure that its messages are delivered at least at a given minimum
rate before expiring a partially-delivered message just because there is a newer
message to deliver.  That is, if the rate of data the application wishes to
write exceeds the network’s throughput, the application may want to ensure that
at least some messages are delivered in their entirety.  To support this use
case, it is recommended that a QUIC library API provides a way for the sender
application to monitor the change in minimum retransmittable offset due to
receipt of ACKs.</t>

</section>
<section anchor="receiver-interface" title="Receiver Interface and Behavior">

<t>Upon receipt of an EXPIRED_STREAM_DATA frame (<xref target="frame-expired-stream-data"/>),
the receiver SHOULD assume that none of the data before the new current receive
offset (<xref target="offsets"/>) will be retransmitted.  A receiver SHOULD discard any
stream data received for an offset smaller than the new current receive offset.
Discarding such data ensures that when the application observes a gap in the
data stream, what follows the gap is a beginning of a new message.</t>

<t>It is recommended that a QUIC library API provides a way for a receiver
application to obtain the length of a gap corresponding to the expired data in
addition to data octets that follow the gap.</t>

<t>It is recommended that a QUIC library API provide a way for a receiver
application to skip data octets past the current point in the stream.  Such a
request from the application should be treated by QUIC as a receipt of an
EXPIRED_STREAM_DATA frame with the Minimum Stream Offset field set of the offset
to which the application wished to skip.  If the current receive offset is
advanced as a result of this application request, QUIC library SHOULD transmit a
MIN_STREAM_DATA frame.</t>

</section>
</section>
<section anchor="retransmission" title="Retransmission">

<t>Both MIN_STREAM_DATA (<xref target="frame-min-stream-data"/>) and EXPIRED_STREAM_DATA
(<xref target="frame-expired-stream-data"/>) frames MUST be retransmitted if declared lost.</t>

<section anchor="retransmission-min-stream-data" title="Retransmission of MIN_STREAM_DATA">

<t>The most recent MIN_STREAM_DATA frame MUST be retransmitted until the receiver
is certain that the sender is not going to transmit any skipped data.  I.e. the
frame MUST be retransmitted until the stream enters “half-closed (remote)”
state, or all data between the largest Minimum Stream Offset field in an
acknowledged MIN_STREAM_DATA or received EXPIRED_STREAM_DATA frames and the
current receive offset (<xref target="offsets"/>) has been received.</t>

</section>
<section anchor="retransmission-expired-stream-data" title="Retransmission of EXPIRED_STREAM_DATA">

<t>The most recent EXPIRED_STREAM_DATA frame for a stream MUST be retransmitted
until the sender is certain that the receiver is not expecting retransmission of
any expired data.  I.e. the frame MUST be retransmitted until the stream enters
“half-closed (local)” state, or all data between the largest Minimum Stream
Offset field in an acknowledged EXPIRED_STREAM_DATA or received MIN_STREAM_DATA
frames and the current minimum retransmittable offset (<xref target="offsets"/>) has been
acknowledged.</t>

</section>
</section>
<section anchor="iana" title="IANA Considerations">

<t>This document has no actions for IANA.</t>

</section>
<section anchor="security" title="Security Considerations">

<t>This document has no new security considerations.</t>

</section>
<section anchor="change-log" title="Change Log">

<section anchor="since-version-00" title="Since version 00">

<t><list style="symbols">
  <t>Fixed flow control to disallow other streams to use connection credits
designated for skipping expired bytes.</t>
</list></t>

</section>
<section anchor="since-version-01" title="Since version 01">

<t><list style="symbols">
  <t>Added an ability by the receiver as well as the sender to control partial
reliability of QUIC streams.  (<xref target="receiver-interface"/>)</t>
  <t>Added Exempt Stream Bytes value and updated connection flow control
calculation to use Exempt Stream Bytes value.  (<xref target="exempt-stream-bytes"/>)</t>
  <t>Replaced the Min Stream Offset value with the existing values: “min
retransmittable offset” (for sender) and “current receive offset” (for
receiver).  (<xref target="offsets"/>)</t>
  <t>Changed MIN_STREAM_DATA frame to be a receiver-transmitted frame.
(<xref target="frame-min-stream-data"/>)</t>
  <t>Addded sender-transmitted EXPIRED_STREAM_DATA frame.
(<xref target="frame-expired-stream-data"/>)</t>
</list></t>

</section>
</section>
<section anchor="acknowledgments" title="Acknowledgments">

<t>Many thanks to Mike Bishop and Ian Swett for their review and feedback on flow
control issues.  Thus draft would not happen without Subodh Iyengar’s ideas for
receiver-controlled MIN_STREAM_DATA.  Kudos to the QUIC working group for a
mountain of feedback on this draft and for diligently plowing through hard
problems, making thousands of big and small decisions, to make the Internet
better for everyone.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<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="I-D.ietf-quic-transport">
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>

<author initials='J' surname='Iyengar' fullname='Jana Iyengar'>
    <organization />
</author>

<author initials='M' surname='Thomson' fullname='Martin Thomson'>
    <organization />
</author>

<date month='May' day='22' year='2018' />

<abstract><t>This document defines the core of the QUIC transport protocol.  This document describes connection establishment, packet format, multiplexing and reliability.  Accompanying documents describe the cryptographic handshake and loss detection.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-quic-transport-12' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-transport-12.txt' />
</reference>



<reference anchor="I-D.ietf-quic-recovery">
<front>
<title>QUIC Loss Detection and Congestion Control</title>

<author initials='J' surname='Iyengar' fullname='Jana Iyengar'>
    <organization />
</author>

<author initials='I' surname='Swett' fullname='Ian Swett'>
    <organization />
</author>

<date month='May' day='22' year='2018' />

<abstract><t>This document describes loss detection and congestion control mechanisms for QUIC.  Note to Readers  Discussion of this draft takes place on the QUIC working group mailing list (quic@ietf.org), which is archived at https://mailarchive.ietf.org/arch/search/?email_list=quic [1].  Working Group information can be found at https://github.com/quicwg [2]; source code and issues list for this draft can be found at https://github.com/quicwg/base-drafts/labels/-recovery [3].</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-quic-recovery-12' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-recovery-12.txt' />
</reference>



<reference anchor="I-D.ietf-quic-applicability">
<front>
<title>Applicability of the QUIC Transport Protocol</title>

<author initials='M' surname='Kuehlewind' fullname='Mirja Kuehlewind'>
    <organization />
</author>

<author initials='B' surname='Trammell' fullname='Brian Trammell'>
    <organization />
</author>

<date month='October' day='25' year='2017' />

<abstract><t>This document discusses the applicability of the QUIC transport protocol, focusing on caveats impacting application protocol development and deployment over QUIC.  Its intended audience is designers of application protocol mappings to QUIC, and implementors of these application protocols.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-quic-applicability-01' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-applicability-01.txt' />
</reference>




    </references>




  </back>

<!-- ##markdown-source:
H4sIACWTDVsAA+1cW3PjOHZ+x69A3A9jZyWneza3cdXWxtOXHdW22x3bs9k8
dUEkJCGmCC5AWq3teH57zgUgQYqU3TOZ7Es8VdMSSYAH5/qdgwPN53NRm7rQ
F/KjcrVRRbGXN7owalloeVs7rbZerqyT//7j4rVQy6XTDxfyL43J5pUTuc1K
tYXBuVOrel40S+U3+mHO93nCuaPpTGHq/fzltyJXNQz48uby7u2jyODL2rr9
hTTlygphKncha9f4+tuXL7+DpxVQcCH/oEvtVCF21t2vnW2qC6bnXu/hUn4h
F2WtXanr+RskRAhfqzL/pApbwrv22ovKXAgp3SrTua/3RbgqZW2z5KMpc13W
8YK3Dhiw8u33/bb3tXYmax/O7HYLY33yvVLdbVMWpuzeqj8Dt4yv5zDn0hYw
am7//jdCCNXUG+uA1jk8hsPg1uJcvg+cpYvM8gXwrX/duvWFvLxXW2Xknc42
pS3s2tALpdRwtQA2w6gCWPZvqmi251tTn+u8EaK0bqtq86AvQAYgie7bfD6X
aglrhcUIcbcxXm711gJltbN5k2kvrxYfPt3e3by9vPoEUr2UwHr59s8fFzdv
3/SurxwQ7oHPUpeoXyJoiEw0pNU1ZC8q37mUdxs9PZ8ElbU7L5XwGqTncPo1
kC6bStoSpgbKSw8LrU25lrbAR/C9XtqVVOEtRDIMLG1tVntZb7RwOtMwjYPF
26aGS7DwXGfGG1ueE0nDZffJke0EtRX6c+W099LAa3OYArVV+xqYOEVRWHZm
4dGyxjtMAak3fMApYLk58Wur3RpXBxctM48WXYH+zpAOC2TsZ7RIVVWFySKz
aTovFNJbgiHWbPegnbrEheKQf4gC+ZN2dO3bbna50qpunD4XrChbk+cgV/HB
1qA/tgTZvrblA6wAvnhUwy8vsu7Co/jd6B/qmZZg3BKt28uTqx9v705m/K/8
cE2fb94CVaAS+Pn2h8v379sP8YnbH65/fA/3RfjUjXx9fXX19sMbHnx1+Z8n
zJyT6493i+sPl+9PUDLMcJs1aNcSHBFqyFILkh7IswbuK1QKnzmzhC8w5suX
v7t59/rbV6++e3xEpiyCleByJa/fJJf6DBDi1qIGsYiIQzOpfQVaR345vSF3
pt6AzJQDAYOTrQ2MdBocr9Pkh2ai1EBTJ6p6o2rpmwq/eFm13t5Fbx8MToIc
40cak8MDoEBiua+1J5V1qLJLsApSdlLBQJupbTlHpXW2KOD1a1UFC/b9hQn0
l02JX8FUPWpvcntOi16ZDFTbe7XWgRQUgtcOCDd/hdlRrzkQdM7iMmUSyAb4
cWyxu41GSWvj2lehteIo1IjCAt18u/F61RQlmnHekC4UQLuTGrXZy1OSQKU8
rmUGktkBy+KUIMY6OwOFePtZbatCs6mnlNLyMlWCgpV6ZcCynN0eIxxYIVDy
kt77YHJt5Sk8KitnQB4QZZU0nlVW8opyXi2a+o6siz2WAQfwAMEBpz+jVdNg
p1vy5GlgCWj9g7GNB+eKYRzWlczI1wQKZedMTTLTNBeufNKbyaE3AxtazN+c
G12vGEi0Ovz4OBMHd6N/e3xE2meHw3suD59Cb0da84SfA6oZAc0r7eZXLEt5
WSDUoPCIPu/IH5g/ra6yoBQoOxCGerAmJ8aQeeJ6jwh5uYdQmdmcQlepoz7J
SveCJKj9f7Ac4gMsL5APvikERtQuuKZrim88cgZX2fpubu9CNAtqwZrTRk8N
rG3KAtUftYz1q0ymkhtkbAEf8z2MBHLAXNBrZfel3YEzWOscCH1v7vXOeM2k
tUESiUM6xe3d9cdPt+CcFx/+0FECwIxdxUgExXnCukPUrJwFLm7JRwrSNNAB
Z1W2IZNAU+v8SrdAZDdOlhimrPcVfMR1LDWgybVAGbZsjkxMIiub81btWcDw
ePC5ctsUtQHjRzPIGufAEkR/IvRfP4DAgTntO0j3IkqJqwiO3kuN3+IkADTQ
wpRBfcYg7pTcgDgQXwABtByg3nsAusjLhHEcTpREwAjLFSkLWh1blCAm8Idg
vn5DK2rd24DJHTYEWGbWJbpyhYYPokaKogdNFc4TFyM9TDcwZIFRxltZFQrm
E0jzsoEAVCK6O5CWBdZweCIFVc6ZBzaejv09dCneNQ5mcVvrgOsepmKgSIw9
5AJDrNGpwBujmXm6+I2XidxWGCVDVIQZ9GqlM/QftOJWliCz5IWoaMvGFDmp
vN2VCCemc7Qjroh9L4gG/BBoJFp7oSNpW8gTVGn8FgKCrlCG7YpbE2m5GGO/
QI8ZJmptYLcxRYC/+OyIaCIHwsQcZ+kuKxcpEdOpiplcWlDJxH8RRk99BqIB
xX5VxLm7OVFN2yWYskPWQlxG3MqRKGEOfIA0EKUUwU+Iox4dWvAPkYCelaia
aUWHFXhrVyvwth6RQ+tb4lq6kecd2gUeDYOBSaIBkMEJSuRvpdv8hOhEisXO
gHuG50BUaKYNaBB+W+o0F0LoitamSkWZQ09DMSihX4fvpc4ijVauVIYxFF1H
+vysL7ie9RMwICvpzEE8QO4JCezbz3pb1UGB5feELk+/fNF0OTw7J9D5+IgI
QowNCKB6bNCYSYxPYhiqlM12CQwFnWCo6wmrsJcJImWdsAI5mtkG7td2p1wu
O171eVkYzLFRvQ3LdRbWLYYUvGQcDcJrfZMQV6Y022abio40nlWLZBhCSdTK
eIvYEjRwlBXP+xPiHVDFkXwITwK62ALNGIqbMg31rJGBGGQwDAG1E307CCAD
A9HRlR4AhxhAB6smFra+2vcJTCkiQSJiYdvQZZwpH1o5vBrSWR1EH5C/9T44
b3KIBPmPkIVwYBkpQeNSrFWFcmukrH13WG3q6Q+RPyVdfSaq/EEBbqBYETgp
juhMV+dIyxS9WQZqJVo53A1hG4XnI0PHXyyOEj+lBmASH8CjvCPAIPoVA84j
outBxzOs0IB3Iagxh7dEX4FKAf4FqRNjRaZ2TMihhuMYuyBhL14cvJDoDC5q
/M3s/MdLSacAPvXvXn7+/e/PUJdjGOmVliRX61DpiZ8iRLSt+kx8VFvyUnC1
jRAhzWzdW2svpwWYmLy6/HNKiyBazmKFDNEKaixMwfkeXnzafgWwMTojZvao
+6fIMB0EQmSChLUN5dPcM2VWNDmWJ/sLCrdXTZlxiQoLYd4WutgLnL9NuACm
mczAV/DZgHUyhGt7nBZe7XWbeYR1ByUP7A+RDqSGPN0z+tm2MDuzYCGQ0pY5
w6puyjHECHgqt7tnLjaQE9h63ZneCL/Fyugi93EphF1ovrhggmCK4OpUhCOE
vkOYkSJ98FtYAC84aZsKjiqjGEre06z4bYGkHaR3FGVZy/IevsKSB1oc8iPW
MDCtX1kqvl4I8dNPPwmIqId/r0aufTty7bc4/BXc+q38R/lP8p/lv8h/ld99
zTXxm/kv/E/89whh9BeEuHgjT83Z1EPn5+e/Fg1XwbsEOt6gaxml5NejYVzR
x4j4FfkwCmF/PT6gVrPS9+x2YiMCs6PUJlqlgc8XFMZ9q0Y9t8VRAk2KLB+M
j3wil7sVOGlHgGRe6HJdb2hzq9ZrQEqAVw8Vg952ORwVx8TKTkxpno5buPOW
AHODO3bgdTCzDZkosKUpDe+nWKC/xvA8qi9fSdsRV09k4s7eJjiqNkYDHwE6
oPvDaWyHip6kH6ZLVzCibF9H/4CnBwTwniZOzuGXa9ATznuCzaRWGvLK2mR0
Z8xVkPpS3ZfenWEV2zLruhFiZEQ5HsyxUEvxKgx5KWmjiFJeBs+zxGXGTSS8
/xKG/ljRPiFIpap5C27UoHq11ABZ/YjOimNYq1OY2TNQExUWqeQ1DZYC/Ooj
Cro1wn6BzJyN+87ZJCpjbwOcWqyeQTQsF6GO5+QmSXZiWkBl3pF8bXbwVJI+
BobnA7g5keQERWxtsBU5AHjIDnpSS+yX+TZ7YvJpRrFEQvmkXRVulGHCKPoJ
I6kGVt8nHHjcu+lyw4bUk8ZjRWE15m2DpeRWc2obc6tn+FYxoaewnPFgO/0q
8ZRew5yTmnYw42jNJojqUPeDPCuFTKzZASdAksp/Q4Y7vQK8WWa0DSmzgmqB
pJonG1Ws5uHKaWHBV52dxHfwtjLyDZCvdTx5CdEyr6wpQ5EhyM9P+ZVgA+Gx
uS0BO4f5UW0FLAG4Gev1iTemXEI7B8M/3lzfXb++fv/pT4vr95e4h/0LKEHL
65FhqFJCaNxWugRGkD39bMK6copKSMQaSaHXoebBMXKKUMxaxdLkkJCHJK5P
q+xoHTBiQLk6oPvglZ/e3txc3/B6ME0RtmzrxvXG6Q6NRS9FOR3ExaEmtjVy
oG4DiknjBNXG9i04qLGaODYa97aPLER89UKOhmbRq1Uds/8n3MNwqkmzpwrv
SAHmsIYyVomZrnByKJjuH5qssnQFqlhj6ZqC7LMiYb/okcY6RCya/dU0Za0f
xC2atU6c8jd+LJqe/39G/DfKiJ+fjP66meCRLrm/STb4f5hz0bYXwZdTiz1R
82Sv6+x5ySLmWzGP+d/MJ8ppuQy6IHppxZEtjlQ6BBLHFZAwUpuUkTcbRcLH
vVgfowOaFSPbHwmaPd76eYhoRUS0xwbyvtsBpB3fpRjyKEqvQ2khk5nYqZjK
YCa2a8QQ8dcHuUdKc+vCJ2Ft3CTLzYpxqQaS6p3W/UQqbohPkBUa78TE7bA9
hm03uIsJ+KvONke4Movv66JgaKukVG0Kqh3Zc+lBwWcaDMFE1rMj8j9FUjc6
cnyCA2fUivw5wz4d1fa2YctSDqurDSABMZklDnTsON4+tqBx0C1+GcQW77BU
8zrU2X/knRr6AxAFt2KP5mgHbhgdq/SMPqjjkBoq1yWn4bwP2eEk7hX11MtC
jOUuSta/g831sAH7gI1wqEvUMZb2J8AUYPDetvswuKmA9RBcO3oOTMrQ8+R2
Vw75M7J/AkAPQLcG01pCGndPXUF4JfaOnpG5YGtY46ldIkegT40jO7WPHkh3
uQV2mI+8VvRfO+taYlRr0HXivVGVkykycFAYjuAtouU26oih3c/X3ZM9ER9I
dt7NOQmO267MUbZBqps1BXe3gK8AuvTKBNmHTXtPkZmbRSIe7fe+nI7Vc1rT
6Tf2BDMVQ0cVH49+5wwjVuNTCiZdqRfHdxOTfotZ2EWjaMYJf9uHCUEPHEW4
GZaIsT7CqHcGc1AOu+N9JwssLLL1z1GD5+8WH6jEUB62XhK3Aw/I0mtCel2a
G/1cL7Oa8vP9+G3I8ZOnweybkkFhVskrjuMN7IUae2sIhYVWjjQWS8dxwbjO
4SI9lbAOVtYFJ/HcbonZkUnSuqFYHo0GKE3qVKKzRCuVcXve9xqcFHZUB+9p
4t2pwwutE6XJCrN0yu1lO4zaQqODxO5ylYO9cw3j8uPCJ5611x9uRa3uNa+n
xg5J0PrpzmFSTbau6eV8ecEGOE/W9EQzEDc0Y8s1nnbCJIDrOLK32MpZbEj3
wXV2EY7T6dg48GSd8FgCLSGHCM25sfWBdqHRbRXckQbsbLf5qVGdAg2F8CTY
6/IvjW6Ckw1UeGwAF20TddXv2Os2OEI7TFgavx/7KHGe7L6tEoR+x6VtyhzS
Hu3bxk/Uw37LYtya6ZqMw7A9yJS7vHt9onhErHZNVvPpov7pn7S75umq+cBT
BLfsdPg/WlO5H2vzEqed52xKSsKo7V9yiW/MWVG/nd49WWpPwkRAm/E5oHQS
VIknunYYraVcRFiJx7tyHTpVo1GihjCSaZtJl4rKw7yIcDpmj0cO64b2XPgE
RnwcdARb6DSf/JgNxedDGYhRUnsGBenZGb/h03K+cQEmU49U15jbvp87JMD7
Ym8O8gbPwJUde9HglhoEHM4GMB5pHci8myaq3X8xDGqxdtCA/skWQmk8NMIn
46m4SAEb39ptM/QbgnF1hBQFnRYJQDx0YkK2Y939N/jN2Wa9qZqgC0OZ7RT1
YKY8Ei0jPLbcTHDLxGM/WBEA7dsj/V2zPjkQWLnAjvcYNZ/ye+hwRnxfp8Ni
0BG9taWpwxOhyGfKp/Jx7kEUScJ0+fqP5PFvYmI26fO/vIgg6tlOH93+15Q0
nuqYm4leehysWnlAckHHy6TCTqoTFDf6jKmkrxcsqB40bHqmqDF8dW58hkV3
cG4iTfNafLBimHbMjY2nzOfiDc9NqLGB9JomZl0NKVA8gNbTbLv02vFOzVpV
8ZwNDe7a7VUdy3k0nh7EEUu9NmVJ+c0qdGDH4zHPDeATitx1Hg4V2S7p2AnB
K67n0buRpv7uXNi+jQfSwjEiEUEQ+ROKgFSIY+J4lXGRP2cRz1qDvzdV7+UV
+pC0ysC5vUm3R0GjblGwuDfA4ZyQ71CgoRGfDlRRHzRuMRC1qj0rHE1rdBeE
TatNBo7tuCR10gDKYXG7jQnVnQMfnMfFd4h8oi6GJwUjng50+6bozvOlUwd2
zPoyOYjhYrRqxM4sBWMRfrve1SEGF+J77CH8yr7fMV/2FIKIhcmuMJzWLiD+
AZiAkK7pCCnmFoPlYGvGgMqR9R22Cz/hqmNOv7UhwcGdwtG63Djh2I1Z9JJt
3J/MtAvmHbswGZGFnfW1jZbdihVwImpUFUwcNetcn5MXe97rYyMSBik/2IV3
emtrfXZCkEtTM0F7JDGtk8ZE7+j2JOJp0UO0Q37RdkIIBUdK1LE6OmE7/eiE
e9RU8Yozj2g8ljVGXjemJl+3IzqtKk9WKfv19J7wRCK8Vj0ONCdti0Pd6Vrj
3HD1ArUoDRSJFj1TiXtaJKZ6OX6GEolDJeoddB3lZKpIAyUTfSVqHfBX5cdR
qXrqTL9CcPnhEiuFHkKhU/G3GL68MKpUExXgu96PH3BLBayQx6Iy4JxcZQBa
sYV+ZH4f7k2WSibeg5AljsVcLJmXaqCMlN/bde8ECG/ZPYTT2y9fHhiAEHP5
znxGRJfWORFyGM81F27MiGW/yeqskKESTqEc2UHejk4NBIWlKiMxqE/Wq1Gy
LnPaUAUlCr/MMTiEhOF2p0E/lU8tLDlUGVI5/JGb5NdUwIcMfkwFVGYkBXg8
66iY7mxD7Yz9+BNVY/zlm6RuHDg4OSUTNF6fRYpuNJ37zSPoGdvg7FCR/mx8
3fU/XsgTsB/iyJj1nMhTkhyxkoHAybjz5idpolCBZro720NaWS0P40d6nL5D
n+n+dAQ98hhSCQJCCYWyXTrDpOfuzTqOZUBJL1uPQT8eMrRXbOwuaQ+kvCez
uMKTQt8DerQVMW4Bqnu703VbLjbo6x4MGDLeXkFmv6SK2GCPBJx9o7mM1sTf
g9i1Z1Y3ACg1b3bhhs9ts7T5Ri72kGEo9w21D1NPg2u3JNPfHhnIAV7yxya3
PqYgZBdYZUCFoR+V4iAnqDsSgxYYT0p48pMVtCb8lQ2wsjXvTFXtuWcqWADt
Lhfhhwj8TG7VPd+1jYfRVCdamjXNRBll++NCeKwSd2PvOeGNv2wlIChhNyMd
UcKCEyTJ8Wd3kELxP+4a8nzLSwAA

-->

</rfc>

