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


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-lcurley-moq-hang-02" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="hang">Media over QUIC - Hang</title>

    <author fullname="Luke Curley">
      <organization></organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>

    <date year="2026" month="August" day="03"/>

    <area>wit</area>
    <workgroup>moq</workgroup>
    

    <abstract>


<?line 30?>

<t>Hang is a real-time conferencing protocol built on top of moq-lite.
A room consists of multiple participants who publish media tracks.
All updates are live, such as a change in participants or media tracks.</t>



    </abstract>



  </front>

  <middle>


<?line 36?>

<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="terminology"><name>Terminology</name>
<t>Hang is built on top of moq-lite <xref target="moql"></xref> and uses much of the same terminology.
A quick recap:</t>

<t><list style="symbols">
  <t><strong>Broadcast</strong>: A collection of Tracks from a single publisher.</t>
  <t><strong>Track</strong>: A series of Groups, each of which can be delivered and decoded <em>out-of-order</em>.</t>
  <t><strong>Group</strong>: A series of Frames, each of which must be delivered and decoded <em>in-order</em>.</t>
  <t><strong>Frame</strong>: A sized payload of bytes representing a single moment in time.</t>
</list></t>

<t>Hang introduces additional terminology:</t>

<t><list style="symbols">
  <t><strong>Room</strong>: A collection of participants, publishing under a common prefix.</t>
  <t><strong>Participant</strong>: A moq-lite broadcaster that may produce any number of media tracks.</t>
  <t><strong>Catalog</strong>: A JSON document that describes each available media track, supporting live updates.</t>
  <t><strong>Container</strong>: A tiny header in front of each media payload containing the timestamp.</t>
</list></t>

</section>
<section anchor="discovery"><name>Discovery</name>
<t>The first requirement for a real-time conferencing application is to discover other participants in the same room.
Hang does this using moq-lite's ANNOUNCE capabilities.</t>

<t>A room consists of a path.
Any participants within the room <bcp14>MUST</bcp14> publish a broadcast with the room path as a prefix which <bcp14>SHOULD</bcp14> end with the <spanx style="verb">.hang</spanx> suffix.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
/room123/alice.hang
/room123/bob.hang
/room456/zoe.hang
]]></artwork></figure>

<t>A participant issues an ANNOUNCE_PLEASE message to discover any other participants in the same room.
The server (relay) will then respond with an ANNOUNCE message for any matching broadcasts, including their own.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
ANNOUNCE_PLEASE prefix=/room/
ANNOUNCE suffix=alice.hang active=true
ANNOUNCE suffix=bob.hang   active=true
]]></artwork></figure>

<t>If a participant leaves or is disconnected, their broadcast is unannounced.
Publishers and subscribers <bcp14>SHOULD</bcp14> terminate any subscriptions once a participant is unannounced.</t>

<figure><artwork><![CDATA[
ANNOUNCE suffix=alice.hang active=false
]]></artwork></figure>

</section>
<section anchor="catalog"><name>Catalog</name>
<t>The catalog describes the available media tracks for a single participant.
It's a JSON document that extends the W3C WebCodecs specification <xref target="webcodecs"/>.</t>

<t>The catalog is published as a <spanx style="verb">catalog.json</spanx> track within the broadcast so it can be updated live as the participant's media tracks change.
A participant <bcp14>MAY</bcp14> forgo publishing a catalog if it does not wish to publish any media tracks now and in the future.</t>

<t>The catalog track consists of multiple groups, one for each update.
Each group contains a single frame with UTF-8 JSON.</t>

<t>A publisher <bcp14>MUST NOT</bcp14> write multiple frames to a group until a future specification includes a delta-encoding mechanism (via JSON Patch most likely).</t>

<section anchor="root"><name>Root</name>
<t>The root of the catalog is a JSON document with the following schema:</t>

<figure><artwork><![CDATA[
type Catalog = {
  "audio": AudioSchema | undefined,
  "video": VideoSchema | undefined,
  // ... any custom fields ...
}
]]></artwork></figure>

<t>Additional fields <bcp14>MAY</bcp14> be added based on the application.
The catalog <bcp14>SHOULD</bcp14> be mostly static, delegating any dynamic content to other tracks.</t>

