<?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.43 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-nandakumar-moq-lb-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="MoQ-LB">MoQ Load Balancer Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-nandakumar-moq-lb-00"/>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@cisco.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="01"/>
    <area>Applications and Real-Time</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <keyword>load balancer</keyword>
    <keyword>relay</keyword>
    <keyword>routing</keyword>
    <keyword>namespace</keyword>
    <abstract>
      <?line 67?>

<t>This document describes an architecture for load balancing Media Over QUIC
Transport (MOQT) requests across a pool of MOQT relays. It introduces a
MOQT-aware Load Balancer (MoQ-LB) that places requests on relays according to
their Track Namespace, and describes the control-plane, state, and
failure-handling requirements needed for a horizontally scaled deployment.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://suhashere.github.io/moq-lb/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-nandakumar-moq-lb/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC  mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/suhashere/moq-lb"/>.</t>
    </note>
  </front>
  <middle>
    <?line 76?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media Over QUIC Transport (MOQT) <xref target="MoQTransport"/> defines a publish/subscribe
protocol in which clients establish a single QUIC <xref target="QUIC"/> or WebTransport
<xref target="WebTransport"/> session to a relay and perform subscribe, fetch, or publish
operations on one or more tracks identified by a Full Track Name (a tuple of a
Track Namespace and a Track Name).</t>
      <t>Larger deployments typically run a horizontally scaled pool of relays fronted
by a load balancer. Existing layer-4 load balancers and QUIC load balancers
<xref target="QUIC-LB"/> route QUIC packets based on connection identifiers; they are
oblivious to MOQT namespaces and tracks. As a result, they cannot:</t>
      <ul spacing="normal">
        <li>
          <t>steer MOQT requests for a given Track Namespace to a relay chosen for
that namespace;</t>
        </li>
        <li>
          <t>keep a publisher and all of its subscribers converging on the same relay so
that fan-out is efficient;</t>
        </li>
        <li>
          <t>move individual requests when relay membership or health changes.</t>
        </li>
      </ul>
      <t>This document defines the MoQ Load Balancer (MoQ-LB) architecture. A MoQ-LB
is a MOQT-aware entity that sits between MOQT clients and a pool of MOQT
relays. It inspects MOQT control messages, consults a namespace-to-relay
Routing Table, and either forwards or redirects each MOQT request to the
appropriate relay. The MoQ-LB does not define new wire-format messages; it
reuses existing MOQT control messages and parameters and specifies how they
<bcp14>MUST</bcp14> be used to achieve namespace-aware load balancing. The architecture
complements connection-level load balancing (such as QUIC-LB) with
namespace-aware routing at the MOQT layer.</t>
      <!-- MoQTransport section numbers cited in this document refer to
     draft-ietf-moq-transport-22; recheck them when updating. -->

<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?>

<t>This document uses the following terms:</t>
        <dl>
          <dt>Relay Pool:</dt>
          <dd>
            <t>The set of MOQT relays behind a MoQ-LB.</t>
          </dd>
          <dt>Relay Identifier (RID):</dt>
          <dd>
            <t>A byte string that identifies a relay within a Relay Pool.</t>
          </dd>
          <dt>Routing Table:</dt>
          <dd>
            <t>The set of Namespace Routes (<xref target="routing-table"/>) that maps Track Namespaces to
relays.</t>
          </dd>
          <dt>Configuration Agent:</dt>
          <dd>
            <t>The control-plane component that provisions MoQ-LB instances with the
Routing Table, the Relay Pool, and relay health (<xref target="configuration"/>).</t>
          </dd>
          <dt>Eligible Relay:</dt>
          <dd>
            <t>A relay that is Healthy (<xref target="failover"/>) and, for a hashed route, has a
positive weight.</t>
          </dd>
          <dt>Selected Relay:</dt>
          <dd>
            <t>The relay that the MoQ-LB chooses for a request (<xref target="placement"/>).</t>
          </dd>
          <dt>Drain Deadline:</dt>
          <dd>
            <t>A deployment-configured duration after which a proxy-mode MoQ-LB moves or
ends requests that remain on a relay no longer selected for them
(<xref target="displaced"/>).</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <figure>
        <name>MoQ-LB deployment</name>
        <sourcecode type="ascii"><![CDATA[
               +---------------------+
               | Configuration Agent |. . . . . . . . . .
               +----------+----------+                  .
                          |                             .
                          | versioned           health  .
                          | configuration:  monitoring  .
                          | routes, relays,             .
                          | health, keys                .
                          v                             .
+--------+         +-----------+  proxy mode:   +-------+--+
|        |  MOQT   |           |  backend MOQT  |  Relay   |<-+
| Client +-------->|  MoQ-LB   +--------------->|    R1    |  |
|        |         |           |  sessions      +----------+  | relay
|        |         +-----------+                +----------+  | net-
|        |  redirect mode: client connects to   |  Relay   |  | work
|        +------------------------------------->|    R2    |<-+
+--------+  Selected Relay directly             +----------+
]]></sourcecode>
      </figure>
      <t>A MoQ-LB operates on MOQT sessions established over QUIC or WebTransport. It
is reachable at one or more addresses discoverable by clients (e.g., via the
mechanisms described in <xref target="MOQ-URI"/>). After the session is set up, the
MoQ-LB inspects MOQT control messages that carry a Track Namespace or Full
Track Name and consults the Routing Table to select a relay for each request.</t>
      <t>The relays behind a MoQ-LB are assumed to form a relay network in which any
relay can serve any request: relays exchange <tt>PUBLISH_NAMESPACE</tt>, <tt>PUBLISH</tt>,
and subscriptions among themselves so that a subscriber on one relay receives
the namespaces, tracks, and objects published on another. How relays do this
(<xref section="7" sectionFormat="of" target="MoQTransport"/>) is outside the scope of this document. Relay
selection therefore does not decide whether a request can be served, only
where. The MoQ-LB places publishers and subscribers of the same namespaces on
the same relay, which reduces relay-to-relay traffic and latency, and spreads
load across the pool according to the Routing Table.</t>
      <t>The Configuration Agent is authoritative for routing and health state; MoQ-LB
instances act on the configuration it distributes (<xref target="configuration"/>).</t>
      <t>A MoQ-LB operates in one of two modes:</t>
      <dl>
        <dt>Proxy mode:</dt>
        <dd>
          <t>The MoQ-LB terminates the client's MOQT session and opens one or more
MOQT sessions to the Selected Relays. All data objects are forwarded through
the MoQ-LB (<xref target="proxy-mode"/>).</t>
        </dd>
        <dt>Redirect mode:</dt>
        <dd>
          <t>The MoQ-LB redirects each routable request to its Selected Relay with a
<tt>REQUEST_ERROR</tt> carrying the <tt>REDIRECT</tt> error code. The client sends the
request directly to the relay, so the MoQ-LB is never in the data path, and
keeps its session with the MoQ-LB for placing later requests
(<xref target="redirect-mode"/>).</t>
        </dd>
      </dl>
      <t>Each client session is served in exactly one mode for its whole lifetime.
A MoQ-LB <bcp14>MAY</bcp14> support both modes, for example on different service URIs, but
it does not switch a session from one mode to the other.</t>
      <t>A conforming MoQ-LB <bcp14>MUST</bcp14> implement every normative requirement of the mode(s)
it supports. <xref target="routing-model"/>, <xref target="placement"/>, and <xref target="configuration"/> apply to
both modes; <xref target="proxy-mode"/> applies only to proxy mode, and <xref target="redirect-mode"/>
only to redirect mode.</t>
      <section anchor="example-message-flow">
        <name>Example Message Flow</name>
        <t>Below is a non-normative illustration of the end-to-end behavior. It shows a
