<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lcurley-moq-lite-05" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="moql">Media over QUIC - Lite</title>
    <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-lite-05"/>
    <author fullname="Luke Curley">
      <organization/>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="30"/>
    <area>wit</area>
    <workgroup>moq</workgroup>
    <abstract>
      <?line 28?>

<t>moq-lite is designed to fanout live content 1-&gt;N across the internet.
It leverages QUIC to prioritize important content, avoiding head-of-line blocking while respecting encoding dependencies.
While primarily designed for media, the transport is payload agnostic and can be proxied by relays/CDNs without knowledge of codecs, containers, or encryption keys.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Media Over QUIC Working Group mailing list (moq@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/kixelated/moq-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 34?>

<section anchor="conventions-and-definitions">
      <name>Conventions 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?>

</section>
    <section anchor="rationale">
      <name>Rationale</name>
      <t>This draft is based on MoqTransport <xref target="moqt"/>.
The concepts, motivations, and terminology are very similar and when in doubt, refer to existing MoqTransport literature.
A few things have been renamed (ex. object -&gt; frame) to better align with media terminology.</t>
      <t>I absolutely believe in the motivation and potential of Media over QUIC.
The layering is phenomenal and addresses many of the problems with current live media protocols.
I fully support the goals of the working group and the IETF process.</t>
      <t>But it's been difficult to design such an experimental protocol via committee.
MoqTransport has become too complicated.</t>
      <t>There are too many messages, optional modes, and half-baked features.
Too many hypotheses, too many potential use-cases, too many diametrically opposed opinions.
This is expected (and even desired) as compromise gives birth to a standard.</t>
      <t>But I believe the standardization process is hindering practical experimentation.
The ideas behind MoQ can be proven now before being cemented as an RFC.
We should spend more time building an <em>actual</em> application and less time arguing about a hypothetical one.</t>
      <t>moq-lite is the bare minimum needed for a real-time application aiming to replace WebRTC.
Every feature from MoqTransport that is not necessary (or has not been implemented yet) has been removed for simplicity.
This includes many great ideas (ex. group order) that may be added as they are needed.
This draft is the current state, not the end state.</t>
    </section>
    <section anchor="concepts">
      <name>Concepts</name>
      <t>moq-lite consists of:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Session</strong>: An established QUIC connection between a client and server.</t>
        </li>
        <li>
          <t><strong>Broadcast</strong>: A collection of Tracks from a single publisher.</t>
        </li>
        <li>
          <t><strong>Track</strong>: A series of Groups, each of which can be delivered and decoded <em>out-of-order</em>.</t>
        </li>
        <li>
          <t><strong>Group</strong>: A series of Frames, each of which must be delivered and decoded <em>in-order</em>.</t>
        </li>
        <li>
          <t><strong>Frame</strong>: A sized payload of bytes within a Group.</t>
        </li>
      </ul>
      <t>The application determines how to split data into broadcast, tracks, groups, and frames.
The moq-lite layer provides fanout, prioritization, and caching even for latency sensitive applications.</t>
      <section anchor="session">
        <name>Session</name>
        <t>A Session consists of a connection between a client and a server.
There is currently no P2P support within QUIC so it's out of scope for moq-lite.</t>
        <t>The moq-lite version identifier is <tt>moq-lite-xx</tt> where <tt>xx</tt> is the two-digit draft version.
For bare QUIC, this is negotiated as an ALPN token during the QUIC handshake.
For WebTransport over HTTP/3, the QUIC ALPN remains <tt>h3</tt> and the moq-lite version is advertised via the <tt>WT-Available-Protocols</tt> and <tt>WT-Protocol</tt> CONNECT headers.</t>
        <t>The bindings negotiated solely via ALPN (bare QUIC and Qmux over TCP/TLS) have no request URI, so a client conveys the request path it wishes to reach via the <xref target="path-parameter">Path Parameter</xref> in SETUP.
The remaining bindings carry the path in their own handshake and do not use this parameter; see <xref target="path-parameter">Path Parameter</xref>.</t>
        <t>When UDP is unavailable, moq-lite-05 <bcp14>MAY</bcp14> also run over reliable byte-stream transports via Qmux <xref target="qmux"/>.
Qmux provides a length-delimited polyfill for QUIC streams on top of TCP/TLS or WebSocket; see <xref target="transports"/> for the specific bindings and ALPN negotiation.</t>
        <t>The session is active immediately after the QUIC/WebTransport connection is established.
Both endpoints <bcp14>SHOULD</bcp14> begin sending and receiving streams right away to avoid an extra round-trip.</t>
        <t>Optional capabilities and extensions are negotiated via a SETUP message (see <xref target="setup"/>).
Each endpoint <bcp14>MUST</bcp14> open a unidirectional Setup Stream at the start of the session, send a single SETUP message advertising what it supports, and immediately close the stream (FIN); an endpoint with no optional capabilities sends a SETUP with an empty parameter list.
The two SETUP messages are independent; neither endpoint waits for the peer's SETUP before opening other streams.
Because a SETUP is always sent, the buffering below is bounded: an endpoint knows the peer's full capability set has arrived once it receives that single SETUP.
An endpoint <bcp14>SHOULD</bcp14> continue to send and process non-Setup streams until a negotiated extension would change the behavior or encoding of a stream, in which case it <bcp14>MUST</bcp14> buffer that stream until the peer's SETUP has been received.
For example, if an extension adds a field to SUBSCRIBE_OK, the subscriber buffers SUBSCRIBE_OK until SETUP arrives so the new field can be parsed.</t>
        <t>As a fallback, an endpoint that opens an extension stream the peer does not support simply sees that stream reset (see <xref target="stream_type"/>).
A negotiated capability applies only to this hop; each session is negotiated independently and relays <bcp14>MUST NOT</bcp14> forward SETUP.</t>
        <t>While moq-lite is a point-to-point protocol, it's intended to work end-to-end via relays.
Each client establishes a session with a CDN edge server, ideally the closest one.
Any broadcasts and subscriptions are transparently proxied by the CDN behind the scenes.</t>
      </section>
      <section anchor="broadcast">
        <name>Broadcast</name>
        <t>A Broadcast is a collection of Tracks from a single publisher.
This corresponds to a MoqTransport's "track namespace".</t>
        <t>A publisher may produce multiple broadcasts, each of which is advertised via an ANNOUNCE_BROADCAST message.
The subscriber uses the ANNOUNCE_REQUEST message to discover available broadcasts.
These announcements are live and can change over time, allowing for dynamic origin discovery.</t>
        <t>A broadcast consists of any number of Tracks.
The contents, relationships, and encoding of tracks are determined by the application.</t>
      </section>
      <section anchor="track">
        <name>Track</name>
        <t>A Track is a series of Groups identified by a unique name within a Broadcast.</t>
        <t>A track consists of a single active Group at any moment, called the "latest group".
When a new Group is started, the previous Group is closed and may be dropped for any reason.
The duration before an incomplete group is dropped is determined by the application and the publisher/subscriber's latency target.</t>
        <t>Every subscription is scoped to a single Track.
A subscription starts at a configurable Group (defaulting to the latest) and continues until a configurable end Group or until either the publisher or subscriber cancels the subscription.</t>
        <t>The subscriber and publisher both indicate their delivery preference:
- <tt>Priority</tt> indicates if Track A should be transmitted instead of Track B.
- <tt>Ordered</tt> indicates if the Groups within a Track should be transmitted in order.
- <tt>Subscriber Max Latency</tt> indicates the maximum age before a non-latest Group is dropped from live delivery; <tt>Publisher Max Latency</tt> indicates the maximum age before a non-latest Group is dropped from the publisher's cache.</t>
        <t>The combination of these preferences enables the most important content to arrive during network degradation while still respecting encoding dependencies.</t>
      </section>
      <section anchor="group">
        <name>Group</name>
        <t>A Group is an ordered stream of Frames within a Track.</t>
        <t>Each group consists of an append-only list of Frames.
A Group is normally served by a dedicated QUIC stream which is closed on completion, reset by the publisher, or cancelled by the subscriber.
This ensures that all Frames within a Group arrive reliably and in order.</t>
        <t>In contrast, Groups may arrive out of order due to network congestion and prioritization.
The application <bcp14>SHOULD</bcp14> process or buffer groups out of order to avoid blocking on flow control.</t>
        <t>A Group <bcp14>MAY</bcp14> also be transmitted as a single QUIC datagram (see <xref target="datagrams"/>) when the entire group fits in one datagram and reliability is not required.
A datagram-delivered group contains exactly one Frame and is not retransmitted on loss.
The same subscription <bcp14>MAY</bcp14> receive groups via both streams and datagrams; the application <bcp14>MUST</bcp14> be prepared to deduplicate by group sequence.</t>
      </section>
      <section anchor="frame">
        <name>Frame</name>
        <t>A Frame is a payload of bytes within a Group.</t>
        <t>A frame is used to represent a chunk of data with an upfront size.
The contents are opaque to the moq-lite layer.</t>
        <t>Each frame carries a presentation timestamp expressed in the parent Track's <tt>Timescale</tt> (units per second, part of the <xref target="track-info">TRACK_INFO</xref>).
Every Track has a media timeline — the <tt>Timescale</tt> is always non-zero and every frame is timestamped.
The timestamp is the source-of-truth for media time and is one of the two inputs to the moq-lite layer's <xref target="expiration"/> decisions, alongside wall-clock arrival time.</t>
      </section>
    </section>
    <section anchor="flow">
      <name>Flow</name>
      <t>This section outlines the flow of messages within a moq-lite session.
See the Messages section for the specific encoding.</t>
      <section anchor="connection">
        <name>Connection</name>
        <t>moq-lite runs on top of any transport that provides ordered, multiplexed, bidirectional streams.
The primary transports are bare QUIC and WebTransport over HTTP/3.
WebTransport is a layer on top of QUIC and HTTP/3, required for web support.
The API is nearly identical to QUIC with the exception of stream IDs.</t>
        <t>When UDP is unavailable, moq-lite-05 also runs over Qmux <xref target="qmux"/>, a length-delimited polyfill that maps QUIC streams onto a reliable byte-stream transport.
See <xref target="transports"/> for the supported bindings.</t>
        <t>How the underlying connection is authenticated is out-of-scope for this draft.</t>
      </section>
      <section anchor="transports">
        <name>Transports</name>
        <t>moq-lite-05 defines four transport bindings.
All four carry the same control and data streams defined elsewhere in this document; they differ only in how QUIC streams are multiplexed onto the underlying connection.</t>
        <table>
          <thead>
            <tr>
              <th align="right"> </th>
              <th align="left">Transport</th>
              <th align="left">ALPN / Identifier</th>
              <th align="left">Record framing</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">1</td>
              <td align="left">QUIC</td>
              <td align="left">
                <tt>moq-lite-05</tt></td>
              <td align="left">Native QUIC streams</td>
            </tr>
            <tr>
              <td align="right">2</td>
              <td align="left">WebTransport / H3</td>
              <td align="left">
                <tt>moq-lite-05</tt> (CONNECT header)</td>
              <td align="left">Native WebTransport streams</td>
            </tr>
            <tr>
              <td align="right">3</td>
              <td align="left">Qmux over TCP/TLS</td>
              <td align="left">
                <tt>moq-lite-05</tt> (ALPN over TLS)</td>
              <td align="left">Qmux Record <xref target="qmux"/></td>
            </tr>
            <tr>
              <td align="right">4</td>
              <td align="left">Qmux over WebSocket</td>
              <td align="left">
                <tt>moq-lite-05</tt> (Sec-WebSocket-Protocol)</td>
              <td align="left">WebSocket message</td>
            </tr>
          </tbody>
        </table>
        <t>For bindings 1 and 2, moq-lite uses the underlying QUIC/WebTransport stream APIs directly.
QUIC datagrams (see <xref target="datagrams"/>) are supported by bindings 1 and 2 only.
Bindings 3 and 4 are reliable byte-stream transports and have no datagram channel; a publisher <bcp14>MUST NOT</bcp14> emit datagrams on those bindings and <bcp14>MUST</bcp14> fall back to Group Streams.</t>
        <section anchor="qmux-over-tcptls">
          <name>Qmux over TCP/TLS</name>
          <t>A client opens a TCP connection, performs a TLS handshake, and negotiates the ALPN token <tt>moq-lite-05</tt>.
Each direction of the TLS byte stream then carries Qmux Records as defined in <xref target="qmux"/>, which encapsulate QUIC STREAM frames.
The Qmux Record's <tt>Size</tt> field length-delimits each record on the byte stream:</t>
          <artwork><![CDATA[
QMux Record {
  Size (i),
  Frames (..)
}
]]></artwork>
          <t>All other moq-lite semantics (stream types, message encoding, flow control, etc.) are identical to native QUIC.</t>
        </section>
        <section anchor="qmux-over-websocket">
          <name>Qmux over WebSocket</name>
          <t>Qmux as published does not define a WebSocket binding due to IETF working-group charter scope.
This section specifies how moq-lite-05 maps Qmux onto WebSocket <xref target="RFC6455"/>; the mapping is straightforward because both layers provide length-delimited messages over a reliable byte stream.</t>
          <t>A client opens a WebSocket connection with the <tt>Sec-WebSocket-Protocol</tt> header set to <tt>moq-lite-05</tt>.
Each WebSocket binary message carries exactly one Qmux Record's <tt>Frames</tt> payload — that is, one or more QUIC frames concatenated.
The WebSocket message length replaces the Qmux Record <tt>Size</tt> field: the WebSocket framing layer already self-delimits each record, so the <tt>Size</tt> varint <bcp14>MUST NOT</bcp14> be transmitted and <bcp14>MUST NOT</bcp14> be expected by the receiver.</t>
          <t>In other words, a Qmux-over-WebSocket record is:</t>
          <artwork><![CDATA[
WebSocket Binary Message {
  Frames (..)
}
]]></artwork>
          <t>Text messages <bcp14>MUST NOT</bcp14> be used and <bcp14>MUST</bcp14> be treated as a protocol violation.
All other Qmux semantics (in-order STREAM frame delivery, stream IDs, etc.) apply unchanged.</t>
          <t>WebSocket ping/pong frames are handled by the WebSocket layer and are independent of moq-lite.</t>
        </section>
      </section>
      <section anchor="termination">
        <name>Termination</name>
        <t>QUIC bidirectional streams have an independent send and receive direction.
Rather than deal with half-open states, moq-lite combines both sides.
If an endpoint closes the send direction of a stream, the peer <bcp14>MUST</bcp14> also close their send direction.</t>
        <t>moq-lite contains many long-lived transactions, such as subscriptions and announcements.
These are terminated when the underlying QUIC stream is terminated.</t>
        <t>To terminate a stream, an endpoint may:
- close the send direction (STREAM with FIN) to gracefully terminate (all messages are flushed).
- reset the send direction (RESET_STREAM) to immediately terminate.</t>
        <t>After resetting the send direction, an endpoint <bcp14>MAY</bcp14> close the recv direction (STOP_SENDING).
However, it is ultimately the other peer's responsibility to close their send direction.</t>
      </section>
      <section anchor="handshake">
        <name>Handshake</name>
        <t>See the <xref target="session"/> section for ALPN negotiation and session activation details.</t>
      </section>
    </section>
    <section anchor="streams">
      <name>Streams</name>
      <t>moq-lite uses a bidirectional stream for each transaction.
If the stream is closed, potentially with an error, the transaction is terminated.</t>
      <section anchor="bidirectional-streams">
        <name>Bidirectional Streams</name>
        <t>Bidirectional streams are used for control streams.
There's a 1-byte STREAM_TYPE at the beginning of each stream.</t>
        <table>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Stream</th>
              <th align="left">Creator</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Announce</td>
              <td align="left">Subscriber</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Subscribe</td>
              <td align="left">Subscriber</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Fetch</td>
              <td align="left">Subscriber</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Probe</td>
              <td align="left">Subscriber</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Goaway</td>
              <td align="left">Either</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Track</td>
              <td align="left">Subscriber</td>
            </tr>
          </tbody>
        </table>
        <section anchor="announce">
          <name>Announce</name>
          <t>A subscriber can open an Announce Stream to discover broadcasts matching a prefix.</t>
          <t>The subscriber creates the stream with an ANNOUNCE_REQUEST message.
The publisher replies with a single ANNOUNCE_OK message followed by ANNOUNCE_BROADCAST messages for any matching broadcasts and any future changes.</t>
          <t>ANNOUNCE_OK carries metadata that applies to every ANNOUNCE_BROADCAST on this stream and is sent exactly once at the start of the response:</t>
          <ul spacing="normal">
            <li>
              <t>The publisher's own <tt>Hop ID</tt>, which is the implicit trailing entry of every ANNOUNCE_BROADCAST's Hop ID list. Hoisting it out of every ANNOUNCE_BROADCAST saves bytes since it is identical for every announcement on the session.</t>
            </li>
            <li>
              <t>The number of <tt>active</tt> ANNOUNCE_BROADCAST messages (<tt>Active Count</tt>) the publisher will send immediately as the initial set. The subscriber <bcp14>MAY</bcp14> buffer until all <tt>Active Count</tt> initial announcements arrive before reporting them to the application, avoiding a trickle. Any ANNOUNCE_BROADCAST messages beyond <tt>Active Count</tt> are live updates and <bcp14>SHOULD</bcp14> be reported to the application as they arrive.</t>
            </li>
          </ul>
          <t>Each ANNOUNCE_BROADCAST message contains one of the following statuses:</t>
          <ul spacing="normal">
            <li>
              <t><tt>active</tt>: a matching broadcast is available.</t>
            </li>
            <li>
              <t><tt>ended</tt>: a previously <tt>active</tt> broadcast is no longer available.</t>
            </li>
          </ul>
          <t>Each broadcast starts as <tt>ended</tt>.
An <tt>active</tt> announcement makes the broadcast available; a subsequent <tt>ended</tt> makes it unavailable again.</t>
          <t>A publisher <bcp14>SHOULD</bcp14> advertise only the best path it knows for each broadcast.
If the best path changes (e.g. a relay failover or upstream restart), the publisher <bcp14>MAY</bcp14> send another <tt>active</tt> for that broadcast: the new announcement atomically replaces the prior one (equivalent to UNANNOUNCE+ANNOUNCE_BROADCAST).
A publisher <bcp14>MUST NOT</bcp14> keep multiple <tt>active</tt> advertisements for the same broadcast on the same stream — each broadcast has at most one current advertisement at a time.
A subscriber that sees the same broadcast advertised across multiple streams <bcp14>SHOULD</bcp14> route subscriptions to the advertisement with the shortest total path length (see <xref target="announce-broadcast">ANNOUNCE_BROADCAST</xref>).</t>
          <t>The subscriber <bcp14>MUST</bcp14> reset the stream if it receives an <tt>ended</tt> for a broadcast that is not currently <tt>active</tt>, or any ANNOUNCE_BROADCAST before ANNOUNCE_OK.
When the stream is closed, the subscriber <bcp14>MUST</bcp14> assume that all broadcasts are now <tt>ended</tt>.</t>
          <t>Path prefix matching and equality is done on a byte-by-byte basis.
There <bcp14>MAY</bcp14> be multiple Announce Streams, potentially containing overlapping prefixes, that get their own ANNOUNCE_OK + ANNOUNCE_BROADCAST messages.</t>
        </section>
        <section anchor="subscribe">
          <name>Subscribe</name>
          <t>A subscriber opens Subscribe Streams to request a Track.</t>
          <t>The subscriber <bcp14>MUST</bcp14> start a Subscribe Stream with a SUBSCRIBE message followed by any number of SUBSCRIBE_UPDATE messages.
When a start group can be resolved, the publisher replies with a SUBSCRIBE_OK message (confirming the subscription and resolving its start group), followed by any number of SUBSCRIBE_END and SUBSCRIBE_DROP messages.
When the accepted track has already ended with no matching groups there is no start group to resolve, so the publisher sends SUBSCRIBE_END with no preceding SUBSCRIBE_OK.
A rejection is a stream reset: if the publisher cannot serve the subscription — the track does not exist, or it otherwise refuses — it <bcp14>MUST</bcp14> reset the stream rather than leave it pending, and <bcp14>SHOULD</bcp14> do so promptly (within roughly a round trip) so the subscriber is not left waiting.
A subscription the publisher accepts but has no groups for yet is not a rejection: for a live track the publisher <bcp14>MAY</bcp14> withhold SUBSCRIBE_OK until the first matching group resolves the start. A subscriber therefore distinguishes "pending" from "refused" by the stream reset, not by a timeout.
The Subscribe Stream does not carry the track's publisher properties — those are immutable and fetched once via a <xref target="track-stream">Track Stream</xref> (see <xref target="track-info">TRACK_INFO</xref>).
The subscriber <bcp14>MUST</bcp14> have the track's TRACK_INFO before it can fully interpret the FRAME messages that arrive on Group Streams, since the timescale is needed to interpret each timestamp; it <bcp14>MAY</bcp14> open the Track and Subscribe streams concurrently and buffer frames until TRACK_INFO arrives.</t>
          <t>The publisher sends SUBSCRIBE_OK once the absolute start group is resolved, and SUBSCRIBE_END once no further groups will be produced (see <xref target="subscribe-ok">SUBSCRIBE_OK</xref> and <xref target="subscribe-end">SUBSCRIBE_END</xref>).
The publisher closes the stream (FIN) only once every group from start to end has been accounted for, either via a GROUP stream (completed or reset) or a SUBSCRIBE_DROP message.
This <bcp14>MAY</bcp14> occur after SUBSCRIBE_END, since stragglers within the range can still be dropped.
Unbounded subscriptions (no end group) stay open until the publisher sends SUBSCRIBE_END (and accounts for the remaining groups) to indicate the track has ended, or either endpoint resets.
Either endpoint <bcp14>MAY</bcp14> reset/cancel the stream at any time.</t>
        </section>
        <section anchor="fetch">
          <name>Fetch</name>
          <t>A subscriber opens a Fetch Stream (0x3) to request a single Group from a Track.</t>
          <t>The subscriber sends a FETCH message containing the broadcast path, track name, priority, and group sequence.
The publisher responds with FRAME messages directly on the same bidirectional stream — there is no response header.
The Subscribe ID and Group Sequence for the returned FRAME messages are implicit, taken from the original FETCH request.
As with a subscription, the subscriber <bcp14>MUST</bcp14> already have the track's <xref target="track-info">TRACK_INFO</xref> to parse the returned frames; because the properties are immutable, a single Track Stream lookup is reused across every FETCH of that track (group-by-group fetches do not re-fetch it).
The publisher FINs the stream after the last frame, or resets the stream on error.</t>
          <t>Fetch behaves like HTTP: a single request/response per stream.</t>
        </section>
        <section anchor="track-stream">
          <name>Track</name>
          <t>A subscriber opens a Track Stream (0x6) to learn a Track's immutable publisher properties without subscribing or fetching.</t>
          <t>The subscriber sends a TRACK message containing the broadcast path and track name.
The publisher replies with a single TRACK_INFO message and then FINs the stream, or resets the stream on error (e.g. the track does not exist).
The returned properties are fixed for the lifetime of the track, so the subscriber <bcp14>SHOULD</bcp14> cache TRACK_INFO and reuse it across every SUBSCRIBE and FETCH for that track rather than requesting it again.
When the track was discovered via an ANNOUNCE_BROADCAST, the cached value is tied to that advertisement: if the broadcast is re-announced (a new <tt>active</tt> ANNOUNCE_BROADCAST that atomically replaces the prior one), the subscriber <bcp14>MUST</bcp14> discard the cached TRACK_INFO and <bcp14>MUST</bcp14> re-request it before parsing any further FRAME messages, since the timescale may have changed.
If FRAME messages cannot be decoded against the cached TRACK_INFO (for example a malformed delta or payload after a missed re-announcement), the subscriber <bcp14>MUST</bcp14> reset the affected stream with a protocol violation and re-request TRACK_INFO.
A subscriber that reached the track without an advertisement (e.g. a path known out of band) has no such invalidation signal; it <bcp14>MAY</bcp14> re-request TRACK_INFO whenever it needs to confirm freshness (for example on a new session). A stale cache only risks misparsing frames from a changed track, so the subscriber that cannot observe re-announcements <bcp14>SHOULD NOT</bcp14> cache TRACK_INFO beyond a single connection.</t>
          <t>Because a subscriber <bcp14>MAY</bcp14> open the Track stream concurrently with a SUBSCRIBE or FETCH (see <xref target="subscribe"/> and <xref target="fetch"/>) and cannot parse any buffered group frames until TRACK_INFO arrives, the publisher <bcp14>SHOULD</bcp14> prioritize TRACK_INFO ahead of group data on the connection.
Otherwise the concurrent case — intended to keep a cold subscribe or fetch to a single round trip — would stall behind queued group frames that the subscriber cannot yet decode.</t>
        </section>
        <section anchor="probe">
          <name>Probe</name>
          <t>A subscriber opens a Probe Stream (0x4) to measure, and optionally increase, the available bitrate of the connection.
The publisher advertises its Probe level in SETUP (see <xref target="probe-parameter">Probe Parameter</xref>): None, Report (measure only), or Increase (measure and actively probe).</t>
          <t>The subscriber sends a PROBE message with a target bitrate on the bidirectional stream.
The subscriber <bcp14>MAY</bcp14> send additional PROBE messages on the same stream to update the target bitrate; the publisher <bcp14>MUST</bcp14> treat each PROBE as a new target to attempt.
If the publisher advertised the Increase capability, it <bcp14>SHOULD</bcp14> pad the connection (or send redundant data) to achieve the most recent target bitrate, without exceeding the congestion window.
A publisher that advertised Report but not Increase ignores the target and only reports; it <bcp14>MUST NOT</bcp14> pad above its current sending rate.
In either case the publisher periodically replies with PROBE messages on the same bidirectional stream containing the current estimated bitrate and smoothed RTT.</t>
          <t>If the publisher advertised no Probe capability (e.g., the congestion controller is not exposed), it <bcp14>MUST</bcp14> reset the stream.</t>
        </section>
        <section anchor="goaway">
          <name>Goaway</name>
          <t>Either endpoint can open a Goaway Stream (0x5) to initiate a graceful session shutdown.</t>
          <t>The sender sends a GOAWAY message containing an optional new session URI.
If the URI is non-empty, the peer <bcp14>SHOULD</bcp14> establish a new session at the provided URI and migrate any active subscriptions.
The peer <bcp14>MUST NOT</bcp14> open new streams on the current session after receiving a GOAWAY.</t>
          <t>The sender closes the stream (FIN) when it is ready to terminate the session.
The peer <bcp14>SHOULD</bcp14> close all streams and the session after migrating or when it no longer needs the session.</t>
        </section>
      </section>
    </section>
    <section anchor="delivery">
      <name>Delivery</name>
      <t>The most important concept in moq-lite is how to deliver a subscription.
QUIC can only improve the user experience if data is delivered out-of-order during congestion.
This is the sole reason why data is divided into Broadcasts, Tracks, Groups, and Frames.</t>
      <t>moq-lite consists of multiple groups being transmitted in parallel across separate streams.
How these streams get transmitted over the network is very important, and yet has been distilled down into a few simple properties:</t>
      <section anchor="prioritization">
        <name>Prioritization</name>
        <t>The Publisher and Subscriber both exchange <tt>Priority</tt> and <tt>Ordered</tt> values:
- <tt>Priority</tt> determines which Track should be transmitted next.
- <tt>Ordered</tt> determines which Group within the Track should be transmitted next.</t>
        <t>A publisher <bcp14>SHOULD</bcp14> attempt to transmit streams based on these fields.
This depends on the QUIC implementation and it may not be possible to get fine-grained control.</t>
        <section anchor="priority">
          <name>Priority</name>
          <t>The <tt>Subscriber Priority</tt> is scoped to the connection and <bcp14>MAY</bcp14> change over the life of the subscription via SUBSCRIBE_UPDATE.
The <tt>Publisher Priority</tt> is fixed for the lifetime of the Track (see <xref target="track-info">TRACK_INFO</xref>) and <bcp14>SHOULD</bcp14> be used only to resolve conflicts or ties.</t>
          <t>A conflict can occur when a relay tries to serve multiple downstream subscriptions from a single upstream subscription.
The relay cannot pick any one subscriber's priority, so the upstream subscription <bcp14>SHOULD</bcp14> use the publisher priority instead of some combination of different subscriber priorities.
Publisher priority is therefore mostly relevant on the upstream (origin-facing) leg of a relay; closer to the subscriber, the subscriber priority dominates.</t>
          <t>Rather than try to explain everything, here's an example:</t>
          <t><strong>Example:</strong>
There are two people in a conference call, Ali and Bob.</t>
          <t>We subscribe to both of their audio tracks with subscriber priority 2 and video tracks with subscriber priority 1.
Each publisher advertises a fixed publisher priority — here audio at 2 and video at 1 — used only to break ties.
This results in equal priority for <tt>Ali</tt> and <tt>Bob</tt> while prioritizing audio.
<tt>text
ali/audio + bob/audio: subscriber_priority=2 publisher_priority=2
ali/video + bob/video: subscriber_priority=1 publisher_priority=1
</tt></t>
          <t>Because publisher priority cannot change, dynamic adaptation is the subscriber's job.
If the subscriber detects that Bob is actively speaking, it raises the subscriber priority of Bob's tracks via SUBSCRIBE_UPDATE:
<tt>text
bob/audio: subscriber_priority=4 publisher_priority=2
bob/video: subscriber_priority=3 publisher_priority=1
ali/audio: subscriber_priority=2 publisher_priority=2
ali/video: subscriber_priority=1 publisher_priority=1
</tt></t>
          <t>The subscriber priority takes precedence, so the subscriber can likewise full-screen Ali's window by raising the subscriber priority of Ali's tracks above Bob's.</t>
        </section>
        <section anchor="ordered">
          <name>Ordered</name>
          <t>The <tt>Subscriber Ordered</tt> field signals if older (0x1) or newer (0x0) groups should be transmitted first within a Track.
The <tt>Publisher Ordered</tt> field <bcp14>MAY</bcp14> likewise be used to resolve conflicts.</t>
          <t>An application <bcp14>SHOULD</bcp14> use <tt>ordered</tt> when it wants to provide a VOD-like experience, preferring to buffer old groups rather than skip them.
An application <bcp14>SHOULD NOT</bcp14> use <tt>ordered</tt> when it wants to provide a live experience, preferring to skip old groups rather than buffer them.</t>
          <t>Note that <xref target="expiration"/> is not affected by <tt>ordered</tt>.
An old group may still be cancelled/skipped if it exceeds the <tt>Subscriber Max Latency</tt>.
An application <bcp14>MUST</bcp14> support gaps and out-of-order delivery even when <tt>ordered</tt> is true.</t>
        </section>
      </section>
      <section anchor="expiration">
        <name>Expiration</name>
        <t>Expiration governs when an older group is dropped from a live subscription's Group Stream(s).
It is primarily a delivery-time concern, governed by <tt>Subscriber Max Latency</tt>.
Whether older groups remain available for FETCH or future subscriptions is governed by <tt>Publisher Max Latency</tt>, an upper bound on how long the publisher caches a non-latest group; beyond that the publisher <bcp14>MAY</bcp14> drop it.</t>
        <t>It is not crucial to aggressively expire groups thanks to <xref target="prioritization"/>.
However, a lower priority group will still consume RAM, bandwidth, and potentially flow control.
It is <bcp14>RECOMMENDED</bcp14> that an application set conservative limits and only resort to expiration when data is absolutely no longer needed.</t>
        <t>The publisher <bcp14>SHOULD</bcp14> reset Group Streams for non-latest groups whose age relative to the latest group exceeds the <tt>Subscriber Max Latency</tt> value in SUBSCRIBE/SUBSCRIBE_UPDATE.
The subscriber <bcp14>MAY</bcp14> also locally drop such groups for its own resource accounting.
Expiration only removes the group from the live subscription's stream; the publisher <bcp14>MAY</bcp14> still retain it for FETCH or new subscriptions until its age exceeds <tt>Publisher Max Latency</tt> (see <xref target="track-info">TRACK_INFO</xref>).</t>
        <t>Group age is computed relative to the latest group by sequence number.
A group is never expired until at least the next group (by sequence number) has been received or queued.
Once a newer group exists, the group's age is measured two ways, and it is expired once <strong>either</strong> measure exceeds the relevant <tt>Max Latency</tt> (<tt>Subscriber Max Latency</tt> for live delivery, <tt>Publisher Max Latency</tt> for the publisher's cache):</t>
        <ul spacing="normal">
          <li>
            <t><strong>Timestamp age</strong>: the difference between this group's first frame timestamp and the first frame timestamp of the latest group that has at least one frame (see <xref target="frame"/>). This measure is consistent across relays and unaffected by buffering or jitter.</t>
          </li>
          <li>
            <t><strong>Wall-clock age</strong>: the difference between when this group's first byte arrived (subscriber) or was queued (publisher) and the same instant for the latest group.</t>
          </li>
        </ul>
        <t>Equivalently, a group's effective lifetime is the <em>minimum</em> of the two — whichever clock declares it stale first wins. The two measures backstop each other:</t>
        <ul spacing="normal">
          <li>
            <t>A publisher cannot keep stale groups alive by reporting timestamps that look fresh; the wall-clock age expires them anyway.</t>
          </li>
          <li>
            <t>A burst of groups delivered close together (e.g. catching up at the start of a subscription) does not reset their age; the timestamp age still expires the media-old ones even though they all just arrived.</t>
          </li>
        </ul>
        <t>A group that contains zero frames has no timestamp, so only the wall-clock age applies.