<t>For example, a <spanx style="verb">"chat"</spanx> section should include the name of a chat track, not individual chat messages.
This way catalog updates are rare and a client <bcp14>MAY</bcp14> choose to not subscribe.</t>

<t>This specification currently only defines audio and video tracks.</t>

</section>
<section anchor="video"><name>Video</name>
<t>A video track contains the necessary information to decode a video stream.</t>

<figure><artwork><![CDATA[
type VideoSchema = {
  "renditions": Map<TrackName, VideoDecoderConfig>,
  "display": {
    "width": number,
    "height": number,
  } | undefined,
  "rotation": number | undefined,
  "flip": boolean | undefined,
}
]]></artwork></figure>

<t>The <spanx style="verb">renditions</spanx> field contains a map of track names to video decoder configurations.
See the <eref target="https://www.w3.org/TR/webcodecs/#video-decoder-config">WebCodecs specification</eref> for specifics and registered codecs.
Any field carrying raw bytes, notably <spanx style="verb">description</spanx>, is a hex string (<xref target="binary"/>).</t>

<t>The <spanx style="verb">display</spanx> field is the size to render the video at, in pixels.
It is separate from a rendition's <spanx style="verb">displayAspectWidth</spanx>/<spanx style="verb">displayAspectHeight</spanx> because changing it does not require reinitializing the decoder.</t>

<t>In addition to the WebCodecs fields, each rendition <bcp14>MAY</bcp14> carry the fields common to audio and video (<xref target="common"/>) plus:</t>

<figure><artwork><![CDATA[
type VideoDecoderConfigExtensions = {
  "displayAspectWidth": number | undefined,
  "displayAspectHeight": number | undefined,
}
]]></artwork></figure>

<t><spanx style="verb">displayAspectWidth</spanx> and <spanx style="verb">displayAspectHeight</spanx> give the display aspect ratio of the media, stretching or shrinking the coded pixels.
A consumer that understands neither field <bcp14>MUST</bcp14> assume square pixels, a 1:1 ratio.
Both <bcp14>MUST</bcp14> be present together; a consumer that sees only one <bcp14>MUST</bcp14> ignore it.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
{
  "renditions": {
    "720p": {
      "codec": "avc1.64001f",
      "container": { "kind": "legacy" },
      "codedWidth": 1280,
      "codedHeight": 720,
      "bitrate": 6000000,
      "framerate": 30.0,
      "jitter": 33
    },
    "480p": {
      "codec": "avc1.64001e",
      "container": { "kind": "legacy" },
      "codedWidth": 848,
      "codedHeight": 480,
      "bitrate": 2000000,
      "framerate": 30.0,
      "jitter": 33
    }
  },
  "display": {
    "width": 1280,
    "height": 720
  },
  "rotation": 0,
  "flip": false,
}
]]></artwork></figure>

</section>
<section anchor="audio"><name>Audio</name>
<t>An audio track contains the necessary information to decode an audio stream.</t>

<figure><artwork><![CDATA[
type AudioSchema = {
  "renditions": Map<TrackName, AudioDecoderConfig>,
}
]]></artwork></figure>

<t>The <spanx style="verb">renditions</spanx> field contains a map of track names to audio decoder configurations.
See the <eref target="https://www.w3.org/TR/webcodecs/#audio-decoder-config">WebCodecs specification</eref> for specifics and registered codecs.
Any field carrying raw bytes, notably <spanx style="verb">description</spanx>, is a hex string (<xref target="binary"/>).</t>

<t>In addition to the WebCodecs fields, each rendition <bcp14>MAY</bcp14> carry the fields common to audio and video (<xref target="common"/>).</t>

<section anchor="audio-pcm"><name>PCM</name>

<t>Hang defines the <spanx style="verb">"pcm"</spanx> audio codec for uncompressed samples.
The <spanx style="verb">sampleRate</spanx> and <spanx style="verb">numberOfChannels</spanx> fields <bcp14>MUST</bcp14> be present and greater than zero.
The <spanx style="verb">description</spanx> field <bcp14>MUST NOT</bcp14> be present.
If <spanx style="verb">bitrate</spanx> is present, it <bcp14>MUST</bcp14> equal <spanx style="verb">sampleRate * numberOfChannels * 32</spanx>.</t>

