<?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.29 (Ruby 3.4.4) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-transport-15" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="moq-transport">Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-15"/>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="V." surname="Vasiliev" fullname="Victor Vasiliev">
      <organization>Google</organization>
      <address>
        <email>vasilvv@google.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
      <organization>Meta</organization>
      <address>
        <email>afrind@meta.com</email>
      </address>
    </author>
    <date/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <abstract>
      <?line 59?>

<t>This document defines the core behavior for Media over QUIC Transport
(MOQT), a media transport protocol designed to operate over QUIC and
WebTransport, which have similar functionality. MOQT allows a producer of
media to publish data and have it consumed via subscription by a
multiplicity of endpoints. It supports intermediate content distribution
networks and is designed for high scale and low latency distribution.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://moq-wg.github.io/moq-transport/draft-ietf-moq-transport.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-moq-transport/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/moq-wg/moq-transport"/>.</t>
    </note>
  </front>
  <middle>
    <?line 68?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media Over QUIC Transport (MOQT) is a protocol that is optimized
for the QUIC protocol <xref target="QUIC"/>, either directly or via WebTransport
<xref target="WebTransport"/>, for the dissemination of media. MOQT utilizes a
publish/subscribe workflow in which producers of media publish data in
response to subscription requests from a multiplicity of endpoints. MOQT
supports wide range of use-cases with different resiliency and latency
(live, interactive) needs without compromising the scalability and cost
effectiveness associated with content delivery networks.</t>
      <t>MOQT is a generic protocol designed to work in concert with multiple
MoQ Streaming Formats. These MoQ Streaming Formats define how content is
encoded, packaged, and mapped to MOQT objects, along with policies for
discovery and subscription.</t>
      <ul spacing="normal">
        <li>
          <t><xref target="model"/> describes the data model employed by MOQT.</t>
        </li>
        <li>
          <t><xref target="session"/> covers aspects of setting up an MOQT session.</t>
        </li>
        <li>
          <t><xref target="priorities"/> covers mechanisms for prioritizing subscriptions.</t>
        </li>
        <li>
          <t><xref target="relays-moq"/> covers behavior at the relay entities.</t>
        </li>
        <li>
          <t><xref target="message"/> covers how control messages are encoded on the wire.</t>
        </li>
        <li>
          <t><xref target="data-streams"/> covers how data messages are encoded on the wire.</t>
        </li>
      </ul>
      <section anchor="motivation">
        <name>Motivation</name>
        <t>The development of MOQT is driven by goals in a number of areas -
specifically latency, the robust feature set of QUIC and relay
support.</t>
        <section anchor="latency">
          <name>Latency</name>
          <t>Latency is necessary to correct for variable network throughput. Ideally live
content is consumed at the same bitrate it is produced. End-to-end latency would
be fixed and only subject to encoding and transmission delays. Unfortunately,
networks have variable throughput, primarily due to congestion. Attempting to
deliver content encoded at a higher bitrate than the network can cause
queuing along the path from producer to consumer. The speed at which a protocol
can detect and respond to congestion determines the overall latency. TCP-based
protocols are simple but are slow to detect congestion and suffer from
head-of-line blocking. Protocols utilizing UDP directly can avoid queuing, but
the application is then responsible for the complexity of fragmentation,
congestion control, retransmissions, receiver feedback, reassembly, and
more. One goal of MOQT is to achieve the best of both these worlds: leverage the
features of QUIC to create a simple yet flexible low latency protocol that can
rapidly detect and respond to congestion.</t>
        </section>
        <section anchor="leveraging-quic">
          <name>Leveraging QUIC</name>
          <t>The parallel nature of QUIC streams can provide improvements in the face
of loss. A goal of MOQT is to design a streaming protocol to leverage
the transmission benefits afforded by parallel QUIC streams as well
exercising options for flexible loss recovery.</t>
        </section>
        <section anchor="convergence">
          <name>Convergence</name>
          <t>Some live media architectures today have separate protocols for ingest and
distribution, for example RTMP and HTTP based HLS or DASH. Switching protocols
necessitates intermediary origins which re-package the
media content. While specialization can have its benefits, there are efficiency
gains to be had in not having to re-package content. A goal of MOQT is to
develop a single protocol which can be used for transmission from contribution
to distribution. A related goal is the ability to support existing encoding and
packaging schemas, both for backwards compatibility and for interoperability
with the established content preparation ecosystem.</t>
        </section>
        <section anchor="relays">
          <name>Relays</name>
          <t>An integral feature of a protocol being successful is its ability to
deliver media at scale. Greatest scale is achieved when third-party
networks, independent of both the publisher and subscriber, can be
leveraged to relay the content. These relays must cache content for
distribution efficiency while simultaneously routing content and
deterministically responding to congestion in a multi-tenant network. A
goal of MOQT is to treat relays as first-class citizens of the protocol
and ensure that objects are structured such that information necessary
for distribution is available to relays while the media content itself
remains opaque and private.</t>
        </section>
      </section>
      <section anchor="terms-and-definitions">
        <name>Terms and Definitions</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>The following terms are used with the first letter capitalized.</t>
        <dl>
          <dt>Application:</dt>
          <dd>
            <t>The entity using MOQT to transmit and receive data.</t>
          </dd>
          <dt>Client:</dt>
          <dd>
            <t>The party initiating a Transport Session.</t>
          </dd>
          <dt>Server:</dt>
          <dd>
            <t>The party accepting an incoming Transport Session.</t>
          </dd>
          <dt>Endpoint:</dt>
          <dd>
            <t>A Client or Server.</t>
          </dd>
          <dt>Peer:</dt>
          <dd>
            <t>The other endpoint than the one being described.</t>
          </dd>
          <dt>Publisher:</dt>
          <dd>
            <t>An endpoint that handles subscriptions by sending requested Objects from the requested track.</t>
          </dd>
          <dt>Subscriber:</dt>
          <dd>
            <t>An endpoint that subscribes to and receives tracks.</t>
          </dd>
          <dt>Original Publisher:</dt>
          <dd>
            <t>The initial publisher of a given track.</t>
          </dd>
          <dt>End Subscriber:</dt>
          <dd>
            <t>A subscriber that initiates a subscription and does not send the data on to other subscribers.</t>
          </dd>
          <dt>Relay:</dt>
          <dd>
            <t>An entity that is both a Publisher and a Subscriber, is not the Original
Publisher or End Subscriber, and conforms to all requirements in <xref target="relays-moq"/>.</t>
          </dd>
          <dt>Upstream:</dt>
          <dd>
            <t>In the direction of the Original Publisher.</t>
          </dd>
          <dt>Downstream:</dt>
          <dd>
            <t>In the direction of the End Subscriber(s).</t>
          </dd>
          <dt>Transport Session:</dt>
          <dd>
            <t>A raw QUIC connection or a WebTransport session.</t>
          </dd>
          <dt>Stream:</dt>
          <dd>
            <t>A bidirectional or unidirectional bytestream provided by the
QUIC transport or WebTransport.</t>
          </dd>
          <dt>Congestion:</dt>
          <dd>
            <t>Packet loss and queuing caused by degraded or overloaded networks.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>A temporal sequence of objects. A group represents a join point in a
track. See (<xref target="model-group"/>).</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>An object is an addressable unit whose payload is a sequence of
bytes. Objects form the base element in the MOQT data model. See
(<xref target="model-object"/>).</t>
          </dd>
          <dt>Track:</dt>
          <dd>
            <t>A track is a collection of groups. See (<xref target="model-track"/>).</t>
          </dd>
        </dl>
      </section>
      <section anchor="stream-management-terms">
        <name>Stream Management Terms</name>
        <t>This document uses stream management terms described in <xref section="1.3" sectionFormat="comma" target="RFC9000"/> including STOP_SENDING, RESET_STREAM and FIN.</t>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>This document uses the conventions detailed in (<xref section="1.3" sectionFormat="comma" target="RFC9000"/>)
when describing the binary encoding.</t>
        <t>To reduce unnecessary use of bandwidth, variable length integers <bcp14>SHOULD</bcp14>
be encoded using the least number of bytes possible to represent the
required value.</t>
        <section anchor="location-structure">
          <name>Location Structure</name>
          <t>Location identifies a particular Object in a Group within a Track.</t>
          <figure anchor="moq-location">
            <name>Location structure</name>
            <artwork><![CDATA[
Location {
  Group (i),
  Object (i)
}
]]></artwork>
          </figure>
          <t>In this document, a Location can be expressed in the form of {GroupID,
ObjectID}, where GroupID and ObjectID indicate the Group ID and Object ID of the
Location, respectively.  The constituent parts of any Location A can be referred
to using A.Group or A.Object.</t>
          <t>Location A &lt; Location B if:</t>
          <t><tt>A.Group &lt; B.Group || (A.Group == B.Group &amp;&amp; A.Object &lt; B.Object)</tt></t>
        </section>
        <section anchor="key-value-pair-structure">
          <name>Key-Value-Pair Structure</name>
          <t>Key-Value-Pair is a flexible structure designed to carry key/value
pairs in which the key is a variable length integer and the value
is either a variable length integer or a byte field of arbitrary
length.</t>
          <t>Key-Value-Pair is used in both the data plane and control plane, but
is optimized for use in the data plane.</t>
          <figure anchor="moq-key-value-pair">
            <name>MOQT Key-Value-Pair</name>
            <artwork><![CDATA[
Key-Value-Pair {
  Type (i),
  [Length (i),]
  Value (..)
}
]]></artwork>
          </figure>
          <ul spacing="normal">
            <li>
              <t>Type: an unsigned integer, encoded as a varint, identifying the
type of the value and also the subsequent serialization.</t>
            </li>
            <li>
              <t>Length: Only present when Type is odd. Specifies the length of the Value field
in bytes. The maximum length of a value is 2^16-1 bytes.  If an endpoint
receives a length larger than the maximum, it <bcp14>MUST</bcp14> close the session with a
Protocol Violation.</t>
            </li>
            <li>
              <t>Value: A single varint encoded value when Type is even, otherwise a
sequence of Length bytes.</t>
            </li>
          </ul>
          <t>If a receiver understands a Type, and the following Value or Length/Value does
not match the serialization defined by that Type, the receiver <bcp14>MUST</bcp14> terminate
the session with error code <tt>KEY_VALUE_FORMATTING_ERROR</tt>.</t>
        </section>
        <section anchor="reason-phrase">
          <name>Reason Phrase Structure</name>
          <t>Reason Phrase provides a way for the sender to encode additional diagnostic
information about the error condition, where appropriate.</t>
          <artwork><![CDATA[
Reason Phrase {
  Reason Phrase Length (i),
  Reason Phrase Value (..)
}
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>Reason Phrase Length: A variable-length integer specifying the length of the
reason phrase in bytes. The reason phrase length has a maximum value of
1024 bytes. If an endpoint receives a length exceeding the maximum, it <bcp14>MUST</bcp14>
close the session with a <tt>PROTOCOL_VIOLATION</tt></t>
            </li>
            <li>
              <t>Reason Phrase Value: Additional diagnostic information about the error condition.
The reason phrase value is encoded as UTF-8 string and does not carry information,
such as language tags, that would aid comprehension by any entity other than
the one that created the text.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="model">
      <name>Object Data Model</name>
      <t>MOQT has a hierarchical data model, comprised of tracks which contain
groups, and groups that contain objects. Inside of a group, the objects
can be organized into subgroups.</t>
      <t>To give an example of how an application might use this data model,
consider an application sending high and low resolution video using a
codec with temporal scalability. Each resolution is sent as a separate
track to allow the subscriber to pick the appropriate resolution given
the display environment and available bandwidth. Each independently
coded sequence of pictures in a resolution is sent as a group as the
first picture in the sequence can be used as a random access point.
This allows the client to join at the logical points where decoding
of the media can start without needing information before the join
points. The temporal layers are sent as separate subgroups to allow
the priority mechanism to favor lower temporal layers when there is
not enough bandwidth to send all temporal layers. Each frame of video
is sent as a single object.</t>
      <section anchor="model-object">
        <name>Objects</name>
        <t>The basic data element of MOQT is an object.  An object is an
addressable unit whose payload is a sequence of bytes.  All objects
belong to a group, indicating ordering and potential
dependencies (see <xref target="model-group"/>).  An object is uniquely identified by
its track namespace, track name, group ID, and object ID, and must be an
identical sequence of bytes regardless of how or where it is retrieved.
An Object can become unavailable, but its contents <bcp14>MUST NOT</bcp14> change over
time.</t>
        <t>Objects are comprised of two parts: metadata and a payload.  The metadata is
never encrypted and is always visible to relays (see <xref target="relays-moq"/>). The
payload portion may be encrypted, in which case it is only visible to the
Original Publisher and End Subscribers. The Original Publisher is solely
responsible for the content of the object payload. This includes the
underlying encoding, compression, any end-to-end encryption, or
authentication. A relay <bcp14>MUST NOT</bcp14> combine, split, or otherwise modify object
payloads.</t>
        <t>Objects within a Group are in ascending order by Object ID.</t>
      </section>
      <section anchor="model-subgroup">
        <name>Subgroups</name>
        <t>A subgroup is a sequence of one or more objects from the same group
(<xref target="model-group"/>) in ascending order by Object ID. Objects in a subgroup
have a dependency and priority relationship consistent with sharing a
stream and are sent on a single stream whenever possible. A Group is delivered
using at least as many streams as there are Subgroups,
typically with a one-to-one mapping between Subgroups and streams.</t>
        <t>When a Track's forwarding preference (see <xref target="object-properties"/>) is
"Datagram", Objects are not sent in Subgroups and the
description in the remainder of this section does not apply.</t>
        <t>Streams offer in-order reliable delivery and the ability to cancel sending and
retransmission of data. Furthermore, many QUIC and WebTransport implementations
offer the ability to control the relative scheduling priority of pending stream
data.</t>
        <t>Every object within a Group belongs to exactly one Subgroup.</t>
        <t>When Objects are sent in a subscription (see <xref target="subscriptions"/>),  Objects
from two subgroups <bcp14>MUST NOT</bcp14> be sent on the same stream, and Objects from the
same Subgroup <bcp14>MUST NOT</bcp14> be sent on different streams, unless one of the streams
was reset prematurely, or upstream conditions have forced objects from a Subgroup
to be sent out of Object ID order.</t>
        <t>Original publishers assign each Subgroup a Subgroup ID, and do so as they see fit.  The
scope of a Subgroup ID is a Group, so Subgroups from different Groups <bcp14>MAY</bcp14> share a Subgroup
ID without implying any relationship between them. In general, publishers assign
objects to subgroups in order to leverage the features of streams as described
above.</t>
        <t>In general, if Object B is dependent on Object A, then delivery of B can follow
A, i.e. A and B can be usefully delivered over a single stream.  If an Object is
dependent on all previous Objects in a Subgroup, it likely fits best in that
Subgroup.  If an Object is not dependent on any of the Objects in a Subgroup, it
likely belongs in a different Subgroup.</t>
        <t>When assigning Objects to different Subgroups, the Original Publisher makes a
reasonable tradeoff between having an optimal mapping of Object relationships in
a Group and minimizing the number of streams used.</t>
      </section>
      <section anchor="model-group">
        <name>Groups</name>
        <t>A group is a collection of Objects and is a sub-unit of a Track
(<xref target="model-track"/>).  Groups <bcp14>SHOULD</bcp14> be independently useful, so Objects within a
Group <bcp14>SHOULD NOT</bcp14> depend on Objects in other Groups. A Group provides a join
point for subscriptions, so a subscriber that does not want to receive the
entire Track can opt to receive only Groups starting from a given Group ID.
Groups can contain any number of Objects.</t>
        <section anchor="group-ids">
          <name>Group IDs</name>
          <t>Within a track, the original publisher <bcp14>SHOULD</bcp14> publish Group IDs which increase
with time (where "time" is defined according to the internal clock of the media
being sent). In some cases, Groups will be produced in increasing order, but sent
to subscribers in a different order, for example when the subscription's Group
Order is Descending.  Due to network reordering and the partial reliability
features of MOQT, Groups can always be received out of order.</t>
          <t>As a result, subscribers cannot infer the existence of a Group until an object in
the Group is received. This can create gaps in a cache that can be filled
by doing a Fetch upstream, if necessary.</t>
          <t>Applications that cannot produce Group IDs that increase with time are limited
to the subset of MOQT that does not compare group IDs. Subscribers to these
Tracks <bcp14>SHOULD NOT</bcp14> use range filters which span multiple Groups in FETCH or
SUBSCRIBE.  SUBSCRIBE and FETCH delivery use Group Order, so they could have
an unexpected delivery order if Group IDs do not increase with time.</t>
          <t>The amount of time elapsed between publishing an Object in Group ID N and in a
Group ID &gt; N, or even which will be published first, is not defined by this
specification and is defined by the applications using MOQT.</t>
        </section>
      </section>
      <section anchor="model-track">
        <name>Track</name>
        <t>A track is a sequence of groups (<xref target="model-group"/>). It is the entity
against which a subscriber issues a subscription request.  A subscriber
can request to receive individual tracks starting at a group boundary,
including any new objects pushed by the publisher while the track is
active.</t>
        <section anchor="track-name">
          <name>Track Naming</name>
          <t>In MOQT, every track is identified by a Full Track Name, consisting of a Track
Namespace and a Track Name.</t>
          <t>Track Namespace is an ordered set of between 1 and 32 Track Namespace Fields,
encoded as follows:</t>
          <artwork><![CDATA[
Track Namespace {
  Number of Track Namespace Fields (i),
  Track Namespace Field (..) ...
}
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>Number of Track Namespace Fields: A variable-length integer specifying
the number of Track Namespace Fields in the Track Namespace.</t>
            </li>
          </ul>
          <t>Each Track Namespace Field is encoded as follows:</t>
          <artwork><![CDATA[
Track Namespace Field {
  Track Namespace Field Length (i),
  Track Namespace Field Value (..)
}
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>Track Namespace Field Length: A variable-length integer specifying the length
of the Track Namespace Field in bytes.</t>
            </li>
            <li>
              <t>Track Namespace Field Value: A sequence of bytes that forms a Track Namespace
Field.</t>
            </li>
          </ul>
          <t>The structured nature of Track Namespace allows relays and applications to
manipulate prefixes of a namespace. If an endpoint receives a Track Namespace
consisting of 0 or greater than 32 Track Namespace Fields, it <bcp14>MUST</bcp14> close the
session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
          <t>Track Name is a sequence of bytes that identifies an individual track within the
namespace.</t>
          <t>The maximum total length of a Full Track Name is 4,096 bytes. The length of a Full
Track Name is computed as the sum of the Track Namespace Field Length fields
and the Track Name Length field.  If an endpoint receives a Full Track Name
exceeding this length, it <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
          <t>In this specification, both the Track Namespace Fields and the Track Name
are not constrained to a specific encoding. They carry a sequence of bytes and
comparison between two Track Namespace Fields or Track Names is done by
exact comparison of the bytes. Specifications that use MOQT may constrain the
information in these fields, for example by restricting them to UTF-8. Any such
specification needs to specify the canonicalization into the bytes in the Track
Namespace Fields or Track Name such that exact comparison works.</t>
        </section>
        <section anchor="malformed-tracks">
          <name>Malformed Tracks</name>
          <t>There are multiple ways a publisher can transmit a Track that does not conform
to MOQT constraints. Such a Track is considered malformed.  Some example
conditions that constitute a malformed track when detected by a receiver
include:</t>
          <ol spacing="normal" type="1"><li>
              <t>An Object is received in a FETCH response with the same Group as the
previous Object, but whose Object ID is not strictly larger than the previous
object.</t>
            </li>
            <li>
              <t>An Object is received in an Ascending FETCH response whose Group ID is smaller
than the previous Object in the response.</t>
            </li>
            <li>
              <t>An Object is received in a Descending FETCH response whose Group ID is larger
than the previous Object in the resopnse.</t>
            </li>
            <li>
              <t>An Object is received whose Object ID is larger than the final Object in the
Subgroup.  The final Object in a Subgroup is the last Object received on a
Subgroup stream before a FIN.</t>
            </li>
            <li>
              <t>A Subgroup is received over multiple transport streams terminated by FIN with
different final Objects.</t>
            </li>
            <li>
              <t>An Object is received in a Group whose Object ID is larger than the final
Object in the Group.  The final Object in a Group is the Object with Status
END_OF_GROUP or the last Object sent in a FETCH that requested the entire
Group.</t>
            </li>
            <li>
              <t>An Object is received on a Track whose Group and Object ID are larger than the
final Object in the Track.  The final Object in a Track is the Object with
Status END_OF_TRACK or the last Object sent in a FETCH whose response indicated
End of Track.</t>
            </li>
            <li>
              <t>The same Object is received more than once with different Payload or
 other immutable properties.</t>
            </li>
            <li>
              <t>An Object is received with a different Forwarding Preference than previously
 observed from the same Track.</t>
            </li>
          </ol>
          <t>The above list of conditions is not considered exhaustive.</t>
          <t>When a subscriber detects a Malformed Track, it <bcp14>MUST</bcp14> UNSUBSCRIBE any
subscription and FETCH_CANCEL any fetch for that Track from that publisher, and
<bcp14>SHOULD</bcp14> deliver an error to the application.  If a relay detects a Malformed
Track, it <bcp14>MUST</bcp14> immediately terminate downstream subscriptions with PUBLISH_DONE
and reset any fetch streams with Status Code <tt>MALFORMED_TRACK</tt>. Object(s)
triggering Malformed Track status <bcp14>MUST NOT</bcp14> be cached.</t>
        </section>
        <section anchor="track-scope">
          <name>Scope</name>
          <t>An MOQT scope is a set of servers (as identified by their connection
URIs) for which a Full Track Name is guaranteed to be unique and identify a
specific track. It is up to the application using MOQT to define how broad or
narrow the scope is. An application that deals with connections between devices
on a local network may limit the scope to a single connection; by
contrast, an application that uses multiple CDNs to serve media may
require the scope to include all of those CDNs.</t>
          <t>Because each Full Track Name is unique within an MOQT scope, they can be used as
a cache key for the track. If, at a given moment in time, two tracks within the
same scope contain different data, they <bcp14>MUST</bcp14> have different names and/or
namespaces. MOQT provides subscribers with the ability to alter the specific
manner in which tracks are delivered via Parameters, but the actual content of
the tracks does not depend on those parameters; this is in contrast to protocols
like HTTP, where request headers can alter the server response.</t>
          <t>A publisher that loses state (e.g. crashes) and intends to resume publishing on
the same Track risks colliding with previously published Objects and violating
the above requirements.  A publisher can handle this in application specific
ways, for example:</t>
          <ol spacing="normal" type="1"><li>
              <t>Select a unique Track Name or Track Namespace whenever it resumes
publishing. For example, it can base one of the Namespace Fields on the
current time, or select a sufficiently large random value.</t>
            </li>
            <li>
              <t>Resume publishing under a previous Track Name and Namespace and set the
initial Group ID to a unique value guaranteed to be larger than all
previously used groups.  This can be done by choosing a Group ID based on the
current time.</t>
            </li>
            <li>
              <t>Use TRACK_STATUS or similar mechanism to query the previous state to
determine the largest published Group ID.</t>
            </li>
          </ol>
        </section>
      </section>
    </section>
    <section anchor="session">
      <name>Sessions</name>
      <section anchor="session-establishment">
        <name>Session establishment</name>
        <t>This document defines a protocol that can be used interchangeably both
over a QUIC connection directly <xref target="QUIC"/>, and over WebTransport
<xref target="WebTransport"/>.  Both provide streams and datagrams with similar
semantics (see <xref section="4" sectionFormat="comma" target="I-D.ietf-webtrans-overview"/>); thus, the
main difference lies in how the servers are identified and how the
connection is established. The QUIC DATAGRAM extension (<xref target="RFC9221"/>)
<bcp14>MUST</bcp14> be supported and negotiated in the QUIC connection used for MOQT,
which is already a requirement for WebTransport over HTTP/3. The
RESET_STREAM_AT <xref target="I-D.draft-ietf-quic-reliable-stream-reset"/>
extension to QUIC can be used by MOQT, but the protocol is also
designed to work correctly when the extension is not supported.</t>
        <t>There is no definition of the protocol over other transports,
such as TCP, and applications using MoQ might need to fallback to
another protocol when QUIC or WebTransport aren't available.</t>
        <t>MOQT uses ALPN in QUIC and "WT-Available-Protocols" in WebTransport
(<xref section="3.4" sectionFormat="comma" target="WebTransport"/>) to perform version negotiation.</t>
        <t>[[RFC editor: please remove the remainder of this section before publication.]]</t>
        <t>The ALPN value <xref target="RFC7301"/> for the final version of this specification
is <tt>moqt</tt>.  ALPNs used to identify IETF drafts are created by appending
the draft number to "moqt-". For example, draft-ietf-moq-transport-13
would be identified as "moqt-13".</t>
        <t>Note: Draft versions prior to -15 all used moq-00 ALPN, followed by version
negotiation in the CLIENT_SETUP and SERVER_SETUP messages.</t>
        <section anchor="webtransport">
          <name>WebTransport</name>
          <t>An MOQT server that is accessible via WebTransport can be identified
using an HTTPS URI (<xref section="4.2.2" sectionFormat="comma" target="RFC9110"/>).  An MOQT session can be
established by sending an extended CONNECT request to the host and the
path indicated by the URI, as described in
(<xref section="3" sectionFormat="comma" target="WebTransport"/>).</t>
        </section>
        <section anchor="quic">
          <name>QUIC</name>
          <t>An MOQT server that is accessible via native QUIC can be identified by a
URI with a "moqt" scheme.  The "moqt" URI scheme is defined as follows,
using definitions from <xref target="RFC3986"/>:</t>
          <artwork><![CDATA[
moqt-URI = "moqt" "://" authority path-abempty [ "?" query ]
]]></artwork>
          <t>The <tt>authority</tt> portion <bcp14>MUST NOT</bcp14> contain an empty <tt>host</tt> portion.
The <tt>moqt</tt> URI scheme supports the <tt>/.well-known/</tt> path prefix defined in
<xref target="RFC8615"/>.</t>
          <t>This protocol does not specify any semantics on the <tt>path-abempty</tt> and
<tt>query</tt> portions of the URI.  The contents of those are left up to the
application.</t>
          <t>The client can establish a connection to an MOQT server identified by a given
URI by setting up a QUIC connection to the host and port identified by the
<tt>authority</tt> section of the URI. The <tt>authority</tt>, <tt>path-abempty</tt> and <tt>query</tt>
portions of the URI are also transmitted in SETUP parameters (see
<xref target="setup-params"/>). If the port is omitted in the URI, a default port of 443 is
used for setting up the QUIC connection.</t>
        </section>
        <section anchor="connection-url">
          <name>Connection URL</name>
          <t>Each track <bcp14>MAY</bcp14> have one or more associated connection URLs specifying
network hosts through which a track may be accessed. The syntax of the
Connection URL and the associated connection setup procedures are
specific to the underlying transport protocol usage (see <xref target="session"/>).</t>
        </section>
      </section>
      <section anchor="extension-negotiation">
        <name>Extension Negotiation</name>
        <t>Endpoints use the exchange of Setup messages to negotiate any MOQT extensions
to use.</t>
        <t>The client includes all Setup Parameters <xref target="setup-params"/> required for the
negotiated MOQT version in CLIENT_SETUP.</t>
        <t>Within any MOQT version, clients request the use of extensions by adding Setup
parameters corresponding to that extension. No extensions are defined in this
document.</t>
        <t>The server replies with a SERVER_SETUP message that includes all parameters
required for a handshake in that version, and parameters for every extension
requested by the client that it supports.</t>
        <t>New versions of MOQT <bcp14>MUST</bcp14> specify which existing extensions can be used with
that version. New extensions <bcp14>MUST</bcp14> specify the existing versions with which they
can be used.</t>
        <t>If a given parameter carries the same information in multiple versions,
but might have different optimal values in those versions, there <bcp14>SHOULD</bcp14> be
separate Setup parameters for that information in each version.</t>
      </section>
      <section anchor="session-init">
        <name>Session initialization</name>
        <t>The first stream opened is a client-initiated bidirectional control stream where
the endpoints exchange Setup messages (<xref target="message-setup"/>), followed by other
messages defined in <xref target="message"/>.</t>
        <t>This specification only specifies a single use of bidirectional streams. Objects
are sent on unidirectional streams.  Because there are no other uses of
bidirectional streams, a peer <bcp14>MAY</bcp14> close the session as a <tt>PROTOCOL_VIOLATION</tt> if
it receives a second bidirectional stream.</t>
        <t>The control stream <bcp14>MUST NOT</bcp14> be closed at the underlying transport layer during the
session's lifetime.  Doing so results in the session being closed as a
<tt>PROTOCOL_VIOLATION</tt>.</t>
      </section>
      <section anchor="session-termination">
        <name>Termination</name>
        <t>The Transport Session can be terminated at any point.  When native QUIC
is used, the session is closed using the CONNECTION_CLOSE frame
(<xref section="19.19" sectionFormat="comma" target="QUIC"/>).  When WebTransport is used, the session is
closed using the CLOSE_WEBTRANSPORT_SESSION capsule (<xref section="6" sectionFormat="comma" target="WebTransport"/>).</t>
        <t>When terminating the Session, the application <bcp14>MAY</bcp14> use any error message
and <bcp14>SHOULD</bcp14> use a relevant code, as defined below:</t>
        <dl>
          <dt>NO_ERROR (0x0):</dt>
          <dd>
            <t>The session is being terminated without an error.</t>
          </dd>
          <dt>INTERNAL_ERROR (0x1):</dt>
          <dd>
            <t>An implementation specific error occurred.</t>
          </dd>
          <dt>UNAUTHORIZED (0x2):</dt>
          <dd>
            <t>The client is not authorized to establish a session.</t>
          </dd>
          <dt>PROTOCOL_VIOLATION (0x3):</dt>
          <dd>
            <t>The remote endpoint performed an action that was disallowed by the
specification.</t>
          </dd>
          <dt>INVALID_REQUEST_ID (0x4):</dt>
          <dd>
            <t>The session was closed because the endpoint used a Request ID that was
smaller than or equal to a previously received request ID, or the least-
significant bit of the request ID was incorrect for the endpoint.</t>
          </dd>
          <dt>DUPLICATE_TRACK_ALIAS (0x5):</dt>
          <dd>
            <t>The endpoint attempted to use a Track Alias that was already in use.</t>
          </dd>
          <dt>KEY_VALUE_FORMATTING_ERROR (0x6):</dt>
          <dd>
            <t>The key-value pair has a formatting error.</t>
          </dd>
          <dt>TOO_MANY_REQUESTS (0x7):</dt>
          <dd>
            <t>The session was closed because the endpoint used a Request ID equal to or
larger than the current Maximum Request ID.</t>
          </dd>
          <dt>INVALID_PATH (0x8):</dt>
          <dd>
            <t>The PATH parameter was used by a server, on a WebTransport session, or the
server does not support the path.</t>
          </dd>
          <dt>MALFORMED_PATH (0x9):</dt>
          <dd>
            <t>The PATH parameter does not conform to the rules in <xref target="path"/>.</t>
          </dd>
          <dt>GOAWAY_TIMEOUT (0x10):</dt>
          <dd>
            <t>The session was closed because the peer took too long to close the session
in response to a GOAWAY (<xref target="message-goaway"/>) message. See session migration
(<xref target="session-migration"/>).</t>
          </dd>
          <dt>CONTROL_MESSAGE_TIMEOUT (0x11):</dt>
          <dd>
            <t>The session was closed because the peer took too long to respond to a
control message.</t>
          </dd>
          <dt>DATA_STREAM_TIMEOUT (0x12):</dt>
          <dd>
            <t>The session was closed because the peer took too long to send data expected
on an open Data Stream (see <xref target="data-streams"/>). This includes fields of a
stream header or an object header within a data stream. If an endpoint
times out waiting for a new object header on an open subgroup stream, it
<bcp14>MAY</bcp14> send a STOP_SENDING on that stream or terminate the subscription.</t>
          </dd>
          <dt>AUTH_TOKEN_CACHE_OVERFLOW (0x13):</dt>
          <dd>
            <t>The Session limit <xref target="max-auth-token-cache-size"/> of the size of all
registered Authorization tokens has been exceeded.</t>
          </dd>
          <dt>DUPLICATE_AUTH_TOKEN_ALIAS (0x14):</dt>
          <dd>
            <t>Authorization Token attempted to register an Alias that was in use (see
<xref target="authorization-token"/>).</t>
          </dd>
          <dt>VERSION_NEGOTIATION_FAILED (0x15):</dt>
          <dd>
            <t>The client didn't offer a version supported by the server.</t>
          </dd>
          <dt>MALFORMED_AUTH_TOKEN (0x16):</dt>
          <dd>
            <t>Invalid Auth Token serialization during registration (see
<xref target="authorization-token"/>).</t>
          </dd>
          <dt>UNKNOWN_AUTH_TOKEN_ALIAS (0x17):</dt>
          <dd>
            <t>No registered token found for the provided Alias (see
<xref target="authorization-token"/>).</t>
          </dd>
          <dt>EXPIRED_AUTH_TOKEN (0x18):</dt>
          <dd>
            <t>Authorization token has expired (<xref target="authorization-token"/>).</t>
          </dd>
          <dt>INVALID_AUTHORITY (0x19):</dt>
          <dd>
            <t>The specified AUTHORITY does not correspond to this server or cannot be
used in this context.</t>
          </dd>
          <dt>MALFORMED_AUTHORITY (0x1A):</dt>
          <dd>
            <t>The AUTHORITY value is syntactically invalid.</t>
          </dd>
        </dl>
        <t>An endpoint <bcp14>MAY</bcp14> choose to treat a subscription or request specific error as a
session error under certain circumstances, closing the entire session in
response to a condition with a single subscription or message. Implementations
need to consider the impact on other outstanding subscriptions before making
this choice.</t>
      </section>
      <section anchor="session-migration">
        <name>Migration</name>
        <t>MOQT requires a long-lived and stateful session. However, a service
provider needs the ability to shutdown/restart a server without waiting for all
sessions to drain naturally, as that can take days for long-form media.
MOQT enables proactively draining sessions via the GOAWAY message (<xref target="message-goaway"/>).</t>
        <t>The server sends a GOAWAY message, signaling the client to establish a new
session and migrate any <tt>Established</tt> subscriptions. The GOAWAY message optionally
contains a new URI for the new session, otherwise the current URI is
reused. The server <bcp14>SHOULD</bcp14> terminate the session with <tt>GOAWAY_TIMEOUT</tt> after a
sufficient timeout if there are still open subscriptions or fetches on a
connection.</t>
        <t>When the server is a subscriber, it <bcp14>SHOULD</bcp14> send a GOAWAY message to downstream
subscribers prior to any UNSUBSCRIBE messages to upstream publishers.</t>
        <t>After the client receives a GOAWAY, it's <bcp14>RECOMMENDED</bcp14> that the client waits until
there are no more <tt>Established</tt> subscriptions before closing the session with NO_ERROR.
Ideally this is transparent to the application using MOQT, which involves
establishing a new session in the background and migrating <tt>Established</tt> subscriptions
and published namespaces. The client can choose to delay closing the session if
it expects more OBJECTs to be delivered. The server closes the session with a
<tt>GOAWAY_TIMEOUT</tt> if the client doesn't close the session quickly enough.</t>
      </section>
      <section anchor="congestion-control">
        <name>Congestion Control</name>
        <t>MOQT does not specify a congestion controller, but there are important attributes
to consider when selecting a congestion controller for use with an application
built on top of MOQT.</t>
        <section anchor="bufferbloat">
          <name>Bufferbloat</name>
          <t>Traditional AIMD congestion controllers (ex. CUBIC <xref target="RFC9438"/> and Reno <xref target="RFC6582"/>)
are prone to Bufferbloat. Bufferbloat occurs when elements along the path build up
a substantial queue of packets, commonly more than doubling the round trip time.
These queued packets cause head-of-line blocking and latency, even when there is
no packet loss.</t>
        </section>
        <section anchor="application-limited">
          <name>Application-Limited</name>
          <t>The average bitrate for latency sensitive content needs to be less than the available
bandwidth, otherwise data will be queued and/or dropped. As such,
many MOQT applications will typically be limited by the available data to send, and
not the congestion controller. Many congestion control algorithms
only increase the congestion window or bandwidth estimate if fully utilized. This
combination can lead to underestimating the available network bandwidth. As a result,
applications might need to periodically ensure the congestion controller is not
app-limited for at least a full round trip to ensure the available bandwidth can be
measured.</t>
        </section>
        <section anchor="consistent-throughput">
          <name>Consistent Throughput</name>
          <t>Congestion control algorithms are commonly optimized for throughput, not consistency.
For example, BBR's PROBE_RTT state halves the sending rate for more than a round trip
in order to obtain an accurate minimum RTT. Similarly, Reno halves it's congestion
window upon detecting loss.  In both cases, the large reduction in sending rate might
cause issues with latency sensitive applications.</t>
        </section>
      </section>
    </section>
    <section anchor="modularity">
      <name>Modularity</name>
      <t>MOQT defines all messages necessary to implement both simple publishing or
subscribing endpoints as well as highly functional Relays.  Non-Relay endpoints
<bcp14>MAY</bcp14> implement only the subset of functionality required to perform necessary
tasks.  For example, a limited media player could operate using only SUBSCRIBE
related messages.  Limited endpoints <bcp14>SHOULD</bcp14> respond to any unsupported messages
with the appropriate <tt>NOT_SUPPORTED</tt> error code, rather than ignoring them.</t>
      <t>Relays <bcp14>MUST</bcp14> implement all MOQT messages defined in this document, as well as
processing rules described in <xref target="relays-moq"/>.</t>
    </section>
    <section anchor="publishing-and-retrieving-tracks">
      <name>Publishing and Retrieving Tracks</name>
      <section anchor="subscriptions">
        <name>Subscriptions</name>
        <t>All subscriptions begin in the <tt>Idle</tt> state. A subscription can be
initiated and moved to the <tt>Pending</tt> state by either a publisher or a
subscriber.  A publisher initiates a subscription to a track by
sending the PUBLISH message.  The subscriber either accepts or rejects
the subscription using PUBLISH_OK or REQUEST_ERROR.  A subscriber
initiates a subscription to a track by sending the SUBSCRIBE message.
The publisher either accepts or rejects the subscription using
SUBSCRIBE_OK or REQUEST_ERROR.  Once either of these sequences is
successful, the subscription moves to the <tt>Established</tt> state and can
be updated by the subscriber using SUBSCRIBE_UPDATE.  Either endpoint
can terminate an <tt>Established</tt> subscription, moving it to the
<tt>Terminated</tt> state.  The subscriber terminates a subscription using
UNSUBSCRIBE, the publisher terminates a subscription using
PUBLISH_DONE.</t>
        <t>This diagram shows the subscription state machine:</t>
        <t><tt>
                              +--------+
                              |  Idle  |
                              +--------+
                                |    |
                      SUBSCRIBE |    | PUBLISH
                    (subscriber)|    | (publisher)
                                V    V
                   +--------------+ +--------------+
                   | Pending      | | Pending      |
              +----| (Subscriber) | | (Publisher)  |----+
              |    +--------------+ +--------------+    |
              |                 |    |                  |
REQUEST_ERROR |    SUBSCRIBE_OK |    | PUBLISH_OK       | REQUEST_ERROR
              |      (publisher)|    | (subscriber)     |
              |                 V    V                  |
              |            +-------------+              |
              |            | Established | ------+
              |            |             |       | SUBSCRIBE_UPDATE
              |            +-------------+ &lt;-----+
              |                 |    |                  |
              |     UNSUBSCRIBE |    | PUBLISH_DONE     |
              |     (subscriber)|    | (publisher)      |
              |                 V    V                  |
              |            +-------------+              |
              +-----------&gt;| Terminated  | &lt;------------+
                           +-------------+
</tt></t>
        <t>A publisher <bcp14>MUST</bcp14> send exactly one SUBSCRIBE_OK or REQUEST_ERROR in response to
a SUBSCRIBE. A subscriber <bcp14>MUST</bcp14> send exactly one PUBLISH_OK or REQUEST_ERROR in
response to a PUBLISH. The peer <bcp14>SHOULD</bcp14> close the session with a protocol error
if it receives more than one.</t>
        <t>A publisher <bcp14>MUST</bcp14> save the Largest Location communicated in PUBLISH or
SUBSCRIBE_OK when establishing a subscription. This value can be used in a
Joining FETCH (see <xref target="joining-fetches"/>) at any time while the subscription is
active.</t>
        <t>All <tt>Established</tt> subscriptions have a Forward State which is either 0 or 1.  If the Forward
State is 0, the publisher does not send objects for the subscription.  If the
Forward State is 1, the publisher sends objects.  The initiator of the
subscription sets the initial Forward State in either PUBLISH or SUBSCRIBE.  The
sender of PUBLISH_OK can update the Forward State based on its preference.  Once
the subscription is established, the subscriber can update the Forward State by
sending SUBSCRIBE_UPDATE.  Control messages, such as PUBLISH_DONE
(<xref target="message-publish-done"/>) are still sent on subscriptions in Forward State 0.</t>
        <t>Either endpoint can initiate a subscription to a track without exchanging any
prior messages other than SETUP.  Relays <bcp14>MUST NOT</bcp14> send any PUBLISH messages
without knowing the client is interested in and authorized to receive the
content. The communication of intent and authorization can be accomplished by
the client sending SUBSCRIBE_NAMESPACE, or conveyed in other mechanisms out of
band.</t>
        <t>An endpoint <bcp14>MAY</bcp14> SUBSCRIBE to a Track it is publishing, though only Relays are
required to handle such a SUBSCRIBE.  Such self-subscriptions are identical to
subscriptions initiated by other endpoints, and all published Objects will be
forwarded back to the endpoint, subject to priority and congestion response
rules.</t>
        <t>A publisher <bcp14>SHOULD</bcp14> begin sending incomplete objects when available to avoid
incurring additional latency.</t>
        <t>Publishers <bcp14>MAY</bcp14> start sending Objects on PUBLISH-initiated subscriptions before
receiving a PUBLISH_OK response to reduce latency.  Doing so can consume
unnecessary resources in cases where the Subscriber rejects the subscription
with REQUEST_ERROR or sets Forward State=0 in PUBLISH_OK. It can also result in
the Subscriber dropping Objects if its buffering limits are exceeded (see
<xref target="datagrams"/> and <xref target="subgroup-header"/>).</t>
        <section anchor="subscription-state-management">
          <name>Subscription State Management</name>
          <t>A subscriber keeps subscription state until it sends UNSUBSCRIBE, or after
receipt of a PUBLISH_DONE or REQUEST_ERROR. Note that PUBLISH_DONE does not
usually indicate that state can immediately be destroyed, see
<xref target="message-publish-done"/>.</t>
          <t>The Publisher can destroy subscription state as soon as it has received
UNSUBSCRIBE. It <bcp14>MUST</bcp14> reset any open streams associated with the SUBSCRIBE.</t>
          <t>The Publisher can also immediately delete subscription state after sending
PUBLISH_DONE, but <bcp14>MUST NOT</bcp14> send it until it has closed all related streams.</t>
          <t>A REQUEST_ERROR indicates no objects will be delivered, and both endpoints can
immediately destroy relevant state. Objects <bcp14>MUST NOT</bcp14> be sent for requests that
end with an error.</t>
        </section>
        <section anchor="subscription-filters">
          <name>Subscription Filters</name>
          <t>Subscribers can specify a filter on a subscription indicating to the publisher
which Objects to send.  Subscriptions without a filter pass all Objects
published or received via upstream subscriptions.</t>
          <t>All filters have a Start Location and an optional End Group.  Only objects
published or received via a subscription having Locations greater than or
equal to Start Location and strictly less than or equal to the End Group (when
present) pass the filter.</t>
          <t>Some filters are defined to be relative to the <tt>Largest Object</tt>. The <tt>Largest
Object</tt> is the Object with the largest Location (<xref target="location-structure"/>) in the
Track from the perspective of the publisher processing the message. Largest
Object updates when the first byte of an Object with a Location larger than the
previous value is published or received through a subscription.</t>
          <t>A Subscription Filter has the following structure:</t>
          <artwork><![CDATA[
Subscription Filter {
  Filter Type (i),
  [Start Location (Location),]
  [End Group (i),]
}
]]></artwork>
          <t>Filter Type can have one of the following values:</t>
          <t>Largest Object (0x2): The filter Start Location is <tt>{Largest Object.Group,
Largest Object.Object + 1}</tt> and <tt>Largest Object</tt> is communicated in
SUBSCRIBE_OK. If no content has been delivered yet, the filter Start Location is
{0, 0}. There is no End Group - the subscription is open ended.  Note that due
to network reordering or prioritization, relays can receive Objects with
Locations smaller than  <tt>Largest Object</tt> after the SUBSCRIBE is processed, but
these Objects do not pass the Largest Object filter.</t>
          <t>Next Group Start (0x1): The filter Start Location is <tt>{Largest Object.Group + 1,
0}</tt> and <tt>Largest Object</tt> is communicated in SUBSCRIBE_OK. If no content has been
delivered yet, the filter Start Location is {0, 0}.  There is no End Group -
the subscription is open ended. For scenarios where the subscriber intends to
start from more than one group in the future, it can use an AbsoluteStart filter
instead.</t>
          <t>AbsoluteStart (0x3): The filter Start Location is specified explicitly. The
specified <tt>Start Location</tt> <bcp14>MAY</bcp14> be less than the <tt>Largest Object</tt> observed at the
publisher. There is no End Group - the subscription is open ended.  An
AbsoluteStart filter with <tt>Start</tt> = {0, 0} is equivalent to an unfiltered
subscription.</t>
          <t>AbsoluteRange (0x4): The filter Start Location and End Group are specified
explicitly. The specified <tt>Start Location</tt> <bcp14>MAY</bcp14> be less than the <tt>Largest Object</tt>
observed at the publisher. If the specified <tt>End Group</tt> is the same group
specified in <tt>Start Location</tt>, the remainder of that Group passes the
filter. <tt>End Group</tt> <bcp14>MUST</bcp14> specify the same or a larger Group than specified in
<tt>Start Location</tt>.</t>
          <t>An endpoint that receives a filter type other than the above <bcp14>MUST</bcp14> close the
session with <tt>PROTOCOL_VIOLATION</tt>.</t>
        </section>
        <section anchor="joining-an-ongoing-track">
          <name>Joining an Ongoing Track</name>
          <t>The MOQT Object model is designed with the concept that the beginning of a Group
is a join point, so in order for a subscriber to join a Track, it needs to
request an existing Group or wait for a future Group.  Different applications
will have different approaches for when to begin a new Group.</t>
          <t>To join a Track at a past Group, the subscriber sends a SUBSCRIBE with Filter
Type <tt>Largest Object</tt> followed by a Joining FETCH (see <xref target="joining-fetches"/>) for
the intended start Group, which can be relative.  To join a Track at the next
Group, the subscriber sends a SUBSCRIBE with Filter Type <tt>Next Group Start</tt>.</t>
          <section anchor="dynamically-starting-new-groups">
            <name>Dynamically Starting New Groups</name>
            <t>While some publishers will deterministically create new Groups, other
applications might want to only begin a new Group when needed.  A subscriber
joining a Track might detect that it is more efficient to request the Original
Publisher create a new group than issue a Joining FETCH.  Publishers indicate a
Track supports dynamic group creation using the DYNAMIC_GROUPS parameter
(<xref target="dynamic-groups"/>).</t>
            <t>One possible subscriber pattern is to SUBSCRIBE to a Track using Filter Type
<tt>Largest Object</tt> and observe the <tt>Largest Location</tt> in the response.  If the
Object ID is below the application's threshold, the subscriber sends a FETCH for
the beginning of the Group.  If the Object ID is above the threshold and the
Track supports dynamic groups, the subscriber sends a SUBSCRIBE_UPDATE message with the
NEW_GROUP_REQUEST parameter equal to the Largest Location's Group, plus one (see
<xref target="new-group-request"/>).</t>
            <t>Another possible subscriber pattern is to send a SUBSCRIBE with Filter Type
<tt>Next Group Start</tt> and NEW_GROUP_REQUEST equal to 0.  The value of
DYNAMIC_GROUPS in SUBSCRIBE_OK will indicate if the publisher supports dynamic
groups. A publisher that does will begin the next group as soon as practical.</t>
          </section>
        </section>
      </section>
      <section anchor="fetch-state-management">
        <name>Fetch State Management</name>
        <t>The publisher <bcp14>MUST</bcp14> send exactly one FETCH_OK or REQUEST_ERROR in response to a
FETCH.</t>
        <t>A subscriber keeps FETCH state until it sends FETCH_CANCEL, receives
REQUEST_ERROR, or receives a FIN or RESET_STREAM for the FETCH data stream. If the
data stream is already open, it <bcp14>MAY</bcp14> send STOP_SENDING for the data stream along
with FETCH_CANCEL, but <bcp14>MUST</bcp14> send FETCH_CANCEL.</t>
        <t>The Publisher can destroy fetch state as soon as it has received a
FETCH_CANCEL. It <bcp14>MUST</bcp14> reset any open streams associated with the FETCH. It can
also destroy state after closing the FETCH data stream.</t>
        <t>It can destroy all FETCH state after closing the data stream with a FIN.</t>
        <t>A REQUEST_ERROR indicates that both endpoints can immediately destroy state.
Since a relay can start delivering FETCH Objects from cache before determining
the result of the request, some Objects could be received even if the FETCH
results in error.</t>
      </section>
    </section>
    <section anchor="track-discovery">
      <name>Namespace Discovery</name>
      <t>Discovery of MOQT servers is always done out-of-band. Namespace discovery can be
done in the context of an established MOQT session.</t>
      <t>Given sufficient out of band information, it is valid for a subscriber to send a
SUBSCRIBE or FETCH message to a publisher (including a relay) without any
previous MOQT messages besides SETUP. However, SUBSCRIBE_NAMESPACE, PUBLISH and
PUBLISH_NAMESPACE messages provide an in-band means of discovery of publishers
for a namespace.</t>
      <t>The syntax of these messages is described in <xref target="message"/>.</t>
      <section anchor="subscribing-to-namespaces">
        <name>Subscribing to Namespaces</name>
        <t>If the subscriber is aware of a namespace of interest, it can send
SUBSCRIBE_NAMESPACE to publishers/relays it has established a session with. The
recipient of this message will send any relevant PUBLISH_NAMESPACE,
PUBLISH_NAMESPACE_DONE or PUBLISH messages for that namespace, or more specific
part of that namespace.  This includes echoing back PUBLISH or PUBLISH_NAMESPACE
messages to the endpoint that sent them.  If an endpoint accepts its own
PUBLISH, this behaves as self-subscription described in <xref target="subscriptions"/>.</t>
        <t>A publisher <bcp14>MUST</bcp14> send exactly one REQUEST_OK or
REQUEST_ERROR in response to a SUBSCRIBE_NAMESPACE. The subscriber
<bcp14>SHOULD</bcp14> close the session with a protocol error if it detects receiving more than
one.</t>
        <t>The receiver of a REQUEST_OK or REQUEST_ERROR ought to
forward the result to the application, so the application can decide which other
publishers to contact, if any.</t>
        <t>An UNSUBSCRIBE_NAMESPACE withdraws a previous SUBSCRIBE_NAMESPACE. It does not
prohibit original publishers from sending further PUBLISH_NAMESPACE or PUBLISH
messages, but relays <bcp14>MUST NOT</bcp14> send any further PUBLISH messages to a client
without knowing the client is interested in and authorized to receive the
content.</t>
      </section>
      <section anchor="publishing-namespaces">
        <name>Publishing Namespaces</name>
        <t>A publisher <bcp14>MAY</bcp14> send PUBLISH_NAMESPACE messages to any subscriber. A
PUBLISH_NAMESPACE indicates to the subscriber that the publisher has tracks
available in that namespace. A subscriber <bcp14>MAY</bcp14> send SUBSCRIBE or FETCH for tracks
in a namespace without having received a PUBLISH_NAMESPACE for it.</t>
        <t>If a publisher is authoritative for a given namespace, or is a relay that has
received an authorized PUBLISH_NAMESPACE for that namespace from an upstream
publisher, it <bcp14>MUST</bcp14> send a PUBLISH_NAMESPACE to any subscriber that has
subscribed via SUBSCRIBE_NAMESPACE for that namespace, or a prefix of that
namespace. A publisher <bcp14>MAY</bcp14> send the PUBLISH_NAMESPACE to any other subscriber.</t>
        <t>An endpoint <bcp14>SHOULD</bcp14> report the reception of a REQUEST_OK or
REQUEST_ERROR to the application to inform the search for additional
subscribers for a namespace, or to abandon the attempt to publish under this
namespace. This might be especially useful in upload or chat applications. A
subscriber <bcp14>MUST</bcp14> send exactly one REQUEST_OK or REQUEST_ERROR
in response to a PUBLISH_NAMESPACE. The publisher <bcp14>SHOULD</bcp14> close the session with
a protocol error if it receives more than one.</t>
        <t>A PUBLISH_NAMESPACE_DONE message withdraws a previous PUBLISH_NAMESPACE,
although it is not a protocol error for the subscriber to send a SUBSCRIBE or
FETCH message for a track in a namespace after receiving an
PUBLISH_NAMESPACE_DONE.</t>
        <t>A subscriber can send PUBLISH_NAMESPACE_CANCEL to revoke acceptance of an
PUBLISH_NAMESPACE, for example due to expiration of authorization
credentials. The message enables the publisher to PUBLISH_NAMESPACE again with
refreshed authorization, or discard associated state. After receiving an
PUBLISH_NAMESPACE_CANCEL, the publisher does not send PUBLISH_NAMESPACE_DONE.</t>
        <t>While PUBLISH_NAMESPACE indicates to relays how to connect publishers and
subscribers, it is not a full-fledged routing protocol and does not protect
against loops and other phenomena. In particular, PUBLISH_NAMESPACE <bcp14>SHOULD NOT</bcp14>
be used to find paths through richly connected networks of relays.</t>
        <t>A subscriber <bcp14>MAY</bcp14> send a SUBSCRIBE or FETCH for a track to any publisher. If it
has accepted a PUBLISH_NAMESPACE with a namespace that exactly matches the
namespace for that track, it <bcp14>SHOULD</bcp14> only request it from the senders of those
PUBLISH_NAMESPACE messages.</t>
      </section>
    </section>
    <section anchor="priorities">
      <name>Priorities</name>
      <t>MoQ priorities allow a subscriber and original publisher to influence
the transmission order of Objects within a session in the presence of
congestion.</t>
      <section anchor="definitions">
        <name>Definitions</name>
        <t>MOQT maintains priorities between different schedulable objects.
A schedulable object in MOQT is either:</t>
        <ol spacing="normal" type="1"><li>
            <t>The first or next Object in a Subgroup that is in response to a subscription.</t>
          </li>
          <li>
            <t>An Object in response to a subscription that belongs to a Track with
delivery preference Datagram.</t>
          </li>
          <li>
            <t>An Object in response to a FETCH where that Object is the next
Object in the response.</t>
          </li>
        </ol>
        <t>An Object is not schedulable if it is known that no part of it can be written
due to underlying transport flow control limits.</t>
        <t>A single subgroup or datagram has a single publisher priority. Within a
response to SUBSCRIBE, it can be useful to conceptualize this process as
scheduling subgroups or datagrams instead of individual objects on them.
FETCH responses however can contain objects with different publisher
priorities.</t>
        <t>A <tt>priority number</tt>is an unsigned integer with a value between 0 and 255.
A lower priority number indicates higher priority; the highest priority is 0.</t>
        <t><tt>Subscriber Priority</tt> is a priority number associated with an individual
request.  It is specified in the SUBSCRIBE or FETCH message, and can be
updated via SUBSCRIBE_UPDATE message.  The subscriber priority of an individual
schedulable object is the subscriber priority of the request that caused that
object to be sent. When subscriber priority is changed, a best effort <bcp14>SHOULD</bcp14> be
made to apply the change to all objects that have not been scheduled, but it is
implementation dependent what happens to objects that have already been
scheduled.</t>
        <t><tt>Publisher Priority</tt> is a priority number associated with an individual
schedulable object.  A default can be specified in the parameters of PUBLISH, or
SUBSCRIBE_OK. Publisher priority can also be specified in a subgroup header or
datagram (see <xref target="data-streams"/>).</t>
        <t><tt>Group Order</tt> is a property of an individual subscription.  It can be either
'Ascending' (groups with lower group ID are sent first), or 'Descending'
(groups with higher group ID are sent first).  The subscriber optionally
communicates its group order preference in the SUBSCRIBE message; the
publisher's preference is used if the subscriber did not express one (by
setting Group Order field to value 0x0).  The group order of an existing
subscription cannot be changed.</t>
      </section>
      <section anchor="scheduling-algorithm">
        <name>Scheduling Algorithm</name>
        <t>When an MOQT publisher has multiple schedulable objects it can choose between,
the objects <bcp14>SHOULD</bcp14> be selected as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>If two objects have different subscriber priorities associated with them,
the one with <strong>the highest subscriber priority</strong> is scheduled to be sent first.</t>
          </li>
          <li>
            <t>If two objects have the same subscriber priority, but different publisher
priorities, the one with <strong>the highest publisher priority</strong> is scheduled to be
sent first.</t>
          </li>
          <li>
            <t>If two objects in response to the same request have the same subscriber
and publisher priority, but belong to two different groups of the same track,
<strong>the group order</strong> of the associated subscription is used to
decide the one that is scheduled to be sent first.</t>
          </li>
          <li>
            <t>If two objects in response to the same request have the same subscriber
and publisher priority and belong to the same group of the same track, the
one with <strong>the lowest Subgroup ID</strong> (for tracks with delivery preference
Subgroup), or <strong>the lowest Object ID</strong> (for tracks with delivery preference
Datagram) is scheduled to be sent first.</t>
          </li>
        </ol>
        <t>The definition of "scheduled to be sent first" in the algorithm is implementation
dependent and is constrained by the prioritization interface of the underlying
transport. For some implementations, it could mean that the object is serialized
and passed to the underlying transport first.  Other implementations can
control the order packets are initially transmitted.</t>
        <t>This algorithm does not provide a well-defined ordering for objects that belong
to different subscriptions or FETCH responses, but have the same subscriber and
publisher priority.  The ordering in those cases is implementation-defined,
though the expectation is that all subscriptions will be able to send some data.</t>
        <t>Given the critical nature of control messages and their relatively
small size, the control stream <bcp14>SHOULD</bcp14> be prioritized higher than all
subscribed Objects.</t>
      </section>
      <section anchor="considerations-for-setting-priorities">
        <name>Considerations for Setting Priorities</name>
        <t>For downstream subscriptions, relays <bcp14>SHOULD</bcp14> respect the subscriber and original
publisher's priorities.  Relays can receive subscriptions with conflicting
subscriber priorities or Group Order preferences.  Relays <bcp14>SHOULD NOT</bcp14> directly
use Subscriber Priority or Group Order from incoming subscriptions for upstream
subscriptions. Relays' use of these fields for upstream subscriptions can be
based on factors specific to it, such as the popularity of the content or
policy, or relays can specify the same value for all upstream subscriptions.</t>
        <t>MoQ Sessions can span multiple namespaces, and priorities might not
be coordinated across namespaces.  The subscriber's priority is
considered first, so there is a mechanism for a subscriber to fix
incompatibilities between different namespaces prioritization schemes.
Additionally, it is anticipated that when multiple namespaces
are present within a session, the namespaces could be coordinating,
possibly part of the same application.  In cases when pooling among
namespaces is expected to cause issues, multiple MoQ sessions, either
within a single connection or on multiple connections can be used.</t>
        <t>Implementations that have a default priority <bcp14>SHOULD</bcp14> set it to a value in
the middle of the range (eg: 128) to allow non-default priorities to be
set either higher or lower.</t>
      </section>
    </section>
    <section anchor="relays-moq">
      <name>Relays</name>
      <t>Relays are leveraged to enable distribution scale in the MoQ
architecture. Relays can be used to form an overlay delivery network,
similar in functionality to Content Delivery Networks
(CDNs). Additionally, relays serve as policy enforcement points by
validating subscribe and publish requests at the edge of a network.</t>
      <t>Relays are endpoints, which means they terminate Transport Sessions in order to
have visibility of MoQ Object metadata.</t>
      <section anchor="caching-relays">
        <name>Caching Relays</name>
        <t>Relays <bcp14>MAY</bcp14> cache Objects, but are not required to.</t>
        <t>A caching relay saves Objects to its cache identified by the Object's Full Track
Name, Group ID and Object ID. If multiple objects are received with the same
Full Track Name, Group ID and Object ID, Relays <bcp14>MAY</bcp14> ignore subsequently received
Objects or <bcp14>MAY</bcp14> use them to update certain cached fields. Implementations that
update the cache need to protect against cache poisoning.  The only Object
fields that can be updated are the following:</t>
        <ol spacing="normal" type="1"><li>
            <t>Object Status can transition from any status to Object Does Not Exist in
cases where the object is no longer available.  Transitions between Normal,
End of Group and End of Track are invalid.</t>
          </li>
          <li>
            <t>Object Header Extensions can be added, removed or updated, subject
to the constraints of the specific header extension.</t>
          </li>
        </ol>
        <t>An endpoint that receives a duplicate Object with an invalid Object Status
change, or with a different Forwarding Preference, Subgroup ID, Priority or
Payload <bcp14>MUST</bcp14> treat the track as Malformed.</t>
        <t>Note that due to reordering, an implementation can receive a duplicate Object
with a status of Normal, End of Group or End of Track after receiving a previous
status of Object Does Not Exist.  The endpoint <bcp14>SHOULD NOT</bcp14> cache or forward the
duplicate object in this case.</t>
        <t>A cache <bcp14>MUST</bcp14> store all properties of an Object defined in
<xref target="object-properties"/>, with the exception of any extensions
(<xref target="object-extensions"/>) that specify otherwise.</t>
      </section>
      <section anchor="forward-handling">
        <name>Forward Handling</name>
        <t>Relays <bcp14>SHOULD</bcp14> set the <tt>Forward</tt> flag to 1 when a new subscription needs to be
sent upstream, regardless of the value of the <tt>Forward</tt> field from the
downstream subscription. Subscriptions that are not forwarded consume resources
from the publisher, so a publisher might deprioritize, reject, or close those
subscriptions to ensure other subscriptions can be delivered.</t>
      </section>
      <section anchor="multiple-publishers">
        <name>Multiple Publishers</name>
        <t>A Relay can receive PUBLISH_NAMESPACE for the same Track Namespace or PUBLISH
messages for the same Track from multiple publishers.  The following sections
explain how Relays maintain subscriptions to all available publishers for a
given Track.</t>
        <t>There is no specified limit to the number of publishers of a Track Namespace or
Track.  An implementation can use mechanisms such as REQUEST_ERROR,
UNSUBSCRIBE or PUBLISH_NAMESPACE_CANCEL if it cannot
accept an additional publisher due to implementation constraints.
Implementations can consider the establishment or idle time of the session or
subscription to determine which publisher to reject or disconnect.</t>
        <t>Relays <bcp14>MUST</bcp14> handle Objects for the same Track from multiple publishers and
forward them to matching <tt>Established</tt> subscriptions. The Relay <bcp14>SHOULD</bcp14> attempt to
deduplicate Objects before forwarding, subject to implementation constraints.</t>
      </section>
      <section anchor="subscriber-interactions">
        <name>Subscriber Interactions</name>
        <t>Subscribers request Tracks by sending a SUBSCRIBE (see
<xref target="message-subscribe-req"/>) or FETCH (see <xref target="message-fetch"/>) control message for
each Track of interest. Relays <bcp14>MUST</bcp14> ensure subscribers are authorized to access
the content associated with the Track. The authorization information can be part
of request itself or part of the encompassing session. The specifics of how a
relay authorizes a user are outside the scope of this specification.</t>
        <t>The relay <bcp14>MUST</bcp14> have an established upstream subscription before sending
SUBSCRIBE_OK in response to a downstream SUBSCRIBE.  If a relay does not have
sufficient information to send a FETCH_OK immediately in response to a FETCH, it
<bcp14>MUST</bcp14> withhold sending FETCH_OK until it does.</t>
        <t>Publishers maintain a list of <tt>Established</tt> downstream subscriptions for
each Track. Relays use the Track Alias (<xref target="track-alias"/>) of an incoming Object
to identify its Track and find the current subscribers.  Each new Object
belonging to the Track is forwarded to each subscriber, as allowed by the
subscription's filter (see <xref target="message-subscribe-req"/>), and delivered according
to the priority (see <xref target="priorities"/>) and delivery timeout (see
<xref target="delivery-timeout"/>).</t>
        <t>A relay <bcp14>MUST NOT</bcp14> reorder or drop objects received on a multi-object stream when
forwarding to subscribers, unless it has application specific information.</t>
        <t>Relays <bcp14>MAY</bcp14> aggregate authorized subscriptions for a given Track when
multiple subscribers request the same Track. Subscription aggregation
allows relays to make only a single upstream subscription for the
Track. The published content received from the upstream subscription
request is cached and shared among the pending subscribers.
Because SUBSCRIBE_UPDATE only allows narrowing a subscription, relays that
aggregate upstream subscriptions can subscribe using the Largest Object
filter to avoid churn as downstream subscribers with disparate filters
subscribe and unsubscribe from a Track.</t>
        <t>A subscriber remains subscribed to a Track at a Relay until it unsubscribes, the
upstream publisher terminates the subscription, or the subscription expires (see
<xref target="message-subscribe-ok"/>).  A subscription with a filter can reach a state where
all possible Objects matching the filter have been delivered to the subscriber.
Since tracking this can be prohibitively expensive, Relays are not required or
expected to do so.</t>
        <section anchor="graceful-subscriber-relay-switchover">
          <name>Graceful Subscriber Relay Switchover</name>
          <t>This section describes behavior a subscriber <bcp14>MAY</bcp14> implement
to allow for a better user experience when a relay sends a GOAWAY.</t>
          <t>When a subscriber receives the GOAWAY message, it starts the process
of connecting to a new relay and sending the SUBSCRIBE requests for
all <tt>Established</tt> subscriptions to the new relay. The new relay will send a
response to the subscribes and if they are successful, the subscriptions
to the old relay can be stopped with an UNSUBSCRIBE.</t>
        </section>
      </section>
      <section anchor="publisher-interactions">
        <name>Publisher Interactions</name>
        <t>There are two ways to publish through a relay:</t>
        <ol spacing="normal" type="1"><li>
            <t>Send a PUBLISH message for a specific Track to the relay. The relay <bcp14>MAY</bcp14>
respond with PUBLISH_OK in Forward State=0 until there are known subscribers for
new Tracks.</t>
          </li>
          <li>
            <t>Send a PUBLISH_NAMESPACE message for a Track Namespace to the relay. This
enables the relay to send SUBSCRIBE or FETCH messages to publishers for Tracks
in this Namespace in response to requests received from subscribers.</t>
          </li>
        </ol>
        <t>Relays <bcp14>MUST</bcp14> verify that publishers are authorized to publish the set of Tracks
whose Track Namespace matches the namespace in a PUBLISH_NAMESPACE, or the Full
Track Name in PUBLISH. The authorization and identification of the publisher
depends on the way the relay is managed and is application specific.</t>
        <t>When a publisher wants to stop new subscriptions for a published namespace it
sends a PUBLISH_NAMESPACE_DONE. A subscriber indicates it will no longer
subcribe to Tracks in a namespace it previously responded REQUEST_OK
to by sending a PUBLISH_NAMESPACE_CANCEL.</t>
        <t>A Relay connects publishers and subscribers by managing sessions based on the
Track Namespace or Full Track Name. When a SUBSCRIBE message is sent, its Full
Track Name is matched exactly against existing upstream subscriptions.</t>
        <t>Namespace Prefix Matching is further used to decide which publishers receive a
SUBSCRIBE and which subscribers receive a PUBLISH. In this process, the fields
in the Track Namespace are matched sequentially, requiring an exact match for
each field. If the published or subscribed Track Namespace has the same or fewer
fields than the Track Namespace in the message, it qualifies as a match.</t>
        <t>For example:
A SUBSCRIBE message with namespace=(foo, bar) and name=x will match sessions
that sent PUBLISH_NAMESPACE messages with namespace=(foo) or namespace=(foo,
bar).  It will not match a session with namespace=(foobar).</t>
        <t>Relays <bcp14>MUST</bcp14> forward SUBSCRIBE messages to all matching publishers and
PUBLISH_NAMESPACE or PUBLISH messages to all matching subscribers.</t>
        <t>When a Relay needs to make an upstream FETCH request, it determines the
available publishers using the same matching rules as SUBSCRIBE. When more than
one publisher is available, the Relay <bcp14>MAY</bcp14> send the FETCH to any of them.</t>
        <t>When a Relay receives an authorized SUBSCRIBE for a Track with one or more
<tt>Established</tt> upstream subscriptions, it <bcp14>MUST</bcp14> reply with SUBSCRIBE_OK.  If the
SUBSCRIBE has Forward State=1 and the upstream subscriptions are in Forward
State=0, the Relay <bcp14>MUST</bcp14> send SUBSCRIBE_UPDATE with Forward=1 to all publishers.
If there are no <tt>Established</tt> upstream subscriptions for the requested Track, the Relay
<bcp14>MUST</bcp14> send a SUBSCRIBE request to each publisher that has published the
subscription's namespace or prefix thereof.  If the SUBSCRIBE has Forward=1,
then the Relay <bcp14>MUST</bcp14> use Forward=1 when subscribing upstream.</t>
        <t>When a relay receives an incoming PUBLISH message, it <bcp14>MUST</bcp14> send a PUBLISH
request to each subscriber that has subscribed (via SUBSCRIBE_NAMESPACE)
to the Track's namespace or prefix thereof.</t>
        <t>When a relay receives an authorized PUBLISH_NAMESPACE for a namespace that
matches one or more existing subscriptions to other upstream sessions, it <bcp14>MUST</bcp14>
send a SUBSCRIBE to the publisher that sent the PUBLISH_NAMESPACE for each
matching subscription.  When it receives an authorized PUBLISH message for a
Track that has <tt>Established</tt> downstream subscriptions, it <bcp14>MUST</bcp14> respond with PUBLISH_OK.  If at least
one downstream subscriber for the Track has Forward State=1, the Relay <bcp14>MUST</bcp14> use
Forward State=1 in the reply.</t>
        <t>If a Session is closed due to an unknown or invalid control message or Object,
the Relay <bcp14>MUST NOT</bcp14> propagate that message or Object to another Session, because
it would enable a single Session error to force an unrelated Session, which
might be handling other subscriptions, to be closed.</t>
        <section anchor="graceful-publisher-network-switchover">
          <name>Graceful Publisher Network Switchover</name>
          <t>This section describes a behavior that a publisher <bcp14>MAY</bcp14>
choose to implement to allow for a better user experience when
switching between networks, such as WiFi to Cellular or vice versa.</t>
          <t>If the original publisher detects it is likely to need to switch networks, for
example because the WiFi signal is getting weaker, and it does not have QUIC
connection migration available, it establishes a new session over the new
interface and sends PUBLISH_NAMESPACE and/or PUBLISH messages. The relay will
establish subscriptions and the publisher publishes Objects on both sessions.
Once the subscriptions have migrated over to the session on the new network, the
publisher can stop publishing Objects on the old network. The relay will attempt
to deduplicate Objects received on both subscriptions. Ideally, the
subscriptions downstream from the relay do not observe this change, and keep
receiving the Objects on the same subscription.</t>
        </section>
        <section anchor="graceful-publisher-relay-switchover">
          <name>Graceful Publisher Relay Switchover</name>
          <t>This section describes a behavior that a publisher <bcp14>MAY</bcp14> choose to implement
to allow for a better user experience when a relay sends them a GOAWAY.</t>
          <t>When a publisher receives a GOAWAY, it starts the process of connecting to a new
relay and sends PUBLISH_NAMESPACE and/or PUBLISH messages, but it does not
immediately stop publishing Objects to the old Relay. The new Relay will
establish subscriptions and the publisher can start sending new Objects to the
new relay instead of the old Relay. Once Objects are going to the new Relay, the
published namespaces and subscriptions to the old relay can be withdrawn or
terminated.</t>
        </section>
      </section>
      <section anchor="relay-object-handling">
        <name>Relay Object Handling</name>
        <t>MOQT encodes the delivery information via Object headers
(<xref target="message-object"/>).  A relay <bcp14>MUST NOT</bcp14> modify Object properties when
forwarding, except for Object Extension Headers as specified in
<xref target="object-extensions"/>.</t>
        <t>A relay <bcp14>MUST</bcp14> treat the object payload as opaque.  A relay <bcp14>MUST NOT</bcp14>
combine, split, or otherwise modify object payloads.  A relay <bcp14>SHOULD</bcp14>
prioritize sending Objects based on <xref target="priorities"/>.</t>
      </section>
    </section>
    <section anchor="message">
      <name>Control Messages</name>
      <t>MOQT uses a single bidirectional stream to exchange control messages, as
defined in <xref target="session-init"/>.  Every single message on the control stream is
formatted as follows:</t>
      <figure anchor="moq-transport-message-format">
        <name>MOQT Control Message</name>
        <artwork><![CDATA[
MOQT Control Message {
  Message Type (i),
  Message Length (16),
  Message Payload (..),
}
]]></artwork>
      </figure>
      <t>The following Message Types are defined:</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Messages</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x01</td>
            <td align="left">RESERVED (SETUP for version 00)</td>
          </tr>
          <tr>
            <td align="right">0x40</td>
            <td align="left">RESERVED (CLIENT_SETUP for versions &lt;= 10)</td>
          </tr>
          <tr>
            <td align="right">0x41</td>
            <td align="left">RESERVED (SERVER_SETUP for versions &lt;= 10)</td>
          </tr>
          <tr>
            <td align="right">0x20</td>
            <td align="left">CLIENT_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x21</td>
            <td align="left">SERVER_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x10</td>
            <td align="left">GOAWAY (<xref target="message-goaway"/>)</td>
          </tr>
          <tr>
            <td align="right">0x15</td>
            <td align="left">MAX_REQUEST_ID (<xref target="message-max-request-id"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1A</td>
            <td align="left">REQUESTS_BLOCKED (<xref target="message-requests-blocked"/>)</td>
          </tr>
          <tr>
            <td align="right">0x7</td>
            <td align="left">REQUEST_OK (<xref target="message-request-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x5</td>
            <td align="left">REQUEST_ERROR  (<xref target="message-request-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x3</td>
            <td align="left">SUBSCRIBE (<xref target="message-subscribe-req"/>)</td>
          </tr>
          <tr>
            <td align="right">0x4</td>
            <td align="left">SUBSCRIBE_OK (<xref target="message-subscribe-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x2</td>
            <td align="left">SUBSCRIBE_UPDATE (<xref target="message-subscribe-update"/>)</td>
          </tr>
          <tr>
            <td align="right">0xA</td>
            <td align="left">UNSUBSCRIBE (<xref target="message-unsubscribe"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1D</td>
            <td align="left">PUBLISH  (<xref target="message-publish"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1E</td>
            <td align="left">PUBLISH_OK (<xref target="message-publish-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0xB</td>
            <td align="left">PUBLISH_DONE (<xref target="message-publish-done"/>)</td>
          </tr>
          <tr>
            <td align="right">0x16</td>
            <td align="left">FETCH (<xref target="message-fetch"/>)</td>
          </tr>
          <tr>
            <td align="right">0x18</td>
            <td align="left">FETCH_OK (<xref target="message-fetch-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x17</td>
            <td align="left">FETCH_CANCEL (<xref target="message-fetch-cancel"/>)</td>
          </tr>
          <tr>
            <td align="right">0xD</td>
            <td align="left">TRACK_STATUS (<xref target="message-track-status"/>)</td>
          </tr>
          <tr>
            <td align="right">0x6</td>
            <td align="left">PUBLISH_NAMESPACE  (<xref target="message-pub-ns"/>)</td>
          </tr>
          <tr>
            <td align="right">0x9</td>
            <td align="left">PUBLISH_NAMESPACE_DONE  (<xref target="message-pub-ns-done"/>)</td>
          </tr>
          <tr>
            <td align="right">0xC</td>
            <td align="left">PUBLISH_NAMESPACE_CANCEL (<xref target="message-pub-ns-cancel"/>)</td>
          </tr>
          <tr>
            <td align="right">0x11</td>
            <td align="left">SUBSCRIBE_NAMESPACE (<xref target="message-subscribe-ns"/>)</td>
          </tr>
          <tr>
            <td align="right">0x14</td>
            <td align="left">UNSUBSCRIBE_NAMESPACE (<xref target="message-unsub-ns"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>An endpoint that receives an unknown message type <bcp14>MUST</bcp14> close the session.
Control messages have a length to make parsing easier, but no control messages
are intended to be ignored. The length is set to the number of bytes in Message
Payload, which is defined by each message type.  If the length does not match
the length of the Message Payload, the receiver <bcp14>MUST</bcp14> close the session with a
<tt>PROTOCOL_VIOLATION</tt>.</t>
      <section anchor="request-id">
        <name>Request ID</name>
        <t>Most MOQT control messages contain a session specific Request ID.  The Request
ID correlates requests and responses, allows endpoints to update or terminate
ongoing requests, and supports the endpoint's ability to limit the concurrency
and frequency of requests.  Request IDs for one endpoint increment independently
from those sent by the peer endpoint.  The client's Request ID starts at 0 and
are even and the server's Request ID starts at 1 and are odd.  The Request ID
increments by 2 with each FETCH, SUBSCRIBE, SUBSCRIBE_UPDATE,
SUBSCRIBE_NAMESPACE, PUBLISH, PUBLISH_NAMESPACE or TRACK_STATUS request.
Other messages with a Request ID field reference the Request ID of another
message for correlation. If an endpoint receives a Request ID that is not valid
for the peer, or a new request with a Request ID that is not the next in
sequence or exceeds the received MAX_REQUEST_ID, it <bcp14>MUST</bcp14> close the session with
<tt>INVALID_REQUEST_ID</tt>.</t>
      </section>
      <section anchor="params">
        <name>Parameters</name>
        <t>Some messages include a Parameters field that encodes optional message
elements.</t>
        <t>Senders <bcp14>MUST NOT</bcp14> repeat the same parameter type in a message unless the
parameter definition explicitly allows multiple instances of that type to
be sent in a single message. Receivers <bcp14>SHOULD</bcp14> check that there are no
unauthorized duplicate parameters and close the session as a
<tt>PROTOCOL_VIOLATION</tt> if found.  Receivers <bcp14>MUST</bcp14> allow duplicates of unknown
parameters.</t>
        <t>The Parameters in SUBSCRIBE, PUBLISH_OK and FETCH <bcp14>MUST NOT</bcp14> cause the publisher
to alter the payload of the objects it sends, as that would violate the track
uniqueness guarantee described in <xref target="track-scope"/>.</t>
        <t>Receivers ignore unrecognized parameters.</t>
        <t>The number of parameters in a message is not specifically limited, but the
total length of a control message is limited to 2^16-1 bytes.</t>
        <t>Parameters are serialized as Key-Value-Pairs <xref target="moq-key-value-pair"/>.</t>
        <t>Setup message parameters use a namespace that is constant across all MOQT
versions. All other messages use a version-specific namespace.
For example, the integer '1' can refer to different parameters for Setup
messages and for all other message types. SETUP message parameter types
are defined in <xref target="setup-params"/>. Version-specific parameter types are defined
in <xref target="version-specific-params"/>.</t>
        <section anchor="version-specific-params">
          <name>Version Specific Parameters</name>
          <t>Each version-specific parameter definition indicates the message types in which
it can appear. If it appears in some other type of message, it <bcp14>MUST</bcp14> be ignored.
Note that since Setup parameters use a separate namespace, it is impossible for
these parameters to appear in Setup messages.</t>
          <section anchor="authorization-token">
            <name>AUTHORIZATION TOKEN Parameter</name>
            <t>The AUTHORIZATION TOKEN parameter (Parameter Type 0x03) <bcp14>MAY</bcp14> appear in a
CLIENT_SETUP, SERVER_SETUP, PUBLISH, SUBSCRIBE, SUBSCRIBE_UPDATE,
SUBSCRIBE_NAMESPACE, PUBLISH_NAMESPACE, TRACK_STATUS or FETCH message. This
parameter conveys information to authorize the sender to perform the operation
carrying the parameter.</t>
            <t>The parameter value is a Token structure containing an optional Session-specific
Alias. The Alias allows the sender to reference a previously transmitted Token
Type and Token Value in future messages. The Token structure is serialized as
follows:</t>
            <figure anchor="moq-token">
              <name>Token structure</name>
              <artwork><![CDATA[
Token {
  Alias Type (i),
  [Token Alias (i),]
  [Token Type (i),]
  [Token Value (..)]
}
]]></artwork>
            </figure>
            <ul spacing="normal">
              <li>
                <t>Alias Type - an integer defining both the serialization and the processing
behavior of the receiver. This Alias type has the following code points:</t>
              </li>
            </ul>
            <dl>
              <dt>DELETE (0x0):</dt>
              <dd>
                <t>There is an Alias but no Type or Value. This Alias and the Token Value it was
previously associated with| <bcp14>MUST</bcp14> be retired. Retiring removes them from the pool
of actively registered tokens.</t>
              </dd>
              <dt>REGISTER (0x1):</dt>
              <dd>
                <t>There is an Alias, a Type and a Value. This Alias <bcp14>MUST</bcp14> be associated with the
Token Value for the duration of the Session or it is deleted. This action is
termed "registering" the Token.</t>
              </dd>
              <dt>USE_ALIAS (0x2):</dt>
              <dd>
                <t>There is an Alias but no Type or Value. Use the Token Type and Value
previously registered with this Alias.</t>
              </dd>
              <dt>USE_VALUE (0x3):</dt>
              <dd>
                <t>There is no Alias and there is a Type and Value. Use the Token Value as
provided. The Token Value may be discarded after processing.</t>
              </dd>
            </dl>
            <t>If a server receives Alias Type DELETE (0x0) or USE_ALIAS (0x2) in a CLIENT_SETUP
message, it <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
            <ul spacing="normal">
              <li>
                <t>Token Alias - a Session-specific integer identifier that references a Token
Value. There are separate Alias spaces for the client and server (e.g.: they
can each register Alias=1). Once a Token Alias has been registered, it cannot
be re-registered by the same endpoint in the Session without first being
deleted. Use of the Token Alias is optional.</t>
              </li>
              <li>
                <t>Token Type - a numeric identifier for the type of Token payload being
transmitted. This type is defined by the IANA table "MOQT Auth Token Type" (see
<xref target="iana"/>). Type 0 is reserved to indicate that the type is not defined in the
table and is negotiated out-of-band between client and receiver.</t>
              </li>
              <li>
                <t>Token Value - the payload of the Token. The contents and serialization of this
payload are defined by the Token Type.</t>
              </li>
            </ul>
            <t>If the Token structure cannot be decoded, the receiver <bcp14>MUST</bcp14> close the Session
with <tt>KEY_VALUE_FORMATTING_ERROR</tt>.  The receiver of a message attempting to
register an Alias which is already registered <bcp14>MUST</bcp14> close the Session with
<tt>DUPLICATE_AUTH_TOKEN_ALIAS</tt>. The receiver of a message referencing an Alias
that is not currently registered <bcp14>MUST</bcp14> reject the message with
<tt>UNKNOWN_AUTH_TOKEN_ALIAS</tt>.</t>
            <t>The receiver of a message containing a well-formed Token structure but otherwise
invalid AUTHORIZATION TOKEN parameter <bcp14>MUST</bcp14> reject that message with an
<tt>MALFORMED_AUTH_TOKEN</tt> error.</t>
            <t>The receiver of a message carrying an AUTHORIZATION TOKEN with Alias Type
REGISTER that does not result in a Session error <bcp14>MUST</bcp14> register the Token Alias,
in the token cache, even if the message fails for other reasons, including
<tt>Unauthorized</tt>.  This allows senders to pipeline messages that refer to
previously registered tokens without potentially terminating the entire Session.
A receiver <bcp14>MAY</bcp14> store an error code (eg: <tt>UNAUTHORIZED</tt> or
<tt>MALFORMED_AUTH_TOKEN</tt>) in place of the Token Type and Token Alias if any future
message referencing the Token Alias will result in that error. However, it is
important to not store an error code for a token that might be valid in the
future or due to some other property becoming fulfilled which currently
isn't. The size of a registered cache entry includes the length of the Token
Value, regardless of whether it is stored.</t>
            <t>If a receiver detects that an authorization token has expired, it <bcp14>MUST</bcp14> retain
the registered Alias until it is deleted by the sender, though it <bcp14>MAY</bcp14> discard
other state associated with the token that is no longer needed.  Expiration does
not affect the size occupied by a token in the token cache.  Any message that
references the token with Alias Type USE_ALIAS fails with <tt>EXPIRED_AUTH_TOKEN</tt>.</t>
            <t>Using an Alias to refer to a previously registered Token Type and Value is for
efficiency only and has the same effect as if the Token Type and Value was
included directly.  Retiring an Alias that was previously used to authorize a
message has no retroactive effect on the original authorization, nor does it
prevent that same Token Type and Value from being re-registered.</t>
            <t>Senders of tokens <bcp14>SHOULD</bcp14> only register tokens which they intend to re-use during
the Session and <bcp14>SHOULD</bcp14> retire previously registered tokens once their utility
has passed.</t>
            <t>By registering a Token, the sender is requiring the receiver to store the Token
Alias and Token Value until they are deleted, or the Session ends. The receiver
can protect its resources by sending a SETUP parameter defining the
MAX_AUTH_TOKEN_CACHE_SIZE limit (see <xref target="max-auth-token-cache-size"/>) it is
willing to accept. If a registration is attempted which would cause this limit
to be exceeded, the receiver <bcp14>MUST</bcp14> termiate the Session with a
<tt>AUTH_TOKEN_CACHE_OVERFLOW</tt> error.</t>
            <t>The AUTHORIZATION TOKEN parameter <bcp14>MAY</bcp14> be repeated within a message as long as
the combination of Token Type and Token Value are unique after resolving any
aliases.</t>
          </section>
          <section anchor="delivery-timeout">
            <name>DELIVERY TIMEOUT Parameter</name>
            <t>The DELIVERY TIMEOUT parameter (Parameter Type 0x02) <bcp14>MAY</bcp14> appear in a
TRACK_STATUS, REQUEST_OK (in response to TRACK_STATUS), PUBLISH, PUBLISH_OK,
SUBSCRIBE, SUBSCRIBE_OK, or SUBSCRIBE_UDPATE message.</t>
            <t>It is the duration in milliseconds the relay <bcp14>SHOULD</bcp14>
continue to attempt forwarding Objects after they have been received.  The start
time for the timeout is based on when the Object Headers are received, and does
not depend upon the forwarding preference. There is no explicit signal that an
Object was not sent because the delivery timeout was exceeded.</t>
            <t>If both the subscriber and publisher specify the parameter, they use the min of
the two values for the subscription.  The publisher <bcp14>SHOULD</bcp14> always specify the
value received from an upstream subscription when there is one, and nothing
otherwise.</t>
            <t>Publishers can, at their discretion, discontinue forwarding Objects earlier than
the negotiated DELIVERY TIMEOUT, subject to stream closure and ordering
constraints described in <xref target="closing-subgroup-streams"/>.  However, if neither the
subscriber nor publisher specifies DELIVERY TIMEOUT, all Objects in the track
matching the subscription filter are delivered as indicated by their Group Order
and Priority.  If a subscriber fails to consume Objects at a sufficient rate,
causing the publisher to exceed its resource limits, the publisher <bcp14>MAY</bcp14> terminate
the subscription with error <tt>TOO_FAR_BEHIND</tt>.</t>
            <t>If an object in a subgroup exceeds the delivery timeout, the publisher <bcp14>MUST</bcp14>
reset the underlying transport stream (see <xref target="closing-subgroup-streams"/>).</t>
            <t>When sent by a subscriber, this parameter is intended to be specific to a
subscription, so it <bcp14>SHOULD NOT</bcp14> be forwarded upstream by a relay that intends
to serve multiple subscriptions for the same track.</t>
            <t>Publishers <bcp14>SHOULD</bcp14> consider whether the entire Object can likely be
successfully delivered within the timeout period before sending any data
for that Object, taking into account priorities, congestion control, and
any other relevant information.</t>
          </section>
          <section anchor="max-cache-duration">
            <name>MAX CACHE DURATION Parameter</name>
            <t>The MAX_CACHE_DURATION parameter (Parameter Type 0x04) <bcp14>MAY</bcp14> appear in a PUBLISH,
SUBSCRIBE_OK, FETCH_OK or REQUEST_OK (in response to TRACK_STATUS) message.</t>
            <t>It is an integer expressing
the number of milliseconds an Object can be served from a cache. If present, the
relay <bcp14>MUST NOT</bcp14> start forwarding any individual Object received through this
subscription or fetch after the specified number of milliseconds has elapsed
since the beginning of the Object was received.  This means Objects earlier in a
multi-object stream will expire earlier than Objects later in the stream. Once
Objects have expired from cache, their state becomes unknown, and a relay that
handles a downstream request that includes those Objects re-requests them.</t>
            <t>If the MAX_CACHE_DURATION parameter is not sent by the publisher, the Objects
can be cached until implementation constraints cause them to be evicted.</t>
          </section>
          <section anchor="publisher-priority">
            <name>PUBLISHER PRIORITY Parameter</name>
            <t>The PUBLISHER PRIORITY parameter (Parameter Type 0x0E) specifies the priority of
a subscription relative to other subscriptions in the same session.  The value
is from 0 to 255 and lower numbers get higher priority.  See
<xref target="priorities"/>. Priorities above 255 are invalid. The PUBLISHER PRIORITY
parameter is valid in SUBSCRIBE_OK and PUBLISH. Subgroups and Datagrams for this
subscription inherit this priority, unless they specifically override it.</t>
            <t>The subscription has Publisher Priorty 128 if this parameter is omitted.</t>
          </section>
          <section anchor="subscriber-priority">
            <name>SUBSCRIBER PRIORITY Parameter</name>
            <t>The SUBSCRIBER_PRIORITY parameter (Parameter Type 0x20) <bcp14>MAY</bcp14> appear in a
SUBSCRIBE, SUBSCRIBE_UPDATE, TRACK_STATUS, PUBLISH_OK or FETCH message. It is an
integer expressing the priority of a subscription relative to other
subscriptions and fetch responses in the same session. Lower numbers get higher
priority.  See <xref target="priorities"/>.  The range is restricted to 0-255.  If a
publisher receives a value outside this range, it <bcp14>MUST</bcp14> close the session with
<tt>PROTOCOL_VIOLATION</tt>.</t>
            <t>If omitted from SUBSCRIBE, TRACK_STATUS, PUBLISH_OK or FETCH, the publisher uses
the value 128.</t>
          </section>
          <section anchor="group-order">
            <name>GROUP ORDER Parameter</name>
            <t>The GROUP_ORDER parameter (Parameter Type 0x22) <bcp14>MAY</bcp14> appear in a SUBSCRIBE,
SUBSCRIBE_OK, TRACK_STATUS, REQUEST_OK (in response to TRACK_STATUS), PUBLISH,
PUBLISH_OK or FETCH.</t>
            <t>It
is an enum indicating how to prioritize Objects from different groups within the
same subscription (see <xref target="priorities"/>), or how to order Groups in a Fetch
response (see <xref target="fetch-handling"/>). The allowed values are Ascending (0x1) or
Descending (0x2). If an endpoint receives a value outside this range, it <bcp14>MUST</bcp14>
close the session with <tt>PROTOCOL_VIOLATION</tt>.</t>
            <t>If omitted from SUBSCRIBE or TRACK_STATUS, the publisher's preference from
SUBSCRIBE_OK or REQUEST_OK is used. If omitted in PUBLISH_OK, the
publisher's preference from PUBLISH is used. If omitted from SUBSCRIBE_OK,
REQUEST_OK, PUBLISH or FETCH, the receiver uses Ascending (0x1).</t>
          </section>
          <section anchor="subscription-filter">
            <name>SUBSCRIPTION FILTER Parameter</name>
            <t>The SUBSCRIPTION_FILTER parameter (Parameter Type 0x21) <bcp14>MAY</bcp14> appear in a
SUBSCRIBE, TRACK_STATUS, PUBLISH_OK or SUBSCRIBE_UPDATE message. It is a
length-prefixed Subscription Filter (see <xref target="subscription-filters"/>).  If the
length of the Subscription Filter does not match the parameter length, the
publisher <bcp14>MUST</bcp14> close the session with <tt>PROTOCOL_VIOLATION</tt>.</t>
            <t>If omitted from SUBSCRIBE, TRACK_STATUS or PUBLISH_OK, the subscription is
unfiltered.  If omitted from SUBSCRIBE_UDPATE, the value is unchanged.</t>
          </section>
          <section anchor="expires">
            <name>EXPIRES Parameter</name>
            <t>The EXPIRES parameter (Parameter Type 0x8) <bcp14>MAY</bcp14> appear in SUBSCRIBE_OK, PUBLISH
or PUBLISH_OK (TODO: or REQUEST_OK).  It is a variable length integer encoding
the time in milliseconds after which the sender of the parameter will terminate
the subscription. The sender will terminate the subscription using PUBLISH_DONE
or UNSUBSCRIBE, depending on its role.  This value is advisory and the sender
can terminate the subscription prior to or after the expiry time.</t>
            <t>The receiver of the parameter can extend the subscription by sending a
SUBSCRIBE_UPDATE (TODO: SUBSCRIPTION_UPDATE). If the receiver of the parameter
has one or more updated AUTHORIZATION_TOKENs, it <bcp14>SHOULD</bcp14> include those in the
SUBSCRIBE_UPDATE. Relays that send this parameter and applications that receive
it <bcp14>MAY</bcp14> introduce jitter to prevent many endpoints from updating
simultaneously.</t>
            <t>If the EXPIRES parameter is 0 or is not present in a message, the subscription
does not expire or expires at an unknown time.</t>
          </section>
          <section anchor="largest-param">
            <name>LARGEST OBJECT Parameter</name>
            <t>The LARGEST_OBJECT parameter (Parameter Type 0x9) <bcp14>MAY</bcp14> appear in SUBSCRIBE_OK,
PUBLISH or in REQUEST_OK in response to SUBSCRIBE_UPDATE.  It is a
length-prefixed Location structure (see <xref target="location-structure"/>) containing the
largest Location in the Track observed by the sending endpoint (see
<xref target="subscription-filters"/>.  If Objects have been published on this Track the
Publisher <bcp14>MUST</bcp14> include this parameter.</t>
            <t>If omitted from a message, the sending endpoint has not published or received
any Objects in the Track.</t>
          </section>
          <section anchor="forward-parameter">
            <name>FORWARD Parameter</name>
            <t>The FORWARD parameter (Parameter Type 0x10) <bcp14>MAY</bcp14> appear in SUBSCRIBE,
SUBSCRIBE_UPDATE, PUBLISH, PUBLISH_OK, TRACK_STATUS, TRACK_STATUS_OK, and
SUBSCRIBE_NAMESPACE.  It is a variable length integer specifying the
Forwarding State on affected subscriptions (see <xref target="subscriptions"/>).  The
allowed values are 0 (don't forward) or 1 (forward). If an endpoint receives a
value outside this range, it <bcp14>MUST</bcp14> close the session with <tt>PROTOCOL_VIOLATION</tt>.</t>
            <t>If the parameter is omitted from SUBSCRIBE_UPDATE, the value for the
subscription remains unchanged.  If the parameter is omitted from any other
message, the default value is 1.</t>
          </section>
          <section anchor="dynamic-groups">
            <name>DYNAMIC GROUPS Parameter</name>
            <t>The DYNAMIC_GROUPS parameter (parameter type 0x30) <bcp14>MAY</bcp14> appear in PUBLISH or
SUBSCRIBE_OK.  Values larger than 1 are a Protocol Violation.  When the value is
1, it indicates that the subscriber can request the Original Publisher to start
a new Group by including the NEW_GROUP_REQUEST parameter in PUBLISH_OK or
SUBSCRIBE_UPDATE for this Track.</t>
            <t>Relays <bcp14>MUST</bcp14> preserve the value of this parameter received from an upstream
publisher in SUBSCRIBE_OK or PUBLISH when sending these messages to downstream
subscribers.</t>
          </section>
          <section anchor="new-group-request">
            <name>NEW GROUP REQUEST Parameter</name>
            <t>The NEW_GROUP_REQUEST parameter (parameter type 0x32) <bcp14>MAY</bcp14> appear in PUBLISH_OK,
SUBSCRIBE or SUBSCRIBE_UPDATE.  It is an integer representing the largest Group
ID in the Track known by the subscriber, plus 1. A value of 0 indicates that the
subscriber has no Group information for the Track.  A subscriber <bcp14>MUST NOT</bcp14> send
this parameter in PUBLISH_OK or SUBSCRIBE_UPDATE if the publisher did not
include DYNAMIC_GROUPS=1 when establishing the subscription.  A subscriber <bcp14>MAY</bcp14>
include this parameter in SUBSCRIBE without foreknowledge of support.  If the
original publisher does not support dynamic Groups, it ignores the parameter in that
case.</t>
            <t>When an Original Publisher that supports dynamic Groups receives a
NEW_GROUP_REQUEST with a value of 0 or a value larger than the current Group,
it <bcp14>SHOULD</bcp14> end the current Group and begin a new Group as soon as practical.  The
Original Publisher <bcp14>MAY</bcp14> delay the NEW_GROUP_REQUEST subject to
implementation specific concerns, for example, acheiving a minimum duration for
each Group. The Original Publisher chooses the next Group ID; there are no
requirements that it be equal to the NEW_GROUP_REQUEST parameter value.</t>
            <t>Relay Handling:</t>
            <t>A relay that receives a NEW_GROUP_REQUEST for a Track without an <tt>Established</tt>
subscription <bcp14>MUST</bcp14> include the NEW_GROUP_REQUEST when subscribing upstream.</t>
            <t>A relay that receives a NEW_GROUP_REQUEST for an established subscription with a
value of 0 or a value larger than the Largest Group <bcp14>MUST</bcp14> send a SUBSCRIBE_UPDATE
including the NEW_GROUP_REQUEST to the publisher unless:</t>
            <ol spacing="normal" type="1"><li>
                <t>The Track does not support dynamic Groups</t>
              </li>
              <li>
                <t>There is already an outstanding NEW_GROUP_REQUEST from this Relay with a
greater or equal value</t>
              </li>
            </ol>
            <t>If a relay receives a NEW_GROUP_REQUEST with a non-zero value less than or equal
to the Largest Group, it does not send a NEW_GROUP_REQUEST upstream.</t>
            <t>After sending a NEW_GROUP_REQUEST upstream, the request is considered
outstanding until the Largest Group increases.</t>
          </section>
        </section>
      </section>
      <section anchor="message-setup">
        <name>CLIENT_SETUP and SERVER_SETUP</name>
        <t>The <tt>CLIENT_SETUP</tt> and <tt>SERVER_SETUP</tt> messages are the first messages exchanged
by the client and the server; they allow the endpoints to agree on the initial
configuration before any control messsages are exchanged. The messages contain
a sequence of key-value pairs called Setup parameters; the semantics and format
of which can vary based on whether the client or server is sending.  To ensure
future extensibility of MOQT, endpoints <bcp14>MUST</bcp14> ignore unknown setup parameters.
TODO: describe GREASE for Setup Parameters.</t>
        <t>The wire format of the Setup messages are as follows:</t>
        <figure anchor="moq-transport-setup-format">
          <name>MOQT Setup Messages</name>
          <artwork><![CDATA[
CLIENT_SETUP Message {
  Type (i) = 0x20,
  Length (16),
  Number of Parameters (i),
  Setup Parameters (..) ...,
}

SERVER_SETUP Message {
  Type (i) = 0x21,
  Length (16),
  Number of Parameters (i),
  Setup Parameters (..) ...,
}
]]></artwork>
        </figure>
        <t>The available Setup parameters are detailed in the next sections.</t>
        <section anchor="setup-params">
          <name>Setup Parameters</name>
          <section anchor="authority">
            <name>AUTHORITY</name>
            <t>The AUTHORITY parameter (Parameter Type 0x05) allows the client to specify the
authority component of the MoQ URI when using native QUIC (<xref target="QUIC"/>).  It <bcp14>MUST
NOT</bcp14> be used by the server, or when WebTransport is used.  When an AUTHORITY
parameter is received from a server, or when an AUTHORITY parameter is received
while WebTransport is used, or when an AUTHORITY parameter is received by a
server but the server does not support the specified authority, the session <bcp14>MUST</bcp14>
be closed with <tt>INVALID_AUTHORITY</tt>.</t>
            <t>The AUTHORITY parameter follows the URI formatting rules <xref target="RFC3986"/>.
When connecting to a server using a URI with the "moqt" scheme, the
client <bcp14>MUST</bcp14> set the AUTHORITY parameter to the <tt>authority</tt> portion of the
URI. If an AUTHORITY parameter does not conform to
these rules, the session <bcp14>MUST</bcp14> be closed with <tt>MALFORMED_AUTHORITY</tt>.</t>
          </section>
          <section anchor="path">
            <name>PATH</name>
            <t>The PATH parameter (Parameter Type 0x01) allows the client to specify the path
of the MoQ URI when using native QUIC (<xref target="QUIC"/>).  It <bcp14>MUST NOT</bcp14> be used by
the server, or when WebTransport is used.  When a PATH parameter is received
from a server, or when a PATH parameter is received while WebTransport is used,
or when a PATH parameter is received by a server but the server does not
support the specified path, the session <bcp14>MUST</bcp14> be closed with <tt>INVALID_PATH</tt>.</t>
            <t>The PATH parameter follows the URI formatting rules <xref target="RFC3986"/>.
When connecting to a server using a URI with the "moqt" scheme, the
client <bcp14>MUST</bcp14> set the PATH parameter to the <tt>path-abempty</tt> portion of the
URI; if <tt>query</tt> is present, the client <bcp14>MUST</bcp14> concatenate <tt>?</tt>, followed by
the <tt>query</tt> portion of the URI to the parameter. If a PATH does not conform to
these rules, the session <bcp14>MUST</bcp14> be closed with <tt>MALFORMED_PATH</tt>.</t>
          </section>
          <section anchor="max-request-id">
            <name>MAX_REQUEST_ID</name>
            <t>The MAX_REQUEST_ID parameter (Parameter Type 0x02) communicates an initial
value for the Maximum Request ID to the receiving endpoint. The default
value is 0, so if not specified, the peer <bcp14>MUST NOT</bcp14> send requests.</t>
          </section>
          <section anchor="max-auth-token-cache-size">
            <name>MAX_AUTH_TOKEN_CACHE_SIZE</name>
            <t>The MAX_AUTH_TOKEN_CACHE_SIZE parameter (Parameter Type 0x04) communicates the
maximum size in bytes of all actively registered Authorization tokens that the
endpoint is willing to store per Session. This parameter is optional. The default
value is 0 which prohibits the use of token Aliases.</t>
            <t>The token size is calculated as 16 bytes + the size of the Token Value field
(see <xref target="moq-token"/>). The total size as restricted by the
MAX_AUTH_TOKEN_CACHE_SIZE parameter is calculated as the sum of the token sizes
for all registered tokens (Alias Type value of 0x01) minus the sum of the token
sizes for all deregistered tokens (Alias Type value of 0x00), since Session
initiation.</t>
          </section>
          <section anchor="setup-auth-token">
            <name>AUTHORIZATION TOKEN</name>
            <t>See <xref target="authorization-token"/>.  The endpoint can specify one or more tokens in
CLIENT_SETUP or SERVER_SETUP that the peer can use to authorize MOQT session
establishment.</t>
            <t>If a server receives an AUTHORIZATION TOKEN parameter in CLIENT_SETUP with Alias
Type REGISTER that exceeds its MAX_AUTH_TOKEN_CACHE_SIZE, it <bcp14>MUST NOT</bcp14> fail
the session with <tt>AUTH_TOKEN_CACHE_OVERFLOW</tt>.  Instead, it <bcp14>MUST</bcp14> treat the
parameter as Alias Type USE_VALUE.  A client <bcp14>MUST</bcp14> handle registration failures
of this kind by purging any Token Aliases that failed to register based on the
MAX_AUTH_TOKEN_CACHE_SIZE parameter in SERVER_SETUP (or the default value of 0).</t>
          </section>
          <section anchor="moqt-implementation">
            <name>MOQT IMPLEMENTATION</name>
            <t>The MOQT_IMPLEMENTATION parameter (Parameter Type 0x07) identifies the name and
version of the sender's MOQT implementation.  This <bcp14>SHOULD</bcp14> be a UTF-8 encoded
string <xref target="RFC3629"/>, though the message does not carry information, such as
language tags, that would aid comprehension by any entity other than the one
that created the text.</t>
          </section>
        </section>
      </section>
      <section anchor="message-goaway">
        <name>GOAWAY</name>
        <t>An endpoint sends a <tt>GOAWAY</tt> message to inform the peer it intends to close
the session soon.  Servers can use GOAWAY to initiate session migration
(<xref target="session-migration"/>) with an optional URI.</t>
        <t>The GOAWAY message does not impact subscription state. A subscriber
<bcp14>SHOULD</bcp14> individually UNSUBSCRIBE for each existing subscription, while a
publisher <bcp14>MAY</bcp14> reject new requests after sending a GOAWAY.</t>
        <t>Upon receiving a GOAWAY, an endpoint <bcp14>SHOULD NOT</bcp14> initiate new requests to the
peer including SUBSCRIBE, PUBLISH, FETCH, PUBLISH_NAMESPACE,
SUBSCRIBE_NAMESPACE and TRACK_SATUS.</t>
        <t>The endpoint <bcp14>MUST</bcp14> terminate the session with a <tt>PROTOCOL_VIOLATION</tt>
(<xref target="session-termination"/>) if it receives multiple GOAWAY messages.</t>
        <figure anchor="moq-transport-goaway-format">
          <name>MOQT GOAWAY Message</name>
          <artwork><![CDATA[
GOAWAY Message {
  Type (i) = 0x10,
  Length (16),
  New Session URI Length (i),
  New Session URI (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>New Session URI: When received by a client, indicates where the client can
connect to continue this session.  The client <bcp14>MUST</bcp14> use this URI for the new
session if provided. If the URI is zero bytes long, the current URI is reused
instead. The new session URI <bcp14>SHOULD</bcp14> use the same scheme
as the current URI to ensure compatibility.  The maxmimum length of the New
Session URI is 8,192 bytes.  If an endpoint receives a length exceeding the
maximum, it <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.  </t>
            <t>
If a server receives a GOAWAY with a non-zero New Session URI Length it <bcp14>MUST</bcp14>
terminate the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-max-request-id">
        <name>MAX_REQUEST_ID</name>
        <t>An endpoint sends a MAX_REQUEST_ID message to increase the number of requests
the peer can send within a session.</t>
        <t>The Maximum Request ID <bcp14>MUST</bcp14> only increase within a session, and
receipt of a MAX_REQUEST_ID message with an equal or smaller Request ID
value is a <tt>PROTOCOL_VIOLATION</tt>.</t>
        <figure anchor="moq-transport-max-request-id">
          <name>MOQT MAX_REQUEST_ID Message</name>
          <artwork><![CDATA[
MAX_REQUEST_ID Message {
  Type (i) = 0x15,
  Length (16),
  Max Request ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Max Request ID: The new Maximum Request ID for the session plus 1. If a
Request ID equal to or larger than this is received by the endpoint that sent
the MAX_REQUEST_ID in any request message (PUBLISH_NAMESPACE, FETCH,
SUBSCRIBE, SUBSCRIBE_NAMESPACE, SUBSCRIBE_UDPATE or TRACK_STATUS), the
endpoint <bcp14>MUST</bcp14> close the session with an error of <tt>TOO_MANY_REQUESTS</tt>.</t>
          </li>
        </ul>
        <t>MAX_REQUEST_ID is similar to MAX_STREAMS in (<xref section="4.6" sectionFormat="comma" target="RFC9000"/>), and
similar considerations apply when deciding how often to send MAX_REQUEST_ID.
For example, implementations might choose to increase MAX_REQUEST_ID as
subscriptions are closed to keep the number of available subscriptions roughly
consistent.</t>
      </section>
      <section anchor="message-requests-blocked">
        <name>REQUESTS_BLOCKED</name>
        <t>The REQUESTS_BLOCKED message is sent when an endpoint would like to send a new
request, but cannot because the Request ID would exceed the Maximum Request ID
value sent by the peer.  The endpoint <bcp14>SHOULD</bcp14> send only one REQUESTS_BLOCKED for
a given Maximum Request ID.</t>
        <t>An endpoint <bcp14>MAY</bcp14> send a MAX_REQUEST_ID upon receipt of REQUESTS_BLOCKED, but it
<bcp14>MUST NOT</bcp14> rely on REQUESTS_BLOCKED to trigger sending a MAX_REQUEST_ID, because
sending REQUESTS_BLOCKED is not required.</t>
        <figure anchor="moq-transport-requests-blocked">
          <name>MOQT REQUESTS_BLOCKED Message</name>
          <artwork><![CDATA[
REQUESTS_BLOCKED Message {
  Type (i) = 0x1A,
  Length (16),
  Maximum Request ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Maximum Request ID: The Maximum Request ID for the session on which the
endpoint is blocked. More on Request ID in <xref target="request-id"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-request-ok">
        <name>REQUEST_OK</name>
        <t>The REQUEST_OK message is sent to a response to SUBSCRIBE_UPDATE, TRACK_STATUS,
SUBSCRIBE_NAMESPACE and PUBLISH_NAMESPACE requests. The unique request ID in the
REQUEST_OK is used to associate it with the correct type of request.</t>
        <figure anchor="moq-transport-request-ok">
          <name>MOQT REQUEST_OK Message</name>
          <artwork><![CDATA[
REQUEST_OK Message {
  Type (i) = 0x7,
  Length (16),
  Request ID (i),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID to which this message is replying.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-request-error">
        <name>REQUEST_ERROR</name>
        <t>The REQUEST_ERROR message is sent to a response to any request (SUBSCRIBE, FETCH,
PUBLISH, SUBSCRIBE_NAMESPACE, PUBLISH_NAMESPACE, TRACK_STATUS). The unique
request ID in the REQUEST_ERROR is used to associate it with the correct type of
request.</t>
        <figure anchor="moq-transport-request-error">
          <name>MOQT REQUEST_ERROR Message</name>
          <artwork><![CDATA[
REQUEST_ERROR Message {
  Type (i) = 0x5,
  Length (16),
  Request ID (i),
  Error Code (i),
  Error Reason (Reason Phrase),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID to which this message is replying.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for request failure.</t>
          </li>
          <li>
            <t>Error Reason: Provides a text description of the request error. See
 <xref target="reason-phrase"/>.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in REQUEST_ERROR,
as defined below. Most codepoints have identical meanings for various request
types, but some have request-specific meanings.</t>
        <dl>
          <dt>INTERNAL_ERROR (0x0):</dt>
          <dd>
            <t>An implementation specific or generic error occurred.</t>
          </dd>
          <dt>UNAUTHORIZED (0x1):</dt>
          <dd>
            <t>The subscriber is not authorized to perform the requested action on the given
track.</t>
          </dd>
          <dt>TIMEOUT (0x2):</dt>
          <dd>
            <t>The subscription could not be completed before an implementation specific
timeout. For example, a relay could not establish an upstream subscription
within the timeout.</t>
          </dd>
          <dt>NOT_SUPPORTED (0x3):</dt>
          <dd>
            <t>The endpoint does not support the type of request.</t>
          </dd>
          <dt>MALFORMED_AUTH_TOKEN (0x4):</dt>
          <dd>
            <t>Invalid Auth Token serialization during registration (see
<xref target="authorization-token"/>).</t>
          </dd>
          <dt>EXPIRED_AUTH_TOKEN (0x5):</dt>
          <dd>
            <t>Authorization token has expired (<xref target="authorization-token"/>).</t>
          </dd>
        </dl>
        <t>Below are errors for use by the publisher. They can appear in response to
SUBSCRIBE, FETCH, TRACK_STATUS, and SUBSCRIBE_NAMESPACE, unless otherwise noted.</t>
        <dl>
          <dt>DOES_NOT_EXIST (0x10):</dt>
          <dd>
            <t>The track or namespace is not available at the publisher.</t>
          </dd>
          <dt>INVALID_RANGE (0x11):</dt>
          <dd>
            <t>In response to SUBSCRIBE or FETCH, specified Filter or range of Locations
cannot be satisfied.</t>
          </dd>
          <dt>MALFORMED_TRACK (0x12):</dt>
          <dd>
            <t>In response to a FETCH, a relay publisher detected
the track was malformed (see <xref target="malformed-tracks"/>).</t>
          </dd>
        </dl>
        <t>The following are errors for use by the subscriber. They can appear in response
to PUBLISH or PUBLISH_NAMESPACE, unless otherwise noted.</t>
        <dl>
          <dt>UNINTERESTED (0x20):</dt>
          <dd>
            <t>The subscriber is not interested in the track or namespace.</t>
          </dd>
        </dl>
        <t>Errors below can only be used in response to one message type.</t>
        <dl>
          <dt>PREFIX_OVERLAP (0x30):</dt>
          <dd>
            <t>In response to SUBSCRIBE_NAMESPACE, the namespace prefix overlaps with another
SUBSCRIBE_NAMESPACE in the same session.</t>
          </dd>
          <dt>INVALID_JOINING_REQUEST_ID(0x32):</dt>
          <dd>
            <t>In response to a Joining FETCH, the referenced Request ID is not an
<tt>Established</tt> Subscription.</t>
          </dd>
          <dt>UNKNOWN_STATUS_IN_RANGE(0x33):</dt>
          <dd>
            <t>In response to a FETCH, the requested range contains an object with unknown
status.</t>
          </dd>
        </dl>
      </section>
      <section anchor="message-subscribe-req">
        <name>SUBSCRIBE</name>
        <t>A subscription causes the publisher to send newly published objects for a track.
A subscriber <bcp14>MUST NOT</bcp14> establish multiple concurrent subscriptions for a track within a
single session and publishers <bcp14>SHOULD</bcp14> treat this as a protocol violation.</t>
        <t>Subscribe only requests newly published or received Objects.  Objects from the
past are retrieved using FETCH (<xref target="message-fetch"/>).</t>
        <t>The format of SUBSCRIBE is as follows:</t>
        <figure anchor="moq-transport-subscribe-format">
          <name>MOQT SUBSCRIBE Message</name>
          <artwork><![CDATA[
SUBSCRIBE Message {
  Type (i) = 0x3,
  Length (16),
  Request ID (i),
  Track Namespace (..),
  Track Name Length (i),
  Track Name (..),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <li>
            <t>Track Namespace: Identifies the namespace of the track as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>On successful subscription, the publisher <bcp14>MUST</bcp14> reply with a SUBSCRIBE_OK,
allowing the subscriber to determine the start group/object when not explicitly
specified, and start sending objects.</t>
        <t>If the publisher cannot satisfy the requested Subscription Filter (see
<xref target="subscription-filter"/>) or if the entire End Group has already been published
it <bcp14>SHOULD</bcp14> send a REQUEST_ERROR with code <tt>INVALID_RANGE</tt>.  A publisher <bcp14>MUST
NOT</bcp14> send objects from outside the requested range.</t>
        <t>Subscribing with the FORWARD parameter (<xref target="forward-parameter"/>) equal to 0 allows
publisher or relay to prepare to serve the subscription in advance, reducing the
time to receive objects in the future.</t>
      </section>
      <section anchor="message-subscribe-ok">
        <name>SUBSCRIBE_OK</name>
        <t>A publisher sends a SUBSCRIBE_OK control message for successful
subscriptions.</t>
        <figure anchor="moq-transport-subscribe-ok">
          <name>MOQT SUBSCRIBE_OK Message</name>
          <artwork><![CDATA[
SUBSCRIBE_OK Message {
  Type (i) = 0x4,
  Length (16),
  Request ID (i),
  Track Alias (i),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the SUBSCRIBE this message is replying to
<xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Track Alias: The identifer used for this track in Subgroups or Datagrams (see
<xref target="track-alias"/>). The same Track Alias <bcp14>MUST NOT</bcp14> be used to refer to two
different Tracks simultaneously. If a subscriber receives a SUBSCRIBE_OK that
uses the same Track Alias as a different track with an <tt>Established</tt> subscription,
it <bcp14>MUST</bcp14> close the session with error <tt>DUPLICATE_TRACK_ALIAS</tt>.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-update">
        <name>SUBSCRIBE_UPDATE</name>
        <t>A subscriber sends a SUBSCRIBE_UPDATE to a publisher to modify an existing
subscription.</t>
        <t>When updating the Subscription Filter (see <xref target="subscription-filters"/>),
the Start Location <bcp14>MUST</bcp14> not decrease, as an attempt to
to do so could fail. If Objects with Locations smaller than the current
subscription's Largest Location are required, FETCH can be used to retrieve
them. A publisher <bcp14>MUST</bcp14> terminate the session with a <tt>PROTOCOL_VIOLATION</tt> if the
SUBSCRIBE_UPDATE violates this rule.</t>
        <t>When a subscriber narrows their subscription (increase the Start Location and/or
decrease the End Group), it might still receive objects
outside the new range if the publisher sent them before the update was
processed. When a subscriber increases the End Location, the Largest Object at
the publisher might already be larger than the previous End Location. This will
create a gap in the subscription. The REQUEST_OK in response to the
SUBSCRIBE_UPDATE will include the LARGEST_OBJECT parameter, and the subscriber
can issue a FETCH to retrieve the omitted Objects, if any.</t>
        <t>The receiver of a SUBSCRIBE_UPDATE <bcp14>MUST</bcp14> respond with exactly one REQUEST_OK
or REQUEST_ERROR message indicating if the update was successful.  When an
update is unsuccessful, the publisher <bcp14>MUST</bcp14> also terminate the subscription with
PUBLISH_DONE with error code <tt>UPDATE_FAILED</tt>.</t>
        <t>Like SUBSCRIBE, End Group <bcp14>MUST</bcp14> be greater than or equal to the Group specified
in <tt>Start</tt>.</t>
        <t>If a parameter previously set on the subscription in <tt>SUBSCRIBE</tt>, <tt>PUBLISH_OK</tt>
or <tt>SUBSCRIBE_UPDATE</tt> is not present in <tt>SUBSCRIBE_UPDATE</tt>, its value remains
unchanged.</t>
        <t>There is no mechanism to remove a parameter from a subscription.</t>
        <t>The format of SUBSCRIBE_UPDATE is as follows:</t>
        <figure anchor="moq-transport-subscribe-update-format">
          <name>MOQT SUBSCRIBE_UPDATE Message</name>
          <artwork><![CDATA[
SUBSCRIBE_UPDATE Message {
  Type (i) = 0x2,
  Length (16),
  Request ID (i),
  Subscription Request ID (i),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <li>
            <t>Subscription Request ID: The Request ID of the SUBSCRIBE
(<xref target="message-subscribe-req"/>) this message is updating.  This <bcp14>MUST</bcp14> match an
existing Request ID.  The publisher <bcp14>MUST</bcp14> close the session with `
<tt>PROTOCOL_VIOLATION</tt> if the subscriber specifies an invalid Subscription
Request ID.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-unsubscribe">
        <name>UNSUBSCRIBE</name>
        <t>A Subscriber issues an <tt>UNSUBSCRIBE</tt> message to a Publisher indicating it is no
longer interested in receiving the specified Track, indicating that the
Publisher stop sending Objects as soon as possible.</t>
        <t>The format of <tt>UNSUBSCRIBE</tt> is as follows:</t>
        <figure anchor="moq-transport-unsubscribe-format">
          <name>MOQT UNSUBSCRIBE Message</name>
          <artwork><![CDATA[
UNSUBSCRIBE Message {
  Type (i) = 0xA,
  Length (16),
  Request ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the subscription that is being terminated. See
<xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-publish">
        <name>PUBLISH</name>
        <t>The publisher sends the PUBLISH control message to initiate a subscription to a
track. The receiver verifies the publisher is authorized to publish this track.</t>
        <figure anchor="moq-transport-publish-format">
          <name>MOQT PUBLISH Message</name>
          <artwork><![CDATA[
PUBLISH Message {
  Type (i) = 0x1D,
  Length (16),
  Request ID (i),
  Track Namespace (..),
  Track Name Length (i),
  Track Name (..),
  Track Alias (i),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in (<xref target="track-name"/>)</t>
          </li>
          <li>
            <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Track Alias: The identifer used for this track in Subgroups or Datagrams (see
<xref target="track-alias"/>). The same Track Alias <bcp14>MUST NOT</bcp14> be used to refer to two
different Tracks simultaneously. If a subscriber receives a PUBLISH that
uses the same Track Alias as a different track with an <tt>Established</tt> subscription, it
<bcp14>MUST</bcp14> close the session with error <tt>DUPLICATE_TRACK_ALIAS</tt>.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>A subscriber receiving a PUBLISH for a Track it does not wish to receive <bcp14>SHOULD</bcp14>
send REQUEST_ERROR with error code <tt>UNINTERESTED</tt>, and abandon reading any
publisher initiated streams associated with that subscription using a
STOP_SENDING frame.</t>
        <t>A publisher that sends the FORWARD parameter (<xref target="forward-parameter"/>) equal to 0
indicates that it will not transmit any objects until the subscriber sets the
Forward State to 1. If the FORWARD parameter is omitted or equal to 1, the
publisher will start transmitting objects immediately, possibly before
PUBLISH_OK.</t>
      </section>
      <section anchor="message-publish-ok">
        <name>PUBLISH_OK</name>
        <t>The subscriber sends a PUBLISH_OK control message to acknowledge the successful
authorization and acceptance of a PUBLISH message, and establish a subscription.</t>
        <figure anchor="moq-transport-publish-ok">
          <name>MOQT PUBLISH_OK Message</name>
          <artwork><![CDATA[
PUBLISH_OK Message {
  Type (i) = 0x1E,
  Length (16),
  Request ID (i),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the PUBLISH this message is replying to
<xref target="message-publish"/>.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>TODO: A similar section to SUBSCRIBE about how the publisher handles a
filter that is entirely behind Largest Object or is otherwise invalid.</t>
      </section>
      <section anchor="message-publish-done">
        <name>PUBLISH_DONE</name>
        <t>A publisher sends a <tt>PUBLISH_DONE</tt> message to indicate it is done publishing
Objects for that subscription.  The Status Code indicates why the subscription
ended, and whether it was an error. Because PUBLISH_DONE is sent on the control
stream, it is likely to arrive at the receiver before late-arriving objects, and
often even late-opening streams. However, the receiver uses it as an indication
that it should receive any late-opening streams in a relatively short time.</t>
        <t>Note that some objects in the subscribed track might never be delivered,
because a stream was reset, or never opened in the first place, due to the
delivery timeout.</t>
        <t>A sender <bcp14>MUST NOT</bcp14> send PUBLISH_DONE until it has closed all streams it will ever
open, and has no further datagrams to send, for a subscription. After sending
PUBLISH_DONE, the sender can immediately destroy subscription state, although
stream state can persist until delivery completes. The sender might persist
subscription state to enforce the delivery timeout by resetting streams on which
it has already sent FIN, only deleting it when all such streams have received
ACK of the FIN.</t>
        <t>A sender <bcp14>MUST NOT</bcp14> destroy subscription state until it sends PUBLISH_DONE, though
it can choose to stop sending objects (and thus send PUBLISH_DONE) for any
reason.</t>
        <t>A subscriber that receives PUBLISH_DONE <bcp14>SHOULD</bcp14> set a timer of at least its
delivery timeout in case some objects are still inbound due to prioritization or
packet loss. The subscriber <bcp14>MAY</bcp14> dispense with a timer if it sent UNSUBSCRIBE or
is otherwise no longer interested in objects from the track. Once the timer has
expired, the receiver destroys subscription state once all open streams for the
subscription have closed. A subscriber <bcp14>MAY</bcp14> discard subscription state earlier,
at the cost of potentially not delivering some late objects to the
application. The subscriber <bcp14>SHOULD</bcp14> send STOP_SENDING on all streams related to
the subscription when it deletes subscription state.</t>
        <t>The format of <tt>PUBLISH_DONE</tt> is as follows:</t>
        <figure anchor="moq-transport-subscribe-fin-format">
          <name>MOQT PUBLISH_DONE Message</name>
          <artwork><![CDATA[
PUBLISH_DONE Message {
  Type (i) = 0xB,
  Length (16),
  Request ID (i),
  Status Code (i),
  Stream Count (i),
  Error Reason (Reason Phrase)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the subscription that is being terminated. See
<xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Status Code: An integer status code indicating why the subscription ended.</t>
          </li>
          <li>
            <t>Stream Count: An integer indicating the number of data streams the publisher
opened for this subscription.  This helps the subscriber know if it has received
all of the data published in this subscription by comparing the number of
streams received.  The subscriber can immediately remove all subscription state
once the same number of streams have been processed.  If the track had
Forwarding Preference = Datagram, the publisher <bcp14>MUST</bcp14> set Stream Count to 0.  If
the publisher is unable to set Stream Count to the exact number of streams
opened for the subscription, it <bcp14>MUST</bcp14> set Stream Count to 2^62 - 1. Subscribers
<bcp14>SHOULD</bcp14> use a timeout or other mechanism to remove subscription state in case
the publisher set an incorrect value, reset a stream before the SUBGROUP_HEADER,
or set the maximum value.  If a subscriber receives more streams for a
subscription than specified in Stream Count, it <bcp14>MAY</bcp14> close the session with a
<tt>PROTOCOL_VIOLATION</tt>.</t>
          </li>
          <li>
            <t>Error Reason: Provides the reason for subscription error. See <xref target="reason-phrase"/>.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant status code in PUBLISH_DONE, as defined
below:</t>
        <dl>
          <dt>INTERNAL_ERROR (0x0):</dt>
          <dd>
            <t>An implementation specific or generic error occurred.</t>
          </dd>
          <dt>UNAUTHORIZED (0x1):</dt>
          <dd>
            <t>The subscriber is no longer authorized to subscribe to the given track.</t>
          </dd>
          <dt>TRACK_ENDED (0x2):</dt>
          <dd>
            <t>The track is no longer being published.</t>
          </dd>
          <dt>SUBSCRIPTION_ENDED (0x3):</dt>
          <dd>
            <t>The publisher reached the end of an associated subscription filter.</t>
          </dd>
          <dt>GOING_AWAY (0x4):</dt>
          <dd>
            <t>The subscriber or publisher issued a GOAWAY message.</t>
          </dd>
          <dt>EXPIRED (0x5):</dt>
          <dd>
            <t>The publisher reached the timeout specified in SUBSCRIBE_OK.</t>
          </dd>
          <dt>TOO_FAR_BEHIND (0x6):</dt>
          <dd>
            <t>The publisher's queue of objects to be sent to the given subscriber exceeds
its implementation defined limit.</t>
          </dd>
          <dt>MALFORMED_TRACK (0x7):</dt>
          <dd>
            <t>A relay publisher detected the track was malformed (see
<xref target="malformed-tracks"/>).</t>
          </dd>
          <dt>UPDATE_FAILED (0x8):</dt>
          <dd>
            <t>SUBSCRIBE_UPDATE failed on this subscription (see
<xref target="message-subscribe-update"/>).</t>
          </dd>
        </dl>
      </section>
      <section anchor="message-fetch">
        <name>FETCH</name>
        <t>A subscriber issues a FETCH to a publisher to request a range of already
published objects within a track.</t>
        <t>There are three types of Fetch messages.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Code</th>
              <th align="left">Fetch Type</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x1</td>
              <td align="left">Standalone Fetch</td>
            </tr>
            <tr>
              <td align="left">0x2</td>
              <td align="left">Relative Joining Fetch</td>
            </tr>
            <tr>
              <td align="left">0x3</td>
              <td align="left">Absolute Joining Fetch</td>
            </tr>
          </tbody>
        </table>
        <t>An endpoint that receives a Fetch Type other than 0x1, 0x2 or 0x3 <bcp14>MUST</bcp14> close
the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
        <section anchor="standalone-fetch">
          <name>Standalone Fetch</name>
          <t>A Fetch of Objects performed independently of any Subscribe.</t>
          <t>A Standalone Fetch includes this structure:</t>
          <artwork><![CDATA[
Standalone Fetch {
  Track Namespace (..),
  Track Name Length (i),
  Track Name (..),
  Start Location (Location),
  End Location (Location)
}
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>Track Namespace: Identifies the namespace of the track as defined in
(<xref target="track-name"/>).</t>
            </li>
            <li>
              <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
            </li>
            <li>
              <t>Start Location: The start Location.</t>
            </li>
            <li>
              <t>End Location: The end Location, plus 1. A Location.Object value of 0
means the entire group is requested.</t>
            </li>
          </ul>
        </section>
        <section anchor="joining-fetches">
          <name>Joining Fetches</name>
          <t>A Joining Fetch is associated with a Subscribe request by
specifying the Request ID of an <tt>Established</tt> subscription.
A publisher receiving a Joining Fetch uses properties of the associated
Subscribe to determine the Track Namespace, Track Name
and End Location such that it is contiguous with the associated
Subscribe.  The subscriber can set the Start Location to an absolute Location or
a Location relative to the current group.</t>
          <t>A Subscriber can use a Joining Fetch to, for example, fill a playback buffer with a
certain number of groups prior to the live edge of a track.</t>
          <t>A Joining Fetch is only permitted when the associated Subscribe has the Filter
Type Largest Object; any other value results in closing the session with a
<tt>PROTOCOL_VIOLATION</tt>.</t>
          <t>If no Objects have been published for the track, and the SUBSCRIBE_OK did not
include a LARGEST_OBJECT parameter (<xref target="largest-param"/>), the publisher <bcp14>MUST</bcp14>
respond with a REQUEST_ERROR with error code <tt>INVALID_RANGE</tt>.</t>
          <t>A Joining Fetch includes this structure:</t>
          <artwork><![CDATA[
Joining Fetch {
  Joining Request ID (i),
  Joining Start (i)
}
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>Joining Request ID: The Request ID of the existing subscription to be
joined. If a publisher receives a Joining Fetch with a Request ID that does
not correspond to an existing Subscribe in the same session, it <bcp14>MUST</bcp14> return
a REQUEST_ERROR with error code <tt>INVALID_JOINING_REQUEST_ID</tt></t>
            </li>
            <li>
              <t>Joining Start : A relative or absolute value used to determing the Start
Location, described below.</t>
            </li>
          </ul>
          <section anchor="joining-fetch-range-calculation">
            <name>Joining Fetch Range Calculation</name>
            <t>The Largest Location value from the corresponding
subscription is used to calculate the end of a Joining Fetch, so the
Objects retrieved by the FETCH and SUBSCRIBE are contiguous and non-overlapping.</t>
            <t>The publisher receiving a Joining Fetch sets the End Location to {Subscribe
Largest Location.Object + 1}. Here Subscribe Largest Location is the
saved value from when the subscription started (see <xref target="subscriptions"/>).</t>
            <t>Note: the last Object included in the Joining FETCH response is Subscribe
Largest Location.  The <tt>+ 1</tt> above indicates the equivalent Standalone Fetch
encoding.</t>
            <t>For a Relative Joining Fetch, the publisher sets the Start Location to
{Subscribe Largest Location.Group - Joining Start, 0}.</t>
            <t>For an Absolute Joining Fetch, the publisher sets the Start Location to
{Joining Start, 0}.</t>
          </section>
        </section>
        <section anchor="fetch-handling">
          <name>Fetch Handling</name>
          <t>The format of FETCH is as follows:</t>
          <figure anchor="moq-transport-fetch-format">
            <name>MOQT FETCH Message</name>
            <artwork><![CDATA[
FETCH Message {
  Type (i) = 0x16,
  Length (16),
  Request ID (i),
  Fetch Type (i),
  [Standalone (Standalone Fetch),]
  [Joining (Joining Fetch),]
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
          </figure>
          <ul spacing="normal">
            <li>
              <t>Request ID: See <xref target="request-id"/>.</t>
            </li>
            <li>
              <t>Fetch Type: Identifies the type of Fetch, whether Standalone, Relative
Joining or Absolute Joining.</t>
            </li>
            <li>
              <t>Standalone: Standalone Fetch structure included when Fetch Type is 0x1</t>
            </li>
            <li>
              <t>Joining: Joining Fetch structure included when Fetch Type is 0x2 or 0x3.</t>
            </li>
            <li>
              <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
            </li>
          </ul>
          <t>A publisher responds to a FETCH request with either a FETCH_OK or a REQUEST_ERROR
message.  The publisher creates a new unidirectional stream that is used to send the
Objects.  The FETCH_OK or REQUEST_ERROR can come at any time relative to object
delivery.</t>
          <t>The publisher responding to a FETCH is
responsible for delivering all available Objects in the requested range in the
requested order (see <xref target="group-order"/>). The Objects in the response are delivered on a single
unidirectional stream. Any gaps in the Group and Object IDs in the response
stream indicate objects that do not exist (eg: they implicitly have status
<tt>Object Does Not Exist</tt>).  For Ascending Group Order this includes ranges
between the first requested object and the first object in the stream; between
objects in the stream; and between the last object in the stream and the Largest
Group/Object indicated in FETCH_OK, so long as the fetch stream is terminated by
a FIN.  If no Objects exist in the requested range, the publisher opens the
unidirectional stream, sends the FETCH_HEADER (see <xref target="fetch-header"/>) and closes
the stream with a FIN.</t>
          <t>A relay that has cached objects from the beginning of the range <bcp14>MAY</bcp14> start
sending objects immediately in response to a FETCH.  If it encounters an object
in the requested range that is not cached and has unknown status, the relay <bcp14>MUST</bcp14>
pause subsequent delivery until it has confirmed the object's status upstream.
If the upstream FETCH fails, the relay sends a REQUEST_ERROR and can reset the
unidirectional stream.  It can choose to do so immediately or wait until the
cached objects have been delivered before resetting the stream.</t>
          <t>The Object Forwarding Preference does not apply to fetches.</t>
          <t>Fetch specifies an inclusive range of Objects starting at Start Location and
ending at End Location. End Location <bcp14>MUST</bcp14> specify the same or a larger Location
than Start Location for Standalone and Absolute Joining Fetches.</t>
          <t>Objects that are not yet published will not be retrieved by a FETCH.  The
Largest available Object in the requested range is indicated in the FETCH_OK,
and is the last Object a fetch will return if the End Location have not yet been
published.</t>
          <t>If Start Location is greater than the <tt>Largest Object</tt>
(<xref target="message-subscribe-req"/>) the publisher <bcp14>MUST</bcp14> return REQUEST_ERROR with error
code <tt>INVALID_RANGE</tt>.</t>
          <t>A publisher <bcp14>MUST</bcp14> send fetched groups in the requested group order, either
ascending or descending. Within each group, objects are sent in Object ID order;
subgroup ID is not used for ordering.</t>
          <t>If an Original Publisher receives a FETCH with a range that includes an object with
unknown status, it <bcp14>MUST</bcp14> return REQUEST_ERROR with code UNKNOWN_STATUS_IN_RANGE.</t>
        </section>
      </section>
      <section anchor="message-fetch-ok">
        <name>FETCH_OK</name>
        <t>A publisher sends a FETCH_OK control message in response to successful fetches.
A publisher <bcp14>MAY</bcp14> send Objects in response to a FETCH before the FETCH_OK message is sent,
but the FETCH_OK <bcp14>MUST NOT</bcp14> be sent until the End Location is known.</t>
        <figure anchor="moq-transport-fetch-ok">
          <name>MOQT FETCH_OK Message</name>
          <artwork><![CDATA[
FETCH_OK Message {
  Type (i) = 0x18,
  Length (16),
  Request ID (i),
  End Of Track (8),
  End Location (Location),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the FETCH this message is replying to
<xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>End Of Track: 1 if all Objects have been published on this Track, and
the End Location is the final Object in the Track, 0 if not.</t>
          </li>
          <li>
            <t>End Location: The largest object covered by the FETCH response.
The End Location is determined as follows:
            </t>
            <ul spacing="normal">
              <li>
                <t>If the requested FETCH End Location was beyond the Largest known (possibly
final) Object, End Location is {Largest.Group, Largest.Object + 1}</t>
              </li>
              <li>
                <t>If End Location.Object in the FETCH request was 0 and the response covers
the last Object in the Group, End Location is {Fetch.End Location.Group, 0}</t>
              </li>
              <li>
                <t>Otherwise, End Location is Fetch.End Location
Where Fetch.End Location is either Fetch.Standalone.End Location or the computed
End Location described in <xref target="joining-fetch-range-calculation"/>.</t>
              </li>
            </ul>
            <t>
If the relay is subscribed to the track, it uses its knowledge of the largest
{Group, Object} to set End Location.  If it is not subscribed and the
requested End Location exceeds its cached data, the relay makes an upstream
request to complete the FETCH, and uses the upstream response to set End
Location.  </t>
            <t>
If End Location is smaller than the Start Location in the corresponding FETCH
the receiver <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-fetch-cancel">
        <name>FETCH_CANCEL</name>
        <t>A subscriber sends a FETCH_CANCEL message to a publisher to indicate it is no
longer interested in receiving objects for the fetch identified by the 'Request
ID'. The publisher <bcp14>SHOULD</bcp14> promptly close the unidirectional stream, even if it
is in the middle of delivering an object.</t>
        <t>The format of <tt>FETCH_CANCEL</tt> is as follows:</t>
        <figure anchor="moq-transport-fetch-cancel">
          <name>MOQT FETCH_CANCEL Message</name>
          <artwork><![CDATA[
FETCH_CANCEL Message {
  Type (i) = 0x17,
  Length (16),
  Request ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the FETCH (<xref target="message-fetch"/>) this message is
cancelling.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-track-status">
        <name>TRACK_STATUS</name>
        <t>A potential subscriber sends a <tt>TRACK_STATUS</tt> message on the control
stream to obtain information about the current status of a given track.</t>
        <t>The TRACK_STATUS message format is identical to the SUBSCRIBE message
(<xref target="message-subscribe-req"/>).</t>
        <t>The receiver of a TRACK_STATUS message treats it identically as if it had
received a SUBSCRIBE message, except it does not create downstream subscription
state or send any Objects.  If successful, the publisher responds with a
REQUEST_OK message with the same parameters it would have set in a SUBSCRIBE_OK.
Track Alias is not used.  A publisher responds to a failed TRACK_STATUS with an
appropriate REQUEST_ERROR message.</t>
        <t>Relays without an <tt>Established</tt> subscription <bcp14>MAY</bcp14> forward TRACK_STATUS to one or more
publishers, or <bcp14>MAY</bcp14> initiate a subscription (subject to authorization) as
described in <xref target="publisher-interactions"/> to determine the response. The publisher
does not send PUBLISH_DONE for this request, and the subscriber cannot send
SUBSCRIBE_UPDATE or UNSUBSCRIBE.</t>
      </section>
      <section anchor="message-pub-ns">
        <name>PUBLISH_NAMESPACE</name>
        <t>The publisher sends the PUBLISH_NAMESPACE control message to advertise that it
has tracks available within a Track Namespace. The receiver verifies the
publisher is authorized to publish tracks under this namespace.</t>
        <figure anchor="moq-transport-pub-ns-format">
          <name>MOQT PUBLISH_NAMESPACE Message</name>
          <artwork><![CDATA[
PUBLISH_NAMESPACE Message {
  Type (i) = 0x6,
  Length (16),
  Request ID (i),
  Track Namespace (..),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
<xref target="track-name"/>.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-pub-ns-done">
        <name>PUBLISH_NAMESPACE_DONE</name>
        <t>The publisher sends the <tt>PUBLISH_NAMESPACE_DONE</tt> control message to indicate its
intent to stop serving new subscriptions for tracks within the provided Track
Namespace.</t>
        <figure anchor="moq-transport-pub-ns-done-format">
          <name>MOQT PUBLISH_NAMESPACE_DONE Message</name>
          <artwork><![CDATA[
PUBLISH_NAMESPACE_DONE Message {
  Type (i) = 0x9,
  Length (16),
  Track Namespace (..)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
<xref target="track-name"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-pub-ns-cancel">
        <name>PUBLISH_NAMESPACE_CANCEL</name>
        <t>The subscriber sends an <tt>PUBLISH_NAMESPACE_CANCEL</tt> control message to
indicate it will stop sending new subscriptions for tracks
within the provided Track Namespace.</t>
        <figure anchor="moq-transport-pub-ns-cancel-format">
          <name>MOQT PUBLISH_NAMESPACE_CANCEL Message</name>
          <artwork><![CDATA[
PUBLISH_NAMESPACE_CANCEL Message {
  Type (i) = 0xC,
  Length (16),
  Track Namespace (..),
  Error Code (i),
  Error Reason (Reason Phrase)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
<xref target="track-name"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for canceling the publish.
PUBLISH_NAMESPACE_CANCEL uses the same error codes as REQUEST_ERROR
(<xref target="message-request-error"/>) that responds to PUBLISH_NAMESPACE.</t>
          </li>
          <li>
            <t>Error Reason: Provides the reason for publish cancelation. See
<xref target="reason-phrase"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-ns">
        <name>SUBSCRIBE_NAMESPACE</name>
        <t>The subscriber sends the SUBSCRIBE_NAMESPACE control message to a publisher to
request the current set of matching published namespaces and established
subscriptions, as well as future updates to the set.</t>
        <figure anchor="moq-transport-subscribe-ns-format">
          <name>MOQT SUBSCRIBE_NAMESPACE Message</name>
          <artwork><![CDATA[
SUBSCRIBE_NAMESPACE Message {
  Type (i) = 0x11,
  Length (16),
  Request ID (i),
  Track Namespace Prefix (..),
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <li>
            <t>Track Namespace Prefix: A Track Namespace structure as described in
<xref target="track-name"/> with between 1 and 32 Track Namespace Fields.  This prefix is
matched against track namespaces known to the publisher.  For example, if the
publisher is a relay that has received PUBLISH_NAMESPACE messages for
namespaces ("example.com", "meeting=123", "participant=100") and
("example.com", "meeting=123", "participant=200"), a SUBSCRIBE_NAMESPACE for
("example.com", "meeting=123") would match both.  If an endpoint receives a
Track Namespace Prefix consisting of 0 or greater than than 32 Track Namespace
Fields, it <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>The publisher will respond with REQUEST_OK or
REQUEST_ERROR.  If the SUBSCRIBE_NAMESPACE is successful, the publisher will
immediately forward existing PUBLISH_NAMESPACE and PUBLISH messages that match
the Track Namespace Prefix that have not already been sent to this subscriber.
If the set of matching PUBLISH_NAMESPACE messages changes, the publisher sends
the corresponding PUBLISH_NAMESPACE or PUBLISH_NAMESPACE_DONE message.</t>
        <t>A subscriber cannot make overlapping namespace subscriptions on a single
session. Within a session, if a publisher receives a SUBSCRIBE_NAMESPACE with a
Track Namespace Prefix that shares a common prefix with an established namespace
subscription, it <bcp14>MUST</bcp14> respond with REQUEST_ERROR with error code
<tt>PREFIX_OVERLAP</tt>.</t>
        <t>The publisher <bcp14>MUST</bcp14> ensure the subscriber is authorized to perform this
namespace subscription.</t>
        <t>SUBSCRIBE_NAMESPACE is not required for a publisher to send PUBLISH_NAMESPACE,
PUBLISH_NAMESPACE_DONE or PUBLISH messages to a subscriber.  It is useful in
applications or relays where subscribers are only interested in or authorized to
access a subset of available namespaces and tracks.</t>
        <t>If the FORWARD parameter (<xref target="forward-parameter"/>) is present in this message and
equal to 0, PUBLISH messages resulting from this SUBSCRIBE_NAMESPACE will set
the FORWARD parameter to 0. If the FORWARD parameter is equal to 1 or omitted
from this message, PUBLISH messages resulting from this SUBSCRIBE_NAMESPACE will
set the FORWARD parameter to 1, or indicate that value by omitting the parameter
(see <xref target="subscriptions"/>).</t>
      </section>
      <section anchor="message-unsub-ns">
        <name>UNSUBSCRIBE_NAMESPACE</name>
        <t>A subscriber issues a <tt>UNSUBSCRIBE_NAMESPACE</tt> message to a publisher indicating
it is no longer interested in PUBLISH_NAMESPACE, PUBLISH_NAMESPACE_DONE and
PUBLISH messages for the specified track namespace prefix.</t>
        <t>The format of <tt>UNSUBSCRIBE_NAMESPACE</tt> is as follows:</t>
        <figure anchor="moq-transport-unsub-ann-format">
          <name>MOQT UNSUBSCRIBE_NAMESPACE Message</name>
          <artwork><![CDATA[
UNSUBSCRIBE_NAMESPACE Message {
  Type (i) = 0x14,
  Length (16),
  Request ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the SUBSCRIBE_NAMESPACE
(<xref target="message-subscribe-ns"/>) being cancelled by this message.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="data-streams">
      <name>Data Streams and Datagrams</name>
      <t>A publisher sends Objects matching a subscription on Data Streams or Datagrams
and sends Objects matching a FETCH request on one Data Stream.</t>
      <t>All unidirectional MOQT streams start with a variable-length integer indicating
the type of the stream in question.</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x10-0x1D</td>
            <td align="left">SUBGROUP_HEADER  (<xref target="subgroup-header"/>)</td>
          </tr>
          <tr>
            <td align="right">0x05</td>
            <td align="left">FETCH_HEADER  (<xref target="fetch-header"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>All MOQT datagrams start with a variable-length integer indicating the type of
the datagram.</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x00-0x07,0x20-21,0x24-25</td>
            <td align="left">OBJECT_DATAGRAM (<xref target="object-datagram"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>An endpoint that receives an unknown stream or datagram type <bcp14>MUST</bcp14> close the
session.</t>
      <t>Every Track has a single 'Object Forwarding Preference' and the Original
Publisher <bcp14>MUST NOT</bcp14> mix different forwarding preferences within a single track
(see <xref target="malformed-tracks"/>).</t>
      <section anchor="track-alias">
        <name>Track Alias</name>
        <t>To optimize wire efficiency, Subgroups and Datagrams refer to a track by a
numeric identifier, rather than the Full Track Name.  Track Alias is chosen by
the publisher and included in SUBSCRIBE_OK (<xref target="message-subscribe-ok"/>) or PUBLISH
(<xref target="message-publish"/>).</t>
        <t>Objects can arrive after a subscription has been cancelled.  Subscribers <bcp14>SHOULD</bcp14>
retain sufficient state to quickly discard these unwanted Objects, rather than
treating them as belonging to an unknown Track Alias.</t>
      </section>
      <section anchor="message-object">
        <name>Objects</name>
        <t>An Object contains a range of contiguous bytes from the
specified track, as well as associated metadata required to deliver,
cache, and forward it.  Objects are sent by publishers.</t>
        <section anchor="object-properties">
          <name>Canonical Object Properties</name>
          <t>A canonical MoQ Object has the following information:</t>
          <ul spacing="normal">
            <li>
              <t>Track Namespace and Track Name: The track this object belongs to.</t>
            </li>
            <li>
              <t>Group ID: The identifier of the Object's Group (see <xref target="model-group"/>) within
the Track.</t>
            </li>
            <li>
              <t>Object ID: The order of the object within the group.</t>
            </li>
            <li>
              <t>Publisher Priority: An 8 bit integer indicating the publisher's priority for
the Object (<xref target="priorities"/>).</t>
            </li>
            <li>
              <t>Object Forwarding Preference: An enumeration indicating how a publisher sends
an object. The preferences are Subgroup and Datagram.  Note that the Original
Publisher determines the Forwarding Preference for the entire Track, and is a
Track property that is implicitly signaled by the delivery of any Object using
either Subgroups or Datagrams. Once the property is established for one Object
of a Track, the same value <bcp14>MUST</bcp14> be used for all Objects of the Track.
In a subscription, an Object <bcp14>MUST</bcp14> be sent according to its <tt>Object Forwarding
Preference</tt>.</t>
            </li>
            <li>
              <t>Subgroup ID: The identifier of the Object's Subgroup (see <xref target="model-subgroup"/>)
within the Group. This field is omitted if the <tt>Object Forwarding Preference</tt>
is Datagram.</t>
            </li>
            <li>
              <t>Object Status: An enumeration used to indicate missing
objects or mark the end of a group or track. See <xref target="object-status"/> below.</t>
            </li>
            <li>
              <t>Object Extension Length: The total length of the Object Extension Headers
block, in bytes.</t>
            </li>
            <li>
              <t>Object Extensions : A sequence of Object Extension Headers. See
<xref target="object-extensions"/> below.</t>
            </li>
            <li>
              <t>Object Payload: An opaque payload intended for an End Subscriber and <bcp14>SHOULD
NOT</bcp14> be processed by a relay. Only present when 'Object Status' is Normal (0x0).</t>
            </li>
          </ul>
          <section anchor="object-status">
            <name>Object Status</name>
            <t>The Object Status informs subscribers what objects will not be received
because they were never produced, are no longer available, or because they
are beyond the end of a group or track.</t>
            <t><tt>Status</tt> can have following values:</t>
            <ul spacing="normal">
              <li>
                <t>0x0 := Normal object. This status is implicit for any non-zero length object.
       Zero-length objects explicitly encode the Normal status.</t>
              </li>
              <li>
                <t>0x1 := Indicates Object Does Not Exist. Indicates that this Object does not
       exist at any publisher and it will not be published in the future. This
       <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
              <li>
                <t>0x3 := Indicates End of Group. Object ID is one greater than the largest
       Object produced in the Group identified by the Group ID. If the Object
       ID is 0, it indicates there are no Objects in this Group. This <bcp14>SHOULD</bcp14>
       be cached. A publisher <bcp14>MAY</bcp14> use an end of Group object to signal the end
       of all open Subgroups in a Group. A non-zero-length Object can be the
       End of Group, as signaled in the DATAGRAM or SUBGROUP_HEADER Type field
       (see <xref target="object-datagram"/> and <xref target="subgroup-header"/>).</t>
              </li>
              <li>
                <t>0x4 := Indicates End of Track. Group ID is either the largest Group produced
       in this Track with Object ID one greater than the largest Object
       produced in that Group, or Group ID is one greater than the largest
       Group produced in this Track with Object ID zero. This status also
       indicates the specified Group has ended. Publishers <bcp14>MUST NOT</bcp14> publish an
       Object with a Location larger than this Location (see
       <xref target="malformed-tracks"/>). This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
            </ul>
            <t>Any other value <bcp14>SHOULD</bcp14> be treated as a protocol error and the session <bcp14>SHOULD</bcp14>
be terminated with a <tt>PROTOCOL_VIOLATION</tt> (<xref target="session-termination"/>).
Any object with a status code other than zero <bcp14>MUST</bcp14> have an empty payload.</t>
          </section>
          <section anchor="object-extensions">
            <name>Object Extension Header</name>
            <t>Any Object with status Normal can have extension headers.  If an endpoint
receives extension headers on Objects with status that is not Normal, it <bcp14>MUST</bcp14> close the
session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
            <t>Object Extension Headers are visible to relays and allow the transmission of
future metadata relevant to MOQT Object distribution. Any Object metadata never
intended to be accessed by the transport or Relays <bcp14>SHOULD</bcp14> be serialized as part
of the Object payload and not as an extension header.</t>
            <t>Extension Headers are defined in external specifications and registered in an
IANA table <xref target="iana"/>. These specifications define the type and value of the
header, as well as the rules for processing, modification, caching and
forwarding. All such specifications <bcp14>MUST</bcp14> specify whether multiple values of the
same extension are allowed on a single Object.  A relay that enforces these
rules is considered to "support" the extension.  If a Relay does not support an
extension header, it <bcp14>MUST</bcp14> assume multiple values are allowed.</t>
            <t>If unsupported by the relay, Extension Headers <bcp14>MUST NOT</bcp14> be modified, <bcp14>MUST</bcp14> be
cached as part of the Object and <bcp14>MUST</bcp14> be forwarded by relays.</t>
            <t>If supported by the relay and subject to the processing rules specified in the
definition of the extension, Extension Headers <bcp14>MAY</bcp14> be modified, added, removed,
and/or cached by relays.</t>
            <t>Object Extension Headers are serialized as Key-Value-Pairs (see
<xref target="moq-key-value-pair"/>), prefixed by the length of the serialized
Key-Value-Pairs, in bytes.</t>
            <artwork><![CDATA[
Extensions {
  Extension Headers Length (i),
  Extension headers (..),
}
]]></artwork>
            <t>Header types are registered in the IANA table 'MOQ Extension Headers'.
See <xref target="iana"/>.</t>
          </section>
        </section>
      </section>
      <section anchor="datagrams">
        <name>Datagrams</name>
        <t>A single object can be conveyed in a datagram.  The Track Alias field
(<xref target="track-alias"/>) indicates the track this Datagram belongs to.  If an endpoint
receives a datagram with an unknown Track Alias, it <bcp14>MAY</bcp14> drop the datagram or
choose to buffer it for a brief period to handle reordering with the control
message that establishes the Track Alias.</t>
        <t>An Object received in an <tt>OBJECT_DATAGRAM</tt> message has an <tt>Object Forwarding
Preference</tt> = <tt>Datagram</tt>.</t>
        <t>To send an Object with <tt>Object Forwarding Preference</tt> = <tt>Datagram</tt>, determine
the length of the header and payload and send the Object as datagram.  When the
total size is larger than the maximum datagram size for the session, the Object
will be dropped without any explicit notification.</t>
        <t>Each session along the path between the Original Publisher and End Subscriber
might have different maximum datagram sizes. Additionally, Object Extension
Headers (<xref target="object-extensions"/>) can be added to Objects as they pass through
the MOQT network, increasing the size of the Object and the chances it will
exceed the maximum datagram size of a downstream session and be dropped.</t>
        <section anchor="object-datagram">
          <name>Object Datagram</name>
          <t>An <tt>OBJECT_DATAGRAM</tt> carries a single object in a datagram.</t>
          <figure anchor="object-datagram-format">
            <name>MOQT OBJECT_DATAGRAM</name>
            <artwork><![CDATA[
OBJECT_DATAGRAM {
  Type (i) = 0x0-0x7,0x20-21,0x24-25
  Track Alias (i),
  Group ID (i),
  [Object ID (i),]
  [Publisher Priority (8),]
  [Extensions (..),]
  [Object Status (i),]
  [Object Payload (..),]
}
]]></artwork>
          </figure>
          <t>The Type value determines which fields are present in the OBJECT_DATAGRAM.
There are 10 defined Type values for OBJECT_DATAGRAM.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">End Of Group</th>
                <th align="left">Extensions</th>
                <th align="left">Object ID</th>
                <th align="left">Priority Present</th>
                <th align="left">Status / Payload</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x00</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x01</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x02</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x03</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x04</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x05</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x06</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x07</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x20</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Status</td>
              </tr>
              <tr>
                <td align="left">0x21</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Status</td>
              </tr>
              <tr>
                <td align="left">0x24</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Status</td>
              </tr>
              <tr>
                <td align="left">0x25</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Status</td>
              </tr>
              <tr>
                <td align="left">0x08</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x09</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x0A</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x0B</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x0C</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x0D</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x0E</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x0F</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Payload</td>
              </tr>
              <tr>
                <td align="left">0x28</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Status</td>
              </tr>
              <tr>
                <td align="left">0x29</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Status</td>
              </tr>
              <tr>
                <td align="left">0x2C</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Status</td>
              </tr>
              <tr>
                <td align="left">0x2D</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Status</td>
              </tr>
            </tbody>
          </table>
          <ul spacing="normal">
            <li>
              <t>End of Group: For Type values where End of Group is "Yes" the Object is the
last Object in the Group.</t>
            </li>
            <li>
              <t>Extensions Present: If Extensions Present is "Yes" the Extensions structure
defined in <xref target="object-extensions"/> is included. If an endpoint receives a
datagram with Extensions Present as "Yes" and a Extension Headers Length of 0,
it <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
            </li>
            <li>
              <t>Object ID Present: If Object ID Present is No, the Object ID field is omitted
and the Object ID is 0.  When Object ID Present is Yes, the Object ID field is
present and encodes the Object ID.</t>
            </li>
            <li>
              <t>Priority Present: If Priority Present is No, Priority is not present and this
Object inherits the Publisher Priority specified in the control message that
established the subscription.  When Priority Present is Yes, the Priority field
is present.</t>
            </li>
            <li>
              <t>Payload and Status: The Object Status field and Object Payload are mutually
exclusive.  </t>
              <ul spacing="normal">
                <li>
                  <t>For Type values 0x00 through 0x07, the Object Payload is present
and the Object Status field is omitted.      </t>
                  <t>
There is no explicit length field for the Object Payload. The entirety of the
transport datagram following the Object header fields contains the payload.</t>
                </li>
                <li>
                  <t>For Type values 0x20, 0x21, 0x24 and 0x25 the Object Status field is present
and there is no Object Payload.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="streams">
        <name>Streams</name>
        <t>When Objects are sent on streams, the stream begins with a Subgroup or Fetch
Header and is followed by one or more sets of serialized Object fields.
If a stream ends gracefully (i.e., the stream terminates with a FIN) in the
middle of a serialized Object, the session <bcp14>SHOULD</bcp14> be terminated with a
<tt>PROTOCOL_VIOLATION</tt>.</t>
        <t>A publisher <bcp14>SHOULD NOT</bcp14> open more than one stream at a time with the same Subgroup
Header field values.</t>
        <section anchor="stream-cancellation">
          <name>Stream Cancellation</name>
          <t>Streams aside from the control stream <bcp14>MAY</bcp14> be canceled due to congestion
or other reasons by either the publisher or subscriber. Early termination of a
stream does not affect the MoQ application state, and therefore has no
effect on outstanding subscriptions.</t>
        </section>
        <section anchor="subgroup-header">
          <name>Subgroup Header</name>
          <t>All Objects on a Subgroup stream belong to the track identified by <tt>Track Alias</tt>
(see <xref target="track-alias"/>) and the Subgroup indicated by 'Group ID' and <tt>Subgroup
ID</tt> indicated by the SUBGROUP_HEADER.</t>
          <t>If an endpoint receives a subgroup with an unknown Track Alias, it <bcp14>MAY</bcp14> abandon
the stream, or choose to buffer it for a brief period to handle reordering with
the control message that establishes the Track Alias.  The endpoint <bcp14>MAY</bcp14> withhold
stream flow control beyond the SUBGROUP_HEADER until the Track Alias has been
established.  To prevent deadlocks, the publisher <bcp14>MUST</bcp14> allocate connection flow
control to the control stream before allocating it any data streams. Otherwise,
a receiver might wait for a control message containing a Track Alias to release
flow control, while the sender waits for flow control to send the message.</t>
          <figure anchor="object-header-format">
            <name>MOQT SUBGROUP_HEADER</name>
            <artwork><![CDATA[
SUBGROUP_HEADER {
  Type (i) = 0x10..0x1D,
  Track Alias (i),
  Group ID (i),
  [Subgroup ID (i),]
  [Publisher Priority (8),]
}
]]></artwork>
          </figure>
          <t>All Objects received on a stream opened with <tt>SUBGROUP_HEADER</tt> have an
<tt>Object Forwarding Preference</tt> = <tt>Subgroup</tt>.</t>
          <t>There are 24 defined Type values for SUBGROUP_HEADER:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Subgroup ID</th>
                <th align="left">Subgroup ID</th>
                <th align="left">Extensions</th>
                <th align="left">Contains End</th>
                <th align="left">Priority</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left"> </td>
                <td align="left">Field Present</td>
                <td align="left">Value</td>
                <td align="left">Present</td>
                <td align="left">of Group</td>
                <td align="left">Present</td>
              </tr>
              <tr>
                <td align="left">0x10</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x11</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x12</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x13</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x14</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x15</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x18</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x19</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1A</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1B</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1C</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1D</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x30</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x31</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x32</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x33</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x34</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">No</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x35</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x38</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x39</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x3A</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x3B</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x3C</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x3D</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
            </tbody>
          </table>
          <t>For Type values where Contains End of Group is Yes, the last Object in this
Subgroup stream before a FIN is the last Object in the Group.  If the Subgroup
stream is terminated with a RESET_STREAM or RESET_STREAM_AT, the receiver cannot
determine the End of Group Object ID.</t>
          <t>For Type values where Subgroup ID Field Present is No, there is no explicit
Subgroup ID field in the header and the Subgroup ID is either 0 (for Types
0x10-11 and 0x18-19) or the Object ID of the first object transmitted in this
subgroup (for Types 0x12-13 and 0x1A-1B).</t>
          <t>For Type values where Extensions Present is No, the Extensions field is never
present and all Objects have no extensions.  When Extensions Present is Yes, the
Extensions structure defined in <xref target="object-extensions"/> is present in all Objects
in this subgroup.  Objects with no extensions set Extension Headers Length to 0.</t>
          <t>For Type values where Priority Present is No, Priority is not present and this
Subgroup inherits the Publisher Priority specified in the control message that
established the subscription.  When Priority Present is Yes, the Priority field
is present in the Subgroup header.</t>
          <t>To send an Object with <tt>Object Forwarding Preference</tt> = <tt>Subgroup</tt>, find the open
stream that is associated with the subscription, <tt>Group ID</tt> and <tt>Subgroup ID</tt>,
or open a new one and send the <tt>SUBGROUP_HEADER</tt>. Then serialize the
following fields.</t>
          <t>The Object Status field is only sent if the Object Payload Length is zero.</t>
          <t>The Object ID Delta + 1 is added to the previous Object ID in the Subgroup
stream if there was one.  The Object ID is the Object ID Delta if it's the first
Object in the Subgroup stream. For example, a Subgroup of sequential Object IDs
starting at 0 will have 0 for all Object ID Delta values. A consumer cannot
infer information about the existence of Objects between the current and
previous Object ID in the Subgroup (e.g. when Object ID Delta is non-zero)
unless there is an Prior Object ID Gap extesnion header (see
<xref target="prior-object-id-gap"/>).</t>
          <figure anchor="object-subgroup-format">
            <name>MOQT Subgroup Object Fields</name>
            <artwork><![CDATA[
{
  Object ID Delta (i),
  [Extensions (..),]
  Object Payload Length (i),
  [Object Status (i),]
  [Object Payload (..),]
}
]]></artwork>
          </figure>
        </section>
        <section anchor="closing-subgroup-streams">
          <name>Closing Subgroup Streams</name>
          <t>Subscribers will often need to know if they have received all objects in a
Subgroup, particularly if they serve as a relay or cache. QUIC and Webtransport
streams provide signals that can be used for this purpose. Closing Subgroups
promptly frees system resources and often unlocks flow control credit to open
more streams.</t>
          <t>If a sender has delivered all objects in a Subgroup to the QUIC stream, except
any Objects with Locations smaller than the subscription's Start Location, it
<bcp14>MUST</bcp14> close the stream with a FIN.</t>
          <t>If a sender closes the stream before delivering all such objects to the QUIC
stream, it <bcp14>MUST</bcp14> use a RESET_STREAM or RESET_STREAM_AT
<xref target="I-D.draft-ietf-quic-reliable-stream-reset"/> frame. This includes, but is
not limited to:</t>
          <ul spacing="normal">
            <li>
              <t>An Object in an open Subgroup exceeding its Delivery Timeout</t>
            </li>
            <li>
              <t>Early termination of subscription due to an UNSUBSCRIBE message</t>
            </li>
            <li>
              <t>A publisher's decision to end the subscription early</t>
            </li>
            <li>
              <t>A SUBSCRIBE_UPDATE moving the subscription's End Group to a smaller Group or
the Start Location to a larger Location</t>
            </li>
            <li>
              <t>Omitting a Subgroup Object due to the subcriber's Forward State</t>
            </li>
          </ul>
          <t>When RESET_STREAM_AT is used, the
reliable_size <bcp14>SHOULD</bcp14> include the stream header so the receiver can identify the
corresponding subscription and accurately account for reset data streams when
handling PUBLISH_DONE (see <xref target="message-publish-done"/>).  Publishers that reset
data streams without using RESET_STREAM_AT with an appropriate reliable_size can
cause subscribers to hold on to subscription state until a timeout expires.</t>
          <t>A sender might send all objects in a Subgroup and the FIN on a QUIC stream,
and then reset the stream. In this case, the receiving application would receive
the FIN if and only if all objects were received. If the application receives
all data on the stream and the FIN, it can ignore any RESET_STREAM it receives.</t>
          <t>If a sender will not deliver any objects from a Subgroup, it <bcp14>MAY</bcp14> send
a SUBGROUP_HEADER on a new stream, with no objects, and then send RESET_STREAM_AT
with a reliable_size equal to the length of the stream header. This explicitly
tells the receiver there is an unsent Subgroup.</t>
          <t>A relay <bcp14>MUST NOT</bcp14> forward an Object on an existing Subgroup stream unless it is
the next Object in that Subgroup.  A relay determines that an Object is the next
Object in the Subgroup if at least one of the following is true:</t>
          <ul spacing="normal">
            <li>
              <t>The Object ID is one greater than the previous Object sent on this Subgroup
stream.</t>
            </li>
            <li>
              <t>The Object was received on the same upstream Subgroup stream as the
previously sent Object on the downstream Subgroup stream, with no other
Objects in between.</t>
            </li>
            <li>
              <t>It determined all Object IDs between the current and previous Object IDs
on the Subgroup stream belong to different Subgroups or do not exist.</t>
            </li>
          </ul>
          <t>If the relay does not know if an Object is the next Object, it <bcp14>MUST</bcp14> reset the
Subgroup stream and open a new one to forward it.</t>
          <t>Since SUBSCRIBEs always end on a group boundary, an ending subscription can
always cleanly close all its subgroups. A sender that terminates a stream
early for any other reason (e.g., to handoff to a different sender) <bcp14>MUST</bcp14>
use RESET_STREAM or RESET_STREAM_AT. Senders <bcp14>SHOULD</bcp14> terminate a stream on
Group boundaries to avoid doing so.</t>
          <t>An MOQT implementation that processes a stream FIN is assured it has received
all objects in a subgroup from the start of the subscription. If a relay, it
can forward stream FINs to its own subscribers once those objects have been
sent. A relay <bcp14>MAY</bcp14> treat receipt of EndOfGroup or EndOfTrack objects as a signal
to close corresponding streams even if the FIN has not arrived, as further
objects on the stream would be a protocol violation.</t>
          <t>Similarly, an EndOfGroup message indicates the maximum Object ID in the
Group, so if all Objects in the Group have been received, a FIN can be sent on
any stream where the entire subgroup has been sent. This might be complex to
implement.</t>
          <t>Processing a RESET_STREAM or RESET_STREAM_AT means that there might be other
objects in the Subgroup beyond the last one received. A relay might immediately
reset the corresponding downstream stream, or it might attempt to recover the
missing Objects in an effort to send all the Objects in the subgroups and the FIN.
It also might send RESET_STREAM_AT with reliable_size set to the last Object it
has, so as to reliably deliver the Objects it has while signaling that other
Objects might exist.</t>
          <t>A subscriber <bcp14>MAY</bcp14> send a QUIC STOP_SENDING frame for a subgroup stream if the Group
or Subgroup is no longer of interest to it. The publisher <bcp14>SHOULD</bcp14> respond with
RESET_STREAM or RESET_STREAM_AT. If RESET_STREAM_AT is sent, note that the receiver
has indicated no interest in the objects, so setting a reliable_size beyond the
stream header is of questionable utility.</t>
          <t>RESET_STREAM and STOP_SENDING on SUBSCRIBE data streams have no impact on other
Subgroups in the Group or the subscription, although applications might cancel all
Subgroups in a Group at once.</t>
          <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in RESET_STREAM or
RESET_STREAM_AT, as defined below:</t>
          <dl>
            <dt>INTERNAL_ERROR (0x0):</dt>
            <dd>
              <t>An implementation specific error.</t>
            </dd>
            <dt>CANCELLED (0x1):</dt>
            <dd>
              <t>The subscriber requested cancellation via UNSUBSCRIBE, FETCH_CANCEL or
STOP_SENDING, or the publisher ended the subscription, in which case
PUBLISH_DONE (<xref target="message-publish-done"/>) will have a more detailed status
code.</t>
            </dd>
            <dt>DELIVERY_TIMEOUT (0x2):</dt>
            <dd>
              <t>The DELIVERY TIMEOUT <xref target="delivery-timeout"/> was exceeded for this stream.</t>
            </dd>
            <dt>SESSION_CLOSED (0x3):</dt>
            <dd>
              <t>The publisher session is being closed.</t>
            </dd>
          </dl>
        </section>
        <section anchor="fetch-header">
          <name>Fetch Header</name>
          <t>When a stream begins with <tt>FETCH_HEADER</tt>, all objects on the stream belong to the
track requested in the Fetch message identified by <tt>Request ID</tt>.</t>
          <figure anchor="fetch-header-format">
            <name>MOQT FETCH_HEADER</name>
            <artwork><![CDATA[
FETCH_HEADER {
  Type (i) = 0x5,
  Request ID (i),
}
]]></artwork>
          </figure>
          <t>Each Object sent on a FETCH stream after the FETCH_HEADER has the following
format:</t>
          <figure anchor="object-fetch-format">
            <name>MOQT Fetch Object Fields</name>
            <artwork><![CDATA[
{
  Serialization Flags (8),
  [Group ID (i),]
  [Subgroup ID (i),]
  [Object ID (i),]
  [Publisher Priority (8),]
  [Extensions (..),]
  Object Payload Length (i),
  [Object Status (i),]
  [Object Payload (..),]
}
]]></artwork>
          </figure>
          <t>The Serialization Flags field defines the serialization of the Object.</t>
          <t>The two least significant bits (LSBs) of the Serialization Flags form a two-bit
field that defines the encoding of the Subgroup.  To extract this value, the
Subscriber performs a bitwise AND operation with the mask 0x03.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Bitmask Result (Serialization Flags &amp; 0x03)</th>
                <th align="left">Meaning</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x00</td>
                <td align="left">Subgroup ID is zero</td>
              </tr>
              <tr>
                <td align="left">0x01</td>
                <td align="left">Subgroup ID is the prior Object's Subgroup ID</td>
              </tr>
              <tr>
                <td align="left">0x02</td>
                <td align="left">Subgroup ID is the prior Object's Subgroup ID plus one</td>
              </tr>
              <tr>
                <td align="left">0x03</td>
                <td align="left">The Subgroup ID field is present</td>
              </tr>
            </tbody>
          </table>
          <t>The following table defines additional flags within the Serialization Flags
field. Each flag is an independent boolean value, where a set bit (1) indicates
the corresponding condition is true.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Bitmask</th>
                <th align="left">Condition if set</th>
                <th align="left">Condition if not set (0)</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x04</td>
                <td align="left">Object ID field is present</td>
                <td align="left">Object ID is the prior Object's ID plus one</td>
              </tr>
              <tr>
                <td align="left">0x08</td>
                <td align="left">Group ID field is present</td>
                <td align="left">Group ID is the prior Object's Group ID</td>
              </tr>
              <tr>
                <td align="left">0x10</td>
                <td align="left">Priority field is present</td>
                <td align="left">Priority is the prior Object's Priority</td>
              </tr>
              <tr>
                <td align="left">0x20</td>
                <td align="left">Extensions field is present</td>
                <td align="left">Extensions field is not present</td>
              </tr>
              <tr>
                <td align="left">0x40</td>
                <td align="left">
                  <tt>PROTOCOL_VIOLATION</tt></td>
                <td align="left">N/A</td>
              </tr>
              <tr>
                <td align="left">0x80</td>
                <td align="left">
                  <tt>PROTOCOL_VIOLATION</tt></td>
                <td align="left">N/A</td>
              </tr>
            </tbody>
          </table>
          <t>If the first Object in the FETCH response uses a flag that references fields in
the prior Object, the Subscriber <bcp14>MUST</bcp14> close the session with a
<tt>PROTOCOL_VIOLATION</tt>.</t>
          <t>The Extensions structure is defined in <xref target="object-extensions"/>.</t>
          <t>The Object Status field is only present if the Object Payload Length is zero.</t>
          <t>When encoding an Object with a Forwarding Preference of "Datagram" (see
<xref target="object-properties"/>), the Publisher treats it as having a Subgroup ID equal to
the Object ID.</t>
        </section>
      </section>
      <section anchor="examples">
        <name>Examples</name>
        <t>Sending a subgroup on one stream:</t>
        <artwork><![CDATA[
Stream = 2

SUBGROUP_HEADER {
  Type = 0x14
  Track Alias = 2
  Group ID = 0
  Subgroup ID = 0
  Priority = 0
}
{
  Object ID = 0
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  Object Payload Length = 4
  Payload = "efgh"
}
]]></artwork>
        <t>Sending a group on one stream, with the first object containing two
Extension Headers.</t>
        <artwork><![CDATA[
Stream = 2

SUBGROUP_HEADER {
  Type = 0x35
  Track Alias = 2
  Group ID = 0
  Subgroup ID = 0
}
{
  Object ID Delta = 0 (Object ID is 0)
  Extension Headers Length = 33
    { Type = 4
      Value = 2186796243
    },
    { Type = 77
      Length = 21
      Value = "traceID:123456"
    }
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID Delta = 0 (Object ID is 1)
  Extension Headers Length = 0
  Object Payload Length = 4
  Payload = "efgh"
}

]]></artwork>
      </section>
    </section>
    <section anchor="extension-headers">
      <name>Extension Headers</name>
      <t>The following Object Extension Headers are defined in MOQT.</t>
      <section anchor="prior-group-id-gap">
        <name>Prior Group ID Gap</name>
        <t>Prior Group ID Gap (Extension Header Type 0x3C) is a variable length integer
containing the number of Groups prior to the current Group that do not and will
never exist. This is equivalent to receiving an <tt>End of Group</tt> status with
Object ID 0 for each skipped Group. For example, if the Original Publisher is
publishing an Object in Group 7 and knows it will never publish any Objects in
Group 8 or Group 9, it can include Prior Group ID Gap = 2 in any number of
Objects in Group 10, as it sees fit.  A Track is considered malformed (see
<xref target="malformed-tracks"/>) if any of the following conditions are detected:</t>
        <ul spacing="normal">
          <li>
            <t>An Object contains more than one instance of Prior Group ID Gap.</t>
          </li>
          <li>
            <t>A Group contains more than one Object with different values for Prior Group
 ID Gap.</t>
          </li>
          <li>
            <t>An Object has a Prior Group ID Gap larger than the Group ID.</t>
          </li>
          <li>
            <t>An endpoint receives an Object with a Prior Group ID Gap covering an Object
it previously received.</t>
          </li>
          <li>
            <t>An endpoint receives an Object with a Group ID within a previously
communicated gap.</t>
          </li>
        </ul>
        <t>This extension is optional, as publishers might not know the prior gap gize, or
there may not be a gap. If Prior Group ID Gap is not present, the receiver
cannot infer any information about the existence of prior groups (see
<xref target="group-ids"/>).</t>
        <t>This extension can be added by the Original Publisher, but <bcp14>MUST NOT</bcp14> be added by
relays. This extension <bcp14>MUST NOT</bcp14> be modified or removed.</t>
        <t>An Object <bcp14>MUST NOT</bcp14> contain more than one instance of this extension header.
## Immutable Extensions</t>
        <t>The Immutable Extensions (Extension Header Type 0xB) contains a sequence of
Key-Value-Pairs (see <xref target="moq-key-value-pair"/>) which are also Object Extension
Headers of the Object.</t>
        <artwork><![CDATA[
Immutable Extensions {
  Type (0xB),
  Length (i),
  Key-Value-Pair (..) ...
}
]]></artwork>
        <t>This extension can be added by the Original Publisher, but <bcp14>MUST NOT</bcp14> be added by
Relays. This extension <bcp14>MUST NOT</bcp14> be modified or removed. Relays <bcp14>MUST</bcp14> cache this
extension if the Object is cached and <bcp14>MUST</bcp14> forward this extension if the
enclosing Object is forwarded. Relays <bcp14>MAY</bcp14> decode and view these extensions.</t>
        <t>A Track is considered malformed (see <xref target="malformed-tracks"/>) if any of the
following conditions are detected:</t>
        <ul spacing="normal">
          <li>
            <t>An Object contains an Immutable Extensions header that contains another
Immutable Extensions key.</t>
          </li>
          <li>
            <t>A Key-Value-Pair cannot be parsed.</t>
          </li>
        </ul>
        <t>The following figure shows an example Object structure with a combination of
mutable and immutable extensions and end to end encrypted metadata in the Object
payload.</t>
        <artwork><![CDATA[
                   Object Header                      Object Payload
<------------------------------------------------> <------------------->
+--------+-------+------------+-------+-----------+--------------------+
| Object | Ext 1 | Immutable  | Ext N | [Payload] | Private Extensions |
| Fields |       | Extensions |       | [Length]  | App Payload        |
+--------+-------+------------+-------+-----------+--------------------+
                  xxxxxxxxxxxx                     xxxxxxxxxxxxxxxxxxxx
                                                   yyyyyyyyyyyyyyyyyyyy
x = e2e Authenticated Data
y = e2e Encrypted Data
EXT 1 and EXT N can be modified or removed by Relays
]]></artwork>
        <t>An Object <bcp14>MUST NOT</bcp14> contain more than one instance of this extension header.</t>
      </section>
      <section anchor="prior-object-id-gap">
        <name>Prior Object ID Gap</name>
        <t>Prior Object ID Gap (Extension Header Type 0x3E) is a variable length integer
containing the number of Objects prior to the current Object that do not and
will never exist. This is equivalent to receiving an <tt>Object Does Not Exist</tt>
status for each skipped Object ID. For example, if the Original Publisher is
publishing Object 10 in Group 3 and knows it will never publish Objects 8 or 9
in this Group, it can include Prior Object ID Gap = 2.  A Track is considered
malformed (see <xref target="malformed-tracks"/>) if any of the following conditions are
detected:</t>
        <ul spacing="normal">
          <li>
            <t>An Object contains more than one instance of Prior Object ID Gap.</t>
          </li>
          <li>
            <t>An Object has a Prior Object ID Gap larger than the Object ID.</t>
          </li>
          <li>
            <t>An endpoint receives an Object with a Prior Object ID Gap covering an Object
it previously received.</t>
          </li>
          <li>
            <t>An endpoint receives an Object with an Object ID within a previously
communicated gap.</t>
          </li>
        </ul>
        <t>This extension is optional, as publishers might not know the prior gap gize, or
there may not be a gap. If Prior Object ID Gap is not present, the receiver
cannot infer any information about the existence of prior objects (see
<xref target="model-object"/>).</t>
        <t>This extension can be added by the Original Publisher, but <bcp14>MUST NOT</bcp14> be added by
relays. This extension <bcp14>MUST NOT</bcp14> be modified or removed.</t>
        <t>An Object <bcp14>MUST NOT</bcp14> contain more than one instance of this extension header.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>TODO: Expand this section, including subscriptions.</t>
      <t>TODO: Describe Cache Poisoning attacks</t>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Live content requires significant bandwidth and resources.  Failure to
set limits will quickly cause resource exhaustion.</t>
        <t>MOQT uses stream limits and flow control to impose resource limits at
the network layer.  Endpoints <bcp14>SHOULD</bcp14> set flow control limits based on the
anticipated bitrate.</t>
        <t>Endpoints <bcp14>MAY</bcp14> impose a MAX STREAM count limit which would restrict the
number of concurrent streams which an application could have in
flight.</t>
        <t>The publisher prioritizes and transmits streams out of order.  Streams
might be starved indefinitely during congestion.  The publisher and
subscriber <bcp14>MUST</bcp14> cancel a stream, preferably the one with the lowest
priority, after reaching a resource limit.</t>
      </section>
      <section anchor="timeouts">
        <name>Timeouts</name>
        <t>Implementations are advised to use timeouts to prevent resource
exhaustion attacks by a peer that does not send expected data within
an expected time.  Each implementation is expected to set its own timeouts.</t>
      </section>
      <section anchor="relay-security-considerations">
        <name>Relay security considerations</name>
        <section anchor="state-maintenance">
          <name>State maintenance</name>
          <t>A Relay <bcp14>SHOULD</bcp14> have mechanisms to prevent malicious endpoints from flooding it
with PUBLISH_NAMESPACE or SUBSCRIBE_NAMESPACE requests that could bloat data
structures. It could use the advertised MAX_REQUEST_ID to limit the number of
such requests, or could have application-specific policies that can reject
incoming PUBLISH_NAMESPACE or SUBSCRIBE_NAMESPACE requests that cause the state
maintenance for the session to be excessive.</t>
        </section>
        <section anchor="subscribenamespace-with-short-prefixes">
          <name>SUBSCRIBE_NAMESPACE with short prefixes</name>
          <t>A Relay can use authorization rules in order to prevent subscriptions closer
to the root of a large prefix tree. Otherwise, if an entity sends a relay a
SUBSCRIBE_NAMESPACE message with a short prefix, it can cause the relay to send
a large volume of PUBLISH_NAMESPACE messages. As churn continues in the tree of
prefixes, the relay would have to continue to send
PUBLISH_NAMESPACE/PUBLISH_NAMESPACE_DONE messages to the entity that had sent
the SUBSCRIBE_NAMESPACE.</t>
          <t>TODO: Security/Privacy Considerations of MOQT_IMPLEMENTATION parameter</t>
        </section>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>TODO: fill out currently missing registries:</t>
      <ul spacing="normal">
        <li>
          <t>MOQT ALPN values</t>
        </li>
        <li>
          <t>Setup parameters</t>
        </li>
        <li>
          <t>Non-setup Parameters - List which params can be repeated in the table.</t>
        </li>
        <li>
          <t>Message types</t>
        </li>
        <li>
          <t>MOQ Extension headers - we wish to reserve extension types 0-63 for
standards utilization where space is a premium, 64 - 16383 for
standards utilization where space is less of a concern, and 16384 and
above for first-come-first-served non-standardization usage.
List which headers can be repeated in the table.</t>
        </li>
        <li>
          <t>MOQT Auth Token Type</t>
        </li>
      </ul>
      <t>TODO: register the URI scheme and the ALPN and grease the Extension types</t>
      <section anchor="authorization-token-alias-type">
        <name>Authorization Token Alias Type</name>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Name</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">DELETE</td>
              <td align="left">
                <xref target="authorization-token"/></td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">REGISTER</td>
              <td align="left">
                <xref target="authorization-token"/></td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">USE_ALIAS</td>
              <td align="left">
                <xref target="authorization-token"/></td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">USE_VALUE</td>
              <td align="left">
                <xref target="authorization-token"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="version-specific-parameters">
        <name>Version Specific Parameters</name>
        <table>
          <thead>
            <tr>
              <th align="left">Parameter Type</th>
              <th align="left">Parameter Name</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x02</td>
              <td align="left">DELIVERY_TIMEOUT</td>
              <td align="left">
                <xref target="delivery-timeout"/></td>
            </tr>
            <tr>
              <td align="left">0x03</td>
              <td align="left">AUTHORIZATION_TOKEN</td>
              <td align="left">
                <xref target="authorization-token"/></td>
            </tr>
            <tr>
              <td align="left">0x04</td>
              <td align="left">MAX_CACHE_DURATION</td>
              <td align="left">
                <xref target="max-cache-duration"/></td>
            </tr>
            <tr>
              <td align="left">0x08</td>
              <td align="left">EXPIRES</td>
              <td align="left">
                <xref target="expires"/></td>
            </tr>
            <tr>
              <td align="left">0x09</td>
              <td align="left">LARGEST_OBJECT</td>
              <td align="left">
                <xref target="largest-param"/></td>
            </tr>
            <tr>
              <td align="left">0x0E</td>
              <td align="left">PUBLISHER_PRIORITY</td>
              <td align="left">
                <xref target="publisher-priority"/></td>
            </tr>
            <tr>
              <td align="left">0x10</td>
              <td align="left">FORWARD</td>
              <td align="left">
                <xref target="forward-parameter"/></td>
            </tr>
            <tr>
              <td align="left">0x20</td>
              <td align="left">SUBSCRIBER_PRIORITY</td>
              <td align="left">
                <xref target="subscriber-priority"/></td>
            </tr>
            <tr>
              <td align="left">0x21</td>
              <td align="left">SUBSCRIPTION_FILTER</td>
              <td align="left">
                <xref target="subscription-filter"/></td>
            </tr>
            <tr>
              <td align="left">0x22</td>
              <td align="left">GROUP_ORDER</td>
              <td align="left">
                <xref target="group-order"/></td>
            </tr>
            <tr>
              <td align="left">0x30</td>
              <td align="left">DYNAMIC_GROUPS</td>
              <td align="left">
                <xref target="dynamic-groups"/></td>
            </tr>
            <tr>
              <td align="left">0x32</td>
              <td align="left">NEW_GROUP_REQUEST</td>
              <td align="left">
                <xref target="new-group-request"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-error-codes">
        <name>Error Codes</name>
        <section anchor="iana-session-termination">
          <name>Session Termination Error Codes</name>
          <table>
            <thead>
              <tr>
                <th align="left">Name</th>
                <th align="center">Code</th>
                <th align="left">Specification</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">NO_ERROR</td>
                <td align="center">0x0</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">INTERNAL_ERROR</td>
                <td align="center">0x1</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">UNAUTHORIZED</td>
                <td align="center">0x2</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">PROTOCOL_VIOLATION</td>
                <td align="center">0x3</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">INVALID_REQUEST_ID</td>
                <td align="center">0x4</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">DUPLICATE_TRACK_ALIAS</td>
                <td align="center">0x5</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">KEY_VALUE_FORMATTING_ERROR</td>
                <td align="center">0x6</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">TOO_MANY_REQUESTS</td>
                <td align="center">0x7</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">INVALID_PATH</td>
                <td align="center">0x8</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">MALFORMED_PATH</td>
                <td align="center">0x9</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">GOAWAY_TIMEOUT</td>
                <td align="center">0x10</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">CONTROL_MESSAGE_TIMEOUT</td>
                <td align="center">0x11</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">DATA_STREAM_TIMEOUT</td>
                <td align="center">0x12</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">AUTH_TOKEN_CACHE_OVERFLOW</td>
                <td align="center">0x13</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">DUPLICATE_AUTH_TOKEN_ALIAS</td>
                <td align="center">0x14</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">VERSION_NEGOTIATION_FAILED</td>
                <td align="center">0x15</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">MALFORMED_AUTH_TOKEN</td>
                <td align="center">0x16</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">UNKNOWN_AUTH_TOKEN_ALIAS</td>
                <td align="center">0x17</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">EXPIRED_AUTH_TOKEN</td>
                <td align="center">0x18</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">INVALID_AUTHORITY</td>
                <td align="center">0x19</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
              <tr>
                <td align="left">MALFORMED_AUTHORITY</td>
                <td align="center">0x1A</td>
                <td align="left">
                  <xref target="session-termination"/></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="iana-request-error">
          <name>REQUEST_ERROR Codes</name>
          <table>
            <thead>
              <tr>
                <th align="left">Name</th>
                <th align="center">Code</th>
                <th align="left">Specification</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">INTERNAL_ERROR</td>
                <td align="center">0x0</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">UNAUTHORIZED</td>
                <td align="center">0x1</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">TIMEOUT</td>
                <td align="center">0x2</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">NOT_SUPPORTED</td>
                <td align="center">0x3</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">MALFORMED_AUTH_TOKEN</td>
                <td align="center">0x4</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">EXPIRED_AUTH_TOKEN</td>
                <td align="center">0x5</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">DOES_NOT_EXIST</td>
                <td align="center">0x10</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">INVALID_RANGE</td>
                <td align="center">0x11</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">MALFORMED_TRACK</td>
                <td align="center">0x12</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">UNINTERESTED</td>
                <td align="center">0x20</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">PREFIX_OVERLAP</td>
                <td align="center">0x30</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">INVALID_JOINING_REQUEST_ID</td>
                <td align="center">0x32</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
              <tr>
                <td align="left">UNKNOWN_STATUS_IN_RANGE</td>
                <td align="center">0x33</td>
                <td align="left">
                  <xref target="message-request-error"/></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="iana-publish-done">
          <name>PUBLISH_DONE Codes</name>
          <table>
            <thead>
              <tr>
                <th align="left">Name</th>
                <th align="center">Code</th>
                <th align="left">Specification</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">INTERNAL_ERROR</td>
                <td align="center">0x0</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">UNAUTHORIZED</td>
                <td align="center">0x1</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">TRACK_ENDED</td>
                <td align="center">0x2</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">SUBSCRIPTION_ENDED</td>
                <td align="center">0x3</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">GOING_AWAY</td>
                <td align="center">0x4</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">EXPIRED</td>
                <td align="center">0x5</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">TOO_FAR_BEHIND</td>
                <td align="center">0x6</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">MALFORMED_TRACK</td>
                <td align="center">0x7</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
              <tr>
                <td align="left">UPDATE_FAILED</td>
                <td align="center">0x8</td>
                <td align="left">
                  <xref target="message-publish-done"/></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="iana-reset-stream">
          <name>Data Stream Reset Error Codes</name>
          <table>
            <thead>
              <tr>
                <th align="left">Name</th>
                <th align="center">Code</th>
                <th align="left">Specification</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">INTERNAL_ERROR</td>
                <td align="center">0x0</td>
                <td align="left">
                  <xref target="closing-subgroup-streams"/></td>
              </tr>
              <tr>
                <td align="left">CANCELLED</td>
                <td align="center">0x1</td>
                <td align="left">
                  <xref target="closing-subgroup-streams"/></td>
              </tr>
              <tr>
                <td align="left">DELIVERY_TIMEOUT</td>
                <td align="center">0x2</td>
                <td align="left">
                  <xref target="closing-subgroup-streams"/></td>
              </tr>
              <tr>
                <td align="left">SESSION_CLOSED</td>
                <td align="center">0x3</td>
                <td align="left">
                  <xref target="closing-subgroup-streams"/></td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <t>The original design behind this protocol was inspired by three independent
proposals: WARP <xref target="I-D.draft-lcurley-warp"/> by Luke Curley, RUSH
<xref target="I-D.draft-kpugin-rush"/> by Kirill Pugin, Nitin Garg, Alan Frindell, Jordi
Cenzano and Jake Weissman, and QUICR <xref target="I-D.draft-jennings-moq-quicr-proto"/> by
Cullen Jennings, Suhas Nandakumar and Christian Huitema.  The authors of those
documents merged their proposals to create the first draft of moq-transport.
The IETF MoQ Working Group received an enormous amount of support from many
people. The following people provided substantive contributions to this
document:</t>
      <ul spacing="normal">
        <li>
          <t>Ali Begen</t>
        </li>
        <li>
          <t>Charles Krasic</t>
        </li>
        <li>
          <t>Christian Huitema</t>
        </li>
        <li>
          <t>Cullen Jennings</t>
        </li>
        <li>
          <t>James Hurley</t>
        </li>
        <li>
          <t>Jordi Cenzano</t>
        </li>
        <li>
          <t>Kirill Pugin</t>
        </li>
        <li>
          <t>Luke Curley</t>
        </li>
        <li>
          <t>Martin Duke</t>
        </li>
        <li>
          <t>Mike English</t>
        </li>
        <li>
          <t>Mo Zanaty</t>
        </li>
        <li>
          <t>Will Law</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="WebTransport">
          <front>
            <title>WebTransport over HTTP/3</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Facebook</organization>
            </author>
            <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="7" month="July" year="2025"/>
            <abstract>
              <t>   WebTransport [OVERVIEW] is a protocol framework that enables
   application clients constrained by the Web security model to
   communicate with a remote application server using a secure
   multiplexed transport.  This document describes a WebTransport
   protocol that is based on HTTP/3 [HTTP3] and provides support for
   unidirectional streams, bidirectional streams, and datagrams, all
   multiplexed within the same HTTP/3 connection.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-13"/>
        </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>
        <reference anchor="RFC9221">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
        <reference anchor="I-D.draft-ietf-quic-reliable-stream-reset">
          <front>
            <title>QUIC Stream Resets with Partial Delivery</title>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <date day="14" month="June" year="2025"/>
            <abstract>
              <t>   QUIC defines a RESET_STREAM frame to abort sending on a stream.  When
   a sender resets a stream, it also stops retransmitting STREAM frames
   for this stream in the event of packet loss.  On the receiving side,
   there is no guarantee that any data sent on that stream is delivered.

   This document defines a new QUIC frame, the RESET_STREAM_AT frame,
   that allows resetting a stream, while guaranteeing delivery of stream
   data up to a certain byte offset.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-reliable-stream-reset-07"/>
        </reference>
        <reference anchor="RFC7301">
          <front>
            <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
            <author fullname="S. Friedl" initials="S." surname="Friedl"/>
            <author fullname="A. Popov" initials="A." surname="Popov"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Stephan" initials="E." surname="Stephan"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7301"/>
          <seriesInfo name="DOI" value="10.17487/RFC7301"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="I-D.ietf-webtrans-overview">
          <front>
            <title>The WebTransport Protocol Framework</title>
            <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="7" month="July" year="2025"/>
            <abstract>
              <t>   The WebTransport Protocol Framework enables clients constrained by
   the Web security model to communicate with a remote server using a
   secure multiplexed transport.  It consists of a set of individual
   protocols that are safe to expose to untrusted applications, combined
   with an abstract model that allows them to be used interchangeably.

   This document defines the overall requirements on the protocols used
   in WebTransport, as well as the common features of the protocols,
   support for some of which may be optional.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-overview-10"/>
        </reference>
        <reference anchor="RFC9438">
          <front>
            <title>CUBIC for Fast and Long-Distance Networks</title>
            <author fullname="L. Xu" initials="L." surname="Xu"/>
            <author fullname="S. Ha" initials="S." surname="Ha"/>
            <author fullname="I. Rhee" initials="I." surname="Rhee"/>
            <author fullname="V. Goel" initials="V." surname="Goel"/>
            <author fullname="L. Eggert" initials="L." role="editor" surname="Eggert"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>CUBIC is a standard TCP congestion control algorithm that uses a cubic function instead of a linear congestion window increase function to improve scalability and stability over fast and long-distance networks. CUBIC has been adopted as the default TCP congestion control algorithm by the Linux, Windows, and Apple stacks.</t>
              <t>This document updates the specification of CUBIC to include algorithmic improvements based on these implementations and recent academic work. Based on the extensive deployment experience with CUBIC, this document also moves the specification to the Standards Track and obsoletes RFC 8312. This document also updates RFC 5681, to allow for CUBIC's occasionally more aggressive sending behavior.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9438"/>
          <seriesInfo name="DOI" value="10.17487/RFC9438"/>
        </reference>
        <reference anchor="RFC6582">
          <front>
            <title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
            <author fullname="T. Henderson" initials="T." surname="Henderson"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="A. Gurtov" initials="A." surname="Gurtov"/>
            <author fullname="Y. Nishida" initials="Y." surname="Nishida"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>RFC 5681 documents the following four intertwined TCP congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. RFC 5681 explicitly allows certain modifications of these algorithms, including modifications that use the TCP Selective Acknowledgment (SACK) option (RFC 2883), and modifications that respond to "partial acknowledgments" (ACKs that cover new data, but not all the data outstanding when loss was detected) in the absence of SACK. This document describes a specific algorithm for responding to partial acknowledgments, referred to as "NewReno". This response to partial acknowledgments was first proposed by Janey Hoe. This document obsoletes RFC 3782. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6582"/>
          <seriesInfo name="DOI" value="10.17487/RFC6582"/>
        </reference>
        <reference anchor="I-D.draft-lcurley-warp">
          <front>
            <title>Warp - Live Media Transport over QUIC</title>
            <author fullname="Luke Curley" initials="L." surname="Curley">
              <organization>Twitch</organization>
            </author>
            <author fullname="Kirill Pugin" initials="K." surname="Pugin">
              <organization>Meta</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="13" month="March" year="2023"/>
            <abstract>
              <t>   This document defines the core behavior for Warp, a live media
   transport protocol over QUIC.  Media is split into objects based on
   the underlying media encoding and transmitted independently over QUIC
   streams.  QUIC streams are prioritized based on the delivery order,
   allowing less important objects to be starved or dropped during
   congestion.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-lcurley-warp-04"/>
        </reference>
        <reference anchor="I-D.draft-kpugin-rush">
          <front>
            <title>RUSH - Reliable (unreliable) streaming protocol</title>
            <author fullname="Kirill Pugin" initials="K." surname="Pugin">
              <organization>Meta</organization>
            </author>
            <author fullname="Nitin Garg" initials="N." surname="Garg">
              <organization>Meta</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <author fullname="Jorge Cenzano Ferret" initials="J. C." surname="Ferret">
              <organization>Meta</organization>
            </author>
            <author fullname="Jake Weissman" initials="J." surname="Weissman">
              <organization>Meta</organization>
            </author>
            <date day="21" month="April" year="2025"/>
            <abstract>
              <t>   RUSH is an application-level protocol for ingesting live video.  This
   document describes the protocol and how it maps onto QUIC.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the mailing list (), which
   is archived at .

   Source for this draft and an issue tracker can be found at
   https://github.com/afrind/draft-rush.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-kpugin-rush-03"/>
        </reference>
        <reference anchor="I-D.draft-jennings-moq-quicr-proto">
          <front>
            <title>QuicR - Media Delivery Protocol over QUIC</title>
            <author fullname="Cullen Fluffy Jennings" initials="C. F." surname="Jennings">
              <organization>cisco</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Christian Huitema" initials="C." surname="Huitema">
              <organization>Private Octopus Inc.</organization>
            </author>
            <date day="11" month="July" year="2022"/>
            <abstract>
              <t>   Recently new use cases have emerged requiring higher scalability of
   media delivery for interactive realtime applications and much lower
   latency for streaming applications and a combination thereof.

   draft-jennings-moq-arch specifies architectural aspects of QuicR, a
   media delivery protocol based on publish/subscribe metaphor and Relay
   based delivery tree, that enables a wide range of realtime
   applications with different resiliency and latency needs.

   This specification defines the protocol aspects of the QuicR media
   delivery architecture.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jennings-moq-quicr-proto-01"/>
        </reference>
      </references>
    </references>
    <?line 3979?>

<section anchor="change-log">
      <name>Change Log</name>
      <t>RFC Editor's Note: Please remove this section prior to publication of a final version of this document.</t>
      <t>Issue and pull request numbers are listed with a leading octothorp.</t>
      <section anchor="since-draft-ietf-moq-transport-14">
        <name>Since draft-ietf-moq-transport-14</name>
        <t><strong>Setup and Control Plane</strong></t>
        <ul spacing="normal">
          <li>
            <t>Always use ALPN for version negotiation (#499)</t>
          </li>
          <li>
            <t>Consolidate all the Error Message types (#1159)</t>
          </li>
          <li>
            <t>Change MOQT IMPLEMENTATION code point to 0x7 (#1191)</t>
          </li>
          <li>
            <t>Add Forward to SUBSCRIBE_NAMESPACE (#1220)</t>
          </li>
          <li>
            <t>Parameters for Group Order, Subscribe Priority and Subscription Filter (redo) (#1273)</t>
          </li>
          <li>
            <t>REQUEST_OK message (#1274)</t>
          </li>
          <li>
            <t>Subscribe Update Acknowledgements (#1275)</t>
          </li>
          <li>
            <t>Disallow DELETE and USE_ALIAS in CLIENT_SETUP (#1277)</t>
          </li>
          <li>
            <t>Remove Expires field from SUBSCRIBE_OK (#1282)</t>
          </li>
          <li>
            <t>Make Forward a Parameter (#1283)</t>
          </li>
          <li>
            <t>Allow SUBSCRIBE_UPDATE to increase the end location (#1288)</t>
          </li>
          <li>
            <t>Add default port for raw QUIC (#1289)</t>
          </li>
          <li>
            <t>Unsubscribe Namespace should be linked to Subscribe Namespace (#1292)</t>
          </li>
        </ul>
        <t><strong>Data Plane Wire Format and Handling</strong></t>
        <ul spacing="normal">
          <li>
            <t>Fetch Object serialization optimization (#949)</t>
          </li>
          <li>
            <t>Make default PUBLISHER PRIORITY a parameter, optional in Subgroup/Datagram (#1056)</t>
          </li>
          <li>
            <t>Allow datagram status with object ID=0 (#1197)</t>
          </li>
          <li>
            <t>Disallow object extension headers in all non-Normal status objects (#1266)</t>
          </li>
          <li>
            <t>Objects for malformed track must not be cached (#1290)</t>
          </li>
          <li>
            <t>Remove NO_OBJECTS fetch error code (#1303)</t>
          </li>
          <li>
            <t>Clarify what happens when max_cache_duration parameter is omitted (#1287)</t>
          </li>
        </ul>
        <t><strong>Notable Editorial Changes</strong></t>
        <ul spacing="normal">
          <li>
            <t>Rename Request ID field in MAX_REQUEST_ID (#1250)</t>
          </li>
          <li>
            <t>Define and draw subscription state machine (#1296)</t>
          </li>
          <li>
            <t>Omitting a subgroup object necessitates reset (#1295)</t>
          </li>
          <li>
            <t>Define duplication rules for header extensions (#1293)</t>
          </li>
          <li>
            <t>Clarify joining fetch end location (#1286)</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-moq-transport-13">
        <name>Since draft-ietf-moq-transport-13</name>
        <t><strong>Setup and Control Plane</strong></t>
        <ul spacing="normal">
          <li>
            <t>Add an AUTHORITY parameter (#1058)</t>
          </li>
          <li>
            <t>Add a free-form SETUP parameter identifying the implementation (#1114)</t>
          </li>
          <li>
            <t>Add a Request ID to SUBSCRIBE_UDPATE (#1106)</t>
          </li>
          <li>
            <t>Indicate which params can appear PUBLISH* messages (#1071)</t>
          </li>
          <li>
            <t>Add TRACK_STATUS to the list of request types affected by GOAWAY (#1105)</t>
          </li>
        </ul>
        <t><strong>Data Plane Wire Format and Handling</strong></t>
        <ul spacing="normal">
          <li>
            <t>Delta encode Object IDs within Subgroups (#1042)</t>
          </li>
          <li>
            <t>Use a bit in Datagram Type to convey Object ID = 0 (#1055)</t>
          </li>
          <li>
            <t>Corrected missed code point updates to Object Datagram Status (#1082)</t>
          </li>
          <li>
            <t>Merge OBJECT_DATAGRAM and OBJECT_DATAGRAM_STATUS description (#1179)</t>
          </li>
          <li>
            <t>Objects are not schedulable if flow-control blocked (#1054)</t>
          </li>
          <li>
            <t>Clarify DELIVERY_TIMEOUT reordering computation (#1120)</t>
          </li>
          <li>
            <t>Receiving unrequested Objects (#1112)</t>
          </li>
          <li>
            <t>Clarify End of Track (#1111)</t>
          </li>
          <li>
            <t>Malformed tracks apply to FETCH (#1083)</t>
          </li>
          <li>
            <t>Remove early FIN from the definition of malformed tracks (#1096)</t>
          </li>
          <li>
            <t>Prior Object ID Gap Extension header (#939)</t>
          </li>
          <li>
            <t>Add Extension containing immutable extensions (#1025)</t>
          </li>
        </ul>
        <t><strong>Relay Handling</strong></t>
        <ul spacing="normal">
          <li>
            <t>Explain FETCH routing for relays (#1165)</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> for multi-publisher relay handling (#1115)</t>
          </li>
          <li>
            <t>Filters don't (usually) determine the end of subscription (#1113)</t>
          </li>
          <li>
            <t>Allow self-subscriptions (#1110)</t>
          </li>
          <li>
            <t>Explain Namespace Prefix Matching in more detail (#1116)</t>
          </li>
        </ul>
        <t><strong>Explanatory</strong></t>
        <ul spacing="normal">
          <li>
            <t>Explain Modularity of MOQT (#1107)</t>
          </li>
          <li>
            <t>Explain how to resume publishing after losing state (#1087)</t>
          </li>
        </ul>
        <t><strong>Major Editorial Changes</strong></t>
        <ul spacing="normal">
          <li>
            <t>Rename ANNOUNCE to PUBLISH_NAMESPACE (#1104)</t>
          </li>
          <li>
            <t>Rename SUBSCRIBE_DONE to PUBLISH_DONE (#1108)</t>
          </li>
          <li>
            <t>Major FETCH Reorganization (#1173)</t>
          </li>
          <li>
            <t>Reformat Error Codes (#1091)</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-moq-transport-12">
        <name>Since draft-ietf-moq-transport-12</name>
        <ul spacing="normal">
          <li>
            <t>TRACK_STATUS_REQUEST and TRACK_STATUS have changed to directly mirror
SUBSCRIBE/OK/ERROR (#1015)</t>
          </li>
          <li>
            <t>SUBSCRIBE_ANNOUNCES was renamed back to SUBSCRIBE_NAMESPACE (#1049)</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-moq-transport-11">
        <name>Since draft-ietf-moq-transport-11</name>
        <ul spacing="normal">
          <li>
            <t>Move Track Alias from SUBSCRIBE to SUBSCRIBE_OK (#977)</t>
          </li>
          <li>
            <t>Expand cases FETCH_OK returns Invalid Range (#946) and clarify fields (#936)</t>
          </li>
          <li>
            <t>Add an error code to FETCH_ERROR when an Object status is unknown (#825)</t>
          </li>
          <li>
            <t>Rename Latest Object to Largest Object (#1024) and clarify what to
do when it's incomplete (#937)</t>
          </li>
          <li>
            <t>Explain Malformed Tracks and what to do with them (#938)</t>
          </li>
          <li>
            <t>Allow End of Group to be indicated in a normal Object (#1011)</t>
          </li>
          <li>
            <t>Relays <bcp14>MUST</bcp14> have an upstream subscription to send SUBSCRIBE_OK (#1017)</t>
          </li>
          <li>
            <t>Allow AUTHORIZATION TOKEN in CLIENT_SETUP, SERVER_SETUP and
other fixes (#1013)</t>
          </li>
          <li>
            <t>Add PUBLISH for publisher initiated subscriptions (#995) and
fix the PUBLISH codepoints (#1048, #1051)</t>
          </li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-moq-transport-10">
        <name>Since draft-ietf-moq-transport-10</name>
        <ul spacing="normal">
          <li>
            <t>Added Common Structure definitions - Location, Key-Value-Pair and Reason
Phrase</t>
          </li>
          <li>
            <t>Limit lengths of all variable length fields, including Track Namespace and Name</t>
          </li>
          <li>
            <t>Control Message length is now 16 bits instead of variable length</t>
          </li>
          <li>
            <t>Subscribe ID became Request ID, and was added to most control messages. Request ID
is used to correlate OK/ERROR responses for ANNOUNCE, SUBSCRIBE_NAMESPACE,
and TRACK_STATUS.  Like Subscribe ID, Request IDs are flow controlled.</t>
          </li>
          <li>
            <t>Explain rules for caching in more detail</t>
          </li>
          <li>
            <t>Changed the SETUP parameter format for even number parameters to match the
Object Header Extension format</t>
          </li>
          <li>
            <t>Rotated SETUP code points</t>
          </li>
          <li>
            <t>Added Parameters to TRACK_STATUS and TRACK_STATUS_REQUEST</t>
          </li>
          <li>
            <t>Clarified how subscribe filters work</t>
          </li>
          <li>
            <t>Added Next Group Filter to SUBSCRIBE</t>
          </li>
          <li>
            <t>Added Forward flag to SUBSCRIBE</t>
          </li>
          <li>
            <t>Renamed FETCH_OK field to End and clarified how to set it</t>
          </li>
          <li>
            <t>Added Absolute Joining Fetch</t>
          </li>
          <li>
            <t>Clarified No Error vs Invalid Range FETCH_ERROR cases</t>
          </li>
          <li>
            <t>Use bits in SUBGROUP_HEADER and DATAGRAM* types to compress subgroup ID and
extensions</t>
          </li>
          <li>
            <t>Coalesced END_OF_GROUP and END_OF_TRACK_AND_GROUP status</t>
          </li>
          <li>
            <t>Objects that Do Not Exist cannot have extensions when sent on the wire</t>
          </li>
          <li>
            <t>Specified error codes for resetting data streams</t>
          </li>
          <li>
            <t>Defined an Object Header Extension for communicating a known Group ID gap</t>
          </li>
          <li>
            <t>Replaced AUTHORIZATION_INFO with AUTHORIZATION_TOKEN, which has more structure,
compression, and additional Auth related error codes (#760)</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8y963bc1pUu+n89BbY8xraUriqL8iW2Ene6RFIy2xKpkCW7
vdPZIlgFkoiKhQqAIsWW1c9ynuU82Zn3NReAouTE7nE8RndEFLCuc801r98c
j8ehLdtl8Ti796JYlHlWXRd19udXB7vZrM5Xzbqq23shPzuri+vH2VX193Gr
j8Oimq/yK/h0Uefn7bgs2vNx8sZ458uwyFt4493edLb/Pszhj4uqvn2cNe0i
hHJdP87aetO0jx4+/Obho5DXRf44y+79WJxl+WqRHazaol4VrR9Lszm7Kpum
rFaz2zU0fbA/expuqvrNRV1t1jaPI53HvfCmuIXfF49DNs6u4iT/vinn4bpY
bQr4Jdv6dZa11M+9H6GPcnWRPcM38flVXi7hOUz533Duk6q+wMd5Pb+Ex5dt
u24ef/YZvoWPyutioq99hg8+O6urm6b4DL7/DL+7KNvLzRk3OL65+CxZSnxh
CavXtL5penHCH07KKv3ks23bMrlsr5b3QmhaWOPX+bJawfRuiyY0V3ndvv77
poJ+HmerKqzLx9lf2mo+yhr4ri7OG/jX7RX/A7b/Kl+vYUn+GkK+aS+rGhdy
DP+XZeUKWjiZZIfQRf5mAw3TY6aXk81l3nR/gmXJV+V/5S3s7ONst2zmFT0v
eJmbFb/+b3P8ZTKvrkLa2Q+T7Ie8KZdlce26+qGct1Wd/pL29KyqLpaF7+oa
X76+/rcL+mWgq4NJdnJTtK3r5yBfuWcf6qGEncCXfRf4c13hSQQKhDF3+pxO
sqd1uVoUy6XrdrqEfpPnadcvijb3Hefn+O6/XcHjLZ2uqvoKPr6mQ4En4HF2
/HT3m4cPH8LfcC7tJMKcx3tE0eOb4oyIa4yE+Tmc69V5bCWMx+MsP2vgjXkb
wuyybJB0NlfFqs0WxXm5KpqsvSyyeVUX2VlxmV+XsGPQQraVI4X7L47+PHsw
ynI50Ebb2bqugGCrJTTdlBerYpG1VVatixoOj2sKiCn42Yyym8tyfplB70XW
lFd4ZrPzzWqO65gvy/Z2kmGfWb5cwqmFjqGjxWYO7VXnQQZRZevN2bJsLjPg
ejlxMGqvbGFyqwamvMiu4UVgYc28LtfYdnZ2m+XharNsy/WynENH0GBWrBbr
qly1zSQ7aOH9NY6xAUoAfkidtbhe8BeuYQlrW55tsLUAzBJ5YUOd40rrKuB6
XpYXl1kzz5cF/QwTIZ6ymt8mjUx4z67KxQLINoRPkA/TbKmL0GGRcVsy3hbs
N48b0V7mLT6qYL5X5X8Vi4BjwR2nr+29d+/w7/fvR1kBDA0aX5R1MW+XsCA1
LZvfr/Dunf8Tv9JWYSpNcVWu6AjgYtKCyfbBBJcwBhhgkL36THbjrMhw5c5x
VcqVkINucmPtpFtcrkJdwAhWTYHbn2xsXfx9A/y6yc7r6gopdfse49CC7fJN
uSgymNlFga9tmmI8z5sCn7fQbXl+XtS479Ax8jTcPdpN3slwfwnHbsSkAicO
/niQrYpiwd9XG6TFK5gXXKJ4m+GKIUnkZyVSOTU1r5o2FNAPfQ7nE5araao5
kt2Ch2HEV2B39W2mhAfEQwtNNHABH9flfPhQ4uu40tAUrHDL7coiFeFF9efs
BK6c/ApH+ZT4CazU7LKApR78UZhJdgkbqMMrmwCLUi2KxShb5/M3+QX+C+eI
VxePg4Zbnf0NZgu3Gl6HFzyWdYWbBQsPlBUWeO3QTPFrv9Ew498B8V5BL8v3
73GKRE3M1IhK6CdgwetldQt9wonHPuU72FkUZuBLah+Xeo1Dwb1v4I7AGW7W
0CsPVF6Xj9c18MqyhUHG76+K+SVcAc0VDTzTV/4LG/LjbqSNuljmtw2KCLEN
Y8NwdHEa9A5QbEt96YxhKLCg8StdebhRMvkRpgNcXfYgg1OBrd3AwZY2cH3G
DW1lkzbEK/fhVsInnwA9AKHmzJ1muOrFdbGs1nTFwDIqQS5qJGdc/4sqXyI7
BRpdba7OiItjHyCWjAOuf3lewqEA3iPHasTLUJ2BsJqdF3m7gQHB9uB3eqHw
Kuk5nuDIPsmey7EM8g8cx6qY47yAloD84NpDNkd7dZ3XZX4G7FlOE3QKwubF
5XrTwkWwKHhEMIkQCTxeLbJXDUgG2VnZ0o1X0ivCxhaTbH+1GLfVuIgMA87h
ZrkIwP7Oy7fYygpXGPoBWsEzgWOklUf6wR/prhURHM8/EM8ke4VXfrsBplss
b0fxGqL7z6YVpzNCugTRr4SOFpuCFwI4XkMnKpu2LRwXov22CsJk7FQrIcCE
c7rU4DedMNw2TB66hHP4e54DFw3Ajjc0CTri+M46h2NO7Nlucx4ILmhN3CYD
auCu+EaIF1vAlhdFi2vEu48XwSKdCr1QX5mQg/QNu6iLD13svhyfAXtfBG2X
iR1kEGCDGdzI/CdeS9Cy9Oc6YHaElwLNJFwW+WJcnY+XyAvPltUclZZJ9tJa
5ysQF+LV3st4yeJs8uuqXGSyTiPsPOCggVUCJ+T7tKR5rGS2TYnbqjcvXizL
4q3cb+d1foEnkL4bBTdk4REjaMQTU4MP5gVt9Tks+hkwbHyU431+BmRFUtsV
iImT7Agmh4fYH29Ynhz0LDj7NBpgwXQ8zyrY5JbuDSCI5QKE6WWB23BB7wU5
zY0dZdxA6BWIKddtuIWTfo5Tw+l6uSmVcmANQ52vywVS9QcoQ/kDDwW3Aztn
/rXOkUjgzlgxo9GRCaOkvYKer1FQKPEyvy5wpYmj4dTP83kR4KNl1cDZnA6t
FN/EOEO7R+NcKlsh2v/kxJ/BnX5eQl/5Oez7gu8zG3AyTOCmN6iXFG+Les7i
RsVXD5GMW1CQMGDr6X6VddmtVvAXCBAwk3BSAUtDHiAyGOnTuLy0b221gMuJ
JfcCRwI7Fw8T9lTSohP5eEGXZcbibU57fDx78ZK267vZ7GVGZzL77vkJSp97
05PvUOcrW+jXrVQTmJWXLarmTjyvUWgtYVcbYRt1MRb5g2iOpyH8bJL9eFku
idOAiLUU5Y02WdSHxlad7iGgCLoPz89RPsHb5SLHrmDfgI1f5gukg1XV4ufM
Qn3/1usQXQS5Oon0V6CbRqrgieCooJNNIzpFQhvESul0qz6ClOZVC+gUb0mU
I6lzZieZSp8kQ9P1CdsC3+Ho/eUTeBIkyswvQamFBaHzjUNBfnGT14uGGBEs
ohNpmQpge0gV5B8CSXnYPRBHTlJ9sbBLZl0zLeG8gDSb2wauJCHOY7r1Qpiu
qNELIH4TClCQiIt2VrDYNUcyOd/QhOnw2ITtdhPSbllDm2TPiAc18jcJ1Mzd
QARHDtxelvUCdrWGmeh9i3L/oljD9S6ijzI/VVugHye/guAzkh0NeuIXTC4o
7zFPF2phyZuFRRDTG+R28/iCCsm21Y48kXSWdKWBdJ+vimrTAIMEUYD2Vxug
0ym3JW49y1/CO4WM3SVCwhupC2P4PIcGZBGAxsIAw0Oe1Or4gTOdl3XTjudL
uF2yOcrHxYquAFosveJxreA57isxeFET+Epu6w1xIFzO+aXouWr6gBGamEcK
b7I2uJnXaBgkqajSYfE64QgSBoEUUyzPQdW8onNerXO4o2kjQYoCwbcgusxm
sHas+e+hKlQSq+Ub5U2Bgh6ejXsvXp3M7o34f7PDI/r38T4w7uP9Pfz3yXfT
58/tH0HeOPnu6NXzvfiv+OXu0YsX+4d7/DE8zZJH4d6L6U/3WOe6d/RydnB0
OH1+jy8qbwnCFWX+RccUTh/yiLwJqk8RU3uy+/L//X92vgDF4X8dP919tLPz
DSgN/MfXO7//Av7AozGKQiz/CSt6G1Dhy2uiGxDA5nBNt6AEjJAWGlA4gNkW
rJb8BVfmr4+zP57N1ztf/Ks8wAknD3XNkoe0Zv0nvY95EQceDXRjq5k876x0
Ot7pT8nfuu7u4R//RALieOfrP/1rYBo5r9C2RSeNCakWPm98ks4MyAYgnde6
gmjRgVWbRhnxcQiPSXQmffEW2sA26SjSOaQLQyUjkvdI2YNGdtGe0dr3xNsy
IuScWEXubE0npgifFDWwrs5XOXBcViBy5BVwI+C/hz7fFzsMNTDNeAx463O7
8MbLwjVfkW1KjTdR36hQ3CZubxSLnyrb5dZXyYd4Qa8WS5AcEr0cBaqmYJ4n
RiTYhCNhPXTHsk6uP6Fp9Q0uhHH14d6M67OsHNe/4SZQsT8isQW4ZzpynDlv
xNJdJXTXXZBSrWOA1cy643DXjXJJ2lLU61ObGY5pUcFzlF5wDaIRBbX+SlY/
todDpts4zphoTo2OdP/lcTLUQ+5GOCKFvGLVWScftw3pIJ3SSExkxOh5IYGd
4GaAJmVSeGpWgUG+WrNUTOM8WImlEnUvsVL6/uN44cs94E0f8W06yvvNA/i0
R+6yH3V+w5I6TGOlzcDaJCZWZ2o6id1PQdO2vvGSrbPNKnlydotSC36gOgqp
CCj2snplHcC3vkNkAHa/U2cvgaZA8yL9AFddNXjS56nVBQpfZBSqSbdeVvSX
s0aSu06GjkaFCoW1Bs8OqBa4eHKnkzyM78Jewu3T0E7m2d/g+GR8hvDmQHcg
UTqsaJHdF7PfmD58/x7XnM+pkiM3Tvc9fL1Y1CgR4KUPi4YmhapBhnWLw2aT
qRsZ9EVrOYlnH0iOdVvQTrJiSfSmSh8x2GhvpBFCEzZGHgoPcoZz0EXBf3Pn
IPIsI1XRpJrOTOltbgQkDiaM7EW+AsmRBkMySNfNs0HztdDEVXyXr5nkgn/3
7k/ibhpBv+xw2Jl8Dhc78PDlhnjiyezo5esTuPUODp+N4A482Z+9Ppkd709f
EJE8PTjkwR1WbHuA/SZtcmXyUG9sIunqO6i8g3TGQ7o/MKaMxvQgkCAuE1Br
OvwD9T9VW3C1UcBD8xLserT9QcckocOYb8pFezmKdrJlsboAvkW6BdpDWTRA
G52avjZmvF8WOdzJ0YpJJAMU27BthoRLoWc6g8KpFtDbclOoFaIS886JCrUh
2LMSlYnyvCR2jbdrOd+ge+xIaBsFcTplJCjQnzO5Df77v/87tvMOqJHfu18+
GMEf0gD8Fd7Tq+8eZ5+gq3qpn7AwnVGIwrf3rCUTve+9D+GgI0qiV9DeFHW1
eItL0PCGkiSDJwlW6x0N6GBvJOf2YO89ugJRxZZfiKb0R1SvUMphIZ0nk7yC
fzFDtnmPSIdhX8rydpLRXYo2RpjVhjTNvGZzf766jSOf6tjr4ryoYcNQl+Zt
n064Z+B50wn3O3H7Nc3+GJt5kpXncNBP9Zs/Zk/kXz//nN3Xp99+a4//9/+2
Rull/ueDUyaU74vb8Q9IOOOXeVl7cun8QvzELDy2YYkHaJ7XcA5ANfmMaBGU
e5Avo/OtFb2FmtpyNtgifVkwNQd4VZyH27+giw5PCYizxXLBln8yH4Omxu9O
hqazEfIxlZp47XoJCq2KBOT5oCdsPPVeTzJB4JkXCoxfyznp9IinBSNc9LD8
5TlPA//8K/xNr2b3J5Pu4YElG9NqjHE9O0eILom0JzxDv8s4mAYobrOSDZL1
GkVzu+4DnjFhCrfChiRMRoUR6p9lrWVTsVsCZBO621CwqKOdawKd89QeZ0eo
simzIt5KK4DLuFjARcSOGeHXsq3SIy8H7WjIaJv46sTDdpW/La82V+6LXEYI
LT/6vztfjXf09ewAj6HJzdCUici5fg+874IlWd5JaX6EzhbSFOdLvNZp0ixC
sQaFwoOa4bMfympp86fBk6DMNjdeZFt4HmuyHsU16rUkDd+U0Bm27YUaIRae
FfBInLIZ1zerBdwqGP2Ds8ImR3aOohLIKwpEy219xn+jdB5QXgaikjOabKd4
YUXkA8Lj5llhkf5pkdjQA6w09BYK2F2F3p5FkZ1+v//T6x+mz1/tv356dPxi
OpvBpf96//j46PjUjHF5A1++vKxRKDKOlL37pKZfxmv65T0qCv5NEU5xCW7y
W3NioNbBfiBefpTaShEjFmV+sarQNhW8oSc/Q7c6GRJl5Cv+RK+SfA2dreuS
LTV4WNOh4FlPn7jD3vutd/KBgoa+RoJSJjjuMEH2cd5GIcKdJSJ6ao5XrnOa
0t/ky0tiDnrQmGBJgt15+OgL/To9WwMnq3g7L4qFDqp7rqC1bScrO315fDQ7
2j16/vqHg6PnUzR3nPbXRc/Z0I5mH7Wjk5ANLIIxE8cqX82ejr/Gi0/9pqbX
8rXnusMtJhMifAYXwsWG3AT5BVn70fOIHtosLxcculEAI2g0dGh1qyovq8bI
lZAZi0WC3VJkSebz3RZvyTWt8soeXkMvKEDh3SccwyARHLyll2VRk7tljqtl
2sWIh1LinYhUQ+YDdRHARZiXq8D6A7MW/rcMh3+PitcBTGchlnN6kfmF/B5E
DpLINr6ZKNZGFBQSsNEKQdQl3hxoDKMIUOty3sur8uKSRH4RGeN80D+Jo6i7
n6glhoKnNGwKrqhqyaZc5CEqmOUBt38uBjNTNmN4zSTbz8kbZJ/DKOi2y1n5
Y/dVYJ2MbQvo+JX7U20oVbYu8ffLhLX4ZskoEyQcas3BG9dlXa2uxNTu7M+m
gcjonAtheRuYoP3dAn2z441E/W1zYV06b9jHSoZD+VAlIGvT+5To2xpGhDFT
5DVh7XvCapuE35G+xoY6WAzS0SX6YVldEKlyaJXwX9gT0sWCCAtiXc9Rk8gl
9AgP/Eq4j2cFZ8V5VTPPwX6CxmzN6DDJFsMCU+gOBYXwCpgr0gjV9jOwj4Hi
cm5jvA7+fp5fA7uBd3CbO62L1wcnVPIdXKwwnCJuIPnPCpK6lt3PZXPPawwP
gXUgug0p+bH0UalG8cknZnkQ3qBGBDYYn+UN8E06RGqLcD6XXE84SFUdS0j4
hZYQk86mMC9lC2cFx3FUkWuIdkaO5hrOsrLedYVuFBBSglI2xXXdb4oi65lw
OqOF4cE4QC41NRhlm4BOPD6lGInbrPM5Sjn2YCT0D5olOyNUO5ToM/SfnSHD
CtzsvGOUYi2+Li7yGg3EjfIzIA4maQ7swQAKcglO0BcpLJ2P0xx95puVHXPS
SMj3KF6lJlO3RoYEeMHBKQHUlcLMWEzSKau/qVhjfZxhGLFFuua6e6Lh2o9I
q+hbxMuxvl23EmNEh/kGvV7XpTNVkB9MNsabUB/QiQtKIWgvJIYOnI3NItz0
KKqPcxJdOPQU9QrXDbKkvq2VhpWaUeWcD7yLB6daAl2E4UgYdtwJv5HdtwUi
VsYGLVZmAonky1vv75YrluWckdz0Fr0lM6afqpri75mOvJv91m1xdXVWol4K
t0HZjsheatoDnAAQBmWYusaNowIz7LCNIGcmnjdzuRzptKE8YlYQsQ8a71MG
otwQWMjUWGP/wKPsAkPEYB9zuprngyLc6MPQs8B+cFzG0mg+OoJAkRZ5Zvzh
Vt2rzKQpaAFNg5flmow3ZUMbTDd9c5kzqwli46TzoHdBtYqsVX5HTk5HQs10
uGHPdCUkIKBYBJEqWjHyAZO+QjJw8TUxGsSWehRAExfvuUjHsJpIN7iokrIB
h6a9KeA+iTtEcQHcMmzej3jZiCHvU7I8Y2gFB78UFIEMGyXnlDdovKbgCg5G
xSDwcA+Fywu4cO6NMs9PxLlDpsO0fzwKbE5dq5OfNUd0fC/YwEmSWyN2WBOq
UWS7NVcF8kuMiCtXYyYB2D82BlnAsiq8LvQEGOe8WJrEhwEJaYQadk+uyuzp
psalR/oc8aZYFGjiQ6HwMYuCawIPq9uvWI400hYthRTfstgsecWFClH4ksHx
TgVxnO7TlITNdA4r35MkfYBwzAH1q0gvutd+g3RzOt452e7EWQlbPVJLbhP4
iN446TxyoLN4HuwQ8yxGzoAaj3mgN3SYg+3EYHgh3BHceHxdrswWJT+Fmxzv
S4zZXSM9oSSKMYVolRPfXFTzJHAVqH5eLFIGlNuQAscr8GA2xOydERjJzvtT
zWtKwfQYe1egPGbzi+2alLCAdazklKNLGO1bLV+voZlXa1GZ3HfMSJ+xNATf
xtNFY4/r9Uw2Z/oTca/CTwuaUYEYyfeWz0KHByr/gKFdoQbHsf45KIa9iQZd
P6+1IXnx0XTRhmyBcvGYjtOZmyiAcn6NIorvtLS1f8Is1GKgTCyajjhy1TgA
tP+EhCW2eQV4oZwQK8bFf+LUkvPNkiI6hS9zHlGHqZvtUN0iTUhGgSI5EN51
WW2a9A7ShSdDx7J8g8LmOQf9NeLdy9tg57XXD/G/tK/VrbmUt/UUpCdlD/RC
JJAue+CtRFI4irvZf50DFIcEpqv8DaXdsOWEA5/QdQsc0YhJ4hVRc0CzOXyv
11U8W54KcdTBhBKUq8sVWtvVghS9YkpIqGOyaPIslUuiUOIkktQfahxypRrK
5mxM2gsdQ7oqQ99RmmlXEuBDIU5OwxYCo/PalbfYe53F0CDZ50jWfJDI9PNM
/LUqSjgDZ9RcSURNODh1nPdiNOxmvclZy9ZYHWTNKGoC06Ap0zmB/fLvkMAt
0yYVG3dE2CfHi6jvbBLkNYrTF8sQ0m/cO5momHv1wwYIUy86WmsxGvX4ra6e
Jm5ZA6IngByONFlIOCioP9l91rHu4R/3mJ+wUTufz6tagxHbSwlWw+7mGGmf
eftCkNhPWKsHxCEb1MgolWuka3NTLjFG1BI0cDNlPCa+suKGzYSYYoa6SffI
yts+pllNBsmOgzhH3cPdtGBNZq9QiRmodY/TMTR/oi4SVbqVCCsMBGKhimNp
PddGC4BNkfIKWNE7Mx/AQi9MvSanDZuSNkvQTfwc4XMkwnKlchPFBauaoGd/
A/S4jBYHZAvRQUt6MncrqhfRGof4X+RrWUgOZ9U4/owSYuD4LwKGmVQcfva0
QKeHygt07ZhDPw2Ca6wlHL7sr6M9iYNi0ssi6eFdvAQe1rLD1zxn0bSSnk4K
da4LMzdgvIZbPm4CiHvGFlrHSdAKylmGMM+WDUx4Hpo1zF7z8HQXYYWe7s92
v0Nd8+TVk5Pd44Mn+0As9m8OvaBX7ILFHnjGR0ya7Aq8hUGjQRtFrEAex+It
+seBKuLdzKR57lYMpCGmhO6aTdgalV9VG1G5cSHhmlhTkJDcLXL85X6JsQvm
xD9kxh65Ljz71+yQJER0t8ny2JHdaMQ4GTdH8SJ2/i8QAiybzALcHD/huChv
b25cuKRktzGX1YuK7xW8qFzgjledRb7qxyZhKrHE27PLIOSUNxBTm9wdAArP
ph+fJzGHaCNzL5OFXn7ytwCa4+AG2gCrEAeB3QWUusU0ewbbtoDzMwoxxIcu
gOLGJO/1hlZaliuy9hgwrYsROOdVLgteukPOb3n3Cb00Rvscx40woyqI4mw1
EzsfnnkQ/mJDxUjVfxFL9OI/VDOgWMPiFxpvlcVXxDyKRE7GdY7VF0rdoRY+
f5R1v3qK3m3Q752XiUXX5jF7FbsfoF/x0O7R4ebUxzj4K3kZs8lkEj2NH2zw
49yOCD2QimhbhicmgM6vqPOi+jQ86tQTd/ca8Rfvtq5A6okdfmfII3tXa7/Y
Mws9i2ixZcIrc/Vv6znGGPTMzHSjcDhr3v0aeqbvhcm6pIeYm9btUJw0mmuB
xyG5GKtwla/K9WbJmVoFJp5yAFQ0pt/lLe4OMT2QD5FhX9DtLkEa249SP2Qj
fIRjOTnQW5wVcsG70LlVjx+qmI/drhxl+5iVtmrRheMiVzr8CPv/YvTwm6+8
j777fme8KDRsOL9CJIyru+lLDgGF1zRB5UDXqH+hF0Xj964z+uBd/jAyHviH
Q2m27YsGAya37ijGbG1hMv0ZBTVUUqRenZcSs5Zb0zHCE5f8Vtz6Q6SAhkSW
08qGPIpiOrmpto0HKNj9QhID5RfcBjLhZa412TfZ/BM/byFCFMNIckRniU2H
qM47OvlRI0FUTapInFEmVluX81Y4E7krKcgBNE40Sm/mlx1hh2EnUGlhnsau
kXxVrdA8rQFD5M23KST8Pty9MC7vqrcsGv6NUsCLfInThA1kKZhOmJjNTdAl
DSV3sgUKNTFZRbrtCt+0fkFRJGxxWxLDSaaaqVyhAQYFgk/IgFCCRq1Qljk4
A6SGSlCYKOUi21fKPdia1bLoTLKKhliJKIXwOzu4Pc5YZBoYKT0ssRuGiWX6
kO31mXfhw33dMV+xYsqe22j4FDGYaYUAFNJoOW0EG1RP86O7xrjKpubP6Q6X
+jZpHc/9FeYh1yxddHp0Qj9b2rmVSfj8ziWKyvGHu+fJfmTv1Zp6/2Jb7wMr
213MczJ1JC1j585WOBt4y5mMRR9YonvJDGyqonO+Q3xZrOQSEZFzpP2XaHDy
7cXvKatVz1dM+1BbnEUAEvFCY0R+2GO0afihw3H+6s6dkiD0j1w27Cjdk2d3
rtkzv2BH0dWSnbQgCRE97x/uvT56+vrZ8dGrl5m4gv3SRr8KUxKdcZfHJZpZ
TZvIowm/3zblyvxzCSGmsehkTkhnj20P0I3E7G+bvbGxzuyJQGgBdPaz4+nu
9x8zex61nSYNrV/QSq4WJllOwtcCxYFMaWAlrjhABzUqvHc7OEkvJWSgEpw5
spWWV1eblozQ0Ws5Cd9sPYosdMRGn0Z/6MvoD6Ux6IFf3nJ/Zw3mES467mvN
kCDLBTo0Mrh2SA10d0Bp14zeHMXby3zTiIYrPlqntfNtgPdY586LEtWrQ2+z
QbiaTv4dbc7r3enh7v5zUsTPyejFoQ15K5Qgs4G/7cZkfA6xMGlWO4qBFEIp
l7zTBEROlEiFgaGHztBh0xj7DK4VYx5wG2t+XCeNkjbt5asnzw9Ovnu9d3S4
HwSMo2jdvJQbuaOc7VLo8Yvpc4w53t9jkj7V0IH7zYMAt9vFBVtFOyuNNg5s
w/srybS4EGnkhDx3aowgP957ghJgfCf6VXSKlkGgagJFup93bROwnmXtcvjC
q+OD5gHtlFp0BpSFi00OrLgtWJ49KyTCiU1TEtWPoQwq5kq+GxuPgMH0N7KT
4etwuM5qOXkrEI41kFFmSGfNt8KyVYHITIoxJhNrTGZewNmaF00g5odpQksz
VKN0S5ZT1wsL7Oymi839AQVpcrrnaLjLB4ZBWWF2d+3uHbIci1sh0YPQneZS
pR2K6EUOPxLOkcthC7D/TwpKXWTX78DeyFao+8fTxEhMp0msZFCzNebJaPCR
btj5SMxs5HC5qixZsEQrFmofGrYb1VD2ytNU1BkTmR4GG8gwiLrJRx5/JhUW
yegz2nCR3AXeLnqjvHXf5E0XDZEvWzH1KwmiuWBF0RyaGcTjzuvCOWURIvBl
juGNaMxm4ZSanreocceQrGCL1ERRPvrVWglF1Jb+wBolRWxlSjUUg2soMOhK
JdgYDfhXYyiCMYkXw8+LTrQTQMPU6R1Ef6j2krkUGNz9YgI65hy6BfXsgVip
YS6sW6HT5Krw5u2KnR/xmslAJXrTkDezpCuL4e3snnK2bO/jvOYUldUFg0DR
JeXznMkKnOpLnM8uC9aJo9bNREUrUS5ZSTkploSXpGfAHYxUGyZ10CKoylZW
gASwuAoTvKK1B7pC6OSg48DFhvT1SxOR5puaqJpPCzpNdYCItkXIJqbeaMCy
pFSCOnPc2xWK8CNoGNEH3ARxtVP7MfJ+GYim3ZueQUxNVokzD3os3Yt8OSPD
uu0m5qHZvdEjdlaolSGbX1YVx57FbhkRaXiBSId6BWtLN+Xrk9l09oqQkxRK
NQlyhoHXt6lyxJTeEuSvQaaJBFkTeFOk0eg6Dp9oYjs68hVJkSMPxVxk0D7E
/eylcfL8/TZc2i6Mqee+5PrlyFlo6ZZsTEEiQ7rJ9Yay9hf85a8SE4zvJqCm
f/F//RX25klFB5WRviwYBkODJLJOWKgsc2gKYJVtObcQ2j/1QXqx2+uyuInJ
zF+8f/8AudyGozfClWf7c5RM2S5zqTe4SCQUBholEsK75VeCmzsa4yO+Ekvy
tD5709n02fH0BZzSVjJa7jOWyzePHu1gejXdMhhixZhQ0sequKhaxiIV1aW7
3IZORQ6eIH5+DDiGFVywocT4GL2YBO3RxiA7/+xzjjr2OeavpzNEnMF1dQDb
CCY+1iBDAbQck6j5/n2I8wPi57E6OhI40HhhGcnRiBtEiOqgpgpmpODbiFtc
+1ADjK7ZRM1d9AOTdumRI6w/mrekEeliNKOgqUmz3ZejvjVfZL/qz5JcsxIu
dA5854yzWEDu5lYdlhgMm1aiu/ZAU6tP25idoniyJJBNn788xD23WMt7P87G
U311bBiHhC+UnKz7KV5wpP3PJ0j9dJ0XNWWFI2mz9ZLJjCEw/vMv//kXoEzB
yX6crZfkhAYSqgRvcHuQqhhMiIOJ6vPXv7LqRzNiJs6k//vPHwLpmyzHirgO
yRr2ZlbM4Ti9qv7enuKFDO1JqjKKoirOI0g+w/RLRL9khKHRcC0hpZwthO+o
Uw5aQDD6dnyvc5tuB/z/PHCy2lnKGRppaOfze7CWhxXWBNijrmRqDQe5Ypfj
nS9JdqZJYPMPH9K0RuLI42HLd8HtknKD3ecH+4dwXPdnrxjQ72T/+If9Y3mg
kLKijSVUErUwltAURYYTkSjCvwtErUc5zlajtlfEQk4yUMqMr+3sOAyJLyaP
Jo8s48Sj+yomm8elc6BAlOaGAiA83j06PNzfnXn3O64ByLCtRVQTzKmZV9SL
DuMaJYGVGDWz/Zwo5scnglP5cUu14mBmz/Q6/nVUWtW+QkRyj6H9CjFFyTN8
i58n8Vjm3R3Jskf2JjGvvPKff/P1V+/fswvY/xeILLHxb7Wne48/++xexgUN
UCXB1RvnZ4hHC/d3du9P90SA+WuvMTrSp/bpqaWpuDQMjXDLuMFT3Cl7ccIt
0Gn2UzZscNy4088mCKs5frOqblafnTKKLbtRbWFgKwUW7audLwmAiAScCMRt
IEvimqG8ApMeJEb71M/9lMw7pzR3G7BB5sFgI7QFpxeZ8ktGyAIOu1kPgjcD
8bJJOh8SiZE9hWDarU6YVQnRdUM1OOsR141OSwTP7kkI3WPCwfpd60rwe6nc
3E+4s9+jgRXLZMXCwIrRyjBCgjiaRKhhVhV1UBLnAoKFt5v1mJ43HNIjVzgN
H5qOTcQjjkSRb5YtvwW9f/HF5xgpY1KSW6kBaSoCsurivTp+LuEX7IjCKHKy
BfisHYcYP08+bXwUiBpvcCOQugkf2qxX3LzkeDFnUQmyuYWD9FYz1tPBxdyO
wTHQIuJRmBcLClmEXXDmLqYMl5AVPRd2fDZ4hVg+hCK4CyjSvolih+5yeveJ
iWhjd2m9jwB0jSQmozCnGXnnwIBxtAaETpGZIv/SoaXzYE03jBJTpIfKUs3w
XuUGo6Uk65JVZhBBIoUEJ3FTdyqPAJn5y3YSQ3J1YPLmSEbSxHvqslAEpDh4
OsULBnnCIQV3Akjm9Vig4veVbyfZYeVbYtuQMkMSm4KqdxrLomaYNSk4cgcN
CQuZRmvGVYwjC8ly5WQDaS7zN4WG7sdFIE4Tp3TOkYUIFqUDD9EbJNe0pjnT
CGItEBSjipsoPml0KN00ytT5HEUk3bg8XgEhN44fKKwlNO3eThptNQgXm7T+
afUMt+c2uA4Uf4TtkDZ/CphQMBcyVnWiEcz8qp2MAqpIrGZ0bI+aL0CitAQR
4NVjn2IvmCWnMfjB8rP5PHS2pQfmWkq+ji5RYmQQE41GNEQrA/4gydKcAi+O
igpk7kKyCHiDx4qJuOgA7GlyWEwdrBkyxeqHRHbR4RX3rUbDmE445Wp5IZq0
smDvu/Piqjuo7JDGdnCJAAPkMSu7opolc9C0QssT88mRHfhAezdTY3lrwRor
BYAkbbA6D4Pd4JW3LhBnBu6lfgARpboPhQ9l5Xkok2AluPIRt32oF2Ww6e4k
Th/s2aoyDN4nlJmfwSWkKEoyxk+bbFmeF2RZy7I9Cj5vKomPtxAZnRDnGWh3
mGOzJThKIIK1NI6j0zY+FnLtQUcqy3Be+5z9aIzPkGXkjnQCfxDQrFEyWjQ2
8lAjhp0oMTDM/3y9+/zoZJ9hClAbwYYc7N43E4T8faC9pbmWw92FfnfYxX++
/nH/yex4enjy8uh49p/A8E9OYAAIawurTIiHiSYUdAxf8UVP/du6Scsnmq3d
9ZAhKSItUxY3+UPlfJFPUrgSvYDu0OIac24wgFU0NIkWL+Dkgg5zeMQISNn9
h28fPngs8KxugZki3E5pPp96Y5ElH872jw+nz2NTO9QUYponSasu4I0GXs3J
8ots/dXh9NXsu6Pjg/+zv4ctPLLBqOAhybksIf8XWyW8eB8xRvskiy1+bi2i
paWNXE/NNWQTRB+Pue4wz3NRNnlkc2ywTvgXLcAP0+cHe68Rx3n/ZPb6gKbw
RW89sT0hobPIkeJA2BWXHYtggwZ6GQZ2yvFIEp0A1/3fKfqzco4AAjmXOIPa
GhlZBAWmfmMhOMq/w/FDn2elYQvET2ikCHUcC8r4gSKU7KuXzw92p7N99mi/
hvlPT3DWX9qsbVo5l2DhLWPKZI/FdFnmTVxqtamWK5E7tyN2YU9fWU+GU5cR
Th3DDfGFy9KKEOrs6Oj1i+nhT7pRNODf/wrbZHtBkSHdGCF1b7yQQNz4oaOd
l9PZdzicr2049CTKODgqtfLmInGOOHRnCGtXd53Q3Eg6jYq61EUgdS8njMIY
oKDj+GbbOLohi6rm1JtlIYDF2Cjd9s+Opj9Of3o9O3ixf/RqRpyhz2W2LDfd
u21Vodm3yhSgpXcJM0SfL52WZ9ytF1ouqvwmv0XzrDxhLFodAgiCXJ+BUW71
LrPHzKfhbpkdA1t5Afx9+mw/mdbOPzctV9cFA+U6pa/wvE1nU3Ub+H4f/XP9
EsQPw+5I4hTmB6w4bxZuJcL0Emhe0VHTOlsPuhAk5+L9PGcgQf6UndeEl2mJ
dfLMIAZoFJoA3cNORAGmoVS/m7zkHFBSkWJqj3USR9+k4YaUq5xxpnrB4N0O
/zdTrq+Cde0ig4jg0kpteF+9nh19v3/4ene6+93+6yNQ9p4+P/qR9iXeNir0
cEAJkGT+doy32Lit3hSrMQVdjBu40UBdVpwB+ItWkPytdXGBeYqoFk7l9pPw
EmygIXZ3hhEtHABP12lkz26YxqN3+GpKW5thaymv1p4pcjbl1cyj2ZgE4t+7
3LfFU+NDA4uCwtDrw/1nR7MDuo1fP50ePOdrfufL7j2/KBfotWF0i9zsA9Fv
J8pso5D6kXXFqVLTfD8crOBmKHnpZI4dlEmWmXmuUqXlw9N6dfj94dGPh8PL
y1fKYeW3jr4Fot2szBgSQc15cT/c6/5/vMQ6Ed2Zfj2wndwf0gacbLIp3L+j
Yb2FRAib/UTtxjtA1TMYqr3hLoLa8S/xV9GVU9WatnqGM1PcW3qFjLuEIJju
YOx+at3H54aPSFa7udZ2KXmXJ+RMsIuatDaMPyhi2ZZOGmJVm9jTEU5J/VGm
yo848AJLTKLhfV7W880Vgp/OMQ8bea4K75LUbnJ0Wtszj4GZaipS/IfO0Oyy
OuiAv6hr1KAGsVcQtjF1odIsfuCWBM3aK9eobsSr/A1763A7LqtyLtVfXui9
5/S6eBeKG1VsVYS5CbfJeEliJ0P/AMvECkUqkmffgfxM4goLLtBRENqvNbUj
jdxqLjctRmN+hqkiiKunEo/pH8k1AHyy0egNDBukrBTKKkPqGGV5zKHOWrSn
LTBF45zw8WDoJMZwbVeeW0GoEuTkyAVtmxvlNHzpCb1SOG4RN9TCNyR2pHbC
pmC83PTDEcnl+VKJKKISejUHLjyjSsapuKjVgHu6H718p50KnXSOOiPlEmq4
REG8SY1cqehRUC6Ff0ehslWkLy/Z4uslmi830arOUxV9tHOT+gSs01RIPM3y
c7pyQgyOotufQGTOnQmnaTF/Wi96R91YEA4DcouGEw8SB8SPhmMgjh+XmcxF
PFodtAgJnUVD+rI44eBDEM3vjHvhg6O9yd0QgiK4DXKtc43ok113piPuHwf2
aePr9DBJu2/wSDQMYBASSxd5Ue4gDuUHnoUle6RmgknQ0qEayMgWqLwWSu0a
K2I478gwMq6rJUwseqQ5OMxRmVqlMOYD5bfVwlE6vn3HVMgIEgO8fOxoxzUY
LwaqPDo4eTbjsWjc8DIePfn3/d2ZVsizmNGE6Occc9lbxjz0iJ0p2oQfuFJR
+umbGjEq6M3yVnA6mU3HEif4T1QYhDX3XbK+3JkoF0vFA4mkUiLMZ5uzyk4V
xgryAtktQ8E2HL3IuzbYrOHT86ST4M1wtimXjNxVrdXVIH7BJ1R79GxZ5S2l
xRq08vTgxd5wVyA0FW8n2e6rJwe7WvHji8+/BlEa6eAYVkuefvXl1xggQeZi
4Oor2njX4cT/wYYpgUkVPNKmW+wVJ7KA4xyYfeCyYWwlFpZhbFuqONMQ9uIV
2bhjcsmiQgqV1pjCYb3XEgA5o9xJamihzXChmmywJGvminaPFGAiBXiVZriM
J6+2QxgZPxeYEM4hEQQtrYNL16QUKW3Qj0NmWQ2CtsxMjBVFvDQze1jgVXCF
SeL9QfqeQmDIZDniG67aCktqT7JpQ4mZo3BlbsAkYow+jxiFZwZ4YnAYBk1M
3YnGy+klWqppkLAmWInmduA3IIMLdNFfXmHqAImegiLSaeumXC0YZjWC6uJP
V1RM+TxjJDCpIi9wMoGxNWPBkSXsN90aKHnK10o3cW7q+nbwyx4FJyRrlsbW
rUEXqhayflafcMuiiBEW2xvrQp9zaW+BlaRZJRRd+VYHkKI1QOkKGtjUltqy
G4ExZ1bq2Vd1GtgPRZjl05aWy/D1oi0RquHKySGJSHvy5Bju2ZfHR0/2Xx/P
ZhJPfJkvr42lS0E1PRzxXOdu6sHD0lVnGquTI2vBLwlgDK2Bs9kkO+GoW5RV
iWlJd3Tlx60IQlObdaXpujgQrs2LuFCUnC64UK1GPHPFIHU9JqMnWgjMWgSm
hXh2/7h7EqJo6RfVAkv3IPaLXDoa6Lx0JduT+uTmDOBxSkFkn25QmzzF8LXq
lpTyv/i/CJ6OqHablXrRjqVwOCjcq/GxlJeXLwOqgLFfIgy15XBOVGyIwVnF
Ae+iOGPxzTZv3mBHCb3kxnM4m2fNrjgGJqIasW0hchB1b2Jh0PK1FkeYZcKI
3dRFFvUGQuBLm1U0iOjnsQitR3I/PTyavT559RJdU/t7p64ixghpQIH+M1A9
KnUeXmkpvEaz5XQBcXMZAGDA09utnWSbFihCpqE1YDNxp1JXp8LdJwr2p5fb
MYNTS91FyrtnSGAnw4KqmqCJglANnXfl3IvSxMvTg8WyOOXzPYkoRGtjvmeI
aqCudJJAq+tioWLu6Us+SdIC3jhWMGjti/7lTknoJLpsrV5IVgKOWTq7DXpm
sVvJQoymARY8Y+KmDoKqVjZs4GBXedeIKVSpeY1HlGqrPiyW9zvoTB833syP
t6cFcWBiXIOt4+0ZXXm8ETRsy4iPMNFAWmWDahMrBKDSEmIR5VG/E9zkxjY5
1TRa1rQXVJ4dY1LWCx8H63aBlzYO9dXLvekMYc72eWBm2iaThGnH8Md25WaE
Y6OiAqprhdOZeWaNkrsEYa33do3X02mqvBwugewDn/qUWA3uwDooNWbQXmp5
heRDXsMrLEC9wnyt09NTSm7e/t+/jOW/f/nAiz/DHYg5Y9nPv1aL1Ob29iJt
82t6lAZfvx+35IG8ft9W+sEHB/ID/b+h12w2Mqfeg6GPYKxySOXP7oPOR9Qm
jDgiAj6gj+4bLOsD+Giou58/aoxDff48MOrBx/BlwgT4lYRPpBuET7TF5Mvh
Ebh90p1zmzm4Xv1B/mD/rzv2O778l/4qfeSXP2eOj8Bfw7Tw89Y/7K+fe1zs
lwz4jx/uNj4Z3NmhL71xrbOzyIru+PLuU3hXn/6/334v/cv/+nMW2Tw2+scP
Hu8tfRK3TVKEOR6TykB4RPe7rtiOvz3kmYPxTCo0Dzd+h7zR95TIy2xeIx+2
CMRb4bwsspok3QCato/E8wAf3XRpHm4uSVjPJVs0FgAFzXKzkswXWAOVxDyO
KU6KrUapdTPxHbPHnD1ZaRooyIr/XrGXgYFNxOf+N344FrM2xjFIxBwBlEbs
yuSq9RCWKAvfZQGWohUCRkLoFUVm2Y4iTREe3g6DbWBv8nbgt+G9h10BIq3A
bej3WiAvWRVpNaRjgFZ3uq2y/8SKfrmS4m2lMl+KRtIUIk9qCnSnk5VOMW6q
p2rGyS80Jc9RMO4fS4F+RaRZy3NGu3wsdiEyal8eT/NbR12Z8u6+opowIHXu
pgEliNQtqZgJqolzXclqjzGPm+jNPC4abZsSEML6JgN6iP7qVNilGagOcYcK
oT4+iUYWGNfA/hXTPGOVOk5ymWSZV1oxdpY9OHBMOloT68rYBWY+dRxuFM3S
krlNccMWnbhDD2AuhlDxLxiPKDm/p2QrqW8iKSeMMOCgXWtiXnDj6G/n4fTF
/snL6e4+BXdRlelbHiKvhaXGNwKKTZbXAad4vD1p1QWRiaYezTFIf5RDQ2YL
WVpMcPFGEoFpYGpKjgyB1jXF8nycEkpM9Z5TzFzo0pEFr2shQjOGSM7wcjkA
MyGW5CDlZfB7KXznY/cIEZyihQh1Q4qhSM1dtSzqDRTIVtG5JCzs/8IZ0zBU
Em0kbSwxRLdAtHfiOl9X5QLh9DY1Y6DH2pFib8PY1VjyguKUyPmt3ehcK7t8
XKz/kEcvMKHyHeS4lr9jpZ64DsEFiQuOPsJPBF9uHAHnNvWco/3I2ihYJaTv
R361TY9nQ1V68XPuWJPykG8funsWxk3QQQyAYjHsCtDu+iX3gV8vkgFgTcjD
QxZTNLMxKWrQlObFGRyC+JCoSA1FkY05wCxmr3r7kzC9WL5eilLpmN4UxboZ
0oQZb75s5VJLlHE0HqFjmLdxLdUhEkm3b//AlGh2DScv6k0cNs1GQmas/jgF
veE/iT87aCzycDZwc9zidcQLNHxBSIDDywTDRb4dmjaWNaw4haJsKUxJI5e9
PYI2nLh5xNpih79Vc7G0PLN+xq+HxkSk4+e4KOjcDo2RnPJy+BJbBztO02sG
pmF7eRljMJFbqaE31sSa9uRe3gzCVahSlhadzMz/yHgeDcRoikrnw4tuwf9i
FtLD0Kt+dB5joDhMJuB01HersdM9gn/KUP8h+CIBVAjTnM5cDUDKliWCTqyu
KAzaGKxAbLjSMLi6dJ90EdkoDUE7WQMp0GJrYlC8Imh+EhaPMTsWgpFGyLCQ
rBUMRCA+IQZsOgDdPysLnCFwQcV6pJLj1Qd77yyFFKrRHpoUbxp0C4stHxhK
hEY1z6vPDMCFtRFSKZJVkJroD3jB2kut2YAFzxA/Vufvsx7Zu2v1xNQ2qhoS
r/ip5DDLUyn4dzoEc2muKa9egey5lH+PDRtcyvChnJWABaIuWCOh0YAUfcQO
uvM34A9mK0/HJsJ0LIcqmXWIHkysdpWMOo9j7eJgGviQhScO779mJXcUQuQH
A2eL2AgNyyqp28IIBP3QV+8IaJ3+STXeBW/+Lx36ua//ejD6K/7sCKXERwI/
71tiXK7rBPcqjo0TJmFgKV1INo+AgVJjnZEg6si79KMJFx7rNDWRFv8l23kv
GfEdGhRIcq+nJ8o5RZavKotesNjpCP52W7Qjdy76gw3vQM19+J7I3bBw4uqN
hxRxvrUIZ4MclXrtLjZFGK6QU9Uqn4rGMFIUfC6RwQqIr/IUIg9JcoX6i5Rb
tFlUBBjSgfPi6XoL7DjRHqRminGNziYbEzks3kpNOFk5Tgf7R7Yf93kUHn78
Vmcfs9XhF2x1plu9ba8HdXi/1+gqRtDnHPbSi8m+Pooh8AUW94nHJYYqrSQm
XGqDHMCQ6DgZMJueUfXsgifBMwpYkwWkVuQwyc+cD3f3psSY7+ItOv9LuGgY
xCr+cpp+dkpKSy8SqLd1hmTLAYx2W9b/xKGarsLQEkiQKT06zb6VHSVTC2ix
wLMkcpGqB/EnIIN22bM0fEy50Zzbd8fiafXfWOLWVix01jL7Z9cydNYyc2sp
ZjrXhY3K7mVXATe+B4TWHQ0flA4yVa5HHdlCoQXaiRMkffWy/hsBY8z1KuVm
aJZ+GKE7jI4xQ2CvLVZW9qPF28rZhygoglAn7yrRsTXX+ZNMrbIoEqwuKgtE
YA2DIiKEEVKlJAYWEqg1E3nmiCm9bmPcLhkRVlb9h0uplVplL1OLRRUrXHLS
k3fuas16B86sIXmKAMEoTwKzwAuNuL552Up7zFBMkN0zLAQf9RNIHemAJVCk
SU6h1owVXKxYWrygMWFQr4CPh1k6UgaUXWPUmBQZ7bBFDZKPVxQtJMsjgeSR
Hl/xiAR59rGmdBh5YNuwIGExG5ZhaQnwlZeB8Uboz6elaPm3bfgHZsQS1mn3
+hQC/CTbu13lVxKnd6K1rw51fbGEITkBqDKgq5tKm6YwmEgC3IKUrLP9aSQy
cyhUUKs2khmwt7O85ytOPOuEi/xNT40sEbfHgWuZwpCU4pQpYrR/lWC7aAXQ
4BR5Hj4P4yKyDoph6+48jMpZ1czskYtGYYBYC15haY+6iEEyOJC9nw6nLw52
GZT/JKbEotlcPuYSaQ3biI5WhZXl9nSwxiS7mm4wVOuGbLHcqaOM0BfiyKHC
ONLJxRAvkG55CnOxJCUNCAugG7n/KUEoFc1ltew7IpSQ+WDp8Um4GT5QfnLg
68dqaeEzBTu0bgxk7q59aT58qsTrYQkbyn/D4f6PvHea/+2ymhOdubuSWuZy
lK2XG64ILdZCoD/e8rFQLO/8VFEqP7j7moi6lSWEPktgkN/eZGwKD8Ulxspo
dR46hNsRlJlH2Lkou8p0dyOC4v32oKbJxihWqwshPuSHcqSczW9dS+4eZzJw
Mcy+CTWNFBt2J3ORgQ/7qeHAMzsYtMwyKQ+aZH0Vg5EJG2nEycip+Q3XM+Hx
RLRX83pKactOujMSqHvmMWZRzOXSBZq5nOQta7v+a8pVYDt7OnyzW1I7/rc7
Lbha4OBu060usbb4j1hvhWWzoT+QtdbMyM4q67N1+gsagjgK9FM0DPot7jfi
V0/MPVSU5g5TLdF83xqbDVlj2QgbTkoMTtRCFWQtJVlDdNIorSQl7BmYX5K0
7DIXnFVxg6QYHiMWBLSVuSKp2k5RlogcdeoxOEggtfmGTxyW+F7ZzCuCGNOC
Ewt98j6E+KvChym0MxEylcQiSPBq02ICCzkmXevWlkbe0svCQyRVWGxyHsrU
Q50i3gThgrnEQakNfMZI94bBNRLBg1PDh4Rq5svRdoSnmXfG5QH6QN/7ruQo
b+8Dh5VzG02Eafj0WdFQKQPxYFui7KDTV73YmL2i7gj7ObapKN/kbKeVht9y
RnZb+H2KcmIQNIVO6cAEGrEpYhdlL4Tbg3y54OwzsfHbTjcE4dY1gQCN3OR1
0ancqA70mihazB24M2FgecijaxP6TIxlwqE8zeRJxBBbNOBclGumGAFGjtID
hzxwHIE5VXrLP+rviHnoutEHERfOpjoytEurboC1sU3NdtUsO4AbBWZuwyKT
u9uFr/SGE3waqneKiweQsQGLq37RRY3NRp9pdbPSmY54pc4KVAopSaPn7u9S
SRqi/34wAKt7wSv7pSs+3H3FD52bSScgOvyyCDL2HltRoehRNwtd4FCy2aXx
15oJORl51+G9QV0IlHQJWMgcL+8n0mrB6yS5li+4OR51VlJZhXPaH+duIk4C
FRgHCmb7iXOxugOE01/U+U3ja0sMLuhBrFyIuR2XJaFIiZ7m1U+6vjR84XxT
+xgr13Mk1xAjlFBUqbcF9HTaSlKsFQjxNwjyIdbmklM8W0soWSW1O9i0pPL4
5JDpAFt38kbV5ZtmSYo9k8+Ic2Ri9InChzoukgZqmmDZv++IV3GDrPnHyimy
vOLCjFLgwKyxlbJV/E6XAdMYPjY7F/kiYoDPlDuWjQlONBmYaYh9rvzuDfef
LgHTJoXUSS6/Kz9Weil5aD69zYtjsmfs7x06aVv4f67Y28L1Q7JfA9TVxoSg
/thYBXXklZpOLbHMsMBwMdcauJbfyXcHUv2pXhUDghFLzWsp9RbjnBK0hI7E
wXhlMHKUVyox2TIYkbvZBYKFMHjd4tCNyNYlEHILukLJzrVpCIgE0YrWUrov
m+PCJ/mMcO4+GLV8By8PvVuotycSv9yNIhu+gsKWK+iOIOYtsoc3gfQ4+4AI
ky8l5K+MgIvdsXSCdxN5OeEfIZWXeb85wLPDSFgbc7Fqqy3CVFd3V3lwYP5S
dZD4+HX1phAhJpdyykNdpHWKFxvaTEJPsnDOJIYzzOuCAhlBS+UN1rkqfkzK
mqG1/mHNLzAxmLYdzj6awopOqCidDJTbUUpwKrMmLn7M4qn6nw4ojc7euuRs
Wf7AzSQ3NVXtqRQj3YsCqLS48z9KaAzTxsfny2JxgdCVcKngTIzwqEyRjhWf
QtOBFq5BSINqzZWMxOZ2WaywQF0+wYxoFKLLOWYqjwZmIMcQJIugQfhYb6Yk
cO32MsLI1yBeLW91Wggswh570ql46l3a9DBzw7eqngbh16njrmwD4VgS1W65
VEVejQcpFrBGuImcMXBaXxM+Xj2t+YtkFci+r4b3snVVRinwPVZhuEP3ZKPB
SwlcKDArd21/IHJU9ecsPsgIWTXVvWkje5Kk3C5LyuHUqntY5oC5JjvHYHw+
HoKYTAdShqOfiAWEGPHLYt1erPchKe3o62RUJDdmqx9pTjCsrIHJ8ChpaVIC
0kLvMY6CGraUCi5YN7PQo6pmg+lghWUtjNK7blJvdVoC+653xYJVoLGw8e4H
q57MZqlbl7xAkJAYINstdt3tSCvzcsRDHufURD9Z1q2b7AsZ+vK5xKTcevKF
CD9Q5RKRpapMVebSiunc1FjGYhWEmw9iZ58jESqcBIcG82E2ULYLdZpqdLBg
zMobPvCMQ8onmZYvSPKZXGxv6UvAoYzCXBNP+wbBCaX0ocTkYBK9zF/Q3NgI
78eEhEHRHmw2WcB1sECPgIaTslAF+5bWHieeTQUQJd6bkCoqd5AcqccwzXgi
aK1OLZieKz6dorSOIRXiBEdl60KjMXJxTehRekin/tGXX+KxQQduXEgtIBXv
GgSAcC/8geiGHmJpP/0Mk5FgYKcuLFy40u0paxLdHrrG6HzlFlFd6WgbadPg
GKHc7ZbCkWaMo1lTM8ZTzSD1WPVTuG2sbAF14xpiMk1XPvOfOyNxJph4fO+h
vlFZboQEB08YHH2oLcIMxHgYDEtGO2aLLlyCebfKCFf5grkBSNtSg4LLC1Bx
1kiaojtdFxljRWKXPDEJRuPTHjpw4lxplaDPuAEsQNYw3kq3YXWmUAiYNY4k
Ej0e/xSF9HeC3OFaMUcOe49uXLWImFk26iYVTpxfxoZl4ezddvPIswx5Nxjr
2oLjCyvBTsYjvExtCaikeZ/werl7NkO+2MKnUwx7Q7vPp9l9YVaMLUPn+0Jr
gVr9BroAH5Cw++leYR+H5GM5/Nu+7p+cBOLQggXZlKlcfUGLahdc70DLsfxD
Gqr2aZN8JODcZc+2vSgXRNWgSNTIycl7TNl6rQvIOeLwHgRPRvpl/oiY/DIl
P1Zxg0hET5roaHCrejilvEi8O6aKl6RV30UmSU1IVjFlQLjRu0sQ9ISLj0gs
01eMBwhcXOErrLHUg26Am3hUO5FFfZZDAmPfY3iFwc206Liy9PR3v/N3wgDz
+t3viIcrF3AMjwlpsm18Frs20CgzqqG7MsvcHEZ3jbUvSQwOFVv0o33UG21H
HLNxWznpLbPBlj2EYnd6LCxSk9BbnKyKI+exUVYwsEGeoyNhmJS86fXZTnSn
qGMsh5KVWxdOBeG7NvDz/4El4XScuCJJOOXAWhADybLu5iNHhP5Nzj/Yg/W5
H+2uIoT1ZXFsS79izpk0aAE3v6A5le4ffGh9yd2RVoC9t/39e8pVDa2NFJnk
Og/xOid3LSGfISQ3VyzRMs8+Jp5t+OfiKsTfo4AfTMCXKGx0iKc9shGCnePo
IY329ChKKVh4sWBoUQx0NQyoYXWCFgg0GzJHdHqkqAbVNagnvn4E5ZGSYzlF
HQWmWMpP0XXi+nmDCLt7CW5rrEk7lkmAO5/IQ0yxmHfQY7cRQbejJPDp38oD
0bgzpAXR3WUjsVpanDTaowAdO14lZHYhLyWhr1pUOs0g7yF7aa6cJtuS5YW2
HOUcCw0gERTpB3OPCSCaKKdTb6HRULSytohPECAoq4LA+UcWluAqNsUrz4gU
tkEkFquf7rwDR2orCAp4uChqIRPctBOREKI5JRBUYYQfThfBMkQcZhxHWnb3
yiwsHXHGVDpLpffJJt0VR6zBanW+LOdeDunc2FWdSDiR27hOohnOyptjScls
QHnrtkdGKkq/7qOcEwztOgVqVjRs7vlTLTLG4Q1Su8J/12lStDgDdgDW01Z1
rGhGdqo2oisQy6rWgpSoTEpTUkAqX1ewfLcSPmYr3guVZ3lQsM63JzCiec3K
2HNDuat+F9GQpYBg3CZBBa1aNITOKziyWplrXlcgtXog5Y6MHSnnlmpkCSEj
8CZyQnVdc1ZHHkEKBuNuzsu3gbPp4SAQHvywzS2Op3slcJ1btMCZ3wlhNdlc
REVpyzXNjGtZoAg8sEACFEy5kj1rIh9/NwSLr7KVQ/yEIOGft1kM5ZD99EVr
CbnT0ugx7L8iQT2/Qi7teikbq9JC1iIH2zmKc0AaUIj6kWpjcQZssXI1TCtK
0LXP4y9JaUf03HZuMqdbx7qwSggGod4KWp3afCRd/6pcIG6EGiQ4r6a4eJzt
PPr6gZgHqhsgSLoUfNtlIXDDqEEpbItwWQL0vyFX5yfKXN594tAlDdeSCwkz
0jGXElsxTDAWAUHkayalfGn6IKxrQJ9mid4HuDcmnkV67wG6QNE1B42jr9oE
LXEZjELDYK/YcIo+Cl/vCmvY068OxdEQ7u/uHTagDqZkLUyDw8AxsJb4CcwG
hjFnzE6JTASVk8LdOO3aTp0XbWMauIhB6I+RmCwexiRZQAfMwQEoHGYGX946
TMNe/b8m5rOAeE8UdF02pVR/wPhBIGFNpynaXG5wvCQJNvBCVj6ClGKdD4qR
lCuVpRVGv289qCvZKufSCscSNBS85PLNSwrjxNZ6VZzlNeB4TxHnmFOAMAZk
JJcSmiRWiyh5kxJiZ0ulMByYRS5Y5CsyhhDbze5qd5S5qRN0q2DaIspl6+rA
BcMMqa1yICrNXIqAsISsngnOeSGXYK/kCBsIHfwQL5HhSLNXLlOvHP8K1NFU
GKmqkiC6mHhEQS5bq8vh4DRzSZK03GI2GMjsMUx8w8eOBGTWPySagyNtN7SR
8v4eCsqHQAf7aDFBBgR6The2pHKuBioKgoKSxs/g6K2neBsdYjjpkjRczHUD
wpWEP0n/gweSGkRSvVSo+dwm8h3b5vZ7tXTzxQLtnlin8JozyGVlDL6GTB6V
ChOsJLVR/VZpRKx/sbTx3dlziw3fSmm2Ptn9OFI22YHAFiaSXcSsH+9nwXFh
8VVFvpHXcUdepgsv81uKz6DgC67UI14+XD+g83zJNRoxxdinT7PvWVWMEY02
tRJ7EbY/x6AVeJhsYAVlW9M9hTmmW9r1ultcRYgtDRKgHIVuHA4Kv3xoOMZC
YwJDHHB0InLFnpz9ZPIZh620VDAdEZLYcksiuIcyiHjN4d07bnEc333/fhQZ
EkLjxHiglast3WDKk3wcH2IuHYeSivhqYP+S5SGz+g4xo1BjCKn8j/c59nsq
L55m58ucLCs7AqfEVUK8nciVHwgkq6lsjMfnAhqh7Fk5F5oQ0+2FrK7q7g5b
1KtJB4GEFVG5YiLqlAAmRZCkECErYnxZkwaPa2JcVBxHgp7ESF8SJoS+91Qf
ifD6SbRXoq24IiVc3Umvo5gVR1kOlpKgh2VbFJ3IsPGWkmDtfhDn0Aec3a5j
cFVw+Fw4rAsRQyllGi8ojC0RilHPfNZbDqT9GPjoQ1EJipsDC2kkbMOyZPPo
QeFKfcJexfeTRMuzSNSfP2euUS76EBPaUAS9QbSpjpgmEnn4o8Ewbo1sKtXN
TRUZKEyEoiAjqpgL9GE+2R1TvDkmPelewb+supiF0DOSPoivKMAT/qReO4VG
Y6Q+CSqxw/KgRiongR1M6RrlxPpHB4FeYOYsK+bjyYpMU46fkuRDoTEfqCTE
YRl8KoRBxXjEAEe9c5FYFaVzu/oStLm7Ft8nTMCaHKBVMxfqT/CV1FbNKPge
a91HGd1PkbpM1sckRWTSZt4TV6C+SFle+ELHHkYpnlSzntfapWVMEsxF4UU+
zBM5ZBpXnRP4evCGkKFEMDlLuAkpcqLL41EOh/p1oEgsjV7CTATCUHGad8F2
BcYFstp0Mycw0clGNpMHVg5s5CgewfmtaT5YWE/9EUCw68KyRrqVoWeXhagZ
QsbXRTeFadCYo7Sk4GNJvmYv1MbdWB6BkUKtuXczFuMIfGU1v5gxjNNyKn0q
23CEDxVVpcnhzlEer5KktWIJlTiMFOTQGDmW0Whoq9Izuc3Y2aFJo0Otd+sr
TIOwwhlrOf5JJ0Dc2WI3FFEQTymrfLekBYqohxU7S4m21op3jsQR1B/HgbKJ
NMQWdgdvJgibjRMU8OrGz2JLVDKjU2zcz/nTRvEtOue2e8DZuhdxbhBklBhS
ULQ1lbylIRejh1Cv8eNbK72n8IjyfCzPJd/ZEzlKsiKRZ1LMyTRf03oJE47Y
9VjEWs29RJCyyEKJKH3U6GZFEp3kdfkAdNN6HE1PEhtBfnGBQmGbcKS+zVjT
DyQWDgcU3eEDzDi9iVI50fpEBxftbaM2G7qH3ohSbJa5YXYgF15wTDEijCkX
tcU1iXOwMYMFKRvV+QlL7jInWrmyKmdFUjqUSD08kZLSvdglngVPcJXXNctw
abyhmavIlhB34w5je7RTRRyGFAkhKOaLIKxm88tNTdnJfdZxxpAYFNKGVQup
gpPgGKYWMSywo3+zacGExiTKlwFxmvho4eMoCeOERQjjga5ljgUI/ZKQvvCG
896sLRy8+1CK/Dbbr/7qDRXr7ta5Ee1X1pCl/3yuCnHBFpJACqViGai4Y0IU
mWoUse666AKq9dKWNA2aeDI3UJqyoulkXHQV7d0gg14XZvDqGfXwGnBW8QXw
i0pQe55BBxRb6WQrEehg3vNLNNGKX1WUDctXlLTGsuuiSOpJBbNTM9s4KxDa
geUEHFNdUmyQ6K5ibkxqv2pB0jylKbHI4LJ1a8SWLaeMi2+Jw0MD+zBXUhCM
KBCvIxFiVvFOTiObzN6Ll2n+AYh4VYi0XWZDsRuXKRt6gRZG8uzbP2cjMYVv
3VGMp9ELC8WKmDOPoQUtlQg0C5UHjQ0+S68nTs+s3CUGh9wIJ1YLeERopO7Y
8HiSZIF1Mlrs2plpMH+rQh+vkFyN05+CFvGiQTs45i52+rcPhV20NlaOc+7k
TwVcfFYFYNKPugPtx+fLkLuaa3fMJejcLoNFcu6qrSmCPqWxo3HPLHOQDnns
syNNGiWml1hy9yQaIaIlnEsmoNf2eupG3Nkik5pvMqgbikXoLoZLm3CZFSSh
DmQMKabHZrkMsSUHWz2kwdAREN9ChIpPTEQSDKNR20inbi8w241gUhYaKjMk
CEXmEi8WBHNi4Bmsv9o1p6n8M1BAF8V85V1bMoXSnNIYsV22zBvMso53LV+t
MBBRZTspYWVrBlXyZtDBgfHENDxkDYn+u81SMnHWLeaRTcc+kJyrs1teW6ck
NrGSgwlhqeGr47aRsOm8H0TKIUUrgjNo+mQjt2oRcw/VoWIAblud/3FALzmL
9IVe0Kh3SL60eimTvHG3GmYod9AXuEL8Yir9qkndKP1ATrncSoqtiX6eIF7U
7trldWFTFu9VqZ5NvOAFdI9Wg1+Mih+1bCiHCeKuE8e6PSqorkIQnhc3QJHR
GzU8Thm+v4YRbgkNhoR8kPPgJsEXE32MuL49CiDub5T+7f3zqhoBgdWseOEP
377lA8PzVSIMEabhjqzygdbJ4NPpMGCHHLctZ1OXN4XH6HxHX6WMWG1rw+XO
c50GJfSlVrm7cAC2N5JeCXLO+HibM4D0KpfabdFsAo4jeA5kkeQEuUGTcVQ5
iFhsCFzDMm+8tYUGkkBCdLLctQM+FccqFMREbh6jJm8TUV91ZxiddUm+e1x7
f8HT/hHmDkOLhFS6G2YkMfe9LjBpgxpJUxEUrir2imcqlWB2NIRum3LHPtG0
hNC3D5PFsTzsnrLJwFb8KXQlJOJ8CYIxI8ITXDwfM3UzKwudKPNwgwoeFaAn
R5tNp4OLhssT2dOAWWfl7xLBAKDhV+cRP29wub/dobj7VXfdUEePC3Tjk3j8
JRLpq+7Rl1nHOkdyGzpC6K7CADiCZ8z3t6AjPAjeaPaB1blj/B/Eg+hmzgYV
/dyZifduTxlij1skJYu5kuUJPTJpO7UOsgR4Z8socSlDl/tp2g1N3kMDDM47
Ff9F4LAt+Th7q+cLg1qMGJylFDgxwEEDjJ0yHsYA6+gxASDm0GUvljAKTEph
RU402deqb4jjizIRWYVCx5VEM3S9HPAT2zY4leU4NWmikzy/sIIpvY+4HyaK
E40TPGNzWUARmGIEJczMzH06ZMZW4PCxOd9dKy0bYq2REBYM5+JS/OhDvt+R
hODzOnTtIVE3lvCyjzGI5NEkwr7vFJEkSDqQd3VlH28gCQ2NgJCsJL5Gc+xj
OO2P5dOSouSK5RJjanH1r0toAZHm8olBiw0kkCt+E8eBLss3aF5qKwtg4u5d
nyRmChaEbCO1TWPArNacYJ4vJEj7pgCZo2bLe9mmDpfsz68OdoOLuYQtFEwJ
JxbAV9Ev1Giwg/pUr8UNCw9DzHpQ084Amgf+9tmAQOWNEij6Beu0e0PLBe7i
+jc6OFeJimu5C/ObBKq+3LPj8DLwtFFCv2aDbeI1VrzQG4uUpKsyds9wiaC2
upLxbiBqJ9JQxc481XtLeQ8D3lvvmuA5pd7gg0XBikn3/k4MzWZ6V78bEUHE
6bWsWaYUBB91RbpiiKHNyGdaKBz9lrP80abND5zkbOAk/+OmTvK59+2dsUcX
gMYvbTFyZsNGzpAaOX/BSbDMYsMy8+7ObZTmLJLHqRn0+B85UxEDVC0Z0Y+o
nYVoZHUp/p1R0MHT71DqZZh6Z7WlF9NDtfBR7M4Skpp8e9ZXxROiWA/zVUh8
ES+DxjharBclmaILfiHGNXMxeh80yoTyKQcvNr4oJbsK1ZHR8TleVQu0CMrX
Lv6t41IcSWAbUbK8bTGYEpTJaIa+EMFgvFvX9RkDF8WpuZawxhyLVeQgHg8M
HBOTQSgHjtAAT+KIL4uc01ml7TWuGY5NCTF0rFcu0IxXqaOXguS1MOgLVbff
faJInrJlm6ZwUBdnJWfocISRMD2CSZLM/m4qFTq1Qww6RAxIZvhUuvA91lbZ
JyqQDkyuitCvLseqJKTSK2TlnYRiLFZE4+3MiMoh6b99PSR99rxYXQC3v7/z
VfJYA1LvTybwnIshvXucfXJV/X1suX5ji5yhQWVt2S6Lb+8NjePee44GifFt
flBJvS2Yzc9Ssfnn8T/y38/hZ4wYpwLUtrG/4L+ftf/HPz/+R/t/+PbhDpdX
P9k//mF/L7tPELd06FBaw7P28OGDu/v/J+b/8O0XD9P+d58f7B/OXveG0WR/
/Dbb8UP5lfrvzR/+9/h/rv9HNP9k1o6VNkW7WWO0x2+2/o9o/sms/0f736H5
i//U9XxR5Tf57Zauf83+v6TzN/0PReh/DWfSjeMqf6tVA8blwo/nV+p/yvRH
fZ+8fvL8aPf7/WQE6nQbny2r+ZvCxvDr9P/7zPWPbs5+zxyV8But/5dJ/4xb
OTQGUr2TYfw6/X9O/buozDsiMn8T/pf239mBTmTIb3H+O/2L7XZwDJzf8uvS
35T69+HUrmsXhfNbrf/OHvavSkfWr62+lQX9Sv3vu/47u6/Fe3/L8/ck8/0T
Hukd9eV/g/l/hf1LoPNAkPP2/36l/r+2/jurT0PYsva/Yv+/j/1LzkBvDHPE
Q13+Nuu/R/s/O57ufv/6ZDadvTrx/XNALudK/Tb9f5XQX7QGdKhwvPqN+v9m
uH8+Cf1BuJPw6/S/u6X/Pi3IAIwYfiX620n5f9yBwSvAbcOv1P8XHf4/PAK6
CVIi+Of7vyvNMvoirJQIqqVpZcJY1GS3i00iKfdL1lvV273Oa/JWF3lToh0a
TVtS/dR/HdjvKoXu2EfA+cMLNmRJs2Q3HEiCwtrIFKwjeqUmbmoGOBUGOVfE
HnID+llGb6b0Y3Zy8nAF94tYuDr6uJahlDILw4smUYFha0HH7FhclQd7CJoB
/yCVvQcDo2iYMSbCov1iC5K4Jg8CCPnzqmbfjcWIs3HNoelIpHQsHBTzsSsX
/hsqqTap7YzESicluVqXSfopVlUrFUhAktjYhMJZC/NbgjA6p7bgryxmzDAY
i86IPeHowTMaLlfzml06WP5TcJqWt5rciBtAfkyFaSrQLiwfywJx5QUYZexI
rbxwPggDlKiTShOpoZSrCG37iKMMKCVnsUj3AbfWBk1RXY+YLIgmJXXF4bF2
5dTRUI2ZUQRoHAxeSS47hQwNDASVRujkfkKcgBrBBNtkGpyswrU9vCNXqYw8
wZ2KLc6m7hpS3DQ8b+QCDeqLxf2SEgRsa+Zv+kP1TbBd+S2l1HPsFrvo0bxa
LBp/UhcdPTh6k7dA4J8eHP4wfX6w576Ro/syAma++4TQMxFYmmrXx/JEXBwH
YxPi2wKuSBDZYoZWdEj9MhTs7cDIohNBvXY5LWu17pJTJhYPJP5NbEL3R7JU
yNRurzm0tFgFWDmBZZighR8v4sZq/1DzbRUUUc0DuRhk7LGwRMumnl8W6uX3
kTBhs3IBAtEN5nBICa62ty0Y5DbIUTGa+7zaYD0vNwpaNvYYWSc0Jbn84ro0
WnkujsBXKBx5FSbXonVxW6JnNgbPkrNKa5yrDV5dJhHEkvxFI8ZpytVDf11W
S8W4ICEVVqxE4sYNvdjAIOH2LLqFjUScxWRAsqzHhRB0DnTnz6uLFS17b+4u
yzhZhdzHjRIItiYYIj4c8XhFyEVaa6sWiDleoHkvxoF83/QVXhKP/u/OV+Md
vtQxL8/RACUfKvQdLtH3xe34B0ygH7/MSzx879AU/gaeUlr9eA1PaeonaNmz
Dt18qFB5F61eYf5yqjNFWFMYy4X3cVAD6SSbIlhwyka5NXllbPeyK2HmIjFZ
bFAQ6k93PpVUl3P2QzvQTscvGIJts47p7HR9CghXMhw6ozBONnP25s4/B2fj
V1cIND8WJvZ+kv3QnU2nBe8lCNRCd/6xMXYTS4vZibaYsM9tX4dAGY29xR3k
Zb4gYpEuCM6Sg1YEMhYRmnMtcCB/0VsE1ScVu285obYXbuZEVYcB0lAuERNd
j9iaQrK8XJ0ZjgApryyhSQrYNgmxMmp1wTBNCUk3WpJ5+mr23dHxwf8hNpjN
jr7fP4zLC6ubBP2P2+pNsRIn0NCXcW3vx0bIYfXw7cPPH3ACo40oD96wP0rM
7E5K+YcFHP8okWq6SR+SLxJHD6f5usDKe2lmsV06cqlwHZ8KJI/aigahx1Yq
q+R1fasREda2MMvYl0CKoZgzw+VFN+GG0LlUdJf4cbvoJZbKSDpQhjCrPpws
LPdxOsoom+U+L8EBdPIAuC45sgkezw+CeaYl1tMgnO6YE7hR9Jum7k1+Hf2Z
PFLvzfwL/yj5zvDsr/Ghveee8cDQufnXrnOTfk8dmp2Boi/zd34QY44XZe7K
rAHjuCpFtpJJxewXF9aBwQFZDEgxiHq+P6W2E/dFnEHj96MjFWU5QTmDldrb
f76PZmYEz34cHuNCC/SgLo+oxjRy6JGWIulHR5jsIRZCb4Lb/A5owc/GpOqi
LUmfPsZ/sPaGSE4SCxPxYKpqiZl7mJpG2Y51cVE2rSRNQteU87T/7OBktn+M
E9oZnhDi7xvd5QPz0YENwCwEP0erJLypk6wkDVKkGm6s4i+Lli0GOI65gLNS
KAg0fk8nAnO/F1cSZvPqZP81iPXTE5zOo1+0P680sT/SNM6Xfg1JrpAtokxS
10H6B73iFdHH52n/0GWy/QpYmXbVHQivHFEGwfAu/NHmH6/yW4Lh4RJOeLIJ
PCrSv8avsrIblTd3wjxV46J0FpJlRX8lhN71ubXe5RYzye8yz1PGMb527DLt
+cgbUF6txi4FeVXODEfc6FKVEbucuQeJQlIilEKNHNdF63K/mFxMHuOPtyEj
cYJ0ed1wbubbnQcSC5Un40e2QYnJkT5GDkAn44M7dtRz5vBXnR0kORFaApGr
95wVzMzseLwydNlkLGXUPN06KydFZQCOztyvqi6Kykb8hWo22q/Hi+ajyZpp
YpPDZg6mh9OspUhkDlaZwu3shnGP88gzEDDLfJVTwBWLItgYoqLW16xBWNl4
g87WLlFbccJuS9Dn3KfkLK6Ki6plduSqQlv4ryMAuw3iavHRGg9peMxs2ObE
0AiNkpG7hgSyBQZlQVpOPJeFiksSg4t7koaVXFgUeBV9wEYppMO4c6ff7//E
DOn106PjF9PZ7ODwGfuqT8WelZaUVfFaglk5wi/YETAeatZYrXviCHt4QGJ3
2Xv18vnBLsiHr1FIfU2yKXOa08kd49ETL/IWDSJ4Y5EApyz7IxH4J6888FBe
HX5/ePTj4cBAhort6rde8GNEdAYO7O0bXjMWZxc0KeBu0TwdsEsDkDz0cPpi
+hx3cn/PDfvUKqrfMWyVeHH1BsZAHcQLIcoFDISoZnSpIMyFw5LcAhm6EEqH
JY00P5OlP4IFGSVF4s3ymJdLsQ+3HL2bN5weovXPYeOcielUC1aLXK3F5FD0
L9fFEjHBYq6fXR5I1cOXOktGxnnXVas5o2Y2V8UBf6iNwCcUq6mHEjPvGCxR
F4jESMIgBsrTLdjfO8UY1+FtpWt3vXTlBzrCScL0z6VwMRJfGDo33WuCotbj
hrLlkggp1om3ukhVTSaUlgPOh6YmJQepA6ZdTSRhyhcmLZpKZahxTjW3ckBn
heSGnW+W5zDMQjOE7ZiHsll92gq8Fqp9FaNR2T4yaiW8SxHAUsy87/9h6YG4
fRfS8eayoFGxTEpTXqgoZRuteR8c6L7qZOLzalCFeAJQWfg0J2QjgVm5jZp3
xsBcoixs4gLRN14BWkgVSU1kvyCZOgStMgR65nYngaLFLBW81LP9WI4Uz3yg
8pnn5wbzTys9n2/WAlqsG94/3gRTeBvtNZgA5+S2+HaH8zjRk3kBX2T7//Hy
4Dg9HihvN/5CME2ag/eHz/eQfC/IWaEQ3DL0XRHeELyQ5HMXvBR83LZpC6TI
CcktrOIAWa9byziXAZNdOG/8WDWFPlo0cjvOOJgVTrKtK1brdEiaoKKZSZ0S
r6tKyrGWLfG9Qv3GDCw1NAvSI0n0SwVX57vAM8TsMq3xqZeAsFI6uShWi2eY
92mMJjRQBQk3zMkJOAKrMEEM9k5GXYlHq6yzTUvuSSpsyoVUYKxP4kd8Z9Nk
R94AUzYODSCRrRjIonYKWYg6nBcUDU/lVsQ8OrSG32FX5WrRpGJOQD1D0a1L
yhMSYNcO+iJZfrsGUh5vQOeXk2J2p7vf7b8+gdtF3LSK55a/HSNdsA1mTMd0
jEcaYxOY0+OdoNkvhPk5UZg/XMLayqSIfGh8mX0b6itRL0DgAAB22A0LrnSn
qj/kpEj96705Hf2wf/z0+dGPqcTzAZkK+CMpX+heE2aYuD5gO6nEUq6gkZgu
YUL84JUrWjn5XdB5Y3jNTbWUKsm3gdAAozkXVOwDGP5P2ezgxf7Rq1liy+3h
3vHMet/cacV91LfietvqKAmW7QDk+BcfDPihj753Bt1REvZJVO7Mv3svfbFJ
uDCtZqQZfkrMUQRKa+CeX5kr16WboJRdriS7VmBRHWqf5SGdi7B566DB1Ces
lUTQnR8ISNbUXAEdLF3yyo1muSfo6SmY/shKRQdWPzFQIdushfm6AcY6NJPE
AqSOWc3wFLEhKCB6bgWz2yQrtIeXeEMyBZ8rFkqiOTStxRNzwXzZFyOkES+f
dnSFtRPOuQTyjRQKdIC4aXr4LEk1UxTbJYFeuc4C29FT6CUPn5FCxslG8JpV
K0llxAgFvCo86LcD+gQ2OpKyEiUD/eLlgVcfg/4yNQ2QEByVpRiWWBpzZoPu
8UsAd2XsqOhu6kLKHjFMfPCg+R1PLr4Pr4y1hGaskQkLGuXucxgH1x5pYz4o
bine5N0txSy0/ljRi6izVPmMHM4Jsl6KA8kwe3KFKbxnY2YYFUPLpEoShf28
jEW52NjoMvJJjuMCxARebse3pRcNLRatdaOAVG++GQ/kzPSe3JJST7lbeR7Z
YAxy6k2TA3VIdTmdHR29fjo9fv1k/7uDQwoC4ViXiIbvyp360JPukeyNATEa
0JbFovNgLTehIbmft5PGA01s1SAov74jvnHj1UA1vJMQPF8/Kk+yiwkrvkzK
BJzZOfHwwdSpQLWR/kA9EIIeJx93MUw7oCexTmF6cDWcRLHAVetyCrYwR5SU
JLEe0fgN129564hVbnfP5TF7uFp0II9JWcbKL8Eq1gs4Q9bmb7iaHAtB1Wbl
iwONsljYXcMfRhxctro1o8WyuM5T+GMVA0BWy0iYyfZeHbPE4gUBlNFYMNPL
UkQBlPFYCLLv7hQGvugJA3aph/T2thByWIiPlRB617tz0EklWpXrY+xJcuXH
khEKuchGX0FDFR0SzqJUyeLE4k5OLmc2O66Oe+CqCEsPdvMo/CJZZhOWQEhd
hE+lIoXLz90yBdLrl/kaJIjAYQL42RmIyisSzcXE4O72RDRBNDYqaNS9ikhy
GwQvRosNWxKSe8tawMiiWpm9QPCQt8Lq9JCYJMYIXmsxxjFXZ9MBmV8wBoZj
qUbi+YunPzBgfpOCgyd1v53NBS3BEQbB0sLIXRnt3ncSeOnlotuU047cKjdB
qEmQh8WSshUbP4Z3XQmrBFVzrrnmGA7IZ2b/OHt5fABKxuyn5LjaIMaKeS3H
deC7O4/r/gN3l9P0YlH1kMIcZ1ozMqIEpSy39NAOYpxkYY0EsYDWDtz5hxSj
9eWXtL1cN5spnWBHtOiZq7Z5QuC/SZK3qx6Z5WcVDIoadBWJsuHlCMnmmokw
yScjuULR/7S2DyvfWkhWL5jueS5XMHaKUC5j/cCRC5y8TWPdENCiRsjCUovP
Js3hUe8Ucoet2Xn0NRuCutdvZVVViYhsUluoKN7lXTKKX77+KDp69LCvA94V
pJOlCqILhewH4iijD31G36XY7EMUG/q4Fcx+LYZ9mIqfb6HSkFJpF4pAXF2E
IMAexrYuFdL54RhIVsTWMIgbIoV9rCwDNsEgKx8KMx52fUNPQiF8EN0OfXA/
umIm4ifQPcuDBJJUqnt2fPTqZXZ0vIdk56iNZUvSVYTK6M3X/Oad1NW3MLix
d8SKf9b0EAYmT+JGYHGjACpQxQRJEOtqUKU4A6qwci64xr1a4lFSDD0QnMHC
BWTnkF64/MAzbonW4SmSbwSmlgY4DU6RtNjRfVlYFQZRr5FdTpu5SKYUiYNe
ob3CP3v04K4w/A+SaNgSn/FLSbSbh9ChR6rWatFs+GlaXCSVMaUMO01Mu4vY
xkRGrcdo6rduCbBDTaUjJxtW7NworXO0zD5JyCSdbelw9Jckpjw9eD7rnDFP
TGPWqlOOTl++li/vPHM7d3L0u/hFLze6y8oD+8LGDHqIUHD+DDxNioEMzKhh
pByB60z9akMtpclYqRlK3HJdTK67Iov+Oebqi18JnaUsACSKzYonSgL7drpi
iyc3YSGjmxUj1pgQwB6sk4RMpKyCkIa+cRc5fN2lhpTpKlZmMrns/uxo7+hx
evYEnbdk5lGXFDmj2Xl6wWMei+pxZEHtGm5ZWzIPj3pUFG7cRk+ay3aLjPhx
+eP03f7GsHXIJ37jdF0i5kgss6SDrdheVHGZzUuWNSWqd3FdNlV967LBcACk
QtzRP10KfAk4bZG2ko1BA4EY6WpQbNnbVpF508pMzusTeidYdjJhIvzTA0Oq
3tovOcY8+KgWRE0cKOxwYUBOMc5ovhOrcnJpdsdmJZIUdXTRFYxJi4xA8haP
QcMN4sou0aKy2AB7/1vZSuEV9VheUZVIy2mkY0hzoPrwJarM+aogT2HUK/un
Cgb1kIJNmRtpGW7vFOrzg2DcSxRwyv7gqijs+te0WyEBOvTPp8fP4LxlR0/+
fX83dfksucwM50QIB5DXX8vrdzGCb+5kBMHdbfCbv3JT4au/i1svh+eVFgCw
GCe5G5byy9h+0SpveXRSynxjMwlku0AYJnEOlG+sso5Unhm+hpg9JzYOcgU5
0HbBjldw2iLaIPmSiTTuaXbgPunSSHegl+LDSQDjrV4yUnDHKK+Ff4hgnh4d
/zg93ouUwoShj++iiJ2e7jcom6vmN+Ti64gT/i/6Gc2cA2kdH3GViDtIicHV
7yXEXSrYRZEMvZJZA/KHCB6zyyIMSNIPs/uLavWp2QUpoHknu69/3iFGh39U
07tDGElZfzQO9KQI2ZcoRWhVro4qzRWhonxhOe/bezHTdEhod1Gc5xj9ZTfi
jjmrf4LNPdhlzTCVWRa3q/yqnI9ZjVJHNb//Wt53ZNpJY3349vMemUZelegK
E4npRrNmfaGmzh2uwZK9rKu2mlfL7AdKqHR41V4MCzscw+ZyyDTHNvqnOFcv
Fls70iCal977xH5kTmBm59eZRpapBeRw/0deAU0r9luySqXz/t2uhixjCL4M
wlqiot3sqp7laauH1UnUXRubAy69EQ+TzqfxoZOVs/Q6f6SFN8DcxeKgc/dE
A4vGBKPWX6Gbu1ZsgHR69ofB8IQh3SeyqOioqAu5+nX/9Iqi7UWkheSK4ttd
7yfnflsvN3h0smncmIcDJOe9uBLIxXTkU9kS9HJfT+1MLyrye8Amha7ZcfUh
9a/sFAHKFuWCcWnl7ktPsQL7G9jskMu4N8TpT2H4Kk0oL2Y2gByKC7ssFhe0
coI9EfXKIbBtFcXk5Ux4khhk+MhTKmfTZYwc/RikuDmDBa8GTzxJsQqEkXbg
b4w+BUvai6MFiozlvz0rw6FpwU9qeBSizK3KQfJCxgkMF6UWK5enTdZUnEO/
pkpk83wp9+PAzChgVFw5QycwxjiEjuPE3MiI+VHUK4Yxj0nQ6HPRevWgPYFA
fhVjfqyuDo2ZNb6B0TE4tNTHQvQHnuLB3h8kKERwBqRAH8NvsMeJgo0LrJuj
wDJ3sRfaD+WyBiT8OELudnB1BhrrVkNBgoZ9TSoepLd3R9QcGuFdxTR+4dDS
SsADhRnDxxHpc88Xk9ocXR4TPnQh9mpUsEeGC+HNjNd+4IRjMbqZpdBJCgoG
bYDgBiog9T+wJpwZWTYGpU1rkGXZBQIrF4T3z/TDjjKN9U5LfwztGR/5Fegk
/1XUlS4ju5rylbWrpUeSBR0lgP6ysP0+PBmQ1SEGh25/WU2asSKrxFmAKuIX
y+JXO3tNEDcWxZiivVKgrodfNWxnQV/lK/7Uf3RKX536z06jkJFLpC2nu9lj
BX9eBLl8XeoWC+KYv/cH9uoxJghHjzjwoxy22FCfCVoAdgMW47y8UAYlASIo
K3tYizg0GwdTahfGCd20BlNznhl0RbYmQAv0M1K1jRRJ4A8yhasctmBuGBAg
DgTKQaCsByAhUKxuk2hFi5KR1cCyZJzIyDXgcF/xEqikbLpmXgjAuEA5QR+Y
oTdyq8U8SmFFpDJkZ9STwIYoDW4D0W9/erIfQS0cEISYw25KLl6Ped+W+Otx
D1iw74JuJyTnQbc17Tz7lvyemKXewdo+tLANh0ohCe3dQVKuejaZTBCMOyRk
vb3TnV+z02EEcIbwGMD/5rYUflvhv2OdsR5iBQf1AaEuLWOSL1gp4CCSfH+Q
7z5JcERSdIrZTxGJwrzW8bc7Yx6+fODREISMUdNyoaPWNMZlr6sVUboEjFR/
zl4dH/CFyUbhFXuZsR4KYvDh/4qPQpxgEt9GORZmaaqvBZ2KWvqxOJtZgJ55
lTIVFW1uaQBDR/Xqteq/zAa/DHDWYd+Guv8lzVCgXhBOIMA9yhh6t2qbhDnZ
Wqtli+0btHBW60fMHYqfZaPRrMmh4cmJplZxxwRjP9a6e/fufx0/3f38m6+/
QmQZWupuKQ6ZAu9zzhuvaU334My097IGxM8rNm0EoSaRVXimQ0OTC/nU5n6a
4cpEdIIAPanFaKgBW1O8TAhppBK0F5pafymz7lKmuX+2mBx+NJ19Rzhk7aUG
FuGTO4/VzoePVYYNhn/8HGXpOQq/+Bx1p+HPwbYTdMc32R1nJ3xUAxxTe+ep
CcOnBpfyI3ZZDwyOQc9KZzz/PzkmnVHpCcF5jvMzTMUYPCR/QPvCKcg/NfxM
QVcxbjPz/aDyCNI2OddO/3Q6knlHStJG0j5oLqo+mH2eg81pyL/mSdRd0pBd
j7HPQboOWj8G6Lq3PpSpA9fZ1WYlJiIySrFMmph+sxf5W9KiPUSiVtPWqk4R
B3MWbbrBbLoPOcT73OO7aS4W4WgmVqWI2OkmP5xbxuswnFAWl2T42w+FLier
gwR2JQtBGajlSoBiMdIMS28NINxM+4m4zhQXATc4D1rODyf7rQsrsSc4F6ll
XbE1tqy3Vj2uq0uQsgVFdSNQHTH/ulDBmJ/xxEhNmG+4MB/IwjtfyUz/halX
Mp3JQuiRdRB7Mmian6IsWbgR4/bRx3kS/cYi0B35g8nE06GxJfBKhxNnQTV0
aF/62Zr3XaJvtD3QnXVVrjbDrQZq1ZDxUHv92HYfPhgZghvjYvA58xH5Q+mD
KvNG6katgJZ3CHZNIwyNrKjslty33uMuwwVlMdFrUGvyKod5KeiAYmMbdtfG
pGBSAoSbxXpgaA7bBvezBfkhMY4mo4qZ2Yw7lmJCaC4MUvhWAop+M2QwmAgU
+q6z7WmeKHFwRbLYkBXBcgJ43nQzyAn0hIzT/urhsPU0mxUHBXpxE9Sf8qZc
0clYb+oLzSmY+XPL8z9nTYpymSXhOSnj/lGHatUpYKMIWYljDknZIs9o3w9e
vHy+/wJ2ijZSmC388Dr94W42+/sHEQJI7K0YB4k+Xq2gJKeQ42I+bbjz1Cis
UTVitkYYsOzV7On4a0HBXQTkNrCMIrx89eib9+8Nv6CNdhR3fyNWifeKWIXO
sMxXFxvCE8gv6EY3XNWcKq5egdRxKaXWUKSjeJGWDB1iLxGTJhxKxo+Z15wW
TNwG1GFYZ7R0SV2faNKSsj4p9DpXBMyzU379NMIdVDL+eIpLy5miVDiUO5Kz
gBZ8il6uryWhkQ69DIQaJM4Vv7Ayn1jDTsue2UMMwRDYmIhPiMqMxPxyu73F
h93NMePEG4spK2SSOHqChQZpsg1cv74YitYWHq5wPBKJ3Qdco19CsG8cSLTG
mEVrp5V6fLWuVk4OivUdvXPfJbbZAibNSw1E3iOzXvfxgUcaJNqHsByKieBs
cQ6gwPgJWXYbV8x+j1FmH8ZN8zttcDS81+V5UqnZ0vHSjUahAy1N8nSrbWtn
0KAG66Y5+iiN68/l4K93l7bj8zRk2UqHxmCQnbYfsxqZam/M6EfO83pDLgKn
f8ChQmg31pkkI1XyzLmUqU+W8ReH4RqIXibWsxtoTXetxFQ1xeg7iCoLfEQ+
AZbjEGlglDj25J26QG31/+vu25vbOJI8/+9P0SdHnEQvQJPUW3veC5iEZNoS
ySWp9Xg35sgm0SR7BKKxaEAyR/J3v8pnZVVXA6QkeyaWsTsWgO56ZmVm5eOX
rj0uwenrfjZmTZmaJVubAtfxPufeZKXMNjwX6y/yRkcrZPblGTql+hq16jB2
dw/nZbfSje9Zb/P5FkM550sC0bkp0g4k3CfPWX//fLhASSuOlRohl9gF00Gr
Eg2f3/3skQukfRksk/XW0oIiejsQF+RpIcpSI7KwqSzQBvGmpkAWWsuD9ID2
lREXHLFZtJf4ZYrtwmWdzimDp2OsIlPIUQZeh2vwbMxsZQQDnNuxklhPM+yg
mxc9TvAiN007ReRBnWU0g63JEzwnPRTiPWFPL/RcJhZak52ZmiQyBFOLbAkM
76Z2b4Tu1qqJDVPWmZVLdC1gSs7bZgfY08mNevxk0x4kcJdJnMFJTyWImQdb
2B5RCshajw95KNy6Trighjkiw+z7N4O9X2UKCL4XT8kx5uq6gnrsbr3gx6Pj
w+HgzRFM1snD/+vUyucbGxtuoFyK+tH6E8zXAZKWV8XxyaHHEId8Q3bBkbum
jSSDqHbKBgJK4xELRxJBvod6cMN4Z6a4tZy1aD5FE2e/zdQO5V6Dmt0RE/Be
nfBFTGYe3yDcBNxA8O4H5WfiooyeS7VqMhLTaL1hAP0xOFq8D7rFpHVDPr6u
ltTLxh6oaoCCV3ooE3MIqA2GdUibu5iVxMVf4vs2y0UcBjI6uHS3JgUhKEV+
WQHuYLur9ZBlI4QfTSvawIXqncQq436k8HdmanvgkNojAuVzVl1eBgpuXMuE
Vy+TJ1qtVALOiCExI2avrce6GewgzWBj9raUycaUlWKzXUNSRhv1SMz2Foy2
nvgkFMuIAOGHhrOevwEDDGyCbwYRWWyR1OD8QBxd6+RAXb3gzMBT8WlBU/yy
MPso0rrzAtEuA+QrKsEYGH5qFkwJ1qCdZIeDEkxAxBsXvwBW+jmfK/qvVhay
ZAQtdRLQ0wT9xHSz3DWecIqvojS3E0tozIyXqCumqtCkLtSDoAy6mbNyipAt
CAzsh0gNtHzrpvLG8roZUdXYNo1RzdiQzOjZlZRmpf8DI9lZ2rdLN9yhOsOa
JbqsRXTRUO9Kd1ma7qixTtJL6YZt0huixrGNEKz2m0OEl80f8H8PrmZOYK9m
crRBy6gvGPVXIkA/iRf5rrfcWeiVEI5VdohNnKYRmu8LiKKHGyso6mD84nie
qXW7SSMMDQsYEMg0oYH+FBcMyRrDT3x2l72qFh4Rx4zQ5CXhavWywiCJl+P6
A/DsZo5Pc2wSpvaQ1fIc62oVkF9EvgFIPakXWhMvwxIxJIsRYxbflQ3UUFZp
Aqzme8fDw73Ba948LfHgtIKuQFjX7WU5QTh1VmrP8foNMtii/AblFWy8NItu
UzMrKlrCAwafCym3HMOGWkwmgEqCD2jLHoQ2vHPUtRhJHIwBDCsrQW9dU4Rr
BgEpreeB+iuBkb5h9UJ0gru5xtoATW74Tkc6OXp7cLB/eExrpbUTvChPBq+0
RVYKSRlafIQt7goMtwekD2HbCZA09BAoWH3S9QOW+TY6LXT5mKhnOSIw3GA6
2/0BTgHFHgJ1EZ3DiYoxcJAx35gaSFGeX9aSBFGqFwZzpkQCI6Yo7B5sAZL3
zv7w6AQ2bviX3SOkvE2tiEJAX3A6fDkuoXS9y4iLS+cAJ5Cr8g32XmE1is1N
3ra0NmVS931ABmebA/9DwA9HHpJziPBAfAYa900DLwREg6uCPW+lei6kO6F+
k5SASNDliJKlKSbcbfN1MWaAeEVh5S+oRjGju8Gi+ZIz3TvuWcfSLYdAY5MC
mpDrnfv6dg/5oGPLdBS3NpbwLRA8M2JPFmIw2Hk4HzQXZOo4YryjSQBRlJJa
T8IyX4AXdzh8ufsX9Au+Hhwgg9hYShh2puLZIjKkdFbE+wHoLrFJUHZcSg1P
4dB4Sv1pf3cPair4+9oDzFNK0s5PNaXDBmgTjGYxCu4lfFYmWZBLEKAq4FZR
BQPO0Nzdo4MDI3i4lHpDwULHhKOYGwN+iGsjBRWpljbpr/4AmphvLbXsWgbz
ZyR/ioWkdQSgjnjFnpQfxjc2Y1aQWwhTnoRcOhXKCx31eGhF2nlkLzHNqQE0
40qXWofSQqaqW1OczmDSbBBbnLMP32v2YZYdyfAEB5s9TK3ZmUw9zgVez0O0
GnJvO2Ig+Nn5rCrhaQrr6qw5r3xEgqz9PtHAw9Bq/2undv3wVto15Wzs6Rkj
z4/9PnIVmR/k2a91OfRkmAqajmfc1swpyCOyCXwbTzFQwEMGI5Er+ILRaCvQ
fh5IKU94nnbMtt1qllohv7xtKt3Q17qh7kMCksBrRn7b8ABzKQO0pZLnJIQh
KESihbIL00lL8sCwiRiRHDFF9DvhPmByZMAFrmabmfg1LLmDb4ldjLmGSbv2
WWUk9knm30T8rwv1Jg03AL5WQFW4YLs8QpQO3WAoY+aq8BlJIQaBSe5ju2J4
WcQFxJvRaaAHnWIYSwQsq/F6tWUbPnG9xd8Nf4K10kt4Alng40dOle/rlzBp
dVlscHyx8d0jS8PMNETrmGImjyDDzuO7CPDd0XuoQgw1N0YLKU9CKN0YUYPs
0RfTZYBtzGCJRFBopfPHH+10dt3EBxe8GRewBRHhaT801K9HbHOpSezRHTin
L6v4hzDCtJ0sNY2VhgpJ3FE+2mWwgDsHXJnS2oHlqTh56ojDkTB+mQzI1D5x
QQiWUgxI95OHgNQLGrFEBN7X4EeqcGHWuRXAbsuGzD/AuD1YHL6IDigLLtOC
uDb+6GBdMdk4z1X1aQ0GtQnfnddNWomkIR+GQIHlfjbGt/YFt+jCpyWuvqpB
s5VrnjqRBDdkVcOz5LHkJqiIi9UVr+sRBFQiehIFFQUHVBK6BRKISPXOkGY9
KkeCokXBanClCfSfvHpY1xvuXlydAILNASMBgq3JJAJWt3WLS4PboldR9ZvH
ueDBnO43mpGpYyGdkHw9fJ0XEGVPz6QywlSu11vi4+7BDyzv2qgVXM+8oZMK
kfaaV293eVI4cqTchirEqwU8SBP6EK27k/Lf1bNMVh0fUWG7huEk5Hd15IAR
x4HgyKxAxKgvggCN1QMypQMIMNvD4GciVy7LirU0wYvUnprmyOrgZPSkLcn+
MQ60Ywhh5zR+rzO00q+l/k3QNkemQ/B6RjGMblSXxVTvqy14tW4QqOTGIgyb
TVXvAqfq+URcHx4I9Fg1DZRGYQo1VEkRmAxQw6ejxxXMklXsWoNjvROmwMkb
5W8FlFmyjl8308xg3kUOFI8cyuTg99toAD7zL+PfEdvPP5DUiIux4wJLIOQQ
HNYi2FmWTSogTfTk5WD39RDLErwGV7sx43mVU3JZJIs9SDmXfBF6VPVnKMh3
imdNSh4YDdAUXIKkoLpNUTm+LoM57Tmeodgjp7Dop/GWnSbg1toP9TCcXOqF
INJRZpEUj00tlesSvq+aayItKIEczELyyEIJ0XFBVoyUZfdkpb7OjOBbKX2B
SPrj3KSx4F16IY6mdut7ccdcViqOdBfu0A7XWmqliHSJNkeSJxhRDOnUIGMT
zhHXp1kK3+XaWCL2An1FYdrR8Ub+BLsMwZ5/VUULNC0bY+2VLOBIPELUr46M
eAIujIM9Ne8GoeqFwV+xfJGrBGZcJTA09vrAa1wgNb+jdtuz7WjWle+lmddT
vbdrORgDY1O7zTkbl60DG84hdVrtAnUe1FTAS3gSO4+VWerUiUp0f9tbVcBg
pUgjVeBTWTJiD+zSq5WvW2BIhA8CRxXE12LoX96J78Q29yACdsd6MmSfDav3
uv83tQw8dTWxq5N+Mvc8vmXLYLqDlnb+NNvkH3hL5/mnKClaga9iqmTrt7tV
eIPlcsPiVzVQ/s+88ctG/WGXfYglzP9JLvuD9iJQ1KKsggXFssBGH/CYe9se
V/pDI2bCEBrowsYlecrVaKCWO4ZhFlL4JwA5rLiEG5fQSlTDLaIkJ06Zz46O
9w9OjoZ7O7t7r5wOWSCYr71AK75x89kG1CxCB8SoKHfdgnVC3gBVOxG0k0Wj
x2cKLCeUXCxoqgyl6jrY1AyU9ugMNqi9I2zG0Os4IDKwy5DmxsqeV9fX5QhW
dHzTE3l9w/dnU7uB1RYDTdgSST6kMmEWMi8m5JIjMgUPpNVR021YiRlpBiua
FozP5ClWMVHhIRPEEl8djFhaavrdHP4R4ZDdQWl+GVN23vaIb6uPeL52Oxuv
aBi/f1WGQ0BTA80BYLiiMA6kOAPsvStG/vJErHWqMi5tKGoV+W2QYK8g3zcy
0hA6uA+OkGJGAS3jxb1NzY4tlR2uh1P7apQtSgxBqn6DGYPfBzPnvnGIt1gX
33SO0EFPQY42B+6mpVxmWBuQ6N1UOf9AFk0O9PuBY/aD2UrYKZsE+ERmAjZH
g+cifXA8ZzNg9Rzpo8ohG9nAbtjHRwxfoawNSsMA1Hd6qp6WGDnB7NxUqA8a
RtFbzdk0K1eQepIJl22u0DQrMghYbKp9woKXqkVgBrnCiDNCdt+r5yXvAtau
D51UysNGLODJvjcpaea+VmEvk7SIQgu8ETxDOUfYG3oFhubDawgabzouwHc2
Wqj5Lq5GSZKaCiqEAB/BfmqleXBbcg5KgXyf14EFE4wkg5H0tCj6pM4vFjOk
nZHqZRzQ0WMtIKTSALYwMH8F5bjRdOiFC8SkOiK7SaQkQ41TSiTPJNgQJSDW
1AaW4paKZqjLI5GPTVBygraIX8naHVEepZvTeUc53rMb2re5JSJJSsh4fcXE
iyfo5e5ej+JEsFg437cpzQY2ABLepSGOXGV8JAhQYw7tGkludPeS+R0nnhTv
Ai5mRQAWPpUpuK4LvT8gs++iadPVGuOP3mQUJxzrjSF+aUCR6iGH2rCwvGQC
nufjEuJhqnnTonU4GwDoGx5HEDLkFKgmTjpA4WY6Llohimt8zzJ3DXrn+nPk
L2QRABpDCWFH+o3kPvKwKOEaN9Ne+l17VRhXlyftJ3UU78O3XyzXqOGxiBSd
cahoxOx4k5vULgM+L9IRnFmloySgPBIXHf31FpYzVk8G1TLRB1eg7GXM3s8h
Vtvt1bSGTLQKEQHIY4bbhScDNmiMA+TZM/sygeOtHbAxE4FyXk8CXoXsGi93
iYq/cK6qOZ21MrVkbUtTKKtTpqaAcDvVwR9uZxQ20lu/Qp62jRVob5G2cJuY
qGqyxNQQTORPt1p9a9eAou6leAR9f240G4xhSag2Oao23JpfvqC5wDRp8yxB
jik5BYpkxlJYDRQt/ct9d1WOp02oA8wQNZ5ZxZWpAJvh4aQVxG59eGA1aXcB
AgYz+GetUWee/sO692GBAytRxVkyHicOQlYLA0L7hV+dQBpRaJN3i8p9k1Se
q2JkS3wc+Jpt36sRJ+k4A7YfkD3clrH1yGmKXjgMI0eVo/0WBmeBT7A9g3Az
y5atpXsoW//vyVbeh+u1N7A3WZDpIjIJckFQOUq5qRLclGVYNE0Ug0C5kiuF
rrEeKRtebzReayeICAr6x+FgZ3iI8IeC7CcgagR93i7U7sFDsFK2kRph0XDy
MHqTP9jpzErRGjrh0ZUB3lUXszM7ieQe8joK0LIHXvOSviAtKeQwkVbkDZsZ
RrC/+AemCokuEVrR9SmhfMpx1uwgNAY6qckR/VGaRtAwcW7lRhA2aIuNaSM+
Q8eWTKWqyxQYOULFbWJNb8HG0Y3cdfBqHyLoEcVDE3Wiubvlsme/WcA9JYK2
8Xk4Pvmme3xyTkMqtuVnwPSwf/JycHjyw/DH3T1s9Um71ftN7kQiwXQZreas
1ARNvyFmRgyfhnFcTUw0YhwZV9dVmNSk+SlPid4601AMN26noZAkTiaiBHEH
0NEz7KhdrYbgz+qUsPJddMWA/U54Zhwa4m0oFMke3RbEg+kDSaK4MElRLHzG
D9+1Mi9WaxOFhdd7PR1aVmJ+BSDxmDcIbWBJVwuchMrZJ/4edLzMHVX3xRHA
6BdjsNlQGVh3xtzXh1L1WPM++MeH7sfBWVOPF/P4xwCCIC7z4Du2cGZuDD2I
PYBDAm17P0Eba28Jss037Wm4baAuax/ExrmJeF6ozKKj2jEVfZ7ceLmIV764
RVsVHohGysVJoEX8+Mev5MCLgsoeyL9IpTZRVeYn1qa/Vuz/Hxv5H06Q2Wfw
HYlXM1VNrzThar6Skb7GBlGPRAhgTmUxaWz4+yUVi9DcW6l6GhJ32QBNBF/R
tSp0zRSeiPRkn0nov1SQiy4iS/1n64Et1vqswrGg9dDptI7EsZ4976Yfn8nw
aSUwRETSM19kYCgJqAytO2KTpKoc8+pyATF+Gpif6jat2ot6F1E5ggHkhfAZ
/R5BUPSTLc0+90GotKXrUSyJgBLGKzevo0pAF2B3KcBOeXMGy3C2AKenqH/n
boELR8peM2cfr5ZWhZGA1SCXslCeXScoCM1oU9gMdGt9kCpwhrL8zl0xTBrF
AhOyaWj9/1dfL09D0ZrFmEy8wFg16OVWWu0uQC8vLU4pF5E5hc5IOGUQSR7X
6iqWFAv9+DEsLvr7WuqylQXxk8lsFOuEjXJSEhuxlLeHzwJjl2/athD5hQja
B+M4DtZ+qcsukcSdJM3MdfG3Gvgpu/Vj5oDCNhywrJHBbIDjC95t1xqhjs9k
Qenk6QA87SVySf2Fc1a65YLosVtvRTv59NSuES2fKIl4yOEqJwyBSFviIYSb
XXpWAmYrFQ1S6UWgGRiONlylQ1S/thknGhwvVNY2jmBnkHOxfPqli0P6LYiI
wk8H94twBIh1DgZFOW4+d5ITqEmHDNLdCYDLs2D4EXAEOUd4Svgb8VWiS4qI
Vz7k+G78H5UOsnhBRMr+S775+3r+I+ijnmhaq1eR178p3kvhU1pK5XuxeWE2
9+nnQUYTqQ/gz3pBLLfwLlA+zup5CpKXffg4QP92z4vk1amb1yn4aN9bzyTu
4n8vKjcDEDgt7VOqj7sRvkRvUlqfjlmbrn9LHGYfuxd1neKj++HhcXr179L9
pENlv0v/qcZRTyLSkSJ0sSmaljxlgaZfuiMRntzK9mzuFfzNf5ndeBDvzFrv
r/CITOZBsBz049cKj8P7YMpiHUz81qFxfqJtfZuRRHhPxS3u595T+jMSyhFG
TBWij/NrL9qXIF8/W88YHl2zDVBH4LdNw8xfxFzmlm3IrfArx4BZRoiMuzH4
Aqq1k+CqcCH5N65NGok4KUvcitmmzJaGq10uJtWomlH8RyGOH/U5iJzg0vMq
A7hR230oX9HXCZ6pgoKuMAvV6sVkOlC/Y0IYiPCyq1A1rGFhJDMqecYVhnUr
FAslKgkeYzMwqJv/up6NfB4bFdbFrzQGstUgs2vaZ45AQA9aTgAIWXJx3VXQ
LcglAGVwS74OKcuJ3Z1WL+KN16AWtYuRzsRZ3eCef1Beoui5QRMYZXmTjkwm
2eyUu9mBOEInqfIhvHcKxYiALQ+ac3ZL08D2cWEIRVX0UVzDJjsr5x/K0oZR
mPXk3CzWvOnnWgQhCVWc07/m3EwWh33wz1Sh1feEIjXVknbGoijDCXyn0peW
Dk+jkC5qN2CnFajnC+EFuNqNcbjBjbnA+AA085sLCK17mtBiWQaOElI2ktTR
s2GQOEZyOghhEve+KguiTJwxGqYIzliCXki1llgGU+EUg1LIZNvylmMVXOLB
jFOGJwVRO1F5jcMVrAOsSuKi0FI5dRw0j8WE+KI46rOOoynchwoX4FglQkaL
JyIli/ceZofXrynG/oA+hlUj5z6qJIzKgSKVaHCD92kw9xvxWPiqoLuSxcbL
SkwIzLRB1xKKFrJA3Bksg87GhC52ABXAwtgQSnm1qwsFt4pq7oNWs2gT/R3Y
syJ2YfkoGk8hzG/5ZKT9ihpmTMC+blwXZHIC9Y1OSZi343hDA+xdLcZyPpB6
kEPPE8momaC0zqNszEDbJweiqbeGNz6Ue5zcKY9maMKN+sEqml5rgM1J6544
vX3LXKk68jy/cdvoDQwaXHxWhjciT/luhVV9j+VSp1hqQj41N2K2h1YvuqoE
94qCudYHyteFO69kWQVriEQiUwFiyaxTylF7tGiuqyABEho8DQ07WD5hSc5Z
AtkEh9d1Hc86LSMttzZUdcUdG4mtq7WmZERFMd5jrSkrVLyh9iCf1vNfyIuB
FTYuqYpwEPjEGZYqo6ndf4XL9SUX1BaupZkX+AhpsITvnyjPbb0RyGCYe1tm
KHI3BJLKYnYY2j06wVA6QK44rly1usiH1A3/oW/E4eSRUDAIOMpKgo0VfGij
aiWEivXNa9cRimsvk5KD+oRNWcHN9BkAwSmBekWwquvmPrg8OP3Z7QBTYWIX
bMR+8GyZo+RrpkPJ3qUC2eO53TZAib2GXwBUYhfjRb6JmeqOeS0z6Ypf9FhN
uozXH+8eqZtwyEJeyy9ucOW+DvcN23nlnJ3XLEytrUuIcj2ji1A8AvVjjAL7
Qp7nfYnq8UyKmgyaAPfyWXlTh+oskWX+QDJDoL2cZrrGU+21hvKRX17nwujy
0ZjHdFyB+A3XLrqFFlCUT7RtPaK4Vg0Nq2378nedxChR9q4HA+BHN3h8+3MO
/2y/3X45Q4yBWZn4CVMV6AJNP3q1IHyOPQgQI7aYYx2Z4GdvvcXL/d9IieDj
hry7f+6ttkj2ud980Bu9j/+MrtnGYVHNJfKeuNFYvDZzT6JwyHiRaJF/l8it
UI9iFbwSrFftkjfQteOpMZijLUjHCidE1lnl97p4R3JJtGTfGlUDouBwT0Tk
jNGMPlWuA0FBczDWclm9eCdbiC+xCiNZFcYcTuNg5qGxv59VQuerIv4QN94e
7G0PX7eE7zkkWY27kH6CV4M09CCqI0qJWZ2HblEj/e1Ya9wpW7zPMiLb3bm/
HhmcODxs6q6ZUzBF+DXuuAFjjgrGd2aVKnXX1QjqDEJIqbH4iDrUDjW2K5IO
NQ7WrFu4rwbiXyF6aecScjfs+m6yNwFVGctjN07qekwKqKMwC1BsKIyCH0iJ
JBVP4s1TtHZqW/EZV8n8JTL1oWfaFB/k3DLrG+e7N7qfokg7kNx23AZX7poM
BR69nJmo90Pxw8tuKUl4nGSPCFmKGTzao6NnR1gSjMzlnt5jKF1rED3kp9N5
kMPLQEMjJ9lT6N6cezBjfMPJjYE3deywGzRHjcjsSU+U1tC4CLxKG8ZVSS0a
shqWc0reCkP5bBa2ufZEyIqhLZsj3ILF5WRtyFeY1dMZQiIk8YXcPoG74Iam
BAS0NEQFbxOcNBz2yIDIXEDW5+c2mCIGr3VhMzxwn/7Gde6CZNg1KEEUaQTa
bh+5K2HNO2bfDnRRdTLknJnHZ29lmWnUvNYGaiNGKUSne7uNuOMaMDk2YRqm
h2oOcjH7k2Y11oV5OZVdPHoPoUCNXGznGQaPEECAN5JoRGEUA7QEEsPmqndC
YlA/i4latC2kts0/8ZPolAy3cwR2xdp9RbQLty3LMlBaU/lzYC8MlgSF1X1t
dak1v0T2MCwNJw93ke1pup3TNGaL6k9NhqVn5yaXb4YqE9aXbGFkM+WZUg1S
2ZJWOdtbRYgrUqKeJ6gxRXurCAlW61bUlMhs+ur0ktzlloLMI1cN+Tjkgqy3
TFI7Lfphe68zqyszcIPJ2Fy2y1nnLuerd3mVPrp9y32+e4meVZRB63s72kip
tn8AN7lz+R6ag/hCmB2AFadzCiH0jG8OLxShxz3AXwvrTqF2jpHnXh1qdXmH
dB0RaDQfvudLPmA7YyeAk00Jd68Tq4hvnaBAsV4h5YNrp5a1ChT+Eu9pCDgX
pMd4CmhC9BCoe25PHGYRfSjB6d8wjjUDTkoOLHTSQpi+hWTf3Pws0X5AdTD+
OPj9tJxfMrXPlfQ8FYhzjH/xUTJ4Pr3G2zqhpNmL434TN/PhVqvBl1U5HjWS
8Mm1RPD2irQBV6lLAK2cm/h9Jg+yh/Jem8I9YVUlhtnNI8y02CuuN7e23iT5
KljtMrcjeHCPu1k/r6/v9fJ71yUCD3y/ufUQPk7B8XleTYvJ/PvNjY17a2y2
vst7W/BeL7h/+aHRiJY2t8aXOcJ2PKvnV8uqTXfTNZdE5fiADcy+C72D7n/a
GwzBcLjFn1+o+mtC3wRaIDtMTcy2uSa7lQ34u8/ITda0aZZcxhFS2Prz5V6q
Ac1tojO1Kj0BIrXiRmbq0WjvFNM0O3uD0gk+gc5an2ca6xCz5SWHgSBkm3aw
phMWWdvo2m4pVUWJtEp/4x8k7rNgcs5NJLHRGUKVzMZiaSH6X1pluqvOgPXU
RrM9ZdnSN1eOJuF9dxqvoWY1/aa1mr1E80MPZJv15CaIMxnDDrkStqTTaYva
sUGuXR9ZCto3Zq2X51hxen19Hmt8EGzlXIataRcoahfQ6rrzeDoxB6EO8qwp
ioYiFsG9XE0s/kWjxTQAvAncQv5N4h9cyT0AE4kygrMCTzd3S8fEGywipYUu
Ar5syu0R7UgGSrBBYNLFWBkFvOu1F4VyauBEcEwXRJInSRiuMyWhpreHRgAB
y9DuPMQdJuVTklDmO1WD5xcNMZMsrOQQN9Fap7c0PHgUuX92Q0NSNV9ey7oD
9iMc4KSSjDC1pCCnk2lPky2cdmnGHjQjE39MGtcmUWuu46gAibTWXEEZNC87
0qSYQS1FBrbzWYERfCsV+zbFXJbiBfedMFiBFnwbhTjtZEk00QWvjRTEOf7s
bxG/mD8JSGGI08GwDsQmPPrqx2/AsdpngIhknI3ERqhsjozT7v+CDiy6K0aO
dTYTOvexqdK2BXLYcYzIXYerLYgWlBnLahyUjQWu2B/T/rZRYqiiI+cHmMBV
R+w4CBIvn/r2L/x0m79P2SfYU/37RDR4h79P4RhefHrxOWOAOp59gFfGMURw
IkhWEkNmInu7xvCZ67Dx28Zjvw5BaDHKoiiuePk6fNYYkIaQaDy43R3JJjdk
gyQkLbWIJer8jotliSZaiDuQULxowd+dSIk3EIho42kPCoj2tzbhv4/6W4/d
mChf9WRncDx4dTh4AxtKfvG+LJDs6dIx3XGdlgErTEyoNp7s2mMa0g6GN8HM
1wEdYsD2MaMeNarC5/eXhSvfVweYhFgabHwN/bt2arhHi77wDU21IQNnwf2i
tMyW1poF37r3hzo5Wue148rXTnd0zUHp2Qt3Ea1c+zc9A8AdygDFz5aCmhBN
nE0W14hwo0EXs14+K+ZXpQl6eblwR8vfSNZDfHXIhr9y6wyQVxEYEgYUm6zE
ID86Ke7qd1ytj9UM61lXtNo1E0ON1XQZtBTRKiOxdYWxbuXEC8/13GJBCar1
rMQwgmbBKzn3OJLupnH+DmAfGVnPzbGB6JIPxSQoh2OWLUNfPrOU67ygSrqT
S0k48vRrVpL1RJmZ1wzpsP2OJ2Jf4gal9quPhzcJsWc3YKbUwqSRahaYNk3K
vdNiC4Q209sV+pIxHqZHKQHkCBb7QjU3ZVA1ivnMoNs0DCuxXUzqCcZQ8AQO
PGrDx2+Ym3gkB9RQzvWdN/W/y3sCBuBLL5vIjxcpYyMM2MJ2HEsYHKlQHIhJ
+wM3P7RYvuKQ6wD0viJ761xTG+43/KCcXndRHvfx9AEZ00nnSLBjDjj51od4
U+OUGcbtmvBrdvEIrMO3Jqb7gAAxbxC+6ll+Vs27pJkFPWIYTTQPZX4ScBAF
YbNsBJ9kGTPEbkvkHBIGp50ConPRstf4SCoyrxl2WFDq9KVmqQnHcqTlcXs7
OK8GOnBKUzLTRC4oDH3iA3zxpsGmFqa9G00PMtltTXXpuvXhaJr2wxA6vFaI
R59x8Ge6DIIBC9UO4cJrTDYY1z+RzckoXIiGrH4iuohKFSlNB7AhzkxPTHW7
k4gv9jBbgMYt7eDhLc7P65kkRkJg5mmLEjK/tqdSUujytudFnw2OjCioUL4i
t9SPx4srp12Andei4XMSSnuEZvehTpB7ZcdrckrbBF7ZImbJStW7/7W7gcO0
JVoRInuK2TumKQY1kFwQAYUlTwgzNo59+12RGHQMw9/m5QRt1HRZZfZUzx3X
Yz01WEHzwo+oTYMn42xcUwEf4vvJ9huElaDEtXOTPtVu0Hv6ePSltpGawUFx
M66LES5jPS1c+/mUvkKeBOCejC2M0bUGmwYhHUj6ct6EwlNSphPa1ODIAFgM
W60wZ/p+sIP3YYP3QAaMCddPoC6Cp7yY0UjEY7+s/AzJkiYw4H0AhuCxyGxe
FiODCir4HLJiP4ABkIDA3XRGi3PEbZ9ZWGG166GNyb6dwYMmNL+LvLLslEZ8
igoQGuO9RET20KAwdMuRv/heVsfz4ErzEQ2rEwxoxNL4ezmrlQQ5ClbvHv/p
fuwHPzam6DOmY3INQu5Za9HDkDZhSLsKK5HMF143D7AEqPRRiVzzA6IcWU4H
jxTQebBrEWyr1ijGRfENcljxWcmR6Tz0h+HQh7Q/zKV87hZCHJXt9DYfWs9/
/IpQSpiz3Q6EFrVE7acsJbQ96nuDgP0tcAcD5pm0YrH/WhbLx1Gb89PP40wq
RJWaCIXSwGoNXySRKTTsG6wvPMi1F5F4HeJxDJT6hMBE5aWCqeRs5T+7/qjV
qqjmhdQ7KyRoRpYRvGqjUPENslRqXW+RklKGFKaLR0m6IOmru2ZyQwwx8M9C
An4slc1IIiuGyQ5cQl4tqgjJq5jLgrlFsWO7HcmGw10+StjGkN1AoU07RYst
468pvjI7oUN73dfUhpIoFawnGJ4nNvlonkZYoNWNxmfFEfIl/6Uv4PZsBBxh
EKGO+Ufw/kf5WQWs1bw+r8fsTtNQWvZO86GDtzwawLLKvmDRo3f78gbmADli
HGgJImnBAuUaDEpk77iUKDzgJF9PnTbKsjsSobGS4IWpUQ5oPewOcN8sA1RS
6Tv5lagcUcRApqae1rNgQA7qM3MnNq2fOkxEBGS3iwjoUo2Qhb6vCB4EYUzR
6YelikD4kgGRai9RP/VFxrFD5nLNEMauAbRXilBzEsypHAsuveGXUt9ErSJT
rYowa8lv6EWE+jEQNoUG6OmyKWdVMUafIxRtBNiFUL8U3Y0gtaQwS7wLYEdL
Lo6JlIB3Zph4w4ES7CyFlmflpZstZj5WWKp3d7A3yOfo6/z4sSomxe+/41Wx
KePXqQdvqoXmFOsStphGGNg4MLxtMWZnFWuZTlPqUYHySiDT4GBT4s8o89Y7
txla3yMcS4AaIABEUIWumo75liY3sYwC/HTRYLGQZkJQF94GTHMwEURcyqQh
21NGcyEYSqiWzaaae81iCjt/j+Su9CW44UgMPjWEH4bVj7fXn5yiadzNqDUn
M3ryQoPPDJvzhIjD7yUOkc2UpvUHFZlvoYI8wdQZ3X5gs+W6yhtEHdJJpLGk
R4LvmgQLvoMzJTB5BNjSc6zSc4HZGniUw2VNTs0pRsGsihHWbSIU+RFCLHyH
gaI4STvwpTwnPLY/lzf9/4CN6B8U1YxrK8JV+r/779xPuEf9qfsJcSTJ++pX
I7xW+pazqNngQgmeUnOXBIdre6Qhqu+wxbkpdJGRIVmQEHZzgUAilifA2AxT
uO84ZbvH++sZ3bOZY6D91HslwY9Op6oOVEh3at6XN8x7vJOHkq2taZuUwwdx
0cpIbTHGROnbmhO7ZZvvW4N3EmZhBecfzeppbt1SEEPmYV0YsVWucfnZrCov
INKmqpE7UGU1t8yCGuEztCSrTiMJkOeoUarxpiS1VHtTtEY2IifPTyNvkY9P
uCJZstyglH+fn8oqYoxRLblpgWax3OYTNNLzVsKsTf9Em8gcrOgTSDJlPI2l
k18YtzEjQ00DfhgooxZomb56g+4XPqjxEhIgZu5xeFGFkmNuq6esBVIq2o3e
r4F5qwwCQVwghiXpGwWCTVFYigmPteZTY0cWmGNvlMmosBaqad6TlZyI09oG
o1FF7nooKRlzsEz4woOkKWlNjiPySKBQ9SQ0ZEqZOunj/jXDElcwBVSXJm5O
9QztXZDd6LF9YXHb4gLp+6pAWzObAjJKPF+yR2hzsUmTsryIFSbbI1iQYsCQ
JlQ51vsjnpf2yTgHz1VpfJAedqywzmdgmLETthXzAu7blvc2S9ZC1kufgEf6
Gxt8g2CRbW8Doorgb0YSIE//q2mDLWnaTmgmlOd97E20VKmYm2jq99h0h7Mn
1c/4AbCAG3FukitBvFsZN7Zuqglsbqj+6tsmnbH1Vsau+k+CNUJr+slaXD+Z
m/Anv4wHPKBPslbf6eqIJ979tlfL//xaNvq/0YObqWeST27pD6vafJhsLvno
o2CcpuHoucfhr90PPgmf6X7waTSwzie3uteSV5+fW7KU4YOdkw4f655z8NzG
s0RL+M9oxs9T40s9OEj1mXrwh+RkU09ut6ecemwn0WfquWHikdRzL1NDSzy4
1bmG4ZZ0L2H43PbtmttZ3RxDAImJ8gWmjljeQvHC9hlQJO65tu5ZQcYA0nkn
5g0ld3nWwzzmBYKatL4O+zC/a/qN6ypIeki5gjxiJ8Oyd2V8hFpuYjiFDAct
Kd03C0gM6WEBns/FU/EM2a5Q61vyKFnVDH6MHZCA/B6qiWx+FxUx2e6vktTQ
bhiyiGRJIDdtQqmAwcMUChDJEpxFS8DwJPR7to7ZLubk9FCKcuRYMRp2QgGI
r8ft5Dx3cXDNWX+2SQWQ2nu4NqnR6tLoj2Ke93HrnOftVXVx47a9ebSsBvlW
XwN73GK+AL0VhvsbY0siDNC3rUOKEpn1UBQ+wf5Jo36IaE+OKCMYkich7BEv
nrOSY7RVz+eLCr0it4aw03UuCQOBDfMbMTVBi94MqKfPOwhNQ3z/YX1Jw4ro
BiGm4PSibG1gFSOqZfQIJ4xyb8msEwuk845mRsFQHG2cZeY8mVCjWkulcnSE
VNe7hEn44jTqPiWg+h/9pa+SSHMykBjkDsKFhyKE3vjCY6TVwqwmreiH0c9u
nc8hQ2TslOVqvVwPRqXWfR3Zy929NbE0eQSiot1jL2Byxs0QOwy6SpoM2ohJ
YIFDP9w1oR0WFJgtWMdSzTfCcZHFlDWkrSWa0KpUVFmQAu64qoTGpYO90haS
IAbCvbL9jGL1Si0AfA5+cwzbzrRKI6UhQ6ib9akZJORZkMAzLGaAMuvdJbjS
giPkwWjdlfecwo0g6MzWIZQC1kK2CBJJdbWzkl6DVhfzBhDf4jomujhCjLR+
FLasQTsTS65KzHSnNwBukWf41FzxTiWSNDJZaYkaad3jwLoW7suNkOJcT3WX
d3dOwyfnV62KlYo+mpD+ucKX3sbCVZy53hFit1S4LrCWfqGNK+sSVUttXLmU
26I5wfigsavaCSTemgvw+UjDJmwj9jR7KFB7GZfQ1MyIS+gVCl4DSBngSxcj
iO1pZUGSbd6xLQxQciOYUN4EjiiTEUmBqPCMMbwpv81lzMHAZIvprhtAxKzw
kDhkHkKwaNqBeFlZglDmh50tuctKqJhqlw0KN1RjUeIQOQdap1t3sL6mUIDJ
e+Hs+2C52+lAG+vrkCDRu6U5xAS03cIg0rJlkEztSKa3IwVLhj3/akoljxCH
tlPtWzJ7Rg2civc2W20QlUmdBhUUneDusnlEfb3QJIg4jr8d1/9pyc+tt70p
xa573vqcx9aVbdFW4P5kDCySisD/oARxY3ZBJ0fu/z7pb/hBb2Kt33KT4fD1
FwHolG6Qwdg28vAveCJ6nG6h5vMfOtrNW43WjOgfOtqtxGhfYtkIa6X7Z1nb
h7ca7T/L2j5q95fvfTeIKOGfZW0f32q0/yxr++zuPCEY3p872ud35wn/wNEO
7s4T/oGj/eHuPOEfONrtu/OEf+Bod+7OE/5xo3345XpC9PYfOtov1xP+zNF+
uZ7wZ472y/WEP3O0X64n/Jmj/XI94c8c7ZfrCX/maL9cT/gzR/vlesKfOdov
1xP+zNF+uZ7wZ472y/WEP2m0WdrVHNhMrM9ZfW8tF3PVZG2bNNkQwYORKhkW
Zm8qsJ1YlZP1D7Wo+dHw+OTo+HBIWTv288ngWIqDsD2SMNuyEPA8mJp1nKaX
xFqZQlOR9wK3vHOZfYv9W5M4ojAwuAf5Pxv5gwseTJMhgMvmJnvQNp/1N5+v
5aG/z2MHBZUuOddgruXc3F6pxd33gOaP/uZD6WHQ3/xhrXM90vEC4g43v6pb
jxITrF+5VW0Jl07eFB9wuiehxCwVmHCrsAQT8mUGkkmqkqyQAS9A4gvGSFVi
uiIREMSsawE/2xFvnDNfwxH/td3wMXicIW5NC/nseF01T/eg5hTXzpyWEy31
wfk9Bq/CeyaDzPZTseefhs4s+KaHDkTwelKBYqnWqJ6FloUdXewT75JFyvSu
dHEFJ5KJva8fEphp2YLwVIkcYJpyT2K+XNCWO/g75XheQCktnL4Ey1L+Qvm+
ArwPE34ySbPaC+ZiUFsLalHledhJFYWZcK9YeuR+4zlPFnL4SDCsh9i41vd+
wcnnWPdFu2kyW71zgzJ1kWFsRJAGfkzsbM4HmP4CifsiBqoJegeTpWAwQzjM
fW+C+GiBjobkn9ULmz8o1y/XKR29tWiN5rCuZYvJuGwaL0MKPnPmrVfFFBlP
M/HZEpLUgcgcjADTr0b9y2JKWafoc/KhO9q5+LBSMbppuouCgD8zgFdTY1Nu
L1k04QJ4aMD7ReAw4xqjuPUxjfqwQD1IGvWFm5U7uXQGwJPMpM01qH2BnPHY
FxJ2dKC8tZcT+vFijBEB8jbUVygpXZPShSRLZz3/97e728gkfinPNKwmE2g6
huDnzGPOQ+TIdkXmQLEzXcymNZRhiefbZFq96mJWQhrSjSNVrFlWL2YC+klT
d+QEDuHQNXo+K0cVZjUhx6ToFXbkZhylQr7VK4TVlhK+8SL5HWAGg1PXwllY
XigzVYKIA0subaJcmmXMAP4RVE8Dt38Wx/ElKkzb8VMx6jDWB1XRqFA7ZuvJ
1MxkMpmMhBBiGvsqpdOdw/+1299ZH82KC3cKy/lFH0Ch+o5SCFKOWu1jLWSn
glzMECbr2BY17+VQMhTgbp3kH1dOaUMaRpQGn0xDOTRBejyXySNHfQOnnMBn
jqvr0jE3iPtMxbYEKFgcR+OaNviVWr3qW5vcfx8I5LxCpce9InIxaK6EDvG1
Vt2f6/q9JmSEmw9a+SshrkJphZEDZgyTFBXYw0fjCszf5vsCwFq0eAtPlQdA
zMP1zooHcreSw8miXWaA3xEpn7K3J5gQwjFTvJmW/phdN3XrYiJROhg0k4Vw
1cFyosJ87uQPoXcDBM+C8OO4vLeNzECRk2Ggi8W9RnxWwdQJAdOoRA3ksds0
eikYUbrbU9A8pxwhmlFriSSKx5bTClfKTTw710LpwrwhNqceU5XVOpw94axR
iAyFnEH37p5VzTCkbCBnn2JPSLvsZFxy7YKLKUZRWBaW8a+mbLoqLrt8OTgv
oAao30ukMhMGRmj3vM+ZdAUg38CjJyRS7PgQEEbkkgJ32CYlXCqD13AzuNqd
xOL5OSHjQtq6nOAN3DHjgHlVPvoqYp0KgsKsEt+VQWJAnl9GjcjC4l5FK6Cp
Fv1Z2Kncn7g9DZOb0H7F/FRqUAeUo7DP83aWqj1rzFg93kzmjs24Cc+f1bcW
E1S+ZXJIUyTkNRVZEO38tQXPpUfQjy0grNYhsjJSwcRpcIH5ozA9+nTuALEM
8WrCGH9sp0vJBsqCuOACcXQ1281g4UGxs0XphEr+bVvBT+J7xKquxNUSdrZc
I/JcDkrU8ociDFvSQFGtvBqvXCG5DNq13I78ykMrJv0uasKQG2wzNGVAbVin
x4HuzoNiyfYy0an8J25ViAtUJ288JjzT50sG4G+jGk8dUpKHbJ+FyfiiySbJ
QYOADWw/ca+WYQ6ZUHi9dSMzeI1Op67gEqSCGyBZPgBIBCL5TBRryl2cJqNi
dtPjyM6W1AJGz6+eO5KcaO1VWGbQVORGgFc1ZkIE5eQDoUXuZKhSKACVDfGl
m1ZPwjvriwvSCvxyU9truDYZSJ4V6hwgnE1GHvzTD8hE3U2yV3YdsAyg6/Z9
XY3ctuFq1JQHjVccwNAqr91oWG+BeQqcmZ+m2EsBVgET3cPiMFlLrqkxTyOm
CdNY+GJg0UFuz7ALTrUGMSE777tvBNgP0XONiK4JmRB2UIagddIzzLxQJgaS
ARFuaORTHI/T7/YvRJujTxRrKa0x2C5ckzII6kZiidQiVkKkRq+IVwqznjPS
66hHNZlmePql+VBmkpiG7GIPv+NO9Viypo+cBo43wB4j08nYtcJtkOMvacKx
PSBjJCWn/kU15gMkL19wXra6x8Zzviky18XLlcwAJdhc8zs8LSimLe0KSkNS
js5KLon9G9aYE5p08z3wUBcrrztuDYqJwq7BKLT1OljyWD6ZEOixyCiv+Qj1
UGOmXk3mtbGQHGwGtg8Hd4eGmijmcwAtotBirA7PmRQ0T7MTwMIuLiAbRqKI
Yau8wUunojzLKl3r2e4cgausCprUjEOFBidVt50jWJUUaUbjouGtG9XMgoER
i6AoaTo9dMECVELcDXmSBidyJqghIaqc6MNHx/sHJ0fDvZ3dvVd0W+Vw7iaS
J3wGkYrBdOpVEVtPwp1+KSlB3KWjSLctN5OtZNKOnSVuaEDzPWAGBhlWtD6s
9urTFSa1Hxbvr+qnDZaB5ztkuG2eirPwjldhOpBUEEBckoW7tVTzGygebKeD
eWl2jWsDfh1e58Q74g5rwSkkuKsBOp7nJAIeEWK5juHOdnmVB1VpiB64Prij
97BJBtwDhRI4P1ud7bWEN40sJIpaZUoeVpOYk2Qtb50ps4jQoU413d07Hh7u
DV5zoSGE7HyRIYBoJEUFbok6dUOkqomvhzvw1ia+dXxlb5pSZsJ1d27yjxzr
L6zpoxfWSEfrg92vnqyzJ2HG3GqtvVsEghyAi6Mp9UgX8s7LuLF0F5SBNQIE
ckh6IkAzqK/uFtlNemf4evc/hoe/nhzvvhnuvz2GuW/p3OXXXH79+FHwift8
mYZieQClh3Yka5EUlT47Gh4d7e7vnWy/3j+ixX2oHVgsZ8o/qxopSAIinLHi
KLXO48MFJR/Y4FJ4pdkn6J3aahGnveDuHMr0IBMqo0wov998TGgYKsXDRClf
iuWUTehBqYpW4sjj5XVj7BxTdm/bOFq7EaslumhJgRTR4C/mLAGCobVwzzPq
74X3BByxi4oo/uW4uGwwQwWM+EGKy187c1y+Ag7IH+ljoPVOLTRuesu7AOSb
WhXyzBFfYmNy8FSAIsOccf6h5ps3CGEE4AGse9CkH7w++qFZ0+I+qQ6h2FkB
bfTdGxn1j+LLDgLzvbkAotWrKCnMXQShyjudXPSB9eQKKMyPy6qBnu26geSt
fLC3AxdCxrZWj+l10bxDsA83ux+qOX48xOJZ+YPUBP43PryWf8rfON0QyI9h
SqLwBvB5ZQxMEv1Exgbv+bJg4Ls7GWOU3OmlfDpeoFkjY9yS4yjgopV4zCWo
NBEahbjsQaFwRvkFztoAkScWhbYRUksBcMZ9w+Ymp4CUUxAXQB91DXdj2S/S
6QvUDAG1/8GmARNLVDU8h//OmeeCZcdsF+Y/ya8X2GT0FaL8ua8fbKxl3WFF
qa/cX8b4Lgn4g6lmUrX8x9FeRVsEIYqvuvbG/pZu7ZWnFcyUCsMTwqZsrEWi
Kfk5Y4SYVFSLbywZ8+IDOFwjj6CRJFgrhoe5J56teEIMQxc2UE9kGlfQArpo
SioaXRDJsRlfyylwIn9FSbR21j3hKXopWAah0ZVIfnyVBgyBJVkVmnOLKAmN
L7ldoARqFco2o5iToqMehOOu9wSr65742Xm4pgQJYCfOg/AbNHngjQyzd99H
DihHt2LCtuU1MPLM6UdDiooArzab08x1q7bJ9yzTOY/++3wr605xpWp3UV4r
vGLSWt0zWR6Mk77RMwIff4+iCeiR9AZ8nz/CKtP05ff5veLsfHQv0cTm7Zso
Ly6v7gk4pF+hxPL0vBgLguFM6rETtG2A2vU7LuvDGD3tVssaLwJFZXwPEX8h
SMzaMgzN7/OHDxEl46OM5xGjVFPyqhvK5rMnT58/2XpEz/3eCx9/+pSf1wa3
NqMW7oE+Ue7uvNjcevjo8ZN71M6XbnrXfDdXzPcO1CakQrTyTaImRiTmud2V
kMWgS9JhpRAd3epXxRRMaPF3+YMWMDYuP0Q1r1EZcKk6l4dV5zJLrGDm12ru
r+iGTpxbMvjZO8Huc9QbyatQoDXF3e2p4gQZfzjwAAupVk7z4KLMxp85yU9t
kOypgGijYcZvG8VglQgw+a5CREoO6U2UQE8BTFZNxtfHkD+7taa5PMUZgPej
8YUaqHiGorvfGCMdG+Wfeej6594lys75xD456icz4I1f6cy3yg9vbqC9ogKt
CUUp4TATCwjRlhUmXsF327jx5M+5aXvpVKsTApy7cZQj8tolanyFAC1QrL5g
OdaeKrq9BvxVRwtWSHovisn8N80iU7BN6/CoeF5isWMYVC1awe8nYEJiwZ1o
Fe27ARXB0Kq59SKqrfn2PWkfWpbPtwcdQI3txYQNipewCBl7n+Xgg+oypWsD
ko+vfcYWOPXveY3MNZRfVn/HAjAZm9iLGylRUmBHCukVrkOoeobh8BmXMKc4
SKC9W8RC8oiI7TA1UyRfNeJyYNGMA9xWxoRpH34KeLJg3/JCxqDXedRuChic
amsjenaAOqzPMo0vOSTzsBcJVXZcftftLV0BvUpLsiP1Sze3/2HNFuQzRZZi
TG1f9SoB1c12RMJWb+qW1FI83dg8AWIwOWBvz4Ix2pLIZI4JR4dml3x9fV20
sK+97Yeft+1SxYDuKxCTiVtqUOvD2wIG8RCIvMDFixs0IgV6L3ObxRGZvgVF
l/fdAwR3iYZvrDlQlXiim9ImNoDfZbW8SNcZCeVF9vnywu1TkhzYjUERqv5h
DaJIvuTIlGVKRC3Ma86wAjqZgUOt66K6hIthcwXCHWNpUF9Q+6deHZkVO1Z7
5gMYMxkLorTpyEyCBkEkjiRK0e3i7GYa1LEUyF8SFx7PDqg7b//xwPhsJ/9C
DTX7P0nTyZK/f8tTr/xb9i/yz3+J/tv5ZfCAfpmpTQatFjnY4fy28pd77r//
xVP4K9lK3kPwgwXXyRg2B3B2JHMtAN+RL/+LWMpf4d+D6VT1dM1v+2pTa+/G
b+YvuV2/Jf5SO7/q7ybxl/3m1Mpyq8wHCwh0m7OOAJaF7IZ/GipN4tfDvxzn
lOYF/1Lnf4LpAX8lvkOs+GsKPn+/CVIQ5IIT5iV033CGn3vDEb07ecXh3qM7
TmYuBne443BjYWW504wvO627jTfYfN79ht/f3PBXiocr7zeyGnilea45aq80
DLN9tQl3yN1tuq4p2d3FTuc1Jfvia0ow7CWXiXB68W3CWNXueJ0I2/1j7hM2
Geif+EYRLsUfdKUQJ66Wp4FKr/Tl/+BrRfZNflQ6bgZ21W0+iRyQ8fGbhn8B
3+T+zv4Lx5Gmkv3p7g3nElIApz2FIEov7ZRkws+3URk+qKumJsTF+RwONXL4
Q04ecl1cFQsCT81eQ510mFqJRIxVvpvQoemG86EaIS2PfAaS4zAvi2oM2tq8
zsCphCksnJUlFdIp7l9ecosjPbuho58WPRfs6OYGsJ54hPNYXUOilG9IHp1z
pDUWAHGc4QaCwSF4D0+lhnPC8IIm+f2zotEg5awAiV1NCde0mkPuBRRT0bZA
3edxFO7DX3IOcqHcDGyRL2ySEQDl2wg7NvPCzg1BRJtP4MBr3iQItjnHRjAe
pJpkF2M456xR+wAMKdP9d04Jk/TvRtuG4+h6RfhTKHTPiXQavwfRo1Srhytb
QcLJaDFjfs8ou5wdGtRRzZrYc8SBRWqVp6reGMiGoVYTgx0MAMuNU8HZ49Dj
MIdZKRXXos1m+GfOcXIUvRtEBnEFstH7ios1YwFdfhg+C4KqtJp5WpRTQjWG
p6XciHxhNLxN/DZFaUfBWlzJHS8x/D30BsQHCkQUtkTJCfwYxplpwK2McZ3P
KMRDClNQwU1TFDBlLEFdYNU/WHG4YdJ7TO1IM9cl1Lipmutg9k7aOxqHUPZS
6RoDid3pqDmjjHIxJGppb/BmeHQw2B5ywVRO7vJfc7yN5DlSlK1T+ClJKdNL
neMYu/I7VzeG/QLfGmyZO1Anh8N/fzs8Oj5xUsiNmU5UoClmmMUnPRIUsD8m
5vT0NVBsWsOMS5OGOStRtjueWl/bhKm7zlRqNFO+UmZ2JK7oxIUZIdyqYVR5
3MlEH1TA8goCU7lMW+P3F0aPwXfufuFODYcecO2/CZ1xu9uBsCDH7ixj9XpW
13PCFkd9insDj2ZpoX45BQFuM3NMyhj5hNgiS81AAq2k2qiZi2qvfu24pGEt
eUU0mPf1GIoMgqLY2hxuH3II3JyuFrMJcvVqsig1MhJmAeQiS9gzfX3wBENA
4viqDqHV4XetbyiST8Yh9xVeIqSNqwIBBEg6JRZJBbcoBt/hjfu8pSC4FQAx
ebL75uD18M1w7xjd7mBfKa4hjQWUCyyK11IssACedHOBmdJOErDkGd9IDXsu
sgfZDJh4ikJ58Ppgj63/7qujcg7lfaVL+GoPThh+faBf5/38NZTcJmGGjzei
wc3KKVW/lf2B6+E6dCfoFAh7gt0nygT28w9AT80VXegoM9srWlQxcKP/5CEc
vAwSkwrI0HCkitG4fE4o1KaZFueUBgZEeV0tnJx68sh1sfnk4bM7NYDpXniC
QKSXswnluEE7WPsAioGc1e+JG6Bfuu84Ttmnf+IkRggLIL1JPwtCss7tespS
rFxQ3D/HH/Lj+l05wbu5UIHUU8Q33h7u5o1TFq9LDWzHbYcPkBLG53MYrjIK
qUHAfqgf8odTbxB0NAL05j0IIxez0JGtlMoYRy8+vTAGnXTYUV+QljaglZ3h
6+HxkJv8+DHghP05DOX33wm/ER44HL7aPToeHq58egseeHs0PBm83h0crXr6
oTz9H4PXb4fLnobl+g+3bxg9LSLJnxlYK/0kmNf+C1y/aOU8PtSShUtDVWE4
XSt2+FM6PtjU/hq8Pf5x/3D3P5H3nBzv/zzc656yrQQGMn17sP2j45hvD4lz
fUKTw299tMf3R4sZV6q2xa+GfznYPRwe4bOc9esfAJi414PDV6AnUA02fI6L
kveR7/inobAU8+/h4cnB4a6bx/Gv+Ibqsn3RQfU1jCV7uX/4y+BwB59l239f
maA+irFiyuGjLryC3O4Dy4vxiwe4sC93XwOpmhdRcDt+MQ56hF2kGJX9wx1+
gdxzqADog4gJuvOrEzq72yf4Ai3p6GZSXFfnfXLw+ccR5nL4Cz0quhi+MSk/
0NN9VoHwJQxhwtj/bSxKRDKnj5H5faxT9DvrOawFHRs8gsSLqQrmcEAMF4n/
lNOER8Q8kAUcpnVOXrS5UOvg7O1zXkKqf2ZLHfXXcWmj7Ib4/c1V77/dkwM4
3En0v7Xq/XbYXvD+w9Xjd2xud8dq5/b9R6ve33l78Hp3e3A8PDk+HGz/LCxW
3n+86v2fh78Soz1xR/LN4Ph4d+8VryW8/2TV+8f7+ydvBnu/ygSOwvV7etv5
HwyOf0ys/7NV778ZvIaBDxMtwPvPV73/an/wy8Dz6xb9bKx4f3t/7/jQbb/T
PY8Gr4a2IQXtX7p/g+OBJPBEg1AY/WXvA/WS1GBhsO/kz8vX+7/w+w9vTT+m
JSIihZpf9r7rDVNZ9oav9o93SYi9HOxCzpCCv99u/3z/dv5PVp7fn/f2f9lr
j57ff7rifRKHid75/We3pF/mIk42he8/v9P8gxYUMr37fZQAwjro1AZcnyUK
iY0v5vf5l7N8YvormDYzfUnlCidxK7a9ubqF1Ik3LWytbmFv//jk6O3Bwf7h
cTwIw/qXtbCC+B+tbmEF+T5e3cLO/vDoBKYy/IvT5tsrubGyBRVhg71Xw8Re
bN5hHVCItVrYugU9IE25Y5AW46tncXA4fLn7F2SfrwcH7d28/Tr8tL+7B1LU
iHRVAVfNgpjZ0fHg+O3Rye6eX1NFH1/WArKDICMy4AZBTmQHM1jNBDpYwOqj
33HyEyc+TN7sOvCJg554kdSi4d6OJ4zE+U68GFwf6P3EsU68+Gofdh/UioCC
Hq18kQ9zTHqPV8/RKWEvB4cnPwx/3N3b0RefrHwxcfCM1rZsOxB+TCS99vhs
xYtIoBCbIVULDxGKIHFfQYwCBnpL0+ptxFUHtd5CTHXRq6FWjmLzUIzsFRLN
UJOn2/S64tWEGUEpdsWrUWpxIIqWvpp9g2DV7kK9mNezJvv4ghwD5ej7exfF
uCklw7MWH7HbreoSDGZXlfhUFfvjAyIDNGBeYOcyGI1Nqh5gME7rxjX8Iv9l
cHjghvd/Pebf+HwxG5c3/Q/FbOpG5xp4vXhX5tv4bS8/fHv0Yxa88G66cIPq
zxbNFT3/czUDs+wBfN3L96o5xIgUs8tePhgXk/zlDMYyHvfyn9y9vsq2y8nf
i0mNBrqfCtfVL2XVNNcFmx0BxeEwHOLfygk4gZs+BJeCRxbMEG722H22vRiP
y0n+Ez/Uy48WEHOxB7bId4vrggCrt69mgHflxvPjopqX1wV7Asn2w5GndVNm
o/p8AQ6vJr8uZ5eUGF+Bg5LXEI3tCDVl8nRwnNAGjFCRNNcp4HZ4/BJLbv5S
z96BpZriZzyeJ3gl6tk1OLOKa/TBIsjhFGvcolPLLc5NNi3r6bgk/AkfykLf
ClbnCF0lc/AAszsciQxN6Wjerxqd4Iss64O5M/+hvCwn7t/bV8UMPDA/z4qm
OscvojWD78LVdt/85LhF454AeoGPsMk5b7L7bKnDfTTE5T69QYTcfMd9CZ+q
dxBYdgmMDD7W+X86/jSHB3+BNl4XHzJI98zPivN3eIquisllmb+uL7Ps8OV2
PhxV7kDdx5Co8kV+gEUZORoiiETwEVrIN8993VSAaHYH7j3bOiUaQhYNYK6a
ZkG25qlbC3GmsW+P3LfjqjG4724UlPt8Pq+B2KbkIiW0KgO8GdBOf/NRln37
LfkskIDZ43/gzlT57bcIrkkYVeCCQpM32Odl4JPysnZbh/N68M2j58/X3Avg
XKnH1QjxoBgmhgRC4L9wL2xuPqY3aIXRGh/5bjBemIKGADPcSTJ47fkmvDYY
jRSX0v2Ycq+5h7e2Ntaw5LW6Xi40J2AfTIA9n9TpU/oQgcTCdb1Eu2L+wPG/
eg3bffoQ2hWlcP9n9eXhj4/gR9/w2ymux+Ac4o7G5eiypOOPzz6GZ3eqBmqK
fhCjPYzA29gd/W6/3nXLcnI0PH57QO89xQEQ4Q3J9CvlruFA+wVxg4MXnm3B
C2+AHcq6FcaAjo/gpAY4kBY4KYSWTM69uwMc/WOBGsW3n8m+jMqLArLhib1A
tFDxgbBz8Dnc9rcTNfmiNkC+ouZKoKfG1eQdhQAcJZ6Ddp67CTn6RQUESdYd
4RlO7rqg5K4fGeiTaDnAOYgwC9w2X8uHB988f/Rc10rmoqbxXO3Whff09TTo
DDZL0hq/k0xZGO/G4yd+dbWuuMkdk1TM3Z3vN4jQnwakwT/HUVONIPWDf2wP
Jj+WVjWIzK3WE+xdAiZhU3x8I6GBXC+aucS8cQ4ALvOGIbS9ffYkHOWIJ2ER
bdzDDzeQgrbHxQygWz+Qg3fqtASCXgUosBNs+0T8GX4NTWV3opOnuL+O0VJY
PXJeAEAnjtHQrh6WE9AlDc6IFpSI4iSgzcc4mR3MWkQSGQFpJiBVrzG2hgmN
ls7D5vrMY9qSSYnRCnNEPCM8LnzvselstDCYpRiGAHvAWQUmMB9fDFbxbzUF
AvOCt46dG92tuP3D1dx+hLqCt11NLXvYeKwHvECsbQQTyYklmV1k4F6JXY7i
e4CwNx/5hszGBWz87c4BcB14fAPXf5ehHtpecyAwp4PxCf3WhxvAoJ+qtKC7
I93GFVoM3MZOAouIJeFEhcxJ1yWTMo3j8d0YDmXzYoa9Cb1VZAyPKAXjfITs
+S1GzAG6BegswiTQ20kRGO/LGxOAipnCsDOPSfbOZjRuiFgAFCcvPxcoglBF
k8BuaV3wZFw7LCNAK83pnJ+ASfvVIcNyRd/JYo5Kf3xgoZ4+t7wG1BUMDQOW
shjjYa4uMMiwr/W/AZidzv3G40eW+lu3J1OfHOD6FoautphVSRj7YuIRjvY9
L3QP2h44mZdCwPHnTeL+AXtsMGYK428IUQLX66HhjYTCCbiEijfJcYKs5l3H
LUITxFxSkcVxcAcIpofPhZr9ryZXIJnqA71sEelSbFRIpU53GEOwLuNk1Atk
coSfjblbsCRPkMAkHcyJivG86vsQRwoXUlxtXER8gxQnUG4n9x1TXDQLJ6lu
1vKw5lBJOxCwYWzD6CNNOb7oh1Fa+AhuuczBKwgHFKP1pphTjKREIxNQGL36
BNcE33V3gHp2Ey7ImxqoFRVCji0iLvDU9ngFgeQYaQNRWDZfG2M0OTWOZApS
DAm1N8XfAOdzqUgb7O3tv93bRs2rHduFQ3m05h/3rBNtheYlQlOD558RYUPf
tN2H7jBdFhOv+rjDyzTNSFHWmoP0unlLcbMFU7E8V/3kwEkCZowRZue4BCMC
AwY+hpFX0DsARcjkvtv/+TuGvnODISLzM5clO2JoZViYEd7lltwRNkDbu82M
NjHqC466BbYIte2wH1S9nz8VioGJA9Jdw/Bk7ueZk8czR8u7k/dOHR3lh3gZ
AhX0yRou1DlzKcamAR7wZM3LaqN/CWdi6xbqWz6nglVCgOmfwDUENvvZ1mND
QK9BQPgkotp9gYEi8g3ykUfhqFDDm9duh0Y19YgVbzBg1Il9JPrnD4MT4/nq
MfNVgGGgdrAVDnu+xlefeQ4QVCajMFEPV4m5IhPSfs14iZXbHFgKf514iO2A
6wjCaXx72th86gcSBPnk5KeJrmjuWjk8dGKLL2wU4kbAzBhlSW0+lI3kk4q8
1XNVFB04u5jvPXeqJTeKkaiQyMBNAClwtDLS9rNeDjJ183YkvsFqYAn64fU1
hGKFxcM4p6lvCpFEqa2wnYcIPg3AI1czQHb8Nn+NEcqU5UahgO7GEme/EY3b
HA46aJ6tQ+PwiSwNqDqIXWGs+EaQ3LP5hODlIOnESU/oMeotuKE7kXtWnocX
CTIWAiPRulHXdTOPy4U16+YdN2UuhEH62gwkozsFyrUEh4rUf+FXvRRvgiTz
mFWuQ6TjuzIYec/0T9qWzd8YQ5KOP33+6nFepCSjGmS4AF+k3LNQwOw/gJnm
cHMf8YqrBEIXUznitGCvtFBDcDbrOZI49eQ11kYJ8SBoPBAc8fKIiFHtDrKV
QER7W8MFaySQBaNd7AFQPDEWNvVYNq6Pid2EwMPCJw5Z2ChnZ5zCGvmW55ky
Is1t0NYHZ009Xjhi+YkvfGiwCKayV7M8fh9LDMv5UcTwZYIPQasIBQxI1Phv
+dqDFHsNmWwefx5OBjEar1Hi4SscHZ27IQ33dk72X1IkHGXn0hccwOQ+0E8M
zOqvBRj9vVP73FJJikcObfTXD1wJQ4sbfHDqAZxerePnhWDjC7+gGmvRgvUu
bitVpAjTZBnSfZ/kpSKJXBZT3HB3omAFwpjP3b2X+yTDErGgPQlRLjjjU1M+
eghZS4uPXBXr2nhMRYxTJmYSzvfBN0+fOB34/wO6NNDSMrwCAA==

-->

</rfc>