This avoids stalling expiration on tracks that intentionally emit empty groups as keep-alives or gap markers.</t>
        <t>An expired group <bcp14>SHOULD</bcp14> be reset at the QUIC level to avoid consuming flow control.</t>
      </section>
      <section anchor="unidirectional-streams">
        <name>Unidirectional Streams</name>
        <t>Unidirectional streams are used for data transmission.</t>
        <table>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Stream</th>
              <th align="left">Creator</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Group</td>
              <td align="left">Publisher</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Setup</td>
              <td align="left">Either</td>
            </tr>
          </tbody>
        </table>
        <section anchor="setup-stream">
          <name>Setup</name>
          <t>Each endpoint <bcp14>MUST</bcp14> open a Setup Stream (0x1) at the start of the session to advertise the optional capabilities and extensions it supports.</t>
          <t>The opener sends a single SETUP message and immediately closes the stream (FIN).
There is exactly one Setup Stream per direction; an endpoint that receives a second Setup Stream <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION.
An endpoint with no optional capabilities sends a SETUP with an empty parameter list rather than omitting the stream, giving the peer a deterministic signal that no capabilities are forthcoming.</t>
          <t>See the <xref target="session"/> section for how an endpoint avoids waiting on the peer's SETUP before exchanging other streams.</t>
        </section>
        <section anchor="group-1">
          <name>Group</name>
          <t>A publisher creates Group Streams in response to a Subscribe Stream.</t>
          <t>A Group Stream <bcp14>MUST</bcp14> start with a GROUP message and <bcp14>MAY</bcp14> be followed by any number of FRAME messages.