<t>Each codec payload consists of interleaved IEEE 754 binary32 samples in little-endian byte order.
Samples are ordered by sample frame, then by ascending channel index within each frame.
The payload length <bcp14>MUST</bcp14> be a non-zero multiple of <spanx style="verb">4 * numberOfChannels</spanx>.
The frame timestamp identifies the presentation time of its first sample.
The frame duration in seconds is the payload length divided by <spanx style="verb">4 * numberOfChannels * sampleRate</spanx>.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
{
  "renditions": {
    "stereo": {
      "codec": "opus",
      "container": { "kind": "legacy" },
      "sampleRate": 48000,
      "numberOfChannels": 2,
      "bitrate": 128000,
      "jitter": 20
    },
    "mono": {
      "codec": "opus",
      "container": { "kind": "legacy" },
      "sampleRate": 48000,
      "numberOfChannels": 1,
      "bitrate": 64000,
      "jitter": 20
    }
  },
}
]]></artwork></figure>

</section>
</section>
<section anchor="binary"><name>Binary Fields</name>
<t>A decoder config field carrying raw bytes, notably <spanx style="verb">description</spanx> (an <spanx style="verb">AllowSharedBufferSource</spanx> in WebCodecs), is carried in the catalog as a hex string (<xref section="8" sectionFormat="comma" target="RFC4648"/>).
A publisher <bcp14>SHOULD</bcp14> emit lowercase hexadecimal characters and <bcp14>MUST NOT</bcp14> emit a <spanx style="verb">0x</spanx> prefix or any separators.
A consumer <bcp14>MUST</bcp14> accept either case.</t>

<t>Note that this differs from the <spanx style="verb">cmaf</spanx> container's <spanx style="verb">init</spanx> field (<xref target="container"/>), which is base64 (<xref section="4" sectionFormat="comma" target="RFC4648"/>); the two alphabets overlap, so the encoding cannot be detected and must be specified.</t>

</section>
<section anchor="common"><name>Common Rendition Fields</name>
<t>Audio and video renditions share the following fields, extending the WebCodecs decoder config:</t>

<figure><artwork><![CDATA[
type CommonExtensions = {
  "broadcast": string | undefined,
  "container": Container,
  "jitter": number | undefined,
}
]]></artwork></figure>

<section anchor="field-broadcast"><name>broadcast</name>
<t>By default a rendition's track lives in the same broadcast that served the catalog.
The <spanx style="verb">broadcast</spanx> field overrides that, naming a different broadcast that publishes the track.</t>

<t>The value is a relative path, resolved against the path of the broadcast that served the catalog.
It uses the <spanx style="verb">.</spanx> and <spanx style="verb">..</spanx> semantics of a relative URL reference (<xref section="5.2.4" sectionFormat="comma" target="RFC3986"/>), for example <spanx style="verb">../source</spanx>.
A publisher <bcp14>MUST NOT</bcp14> use an absolute path, and a consumer <bcp14>MUST</bcp14> ignore a rendition whose <spanx style="verb">broadcast</spanx> escapes above the root.</t>

<t>This lets a publisher author a catalog that points at tracks it does not republish.
For example, a transcoder produces a catalog listing its own downstream renditions alongside the untouched source rendition, referencing the latter in the source broadcast rather than copying the bytes through.</t>

<t>A consumer subscribes to such a rendition in the referenced broadcast, using the rendition's track name unchanged.</t>

</section>
<section anchor="field-container"><name>container</name>
<t>The container used to frame this rendition's media, as described in <xref target="container"/>.
If absent, it defaults to <spanx style="verb">{ "kind": "legacy" }</spanx>.</t>

</section>
<section anchor="field-jitter"><name>jitter</name>
<t>The maximum delay, in milliseconds, between a frame being ready and the publisher flushing it.
A consumer's jitter buffer <bcp14>SHOULD</bcp14> be at least this large to avoid stalling.
If absent, a consumer <bcp14>SHOULD</bcp14> assume each frame is flushed immediately.</t>