client subscribing to a track whose Track Namespace matches a hashed route
resolving to relay <tt>R2</tt>, and then to a second track whose namespace resolves
to <tt>R1</tt>, with the MoQ-LB in redirect mode. Hashed routes are specified in
<xref target="hashed-routes"/> and redirects in <xref target="redirect-mode"/>.</t>
        <figure>
          <name>Redirect-mode subscription (non-normative)</name>
          <sourcecode type="ascii"><![CDATA[
 Client            MoQ-LB            R1            R2          Config
   |                 |                |             |              |
   |                 |<------------- Routing Table (v=42) ---------|
   |                 |                |             |              |
   | QUIC+WT handshake                |             |              |
   |<--------------->|                |             |              |
   | SETUP           |                |             |              |
   |---------------->|                |             |              |
   | SETUP           |                |             |              |
   |<----------------|                |             |              |
   | SUBSCRIBE(ns=live/sports/game-7, name=audio)   |              |
   |---------------->|                |             |              |
   |                 | hash(ns) -> R2 |             |              |
   | REQUEST_ERROR(REDIRECT, Connect URI=https://r2.example/moq)   |
   |<----------------|                |             |              |
   | (connect to R2) SETUP                          |              |
   |<---------------------------------------------->|              |
   | SUBSCRIBE (retried)                            |              |
   |----------------------------------------------->|              |
   | SUBSCRIBE_OK                                   |              |
   |<-----------------------------------------------|              |
   | SUBSCRIBE(ns=live/news/ch-2, name=video)       |              |
   |---------------->|                |             |              |
   |                 | hash(ns) -> R1 |             |              |
   | REQUEST_ERROR(REDIRECT, Connect URI=https://r1.example/moq)   |
   |<----------------|                |             |              |
   | (connect to R1) SETUP            |             |              |
   |<-------------------------------->|             |              |
   | SUBSCRIBE (retried)              |             |              |
   |--------------------------------->|             |              |
   | SUBSCRIBE_OK                     |             |              |
   |<---------------------------------|             |              |

]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="routing-model">
      <name>Routing Model</name>
      <section anchor="routing-keys">
        <name>Routing Keys</name>
        <t>The MoQ-LB selects a relay for each MOQT request from its routing key. Track
Namespaces are tuples; prefix matching is performed tuple by tuple.</t>
        <table>
          <thead>
            <tr>
              <th align="left">MOQT Message</th>
              <th align="left">Routing Key</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">PUBLISH_NAMESPACE</td>
              <td align="left">Track Namespace</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE_NAMESPACE</td>
              <td align="left">Track Namespace Prefix</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE_TRACKS</td>
              <td align="left">Track Namespace Prefix</td>
            </tr>
            <tr>
              <td align="left">SUBSCRIBE</td>
              <td align="left">Track Namespace of Full Track Name</td>
            </tr>
            <tr>
              <td align="left">PUBLISH</td>
              <td align="left">Track Namespace of Full Track Name</td>
            </tr>
            <tr>
              <td align="left">FETCH</td>
              <td align="left">Track Namespace of Full Track Name</td>
            </tr>
            <tr>
              <td align="left">TRACK_STATUS</td>
              <td align="left">Track Namespace of Full Track Name</td>
            </tr>
            <tr>
              <td align="left">SETUP, GOAWAY</td>
              <td align="left">None</td>
            </tr>
            <tr>
              <td align="left">All other messages</td>
              <td align="left">The request stream they arrive on</td>
            </tr>
          </tbody>
        </table>
        <t>The messages in the first group start requests and are called routable
requests. <tt>SUBSCRIBE_NAMESPACE</tt> and <tt>SUBSCRIBE_TRACKS</tt> are routed as specified
in <xref target="prefix-resolution"/>.</t>
        <t><tt>SETUP</tt> and <tt>GOAWAY</tt> are session- or request-local and are not routed;
<tt>GOAWAY</tt> handling is specified in <xref target="relay-goaway"/>.</t>
        <t>All other messages (<tt>SUBSCRIBE_OK</tt>, <tt>FETCH_OK</tt>, <tt>REQUEST_OK</tt>, <tt>REQUEST_ERROR</tt>,
<tt>REQUEST_UPDATE</tt>, <tt>PUBLISH_STATE_NOTIFY</tt>, <tt>PUBLISH_DONE</tt>, <tt>PUBLISH_SKIPPED</tt>,
<tt>NAMESPACE</tt>, and <tt>NAMESPACE_DONE</tt>) are not routed by any field they carry but
by the request stream on which they arrive. In proxy mode the MoQ-LB resolves
them through the per-session request mapping (<xref target="session-mapping"/>); in
redirect mode they flow directly between the client and the relay.</t>
      </section>
      <section anchor="routing-table">
        <name>Routing Table</name>
        <t>The Routing Table is the authoritative input to relay selection. It is a set
of Namespace Routes, whose structure is described using Concise Data
Definition Language (CDDL) <xref target="CDDL"/>. The order of routes is not significant.</t>
        <sourcecode type="cddl"><![CDATA[
NamespaceRoute = {
  prefix:  [* bytes],              ; Track Namespace prefix
  (
    StaticRoute //
    HashedRoute //
    $$NamespaceRouteKind
  ),
  ? attributes: { * text => any }  ; implementation-defined
}

StaticRoute = (
  kind: "static",
  rid:  bytes                      ; Relay Identifier
)

HashedRoute = (
  kind: "hashed",
  ? profile: text,                 ; default "HRW-SHA256"
  ? key_fields: uint .ge 1,        ; default: all fields
  rids: [+ (bytes / { rid: bytes, weight: 0..16 })]
)
]]></sourcecode>
        <t>The <tt>kind</tt> field discriminates route types. Additional route kinds can be
registered (<xref target="iana-route-kinds"/>); a MoQ-LB <bcp14>MUST</bcp14> reject a Routing Table
containing a <tt>kind</tt> it does not support. <tt>attributes</tt> is an open extension
point for implementation-defined metadata.</t>
        <t>A namespace matches a route when its leading tuple fields are equal, field
by field, to the route's <tt>prefix</tt> (an empty prefix matches every namespace).
The MoQ-LB <bcp14>SHALL</bcp14> select the matching route with the longest prefix. A
Routing Table containing duplicate prefixes is invalid. Route selection <bcp14>MUST</bcp14>
be deterministic for a given valid Routing Table.</t>
        <section anchor="static-routes">
          <name>Static Routes</name>
          <t>A static route (<tt>kind: "static"</tt>) pins a namespace or prefix to the relay
identified by its <tt>rid</tt> field. If that relay is not Eligible, the route has no
Selected Relay; requests matching it are rejected (<xref target="rejections"/>) rather than
placed on another relay.</t>
        </section>
        <section anchor="hashed-routes">
          <name>Hashed Routes</name>
          <t>A hashed route (<tt>kind: "hashed"</tt>) maps every namespace that matches <tt>prefix</tt>
to a relay selected by the weighted rendezvous hashing algorithm of
<xref target="hash-canonicalization"/> over the Eligible Relays among its <tt>rids</tt>.</t>
          <t>Each entry in <tt>rids</tt> is either a plain RID (shorthand for weight 1) or a map
carrying an explicit weight. Candidate RIDs <bcp14>MUST</bcp14> be unique within a route.</t>
          <t>The optional <tt>key_fields</tt> field sets how many leading fields of a namespace
form its hash key, the part of the namespace that is hashed to select a
relay. All namespaces that share the same first <tt>key_fields</tt> fields
therefore select the same relay. When <tt>key_fields</tt> is absent, the hash key
is the whole namespace. A namespace with fewer than <tt>key_fields</tt> fields uses
the whole namespace as its hash key. <tt>key_fields</tt> <bcp14>MUST NOT</bcp14> be less than the
number of fields in <tt>prefix</tt>.</t>
          <t><tt>key_fields</tt> lets a deployment choose the unit that is kept together on one
relay. For example, an application whose namespaces have the form
<tt>(domain, session, participant)</tt> can use <tt>key_fields: 2</tt> so that all
participants of a session reach the same relay, while different sessions
are still spread across the pool.</t>
          <t>Weights bias the share of namespace keys assigned to each relay. A relay with
weight 2 receives approximately twice the share of a relay with weight 1 when
the keyspace is sufficiently large. Weights are provisioned by the
Configuration Agent and <bcp14>SHOULD</bcp14> reflect measured sustainable capacity, not
instantaneous load. Sixteen levels (<tt>0</tt> to <tt>16</tt>) are enough to express relay
capacity ratios in practice and keep the comparator inexpensive. Deployments
<bcp14>SHOULD</bcp14> express capacity ratios using the smallest integer weights that yield
the intended distribution, since comparator cost grows with weight magnitude.</t>
          <t>A weight of 0 excludes a relay from selection. It is the planned way to drain
a relay: it is changed in a new Routing Table version and follows the rules of
<xref target="configuration-rotation"/>. The Draining health state (<xref target="failover"/>) has the
same effect on selection but is an operational state that can change without
a route change. A route with no positive-weight relay is invalid.</t>
          <section anchor="hash-canonicalization">
            <name>Hash Canonicalization</name>
            <t>For a given Track Namespace and set of Eligible candidates, all MoQ-LB
instances <bcp14>MUST</bcp14> select the same RID. A change to the candidate set, or to any
weight within it, can change the selection outcome for subsequent
assignments. The procedure specified in this section is deterministic and is
independent of platform floating-point behavior.</t>
            <t>For each candidate relay, implementations compute a per-candidate hash as
follows:</t>
            <ol spacing="normal" type="1"><li>
                <t>Take the hash key of the Track Namespace (<xref target="hashed-routes"/>) and encode
it as a Track Namespace, as specified in
<xref section="8.7" sectionFormat="of" target="MoQTransport"/>.</t>
              </li>
              <li>
                <t>Encode the RID as its length, an MOQT variable-length integer
(<xref section="8.1" sectionFormat="of" target="MoQTransport"/>), followed by its bytes.</t>
              </li>
              <li>
                <t>Compute <tt>H = HASH(namespace-encoding || rid-encoding)</tt> using the hash
algorithm of the route's hash profile (<xref target="hash-profiles"/>) and interpret
the result as an unsigned big-endian integer of <tt>b</tt> bits.</t>
              </li>
            </ol>
            <t>For two positive-weight candidates <tt>A</tt> and <tt>B</tt> with hash integers <tt>H_A</tt>,
<tt>H_B</tt> and weights <tt>w_A</tt>, <tt>w_B</tt>, let <tt>D</tt> be the modulus of the route's hash
profile. Candidate <tt>A</tt> wins over candidate <tt>B</tt> if and only if:</t>
            <artwork><![CDATA[
(H_A + 1)^(w_B) * D^(w_A) > (H_B + 1)^(w_A) * D^(w_B)
]]></artwork>
            <t>All operations <bcp14>MUST</bcp14> use exact non-negative integer arithmetic;
floating-point evaluation and truncation of intermediate values are
prohibited. When the two sides are equal, the candidate with the
lexicographically smaller RID byte string is the winner. The relation
is a strict total order over the positive-weight candidates.
Implementations <bcp14>MAY</bcp14> use any procedure that returns its first-ranked
candidate, and the result is independent of iteration order.</t>
            <t>Each side of the comparison is bounded above by <tt>2^((b + 1) * (w_A + w_B))</tt>.
Under the weight ceiling of <tt>16</tt>, each side therefore occupies at most 8,224
bits (1,028 bytes) for <tt>HRW-SHA256</tt> and 2,080 bits (260 bytes) for
<tt>HRW-SHA256-64</tt>.</t>
            <t>The comparator is an exact integer form of weighted rendezvous hashing
<xref target="WEIGHTED-HRW"/> with score <tt>-ln((H + 1) / D) / w</tt>, where the lowest score
wins. Over a large keyspace, each relay <tt>i</tt> receives approximately the
share <tt>w_i / sum(w_j)</tt>.</t>
          </section>
          <section anchor="hash-profiles">
            <name>Hash Profiles</name>
            <t>A hash profile specifies a hash algorithm together with its output width in
bits <tt>b</tt> and the associated modulus <tt>D = 2^b + 1</tt>. Profiles are registered in
the registry defined in <xref target="iana-hash-profiles"/>. This document defines two:</t>
            <ul spacing="normal">
              <li>
                <t><tt>HRW-SHA256</tt>: <tt>H</tt> is the full SHA-256 digest; <tt>b = 256</tt>,
<tt>D = 2^256 + 1</tt>.</t>
              </li>
              <li>
                <t><tt>HRW-SHA256-64</tt>: <tt>H</tt> is the first 8 bytes of the SHA-256 digest; <tt>b = 64</tt>,
<tt>D = 2^64 + 1</tt>. Its comparator operands are about a quarter of the size
of those of <tt>HRW-SHA256</tt>, which makes it the better choice where
selection cost matters.</t>
              </li>
            </ul>
            <t>Implementations <bcp14>MUST</bcp14> support both profiles. Both use the same hash
function, so supporting the second adds only a truncation.</t>
            <t>Hash profiles are used only by the Configuration Agent and MoQ-LB
instances. Relays and clients never compute selections, and nothing about
the profile appears in MOQT messages. Each hashed route names its profile
in its <tt>profile</tt> field, and <tt>HRW-SHA256</tt> is used when the field is absent.
A MoQ-LB <bcp14>MUST</bcp14> reject a Routing Table that names a profile it does not
support. Changing a route's profile remaps its namespaces in the
same way as replacing its relays, and is applied through configuration
rotation (<xref target="configuration-rotation"/>).</t>
          </section>
        </section>
      </section>
      <section anchor="prefix-resolution">
        <name>Prefix Request Resolution</name>
        <t><tt>SUBSCRIBE_NAMESPACE</tt> and <tt>SUBSCRIBE_TRACKS</tt> carry a Track Namespace Prefix
<tt>P</tt> rather than a single namespace. The MoQ-LB routes <tt>P</tt> as if it were a
namespace: it selects the matching route with the longest prefix and, for a
hashed route, computes the hash key of <tt>P</tt> as described in
<xref target="hashed-routes"/>. More-specific routes under <tt>P</tt> are not consulted. If no
route matches <tt>P</tt>, the request is rejected (<xref target="rejections"/>). In particular, a
request with an empty <tt>P</tt> (all namespaces) is rejected unless the Routing
Table contains a route with an empty prefix.</t>
        <t>When <tt>P</tt> has at least <tt>key_fields</tt> fields, every namespace under <tt>P</tt> has the
same hash key as <tt>P</tt>, so the request reaches the relay that serves those
namespaces. Otherwise, namespaces under <tt>P</tt> can be placed on other relays,
and the Selected Relay learns of them through the relay network
(<xref target="architecture"/>).</t>
      </section>
      <section anchor="example">
        <name>Example</name>
        <t>The following Routing Table is shown in CBOR diagnostic notation
(<xref section="8" sectionFormat="of" target="CBOR"/>), in which single-quoted strings are byte strings.</t>
        <artwork><![CDATA[
[
  { "prefix":  ['conf', 'example.com'],
    "kind":    "static",
    "rid":     'r-east-07' },

  { "prefix":  ['live', 'sports'],
    "kind":    "hashed",
    "rids":    [ {"rid": 'r-east-01', "weight": 2},
                 {"rid": 'r-east-02', "weight": 2},
                 {"rid": 'r-east-03', "weight": 1} ] },

  { "prefix":  [],
    "kind":    "hashed",
    "rids":    ['r-default-01', 'r-default-02'] }
]
]]></artwork>
      </section>
    </section>
    <section anchor="placement">
      <name>Request Placement</name>
      <t>When a client opens a MOQT session to a MoQ-LB, the MoQ-LB completes the QUIC
or WebTransport handshake and the MOQT <tt>SETUP</tt> exchange
(<xref section="6.3" sectionFormat="of" target="MoQTransport"/>). It then selects a relay for each routable
request (<xref target="routing-keys"/>) under the Routing Table and health state in effect
when the request arrives, and forwards (<xref target="proxy-mode"/>) or redirects
(<xref target="redirect-mode"/>) the request to it.</t>
      <section anchor="rejections">
        <name>Rejections</name>
        <t>A MoQ-LB rejects a routable request with <tt>REQUEST_ERROR</tt>
(<xref section="9.4" sectionFormat="of" target="MoQTransport"/>) in the following cases:</t>
        <ul spacing="normal">
          <li>
            <t>No route matches the request's routing key: <tt>DOES_NOT_EXIST</tt> for
<tt>SUBSCRIBE</tt>, <tt>FETCH</tt>, <tt>TRACK_STATUS</tt>, <tt>SUBSCRIBE_NAMESPACE</tt>, and
<tt>SUBSCRIBE_TRACKS</tt>; <tt>UNINTERESTED</tt> for <tt>PUBLISH</tt> and <tt>PUBLISH_NAMESPACE</tt>.</t>
          </li>
          <li>
            <t>The matching route has no Eligible Relay, or the configuration is too stale
to place the request (<xref target="configuration"/>): <tt>INTERNAL_ERROR</tt> with a non-zero
Retry Interval.</t>
          </li>
          <li>
            <t>The client is not authorized for the request
(<xref target="security-considerations"/>): <tt>UNAUTHORIZED</tt>.</t>
          </li>
          <li>
            <t>A configured resource limit is reached: <tt>EXCESSIVE_LOAD</tt>.</t>
          </li>
        </ul>
        <t>A MoQ-LB <bcp14>MUST NOT</bcp14> use an error code that is not registered for MOQT
(<xref section="12.3" sectionFormat="of" target="MoQTransport"/>).</t>
      </section>
      <section anchor="session-affinity">
        <name>Session Affinity</name>
        <t>Requests for the same namespace reach the same relay because selection is
deterministic (<xref target="hash-canonicalization"/>): every MoQ-LB instance, for every
session, selects the same relay under the same Routing Table and health
state. A client that reconnects after the Relay Pool or the Routing Table has
changed can be routed to a different relay.</t>
        <t>In proxy mode, the MoQ-LB additionally binds each namespace to a relay for the
lifetime of a client session, so that later requests on that namespace stay on
the relay that already serves the session's earlier requests
(<xref target="proxy-affinity"/>). In redirect mode, the MoQ-LB keeps no per-request or
per-namespace state; each request is redirected to its current Selected
Relay.</t>
      </section>
      <section anchor="failover">
        <name>Relay Health and Failover</name>
        <t>Each relay in a Relay Pool has one of three health states. The
Configuration Agent is authoritative for them and distributes them to every
MoQ-LB.</t>
        <ul spacing="normal">
          <li>
            <t>Healthy: eligible for new requests.</t>
          </li>
          <li>
            <t>Draining: not eligible for new requests, but still serving existing
ones (for example, before maintenance).</t>
          </li>
          <li>
            <t>Unhealthy: not expected to serve traffic.</t>
          </li>
        </ul>
        <t>A proxy-mode MoQ-LB also changes its local view of a relay on two events: it
marks the relay Draining when the relay sends <tt>GOAWAY</tt> on a backend control
stream, and Unhealthy when a backend session to the relay closes abruptly. It
keeps that view until the Configuration Agent reports a newer state. A
redirect-mode MoQ-LB has no backend sessions and only uses the states it
receives. Because local changes are not seen by other instances, instances
can briefly select different relays for the same namespace; a MoQ-LB <bcp14>SHOULD</bcp14>
report local changes to the Configuration Agent so that it can distribute a
consistent view.</t>
        <t>New requests <bcp14>MUST NOT</bcp14> be assigned to relays that are not Eligible. For hashed
routes, those relays are excluded from selection, and namespaces whose
Selected Relay is unaffected keep it. For static routes, see
<xref target="static-routes"/>.</t>
        <section anchor="displaced">
          <name>Displaced Requests</name>
          <t>A request is displaced when the relay it is on is no longer its Selected
Relay: because a new Routing Table version maps its namespace elsewhere
(<xref target="configuration-rotation"/>), or because the relay becomes Draining.</t>
          <ul spacing="normal">
            <li>
              <t>Displaced requests <bcp14>MAY</bcp14> continue on their relay until the Drain Deadline.
A proxy-mode MoQ-LB <bcp14>SHOULD</bcp14> move them (<xref target="moving-requests"/>) before it.</t>
            </li>
            <li>
              <t>At the Drain Deadline, or when the relay closes the session or the
<tt>GOAWAY</tt> Timeout expires, whichever comes first, a proxy-mode MoQ-LB moves
or ends the remaining requests.</t>
            </li>
          </ul>
          <t>A redirect-mode MoQ-LB holds no requests and cannot move them. When a relay
becomes Draining, the relay moves its clients with <tt>GOAWAY</tt>
(<xref target="redirect-goaway"/>). A request displaced by a new Routing Table version
while its relay remains Healthy stays on that relay until it ends, the client
re-issues it, or the relay sends <tt>GOAWAY</tt>; the Drain Deadline does not apply
to it. Its relay still serves it through the relay network
(<xref target="architecture"/>). A deployment that needs such requests moved can have the
relay send <tt>GOAWAY</tt> for them by means outside the scope of this document.</t>
          <t>Requests on an Unhealthy relay cannot make progress. A proxy-mode MoQ-LB
moves them at once, without waiting for the new relay to accept before
switching; in redirect mode, the client detects the failure and returns to
the MoQ-LB.</t>
          <t>Requests that are ended because they could not be moved are ended with MOQT
mechanisms and registered codes: an established subscription with
<tt>PUBLISH_DONE</tt> and status <tt>GOING_AWAY</tt> (<xref section="12.4" sectionFormat="of" target="MoQTransport"/>), a
pending request with <tt>REQUEST_ERROR</tt> and code <tt>GOING_AWAY</tt>, and any other
request stream with a stream reset using <tt>GOING_AWAY</tt>.</t>
        </section>
      </section>
      <section anchor="relay-goaway">
        <name>GOAWAY from Relays</name>
        <t>Relays use the MOQT <tt>GOAWAY</tt> message (<xref section="9.2" sectionFormat="of" target="MoQTransport"/>) to
move work away from themselves, for example before maintenance or under
overload. A <tt>GOAWAY</tt> on the control stream moves the whole session; a
<tt>GOAWAY</tt> on a request stream moves only that request. In both modes, the
Routing Table, not the relay, decides where moved work goes: a relay does
not know the current Routing Table or what the client is authorized to
reach. Mode-specific handling is specified in <xref target="proxy-goaway"/> and
<xref target="redirect-goaway"/>.</t>
      </section>
    </section>
    <section anchor="proxy-mode">
      <name>Proxy Mode</name>
      <t>In proxy mode, the MoQ-LB terminates the client's MOQT session, opens backend
MOQT sessions to Selected Relays, and forwards traffic in both directions.</t>
      <section anchor="proxy-session-setup">
        <name>Session Setup</name>
        <t>When responding to the client's <tt>SETUP</tt>, the MoQ-LB responds on behalf of the
pool, advertising only the MOQT version and extensions
(<xref section="6.3.2" sectionFormat="of" target="MoQTransport"/>) supported by every relay the client could
be routed to. A deployment that cannot guarantee a non-empty intersection
<bcp14>MUST</bcp14> partition the pool so that each MoQ-LB fronts only relays with
compatible capabilities. Limits that the MoQ-LB advertises to the client
(such as <tt>MAX_REQUEST_UPDATES</tt>) <bcp14>MUST NOT</bcp14> exceed what it can honor given the
limits its backends advertise.</t>
        <t>The MoQ-LB does not open a backend MOQT session until it receives a routable
request, at which point it opens a session to the Selected Relay (if not
already open) and forwards the request. The backend <tt>SETUP</tt> <bcp14>MUST</bcp14> offer the
MOQT version and extensions already agreed with the client. Session-scoped
Setup Options that identify the endpoint or the client (<tt>AUTHORITY</tt>, <tt>PATH</tt>,
<tt>AUTHORIZATION TOKEN</tt>, <tt>MAX_AUTH_TOKEN_CACHE_SIZE</tt>, <tt>MOQT IMPLEMENTATION</tt>)
are set by the MoQ-LB for the backend session, following the authorization
model of <xref target="security-considerations"/>. If a relay does not accept the agreed
version and extensions, the MoQ-LB rejects the request (<xref target="rejections"/>) and
<bcp14>SHOULD</bcp14> report the mismatch to the Configuration Agent, since it indicates a
misconfigured pool.</t>
        <t>Authorization token aliases (<xref section="8.9" sectionFormat="of" target="MoQTransport"/>) are scoped to a
session. The MoQ-LB <bcp14>MUST NOT</bcp14> forward an alias from one session to another; it
resolves a client's alias to the token and either sends the token or
registers its own alias on the backend session.</t>
        <t>A MoQ-LB <bcp14>MAY</bcp14> multiplex multiple namespace routes onto one client-facing
session by maintaining backend sessions to multiple relays. It <bcp14>MUST</bcp14> bound
open backend sessions, concurrent requests, and per-session state; when a
limit is reached, it rejects new requests (<xref target="rejections"/>).</t>
      </section>
      <section anchor="session-mapping">
        <name>Session Mapping State</name>
        <t>A proxy-mode MoQ-LB <bcp14>MUST</bcp14> maintain, per client-facing session, a table of
request mappings. Each mapping binds exactly one client-facing request
stream to exactly one backend request stream. The MoQ-LB creates an entry:</t>
        <ul spacing="normal">
          <li>
            <t>when it forwards a request from the client (<tt>PUBLISH</tt>, <tt>PUBLISH_NAMESPACE</tt>,
<tt>SUBSCRIBE</tt>, <tt>SUBSCRIBE_NAMESPACE</tt>, <tt>SUBSCRIBE_TRACKS</tt>, <tt>FETCH</tt>, or
<tt>TRACK_STATUS</tt>) to the Selected Relay; and</t>
          </li>
          <li>
            <t>when a relay opens a request stream toward the MoQ-LB on a backend session,
such as a <tt>PUBLISH</tt> resulting from a <tt>SUBSCRIBE_TRACKS</tt>
(<xref section="4" sectionFormat="of" target="MoQTransport"/>) or a <tt>PUBLISH_NAMESPACE</tt> within a
<tt>SUBSCRIBE_NAMESPACE</tt> prefix. The MoQ-LB opens a request stream toward the
client and forwards the request on it.</t>
          </li>
        </ul>
        <t>Each entry records:</t>
        <ul spacing="normal">
          <li>
            <t>the paired client-facing and backend request streams;</t>
          </li>
          <li>
            <t>the Request ID translation between the client-facing and backend
sessions;</t>
          </li>
          <li>
            <t>the Track Alias translation between the two sessions, where the request
type carries a Track Alias;</t>
          </li>
          <li>
            <t>the original routing key (<xref target="routing-keys"/>); and</t>
          </li>
          <li>
            <t>the backend MOQT session carrying the pair, and therefore the Selected
Relay.</t>
          </li>
        </ul>
        <t>Request ID and Track Alias values are per-session and <bcp14>MUST</bcp14> be kept
independent across sessions. An entry is released only after both stream
directions and all associated request state have completed.</t>
      </section>
      <section anchor="proxy-affinity">
        <name>Session Affinity in Proxy Mode</name>
        <t>Once a proxy-mode MoQ-LB has selected a relay for a Track Namespace within a
client session, it <bcp14>MUST</bcp14> keep using that relay for every later request on that
namespace in the session, unless the relay's requests on that namespace are
displaced or the relay is Unhealthy (<xref target="failover"/>). Affinity applies to every
request type and to the request's data streams and datagrams. It keeps
<tt>REQUEST_UPDATE</tt> messages and request cancellations
(<xref section="9.5" sectionFormat="of" target="MoQTransport"/>, <xref section="6.4.2.3" sectionFormat="of" target="MoQTransport"/>) on the
relay that holds the request state, and keeps publishers and subscribers of a
namespace on the same relay.</t>
      </section>
      <section anchor="proxy-data-plane">
        <name>Data Plane</name>
        <section anchor="request-streams">
          <name>Request Streams</name>
          <t>The MoQ-LB <bcp14>MUST</bcp14> forward every control message on a mapped request stream to
the paired stream, in both directions, translating Request IDs and Track
Aliases (<xref target="session-mapping"/>). It keeps both directions open for as long as
the peers do: except for <tt>TRACK_STATUS</tt>, which ends after its response,
requests carry asynchronous messages for their whole lifetime, such as
<tt>NAMESPACE</tt> and <tt>NAMESPACE_DONE</tt> on a <tt>SUBSCRIBE_NAMESPACE</tt>,
<tt>PUBLISH_SKIPPED</tt> on a <tt>SUBSCRIBE_TRACKS</tt>, <tt>PUBLISH_STATE_NOTIFY</tt> and
<tt>PUBLISH_DONE</tt> on subscriptions, and <tt>REQUEST_UPDATE</tt> from the request's
sender or, on a <tt>PUBLISH</tt>, from its subscriber. Relay-initiated <tt>GOAWAY</tt> is
handled as specified in <xref target="proxy-goaway"/>.</t>
        </section>
        <section anchor="object-data">
          <name>Object Data</name>
          <t>Object data flows from a subscription's publisher to its subscriber on
unidirectional streams and, where used, datagrams. For a <tt>SUBSCRIBE</tt> or
<tt>FETCH</tt> from the client, and for a relay-initiated <tt>PUBLISH</tt>, it flows from
the relay to the client; for a <tt>PUBLISH</tt> from the client, it flows from the
client to the relay. For each data stream it receives on one leg, the MoQ-LB
opens a corresponding stream on the paired leg. A client that both publishes
and subscribes <bcp14>MUST</bcp14> be supported with independent data paths per request;
flow in one direction <bcp14>MUST NOT</bcp14> block flow in the other.</t>
          <t>The MoQ-LB identifies the request a data stream or Object Datagram
(<xref section="11" sectionFormat="of" target="MoQTransport"/>) belongs to from its header: a Subgroup
Header stream or an Object Datagram belongs to the subscription with that
Track Alias, and a FETCH Header stream belongs to the <tt>FETCH</tt> with that
Request ID. When forwarding, the MoQ-LB <bcp14>MUST</bcp14> translate the Request ID and
Track Alias using the request mapping and <bcp14>MUST</bcp14> keep everything else,
including the objects, intact.</t>
          <t>A stream reset or FIN on one leg <bcp14>MUST</bcp14> be propagated to the paired stream.
The MoQ-LB <bcp14>SHOULD</bcp14> forward datagrams in the order received and <bcp14>MAY</bcp14> drop them
under congestion, as a relay would. Padding streams and datagrams
(<xref section="11.5" sectionFormat="of" target="MoQTransport"/>) are not forwarded; however, the MoQ-LB <bcp14>MAY</bcp14>
send its own padding on either leg.</t>
        </section>
      </section>
      <section anchor="fan-out">
        <name>Backend Session Sharing and Subscription Coalescing (Optional)</name>
        <t>By default, a proxy-mode MoQ-LB forwards each client request as its own
backend request and opens backend sessions per client session. An
implementation <bcp14>MAY</bcp14> reduce the load it places on relays with the two
optimizations below.</t>
        <dl>
          <dt>Backend session sharing:</dt>
          <dd>
            <t>A MoQ-LB <bcp14>MAY</bcp14> carry requests from several client sessions on one backend
session to the same relay. It <bcp14>MUST</bcp14> do so only for client sessions that
agreed the same MOQT version and extensions as the backend session. Because
relay-initiated requests on a shared session cannot be attributed to one
client, a backend session that carries <tt>SUBSCRIBE_NAMESPACE</tt> or
<tt>SUBSCRIBE_TRACKS</tt> <bcp14>MUST NOT</bcp14> be shared.</t>
          </dd>
          <dt>Subscription coalescing:</dt>
          <dd>
            <t>A MoQ-LB <bcp14>MAY</bcp14> serve several client <tt>SUBSCRIBE</tt> requests for the same Full
Track Name, routed to the same relay, with a single backend <tt>SUBSCRIBE</tt>,
copying each delivered object to every coalesced client subscription.</t>
          </dd>
        </dl>
        <t>Both optimizations apply after relay selection and never change it.
Requests are shared or coalesced only when the current Routing Table
selects the same relay for each of them; a new subscription is not coalesced
onto a backend subscription that is displaced (<xref target="displaced"/>). Both are
subject to the authorization requirements in <xref target="security-considerations"/>.</t>
        <t>When coalescing subscriptions, the MoQ-LB:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> give each client subscription its own mapping entry, Request ID, and
Track Alias (<xref target="session-mapping"/>);</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> coalesce a subscription only if the shared backend subscription
delivers every object the client's subscription would receive, considering
its location filter, subgroup, object ID, priority, and property filters,
<tt>FORWARD</tt> state, and group order; otherwise the subscription gets its own
backend <tt>SUBSCRIBE</tt>;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> answer a subscription that joins an existing backend subscription with
a <tt>SUBSCRIBE_OK</tt> of its own, using the Track Properties of the backend's
<tt>SUBSCRIBE_OK</tt> and the Largest Object it has observed;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> apply each subscriber's priority on its own client-facing leg;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> keep cancellations independent: a cancellation from one subscriber
<bcp14>MUST NOT</bcp14> affect the others, and the backend <tt>SUBSCRIBE</tt> is cancelled when
the last coalesced subscriber leaves;</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> let a <tt>REQUEST_UPDATE</tt> from one subscriber change what the
others receive; if the shared backend subscription cannot satisfy the
update, the MoQ-LB moves that subscriber to its own backend <tt>SUBSCRIBE</tt>;
and</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> copy the relay's asynchronous messages on the shared backend
subscription (<tt>PUBLISH_STATE_NOTIFY</tt> and <tt>PUBLISH_DONE</tt>) to every coalesced
client subscription, each carrying that subscriber's Request ID.</t>
          </li>
        </ul>
        <t>When a coalesced backend subscription is moved (<xref target="moving-requests"/>), it is
moved once on behalf of all its subscribers.</t>
      </section>
      <section anchor="proxy-goaway">
        <name>Relay GOAWAY in Proxy Mode</name>
        <t>A proxy-mode MoQ-LB receives a relay's <tt>GOAWAY</tt> on its backend session. It
<bcp14>MUST NOT</bcp14> forward the relay's <tt>New Session URI</tt> to the client or use it for
routing. On a <tt>GOAWAY</tt> on the control stream, the MoQ-LB marks the relay
Draining (<xref target="failover"/>) and moves every request on that backend session; on
a <tt>GOAWAY</tt> on a request stream, it moves only that request.</t>
      </section>
      <section anchor="moving-requests">
        <name>Moving a Request</name>
        <t>To move a request, the MoQ-LB selects a new relay under the current Routing
Table and health state, and either re-issues the request itself or asks the
client to re-issue it:</t>
        <ul spacing="normal">
          <li>
            <t><tt>SUBSCRIBE</tt>: the MoQ-LB <bcp14>MAY</bcp14> re-issue it, following the approach of
<xref section="7.4.1" sectionFormat="of" target="MoQTransport"/>. Let <tt>G</tt> be the group after the latest
group it has forwarded to the client, or the client's original start if it
has forwarded none. The MoQ-LB sends a <tt>SUBSCRIBE</tt> for the same Full Track
Name to the new relay, with the client's parameters and a filter that
starts at <tt>G</tt>. It forwards objects of groups before <tt>G</tt> only from the old
relay and objects of group <tt>G</tt> and later only from the new relay. Once the
new relay accepts and the old relay's streams for groups before <tt>G</tt> have
ended, the MoQ-LB cancels the old subscription. The client keeps its
Request ID and Track Alias and sees no change other than the group
boundary. If the new relay rejects the request, the MoQ-LB asks the client
to move instead, so that the client receives the relay's response itself.</t>
          </li>
          <li>
            <t><tt>TRACK_STATUS</tt>: not moved; it ends after its response.</t>
          </li>
          <li>
            <t><tt>FETCH</tt>: not moved. It completes on the old relay; if the old relay ends
it early, the MoQ-LB ends the client's <tt>FETCH</tt> with an error, and the
client may retry.</t>
          </li>
          <li>
            <t><tt>PUBLISH</tt>, <tt>PUBLISH_NAMESPACE</tt>, <tt>SUBSCRIBE_NAMESPACE</tt>, and
<tt>SUBSCRIBE_TRACKS</tt>: the MoQ-LB asks the client to move.</t>
          </li>
        </ul>
        <t>To ask a client to move a request, the MoQ-LB sends a <tt>GOAWAY</tt> on the
client-facing request stream with a zero-length <tt>New Session URI</tt>, so that
the client re-issues the request on the same session
(<xref section="9.2" sectionFormat="of" target="MoQTransport"/>), where the MoQ-LB routes it under the
current Routing Table. A MoQ-LB <bcp14>MAY</bcp14> do this for any request type; an
implementation that never re-issues requests is conformant. If every
request on a client session must move, the MoQ-LB <bcp14>MAY</bcp14> instead send one
<tt>GOAWAY</tt> on the client-facing control stream, also with a zero-length
<tt>New Session URI</tt>, so that the client reconnects to the MoQ-LB.</t>
        <t>Moving a request does not transfer relay state. Objects in flight when the
old relay stops can be lost, a re-issued <tt>SUBSCRIBE</tt> resumes at a group
boundary, and a publisher that is asked to move re-publishes to the new
relay. Implementations <bcp14>SHOULD</bcp14> use the graceful switchover procedures in
Sections <xref target="MoQTransport" section="7.4.1" sectionFormat="bare"/> and <xref target="MoQTransport" section="7.6.1" sectionFormat="bare"/> of <xref target="MoQTransport"/> where clients and relays
support them. Requests that cannot be moved are ended as specified in
<xref target="displaced"/>.</t>
      </section>
      <section anchor="example-proxy-mode-flow">
        <name>Example Proxy-Mode Flow</name>
        <figure>
          <name>Proxy-mode SUBSCRIBE with paired data streams (non-normative)</name>
          <sourcecode type="ascii"><![CDATA[
 Client            MoQ-LB                        R2
   |                 |                            |
   | QUIC+WT handshake                            |
   |<--------------->|                            |
   | SETUP (versions, exts intersected over pool) |
   |<--------------->|                            |
   | SUBSCRIBE(ns=live/sports/game-7, name=audio) |
   |---------------->|                            |
   |                 | hash(ns) -> R2             |
   |                 | open backend session       |
   |                 |<-------- QUIC+WT --------->|
   |                 | SETUP (same caps)          |
   |                 |<-------------------------->|
   |                 | SUBSCRIBE (translated IDs) |
   |                 |--------------------------->|
   |                 | SUBSCRIBE_OK               |
   |                 |<---------------------------|
   | SUBSCRIBE_OK    |                            |
   |<----------------|                            |
   |                 | <objects on new stream>    |
   |                 |<===========================|
   | <objects on paired stream, IDs translated>   |
   |<================|                            |
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="redirect-mode">
      <name>Redirect Mode</name>
      <t>In redirect mode, the MoQ-LB never opens backend sessions. It redirects each
routable request (<xref target="routing-keys"/>) to its Selected Relay instead of serving
it:</t>
      <ol spacing="normal" type="1"><li>
          <t>The MoQ-LB selects the relay (<xref target="placement"/>) and rejects the request with
a <tt>REQUEST_ERROR</tt> carrying the <tt>REDIRECT</tt> error code and a Redirect
structure (Sections <xref target="MoQTransport" section="9.4.1" sectionFormat="bare"/> and <xref target="MoQTransport" section="12.3" sectionFormat="bare"/> of <xref target="MoQTransport"/>).</t>
        </li>
        <li>
          <t>The Redirect's <tt>Connect URI</tt> is the URI of the Selected Relay from the
authenticated configuration (<xref target="configuration"/>). The Redirect target is
the request's own Track Namespace and Track Name, with an empty Track Name
for <tt>PUBLISH_NAMESPACE</tt>, <tt>SUBSCRIBE_NAMESPACE</tt>, and <tt>SUBSCRIBE_TRACKS</tt>.
The MoQ-LB chooses where a request goes, not what it asks for.</t>
        </li>
        <li>
          <t>The <tt>Retry Interval</tt> is 0, so that the client does not retry the request
on the MoQ-LB, and a relay acting as client does not cache the redirect.</t>
        </li>
        <li>
          <t>The client connects to the relay and retries the request there. Its
session with the MoQ-LB stays open, and the client sends its later
requests to the MoQ-LB, which redirects each of them the same way.</t>
        </li>
      </ol>
      <t>The MoQ-LB redirects each request separately, so every request reaches the
relay that the Routing Table selects for its namespace, even when a client's
namespaces map to different relays. In that case, the client has one session
to the MoQ-LB and one session to each relay that its requests were redirected
to. If the client already has a session to the <tt>Connect URI</tt>, it <bcp14>SHOULD</bcp14> retry
the request on that session instead of opening a new one.</t>
      <t>A client can also send a request directly to a relay on a session it already
has. The relay serves the request through the relay network
(<xref target="architecture"/>). However, the MoQ-LB does not see the request, so the
Routing Table does not choose its relay, and the publishers and subscribers
of that namespace might be on different relays.</t>
      <t>A redirect adds one round trip to the MoQ-LB before the request reaches the
relay. If the client does not yet have a session to that relay, it also has
to set one up. After the MoQ-LB redirects a request, it keeps no state for
it. A MoQ-LB <bcp14>MAY</bcp14> close a client session that has been idle for a configured
time; the client opens a new session to the MoQ-LB when it has another
request to send.</t>
      <t>A MoQ-LB <bcp14>MUST NOT</bcp14> use its own service URI as the <tt>Connect URI</tt>, because
that would redirect the client back to itself. A client <bcp14>SHOULD</bcp14> limit how
many redirects it follows for a single request.</t>
      <section anchor="redirect-goaway">
        <name>Relay GOAWAY and Failure in Redirect Mode</name>
        <t>In redirect mode the client receives the relay's <tt>GOAWAY</tt> itself. Relays
fronted by a MoQ-LB <bcp14>SHOULD</bcp14> be configured to send the MoQ-LB service URI as
the <tt>New Session URI</tt>, so that the client re-issues the affected requests to
the MoQ-LB, which redirects each of them under the current Routing Table.
This is relay configuration only; relays need nothing specific to MoQ-LB.</t>
        <t>When a relay fails, the client detects the failure of its session to the
relay and re-issues its requests to the MoQ-LB. The MoQ-LB <bcp14>MUST NOT</bcp14> redirect
them to a relay that is not Eligible.</t>
      </section>
    </section>
    <section anchor="configuration">
      <name>Configuration</name>
      <t>The Configuration Agent is responsible for:</t>
      <ul spacing="normal">
        <li>
          <t>maintaining the Relay Pool membership and relay endpoints;</t>
        </li>
        <li>
          <t>publishing configuration snapshots with monotonically increasing <tt>version</tt>
numbers;</t>
        </li>
        <li>
          <t>monitoring relay health;</t>
        </li>
        <li>
          <t>distributing authorization material shared with relays (for example,
CAT keys per <xref target="CAT-4-MOQT"/> if used).</t>
        </li>
      </ul>
      <t>A configuration snapshot has the following structure, using the
<tt>NamespaceRoute</tt> defined in <xref target="routing-table"/>:</t>
      <sourcecode type="cddl"><![CDATA[
ConfigSnapshot = {
  version:  uint,                  ; monotonically increasing
  relays:   [+ Relay],
  routes:   [+ NamespaceRoute],    ; the Routing Table
  ? attributes: { * text => any }
}

Relay = {
  rid:     bytes,                  ; Relay Identifier
  uri:     text,                   ; MOQT URI of the relay
  health:  "healthy" / "draining" / "unhealthy",
  ? attributes: { * text => any }
}
]]></sourcecode>
      <t>RIDs <bcp14>MUST</bcp14> be unique within a snapshot and <bcp14>SHOULD</bcp14> be stable across versions.
Every RID referenced by a route <bcp14>MUST</bcp14> appear in <tt>relays</tt>. The <tt>uri</tt> is the
endpoint the MoQ-LB connects to in proxy mode and the <tt>Connect URI</tt> it sends
in redirect mode. A change in health only is still published as a new
version; it is handled by <xref target="failover"/>, not as a remap.</t>
      <t>A MoQ-LB and the Configuration Agent <bcp14>MUST</bcp14> validate a snapshot in full and
<bcp14>MUST</bcp14> reject an invalid one, including one that violates any constraint in
<xref target="routing-model"/>. The encoding of snapshots on the wire is out of scope,
provided byte strings are preserved exactly.</t>
      <t>The transport between the Configuration Agent and MoQ-LB instances is out of
scope, but it <bcp14>MUST</bcp14> authenticate both ends, protect integrity and
confidentiality, and deliver complete snapshots inside an integrity-protected
signature or equivalent authenticated envelope. Snapshots <bcp14>MUST</bcp14> be applied
atomically.</t>
      <t>MoQ-LB instances <bcp14>MUST</bcp14> retain a last-known-good snapshot and report their
configuration age and active <tt>version</tt> to the Configuration Agent, so that
version skew across instances can be detected. A deployment <bcp14>MUST</bcp14> define a maximum
configuration age. Beyond that age, an instance <bcp14>MUST NOT</bcp14> place new requests
that depend on the stale health state, and rejects them (<xref target="rejections"/>).</t>
      <section anchor="configuration-rotation">
        <name>Configuration Rotation</name>
        <t>When a MoQ-LB loads a snapshot with a higher <tt>version</tt>, it:</t>
        <ol spacing="normal" type="1"><li>
            <t>validates it and atomically activates it for new requests;</t>
          </li>
          <li>
            <t>treats existing requests whose relay is no longer selected for their
namespace as displaced (<xref target="displaced"/>).</t>
          </li>
        </ol>
        <t>A MoQ-LB <bcp14>MUST NOT</bcp14> apply a snapshot whose <tt>version</tt> is less than or equal to
that of its active snapshot. Rollback <bcp14>MUST</bcp14> use a new, higher <tt>version</tt> that
contains the desired prior contents and an authenticated operator action.</t>
      </section>
      <section anchor="pool-resizing">
        <name>Pool Resizing</name>
        <t>Adding or removing a relay changes assignments for new requests under the new
snapshot. With equal weights across <tt>n</tt> relays, adding one relay assigns
approximately <tt>1/(n+1)</tt> of keys to it; removing a relay changes only the keys
that were assigned to that relay. With unequal weights, the moved fraction
depends on the weights. Existing requests are handled as displaced requests
(<xref target="displaced"/>). Planned removals <bcp14>SHOULD</bcp14> first set the relay's weight to 0 or
mark it Draining, and remove it from the snapshot only after its requests
have drained.</t>
      </section>
    </section>
    <section anchor="interaction-with-connection-level-load-balancing">
      <name>Interaction with Connection-Level Load Balancing</name>
      <t>A MoQ-LB operates above the QUIC layer. MoQ-LB instances do not replicate
session or request state. When MoQ-LB instances are replicated behind a
connection-level load balancer, that load balancer <bcp14>MUST</bcp14> deliver all packets
of a QUIC connection to the instance holding its state; QUIC-LB <xref target="QUIC-LB"/>
is one way to achieve this. The RID used by the MoQ-LB is unrelated to the
server identifier used by QUIC-LB.</t>
      <t>When an instance fails, its client sessions end. Clients reconnect and
re-issue their requests, which are routed under the current Routing Table;
because selection is deterministic (<xref target="hash-canonicalization"/>), they reach
the same relays as before unless the pool has changed.</t>
      <t>If a backend relay is itself fronted by a per-relay QUIC load balancer, the
MoQ-LB can list the URI of that load balancer as one relay only if the
servers behind it behave as a single relay for MOQT purposes, so that
publishers and subscribers of a namespace still meet. Otherwise each server
<bcp14>SHOULD</bcp14> be listed as a separate relay with its own RID and URI.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The MoQ-LB is a security boundary: it terminates client sessions in proxy
mode and observes namespace-bearing control messages in both modes. In proxy
mode, it <bcp14>MUST</bcp14> enforce the same authorization policy as the relays for
<tt>PUBLISH</tt>, <tt>PUBLISH_NAMESPACE</tt>, subscriptions, and fetches before forwarding
them. In redirect mode, the relay authorizes each request it receives, and the
MoQ-LB authorizes requests before redirecting them as described in
<xref target="sec-redirect"/>. Routes <bcp14>MUST</bcp14> be isolated by tenant or authority where
required.</t>
      <section anchor="sec-configuration">
        <name>Configuration Security</name>
        <t>The Configuration Agent can redirect traffic across the deployment. Its
credentials and updates <bcp14>MUST</bcp14> be protected against forgery, replay, rollback,
and unauthorized route changes (<xref target="configuration"/>). Stale routing state and
split-brain route decisions should be treated as security and availability
failures.</t>
      </section>
      <section anchor="targeted-load-concentration">
        <name>Targeted Load Concentration</name>
        <t>Hashed routing uses an unkeyed deterministic hash. A party that can choose
Track Namespaces can search for names that map to a particular RID in order
to concentrate load on one relay. This search is cheap whatever the hash
profile: on average, a relay with weight <tt>w</tt> out of a total weight <tt>W</tt> is
selected by one name in every <tt>W / w</tt> tried, so the choice of hash does not
protect against it. The defenses are authorization and resource limits.
Namespace-bearing requests are accepted only after authentication and
authorization, so an attacker must hold valid credentials and act within an
authorized namespace scope. Deployments that admit untrusted publishers or
tenants <bcp14>SHOULD</bcp14> apply per-tenant quotas and admission control, and <bcp14>MUST NOT</bcp14>
rely on hashed routing to prevent targeted load concentration.</t>
      </section>
      <section anchor="proxy-mode-authorization">
        <name>Proxy Mode Authorization</name>
        <t>In proxy mode, authorization is evaluated across two authenticated session
legs. The deployment <bcp14>MUST</bcp14> specify whether the MoQ-LB forwards a client token,
obtains a delegated token, or conveys an authenticated identity to the
backend through a protected mechanism. Successful client authentication is
not authorization for a backend operation unless the deployment's policy
explicitly delegates that decision to the MoQ-LB. Authorization context and
tokens <bcp14>MUST</bcp14> be bound to the intended tenant, operation, and backend service,
and tokens <bcp14>MUST NOT</bcp14> be logged. A MoQ-LB <bcp14>MUST NOT</bcp14> broaden a client's
authorization when translating requests or reusing backend sessions. Backend
session sharing and subscription coalescing (<xref target="fan-out"/>) <bcp14>MUST</bcp14> be used only
when the backend authorization context is valid for every client it
represents.</t>
      </section>
      <section anchor="sec-redirect">
        <name>Redirect Mode Security</name>
        <t>A redirect reveals the URI of a relay. A MoQ-LB <bcp14>SHOULD</bcp14> authorize a request
before redirecting it, so that unauthorized clients cannot map the Relay Pool
and cannot use the MoQ-LB to steer load. The <tt>Connect URI</tt> <bcp14>MUST</bcp14> be taken from
the authenticated configuration, never from the request or from a relay, so
that the MoQ-LB cannot be used as an open redirector. Each relay <bcp14>MUST</bcp14> present
a TLS identity and MOQT authority valid for the service. Relays <bcp14>MUST</bcp14> still
authorize every redirected request themselves; a redirect is not an
authorization decision. Redirect loops are prevented by the rules in
<xref target="redirect-mode"/>.</t>
      </section>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>MoQ-LB implementations <bcp14>MUST</bcp14> bound parsing work, route lookups, per-session
stream mappings, fan-out, queued bytes, and concurrent backend connections.
They <bcp14>SHOULD</bcp14> expose limits and overload behavior to operators, apply admission
control before resource exhaustion, and avoid logging authorization tokens or
untrusted full namespace values by default.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests that IANA create two registries in the "Media over
QUIC" registry group.</t>
      <section anchor="iana-hash-profiles">
        <name>MoQ-LB Hash Profiles</name>
        <t>The "MoQ-LB Hash Profiles" registry lists hash profiles for hashed routes
(<xref target="hash-profiles"/>). The registration policy is Specification Required
(<xref section="4.6" sectionFormat="of" target="RFC8126"/>). Each entry has a Name (a text string), a hash
algorithm, an output width <tt>b</tt> in bits, and a Reference. The initial
contents are:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Hash Algorithm</th>
              <th align="left">b</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">HRW-SHA256</td>
              <td align="left">SHA-256</td>
              <td align="left">256</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">HRW-SHA256-64</td>
              <td align="left">SHA-256, first 8 bytes</td>
              <td align="left">64</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-route-kinds">
        <name>MoQ-LB Route Kinds</name>
        <t>The "MoQ-LB Route Kinds" registry lists values of the <tt>kind</tt> field of a
Namespace Route (<xref target="routing-table"/>). The registration policy is
Specification Required (<xref section="4.6" sectionFormat="of" target="RFC8126"/>). Each entry has a Kind
(a text string), a description, and a Reference. The initial contents are:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Kind</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">static</td>
              <td align="left">Pins a prefix to one relay</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">hashed</td>
              <td align="left">Weighted rendezvous hashing over relays</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MoQTransport">
          <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="1" month="October" 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-22"/>
        </reference>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="QUIC-LB">
          <front>
            <title>QUIC-LB: Generating Routable QUIC Connection IDs</title>
            <author fullname="Martin Duke" initials="M." surname="Duke">
              <organization>Google</organization>
            </author>
            <author fullname="Nick Banks" initials="N." surname="Banks">
              <organization>Netflix</organization>
            </author>
            <author fullname="Christian Huitema" initials="C." surname="Huitema">
              <organization>Private Octopus Inc.</organization>
            </author>
            <date day="23" month="October" year="2026"/>
            <abstract>
              <t>   QUIC address migration allows clients to change their IP address
   while maintaining connection state.  To reduce the ability of an
   observer to link two IP addresses, clients and servers use new
   connection IDs when they communicate via different client addresses.
   This poses a problem for traditional "layer-4" load balancers that
   route packets via the IP address and port 4-tuple.  This
   specification provides a standardized means of securely encoding
   routing information in the server's connection IDs so that a properly
   configured load balancer can route packets with migrated addresses
   correctly.  As it proposes a structured connection ID format, it also
   provides a means of connection IDs self-encoding their length to aid
   some hardware offloads.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-load-balancers-22"/>
        </reference>
        <reference anchor="WebTransport">
          <front>
            <title>WebTransport over HTTP/3</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   WebTransport over HTTP/3 is a binding of the WebTransport protocol
   framework [OVERVIEW] to HTTP/3 [HTTP3].  It provides support for
   unidirectional streams, bidirectional streams, and datagrams, all
   multiplexed within the same HTTP/3 connection.  WebTransport enables
   application clients constrained by the Web security model to
   communicate with a remote application server using a secure
   multiplexed transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-16"/>
        </reference>
        <reference anchor="CAT-4-MOQT">
          <front>
            <title>Authorization scheme for MOQT using Common Access Tokens</title>
            <author fullname="Will Law" initials="W." surname="Law">
              <organization>Akamai</organization>
            </author>
            <author fullname="Chris Lemmons" initials="C." surname="Lemmons">
              <organization>Comcast</organization>
            </author>
            <author fullname="Gwendal Simon" initials="G." surname="Simon">
              <organization>Synamedia</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <date day="18" month="June" year="2026"/>
            <abstract>
              <t>   A token-based authorization scheme for use with Media Over QUIC
   Transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-c4m-01"/>
        </reference>
        <reference anchor="MOQ-URI">
          <front>
            <title>MOQT URI and Discovery</title>
            <author fullname="Cullen Fluffy Jennings" initials="C. F." surname="Jennings">
              <organization>Cisco</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <date day="7" month="October" year="2026"/>
            <abstract>
              <t>   This document defines the moqt URI scheme, URI resolution mechanisms,
   and discovery methods for the Media over QUIC Transport (MOQT)
   protocol.  It specifies the URI syntax, fragment identifiers,
   dereferencing procedures, normalization rules, and X.509 certificate
   matching for moqt URIs.  It also defines DNS-based resolution using
   SVCB and SRV records, as well as local network discovery via mDNS and
   DNS-SD.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jennings-moq-uri-00"/>
        </reference>
        <reference anchor="CBOR">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="WEIGHTED-HRW">
          <front>
            <title>Weighted Distributed Hash Tables</title>
            <author initials="C." surname="Schindelhauer" fullname="Christian Schindelhauer">
              <organization/>
            </author>
            <author initials="G." surname="Schomaker" fullname="Gunnar Schomaker">
              <organization/>
            </author>
            <date year="2005"/>
          </front>
          <seriesInfo name="SPAA '05" value="ACM Symposium on Parallelism in Algorithms and Architectures"/>
        </reference>
      </references>
    </references>
    <?line 1127?>

<section anchor="deployment-examples">
      <name>Deployment Examples</name>
      <section anchor="interactive-meeting">
        <name>Interactive Meeting</name>
        <t>A meeting application gives each participant a namespace of the form
<tt>(example.com, &lt;meeting&gt;, &lt;participant&gt;)</tt>. A participant finds the others with
<tt>SUBSCRIBE_NAMESPACE (example.com, &lt;meeting&gt;)</tt> and learns one participant's
tracks with <tt>SUBSCRIBE_TRACKS (example.com, &lt;meeting&gt;, &lt;participant&gt;)</tt>.</t>
        <t>The deployment uses this route:</t>
        <artwork><![CDATA[
{ "prefix": ['example.com'], "kind": "hashed", "key_fields": 2,
  "rids": ['r1', 'r2', 'r3'] }
]]></artwork>
        <t>With <tt>key_fields: 2</tt>, every namespace in a meeting has the same hash key, so
all of the meeting's publishers and subscribers end up on the same relay,
which is where fan-out happens. Different meetings still spread across the
pool. Both prefix requests above have at least two fields, so they reach
that relay too (<xref target="prefix-resolution"/>). In redirect mode, the flow could
look like this:</t>
        <figure>
          <name>Meeting participants converging on one relay (non-normative)</name>
          <sourcecode type="ascii"><![CDATA[
 Alice          Bob          MoQ-LB                   r2
   |             |              |                      |
   | PUBLISH_NAMESPACE (ex,m1,alice)                   |
   |--------------------------->|                      |
   |             |              | hash(ex,m1) -> r2    |
   | REDIRECT (r2)              |                      |
   |<---------------------------|                      |
   | PUBLISH_NAMESPACE, then media                     |
   |-------------------------------------------------->|
   |             | SUBSCRIBE_NAMESPACE (ex,m1)         |
   |             |------------->|                      |
   |             | REDIRECT (r2)|                      |
   |             |<-------------|                      |
   |             | SUBSCRIBE_NAMESPACE                 |
   |             |------------------------------------>|
   |             | NAMESPACE (ex,m1,alice), media      |
   |             |<------------------------------------|
]]></sourcecode>
        </figure>
        <t>Each request is redirected to the meeting's relay with a <tt>REQUEST_ERROR</tt>
carrying <tt>REDIRECT</tt>, and the client retries it there. Bob's later
<tt>SUBSCRIBE</tt> for Alice's tracks goes through the MoQ-LB the same way; it is
redirected to r2 as well and reuses Bob's existing session to r2. A
participant who also joins a second meeting, hashed to another relay, gets
that meeting's requests redirected there. In proxy mode, the same requests
would flow through the MoQ-LB instead, which could coalesce subscriptions
from its clients (<xref target="fan-out"/>).</t>
      </section>
      <section anchor="live-broadcast">
        <name>Live Broadcast</name>
        <t>An encoder publishes each camera of a live event as
<tt>(sports.example, &lt;event&gt;, &lt;camera&gt;)</tt>, and a large audience subscribes to
individual renditions, sometimes using <tt>FETCH</tt> to rewind a little.</t>
        <t>Routing viewers by namespace would put every viewer of a popular event on
one relay, so in this case the MoQ-LB is placed only in front of an origin
tier, using the same kind of hashed route with <tt>key_fields: 2</tt>. Viewers
connect to edge relays chosen by location or load, and the edge relays act
as MOQT clients of the MoQ-LB: each edge keeps one session to it and follows
the redirect of each event's requests to that event's origin. MOQT allows a
relay to forward a <tt>REDIRECT</tt> to its downstream subscribers instead of
following it (<xref section="12.3" sectionFormat="of" target="MoQTransport"/>); edges in this deployment
are configured to follow it themselves, since forwarding it would send
viewers to the origin tier.</t>
        <figure>
          <name>Live broadcast with an origin tier behind a MoQ-LB (non-normative)</name>
          <sourcecode type="ascii"><![CDATA[
   Encoder                                  Viewers (many)
      |                                       |  |  |
      | PUBLISH_NAMESPACE (sp, ev7, cam-1)    v  v  v
      v                                   +-----------+
  +--------+   REDIRECT (O2)              |  Edge E7  | chosen by
  | MoQ-LB |<-----------------------------+-----------+ location/load
  +--------+   SUBSCRIBE on cache miss          |
      |                                         |
      | hash(sp, ev7) -> O2                     |
      v                                         v
  +--------------------------------------------------+
  |        Origin O2 (home relay of event ev7)       |
  +--------------------------------------------------+
]]></sourcecode>
        </figure>
        <t>All cameras of an event share one origin relay, and each edge pulls a track
from it once however many viewers it serves, so the origin's load grows
with the number of edges rather than the number of viewers. A request that
spans events, such as <tt>SUBSCRIBE_NAMESPACE (sports.example)</tt>, is sent to
the relay selected for that prefix, and the relay network delivers the
namespaces of every event to it.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The design borrows from the QUIC-LB architecture <xref target="QUIC-LB"/>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIALTp52oAA8V963bc1pXm//MUaLnXEhlXlSVGsR3Sdjcl0ZHGsqSQdLvT
XmkXWAWSiIpABUCRpmX1s8yzzJPN/vblXAAUJTtZM+y0RVYB57LPPvt+mU6n
riu7VbGf3fu2/nP2os6X2eN8lVeLoskOm8Vl2RWLbtMU91x+dtYU1/Lg9MXj
e26Rd8VF3dzuZ223dG5ZL6r8ikZaNvl5N63yapm/2VzlzfSq/vt0dTZ98MC1
m7Orsm3Luupu1/To86PTr121uTormn23pPH23aKu2qJqN+1+1jWbwtGMv3d5
U+Q08+F6vSppWnq/zWj87LjIV9PT8oqWd1M3by6aerPGCotlmWevrmkPf/7u
+ZN77k1xS98v9102za74yxpf/n1TLvDRCts+023jg6ZY5bf8S73pyuoCv2Jz
7Tpf0JKKakMrzbKt82WZ7O8efr3KyxX9SlD497Lozmd1c4GPc4IufXzZdet2
/5NP8BQ+Kq+LmT32CT745Kypb9riE3r/E7x3UXaXmzN6s91c5u1l0fBXBGB8
uSIYtl00rH9oJu/Nylofp8GcyzfdZU2wp1en9P9ZVlYE+JNZ9tIfH38sJ3uC
wfpf0TrzqvyZT2U/e1K2i5o/L2TfrSLCvy/wzWxRX/UmezLL/ldRVQTlNprq
yWa1Kqr0m/fMdL7anJ/fxvNUdXNFT1/zYRHanjZ51a7rhgD0fPp0JogKYDOK
dvbtdG+PnsdJ7mfHXz/54wPC3Cx78vTpC/77808fPnCurM7j0fE03YrBwECx
KfBraviFvXxfnG1fy01xxkuZ4gx/j5kPT6ePpt+++vPp6LoXj66wvVd/nn53
/Dx+4m8KPH5q05QY6vGrY9nEHx/9kf7Gbw/3PsUOvj96/qdnp0dPp8+Ov99n
uBpl+L4oLy67Ypk9LduuKc82+P0ZoVV2mp+tivYeP83XN9t78OAP/KdhVsY/
U3/WJ4Ti1bJYXeabotFv/aFfNjRDmVejT+kYf+Ix6qv8zeD9P22qKm96X7dF
UxYtjssWc+/k9eFhdv/BH+6Bpjz5Nju5vVrXbbm5yuoqe503OeHeqmyvaMLs
cEU0jq7OlVCcmCa2uEHT6TTLzwgu+aJz7vSybDOihJurouqyZdEuCF4FXuX7
bm9mhDsx1aFTynpExHkEyXZw9LtElP6+octNgy2auqV/snVdr7L6HGd/KjSr
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
O+C8d+AJpHxxIpj0Yc8jd1QD5CNrjHi+RRmD6phD47YgeY4l0dREkeY1Ettn
IqR5GM4UwkEGRqQq7oozUmMjjtUJeuyd3UTthg5wuL9/hXt9WzKWTOrmr+ex
bTrUqInMeHHGhFil8RYEc3BlYja41qH2AqvYFqbz4V6KKJPZpZnMitPtQGPR
ZcRpbcNo7BmtvSmmyhcWtoUN83seQV3imodWiIOgqp0s19vMX88niUOcs/S2
2PvFI862uA0xxgnbbOU1SR8x9w8WsJMndtzdZORNpSZN75B2iQ8nclIlA6vr
xzkx476eS0J4Bwv1uEV4MvAZBBgllgp/BLlCpa0TwLClUY8ryirnTJFW6HvA
FggQQL+bsi0m8XUMk2umWHCbRE6TVtLshhlE2CdkTuEvaehBkgCIXLgk89uu
pSZHiOAVqikMwgKkAgVRD5RPI/6YX1Q1a/2VXvQ42+5zLAgPsh7qcw/l0k3/
vqmxARHdhUlEsnwrjnv3A3G5t9k9OeF7cNPfB4W5P8nuq+kZBe7u/3XCTvZ7
8A/hqSxxf9NfpMLK59n9ZgqsmD747H72buKG4yPMFeNLgPfY0JH7W4Zu5Ysf
src6kZ/kIY10T0RU+njv3WSYpD14Z+83vPP75J2H77K/jm7u12yGxlb/u2wj
/nvvPo3v/ipKJqIe9Tq8tsQfkHOfBKQXM7cgFUmUy9MMOnbPCemdxFE1UirH
SCIXhOvlEUcpE3Y/eGQLnbIk1hg3P539fsRawpZVzq7ZGnrZDwGL63VwBOe7
Xb3OERnTC9TPdeRMMjaFOi8q2LASbaQc2FdP6if9JeWU3EgyWzIm5/hpUJCn
4IgICuQ8ypeUT43mJsmCTH578V0xdP84ezSaaavSkKcvi7zl3MvfZS/rLGVB
0brvJ6GtJL4/fXV0gmCxH4/+8/nJ6VxLgwWBwIel4Zc4ZhF/jwkUlkw4lClI
+P/u5fOXp0fHtNOjp3PRbS3vWQSRYWo0tI7ToTQgLvaeh1hsuMPcVmSL1sCT
FSR9ZL+tcnUKRajXT3gl6PBqXx6+sFRN4ZVs7Pm5aFAu5riAlvYcBpvrfGWL
1cupIQIa/PVzqCxi00rWJKkAG1I1b1HuBIYCNTHJEr57efjd6bNXx8//i0CG
8Q+zqCoKBLxNs0Ca5FWpsgW46JLePPrPJ0cnJ8//4+jHF68O8W5PVIbrUywv
Uaqp91ZytF/QS7FwLnAWoebDvfGbz7fiRGnR4TkHoN0icENj83L96B3SbKMC
dl5pivPuht5HYuqLHAsPKluJolGx5Xxna3QBwVTklV5xHk0fxVfOO1JjcTRa
QCBK4lzYQpkcUyb2Owg+qFXL163IffWEUPrHUDgdlDbjzPekco2GYjKtD45Y
CwlJIisTJpD7aCxokByJxUCOIgjqhFaz4VCzcMV9mqbzTrwnOU0JlkTzuMYg
ruCtpdhHIl6+gqv4Noh6PiT3PhbXrMo409gTbo9HKjgnQZ7JniWzGV6sopna
lSdKhz+T1SFpPq4TITdKhhVgQ6Oj68rANtFRal0ZN8C2pOoS48LX6rmjC+Cd
eGqEVB9aWuSKSZsl1V82RZHwOXEnjTqZR2sDsBDLhVSj7H6RbGvFdl+x63dW
LIquiNFVjAE/p4/SpqfMSbnPRGLro5xpbcEAyMAmbLbSgbDZwEq1cx4HPpyJ
dRTRDF1R4VbuYr7vqktbF0/409qfhpTb0CIMTOGGBaHyFeGnlo0UpxCHdl+X
tNYoGgDYesMwqboWyqi7yps3sTrinbORhCEhULhEPiyca0tZmR4tdeIkDFpE
EL8fGSg8HMlvYfTFiitp5WfNZt2tbrnSi+Az3x3exqYiKG+1BTUFi9/isUad
KyVLLpFwDFzKWXtraoMzxZeKE4SUwpBipZ1lj5U2C4wN6qYrtwhdOLtVTcwb
pibhV8fUrSmL85XFlvWp2zZmEcWJSnyCk4331qLAHQOU0bFSPOThyiAhHbyZ
mGElICdcexnhehJMFMet6IqFzCkUTGiRsB9RGpwVshI7plVJhkdHIhiWvcgF
tc8FxZfDhHoxh2w+q3KWiwuN8SCxleeNgyZbsLrCkSiSxFa+09jCp1YBLfP8
+u1HoSwarl1EL/0X/XsiAooIZKHqWlwqQwjpvufwd8VYDG1xRIraQuy5d1nP
WEq0GcLq6JMa9kG75UwQw87DSR/+hW91WW0KraVSNl4wsHuYFrZDPbEx0qRx
NFwMl4kyrZv+gAJk80HYV7oIhYPkv25kAt5TD9xKOCJuqrIFpHMjVuhzAMs6
EVUiBa0azM0mXKjjbbK90h4oeZNZTRKtr2cFuIVjMHqMUZoasXVVneYISaXj
ABN1dSqZdv1jmkQ7ltJ/zKHVui3alW42UeosN2dX4smsjoodN9eP3op8TuLf
vHVXtx2qLULQCQJQjBx0CQAsddHyMolOTcu23fDavQ4zxlsORo4+RLhzHRAn
mik7U3QIz4HNB/IrTFpJPUYV54piici4ICW1DHmRTC040YX1B2zzEskZqjvn
1QeVi4q0BPaWR/zT191ijIHVgrD0AjFps7H75gRBRCZCzBTEfg2Aym7ykg/a
mIuIMisJBssXC0RvykV0UjGGHj4YlP2Iz5WjeUx90AL1WuRDHNtS+j4umRqX
qpRoPlD+iFjRbuvNih0zYDUC9/Ak4zvraVH9NpnSq3ILrtLEal9UWi7Jx+XI
yjRzTIKxiIhuGB2fv/zTj3KmqUI4ZqyAGRse+YgqjJo9tKwbHVc8gTA6hAew
1OCNRZpYpiq5/kVHj+JzHFUTDyKyueZKMiNVVxgsNlGqnpatbb0TT6xfhr/q
5MoS+8zemH2GjpYpGNeKw9Aya+druKXlioaSL8gA65kOGoMEfx4mQqYaOriS
nm7f47eGQivdJ8nIpeJpD4haM5Ur/gjBkip50KriCku4173CtUBET0kmWret
Vde/oCfD4KJmpNMrBZrl8OqbSgqCe50qpbfM1bS0bDCqRAYVgjPbCGacJR7c
NXfkZgpZMPrP5qoRvjBjY6xUMsPQ7FTz5sK7FOwPKXI2UcOtStluUNusV9es
Z7u0qnOlHo+sHe+mxpcTIjRrv3Kzv7T41CzJdGPWdRXXovMLVqNvsjl9nEkx
Ag5X5+oqcWupW7wkbO3KVvoCSKSGht5FsbE+1artGZLHL5M6Z4Uti/XGrAdF
KAa6QQpVZBcZ413KKi42OY3fFYUa88T3xWFXGowp9enZFWclCqV0n+kIUjxA
y6Kh6YTeH5XcmYJyMENXWmT3WbmiwaAlvYC1Tsl8YpoR4AUtRQUEX7d+/u3h
f/6Y5v6ezHeD9kHKQsGCd9BiLuuKbpEE2Ioph+fm+EXBvjZMPEuKJnjJgvPj
8rT2rMmUXqwJoToDy/4E7FZcVhL+VgbPRU/p7SkwO+U5++fNRIS3dnuXIdhT
xelsyzSnBUOnPj8XW5u7Axu9JSonIcLYaTiHmV2sKYsqSyf365WW6YwrmQtu
0ipkv2aXFlzdmatN91QytA9PUffTPvyvQ5Ruz05ffXP0El/jyPHVj/zJj08O
nzw7+vHk+X+xbZ438/zb1y+Ovj16ecpvznclC4MYoQaIRNX7ugg+nhZFNd8v
fa6yGEwdF9vApbzDTs2e75i0izgqMhMPyeB040Dv0Ze/eZEpdgslWXEg2T6d
glV8jhcgYQdOgjs0fMsogCZKNG/BRDp3VyiJ623qmqZyGIOBxnyDK7Aq4WZJ
Y4X/OEay+AQYSVh8NJNyEhXhb62iMif+YIZQgTD26EnSnzbikPR4b4u93+qb
unddbmga4qtG6ld14xNvhRbAGS1DKLXrYUniPiAh6mqz6koSXX7yv8VmewmW
IKpY8zZkkdNzDooxWLASAIFHFcaBxYle9mNHfVUk8w5Rmo7pUv897qxi4kQw
RmrvI188QK29YoJzff/JRCiaIGNs1RzGbCQc91stRXDCTsng87B6BOMmSt6S
wWKCZaYgC1c1z8R9WJ97QViHtsgrK4agpv2oumY6pLmgrMBHnTxrQE0FxQR9
F/RJJ23IOAGTnY+a8hyoc5A1TQAOVNDXPB6tiTzwQ467G4eOxshlKd7MxG+5
O85pDpiq/M5MsmoTVh7VL4ZS83WNyFY9YsbFBoxv55GjU0KVWdUERPKRHbgk
HWHUAcxpMyNg85moqQ82esCyu6OjfO8+abCoKsYY62W7Xpdm5MLVRY8xYrAA
lZesgCZ4iAHHsa090PcsJOL504wb5Ugc+kjNjpExXShZb8NJTNuh0Mst43FU
vScoIZA5OG5R3IDD5CRoOBrU5iHucVFa1QN1uY/EOBjmxUQ3kbCSAsGAoQ97
13DyGJudlsEP5gSADc/H2w5JBQlN5KhRTWxGumqSeqSZnAYVEq8ry7xmU1OR
+8BUcWyyaiJH6YKG4puKRUHS4dwl9+i68LEqyy3uZELxEeUsci2/AqMfM1vC
weGz1mNH5zDa0d+lvsezVDbEFnVL4vGWPu9JTj2iZg8MUWwWxuHHjcL2eKj7
afPEnjsVOSHBZJnYDelIgpkszR+cBSBaVWDvC/ThLUBuRrIkRo+Ww1Wj9X6K
Y5E+uGjoL2bO7JkalCdKm4NFpdwXxUouX5vGvPxhSPImWawpPpqNBx+o9OIi
77KYmWNSFfpGqmf47jrxUZDqsNedoCdq7SBiqwqoCLhIh6B34kWx63giwEs0
LUYmEwMFdXpNEoTFgLkXfTppdkQlr+ZqHBoHJoHcISLRk4c20Ad3GETcYS2l
cMT9oUVF5FvUsmcHyYO8qAJQXNb7rJuupaxKP5JIVENRRZl0iGUdpoa2mPgS
YRaV3N5Wi0vSuZGf4jFLtZuy6RUOnxgTjutcjZa5EhCPixluUDdr8HSQPkZL
cTGV79lUIYbGnR40AL5/e7zk5K+hgzyPNIhmousIspQvYhjQWCP/p1wKiimu
NweWrWNbWa+O2pipTL2Br7iwvpSXcvoHU4VzzndWoSbe1/3ohlkMRdK4wm2q
0uNSvorpizFfZAFMYmIjicORhAhhTwW/vqzpzWdG72NIBMhBbvV7iINUYmPM
gY4TBLrBZMk4TI4sAChy7GvRB0hLEU1NDCna0WNVXMQ6sjNpjYSryHoXCq1F
tIBe7ccfScqKHkfrEnoXypoEk5tkPUVygO8bwJUuDSc5w/HGGkL4w4wc46ua
eKs9xPJRJyX1IzoY9YGLCXaegIjAFuEg0CGJShvL3aUtgSgxp/P3g9gj3SEY
pU82Z1yz0D3jj6KJSLnpzRUPxayg7zgRHh9JW+rB0JqR6RS9wQx/wziBSqsj
VLmEd33GHMTIe9EXm0F7Yvkv5B33a+h5EZBFG2ZFkgIE5/qEBEJEI9jL2mMD
vKYj3XEmxZgiTwx69zx/GSGyRzA0Jc0vco3jGbCvXgErtvUYf/REwCMSp5/q
tVnKFg7/ki1pCva4OAnYW0jiiOjRUaNBWI5n2WsExvl71JNtUgQbE09CjUTf
bOQA9X0AwfSgDv/C1NtbXdY6MQ2txhrcWhYrHqs64O35l3ljh3QS492TOifB
UXqcvtKqQ7scccbtd0kCeXxrJeDGnflepyuihh3+/nkbkeuraqFby8B+E8wY
3ohEOoNLSxDwSUlzHYYS98spfevw2ncM97ZYUs0cKitdqW2u5UuEiJzHvTiq
VsAlbQUj25WIEaF5sgTWoCfWqrdgT4MH2qS//lHpIzNOLWu4CVgTAq/oD8n3
OjMbsx/kTrt0O2qTs3Ar61sZsbVYbcil9s0y0igrdSD7Wnh8DVGRKAs8cxiY
Zn26QKDHrQu9+HGfUBYHSMlq0FIyxuGFx+HBgUmYX++IYtafNML2EOW2YVmk
1U2iqNn08CbekSx5bMGHECxQAE29Zk1c2HaB/BbAVeigV6NsK97WkTAJICp4
cIrD0sRFpN9eWVCJ9JKYHKlBAkOLDxZgU7OcLwdx29S+G+52/6rbEuDsUzQ0
DepAg2ESXqdB4n5Cx+beCGnihy2sPKir/c6akjwLlZZeNHAO/BFZ1ExHe6Rs
d0uoizMgVl/aDmSZbVSMo/CUJUQw3bQSbWOXbACZRKzW8h9ibjtel9YmNAD2
hGarXCFnI+c7BlqaSxHRqvcZNsa+3FRK4RAS5ZfSiBxwk7hci5DlJ8/LVQf+
1aqANLHBsdF1UyLYWBuegaEXTXer77Rsv/361fH3h8ekLEUqt1SHZp59IDIg
kviGstRF0QW2k43dSA9C4sI3XE1giHN/qznZsQpdy0fxk/21WarQvfpmLhUk
eAmTSGiSw30tOy5DtrsOfb9NaSAGsnSqF6h3QJiiUmXZSbz3mTTECjticiC1
I7ymxLnIAvMswsXU9knCgx+FZbjEzBJL8pB84y8jt5OfEn3XjHJLHGkQ3dtQ
fmPkcLhcloyuoaDadG2FRNJApiJFcFXkpPb41WNO1IfJt2jE6Up9QSt1qiMw
kVdpiH7wAZfJOGNLAGnFiUvjcPf1NMjDIm3yLl6C6rY4lFF0zdTUq/d+baWy
xdI3btcwi1OyaHYtxA0UttscehXAd0e4VLDux4NOrISUtz4nm6UFR7pJyEv0
BzsK39JiBUcjXScSI+zkkboSg1uIM4HZODUetHHWhcZ3jZuGfYTXmAMujl3Q
04gDpqJgiSB7Pe/cwIMbH+ccAeImuX93/Hye2hE4wKst1Fnm1Ckwy16xOefO
OK8UE9MsBeezFIYdvxVrLYImMUr393cAs0ye3RU2xqe1LXSMj+VbPmFOb5EX
337UP3RS/2sJ9vXDJ9sL2aMhIDPkX/WkGjeeHDqJPeEh2DZWf+mEC+AY7JcC
zshmY6/QU1JTJdzp/Z5qFz87CKxACRuRqlxc1eyz2aOxgmOz7AWKY/3JF8cS
xhmSxqDosytKvlBWEvW6jNFtksag3G+De0oaNXBVBhosHaMiIpu4CiWQIDW8
DYRutSVn0q1C1+HPb9KPqwFfy0nNLjqzwOcqRZiuxEvkOgQED1a0vL5qfT4J
fgyH1oIpATnRwcw+V6+Wpillcf9be5VfsU6uTe9lv3xcUVFWabCAlBLu0nqW
WLOIJaTAbAoA1HCR8He5TCJ403xtZp+tHy7RIuJEU9+5k71/W71+Uk+Rw3OM
W0omjlW+lcVB2EJ4Rd7catHrOBp6JEInzS/U+2Oxa5xwyxccST5Fvgz5ghEx
9AQ4dX2JB0BvJxcgSjwHkhDG3OLAIutHPAj8oljWojcYjUJKvFJaf2xeXPCf
8PAsIXNS4m2ybR9fE8InY1ueJdl6kSnw3CsGKqkRvMy7YyJ+bc71/h0nY+cy
YxJMX4bMzu49JFlJQMqk3Gh8SS9OG2nTVnxxwCA9ZrgEM8bodeyHU47l3huV
HTvy08o0dKSeqbhRVXmWWiS0I7b4AkK3b3acwqHft3Jp5sR1woC81QKisnSV
RZ8N3LnUHVtHFR/MFnO1aQWR+9ZFu2eSewGTzkCaSA6qL1twvuTwuNz24+pd
ZEtv7uL2w4RlXhrw6TYWKsh26/Ng+ZAExVdKnkmeO19JRVa1ZrhwJ9uuXlsv
CdJbJVfJQLzsGYnQ0p25SK6UzuicmegjN5UaLOheCCvlC0EDe9dJxNesjHe/
Vpgari2Z4IJocXG+WWnLYc4K9jUPWylDdGIOVZEKsKzPZp+OyQeKzJbqJJ51
mEqtmBWbbmYhZy+OgB7JHelXXk3sM2njXxavpyxeS+/fX9mVNv453vvAzq/J
lx/Y6HX4zvv7uo7MIy0Fd9Q4i5JHPzFearw4dBU+y7pe7f5D8/ya1qgf2hJy
ZJ7Bx/3Gpx/0zlj05Xve8VDxRxctfNs8Cn2m9Yt83UZNFT+s9XAPQFvnCe0b
vSNtifCI3a3z3NFq7wPmGTZn/A37mW5p+fgBePD+/psfsrbsCy9HV2IlZkby
1Z37+XL7j74Tj9qLbEHESjihr8J+BkPdvZ+0P+XrYBUImMB8UKdPQp+2tKy0
XEA1PaQ1hDhraHuVChEPxp1pLKyG5uCwzLhBLaGR+klqkeqnhauEQDxFKzM4
Vm0f9lS9VSTpczZG0o9+V3nOMGJframx5U5T/JJYxrm1jZ3HFWiEExskMUxo
d7YTMcg/ega5tRDNnuzHxoJQHvWn9ZVL6XdfrzQFlA/gwGY29EvVcdbAsldi
aKR8UDp11sHuy8atLIthdV/MhWOl72O/VVqlL3yD0eI6Sh+oLIyoCshRT8K7
uY2JZfIFoQ2JfJL2Z1lGrFeco/D872XT87QqEsP5wai06CVAVoBiuGA1Kq5a
JTNBDNO2WTTP28FIC8Tv60gC+5l7lGjLfQE1GASka2+Ky1CQC86nZlRUNuct
GHZXJOGb7m4winuBHeoSu1VgVsAoXvBPRGSLg0uveVSKUPWdG446jI6q94LX
vAoupVtAU23rntkvqrYYB0ty3EiSgmlUgNuhxeUWuPBjZQHzpvZGJRrhJONO
Gr36HZxWqsJom2ZMW+0bU+kS+GgJkiQrJioXraU7IrWKS4yG8j0OOYFqz7Bo
ds334iKXfdd+QivY2OmTjghZ3UAdzYNyFhFY4ISoPeCNMKfBBG2oyCk/qApc
KHJbIQLtSxnVYhJHvk3g146qp6FAe1JEKaDwr8n4fzYStBK66BVJHLwV8ew1
iguXUXoh+UIJ4XJsD7l1tfZZixrrsfZ3xt6AATbF9SWsjjKnIHFd/XKdXjIz
vMXwGdyFPpr4/dwWnYSn95DFQr8ncjAEFFTs4gJFHS9ns0bYtVluB/c2MrSU
XShXJfHwcA+gpEMaw4LqHkOrgEQ857AvIhFnqXWZ8qhonENU7EHiidCAQhbe
0jugM1paD9+TKk3E7wR7t9aXM48YSxoL4bYaz9K7YVrnwPEmzElt/DMsF7KR
CjawCob4Rr2ekst1SXrplZhmDMrsapGuPAIUDfZIfBaJK8kKeHGr1Wq7eOed
S30B7702zhCIq7uRhG/HOcVWiCSNgzsrotM08KcGuhjSTKg+1HgT29p83aCI
XUUFK97DrrY6aay5I9etL61KSSpPwfR+YJFfKDjiK5H7DH/at7csxRViuNJG
+946HOrYT9HdxaJAqMnSZuMMezyb0+ChvYsDAY9LK/oaUKw2pKmqbz9KZUnh
9VtKvqmN2yqwsX8qzqpkhh6Ky10VaG3XXhJZ9AYjn6bMrnclzGoZjKZsK9K9
L2urqnNV0z6kuCLiVCqkA0rdDTWTIItNOunxuPR82dWNmIYxq3jo8FVo+gU+
mYT7oN9DU8JJJf5vnlrxIikeR5M9OTyVxnEIPHz7lv6cPpoiqu7dO9jyEUG+
K8x3dF9WrTry2nnFIwr+cPO0+/A87dGQtoR+tx81TZYTPLHppGmyAms/47a9
w56/2cFWSJsvq0WR4R8+lmPmssRi1daP0+VKT+aDoaD3/ubJzsqj6NKlFXKW
WbPgkaXL41ErZNpmU8pb4z2O8RZHQkZKmTi2M8WYfVRalsyme9kn2b2lOrz5
j40lPd37gG7QtCGuunxnQ0+PHlETvzMufseuZkmKM8vgzB2xlI12Ok3Bcoqv
JiWFay26p8gb6VjKJzhXxYmAY1qp88UDYo9gpLqUSfN0k6t6Cq6qH65fpyjq
hkZfqbNcIs5arRhlEtpSgqVh5tZtHmgpN0scoe3FsQaiHWqENekAsWRgyxyj
ZgwabiaXc0cyD3k4AOBVhpcr6fJQWfc5yFiIQrfgdIhcWh6xXmmWMvMYutE5
F6CAfdvuKtc4sBZ8vlsXjCOe5KkqelNKz3UUjML3yPCfOO4CyYWaoqrr2h+y
kMAuS65Wxa3zBbfjpNO7G3mEIolhBU5WIB3/FIKxnUKyPaTgGK2yK6zrD8eQ
AZ5MC/l+Ehwtlk8DCr13NAJEybGCmXUO48BLHZlESxQ+zNlSA9L8901Jp8O7
SGwnRXVdrGjds+zEj2vXT9tjuLyrr4TiseeoBwDFAjA57iHUdlNUEqpIEKuX
6ZUNFSLKxqWUH2l1bFRYcL1Uz7juriChLkqL1G7fkGSlZCAsUB1SInkUy14t
GokSZ7bBSX0/lVebq+HiEN99W/ONgc/qQnrD2iRB4pBy1nGVAhGhJdLP+0pR
/3okLiYy4F1tqW6QAuLYepT0BJVQZNFLZHpwCOpv4xut7sVL0uvQrcEAP8nM
DGlkgIV2PiOPD3Jc9l2/6uwBjH6w0UIetZDPYBEI1TXTKpQ+IdinEcJOk7QS
3h66PKb5aDx3tGWeOuBY2UZdh+W2kJjDEnbemXiqmGmDoLH6asX6j+8/x5R5
MgClIKnv9gEEWBYt27E5hpTdvt5xCDNEckWl0x2UpIXGrKPjDCTIYxrlZ0gf
7lDzVuC2vQq+XZbmrfBr6IM5OKlIQwBvCXv8Hsgh4LCmgXq/5tU88+10lp7S
q9TOc7Uu7RQ2f/jJTvXxw10O5WXpkDXHg+1r9mWr8LTqomwCjcq6Bo1fl7up
kgWL+iEe1vNGYOjkOgZeIo/OsqMBmoJ1RFmZy0EVUjeInn+t3Wt5W/nK+56l
KxfMELHWqc3qaCcPkLGBGEJcplBUUwiDhO1EpTs8Nkdp/rF+5Ng4whIZJ3iQ
bsNWYIGAXHsVUEAwXqCLcfYCKT+Pc9rAQvAqKkvRCPM+02qg7DYken+LnNYB
V1jWakuW5tmFrzRThxx8jS1g+jQYQJqx6duou0gi4FKK/9qSufGyZCmd8ZLF
Uobq5/FnRuKFjyJudQ2PTsfWrVy2EUY1huNJO3LWrX+UFqrBK1jt27f627t3
rhRb140VqbwsC4ZTqRZBiKHcPistBMVVgYEKIRXGsZjShATMxr+o03k1O+JA
qmqHiqshyQkWIY0FaENQCIscPkSy09K5VqJH7Al8CJKm8x4bwoEbawWQfXAr
AL6lt2L+c968brWXfYxeVJRhbQXatRg/Ku2fRzkvnrNoPGlixZHi83hAsLiP
Q4XJORAeSPTuUufUAMXUVm7WYZ8tomfZGv6W2hu4EJncG70s04fVrfWmWcPf
EwSc9xRFSMr6Q1+4Koou6sqkyQu8FBf0JuzLVApzUOhaQn/Fm0qa+KJY+vFz
oSMnmuYD+hGl+XCNpfEEoDSzWCbUMSzuh5uORQUb+1hsOpbzOpZmakR+kOlZ
IVmZvYoNra/AwNUzpbeXHyzUECkQ+GU96oGAqQVkXRM5ujWLaaiA7t4XKjhS
WeC8kI4witghldhJqNC4e1rZqxXd7HmZooT1ENxo2l54x/M2ndvmUavK1UhH
NjqtqT0G7exYYvVMUyjbWigYiBuKpnJIvbVAuNXOjpovthwTZD1KMQ5NP9Tq
husZ7NJailMlFJGzTNAXt+GCHhYFS26SpJO0cSp0p9VoLiCssVBLQikpY9xJ
EP+q2CdtyzZVVAE1btvejjuiT1jytypE4lQAISb5oeymZ1xOWoZB+VbBfOLy
sL8j9JzrfEl8mAGMZcZrov5S1PLWqVlV0zFO2dlN7zBrf4JEDroaUlCQO1rq
urEcbifAzalJ3kKURUK9Qbq5lnOO1LKoeT38Sq7nNRe1qy3g0hJxkzs+8lvq
i8yj9npMY0ptDAxnzcIvVPOQNflXBb1TadbOoyNik1SpNTvBC2t8HPep3meH
HTJWWW+LaZxKX/ObuRkScm2kbN98z4U5vFJyJkXZsB1udMU2pvn33GYXPq5i
6bvpaVtTGpP77fkGl6b9G4qVWiyTtNCialX2SSmPyIBxgyE63pcDspdIrRIF
n9aBijQLHdYlE/HaoYF0HdhoI6GtEIFEDcz6Fwi9i80+V7noLkQsacH2haf+
KlpR7eUVx/p2zYb5UMTkiKQKGfGys+hwYNtKX9BoT+PoMZAmUwvZn4TSCaT/
wZPALtvLFNvRfKrhHiMaEYIiHUC1RXxJrMGnT2JKilEOig+nx1a21l0cl1bJ
0k3dU/DMw74qLlrDhNQ+IZ4WpqPdZeq4jKr7+Yhxkn8mrj6z5pIk+hZW3gFf
SW5ydV1w/9neYkTq7KzSii8yYI7rPKKRvrA50bUNYVvbIqLW/PkpqpVSZDqF
j7j+bArf0j0W8wIokJrCDNgVP0EvKOGUt70pThnR7DuH0gqirG//JBIwgyQw
gDPxVZsO0Ek8ruDcJKxwktTKUyefNrKMBtQk+1V9cSGGp75p4qwhhEuDNlII
SZh1VCoqFBOAuC6ukGGEmpZf8FpXG1WraMcz/SVJTWpUvNsNNnirJBea+dl0
+ShQy1ZJRSi9ZuXCUS2VzbBV55MFYy9uTwjwAkcSVoArm6+SaLHc2MJhzz3r
6VHw6rsRoacMtsSUoVtAt29rsO458VzUJsPXqdfa44gZKJBKywXjTwcOAYNw
l6MKrK9zdEds20TjEvtFqIALWutJQx9atV3F/gofbc5HyrRT4oYNFHWjdUuF
P0rZbTkul2enL04CccitMGKQ8cKhs/QsV8L3uRYyBuUkMAkfBuWbekWBXlqb
/4D3pEdvTfyq3iWxWz8L+LSqkYugdn/Q+KB5N5uVRfj3+koaTiqfPfrpkjRa
IfOmuox1IBeaQcIMX0YE82hxC6zizWbdTuLKjlbl1WrFTjK9dRPiacVGXRcq
wEflc6M2VpWvMH8KpVmRnagizJpaVJwVJG1XIDonLI0oLKLmRMwghlFjn860
Jn9FFBCFB4RG/l3X5ZKp2tBLrOSPOHjg7OwxCgKBVrw882Vw1Dp1+PJwqFGW
eZWzAhD1IYliAIDk/KKUwGXuKtWUOXpQqxLd+5YOOmd4OCj89+yZW0k+sRRZ
PmNu8/7a2rzLCqZst7De76qQ3Bt7IRoa+nUrsp/vGn/u20ypZ9iZUcQPbvGq
Ok6iehIQTjTqQh0AqlPFGVePZp+CKh5//eTzh3uf8nhRJViJr+Ns0J1cnLDi
JkNzEBGb89UF7vQlN0mDXLxGU5ZyiUSxsznr0mXna2kdm3NVli11b1YuGLWb
Yt+5X2TKKFadwXZoU42GhWdn/F8/gwaL92P974r9T58ZvEnrCj3uZU76fap/
bAtXz/D9L1mKlOlY008fhbEmavv9XO52OhY9ODJWhJCsbGffcBFpRUfGnSn6
HfeRMXp4gIp68dSVP8fr2jpcamuGmGcZZWcQQ3Enarpx1Mx+JWpi7W4ENcUk
sY7I0BbUywaohyEZ1k/DGHec791I9yHYtuVRoIg2e/sley3SudSA1pJPynr7
axkimtKQX7LvWU1l3kmi6s/XKFiBL9khc+2brI+imKMlMV8B+Q36meWWcWs5
/+lUw3tarqEafAnXJGEURafugiv5VXzHiggXHGnHlirR+Ms1NLjYbKkoibRL
N9+JeqBPsi90yK/o1+j1r3bnZoywAc9LS/zVaiPSO2kk8j7bMsWu5pxr4/mq
iMcn2byDkcNamfXD9rcNOly33NhIydM+jqW0hC4kUsnFTc5/6DWG983Ofadz
+qS4/ZFvM3qd7yHoxhqf/3C/kV7ne/zf33Ofc463YY/ZPLxJL84nKpgltZFz
f7QWm8UGUuZu9DqLnPCt6Enqw/fvLOhbsAVuWMh34sT9UFrKg0pINNsa8bGz
7KmPPNaJLFKmXSMSOzIBcjMcrWilVy1YSdiXJeb4DqcO0ZMECAGF2XGCV8JX
lUYPa+59i/Gm3AJi401845ZbrrYpnXEgFRJFfiPuof0oZRPFARYRk3xcn4U/
tuZuNiNpm710qy3ZV5rfNTBZA5UnVw8nOZazu/XFOyjfttzHkSy0wVI5AZIX
wDmQzV70oqUpZTvN3m7/xTtmvDNr79cBh8+zIsSDSLn9xQ/nEgFmY8DZQr4Y
OndB9bcfRwLjX/FiCuNfM+PYHj/kxd8O1S2oPomP9f173PLTT2dU/hgzk1Ys
cM2FlhsNvH8km/HozjbYKbmNbNuDlD/nU/5Cut8gR8oSr0qfb0VU6L5lTPVr
zTDBus85oOCMyEhLclzMGBIlTGnIokt3Qbc8RzCExBayaYuGkql98FAUIt7s
oW1yzP5vLmvJ99A6c3CRIGJLYTMxmSk08DFrCcrbCXmP4ahMIl6m5p8N+80p
79LIC8mXYIo/Agtfe0WYnDSR9JUHE1eh8wWSzRKVGOlEbX0BEewxDIkLYmAk
hFUSOIkseF8gQeuHXZHMJhazFddWZOs36rHvSHb7zDcA/4K/g/Aib5HcYlL3
CtbyDKnvLB5HJau7Gm0qyutyiQAcSKSlujzb+opLwFu9Y6vIwiWdbkoZt+w6
DsO3yAJ0d2bneSyLCHChkYqUIg/Jptb1mr1Jsq+6cv5aMTNnawDXwktNdfSR
NW5g130lwQI8ZqXFmVxXIjQgFB7kI4cQZg4e7wC8GZGpZtl/yGYsgIUz5pYX
3o28QEwaN2LyFR9rsR2GGxo/T6K3y7WToSGHyl5aRlPOnN+RLKZevl5pHWQ4
DUdz6FRuoZHk7WsxvKdJF3nnvxDgzNQYKAk9uWUx1qGdVpxgrInQy/qmUltY
LBSGfD0Xov/LrtfcdCzJ+IA32/pjDgI2d2FLE3VkbKVyvhGo9CQLznh8LwiH
2G1nCKlUVzafATNmsRSXZUd6Ad/7o1iR7SA/atcZe/qwn1/kf/6tETmuXUOa
/2yCuz8VieFa/qdvXX/APB9HvO1jF/39MX0ZpIVXIxLZEdDv6DP87jHc4S+9
eu9hqMnM/mZ8gmvRX0coFMC1I5F5DLtmtJpfCd34DRZJFZYslL7au/OND4Gq
PulS+H7gz8cu2sgrwUNa085l7SsH1+dKB3nNYX2/abZUoGGWc2Ysx2fER/fB
B+zZQY+INYfE64W5tEpqZb2cX8TUSgeM8lUDTSNKDx+0SB7GKKVQpdZ6zzjn
0O4s51801z6sykaHaAMb+UUDKuiTySVdioHIRKXJu6Q8W/heJ4ibl3PQFrGr
qpUttb7zyWghgKzHfcFqOb6BvblR94teaDTRYVFBA4tIcopDNWIowlE2eK1V
rRTg0qccRqDDBWL3V9gye+px5rLTYvnlvXMSr4p778x8gRjc7Kxumri/hg+O
jJOZ40jJmfu/bNeIQpbgAAA=

-->

</rfc>