A Group <bcp14>MAY</bcp14> contain zero FRAME messages, potentially indicating a gap in the track.
A frame <bcp14>MAY</bcp14> contain an empty payload, potentially indicating a gap in the group.</t>
          <t>Both the publisher and subscriber <bcp14>MAY</bcp14> reset the stream at any time.
This is not a fatal error and the session remains active.
The subscriber <bcp14>MAY</bcp14> cache the error and potentially retry later.</t>
        </section>
      </section>
      <section anchor="datagrams">
        <name>Datagrams</name>
        <t>QUIC datagrams provide unreliable, unordered delivery for latency-sensitive content that does not need retransmission.</t>
        <t>A publisher <bcp14>MAY</bcp14> transmit any Group as a single QUIC datagram in addition to (or instead of) opening a Group Stream.
Datagrams are not cached: a publisher <bcp14>SHOULD</bcp14> only send a datagram if the congestion controller can transmit it immediately.
A subscriber receiving the same group via both a stream and a datagram <bcp14>MUST</bcp14> deduplicate by group sequence.</t>
        <t>There is no separate subscription for datagram delivery; datagrams are routed to existing subscriptions via the Subscribe ID.
The publisher decides which groups to send as datagrams based on application hints, group size, and network conditions.
A subscriber that does not wish to receive datagrams can ignore them; well-behaved publishers <bcp14>SHOULD</bcp14> avoid sending datagrams when streams suffice.</t>
        <t>Each datagram body has the following encoding (note: there is no message length prefix; the QUIC datagram boundary delimits the payload):</t>
        <artwork><![CDATA[
DATAGRAM Body {
  Subscribe ID (i)
  Group Sequence (i)
  Timestamp (i)
  Payload (b)
}
]]></artwork>
        <t><strong>Subscribe ID</strong>:
The Subscribe ID of an active subscription on the same session.
A subscriber receiving a datagram with an unknown Subscribe ID <bcp14>MUST</bcp14> silently drop it.</t>
        <t><strong>Group Sequence</strong>:
The absolute sequence number of the group carried by this datagram.
Each datagram represents a complete group containing exactly one frame.</t>
        <t><strong>Timestamp</strong>:
The absolute timestamp of the single frame in the group, expressed in the Track's negotiated <tt>Timescale</tt>.
Any varint value (including 0) is a valid absolute timestamp.</t>
        <t><strong>Payload</strong>:
The frame payload, extending to the end of the datagram.
The total datagram body (including all header fields above and the payload) <bcp14>MUST NOT</bcp14> exceed 1200 bytes.
This limit ensures the datagram fits within the minimum QUIC path MTU without IP-layer fragmentation.
Payloads that would not fit <bcp14>MUST</bcp14> be sent as a Group Stream instead.
A receiver <bcp14>MUST</bcp14> silently drop any datagram that exceeds this limit.</t>
      </section>
    </section>
    <section anchor="encoding">
      <name>Encoding</name>
      <t>This section covers the encoding of each message.</t>
      <section anchor="message-length">
        <name>Message Length</name>
        <t>Most messages are prefixed with a variable-length integer indicating the number of bytes in the message payload that follows.
This length field does not include the length of the varint length itself.</t>
        <t>An implementation <bcp14>SHOULD</bcp14> close the connection with a PROTOCOL_VIOLATION if it receives a message with an unexpected length.
The version and extensions should be used to support new fields, not the message length.</t>
      </section>
      <section anchor="stream_type">
        <name>STREAM_TYPE</name>
        <t>All streams start with a short header indicating the stream type.</t>
        <artwork><![CDATA[
STREAM_TYPE {
  Stream Type (i)
}
]]></artwork>
        <t>The stream ID depends on if it's a bidirectional or unidirectional stream, as indicated in the Streams section.
A receiver <bcp14>MUST</bcp14> reset the stream if it receives an unknown stream type.
Unknown stream types <bcp14>MUST NOT</bcp14> be treated as fatal; this is the fallback when an extension stream is opened against a peer that did not negotiate it.</t>
      </section>
      <section anchor="setup">
        <name>SETUP</name>
        <t>A SETUP message advertises the optional capabilities and extensions the sender supports for this session.
It is sent exactly once, as the only message on a <xref target="setup-stream">Setup Stream</xref>.</t>
        <artwork><![CDATA[
SETUP Message {
  Message Length (i)
  Parameter Count (i)
  Setup Parameter (..) ...
}

Setup Parameter {
  Parameter ID (i)
  Parameter Length (i)
  Parameter Value (..)
}
]]></artwork>
        <t><strong>Parameter Count</strong>:
The number of Setup Parameters that follow.</t>
        <t><strong>Parameter ID</strong>:
Identifies the capability or extension.
A receiver <bcp14>MUST</bcp14> ignore unknown Parameter IDs, allowing new capabilities to be added without breaking older implementations.
A Parameter ID <bcp14>MUST NOT</bcp14> appear more than once; a receiver <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION if it does.</t>
        <t><strong>Parameter Length</strong>:
The length of Parameter Value in bytes.</t>
        <t><strong>Parameter Value</strong>:
The parameter-specific value, interpreted according to Parameter ID.</t>
        <t>A capability is available for the session only if the relevant endpoint advertises it; an absent parameter means the sender does not support that capability.
The following Setup Parameters are defined:</t>
        <table>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Name</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Probe</td>
              <td align="left">Level (i)</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Path</td>
              <td align="left">Path (s)</td>
            </tr>
          </tbody>
        </table>
        <section anchor="probe-parameter">
          <name>Probe Parameter</name>
          <t>The Probe Parameter advertises the sender's capability level when acting as a publisher on a <xref target="probe">Probe Stream</xref>.
The Parameter Value is a variable-length integer level, where each level includes the one below it:</t>
          <ul spacing="normal">
            <li>
              <t><tt>0</tt> <strong>None</strong>: The publisher does not support probing. Equivalent to omitting the parameter.</t>
            </li>
            <li>
              <t><tt>1</tt> <strong>Report</strong>: The publisher can measure and periodically report its estimated bitrate.</t>
            </li>
            <li>
              <t><tt>2</tt> <strong>Increase</strong>: The publisher can additionally pad the connection (or send redundant data) to probe for bandwidth above its current sending rate, up to the subscriber's target.</t>
            </li>
          </ul>
          <t>The levels are nested rather than independent: probing for more bandwidth is meaningless without measuring it, so Increase always includes Report. Reporting the current bitrate is far simpler to implement, so a publisher may support Report without Increase.</t>
          <t>A subscriber <bcp14>MUST</bcp14> consult the publisher's advertised level before relying on a Probe Stream:</t>
          <ul spacing="normal">
            <li>
              <t>At <tt>None</tt>, the subscriber <bcp14>SHOULD NOT</bcp14> open a Probe Stream; if it does, the publisher <bcp14>MUST</bcp14> reset it.</t>
            </li>
            <li>
              <t>At <tt>Report</tt>, the subscriber <bcp14>MAY</bcp14> open a Probe Stream to monitor the estimated bitrate but <bcp14>MUST NOT</bcp14> expect the publisher to pad above its current sending rate. A subscriber that needs to probe for additional bandwidth <bcp14>MUST</bcp14> use an alternative (e.g. speculatively switching to a higher rendition).</t>
            </li>
            <li>
              <t>At <tt>Increase</tt>, the subscriber <bcp14>MAY</bcp14> request a target bitrate and expect the publisher to actively probe up to it.</t>
            </li>
          </ul>
        </section>
        <section anchor="path-parameter">
          <name>Path Parameter</name>
          <t>The Path Parameter carries the request path the client wishes to reach, equivalent to the path component of a moq-lite URI.
A server uses it to route the session to the correct origin, relay, or virtual host before any broadcasts are exchanged; its interpretation is otherwise application-defined and opaque to moq-lite.
Unlike the capability-style Setup Parameters, it is per-hop setup metadata that rides along in SETUP because that is the first client-to-server message of the session.</t>
          <t>The Parameter Value is a non-empty UTF-8 string that begins with <tt>/</tt> and uses the path syntax of a URI <xref target="RFC3986"/>.</t>
          <t>This parameter exists for bindings that have no request URI of their own: the native QUIC binding (binding 1 in <xref target="transports"/>) and the Qmux-over-TCP/TLS binding (binding 3), both of which negotiate only an ALPN token.
The remaining bindings convey the path in their own handshake.</t>
          <ul spacing="normal">
            <li>
              <t>A client using a binding without a request URI (binding 1 or 3) <bcp14>MUST</bcp14> send exactly one Path Parameter in its SETUP.</t>
            </li>
            <li>
              <t>The Path Parameter <bcp14>MUST NOT</bcp14> be sent on a binding that carries a request URI. The WebTransport (binding 2) and Qmux-over-WebSocket (binding 4) bindings convey the path in their handshake URI (the CONNECT request path and the WebSocket request URI, respectively). A server that receives a Path Parameter on either of these bindings <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION.</t>
            </li>
            <li>
              <t>A server <bcp14>MUST NOT</bcp14> send a Path Parameter. SETUP is bidirectional, but the path is meaningful only from client to server; a client that receives a Path Parameter <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION.</t>
            </li>
            <li>
              <t>A server that receives a Path that is empty or is not a valid URI path <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION. A server that does not recognize or support the requested path <bcp14>MUST</bcp14> close the session.</t>
            </li>
          </ul>
          <t>A relay <bcp14>MUST NOT</bcp14> forward the Path Parameter; like other per-hop setup metadata it applies only to this hop (see <xref target="session"/>).</t>
        </section>
      </section>
      <section anchor="announce-request">
        <name>ANNOUNCE_REQUEST</name>
        <t>A subscriber sends an ANNOUNCE_REQUEST message to indicate it wants to receive an ANNOUNCE_BROADCAST message for any broadcasts with a path that starts with the requested prefix.</t>
        <artwork><![CDATA[
ANNOUNCE_REQUEST Message {
  Message Length (i)
  Broadcast Path Prefix (s),
  Exclude Hop (i),
}
]]></artwork>
        <t><strong>Broadcast Path Prefix</strong>:
Indicate interest for any broadcasts with a path that starts with this prefix.</t>
        <t><strong>Exclude Hop</strong>:
If non-zero, the publisher <bcp14>SHOULD</bcp14> skip ANNOUNCE_BROADCAST messages for broadcasts whose Hop ID entries (including the publisher's own <tt>Hop ID</tt> from ANNOUNCE_OK) contain this value.
This is used by relays to avoid routing loops in a cluster.</t>
        <t>The publisher <bcp14>MUST</bcp14> respond with an ANNOUNCE_OK message followed by ANNOUNCE_BROADCAST messages for any matching and active broadcasts, followed by ANNOUNCE_BROADCAST messages for any future updates.
Implementations <bcp14>SHOULD</bcp14> consider reasonable limits on the number of matching broadcasts to prevent resource exhaustion.</t>
      </section>
      <section anchor="announce-ok">
        <name>ANNOUNCE_OK</name>
        <t>A publisher sends an ANNOUNCE_OK message exactly once, as the first message on the response side of an Announce Stream.
It carries metadata that is constant for the lifetime of the stream and applies to every ANNOUNCE_BROADCAST that follows.</t>
        <artwork><![CDATA[
ANNOUNCE_OK Message {
  Message Length (i)
  Hop ID (i)
  Active Count (i)
}
]]></artwork>
        <t><strong>Hop ID</strong>:
The publisher's own Hop ID.
This is treated as the implicit trailing entry of every ANNOUNCE_BROADCAST's Hop ID list on this stream; ANNOUNCE_BROADCAST messages <bcp14>MUST NOT</bcp14> repeat this value as the last entry of their <tt>Hop ID</tt> list.
The value 0 is reserved to mean "unknown": either no Hop ID was assigned (e.g. when bridging from an older protocol version) or the endpoint deliberately withholds it to obscure the underlying routing.
A publisher that assigns a Hop ID <bcp14>MUST</bcp14> choose a non-zero value.
Receivers reconstruct the full path as <tt>ANNOUNCE_BROADCAST.Hop IDs ++ [ANNOUNCE_OK.Hop ID]</tt>.</t>
        <t><strong>Active Count</strong>:
The number of <tt>active</tt> ANNOUNCE_BROADCAST messages that the publisher will send immediately as the initial set.
The subscriber <bcp14>MAY</bcp14> block reporting any announcement to the application until all <tt>Active Count</tt> initial ANNOUNCEs have arrived, then deliver the initial set as a batch.
Any ANNOUNCE_BROADCAST messages beyond <tt>Active Count</tt> are live updates and <bcp14>SHOULD</bcp14> be reported as they arrive.
A value of <tt>0</tt> is valid and means the publisher is offering no initial active broadcasts; all subsequent ANNOUNCEs (if any) are live updates.</t>
      </section>
      <section anchor="announce-broadcast">
        <name>ANNOUNCE_BROADCAST</name>
        <t>A publisher sends an ANNOUNCE_BROADCAST message to advertise a change in broadcast availability.
Only the suffix is encoded on the wire, as the full path can be constructed by prepending the requested prefix.</t>
        <t>The status is relative to all prior ANNOUNCE_BROADCAST messages for the same path on the same stream.
A publisher <bcp14>MAY</bcp14> send an <tt>active</tt> for a path that is already <tt>active</tt>: the new announcement atomically replaces the prior one, including any change to the Hop ID list.
An <tt>ended</tt> <bcp14>MUST</bcp14> follow a corresponding <tt>active</tt>; an <tt>ended</tt> for a path that is not currently <tt>active</tt> is a protocol violation.
An ANNOUNCE_BROADCAST before ANNOUNCE_OK is a protocol violation.</t>
        <artwork><![CDATA[
ANNOUNCE_BROADCAST Message {
  Message Length (i)
  Announce Status (i),
  Broadcast Path Suffix (s),
  Hop Count (i),
  Hop ID (i) ...,
}
]]></artwork>
        <t><strong>Announce Status</strong>:
A flag indicating the announce status.</t>
        <ul spacing="normal">
          <li>
            <t><tt>ended</tt> (0): A path is no longer available.</t>
          </li>
          <li>
            <t><tt>active</tt> (1): A path is now available. If the path is already <tt>active</tt>, this announcement atomically replaces the prior one — the Hop ID list <bcp14>MAY</bcp14> differ (e.g. after a relay failover or upstream restart).</t>
          </li>
        </ul>
        <t><strong>Broadcast Path Suffix</strong>:
This is combined with the broadcast path prefix to form the full broadcast path.</t>
        <t><strong>Hop Count</strong>:
The number of Hop ID entries that follow, NOT including the publisher's own <tt>Hop ID</tt> from ANNOUNCE_OK.
A value of 0 means no Hop ID entries are present, indicating either that the announcement originated locally on the publisher (the publisher itself is the origin) or that the upstream peer does not support hop tracking.
A receiver <bcp14>MUST</bcp14> close the stream with a PROTOCOL_VIOLATION if the Hop Count does not match the number of subsequent Hop ID entries.</t>
        <t><strong>Hop ID</strong>:
A unique identifier for each relay in the path from the origin publisher, ordered from origin to the upstream of the responding publisher.
The responding publisher's own Hop ID is NOT included in this list; it is carried once in ANNOUNCE_OK as <tt>Hop ID</tt>.
When forwarding an announcement received from an upstream peer, a relay <bcp14>MUST</bcp14> append the upstream peer's ANNOUNCE_OK <tt>Hop ID</tt> to this list (since that ID is no longer implicit downstream) and then send its own <tt>Hop ID</tt> in the ANNOUNCE_OK it sends to the downstream subscriber.
The total path length is <tt>Hop Count + 1</tt> (including the implicit ANNOUNCE_OK <tt>Hop ID</tt>).
A Hop ID value of 0 means the hop is unknown: either it was never assigned (e.g. when bridging from an older protocol version) or a relay deliberately withholds it to obscure the underlying routing; the Hop Count still reflects the total number of entries including unknown hops.</t>
      </section>
      <section anchor="subscribe-1">
        <name>SUBSCRIBE</name>
        <t>SUBSCRIBE is sent by a subscriber to start a subscription.</t>
        <artwork><![CDATA[
SUBSCRIBE Message {
  Message Length (i)
  Subscribe ID (i)
  Broadcast Path (s)
  Track Name (s)
  Subscriber Priority (8)
  Subscriber Ordered (8)
  Subscriber Max Latency (i)
  Group Start (i)
  Group End (i)
}
]]></artwork>
        <t><strong>Subscribe ID</strong>:
A unique identifier chosen by the subscriber.
A Subscribe ID <bcp14>MUST NOT</bcp14> be reused within the same session, even if the prior subscription has been closed.</t>
        <t><strong>Subscriber Priority</strong>:
The priority of the subscription within the session, represented as a u8.
The publisher <bcp14>SHOULD</bcp14> transmit <em>higher</em> values first during congestion.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Subscriber Ordered</strong>:
A single byte representing whether groups are transmitted in ascending (0x1) or descending (0x0) order.
The publisher <bcp14>SHOULD</bcp14> transmit <em>older</em> groups first during congestion if true.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Subscriber Max Latency</strong>:
The subscriber's preference, in milliseconds, for how long a non-latest group may remain in flight before being considered stale and dropped from live delivery.
The publisher <bcp14>SHOULD</bcp14> reset (at the QUIC level) Group Streams for groups whose age relative to the latest group exceeds this duration.
Applies only to non-latest groups; the latest group is never dropped on staleness grounds.
A value of <tt>0</tt> means the subscriber wants only the latest group in live delivery (older groups are immediately stale once a newer group arrives).
This is a delivery-time preference, not a retention rule: the publisher <bcp14>MAY</bcp14> still hold these groups for FETCH or future subscriptions (see <tt>Publisher Max Latency</tt> in <xref target="track-info">TRACK_INFO</xref>).
See the <xref target="expiration"/> section for more information.</t>
        <t><strong>Group Start</strong>:
The first group to deliver.
A value of 0 means the latest group (default).
A non-zero value is the absolute group sequence + 1.</t>
        <t><strong>Group End</strong>:
The last group to deliver (inclusive).
A value of 0 means unbounded (default).
A non-zero value is the absolute group sequence + 1.</t>
      </section>
      <section anchor="subscribeupdate">
        <name>SUBSCRIBE_UPDATE</name>
        <t>A subscriber can modify a subscription with a SUBSCRIBE_UPDATE message.
A subscriber <bcp14>MAY</bcp14> send multiple SUBSCRIBE_UPDATE messages to update the subscription.
The start and end group can be changed in either direction (growing or shrinking).</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE Message {
  Message Length (i)
  Subscriber Priority (8)
  Subscriber Ordered (8)
  Subscriber Max Latency (i)
  Group Start (i)
  Group End (i)
}
]]></artwork>
        <t>See <xref target="subscribe"/> for information about each field.</t>
      </section>
      <section anchor="track-1">
        <name>TRACK</name>
        <t>TRACK is sent by a subscriber to request a Track's immutable publisher properties.