<t>For example:</t>

<t><list style="symbols">
  <t>If each frame is flushed immediately, a video track's <spanx style="verb">jitter</spanx> is <spanx style="verb">1000/framerate</spanx>.</t>
  <t>If up to 3 B-frames may be emitted in a row, it is <spanx style="verb">3 * 1000/framerate</spanx>.</t>
  <t>If frames are buffered into 2 second segments, it is <spanx style="verb">2000</spanx>.</t>
</list></t>

<t>An audio frame's duration is codec dependent.
AAC often uses 1024 samples per frame, so at 44100Hz an immediately-flushed track's <spanx style="verb">jitter</spanx> is 23.</t>

</section>
</section>
</section>
<section anchor="container"><name>Container</name>
<t>Audio and video tracks use a container to encapsulate the media payload.
A rendition declares its container via the <spanx style="verb">container</spanx> field of its catalog entry (<xref target="common"/>):</t>

<figure><artwork><![CDATA[
type Container =
  { "kind": "legacy" } |
  { "kind": "cmaf", "init": string } |
  { "kind": "loc" }
]]></artwork></figure>

<t>The <spanx style="verb">kind</spanx> field selects the framing; a consumer <bcp14>MUST</bcp14> ignore a rendition whose <spanx style="verb">kind</spanx> it does not recognize.
Every container shares the same group rules:</t>

<t>Each moq-lite group <bcp14>MUST</bcp14> start with a keyframe.
If the codec does not support delta frames (e.g. audio), a group <bcp14>MAY</bcp14> consist of multiple keyframes.
Otherwise, a group <bcp14>MUST</bcp14> consist of a single keyframe followed by zero or more delta frames.</t>

<section anchor="legacy"><name>legacy</name>
<t>The default, used when the <spanx style="verb">container</spanx> field is absent.</t>

<t>Each frame starts with a timestamp, a QUIC variable-length integer (62-bit max) encoded in microseconds.
The remainder of the payload is codec specific; see the WebCodecs specification for specifics.</t>

<t>For example, h.264 with no <spanx style="verb">description</spanx> field would be annex.b encoded, while h.264 with a <spanx style="verb">description</spanx> field would be AVCC encoded.</t>

</section>
<section anchor="cmaf"><name>cmaf</name>
<t>Each frame is a complete fragmented MP4 fragment (<spanx style="verb">moof</spanx>+<spanx style="verb">mdat</spanx>), carrying its own timestamps.</t>

<t>The <spanx style="verb">init</spanx> field is the initialization segment (<spanx style="verb">ftyp</spanx>+<spanx style="verb">moov</spanx>) for the track, base64-encoded (<xref section="4" sectionFormat="comma" target="RFC4648"/>).
A consumer <bcp14>MUST</bcp14> feed <spanx style="verb">init</spanx> to the decoder before the first frame.</t>

</section>
<section anchor="loc"><name>loc</name>
<t>Each frame is a Low Overhead Container frame <xref target="I-D.ietf-moq-loc"/>: a property block, carrying the timestamp among other properties, followed by the codec payload.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>
<t>TODO Security</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

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

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">




<reference anchor="moql">
   <front>
      <title>Media over QUIC - Lite</title>
      <author fullname="Luke Curley" initials="L." surname="Curley">
         </author>
      <date day="30" month="June" year="2026"/>
      <abstract>
	 <t>   moq-lite is designed to fanout live content 1-&gt;N across the internet.
   It leverages QUIC to prioritize important content, avoiding head-of-
   line blocking while respecting encoding dependencies.  While
   primarily designed for media, the transport is payload agnostic and
   can be proxied by relays/CDNs without knowledge of codecs,
   containers, or encryption keys.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-lite-05"/>
   
</reference>

<reference anchor="webcodecs" target="https://www.w3.org/TR/webcodecs/">
  <front>
    <title>WebCodecs</title>
    <author >
      <organization>W3C</organization>
    </author>
    <date />
  </front>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>