It is the first message on a Track Stream (0x6).</t>
        <artwork><![CDATA[
TRACK Message {
  Message Length (i)
  Broadcast Path (s)
  Track Name (s)
}
]]></artwork>
        <t><strong>Broadcast Path</strong>:
The broadcast path of the track.</t>
        <t><strong>Track Name</strong>:
The name of the track.</t>
      </section>
      <section anchor="track-info">
        <name>TRACK_INFO</name>
        <t>TRACK_INFO is sent by the publisher in response to a TRACK message.
It is the sole message on the Track Stream; the publisher FINs immediately afterward, or resets the stream on error (e.g. the track does not exist).</t>
        <artwork><![CDATA[
TRACK_INFO Message {
  Message Length (i)
  Publisher Priority (8)
  Publisher Ordered (8)
  Publisher Max Latency (i)
  Timescale (i)
}
]]></artwork>
        <t>Every field is <strong>fixed for the lifetime of the Track</strong> and <bcp14>MUST NOT</bcp14> change; a change requires a new Track (a re-announcement of the broadcast).
This immutability is what lets the properties live on their own stream — fetched once and cached — instead of being echoed on every SUBSCRIBE and FETCH response.
It is also deliberate for relays: a relay serving one upstream subscription to many downstream subscribers would otherwise have to fan a single publisher-side change out to every downstream (and invalidate any cached groups) — publisher changes fan <em>out</em>.
Subscriber properties (see <xref target="subscribe"/>) are the opposite: they fan <em>in</em> at the relay, which already merges them, so they <bcp14>MAY</bcp14> change freely via SUBSCRIBE_UPDATE.</t>
        <t><strong>Publisher Priority</strong>:
The publisher's priority for this Track, represented as a u8, used only to resolve ties between subscriptions of equal subscriber priority.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Publisher Ordered</strong>:
The publisher's group ordering preference (ascending <tt>0x1</tt> or descending <tt>0x0</tt>), used only to resolve ties.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Publisher Max Latency</strong>:
The maximum age, in milliseconds, that the publisher caches a non-latest group past the arrival of a newer group.
Applies only to non-latest groups; the latest group is always retained.
It is an upper bound on retention, the inverse of an HTTP <tt>Cache-Control: max-age</tt> guarantee:</t>
        <ul spacing="normal">
          <li>
            <t>A subscriber <bcp14>MAY</bcp14> issue a SUBSCRIBE or FETCH with an older <tt>Group Start</tt>, but the publisher <bcp14>MAY</bcp14> have already dropped any group whose age exceeds <tt>Publisher Max Latency</tt>.</t>
          </li>
          <li>
            <t>The publisher <bcp14>MAY</bcp14> drop groups sooner than <tt>Publisher Max Latency</tt> under resource pressure; subscribers <bcp14>MUST NOT</bcp14> assume older groups within the bound are still available.</t>
          </li>
        </ul>
        <t>A value of <tt>0</tt> means the publisher caches only the latest group (older groups <bcp14>MAY</bcp14> be dropped as soon as a newer group arrives).
The unit is milliseconds, matching <tt>Subscriber Max Latency</tt>.
See the <xref target="expiration"/> section for more information.</t>
        <t><strong>Timescale</strong>:
The number of timestamp units per second for frame timestamps on this Track.
It <bcp14>MUST</bcp14> be non-zero: every Track has a media timeline, so every FRAME carries a <tt>Timestamp Delta</tt> and every datagram body carries a <tt>Timestamp</tt> (see <xref target="frame"/> and <xref target="datagrams"/>).
A subscriber that receives a <tt>Timescale</tt> of 0 <bcp14>MUST</bcp14> reset the Subscribe or Fetch stream with a protocol violation.
Common values include <tt>1000</tt> (milliseconds), <tt>1000000</tt> (microseconds), <tt>48000</tt> (audio sample rate), and <tt>90000</tt> (RTP video clock).</t>
      </section>
      <section anchor="subscribe-ok">
        <name>SUBSCRIBE_OK</name>
        <t>A SUBSCRIBE_OK message confirms a subscription and resolves its absolute start group.
It is the first message the publisher sends on the Subscribe Stream, once the start group is known.</t>
        <t>This is the trimmed-down counterpart of MoqTransport's SUBSCRIBE_OK: it retains the name and the role of the publisher's positive response, but carries only the resolved start group (all other per-track properties live in <xref target="track-info">TRACK_INFO</xref>).</t>
        <artwork><![CDATA[
SUBSCRIBE_OK Message {
  Type (i) = 0x0
  Message Length (i)
  Group (i)
}
]]></artwork>
        <t><strong>Type</strong>:
Set to 0x0 to indicate a SUBSCRIBE_OK message.</t>
        <t><strong>Group</strong>:
The absolute sequence number of the first group that will be delivered.
This is a plain absolute sequence, <strong>not</strong> the <tt>absolute + 1</tt> form used by <tt>Group Start</tt> in SUBSCRIBE (see <xref target="subscribe"/>); decode the requested <tt>Group Start</tt> before comparing.
Once decoded, this <bcp14>MUST</bcp14> be greater than or equal to the requested start group.
If it is strictly greater, the groups in between are unavailable and will not be delivered; SUBSCRIBE_OK thus also acts as an implicit drop of that leading range, and no separate SUBSCRIBE_DROP is required for it.
A subscriber that requested the latest group (<tt>Group Start</tt> = 0) learns the resolved sequence here.</t>
      </section>
      <section anchor="subscribe-end">
        <name>SUBSCRIBE_END</name>
        <t>A SUBSCRIBE_END message is sent by the publisher to signal that no group after a given sequence will be produced.</t>
        <artwork><![CDATA[
SUBSCRIBE_END Message {
  Type (i) = 0x1
  Message Length (i)
  Group (i)
}
]]></artwork>
        <t><strong>Type</strong>:
Set to 0x1 to indicate a SUBSCRIBE_END message.</t>
        <t><strong>Group</strong>:
The absolute sequence number of the last group that may be delivered (inclusive).
This is a plain absolute sequence, <strong>not</strong> the <tt>absolute + 1</tt> form used by <tt>Group Start</tt>/<tt>Group End</tt> in SUBSCRIBE.
The subscriber <bcp14>MUST NOT</bcp14> wait for any group after this sequence.
SUBSCRIBE_END bounds the range but does not by itself end the stream: the publisher <bcp14>MAY</bcp14> still send SUBSCRIBE_DROP for groups at or below this sequence that it cannot deliver, and FINs the stream only once every group up to this sequence has been accounted for.</t>
      </section>
      <section anchor="subscribedrop">
        <name>SUBSCRIBE_DROP</name>
        <t>A SUBSCRIBE_DROP message is sent by the publisher on the Subscribe Stream when groups cannot be served.
It <bcp14>MAY</bcp14> arrive at any point after the subscription is opened, including after SUBSCRIBE_END for stragglers within the resolved range (a leading range is instead dropped implicitly by SUBSCRIBE_OK).</t>
        <artwork><![CDATA[
SUBSCRIBE_DROP Message {
  Type (i) = 0x2
  Message Length (i)
  Group Start (i)
  Group End (i)
  Error Code (i)
}
]]></artwork>
        <t><strong>Type</strong>:
Set to 0x2 to indicate a SUBSCRIBE_DROP message.</t>
        <t><strong>Group Start</strong>:
The first absolute group sequence in the dropped range.
Despite the shared field name, this is a plain absolute sequence, <strong>not</strong> the <tt>absolute + 1</tt> form used by <tt>Group Start</tt> in SUBSCRIBE.</t>
        <t><strong>Group End</strong>:
The last absolute group sequence in the dropped range (inclusive).
As with <tt>Group Start</tt> above, this is a plain absolute sequence, <strong>not</strong> the <tt>absolute + 1</tt> form used in SUBSCRIBE.</t>
        <t><strong>Error Code</strong>:
An application-specific error code.
A value of 0 indicates no error; the groups are simply unavailable.</t>
      </section>
      <section anchor="fetch-1">
        <name>FETCH</name>
        <t>FETCH is sent by a subscriber to request a single group from a track.</t>
        <artwork><![CDATA[
FETCH Message {
  Message Length (i)
  Broadcast Path (s)
  Track Name (s)
  Subscriber Priority (8)
  Group Sequence (i)
}
]]></artwork>
        <t><strong>Broadcast Path</strong>:
The broadcast path of the track to fetch from.</t>
        <t><strong>Track Name</strong>:
The name of the track to fetch from.</t>
        <t><strong>Subscriber Priority</strong>:
The priority of the fetch within the session, represented as a u8.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Group Sequence</strong>:
The sequence number of the group to fetch.</t>
        <t>The publisher responds with FRAME messages directly on the same stream — there is no response header.
The subscriber parses them using the track's <xref target="track-info">TRACK_INFO</xref>, which it <bcp14>MUST</bcp14> already have (see the <xref target="track-stream">Track Stream</xref>); the group sequence is implicit from the FETCH request.
The publisher FINs the stream after the last frame, or resets on error.
There is no FETCH_ERROR message — the publisher signals failure by resetting the stream.</t>
      </section>
      <section anchor="probe-1">
        <name>PROBE</name>
        <t>PROBE is used to measure the available bitrate of the connection.</t>
        <artwork><![CDATA[
PROBE Message {
  Message Length (i)
  Bitrate (i)
  RTT (i)
}
]]></artwork>
        <t><strong>Bitrate</strong>:
When sent by the subscriber (stream opener): the target bitrate in bits per second that the publisher should pad up to.
The publisher only honors a target above its current sending rate if it advertised the Increase capability (see <xref target="probe-parameter">Probe Parameter</xref>); otherwise the target is ignored and the publisher only reports.
When sent by the publisher (responder): the current estimated bitrate in bits per second.
A value of 0 means unknown.</t>
        <t><strong>RTT</strong>:
The smoothed round-trip time in milliseconds, as defined in <xref target="RFC9002"/>.
A value of 0 means unknown.</t>
        <ul empty="true">
          <li>
            <t>NOTE: RTT is included in the PROBE message because not all QUIC implementations and browser WebTransport APIs expose RTT statistics directly. This field may be deprecated once RTT is universally available via the underlying transport API.</t>
          </li>
        </ul>
      </section>
      <section anchor="goaway-1">
        <name>GOAWAY</name>
        <t>A GOAWAY message is sent to initiate a graceful session shutdown with an optional redirect.</t>
        <artwork><![CDATA[
GOAWAY Message {
  Message Length (i)
  New Session URI (s)
}
]]></artwork>
        <t><strong>New Session URI</strong>:
A URI for the peer to reconnect to.
An empty string indicates no redirect; the peer should simply close the session.
A recipient <bcp14>MUST</bcp14> validate the URI against local policy before reconnecting, including verifying the scheme, authority, and port are permitted.
If validation fails, the recipient <bcp14>MUST</bcp14> close the session without reconnecting.</t>
      </section>
      <section anchor="group-2">
        <name>GROUP</name>
        <t>The GROUP message contains information about a Group, as well as a reference to the subscription being served.</t>
        <artwork><![CDATA[
GROUP Message {
  Message Length (i)
  Subscribe ID (i)
  Group Sequence (i)
}
]]></artwork>
        <t><strong>Subscribe ID</strong>:
The corresponding Subscribe ID.
This ID is used to distinguish between multiple subscriptions for the same track.</t>
        <t><strong>Group Sequence</strong>:
The sequence number of the group.
This <bcp14>SHOULD</bcp14> increase by 1 for each new group.
A subscriber <bcp14>MUST</bcp14> handle gaps, potentially caused by congestion.</t>
      </section>
      <section anchor="frame-1">
        <name>FRAME</name>
        <t>The FRAME message is a payload within a group.</t>
        <artwork><![CDATA[
FRAME Message {
  Timestamp Delta (i)
  Message Length (i)
  Payload (b)
}
]]></artwork>
        <t><strong>Timestamp Delta</strong>:
A signed delta from the previous frame's timestamp, in the Track's negotiated <tt>Timescale</tt>.
Encoded as a zigzag-mapped variable-length integer:</t>
        <ul spacing="normal">
          <li>
            <t>Encode: <tt>unsigned = (signed &lt;&lt; 1) ^ (signed &gt;&gt; 63)</tt> (arithmetic right shift).</t>
          </li>
          <li>
            <t>Decode: <tt>signed = (unsigned &gt;&gt; 1) ^ -(unsigned &amp; 1)</tt>.</t>
          </li>
        </ul>
        <t>Zigzag interleaves non-negative and negative values (<tt>0 → 0, -1 → 1, 1 → 2, -2 → 3, 2 → 4, ...</tt>) so small magnitudes of either sign fit in a 1-byte varint and there is exactly one wire encoding for zero.
The first frame of a group is delta-encoded from <tt>0</tt>, so its <tt>Timestamp Delta</tt> is the zigzag encoding of the absolute timestamp.</t>
        <t><strong>Payload</strong>:
An application-specific payload.
The <tt>Message Length</tt> describes the payload size on the wire.</t>
      </section>
    </section>
    <section anchor="appendix-a-changelog">
      <name>Appendix A: Changelog</name>
      <section anchor="moq-lite-05">
        <name>moq-lite-05</name>
        <ul spacing="normal">
          <li>
            <t>Renamed ANNOUNCE_INTEREST to ANNOUNCE_REQUEST and ANNOUNCE to ANNOUNCE_BROADCAST.</t>
          </li>
          <li>
            <t>Added a SETUP message and Setup Stream (0x1).</t>
          </li>
          <li>
            <t>Added a SETUP <tt>Probe</tt> parameter.</t>
          </li>
          <li>
            <t>Added a SETUP <tt>Path</tt> parameter to convey the request path on bindings that have no request URI (native QUIC and Qmux-over-TCP/TLS).</t>
          </li>
          <li>
            <t>Added Track Stream (0x6) and TRACK_INFO.</t>
          </li>
          <li>
            <t>Removed FETCH_OK.</t>
          </li>
          <li>
            <t>Trimmed SUBSCRIBE_OK to a single resolved start group.</t>
          </li>
          <li>
            <t>Split end-of-subscription signaling into SUBSCRIBE_END.</t>
          </li>
          <li>
            <t>Renamed <tt>Start Group</tt>/<tt>End Group</tt> to <tt>Group Start</tt>/<tt>Group End</tt> in SUBSCRIBE, SUBSCRIBE_UPDATE, and SUBSCRIBE_DROP.</t>
          </li>
          <li>
            <t>Allowed duplicate <tt>active</tt> ANNOUNCE_BROADCAST messages to atomically replace the prior advertisement.</t>
          </li>
          <li>
            <t>Added ANNOUNCE_OK with <tt>Hop ID</tt> and <tt>Active Count</tt>.</t>
          </li>
          <li>
            <t>Added mandatory <tt>Timescale</tt> to TRACK_INFO.</t>
          </li>
          <li>
            <t>Added <tt>Timestamp Delta</tt> to FRAME.</t>
          </li>
          <li>
            <t>Added <tt>Timestamp</tt> to the QUIC datagram body.</t>
          </li>
          <li>
            <t>Moved <tt>Publisher Max Latency</tt> to TRACK_INFO and redefined it as a maximum retention bound: the longest the publisher caches a non-latest group (the inverse of an HTTP <tt>Cache-Control: max-age</tt> guarantee). <tt>Subscriber Max Latency</tt> keeps its name and remains the subscriber's delivery-time expiration preference.</t>
          </li>
          <li>
            <t>Expire a group once <strong>either</strong> its timestamp age or its wall-clock arrival age exceeds Max Latency (the shorter lifetime wins), bounding both manipulated timestamps and delivery bursts.</t>
          </li>
          <li>
            <t>Added QUIC datagram delivery for groups.</t>
          </li>
          <li>
            <t>Added Qmux <xref target="qmux"/> transport bindings for TCP/TLS and WebSocket.</t>
          </li>
        </ul>
      </section>
      <section anchor="moq-lite-04">
        <name>moq-lite-04</name>
        <ul spacing="normal">
          <li>
            <t>Renamed ANNOUNCE_PLEASE to ANNOUNCE_SUBSCRIBE.</t>
          </li>
          <li>
            <t>ANNOUNCE_BROADCAST <tt>Hops</tt> count replaced with explicit <tt>Hop ID</tt> list for loop detection.</t>
          </li>
          <li>
            <t>Added <tt>Exclude Hop</tt> to ANNOUNCE_REQUEST for relay loop avoidance.</t>
          </li>
          <li>
            <t>Added GOAWAY stream for graceful session shutdown and migration.</t>
          </li>
          <li>
            <t>Added RTT to PROBE message. Bitrate and RTT use 0 for unknown.</t>
          </li>
        </ul>
      </section>
      <section anchor="moq-lite-03">
        <name>moq-lite-03</name>
        <ul spacing="normal">
          <li>
            <t>Version negotiated via ALPN (<tt>moq-lite-xx</tt>) instead of SETUP messages.</t>
          </li>
          <li>
            <t>Removed Session, SessionCompat streams and SESSION_CLIENT/SESSION_SERVER/SESSION_UPDATE messages.</t>
          </li>
          <li>
            <t>Unknown stream types reset instead of fatal; enables extension negotiation via stream probing.</t>
          </li>
          <li>
            <t>Added FETCH stream for single group download.</t>
          </li>
          <li>
            <t>Added Start Group and End Group to SUBSCRIBE, SUBSCRIBE_UPDATE, and SUBSCRIBE_OK.</t>
          </li>
          <li>
            <t>Added SUBSCRIBE_DROP on Subscribe stream.</t>
          </li>
          <li>
            <t>Subscribe stream closed (FIN) when all groups accounted for.</t>
          </li>
          <li>
            <t>Added PROBE stream replacing SESSION_UPDATE bitrate.</t>
          </li>
          <li>
            <t>Removed ANNOUNCE_INIT message.</t>
          </li>
          <li>
            <t>Added <tt>Hops</tt> to ANNOUNCE_BROADCAST.</t>
          </li>
          <li>
            <t>Added <tt>Subscriber Max Latency</tt> and <tt>Subscriber Ordered</tt> to SUBSCRIBE and SUBSCRIBE_UPDATE.</t>
          </li>
          <li>
            <t>Added <tt>Publisher Priority</tt>, <tt>Publisher Max Latency</tt>, and <tt>Publisher Ordered</tt> to SUBSCRIBE_OK.</t>
          </li>
          <li>
            <t>SUBSCRIBE_OK may be sent multiple times.</t>
          </li>
        </ul>
      </section>
      <section anchor="moq-lite-02">
        <name>moq-lite-02</name>
        <ul spacing="normal">
          <li>
            <t>Added SessionCompat stream.</t>
          </li>
          <li>
            <t>Editorial stuff.</t>
          </li>
        </ul>
      </section>
      <section anchor="moq-lite-01">
        <name>moq-lite-01</name>
        <ul spacing="normal">
          <li>
            <t>Added Message Length (i) to all messages.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="appendix-b-upstream-differences">
      <name>Appendix B: Upstream Differences</name>
      <t>A quick comparison of moq-lite and moq-transport-14:</t>
      <ul spacing="normal">
        <li>
          <t>Streams instead of request IDs.</t>
        </li>
        <li>
          <t>Pull only: No unsolicited publishing.</t>
        </li>
        <li>
          <t>FETCH is HTTP-like (single request/response) vs MoqTransport FETCH (multiple groups).</t>
        </li>
        <li>
          <t>Capabilities negotiated via a SETUP message on a unidirectional stream that does not block other streams, instead of MoqTransport's blocking CLIENT_SETUP/SERVER_SETUP handshake on the control stream.</t>
        </li>
        <li>
          <t>Both moq-lite and MoqTransport use ALPN for version identification.</t>
        </li>
        <li>
          <t>Names use utf-8 strings instead of byte arrays.</t>
        </li>
        <li>
          <t>Track Namespace is a string, not an array of any array of bytes.</t>
        </li>
        <li>
          <t>Subscriptions default to the latest group, not the latest object.</t>
        </li>
        <li>
          <t>No subgroups</t>
        </li>
        <li>
          <t>No group/object ID gaps</t>
        </li>
        <li>
          <t>No object properties</t>
        </li>
        <li>
          <t>No paused subscriptions (forward=0)</t>
        </li>
      </ul>
      <section anchor="deleted-messages">
        <name>Deleted Messages</name>
        <ul spacing="normal">
          <li>
            <t>MAX_SUBSCRIBE_ID</t>
          </li>
          <li>
            <t>REQUESTS_BLOCKED</t>
          </li>
          <li>
            <t>SUBSCRIBE_ERROR</t>
          </li>
          <li>
            <t>UNSUBSCRIBE</t>
          </li>
          <li>
            <t>PUBLISH_DONE</t>
          </li>
          <li>
            <t>PUBLISH</t>
          </li>
          <li>
            <t>PUBLISH_OK</t>
          </li>
          <li>
            <t>PUBLISH_ERROR</t>
          </li>
          <li>
            <t>FETCH_OK</t>
          </li>
          <li>
            <t>FETCH_ERROR</t>
          </li>
          <li>
            <t>FETCH_CANCEL</t>
          </li>
          <li>
            <t>FETCH_HEADER</t>
          </li>
          <li>
            <t>TRACK_STATUS</t>
          </li>
          <li>
            <t>TRACK_STATUS_OK</t>
          </li>
          <li>
            <t>TRACK_STATUS_ERROR</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE_OK</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE_ERROR</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE_CANCEL</t>
          </li>
          <li>
            <t>SUBSCRIBE_NAMESPACE_OK</t>
          </li>
          <li>
            <t>SUBSCRIBE_NAMESPACE_ERROR</t>
          </li>
          <li>
            <t>UNSUBSCRIBE_NAMESPACE</t>
          </li>
          <li>
            <t>OBJECT_DATAGRAM</t>
          </li>
        </ul>
      </section>
      <section anchor="renamed-messages">
        <name>Renamed Messages</name>
        <ul spacing="normal">
          <li>
            <t>SUBSCRIBE_NAMESPACE -&gt; ANNOUNCE_REQUEST</t>
          </li>
          <li>
            <t>SUBGROUP_HEADER -&gt; GROUP</t>
          </li>
        </ul>
      </section>
      <section anchor="deleted-fields">
        <name>Deleted Fields</name>
        <t>Some of these fields occur in multiple messages.</t>
        <ul spacing="normal">
          <li>
            <t>Request ID</t>
          </li>
          <li>
            <t>Track Alias</t>
          </li>
          <li>
            <t>Group Order</t>
          </li>
          <li>
            <t>Filter Type</t>
          </li>
          <li>
            <t>StartObject</t>
          </li>
          <li>
            <t>Expires</t>
          </li>
          <li>
            <t>ContentExists</t>
          </li>
          <li>
            <t>Largest Group ID</t>
          </li>
          <li>
            <t>Largest Object ID</t>
          </li>
          <li>
            <t>Parameters</t>
          </li>
          <li>
            <t>Subgroup ID</t>
          </li>
          <li>
            <t>Object ID</t>
          </li>
          <li>
            <t>Object Status</t>
          </li>
          <li>
            <t>Extension Headers</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>moq-lite inherits the transport security of the underlying connection: QUIC and WebTransport provide confidentiality and integrity via TLS 1.3, and the Qmux bindings run over TLS (TCP) or a <tt>wss://</tt> WebSocket. How that connection is authenticated is out of scope (see <xref target="connection"/>). The considerations below are specific to moq-lite.</t>
      <section anchor="bandwidth-probing">
        <name>Bandwidth Probing</name>
        <t>The <tt>Increase</tt> Probe level (see <xref target="probe-parameter">Probe Parameter</xref>) lets a subscriber ask the publisher to pad the connection up to a target bitrate. A publisher <bcp14>MUST NOT</bcp14> treat the target as authorization to send beyond what congestion control allows: padding is bounded by the congestion window, so probing cannot be used to amplify traffic toward the subscriber or a spoofed address. A publisher that only advertised <tt>Report</tt> <bcp14>MUST NOT</bcp14> pad above its current sending rate. Because all data flows on an established, congestion-controlled session to the connecting peer, moq-lite offers no off-path amplification vector.</t>
      </section>
      <section anchor="session-redirection">
        <name>Session Redirection</name>
        <t>GOAWAY carries an optional New Session URI that asks the peer to reconnect elsewhere. A malicious or compromised peer could use this to redirect a client to an attacker-controlled server. A recipient <bcp14>MUST</bcp14> validate the URI against local policy — scheme, authority, and port — before reconnecting, and <bcp14>MUST NOT</bcp14> reconnect if validation fails (see <xref target="goaway"/>). Migrated subscriptions carry no implicit trust from the prior session; the new session is authenticated independently.</t>
      </section>
      <section anchor="routing-metadata-and-privacy">
        <name>Routing Metadata and Privacy</name>
        <t>Hop IDs (see <xref target="announce-ok">ANNOUNCE_OK</xref> and <xref target="announce-broadcast">ANNOUNCE_BROADCAST</xref>) expose the relay path of a broadcast, which may reveal internal topology. A relay that does not wish to disclose its position <bcp14>MAY</bcp14> use the reserved value 0 ("unknown") instead of a stable identifier. The <tt>Exclude Hop</tt> filter in ANNOUNCE_REQUEST is a loop-avoidance hint, not an access control; a publisher is not required to honor it, and it <bcp14>MUST NOT</bcp14> be relied upon to hide broadcasts.</t>
      </section>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>A peer can open many streams (subscriptions, announcements, fetches) or request large announce prefixes. Implementations <bcp14>SHOULD</bcp14> bound the number of concurrent subscriptions, announce matches, and cached groups, and <bcp14>SHOULD</bcp14> rely on QUIC flow control and stream limits to backpressure a misbehaving peer (see <xref target="announce-request">ANNOUNCE_REQUEST</xref>). Expiration (see <xref target="expiration"/>) bounds how long stale groups consume memory and flow control.</t>
      </section>
      <section anchor="datagram-injection">
        <name>Datagram Injection</name>
        <t>Datagrams are routed to a subscription solely by Subscribe ID and carry no per-group authentication beyond that of the QUIC connection. On an unmodified QUIC/WebTransport connection this is sufficient, since datagrams are protected by the transport. A subscriber <bcp14>MUST</bcp14> silently drop any datagram with an unknown Subscribe ID and <bcp14>MUST</bcp14> deduplicate against groups received on streams (see <xref target="datagrams"/>).</t>
      </section>
      <section anchor="opaque-payloads">
        <name>Opaque Payloads</name>
        <t>The moq-lite layer treats Frame payloads as opaque and performs no validation of their contents. Confidentiality or integrity of the media itself (e.g. end-to-end encryption transparent to relays) is an application concern and out of scope for this draft.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="moqt">
        <front>
          <title>Media over QUIC Transport</title>
          <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
            <organization>Cisco</organization>
          </author>
          <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
            <organization>Google</organization>
          </author>
          <author fullname="Ian Swett" initials="I." surname="Swett">
            <organization>Google</organization>
          </author>
          <author fullname="Alan Frindell" initials="A." surname="Frindell">
            <organization>Meta</organization>
          </author>
          <date day="12" month="May" year="2026"/>
          <abstract>
            <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-18"/>
      </reference>
      <reference anchor="qmux">
        <front>
          <title>QMux</title>
          <author fullname="Kazuho Oku" initials="K." surname="Oku">
            <organization>Fastly</organization>
          </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
            <organization>Netflix</organization>
          </author>
          <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
            <organization>Apple</organization>
          </author>
          <date day="1" month="April" year="2026"/>
          <abstract>
            <t>   This document specifies QMux version 1.  QMux version 1 provides,
   over bi-directional streams such as TLS, the same set of stream and
   datagram operations that applications rely upon in QUIC version 1.