<reference anchor="RFC4648">
  <front>
    <title>The Base16, Base32, and Base64 Data Encodings</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <date month="October" year="2006"/>
    <abstract>
      <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4648"/>
  <seriesInfo name="DOI" value="10.17487/RFC4648"/>
</reference>
<reference anchor="RFC3986">
  <front>
    <title>Uniform Resource Identifier (URI): Generic Syntax</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <date month="January" year="2005"/>
    <abstract>
      <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="66"/>
  <seriesInfo name="RFC" value="3986"/>
  <seriesInfo name="DOI" value="10.17487/RFC3986"/>
</reference>

<reference anchor="I-D.ietf-moq-loc">
   <front>
      <title>Low Overhead Media Container</title>
      <author fullname="Mo Zanaty" initials="M." surname="Zanaty">
         <organization>Cisco</organization>
      </author>
      <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
         <organization>Cisco</organization>
      </author>
      <author fullname="Peter Thatcher" initials="P." surname="Thatcher">
         <organization>Microsoft</organization>
      </author>
      <date day="20" month="July" year="2026"/>
      <abstract>
	 <t>   This specification describes a Low Overhead Media Container (LOC)
   format for encoded and encrypted audio and video media data to be
   used primarily for interactive Media over QUIC Transport (MOQT).  It
   may be used in the MOQT Streaming Format (MSF) specification, which
   defines a catalog format for publishers to declare and describe their
   LOC tracks and for subscribers to consume them.  Examples are also
   provided for building media applications using LOC and MOQT.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-moq-loc-04"/>
   
</reference>



    </references>