Discussion Venues

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

   Discussion of this document takes place on the QUIC Working Group
   mailing list (quic@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/browse/quic/.

   Source for this draft and an issue tracker can be found at
   https://github.com/quicwg/qmux.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qmux-01"/>
      </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="RFC6455">
        <front>
          <title>The WebSocket Protocol</title>
          <author fullname="I. Fette" initials="I." surname="Fette"/>
          <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
          <date month="December" year="2011"/>
          <abstract>
            <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="6455"/>
        <seriesInfo name="DOI" value="10.17487/RFC6455"/>
      </reference>
      <reference anchor="RFC9002">
        <front>
          <title>QUIC Loss Detection and Congestion Control</title>
          <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
          <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
          <date month="May" year="2021"/>
          <abstract>
            <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9002"/>
        <seriesInfo name="DOI" value="10.17487/RFC9002"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 1198?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA71963YbV7LefzxFR14rJjgAJEqeiYec8QlFUTYzEskhqXFO
vByhCTTBHgFouLshCmP7rPzKA2TlAfIseZTzJKn6qmpfuhukZHvi5WUTQPe+
1K5d98twOOzVeT3P9pNHr7NpnibF+6xM/vrm5CgZJq/yOnvUS6+vy+w9PbAo
fpg/6k3SOpsV5WY/yZc3Ra83LSbLdEEDTMv0ph7OJ+tynm2G9PBwTu8Pn/y+
V62vF3lV5cWy3qzoyZPjq5dJ8lmSzquCxs2X02yV0X+W9aNB8oiWURdlns75
w8nhc/pfUdJfF1cvH/WW68V1Vu73prSK/R6t6lkvLbN0P7nL695dUb6blcV6
tZ/Q9L1euq5vC3o4GfYS+udmPZ/LUl+t32XJERaKX7JFms/3k3f5h2xOA0//
84y/GE2KRa+3LMpFWufvabqEh61p/cMXozyrb7DJukyX1aooa/r5h8X6Q/Dz
D+t8MuTv6KeLl0fP/vjlH/blzz988fvf659/fPLk6X6vx8B0E/WGw2GSXlc0
9qTu9QyWSV4l06zKZ8tsmtRFcpMui3WdzOmdZELAJQAme8OvTpN0UhZVldS3
9Ap9XS6zetQ7oSczOt10llVywjTEqswJ1nX+D3pywbtIaQwda5Ck74t8mi9n
yW2WTofFDa1imSXX82Lyjr+9u83nWVJm1Sqb1PxFtpwUeN4OdJJn1aj3LZ6j
qRZpmc83fg+05WTBaDfAWh0oeaOrdDMv0mmSzpZFVeeTJF1Ok0m6TK55qOJD
Tu9fb2j2ebqpHh+9OK0YB24ZIO+Wxd08m86ypLihzUyzSTXAplJaflkBn2ht
5WZVE04m77INLRIwX+TT6Tzr9T5Ljorle4IB/V5h5hfZTb7M8bl3RWullxLC
t2lFF+fN5RXjKv8/OT3D3xfHBOGL4xf89+U3h69euT96+sTlN2dvXr3wf/k3
j85evz4+fSEv07dJ9FXv0evDf6VfeFGPzs6vTs5OD189onMmEDJ+FJP1ghGB
rgUf8LWiwKrMCLGTtOoR9Cdlfk0f6J3nR+f/9//sfZH8+ON/IFx8urf3x59/
1g9f7v2nL+jD3W22lNmKJZ2dfKTT2vTS1SpLSx4lnc/paFZ5TTeanq2S6ra4
WxLWlBkBdvc7hsz3+8mfriervS++0i94w9GXBrPoS8Cs/U3rZQFix1cd0zho
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
dMGixSKC5qyGg0D+dlRhxT7A9VKcG+xq9Dvjm/R4VbB/QzbEJITpeWB/8k/r
QbIHOPaQQxXz0VIs0MKQjt0Ip+1UfITtwTDvx3IuZjNouBdHvYtUjdQpR7nR
QLh4CN9FDAOCFatAQhBjJkfOwhTCmtmod3ITuVfFi6cRDSwihyzJ+6GdmxWn
CK3FRSvkZePVMB7V2XsQwMnq73AOfzzQOZ1obLsEQ1dNpyGAEXitnCuLvYkK
5WzqbVcNUcgQgtV+9zRbegv/OdhkCJdFumGTfBCSEUNnR1EQZ8BhGkzZSCCZ
ZBI97sffYSEkCq+4ma+Z0/TZqC7G0K4JLo4vj6/eyjQYPQwVccMzlUY0Dwaq
LTIuHizeGtvL/L7okffxvs7O314en744Of2aVkj6XiauXyjWrOYsdAn0slxT
jTgQr2qVq1WwfgBF6KJ8Y8KTs1N8p+GPiNnBX/3IZNEMd9K4WfFawxnnokBJ
34aYZyJfL5ac085biUlAlwP8xKUJwnKcZXvgI+E5N8bCbcqyKIOUptTpxhES
smM7DjnSdT7vpBaMOKClvEJTakMbSpl9zrvaG4KHB5ENFr6EQK2lOlYlVMEY
vdcxG9rmTy0tj/85ecE6jwZHmY53xHSd1ua1SvzTVC3jjzrikw9QHg/1ruuI
gb8Jmpa+k7i/Oj4mbsSn0RCfMmL82Y8I7fElMZZbr9n+uhGhO5KcJOv75SMG
Q/6ex/i6QKydDXks7k07mk8d8g9qZiA96levEoK4nbN3+6qHVYPxlh4TFMnC
GIcgzoRIkQRbw5x9k39oe2MnEDeq8P7aRd0WUaEmSad5sgCYq53VO1fc22d/
cRLjTcEhEyI+bI/xqJzL3q2/ETvDv92skXEhkgtTsnBCE4sXROdg1RJ/mEYm
cb4XbOIdayjUyKWwUFs3nA9exibAd8U8KoVHimoSwYhDyO9Iyf2mWBF1GA+8
D5Dfs6wOpofEHODnrEtkZ21bJw0oY0m0In3Q/DUaRX1mW7dYpUgXgvuFDkvi
/vIqUA9B5fF6KF6Yduus57JJH8IylnCP8b1nuzM+lKCQIxq4HvcbUQV3bL4F
M4wici1dN0daFbHyUdJAZGbb6jvUsAYaKJ7Lvd8M9YFXUz3khM1FaYLCwvwZ
gTcsSPwlvCrzybt5Nko4wuu+bV9nm4Kj3+MFuSij9WqKa8j45gKHdS3iBGuF
nLjkHV69ebG2L8GLmoHjRi6khCKnNTN+4K4d5D47TVp3EGZss9cj8gFhdXja
AnPozBw2RC8uC0i5YSyWrd0/Z/EtlQ2N2FM3YISUC5KPNKnLve+GZhMZ4wjc
krWNpu8Q1geOhySdEXQawWx6FC5CTYMaIS0EyQISbetko2sfHqWSkX9a6VWy
k41mo0SDDpMbWgSIN4fcrHwkJsOhP2hcEcZ0VYREwHSAEfcBkSa3gn0XWRoB
jSSRhSYgRuo73PVAkB32/7xP5xqx8ebUMOt3bRRDMGiHJfJdlq18DKA/PoOm
XD/nT2Fl1Z+hERv4swUgbLmIASy+0VpCTXjZlqwWzSGBUuI/jFiqxL1mxv7i
BQRhiVoxwG3FhE5Fj5IobtbQzezGRutwpqDqlu91xaBFWitjhppTxNjcBjKJ
/HaEQ7dIdhU3OTrAH+hNKpTfRNHdxN7tMkjeo993mLHok6Ts9BCHknYTO6Wg
ASPWUL5u5aDuWHdaVWvO27XwlZDxc1ZDcedJQg/pLyLYBKIOe7x/WKcWejEF
uWP3L0zs1xtRAK7TKjfFQHhHEK7aEK+qWJFRQgpNgU53rkZHWQhSfXn1M4G/
5vWEwsnv7mMUaot18mOMsGJo9FK7rk+CJCSBycc0deGFyCtpawgT3lyseqfM
Fkes+rj2N+cvDq+Ogz1oAKfMppZfiWknxCzm710c5zYhMoqZd0kriFMsF06L
D8NcxCrEg4sYVIWzEw39mH2QWi8c2H3z4uLsvLkv3OsJ+7XFTmMhGmrElBhz
S0RxeKmhN7XlH9JvIXhwggCNs3V64EjeSrxOm2DFdxrSSAgzJnRl9vfA7xzF
9+9bsKOfY8LUpZbwtTZ0LdxEtut8ACibAJLAcifv7Y65JN0EGBH4LUvKaFGk
MrDXzTM29tGjK8mTGoSC0LRgiHCy+4op0Y7GcxDYZrcsG0qGFItiq77BLsB7
JWXz7EZycxDE0QiojUEhh0sy27rWLG07PaaVm8yRx9TDeF/pKKQ5gVKba/PK
b4v5tCslBOJYXlZ1A2UMLUxFI5QZJQ0uRigFyjsVJWAt+QqPFJiPJK7zkZzK
9JELHgwQQvK6EbTIfJIYmmh5LTrhjt7HEdQa+uT3Sme1YranKCD+R9iFF4t1
LdIWpxKzrcByjyRL7TvRo2UyFxUlK+0rb7wnbKqL5MGOHK7Tv28cK69BnsQ0
6QrC4KWXF4evPWVTxqRhkMvYaTpQbaq2mCqOypIwmUzTTvzYYkSzyKsDXBPC
ECj4cHUCDrgF7ghM7GDnjGPM/IjqPWqnF3wKdql5RsoStpMVwsXCNmDlSCIi
lVcB/Y4JJZMkvEyX5WZd4mrPLJKaGXlmWSFTSy4K5mV7pm1zWLyTOPXvotGj
R2jhdtwBBQts9UGCoMjsWJvotBq6yXdCNsf2APjZNRmM7j+rZ2JMHFj0uyDo
1xdnb87d+JYyMGUSiIvUh3y0hYOowxMHPaEj1EzTaJ+GRezAnM3m7KdUggcT
A5JQGFklNtrnOYx6b5aaCtgQRXeWsj/hhLznjeBZkBR3L6tBARIFipfXfWaz
nLMY4YNI/oA3gidKZalGtiSAxklXje8lapV+eyxBz+GxaiKJBQRypClTki5R
KVWDpFKvnScfnvVjaUnNVV97pNgqQVn66Mvjq6Nvmnq1CSVekGapXmsoIH/G
1UPYyOVphsw2rWqahCUulJgMWahKpCV1GuyVcTuZw2xU6nRuUvkTEYCUrunS
giOv1yXHVDSWI6RdjFi045QDOlwugWRE0YoEbAr5ESc1msUwQNctaoHKVi1a
vpUZoHwb50/GCxcSeeDCAUTpddwq4lGDRhqOIdG8KN4ZMVwH6qFQF9kl7Ctp
rae/g6Nm3UNpDxhfZfn9ZTbEN8QEWkSNKFhE0nxu+pxxDPsZOOoTPVqor4UQ
WS4B8mlp2nn+LkOg577foR7LY4cfK5earHdMYPBjxJJ/7r5zEbjozv0Bx0FC
XulyLjgf0wkDnZKD1auz8aFvlQI7CcTdcj2BEh93PSVxy93Qj7NsB5zVJbJL
/teyeVwPnIxagbYJ1n0rIaHI20BU1jan7m7Oc4IMh2dbTHaJXOG2PGyZ25zW
E0kJUKDWkkcdobRXCvkZQXBnapKFh8K8opJao9Ws5jQnef6OA7TUY3Ff3qeQ
A6yVnkrnaw1hN5to2jD1OMUmMjrSBTPbCZfTgj3sPmO1jPuQjazfTat4Wxxx
FCy8AWXVh4bGhPLaBFGmWGLE2DgpKqa13UImJ+eANrpAjpObJpFWBQ/FhqS8
EI6mqresdOfGZ8LDDjznwD6OAMvmdcqI7YpQgibRIzkSIwJo85FsAZPXB1MS
XhGdE/mfOmJfFEUd3Pxiu+x6qNuiCaaKdEpROKsrssuZMRYkgY25S3OiXNOU
fVMCEYWRLwkNc01T40p16dxJ751rQ/gFXyR+ilUBmGvUlEEEPKtul5z7FMG7
sPxXc/ND56v5rOXiQqgt8+pdxWA3vFENQMUYRYbtpABwUrworkX1b5yeM3Ky
QbdFM9Sr4UhjFMft61k03DQNJUePPdJqWuYogo0QHlUebMRQLVC1AcyOvgen
6Pctg5s3KRIB3y5RmVze1QOqU9Na5dLWXH3Y8J1bzTeVoeF/VDkthM+ZM5fo
L2a7Ri0LmE6CggWwpSOhf+rB6fhhlDPszSEYRcpqMO7MrYIAoei6uXUh5g3n
sECNLR5CM1QUgEu+m/WLt96z/i/A+hdZynmJWilVa7NA12b/c5UJfIPs/Jxw
tna8LARbzKHdPa5g8pPZuZDv3NVhUoyRn6JiSfxNUC2pv5+cElkfJBdwuyU7
umrctT5Y+Ymu1/8mqhFzEqnZQFi4XTI5vzgLLKuK45IU7resIcQdwnzbvuE8
QdNpro9Gc1RdbhQ6D3E3CmmMpj9oWq2YVCMkUSwWMjpiE5k66cuMfXXNdXSc
x6vjiLQQqIHQlwxB9JRdqXTaOHIUS8Qu6boSZnMuMd8pIBYXk7PClnACsTWU
XVbRrgaO9HM+klhLdRJLVr2je1HcxY6sWLyYGl6wWZCvhdsJMYGiVOlAJ3YV
gcWFWx04OyjTUd5kel3A5Fn5AotaI6pE3NrJ0nRl0IMYplySs5gG0omTUu85
/k79sCEe21oYKotUkpsELxFJtijYyEuQuLri2Nl7jpqL6uHGBZVhwGYHTchr
sNbcm2qzD6iJ2h9sNR4rHZI4npbtwEfKWKSPp0e/VzNFjjQEesKCEl2YXHW7
rgkVfKmw5TS4wl+fHX5Lt65Du8CkCtyAc3PZOXcr6G/Z5HKIqlNB5Kjivys4
E/N/izfRkPUpRkKxi3ymx7OxahuR9UcJpotNZfQDbDB4UIEtOHw3p0ZOWrky
230MmW1mNym1rPI3K+91GFZah4EkVw0gSGAkM6wwQTl4RZcmm1fF0ObzEQYq
bIUz9T5LXmg8tBZubNYoYNM/846wspBWytRI6obFQtOFgHTIgVugCi7mJfGn
1Aq6MKTkmreMgiKW+R1WELWaCP5++ILA2EgBXZ0rmdCGN360XNACFTyfB9V2
rrSEp5U2hQaniS6dtVq9F1TNt1LBt1H1grkmXdm5KYoVJ4anLjmiGlkmZOXN
1uAUYd76e7VkWO0A2gf0TXcestxNVnvbLFwcKIHAd1T2m6I0NwpahdacfQSR
nkcVCHDovnhGZF/XYiTEIqTUT1BvBIUrXckQ6KFVoyRJUFhVgrvuqxuyzD7U
cRmS1utiggtMvw+P1xm6InwZl09fcAfiSq3LOSFRwwpQS8y9Iw1AcVek2Gtj
uZQUVsWSyHaVs/zGwd6c5UH7GdIVRR6Wr9HwmT8WuYVh6ZSgyEtYEachE0CN
5kDtsCqTWkFcCcLQw8cWhqbDWghPUEslmvt+84qcxgMOqUY411rALWXR1JEC
RXCeT2oUv6ilnMmh+1bICnwFd+JTl4ChutRARlHa3J3lS6FUOHYCxEW/XIxR
TMjE2sTjm76UwwkleUVRSSNvyla1snNI2/y6LcHo+2F9nqpYtErMSHYxuJLH
EdO7GFjnHUNWgU+UKTyEJNIKUh/E6Ja7I/bp4U06Idj0SXnQGoMAxIHwotJQ
0C+iZdVw008L4XF8kmFSCod0otXAak43Qmxr6CcwSCw8fWkGAKJdu7vH+vfu
bli2/q4gXlnwYaOoAWOKVN9BRa1BcjjPgXfPi2vk8wTqIld3ZhInOJwT/VtP
88KqiEF+7NrQU4zHDObhZ/c0Y61TRUv1UnWgAWuqskcsicSdcFb6uIdHoit0
TQf4Tu8MiBbdKboIqMiCECA/PF/jMUFGSTnBZqw1hpwODwmHJx/1xuNxTRS1
l87zx7Ke3xHgruXv/WDfb22CPz/1mwq+xAiyBRkBf3ePsNc1wh6vxZtSOgCn
N1UI4cDVoUun6UrptIkO4fX9OyPHyU0Th5kLTWo1BhCQfIFcrmy0InADXTmS
LM2d1NeBBoRh9DpNpPjSRX73HZwfgO0X3bB9AJ7PuuHpzvSXneOnn93VFhDV
CEKV8B2+vl0GOqb+7K2BmYjDE4b0C4tBhMqfV6q0otFPKlV07zkPecUqBkL7
xBEpQ1ZJpMWPnYQi2c9i8USxtGLOAivpVHtwepNCIR+f9E107BZWJMqlWYKr
wYob0zKvd4AwVtrFRZl7LrtKTPH1GRc2qikLd+lSitZYLnCa/O3sxRAeMi+3
D7TGWakV9TTegm1xutPQ/1G9y1d8EIvRlqWwDvbRy0FA0falYLItC3F1cHkp
vdOi1sDK7bV4LK7JLPKEWW6R2I2bCWKfi0Fwhcke83pQMhHxpmJuETKxrT5e
C0oSqKhlamec+g1rSqQlWYVAdBEA9Dwwmd6Va+lL8Vly7LbX838mM5YYl5UK
VUvF5VbhR5Wa5k21+vMqCv3ZqfroIJZXQR+v1K1S+olAtyyXA51bobsVKN/e
ZjjJYGWVxlwEhtIbZxdnU7CkxMSCH60pmrC7cuBAqmitoAStYbyC1suadENy
gxOgiisJYnkH5g5wpuQ4+o2BSkjBhiMfYFyuJ7kUJEhnM66sJbwGSJn5oMl0
+Q734ru4oBysuOEXYUomnVtxFxLBmapUsCvwf1nt5XDji8PXA7h67vIpx2xE
bZZoNXGNOVl90AxLDYUxFldSBYDlc6m0oFntgWWwKjT4yOMl8NGU+qAlVGzU
sE5GbXVPDGVRWBpwpHlWjPmwscwyrTH73tVHC5/7qBtsjtmlZ/GPu3Wthu0a
idLzQsyYQA+42IJgS4YY6/kMLC5KZmFICAAI7rNClFvlyFqDIC9R39o3WBSA
lsWbbepad5JNe0zGolsGw1l0xcRrhMOdZQ5i22p0PhjE2NMajTPpU1IsVus6
m95/TNcbF0ikkc1synb0TPyPcqmmlh/FMbGpun/ZgKCP77TH6rcLpTMkxI00
6p0hIU4FAEObHOYndxSfV7Yh9ZxMoclwtbqBWRKk6RWWiHC93V2xgO/u2ksR
OjqVbhzDdyuaottMWEh1sPWQXPn+ZiHUvvYyunJF82hb3JKHnzZldZK5NjRI
JjQIiOQjZRl81T2zbXb/qvaG6LRBbzT1Rc6Q9XN5U9ALJj72gaIPXZ+z5Tzo
Ba1g8UN2jJjwtOA6r2a9DCUA33OAgPJ3luG0h9K3QZG+e4GgBQhakEAmhnUg
2PHEAfIkh4ioo3LHHUPfW4JRznBZwW7rrDQBlDitzOUwzTnmzs2eYXdClNWs
o0rSrjYF2w1LG8KLykY53CLZ8DSbzNNSssjEL29i7bKS3ER+UwFeocpSxbX2
pPo5YzUQ6TBirNDk4OmVIZUQpkDaa3MmQfIz/FBdjWPSJJZA6NlddDR6rbBF
zmnd0LUbYfbrdSklbXUqb5XW4gTFTMQQCZGYWGi6lPMWm79mwMZW8b6PZXLO
GzY4zNTFWIf3RwlusEqpNzlkcbNgmyjkPHbhzZBAtYFz4O/cPEvRB1az4Ha4
bEeUwVQft8ZxuLmhcrmUvgbMNFtYTQvI+azEjY4M3ZD3mFYlqVMoPGoeblTj
kg4jdpoVjniIU4XVj2RcEqfLd9IA6XDpqKDsJ8wHZUgq4GGSFVe3K4wrAg0i
QeKyuCQIv1l2llNofN1ZT0FSqEWFM0eKq2AQ1EDYWg4hqIawrRJCWAihcxxS
LDl1HyDBOJ50hzn2QUr9toT9PV4P+pLck/5/3ziSooURfpTmOS4ecnsHnahl
jmjN9zTOwZm6tFP+obulTaP1T9BAR0VEnj3wX3b34enqtNN26QXd08J6U9HG
WINw+BT35tGoLMtA1Jq48esAWFhVJmq4cX5xdnV2dPbq7d9Ozl4dcpPZuCnN
b9X9J9KiCzZbONuKhnXOxCPqvLepc+DkaMcsZhLZMi0oPrISelt9O2FDMQey
fmx5F9bIQogqUdKsJjNtd7UcUqdWR9chcaRr8fSAGWldiFiVyJc+gByOt2Z+
UFCBOzxRwXA9RUmhCHFP8y+3p+jFoYyjqMq3Unoh9M1gyVCL09wE8WQzzc2D
iNSRKzwdjhngB0IdP25AEz/QEKwRIbGcNpWgVmJclN5gzl9JN7tJOV1YYoeb
LnHr2Cf22k59S+L3+CU/RLghriu+gRBVCs9wNS+bJTHNPrVeWm28Af1t9fad
eSbo7zj0/R1dJwC+HU5MYMXWVzY3NnPYUM2cE5NBpIrS1pLu+dJFRjG6ciCR
dzf1XR+uNMLYUc/tWnOOa42O3Y8KbipbhvigTc78xC5urSPKZQJfkG6D//WU
txHH6kMvnMQrIoEr4O7SOtN4ARKJ/ECJdkfNObbVOfBD950xf4zp209MIwAh
/X0addGO9WPrnRimmTQD+bgK+NQ5v83uY03FqmBK57UOrS23Odrl6Bbzf7h6
o64rgaBB1RUp7FCQmz6KVVmry7lJ+cwkzAsy9EFyl5GwKAkVgT/LRcuKOGYR
XX4caEImY1Vrbnvt6l84QF8XSHXRcuauRIdrfrFDa832xcepx9eoySi56Ade
TgzG5hA6upquzCIIlJC3vpY3fHF4dfg1UdLkOa8E9UrDDKGdvE9fNXKE5Euv
Fsvncw0R37l2tRB3d8PBSGtspyBp5412OFMczmhBPVvuTHAdXJ+ApUR3R7MJ
h8pFTQyslNrI123RlupTI2MriUlwlu/OJYi0UmLuEXjUOGzX3ED6dUUtiILo
slDgAp/CAh24W2trGRCUQGobgIBRDdo9DSxDJ2jQFvQZkHZmWoJTTH870oia
F/qkL+nmiJLvWA/WrWhhq5ZFOR4LeXYadC9iGqDb8GCEjo3yGfHFCdbCSqIW
V5XgFvV7uXZNivZB8WTYl5K9p0+eSIUk5cC4K0F3laDdB3qABHE61lYc9w4Z
Ba+v3rgA1JPzoZTKpD3Pgq7qChHVISVmm0nSjWtqmEkVKnC7SMJSliYp/1LY
tAun0XveFo1ZvDHNdsg+k95nybFSmrg+L5J1Kj0Q34MMFg2X4MpSgxVDfQVi
1HvNMXZRrqCWypiaRMi4hF7BSr5YhWZbdyBgwUjprpkUrzKA63SWjoK9Cdl0
xyfjii/RkXvtni6WI3lCsUyR25ZTc2FaUc0bMVBRwGIjRmmr0tIqxtIICWc6
5UrWyhoE3a3tckPp825Wc4ua98y1lKx84/aYVWh/7aAc4o9ho8efUW7WMaxQ
jEcNG7tejZMKKlSPhKVEMzBDkSeu6AmwCiuU618myhwEoQFkn7frUqJHWYcF
Y8AXxbKRHWEzPaaybILmlfmIujnGQ6I9vml/Gdf5Dcr6Qog/SOogrNN6ezp/
ZKuRJ3eKYE3eZ22lonmKBJNPVYZWgi0cDEcLNVDNFJyv2d2CV6naRxkZ6iAs
Wo0NvnOF48riJmtVzhtYMTcIzrYM5Dt9F5oCrC2xFX8wPMLqw3LLMbVxcofp
86i0pt/K+P43LtGcjEYjwr5e87cfo1Gc1OO/2jLf34QhBsWfmd1FqzG2F5Sg
iSevQho2ikcQkck1rhBYBkH2SCLTo2rjt8qwhsPhsFXQ0ZLpRoQBNRppkTKl
RJtZGcKvwATgoo4pIwTtCH7uNnBHtVRrjouFhdDiABF34VI/wQqkt5QJewNa
ckgGcE/km+dF9EHZffQ6frS3nY1o6LoCQfoZ+LIemdRJKE14CQEgcZ3+oMIq
er4Imm5VIsmtrKT6ubzdJ8x6gpGN5Cy+aN6MtcjS+Ka2GgBr8p+tRziM1zZa
KClNRtFTYd+Zf+83/koh3FMW7sTUKsBOItNvZPhtVb/V0reuCOxPdKRs8qZr
F5qP712HFrtFuTA1HaeotNZPPnIMn/UWUohmBtnPEl3eeKxBYeU44E50qCBW
fKH90uhQqr/7Xpsgj2FuneWvaY54C5+re8QqTMc1SFl/hPhmGXOQh4w8Z9Zj
vJaikE/Gye4uZ8ixp6+hvTeRi9fGts3kOCojGNlSHdwQCb/Ho0uGVXt8Vr/D
jLtm/hP6WnHLgGbaEoZ+ykNbtlb34D6BjtP4Pi0HDeeAG+xCSB7I7hokUvEr
jtbj6DxrECvU6j13VIUNijbG1rHALB2Uxd83cEuntgKdwWwl4vZdQvurfFUF
gabk6MMN5rLZtIWcQwY5k5H+v5koZulhHDBPRF2SMEqpx678AMOH2IzQMUUU
zalz6pGuAsSymTIO79a8EVr0edRAWhDZlXKVWve4PeHlEddrnYwZm8etSO4g
TE99N+HLBwG3aZXm9DJkjgQPnkS22J7GpUI3smY5X7ZY5rWyhHYqHicgBhor
KwqNdaD4yYM5hs0yYmmQn+6ROsgt9ViF6ZHcTcuf0x3WdjLiJmb+uJZoFTaO
0uGK1xgug9t8JrU11CTXNzjZ2XdDylfsaSTMinDaDYQ4M1dvXV5bDgpzgYie
0xctch4/ZJWlhTHLkqDk41JIO5g7qb8GQyJR10ES11IV2se1YIvFihBwqe5z
l42FjMFD7Sov5fhzvCmFRhteQqFUJStAWmtH2oZvkLH8Pi9rjoS/ZSXcdbve
NAtrWtLT9CCRlqYq0LgIcl/cLzC7Dq3HkqR1W5NN3+7jzRKRtLGIShL9Zp61
BAzroUC0fXjLoWD4Pa7gXcJGjDaRPr/b1/KRwqU+lkbOY1gXQ4WlUzciX6vS
204e6lI1kzdXL4dfsjomJJCr7HLHAM2FGD+W1ALXdgwnXG1IHP4gx8sZm9yv
6Nkfv/zD95iSN+vmlIgpYSPWqUvjfKT9l2Ebj+MSOEiI1xK/Qbs4a8O0Y3/s
oQnWto6GPqbGt76x1m+toZ71By6HRGz1XueE0MplXFxbL0spskphbmdEyt9n
Gw8o0c+1WKprGjaSEBm9VmspjeLW5Mp5RKAJNk2gfKa2PfDu0IbauNaI81Of
qRU2bzwSavOVlkP3i1Fp2rrHBiuSaKCo65xb41OBfVfLIffMF/2PAJsDmcCA
H7D2fxGVspMOWxu5laL39CpTmiklR+TeNF33DdAULlfdNQV3S/50j/7Qz+tg
rg62eN6REgC6R5FRaAAO6YHkJCBO8waSIi5U0cqS6EpWQe27+/f7q/bUObbR
LiE1ReldvmJH51MVW/KnTt2YOIjKmhSzJZcuKcpAJ3Rcjd1a2yeEfCapgu6M
rNVa3bo7B1JyzNrhdNL33PdnsPwu2JP4Ua350gqO6KuNq9Wp4kdfK1u306hU
prEg25tcRMUMw8wM8w12lqsKqiaXTTZrZY3ccWuVe1cUPAC8Netg+1FrhQ8a
v1z+tx6DVMgmdZe7DR5/EKM3t49AA0Jnpep8DcYmBwcWC5hYfPr2kBqhu+LM
RrcITHDjOlZvqbSDNJeHWoaEq0F0u7bI4G4ajFeBZ6ipQoTdOYQ6BBW7+y4e
BPuA0cdHZsDmjuBMxM+6WDwW1tDirihWleZqzteVxFbEGqipDVzwsd1+5bdo
oOLL1ARQGnzyeJphot0qRr2T2Obn3CEcXDyFkM+VCmDhUm+zOnC96bOrxwv0
Dw75rH3gf/bhlqQ8LS0VXXqCT3Dfi3c/R0Ej7ZsewLPTMK1VmL1lWi6nhj2h
Pbk4qBtl4mHy7u48owHXcaxyI6M8DOT4iEY1sZcrphS0wweJhN4N+RB2JQnd
Mbu78pgzgTaujPwalKjwXg7e0q9ubNNox3NwL5I6RlRmqwyhlXZZbT0omemW
IJKTu/VopCNuNrzzRMsdM/OcahGrZfJITeeP9k3kIdFcV8wR62nFoX8csw5N
GDa9a1JbZlKejdPJLNvMF7gTtx6i3tXdLXZejtGgayJBmVY83JTBgpjZutQ6
I76xn5KdrkpGWBqLHLpeYe23BRKBHAU2+nah1vgKogJXFViris2JqCpOVsm4
fSQjGb9Kfve7oJPF2V/0++/H4AEhzrU9Ih/VS6gj0eyj+wd1xcddI/jbR9mj
qE7YN6WjD8+DzYZsA9bRUuLVweeWrqRMY3Vi/71m0ijRFv+81kLNPkKHiv58
Bk+QTKmRHFxsyDkVPMDZNmD5IcvCbaLFbA6kno9vxuPhspMzOd30W2tuUnq/
+R87mqE8RPfbUloUY231EuELarYSUhfJmeUKIHTrAyT2pRTTVD5xl5cBJ3EX
RbtfuHskLHdVZiuLdOkWAMUfzq2ZhBr5FDCGppQifYhxu4AprKRdEG7UCrLU
7kJxY6FQtst9uwvfKwp8/ZM7DQ2SIF6HMF0PQW9a2OQMPaC0aY30Lwf3Q9hU
qdITj2IrOmh3uYl20N3gRsw+nY13O3Gp3fRm+wgxl/ZjPMisA0kDuKCdwxsS
+6UgpQr6DDrH0AcRx2efdyD4N0ZnYnyY3MzTWTOsw05WURLmGQPwzpP+Pqcz
qcbd2efLdxZLdvYaj98FDyZWWU5/beLaQHj7J7a0sh4moXyBvGQkrFkRWK1l
+xF9uUYdSpMcgbAzEYm0y/DU63mNEtTawIgQnuvreroRPzYyYWwLv2yoOoF0
OIBM9AtVn4gfPFEG4CUem06Duip4ewKkURHJ8em4naAUhkeQk+YAt1qx7DSY
DSKxzMgrA6jYpDO4U0JwTMsvydYExPuriLQ15CAqRdwdcWC4JJfMTQWFpqHk
BGwvhtwolrEPOZiJrei5xXeUvq2coKRGMgF1GjX2PaDY9C+h+HhEf64blZqi
tpXADTeAGW7bv0SSP5+Exy6Ls0I0YVUfqEHfImGR05vHihgLkIp7WiNcrUha
UTFCGJd7bHJ0dNgDd2ulZcCKWWsbJ2j94QIc5pu9CWRhx4psE1bJLj09c0qN
r7XlLOhLFT3rxrXSQ4uYRK0iip5Ku3LXtR1Du0lcrmAT1PtdsjduGjfcKrs2
i4Z9eoKt281v8zVh04boOk7VgR3Mssl/raZjp/UrlJyDxh20vP2buVYxMtj5
m2gUy0PLYqFozyZwuuIFPV+A2mLZ0CMpdJtaH69mVUgJV3PvP8jjO0LsG8yF
GDuH2KPy3Knkekcv+gJ2yc6XjV+0nk77hyDtPQ7sx6bCb44JsyPbQDOOv4t6
TdgQt3QtpwLMPuyIwlf3ivbVCIKqw4D/gWQDWwcz8PcoScAVK5BOg6NorR5I
zqgRFEkKFrlyQby2BpveheyL+pQm6y+b6SyqaLk0n13xeu9q7Ui1MXUU+3Sp
gOcPFDqJEgMR88H1I8qFiZrRlvX05ZA0EwDJ924rcKhpyRlLVC6zZtnPtJqo
vuLKPk2z8LsnfeE8D8IDhGHXlfroBgfOGKV8/jlgCXDfkKFR5DDTUgYDlIQl
6pJL1ipsp6UvkdOuhoMoF63XQ//ezAkBnAdeaqqamTSbar4/c5Go9FBUrWIL
TCXcZKeVFd7vKAPzS2u/cP7KujQ9qOGmadWWOWgP5WqQ2PYQ2cwhERyUNEPJ
+qplfAiCGP2hiSfGZe3H0yxjkCU7Ufkkbe/jzEIC9aJdvkTL/ve9ZbNZzSlE
DWsFqHn/SbmeS3pWZ1kZNAAUJ2lQ6Ob+Ik5wgG2rVQLf/vZyMu7qHG+r+vXg
lQk4gkvZwY11vSsVOJ3qQuuUdqbZTbqe1xBDYrOjifYubyhOWmRRJ1gRcSQX
2pt2LEeFIq4p1e9c2tq1TPvVa4rkBi16FPscEcRYkLa5acgK7aancUPVRoab
s9C4qq9bO7E2av23q72q6MLBEa4jmdmqtHtI7pz7zsWOhlZ3WhGmuiWqzfpU
vynz2Go+XvT5/yvBXEZtCONOIig+5a8Bh9KttQcCEmr0xHHvetJx6h4JsdGc
98HmV5Y90emO6uqvpaCXhXyqg7hTrtziFrb71jBihE2nJDPRjeZsFWmjOdXI
Q1Aap/wYUK6fe8EPAWQb9oBmPYKo91cIRRROb/j0QjA2y4ChkVfkQmDDEGum
v7qnlz8p2d3DySytAtV6CVrlMlvft++Gy+MMb8KxZOsjPY4Atrv7EcWvd3d9
Mys0BwK9OPB2dEZ61PORTgZaMTttdhiyQX1Tc+O6ckVctsQdCh0Z2INmaHPt
xlq7CLKg+WHUZFZaAeGzNNhxtadFIstIXRHhZHvnM0M4wy4UsfNKLIAmsQD7
TsdlJ6JEIm8rlM3+RWRodpkBKk0I9UGY0gixSG7SpS9+4LB3CCe11UZf196R
HAyPrp6um5VEhSpsrKEnwyiIk8d4FebcpVF3SbYIS82682j0d40Iqzh5YLNa
rYoq10T2jYyaL3etKI6GsEqMoRmAF1k50zJWVi53E9aBvykzvqvdxd45s6d1
k7o821HVaAi/V9JBq0PxG3RXdQccrPxZLMuxEQLFqTvq9P6mik6LOnTtVVg+
dLZcm9hr8bYdr+yNSdkbN5Q9+u7JuH/P9v9Je+nQ2RbpB2Rcp7MuPa3DSby1
hCkxMy2ICA2A80tvYtXgF6s/mlYhRSXRoU+oR6vsqtMjBuoVZqOZhZxw185k
fMTrHx5JSZF93v+Q9j5OZuuUFOw6y7S2XENozKuKYyG6uqpZ0JGoS+NAgBoH
0ZSRNiPebL2YptYxEdEyq07HfKAgpoXbdhSLtTLSRbG0tJdtShCMgz5aCAUN
SI86iKioT0GsUPc1Ug4DS4+cBRMqUdkCF9Z2FbWFXt0qaqyRauUjBz7ZrGuw
1amQsiVULOsxortIqu1FhX8DXdDJD20flK85wQuspIWsFPni4RqVLSsX3KMV
wE98pQNTwPaVbV25TtKpVAbEMPN8KVXTtfMuaj/5GOyxL0bygltWSoC+8sGo
ZETXO1aoFaO6SprSYdAVCKLvXW2Xfr+7C6UL9A1KaIgO2sg49+ZQvpZo6/dQ
R8xR76hYLLi9iZgVraLBeO/JE0LOnRBBiFbja/uFq376X774Ur6XdgeVdKFk
eaYvlXTGf9QXL4gASUcDlErsjxqaL6LxwmbuyDkPfw56Z3ELzKqpDUuXTzAS
6erX1Yt+u4YU38Uq7GLTrFY28P3uG23u4RKwJA2dpi6hDwzReEg6xJcrrdz3
uvjBhfd/XkX73ZcCAlKNsjZFyALxS9ZLikYjNZZBCi2WZeKmkGHDVEdbFFDT
aAM7HBzio61FD2kKzA+YjRqqfCOk0Oo2JH/muozbFBdhI5HPgF9kynEpbQO5
qGMYaZ12ooo3+XxsDZ7IPIWKKlqp3hU4DU170pClNeaAFCFS3EjR4SHH7nf4
2+Cst9jfiGFGhbDvF4YPtK9mI/wnHk5txpwtxmVJZlpwWbv4aiyEUc4ZIjCt
dGGpoqZad/0M8U26UU8tJzchHlZHCeo3I4LZBFoUB1367PUUYcsEYNdgWIF8
EB9nfbtWfSll/1wK8cf7U5nlW+P0OYkVkqiItiYo5hVUKfPDvrg4O5fYKGib
Uy0b3k2LbfttrhyD/M9cxgj9yqvGLTN049zpJuk7Pn0R0T4iPTHx4weMTG21
abBDMa4eqSKARqbM8vfwM+tCDLHpek/XE3i74pvLk269unu/5urubb26wUY/
/e6GplyGADtSQqSKrbr/rFv8eOxshvGNbkeOmlTJdThdqHx4aFoYxQrvxXCC
sKloBiWW6bwzGtGyNOjFohlEJtjuX4BpuHE/At9PyoE3mtkfrUvj4lxDaIW3
tgyM+9oL/wHzFHlKdmtZ7eGozhmrlfvlhjavDq8yuipY9oN3ZQtfl2AE3bDv
ey6h3CJocvcByNRWblMra+h5NbzArvpOFK2IZ+PDZEATiNLZbA6zjdcpHAmR
Q95JYxLHU5g5yrQBo4wE6utNREnb/Bnw2nrNn95/zbdbypPkGEbNI2ZS91OD
p1upQXiW9/uTtrlYFIYGGEBs1HtBolFuro3bFMQfJkyWsJQv/rP5+z3eqE/Z
TMNTZUnF0bTI5v/tttXahT9pxAlEBTZ9yRsxcksz8MijZkePWCk8dRCKD9Cm
GaM3oeggdAA2iJ5YIj7Ki6IGz6DJR+p8CoyfMtRv4ge5zzvVUQLzl7tNYM6F
1scb+lgnSsdbnxDqIm9+dIzLb2jQ6y6teW9FTdtpK31OwxT10sQloNVp6WNL
w07oGhHsqqg6X5JUtWtxehI+K+uisHb91mp16W3VpsyKbaUczWgGCxr0AwA1
dEe5ATTAsB/cpYCSVF56drGg5qXAXWnGjDT5uOd3IFkwcoQOLvNqBaXfCU6Y
4u3xxcXZhePRFl0dqN7aKo6DqDmkATmSNGqjSqCQAPQt70n3ckuqrF0DDTHJ
On3DSn8Urszy0gr64frJMA9ffx1GPl1cXTVusPzMuPmthnbW7UA2OkAViVBo
vy+CWaNGCetODYtYh1la6zhy5Rage/PwIHTdFsuCq3G5TvP31njRWjVBhRye
0tX6CZuzQ09tFK+yKlO+KApjondDBVtlXERxuakvrxqvXFKOqlEbmkG8t95l
B8jtDenbMN0S4mG2nN1dOmJHaayVPUKPhqT4rhJpBNP0H3DxaS1zwiaTi5dH
f3zy5On3D0z2FWsEx/vAqtwZ5lwhSsFQuztWwQSBRCTCd3RblvwtYh933I02
qiZxeH6Cxklsb+fpODkDXQg88dP+PyIdOX2Ke08CpBDkdaXrJZL+EI7vb5yV
8A5icOtwAXKJpT08V+fHHy35vbb8MAiIMyJwGZdksCIG1e26hnHNeSOsGiVh
FXai91uHf/CCn2Z3iVYNkLoYYVxD40eJjeSnXO+nzMQOJTC4kofWEkArwURi
j63zwA+gl1pFn45CCkhCyFeoOwH24Dyy/BgvyCp+IkuCFBUi+Btf48qoHxqz
OuWEzjC/2ThKOyGWxWaUdX2rbZul9j8H/3DuBreu4CBPGIN0AeDfhABa5aqx
yu4aFOxsDpekeMEdH3Dt4t4PrklPO9JGaxzj+nGtdRFCvHcyrp4mWpr48E3L
E0zBfL8k9vo+2a6rgHmcg9YsdU83QPIIjLFNpVL+mivOm1nNxXM1WneHOXw+
wubTJShdiMaN5sYEiAjv+SwTDtUwT2fLysFlZljuTleN3hqgX1CVwmBmEe5Z
HsPaIslMVRit2ey6wVrvDEjxeD5SamOPjh7VlgqwHZXnG+9bPDTSGKYY0YlR
XIAgL9aVyERcm893jfrIMunHmhoK1P1HPvtHOhsuUih9W0ozwm8rr+0n4/VS
l/ZnTkjBX3/6U7LXT/67+/zVV8kfnvXZb0O3+pY4NGloJSKNq9v8pkZttReZ
judHcyPT+xhv6L/6j/QNZ2j/NyxYan7Ms/Q9KNxySJuViGHpr6Af1P+0M36S
/Pv//F/Jk0Ey3MNfe4NE/nhKXz3FX88GifzxxYATEcd9duFVC2Z8i3RG/AFl
BzlMQsIOeV2ogw4E2RsicF0rdKuo0W5KxHm4vkw5Yzf7E0eBrUHckfDv+76v
jANDS+kFLoyfjOFjZFGj7VFU15AcblQWvQ4tnVur32/TsvVeaFvkGMHHCMPg
Wxk1b0DbizANGfcvOUQeVP4hOdxPjhAlMy9muJhWpm345PeEJRcZ65ZTny90
cnp1fMH1ZohatWrQMNzty+gBXwSAIxBQLzjt6DbVbobVfn4MYXQc1wltPpIy
PHwVNVpKUCMrKn3FDOLBwmo7YR21uDSXlkQLFtoOw8QrXg0cAa7clFSDx5BR
OaQX4UlsOEcKb9jo8urxi5eEKqgDzK2QI94nypYIJDRSZJUcBcc7FlsfmMf4
8ZjtfPI3z/9xBvBBK7ZKpInY4AcwaXUZ34bm48o6FB3ZvEqU8yKoqMvSsT+O
MNNNzGeWfpe2yiP4txb0I7ej20T+eVpCfIzycJsA1NpzquuZsUkpzRYsU3Rf
fA282BbQEq1AfeJOD9ECERb45FMP4EwQzWkujPijQ592fnG0UX+0vTUwtzoU
L75ze1ujqliP/rxqZFgEHRZ9VBrD7Vh6QxvZbraKRU+bqLuk9hEO+ztqdFcY
nhSFyopJmStklD76lXt7ovzhWoQ81EEk/MlXXOyU5Tof24JUHstCQZfNyqNI
jA9RtyyxlgaPEv1JvvuB/vt9oHE5QsavWK1GntLV9Rs1SPwXXST+/NXx4WVM
vwOT8LDrkvKdqsYS/mBXU3Pb6cDEFBWV1JEeYAV9wx3y1Erj7kpQCGzcyWhc
NK2MgdJaqSKCjKHKoFphBIbbFEsUMclnlslkQ7Dqy9XaQ6V85MxD/BI/wRr6
E0zg1fwIxs9owL9pi45AJmTdGSUxd8bu2Q8fSOwJwo8jDlmFfOPSLLL6xxGH
AdS+TycT3uPLy5Oz07dHr06OT68e28fL44u/HV+4j43UEJ6js2uFli/2a9N+
FRnqeFVBawrbI//Nm7Qsa6397cArFsnggCLzPR+MyDr2fMCisD/HpJKQsz3M
hoTZ6pixN6oIe0CZHXLY+k4zSKX9pRZoJzHVXBqxR9OmEjRyxSL4ikAljM8h
KFBuRx2IXidX3mHmLotcvQekra2UGEywnU8zjoDagKCFTrvB2wHU461NtDVw
rBWGHM+opxSH/YiFCjYjpxSDuDav3FN/wB3XA9xiypW0UVepXt/cNAfYcwO0
tUgrs+OvTChPP99P3lgo/wvX87oihfKHdT55Z/E6FXdzuPHFnUGC6IMj5sO9
L6D2+R6b7uaZZHryAtf1nMuCsCl1PzktiAhVBeht5hrQ6a1zjjTm30OU3txx
giVGfGyejn7yvoqC1/TlHQd2zQXgcY/CjiANAtcU8pGn1NmZJ4nrkErNragp
6SCEQSOyDo/zdRJi9xazPhZSJx+CWriqDGnvxQAp0JkzOpIIBkzpQbGZWFnT
JUtqnzjmcYqm0vzwur5xtaGjE7QO5+mmEsHfHHrVKp2oDURe0zTSpTwtAtjG
f9DuJI5EqW1Isxa70nd9xyf9trj+O0yoQ8YeErzkZOUj/n4sT7Clii088ot+
56MH5euVGHwaaapavOPPT/rSPjSboyeKXi1+9fXhf/UyxtuTF0z+hNVfvn3+
6uzoL8cvImoAJxOzqlNflIFuwpvnr04uv3n74uw0+Bj8cPaX4IONYSqY+zP+
4eiQSOor9/Gb48MXx/yriOGXV4dXby4bH2Ww6Bsb0yY/JeXg8vzw6Ljru3id
/uutg/hFehA1Ruv6oQOK0cLOnv+X46Ort9b3EYdn0mJweB0vJ8OvWkKbPAnT
q0KRnxIjcIgWL9GZrHdZOJ92lVmjvmIyWSO/zxGigAozyzTK6G7V4TxPeZEi
KYDX8Fnm3J0A0TCgsSRZnAGjnSLB7xxJR9pj1GCnz6/Yp1WZDIJJ7KszuyN8
PK54vVzMmX88fEz/lupamNckqG/gZ65gqLnMaMfsiTvSsgDi9+k5MpUviUZa
x06vC1T2nhqdAheNd4zue4tG5DuyPr6IxZ6KOZfHktywOpthZCbwrGHsjZ4N
omLxXhEp18TmOOWan9shlURrvIzvqmr/8eNxoJmQsH8nTCBosMKUcE3D0gq0
Y1uFzDUunjQpVuon/+7IvfH9zmf+9X5fqqxPItBplBsiT8ywFrUnYGR87npa
nIvcKiY314xCe3NIY5GPdpJKnmIUwJJW79qRnh2tZkTMbba54DrejYLBHHKI
gquhGzatzMkjoRiuh65WibxTuDf6Ekvrr2qfFwTdlmuqa2q8OmmDl0gRnnJh
sapwnWd8lJ15ODiFgHPdafk3AnlXHTyACpCEcLG4YbPedMp5O/FegSnSWsB7
sa2piofEx/Q7ea5+VhbqUJz3hjcNWWXJHuZU5pwOgs0OXefmabvrhrm5tACV
u6qoiAmPIP01lFKpAIdVDX1P77koSB31InPCknk4XWJK4AttOjW1tuu7aovT
MptXGVo9MVgXKYuM7NZAENeCjm8BgOK9CVyV0ksj12rnsqagNH4BIaWuieZm
ZQwdLjPPs/wihyYHkNznp+TfO52eURay33fedmTq/RXg0rWdFeldumHi8RpG
gZZAw/DfoKypr2S8rurQS4TqQ3Ic4vVlB5ohSpuq+a5N3O0bfFbrhL+2itG8
n3O2T002PaukKwsPLJy0+qDkteYltfXC8DGfYN23cAExkrN1xcLRUh+iZmFL
UsjmfZbOxRmE0PSCTq2YbeS0eYDuTtrTvBJHMSI1kNNCYOHo27WbXissW9Xl
HVdiObKQsJyMUARfXEpofmxDuhF+n3dU9oewzVakobMioW+4l7wnE65Goyh9
EPWsyq1rgmYZ0N4QiYP2WeCWdaOE1Zxr3q1XQi5umcn6Yrh68pateOxqm3Mp
1kxrhaA3FJLCzdizE2HnIKqOxxWJkOpe9SV+SwSkObMFX7hTO+8Sid1Sul1S
H+sor48A4uhp9wIk9zCrBmGGvegXg7DwMHfkYnILYYSJr+c/y6nph9aXvEi4
JaplcrK5O6/Qcd0IbvNW6EGHOK9g4CvuUx71vW05kH0LyXfVnaROkMWTcxey
BcujC/Ya8MLDncjRWoZgcrL8u5J0lzQIgQStnKbq9IkcOcU804DvMChB4KrU
iJO6NL/AUxeJgNi42DIVBwHqIEIuOVtKF1uUosnVGv04kgoDacSijaVXfS7t
3FAccRrth3MTM6trHAmojTZjD3WmvrdVuyP1JJc4n5JxEz0fVyXSNc818rk1
bZNP7EzaV1kfbkksN34uLbshbFXJy7BbObKYtPWVdibkUBbw/oD9uHLzE9E0
6AIeNURuFJwxiVsPT3JdNQFECouw868uhuhnRDLqRstHANppqRxa6k/0NcE8
LFfOd5lIuHTsCuVrV+tgSvKaNA9OTg5PD5vqiMSQTIvJGsU7OL2Dtoon04l2
fiUNbTjE7YXFbMInSRIC+p1XvR/3hbRk0z8/uklJOnn0M4169uKMBrAnSTj/
fxiUFJB+AwEA

-->

</rfc>