<?line 358?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA81a63bbOJL+z6fAKj8myUjytdMed6dnHcfZ9p7EzsbO9JnT
p88KIiEJY4pg82JF8bifZZ5ln2y/qgJBUpb7Nmcv+RGLJFAo1OWrCzAajaLK
Vqk5VoN3JrFauVtTqP/4eH6qRupbnc0HkZ5OC3OLAQt+jHVl5q5YHyubzVwU
JS7O9BIEkkLPqlEa10Vq1qOl+3FEE0a7+1FZT5e2LK3LqnWOkedn12+UeqJ0
WjrQtVlicoP/smowVAOwUbnC6pQezk9e4Y8r8OvD9ZtBlNXLqSmOowRcHEfg
6iDShdHHamWraOWKm3nh6vxYYfko0nW1cBisRpHCv1mdpsLq2/rGqFNmlL+Y
pbbpsbqxn0wKwsm/zunFOHbLKMpcsdSVvcVyishi3Pno9bi7z9RWBh9XZhq7
xMTlMRNt5PqdmZ7y64G81sXcVMdqUVV5ebyzs1qtxquDsSvmO9cfdgKNHR4c
dsD/RhDE/Fh9d3DKL1gGagYpmigiZQRGo9FopPS0rAodV1FEelS2VFpBVOmo
skujYpfNTGGy2OJbXrjKxS5V09qmlXKZqlyu3Ew1uxtHJ6pwbknTSltWJX+s
08rmqVG5Liob21xn+LBaOJXX09SWC7VkkyIubkqQSFNV58Q1WCmMSsHrUJV1
vFCamIvJXgzMqk8Qyu/T4d0tbZKk2PcTdeqyW5gOrAtEskS9NjObWX6OrhdG
3Zi1gmUkJUz849U1WRX9VReX/PvDGaz9w9lr+n317cnbt+FH5EdcfXv58e3r
9lc78/Ty3buzi9cyGW9V71U0eHfyV3whpgaX76/PLy9O3g5of9UC2oDj1Esw
zrKonJrS1itT5IWBCUIkUWLKuLBTPGDOq9P3//WPvUN1d/cvH96c7u/t/en+
3j8c7X15iIfVwmSymsvStX+sFrBxnedGF0RFQwexzm0FqxmS2MuFW2VqAVOA
YJ9/T5L54Vh9PY3zvcNv/AvacO9lI7PeS5bZwzcPJosQt7zaskyQZu/9hqT7
/J78tffcyL3z8us/pzYzarR39OdvoohM6NoUS5u51M3XwVkecwX1PYHADyzn
uoQpL8mAMQCSViXgRVUtNfKbH2sb38DzIHbyTPX8+avC6STWZfX8+bE6gU+l
qYnJYInMNVu5mhXwNq1KuCd5mDiUKcZMgMfI5NIU1rA7/hshH5RqtPCzWlj8
iHVGlpUY8raC7Ap8A2AAMol67upq5GYjeIcpngttJrNJ+02BjT2gvazL6meI
26xHmGl4wvYzBuR6nUIQRG+6JlAoDGy/JF+GCsLel469hNwGwDVu4CyrCpfU
MWFJkrC767Qrei/rD0CtbWLuQsywkS+tWyMQFYRGbrnEUHA0s59kB+/bOUIy
2MS00SimVgtdqaVeE6oSgxDKWkncYjvqYRmRPdXwRjcXkv9+dXnRQgPTamCg
FPHrW8QmPSXJtKQIR/PcFSw60kaDtH4JhF4Noy9kEYxaw+c17RRyha1hLfDG
9IVqo5xYZhJZMnBSQVnpZT5mx3lty5gyhjUj7cwWMIjCwOILw/wjJj0edYBK
qUU6QRqBwwECE09OOaxV9MMAw6b3MApFY7GDxEEujKc12UtQyR9KdXJxcfnx
4vSMAE9PLd5akse2UEb7rRbwVsilH80saMvKPInhsAlvutU7D2yHETUJamI/
3mE8ziHXacdPxhT2JtDfjA0tegOZmU8QcUqR/Keffop2iObe/sGOhrwMj2/f
Td208+bwixc7n50fQ3Ox286GIOeyJpfJgnT+8/3bs5OrM6i9LPXc9NRAlvur
VEHaB1rQnKcFcqj1M2wQoQbDMqi/zF2z5c7KYUm2EiyF9CVmHwxihWvaLE7r
xNufhWmssq1C2tyPCP4lS2UnfPViftlKUiFFgr+8rIraPBjWCJdSsc4wFuy5
mE0r29ToW8P5CkV3kmGWAXBMMvSst9ZC5prpLHN1FptkHL1v8F1SGCTM4vJ4
9jYjyAaPZkn5AblkPS4jlNnQc3+BnogeF4Ikk7w9JFaCS6zcWH53sIgsYCsU
ld7rm9DVcjWOzqs/kFNsATnzqYJbCFkkuCpkzarMTWxnDVDc3YUU+f4e++oy
h003gTIR75v4T+O/lS6bCH9dn241UjplqyZaCnYmAqRamOrsA3vo7VcS1/GG
qyETIUnMXTe66JbZGS3I8JU5wg8AStWmzuwP3UUyt2Lb8JzP6qrmnK0rANnf
1hx97rMDl4m/MdTLPsfRGT3wiAbvy1aBM4rb4rwfr9+Mjlh7DKMhK1FNlqhW
BYXDsCrPZWjXnn6N6J7iSfjfUK74OuET5RSVHiFSOPb9pSEh23Kpnt5ab0Dv
CS4A+NBeam9Mun4Grp48UQj5FYsFrl81mVnHRjbtL0DxDBmCW9FyZbxATeiR
hYrWxhnUS3WH4mugAUlugFhKf694tPo75w4oPuDxNObWJobG/IX+bh+zs6PG
4zErO0YyhcgxsyaFG+BtdO8BvE1v/EeyLFgp8h7Y6FSXJuE8lRyyDanjnmV4
FJkalheqAwRxWOqQ5GzmWjIucJGsUSHbmM2AfdP5ABCKrw7yDsnDBlBMNUD8
8rkVCoo6TRpVMldUdEuUpbFNwkJWj9LfQkw19saffEQoiXloaoUsqtlBt3Is
6D9yBlBMrfHOFi+cKzmAEemAoewjdhNHUL4jDyFJcLEkOgF10ieTZu2124Zd
sR5h9p0vrbvwPk1M/BdrFapxrh98SgxuZSrqcqOXlEEF8+raiDcxsCeKL2FD
73T+NWf9F5DlUIa/ZqoFcruZnX/DJoeokyP6YsIdtwgGK5tUCzxK/jmUlwhG
80XVe3v/wHoLVzH/YdiDEbPU5vg6dQ6RL+t/9rZLJjhpNzIRC+6CzFJzdSXS
zBq0EDmJ2ArOGu28LpgfKOPKiF19/0iQ+OHpLzVXnvACI7/ASBZ4xsDYUJJI
XJi5pazeENM0VXJEvw1dFGvynEKvpIRhq0ZAXKuJREqO0JOhwM7CfCLd04yn
d3dThPNifX//zIP4xCuvEZIVo6JaiURCUuTqwnjp6GrIvRJqWpUUWmlGaRCC
KEvw9WOQPWJWs8AJbbH6jixjstN/+S1bxgQ4EWsUtxLZiN9uqPIJPv5ynwVZ
xOemPPACxY7Os1CXEfcc1oO2BMd8ORlYFCcmmQoaC9j5OoxCyIZvQobyETJU
eVqXx5sO1fOQM8owSk6YvIc9lMfjxr5FTI8M9qa/TdrM/HaJzynVYBHKV6Qd
9Fmx0TdBjBOCIeOHz5TJYBewqJtGA1J7N0ZxwskAwpwvS7m4BfRTppUZy8gu
1sYRXJc0VpU/1gSwQoRAfu94TxgZR68QDmQwYokv16GcuSFaX3Hd3F2wNJQR
ZwyzRubZeeZA3VZb0/iH0OeR7Mv93Tw84ZndES8G+jbeG7843N3dmw2G7Vdf
8NIUNYB4EhpLsS5eD9T9sEsmaXS/t3+02/8SNI3lw5eprcjH8PbFLv8LXzjf
8d8Odsfth7/ZqmJmDg74lWdgcHj0i7sy/+yujg6PHtnU4dG2Te3/7k1FfmOP
x6FWwm0UgmjDxE7U2e0GGS5Mgm9RNObMC2DsYeH3hONmbojHAT26ad2vCMc8
fDMc/5MhUFj7HwyBvMD/nxD4vxwwOKV7ot6fvlN3XhR5vLz33cUmHeQGzQAf
kOAKNRYBSwmVtVsSAlL+XTKGlZJ0T+TpA1zGQ77EicvZKeJpBlCdhFR+A0lp
9BzW6BuJmfpsCuepdsXZRW2qu1oSY2pMTLw3T7gmlg9DCuI8AfEbCXeHS/Vc
bXKIVwf7E0iJa0PZdacnGApMPrLgzkeizs/OztSXXxwq0evBfiMWylNSgEVq
RqQ7KrJhKoq7w7BlP4hiDr+iqmbt50oJOZRO0pTCYkwkoKNYOKUaAkbli3o2
EJ4iQmtYTk027wQuDSPNRiTbtlbFZiaHWyQxEUpSBof+p7J0Xgkv8Vbihewx
xkrBY6vSN0VlM11KiXdmkg1qJ0ch2Tathh7TXCKJTLYyiFcdg/ttUZUd222N
QC6vy98RelpWJMB0Askm4xRrtsQfihG7W6IMh4k2dMKP/w8Z39uWDRz+LN8S
5HxYAPa8Yi9RbwQJ7p54NETS1kf93wq16ikcbHJCvYyrBZwqeVXPZqa4cnUR
EyJkLbA+Y1gmytaE1lJTceuHgE2njYcvkE+oK1/uHzGWdntBTZN7CbgBC6aI
NSoJ0NFY0S6l1KeD6abbGUCMp2g12f00afrmvjPsyxpX9HNaSVrj2OSV8tks
LQYXuHCVkQxUzlotScCfqjGox0s9m6hgHFQeUTXTACuHCv8NOxz6Bj6dC2KB
F4fbhXGIoV/JOckKgSfNF3pqCCdvgZE6H1KXkb6GtlZMLVp/hlZxr5gl0hys
+UDMDdwndNLNke1DiH/BdHxYi042Il7r8igT+Jy51+YKYZWbr00J0Ybdvh32
2mG84MOSKjRUYffebDYrqa5DhnMp/hI85mfKKgrabdf27glvYRTe3EevuJmj
geob5a/kV9TS7Z9gtNR8xVJQLOs4gg+/YVxjI6TVwiYcAKgYp84Zt3jF2iic
b9BunERgnhnyxf+tTmvT3NFI+RoHHyIN6fTEpcSRnlO+WPkIUYUz51/B/3kl
R9Vy3uRzkvGYmnZLjSgW+0OwsPTHD2/xIEd1prH1gz8dvWht/Yvx/viQXWPW
hhuiulMK0Iy3d4iprUCZ9xTbqqtml76Z13NsXyh2tEiXS8q+KoB7OqfkYep8
AU1d36bnl5L36Q4bcqGm04YXvThL51pNb7LcaHf46ePN3icGZ6V4SB4OowNl
TKmkdVLSoRUIrjKpNLpuiaHZvLS+U1pnlatjOr4QIbYjh0EfjZtCVZWc37Ip
y/jWGACXiyaJjF2+bqbJUXu1KFw9X3AbP0g9tEy5AJGLOR3hN+egjV0k7WpD
f/oq3zd9jvu/SJf5mCTxmXeAgeDELeBK6zoMqCnDBkc+BSPFdhfxXRFdqt6F
mR6Cc1YMm2vyYA8RvNHJtrRg4tkUTAo8yqMwuNSf7LJeUgtdr7kXt7QptC7J
3BAAXq0MslbtGZ8ajt5GJ2u2d3bkYJmztJYjImqMtErB/jwLU47inU6+5iPH
0oe4lO6VcdVz62xC/X3wks17G+94mCfjOz5t2kwYxKyQEJcs2sqk6wdZ5Uid
z3552jD0vNkSKMrKbrgwmewhX9oJ7YXJWKjWOW3jQL0a+eMjukyB/VJ6UIlu
YZZuxYokMgfIgLeT8gQo8on4eDqo7/ucG3/mdAhUBmLU/SDlh84C0wDnbcJe
+nooXFuEwk5OAaGIhgK0e7v7h6H4yUm7UsWU1LZVh4fg9tvPBIMdWY0a+W0T
1f7B2N91C07TcZfNsO9RjKG240fYN/xW52VNtxzbjmJTcPAtv+Du2CFsioJl
VXaI0PGbZFDNqxAPpeBp8A9yQXbbrbn7CURD8CVC/zYPVH/vf6CMje7ZUZrW
ZhcPhqUuxuRO74U+NCyWhq4ASSAklYDCV78h7gipfnCI3Tyzn+kQle7BdATF
CVfZ5hly/lnUMIljX1aH+0PyjVeH4xb+TFLT3UVfzJ7PQns3bpf3l37ktLSx
9qdmPB+L8T4bhoNX7pVI4d47GG6WQGZ9SRFjBQDrzCKWOtPCqXAzzWeTUp5y
QU33NUl+XZ4kfxXVslY8/g4F2+mq4iNGRSnRVPoaIjNZlaVUNmIKVTkxzpeX
b3Vh6WLCyNfQ1KaY0+2UF/sjFGyE3c8kDRdAWdq4cB65Jd8r6FIwH7n4PKup
yoP7N22yr6jLvZE59w8be021zTPUxXgf9QTvJHNbuzwrPlElxEf1+Wk8bRjn
qgS66FDQP0/g5C+np81s0Ql5VVewnIJSYwupE/sIwyOE9O79YXhUTydL52aT
P06Wia4msLJQnDbZTlBJ2Rxvdcsr3+gI50ciJo/FoD4DRhB1524n0pMMCfPQ
V2CjRnuPVmIPS8WZwXjPiO8xNiXO1MxcUx9xx8b7Hdutix+I6K1bqUt4PN2i
64CZjABHdEfcmmomF8RdfH9/zLfBHKJBhXCGVzcdsfXu1ikNvJw3N69kiqVy
v+trLRoE9KYIAQHUhcUKp+S0ifEd4+j68vVl+Mgjz08uTjZHSdYcbkYsNMGM
jNSxbz3L/espVEFUTuKbzK1Sk0gYje6OpXgzycsBN+0H95EsrsNIiPW/ARGY
gEN5MAAA

-->

</rfc>

