<?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.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-johansson-ccwg-rfc8298bis-screamv2-00" category="exp" submissionType="IETF" obsoletes="8298" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="SCReAMv2">Self-Clocked Rate Adaptation for Multimedia</title>
    <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-00"/>
    <author initials="I." surname="Johansson" fullname="Ingemar Johansson">
      <organization>Ericsson</organization>
      <address>
        <email>ingemar.s.johansson@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Westerlund" fullname="Magnus Westerlund">
      <organization>Ericsson</organization>
      <address>
        <email>magnus.westerlund@ericsson.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="04"/>
    <area>Transport</area>
    <workgroup>CCWG</workgroup>
    <abstract>
      <?line 109?>

<t>This memo describes a rate adaptation algorithm for conversational media services such as interactive video. The solution conforms to the packet conservation principle and is a hybrid loss- and delay based congestion control/rate management algorithm that also supports ECN and L4S. The algorithm is evaluated over both simulated Internet bottleneck scenarios as well as in a LongTerm Evolution (LTE) and 5G system simulator and is shown to achieve both low latency and high video throughput in these scenarios. This specification obsoletes RFC 8298. The algorithm supports handling of multiple media streams, typical use cases are streaming for remote control, AR and 3D VR googles.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-johansson-ccwg-rfc8298bis-screamv2/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Congestion Control Working Group (ccwg) Working Group mailing list (<eref target="mailto:ccwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ccwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ccwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/gloinul/draft-johansson-ccwg-scream-bis"/>.</t>
    </note>
  </front>
  <middle>
    <?line 113?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Congestion in the Internet occurs when the transmitted bitrate is higher than the available capacity over a given transmission path. Applications that are deployed in the Internet have to employ congestion control to achieve robust performance and to avoid congestion collapse in the Internet.</t>
      <t>Interactive real-time communication imposes a lot of requirements on the transport; therefore, a robust, efficient rate adaptation for all access types is an important part of interactive real-time communications, as the transmission channel bandwidth can vary over time.</t>
      <t>Wireless access such as LTE and 5G, which is an integral part of the current Internet, increases the importance of rate adaptation as the channel bandwidth of a default LTE bearer <xref target="QoS-3GPP"/> can change considerably in a very short time frame. Thus, a rate adaptation solution for interactive real-time media, such as WebRTC <xref target="RFC7478"/>, should be both quick and be able to operate over a large range in channel capacity.</t>
      <t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2 (SCReAMv2), an update to SCReAM congestion control for RTP streams <xref target="RFC3550"/>. While SCReAM was originally devised for WebRTC, SCReAM as well as SCReAMv2 can also be used for other applications where congestion control of RTP streams is necessary. SCReAM is based on the self-clocking principle of TCP and uses techniques similar to what is used in the rate adaptation algorithm based on Low Extra Delay Background Transport (LEDBAT) <xref target="RFC6817"/>.</t>
      <t>SCReAMv2 is not entirely self-clocked as it augments self-clocking with pacing and a minimum send rate. Further, SCReAMv2 can take advantage of Explicit Congestion Notification (ECN) and Low Latency Low Loss and Scalable throughput (L4S) in cases where ECN or L4S is supported by the network and the hosts. However, ECN or L4S is not required for the basic congestion control functionality in SCReAMv2.</t>
      <t>This specification replaces the previous experimental version <xref target="RFC8298"/> of SCReAM with SCReAMv2. There are many and fairly significant changes to the original SCReAM algorithm.</t>
      <t>The algorithm in this memo differs greatly against the previous version of SCReAM. The main differences are:</t>
      <ul spacing="normal">
        <li>
          <t>L4S support added. The L4S algoritm has many similarities with the DCTCP and Prague congestion control but has a few extra modifications to make it work well with peridic sources such as video.</t>
        </li>
        <li>
          <t>The delay based congestion control is changed to implement a pseudo-L4S approach, this simplifies the delay based congestion control.</t>
        </li>
        <li>
          <t>The fast increase mode is removed. The congestion window additive increase is replaced with an adaptive multiplicative increase to enhance convergence speed.</t>
        </li>
        <li>
          <t>The algorithm is more rate based than self-clocked. The calculated congestion window is used mainly to calculate proper media bitrates. Bytes in flight is however allowed to exceeed the congestion window.</t>
        </li>
        <li>
          <t>The media bitrate calculation is dramatically changed and simplified.</t>
        </li>
        <li>
          <t>Additional compensation is added to make SCReAMv2 handle cases such as large changing frame sizes.</t>
        </li>
      </ul>
      <section anchor="lte-5g">
        <name>Wireless (LTE and 5G) Access Properties</name>
        <t><xref target="RFC8869"/> describes the complications that can be observed in wireless environments. Wireless access such as LTE and 5G typically cannot guarantee a given bandwidth; this is true especially for default bearers. The network throughput can vary considerably, for instance, in cases where the wireless terminal is moving around. Even though 5G can support bitrates well above 100 Mbps, there are cases when the available bitrate can be much lower; examples are situations with high network load and poor coverage. An additional complication is that the network throughput can drop for short time intervals (e.g., at handover); these short glitches are initially very difficult to distinguish from more permanent reductions in throughput.</t>
        <t>Unlike wireline bottlenecks with large statistical multiplexing, it is not possible to try to maintain a given bitrate when congestion is detected with the hope that other flows will yield. This is because there are generally few other flows competing for the same bottleneck. Each user gets its own variable throughput bottleneck, where the throughput depends on factors like channel quality, network load, and historical throughput. The bottom line is, if the throughput drops, the sender has no other option than to reduce the bitrate. Once the radio scheduler has reduced the resource allocation for a bearer, a flow in that bearer aims to reduce the sending rate quite quickly (within one RTT) in order to avoid excessive queuing delay or packet loss.</t>
      </section>
      <section anchor="why-selfclock">
        <name>Why is it a self-clocked algorithm?</name>
        <t>Self-clocked congestion control algorithms provide a benefit over their rate-based counterparts in that the former consists of two adaptation mechanisms:</t>
        <ul spacing="normal">
          <li>
            <t>A congestion window computation that evolves over a longer timescale (several RTTs) especially when the congestion window evolution is dictated by estimated delay (to minimize vulnerability to, e.g., short-term delay variations).</t>
          </li>
          <li>
            <t>A fine-grained congestion control given by the self-clocking; it operates on a shorter time scale (1 RTT). The benefits of self-clocking are also elaborated upon in <xref target="TFWC"/>. The self-clocking however acts more like an emergency break as bytes in flight can exceed the congesion window only to a certain degree. The rationale is to be able to transmit large video frames and avoid that they are unnecessarily queued up on the sender side, but still prevent a bootleneck queue</t>
          </li>
        </ul>
        <t>A rate-based congestion control algorithm typically adjusts the rate based on delay and loss. The congestion detection needs to be done with a certain time lag to avoid overreaction to spurious congestion events such as delay spikes. Despite the fact that there are two or more congestion indications, the outcome is that there is still only one mechanism to adjust the sending rate. This makes it difficult to reach the goals of high throughput and prompt reaction to congestion.</t>
      </section>
      <section anchor="ledbat-tfwc">
        <name>Comparison with LEDBAT and TFWC in TCP</name>
        <t>The core SCReAM algorithm, which is still similar in SCReAMv2, has similarities to the concepts of self-clocking used in TCP-friendly window-based congestion control <xref target="TFWC"/> and follows the packet conservation principle. The packet conservation principle is described as a key factor behind the protection of networks from congestion <xref target="Packet-conservation"/>.</t>
        <t>The congestion window is determined in a way similar to LEDBAT <xref target="RFC6817"/>. LEDBAT is a congestion control algorithm that uses send and receive timestamps to estimate the queuing delay (from now on denoted "qdelay") along the transmission path. This information is used to adjust the congestion window. The general problem described in the paper is that the base delay is offset by LEDBAT's own queue buildup. The big difference with using LEDBAT in the SCReAM context lies in the facts that the source is rate limited and that the RTP queue must be kept short (preferably empty). In addition, the output from a video encoder is rarely constant bitrate; static content (talking heads, for instance) gives almost zero video bitrate. This yields two useful properties when LEDBAT is used with SCReAM; they help to avoid the issues described in <xref target="LEDBAT-delay-impact"/>:</t>
        <ol spacing="normal" type="1"><li>
            <t>There is always a certain probability that SCReAM is short of data to transmit; this means that the network queue will become empty every once in a while.</t>
          </li>
          <li>
            <t>The max video bitrate can be lower than the link capacity. If the max video bitrate is 5 Mbps and the capacity is 10 Mbps, then the network queue will become empty.</t>
          </li>
        </ol>
        <t>It is sufficient that any of the two conditions above is fulfilled to make the base delay update properly. Furthermore, <xref target="LEDBAT-delay-impact"/> describes an issue with short-lived competing flows. In SCReAM, these short-lived flows will cause the self-clocking to slow down, thereby building up the RTP queue; in turn, this results in a reduced media video bitrate. Thus, SCReAM slows the bitrate more when there are competing short-lived flows than the traditional use of LEDBAT does. The basic functionality in the use of LEDBAT in SCReAM is quite simple; however, there are a few steps in order to make the concept work with conversational media:</t>
        <ul spacing="normal">
          <li>
            <t>Addition of a media rate control function.</t>
          </li>
          <li>
            <t>Congestion window validation techniques. The congestion window is used as a basis for the target bitrate calculation. For that reason, various actions are taken to avoid that the congestion window grows too much beyond the bytes in flight. Additional contraints are applied when in congested state and when the max target bitrate is reached.</t>
          </li>
          <li>
            <t>Use of inflection points in the congestion window calculation to achieve reduced delay jitter (when L4S is not active).</t>
          </li>
          <li>
            <t>Adjustment of qdelay target for better performance when competing with other loss-based congestion-controlled flows.</t>
          </li>
        </ul>
        <t>The above-mentioned features will be described in more detail in Section  <xref target="scream-detailed-description"/>.</t>
        <t>The SCReAM/SCReAMv2 congestion control method uses techniques similar to LEDBAT <xref target="RFC6817"/> to measure the qdelay. As is the case with LEDBAT, it is not necessary to use synchronized clocks in the sender and receiver in order to compute the qdelay. However, it is necessary that they use the same clock frequency, or that the clock frequency at the receiver can be inferred reliably by the sender. Failure to meet this requirement leads to malfunction in the SCReAM/SCReAMv2 congestion control algorithm due to incorrect estimation of the network queue delay. Use of <xref target="RFC8888"/> as feedback ensures that the same time base is used in sender and receiver.</t>
      </section>
    </section>
    <section anchor="requirements">
      <name>Requirements Language</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" 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>
    </section>
    <section anchor="scream-overview">
      <name>Overview of SCReAMv2 Algorithm</name>
      <t>SCReAMv2 still consists of three main parts: network congestion control, sender transmission control, and media rate control. All of these parts reside at the sender side. Figure 1 shows the functional overview of a SCReAMv2 sender. The receiver-side algorithm is very simple in comparison, as it only generates feedback containing acknowledgements of received RTP packets and indication of ECN bits.</t>
      <section anchor="network-cc">
        <name>Network Congestion Control</name>
        <t>The network congestion control sets an upper limit on how much data can be in the network (bytes in flight); this limit is called CWND (congestion window) and is used in the sender transmission control.</t>
        <t>The sender calculates the congestion window based on the feedback from the RTP receiver. The feedback is timestamp and ECN echo for individual RTP packets.</t>
        <t>The receiver of the media echoes a list of received RTP packets and the timestamp of the RTP packet with the highest sequence number back to the sender in feedback packets. The sender keeps a list of transmitted packets, their respective sizes, and the time they were transmitted. This information is used to determine the number of bytes that can be transmitted at any given time instant. A congestion window puts an upper limit on how many bytes can be in flight, i.e., transmitted but not yet acknowledged. The congestion window is however not an absolute limit as a slack is given to efficiently transmit large video frames.</t>
        <t>The congestion window seeks to increase by at least one segment per RTT and this increase regardless congestion occurs or not, the congestion window increase is restriced or relaxed based on the current value of the congestion window and the time elapsed since last congestion event. The congestion window update is increased by one MSS (maximum known RTP packet size) per RTT with some variation based on congestion window size and time elapsed since the last congestion event. Multiplicative increase allows the congestion to increase by a fraction of cwnd when congestion has not occured for a while. The congestion window is thus an adaptive multiplicative increase that is mainly additive increase when steady state is reached but allows a faster convergence to a higher link speed.</t>
        <t>Congestion window reduction is triggered by:</t>
        <ul spacing="normal">
          <li>
            <t>Packet loss or Classic ECN marking is detected : The congestion window is reduced by a predetermined fraction.</t>
          </li>
          <li>
            <t>Estimated queue delay exceeds a given threshold : The congestion window is reduced given by how much the delay exceeds the threshold.</t>
          </li>
          <li>
            <t>L4S ECN marking detected : The congestion window is reduced in proportion to the fraction of packets that are marked (scalable congestion control).</t>
          </li>
        </ul>
      </section>
      <section anchor="sender-tc">
        <name>Sender Transmission Control</name>
        <t>The sender transmission control limits the output of data, given by the relation between the number of bytes in flight and the congestion window. The congestion window is however not a hard limit, additional slack is given to avoid that RTP packets are queued up unnecessarily on the sender side. This means that the algoritm prefers to build up a queue in the network rather than on the sender side. Additional congestion that this causes will reflect back and cause a reduction of the congestion window. Packet pacing is used to mitigate issues with ACK compression that MAY cause increased jitter and/or packet loss in the media traffic. Packet pacing limits the packet transmission rate given by the estimated link throughput. Even if the send window allows for the transmission of a number of packets, these packets are not transmitted immediately; rather, they are transmitted in intervals given by the packet size and the estimated link throughput. Packets are generally paced at a higher rate than the target bitrate, this makes it possible to transmit occasionally larger video frames in a timely manner.</t>
      </section>
      <section anchor="media-rate-control">
        <name>Media Rate Control</name>
        <t>The media rate control serves to adjust the media bitrate to ramp up quickly enough to get a fair share of the system resources when link throughput increases.</t>
        <t>The reaction to reduced throughput must be prompt in order to avoid getting too much data queued in the RTP packet queue(s) in the sender. The media rate is calculated based on the congestion window and RTT. For the case that multiple streams are enabled, the media rate among the streams is distrubuted according to relative priorities.</t>
        <t>In cases where the sender's frame queues increase rapidly, such as in the case of a Radio Access Type (RAT) handover, the SCReAMv2 sender MAY implement additional actions, such as discarding of encoded media frames or frame skipping in order to ensure that the RTP queues are drained quickly. Frame skipping results in the frame rate being temporarily reduced. Which method to use is a design choice and is outside the scope of this algorithm description.</t>
      </section>
    </section>
    <section anchor="scream-detailed-description">
      <name>Detailed Description of SCReAMv2 sender algorithm</name>
      <t>This section describes the sender-side algorithm in more detail. It is split between the network congestion control, sender transmission control, and media rate control.</t>
      <t>The sender implements media rate control and an RTP queue for each media type or source, where RTP packets containing encoded media frames are temporarily stored for transmission. Figure 1 shows the details when a single media source (or stream) is used. A transmission scheduler (not shown in the figure) is added to support multiple streams. The transmission scheduler can enforce differing priorities between the streams and act like a coupled congestion controller for multiple flows. Support for multiple streams is implemented in <xref target="SCReAM-CPP-implementation"/>.</t>
      <figure anchor="fig-sender-view">
        <name>Sender Functional View</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="560" width="336" viewBox="0 0 336 560" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,368 L 8,432" fill="none" stroke="black"/>
              <path d="M 40,336 L 40,400" fill="none" stroke="black"/>
              <path d="M 80,160 L 80,224" fill="none" stroke="black"/>
              <path d="M 88,32 L 88,64" fill="none" stroke="black"/>
              <path d="M 120,72 L 120,152" fill="none" stroke="black"/>
              <path d="M 120,232 L 120,328" fill="none" stroke="black"/>
              <path d="M 144,336 L 144,400" fill="none" stroke="black"/>
              <path d="M 160,160 L 160,224" fill="none" stroke="black"/>
              <path d="M 200,480 L 200,528" fill="none" stroke="black"/>
              <path d="M 208,336 L 208,400" fill="none" stroke="black"/>
              <path d="M 224,144 L 224,240" fill="none" stroke="black"/>
              <path d="M 232,432 L 232,472" fill="none" stroke="black"/>
              <path d="M 272,128 L 272,136" fill="none" stroke="black"/>
              <path d="M 272,248 L 272,272" fill="none" stroke="black"/>
              <path d="M 272,304 L 272,328" fill="none" stroke="black"/>
              <path d="M 272,448 L 272,472" fill="none" stroke="black"/>
              <path d="M 304,480 L 304,528" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,64" fill="none" stroke="black"/>
              <path d="M 320,144 L 320,240" fill="none" stroke="black"/>
              <path d="M 328,336 L 328,400" fill="none" stroke="black"/>
              <path d="M 88,32 L 312,32" fill="none" stroke="black"/>
              <path d="M 88,64 L 312,64" fill="none" stroke="black"/>
              <path d="M 224,144 L 320,144" fill="none" stroke="black"/>
              <path d="M 80,160 L 160,160" fill="none" stroke="black"/>
              <path d="M 80,224 L 160,224" fill="none" stroke="black"/>
              <path d="M 224,240 L 320,240" fill="none" stroke="black"/>
              <path d="M 40,336 L 144,336" fill="none" stroke="black"/>
              <path d="M 208,336 L 328,336" fill="none" stroke="black"/>
              <path d="M 8,368 L 32,368" fill="none" stroke="black"/>
              <path d="M 152,368 L 200,368" fill="none" stroke="black"/>
              <path d="M 40,400 L 144,400" fill="none" stroke="black"/>
              <path d="M 208,400 L 328,400" fill="none" stroke="black"/>
              <path d="M 8,432 L 112,432" fill="none" stroke="black"/>
              <path d="M 152,432 L 232,432" fill="none" stroke="black"/>
              <path d="M 200,480 L 304,480" fill="none" stroke="black"/>
              <path d="M 200,528 L 304,528" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="280,472 268,466.4 268,477.6" fill="black" transform="rotate(90,272,472)"/>
              <polygon class="arrowhead" points="280,328 268,322.4 268,333.6" fill="black" transform="rotate(90,272,328)"/>
              <polygon class="arrowhead" points="280,136 268,130.4 268,141.6" fill="black" transform="rotate(90,272,136)"/>
              <polygon class="arrowhead" points="208,368 196,362.4 196,373.6" fill="black" transform="rotate(0,200,368)"/>
              <polygon class="arrowhead" points="128,232 116,226.4 116,237.6" fill="black" transform="rotate(270,120,232)"/>
              <polygon class="arrowhead" points="128,72 116,66.4 116,77.6" fill="black" transform="rotate(270,120,72)"/>
              <polygon class="arrowhead" points="40,368 28,362.4 28,373.6" fill="black" transform="rotate(0,32,368)"/>
              <g class="text">
                <text x="176" y="52">Media</text>
                <text x="232" y="52">encoder</text>
                <text x="284" y="84">|(1)</text>
                <text x="272" y="100">RTP</text>
                <text x="136" y="116">(3)</text>
                <text x="272" y="116">|</text>
                <text x="112" y="180">Media</text>
                <text x="272" y="180">Queue</text>
                <text x="108" y="196">rate</text>
                <text x="120" y="212">control</text>
                <text x="240" y="212">RTP</text>
                <text x="288" y="212">packets</text>
                <text x="144" y="276">(2)</text>
                <text x="288" y="276">(4)</text>
                <text x="272" y="292">RTP</text>
                <text x="88" y="356">Network</text>
                <text x="176" y="356">(7)</text>
                <text x="268" y="356">Sender</text>
                <text x="92" y="372">congestion</text>
                <text x="268" y="372">Transmission</text>
                <text x="88" y="388">control</text>
                <text x="264" y="388">Control</text>
                <text x="284" y="420">|(5)</text>
                <text x="132" y="436">RTCP</text>
                <text x="272" y="436">RTP</text>
                <text x="48" y="452">(6)</text>
                <text x="256" y="500">UDP</text>
                <text x="252" y="516">socket</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
                    +---------------------------+
                    |        Media encoder      |
                    +---------------------------+
                        ^                  |(1)
                        |                 RTP
                        |(3)               |
                        |                  V
                        |            +-----------+
                   +---------+       |           |
                   | Media   |       |   Queue   |
                   | rate    |       |           |
                   | control |       |RTP packets|
                   +---------+       |           |
                        ^            +-----------+
                        |                  |
                        | (2)              |(4)
                        |                 RTP
                        |                  |
                        |                  v
              +------------+       +--------------+
              |  Network   |  (7)  |    Sender    |
          +-->| congestion |------>| Transmission |
          |   |  control   |       |   Control    |
          |   +------------+       +--------------+
          |                                |(5)
          +-------------RTCP----------+   RTP
              (6)                     |    |
                                      |    v
                                  +------------+
                                  |     UDP    |
                                  |   socket   |
                                  +------------+
]]></artwork>
        </artset>
      </figure>
      <t>Media frames are encoded and forwarded to the RTP queue (1) in <xref target="fig-sender-view"/>. The RTP packets are picked from the RTP queue (4), for multiple flows from each RTP queue based on some defined priority order or simply in a round-robin fashion, by the sender transmission controller.</t>
      <t>The sender transmission controller (in case of multiple flows a transmission scheduler) sends the RTP packets to the UDP socket (5). In the general case, all media SHOULD go through the sender transmission controller and is limited so that the number of bytes in flight is less than the congestion window albeit with a slack to avoid that packets are unnecessarily delayed in the RTP queue.</t>
      <t>RTCP packets are received (6) and the information about the bytes in flight and congestion window is exchanged between the network congestion control and the sender transmission control (7).</t>
      <t>The congestion window and the estimated RTT is communicated to the media rate control (2) to compute the appropriate target bitrate. The target bitrate is updated whenever the congestion window is updated. Additional parameters are also communicated to make the rate control more stable when the congestion window is very small or when L4S is not active. This is described more in detail below.</t>
      <section anchor="constants-variables">
        <name>Constants and variables</name>
        <t>Constants and state variables are listed in this section. Temporary variables are not listed; instead, they are appended with '_t' in the
   pseudocode to indicate their local scope.</t>
        <section anchor="constants">
          <name>Constants</name>
          <t>The RECOMMENDED values, within parentheses "()", for the constants  are deduced from experiments.</t>
          <ul spacing="normal">
            <li>
              <t>QDELAY_TARGET_LO (0.1): Target value for the minimum qdelay [s].</t>
            </li>
            <li>
              <t>QDELAY_TARGET_HI (0.4): Target value for the maximum qdelay [s]. This parameter provides an upper limit to how much the target qdelay (qdelay_target) can be increased in order to cope with competing loss-based flows. However, the target qdelay does not have to be initialized to this high value, as it would increase end-to-end delay and also make the rate control and congestion control loops sluggish.</t>
            </li>
            <li>
              <t>MIN_CWND (3000): Minimum congestion window [byte].</t>
            </li>
            <li>
              <t>MAX_BYTES_IN_FLIGHT_HEAD_ROOM (1.1): Headroom for the limitation of CWND.</t>
            </li>
            <li>
              <t>BETA_LOSS (0.7): CWND scale factor due to loss event.</t>
            </li>
            <li>
              <t>BETA_ECN (0.8): CWND scale factor due to ECN event.</t>
            </li>
            <li>
              <t>MSS (1000 byte): Maximum segment size = Max RTP packet size.</t>
            </li>
            <li>
              <t>TARGET_BITRATE_MIN: Minimum target bitrate in [bps] (bits per second).</t>
            </li>
            <li>
              <t>TARGET_BITRATE_MAX: Maximum target bitrate in [bps].</t>
            </li>
            <li>
              <t>RATE_PACE_MIN (50000): Minimum pacing rate in [bps].</t>
            </li>
            <li>
              <t>CWND_OVERHEAD (1.5): Indicates how much bytes in flight is allowed to exceed cwnd.</t>
            </li>
            <li>
              <t>L4S_AVG_G (1.0/16): EWMA factor for l4s_alpha</t>
            </li>
            <li>
              <t>QDELAY_AVG_G (1.0/4): EWMA factor for qdelay_avg</t>
            </li>
            <li>
              <t>POST_CONGESTION_DELAY (4.0): Determines how long (seconds) after a congestion event that the congestion window growth should be cautious.</t>
            </li>
            <li>
              <t>MUL_INCREASE_FACTOR (0.02): Determines how much (as a fraction of cwnd) that the cwnd can increase per RTT.</t>
            </li>
            <li>
              <t>LOW_CWND_SCALE_FACTOR (0.1): Scale factor applied to cwnd change when CWND is very small.</t>
            </li>
            <li>
              <t>IS_L4S (false): Congestion control operates in L4S mode.</t>
            </li>
            <li>
              <t>VIRTUAL_RTT (0.025): Virtual RTT [s]</t>
            </li>
            <li>
              <t>PACKET_PACING_HEADROOM (1.5): Extra head room for packet pacing.</t>
            </li>
            <li>
              <t>BYTES_IN_FLIGHT_HEAD_ROOM (2.0): Extra headroom for bytes in flight.</t>
            </li>
          </ul>
        </section>
        <section anchor="state-variables">
          <name>State Variables</name>
          <t>The values within parentheses "()" indicate initial values.</t>
          <ul spacing="normal">
            <li>
              <t>qdelay_target (QDELAY_TARGET_LO): qdelay target [s], a variable qdelay target is introduced to manage cases where a fixed qdelay target would otherwise starve the RMCAT flow under such circumstances (e.g., FTP competes for the bandwidth over the same bottleneck). The qdelay target is allowed to vary between QDELAY_TARGET_LO and QDELAY_TARGET_HI.</t>
            </li>
            <li>
              <t>qdelay_fraction_avg (0.0): Fractional qdelay filtered by the Exponentially Weighted Moving Average (EWMA).</t>
            </li>
            <li>
              <t>qdelay_norm_hist[100] ({0,..,0}): Vector of the last 100 normalized qdelay samples.</t>
            </li>
            <li>
              <t>cwnd (MIN_CWND): Congestion window.</t>
            </li>
            <li>
              <t>cwnd_i (1): Congestion window inflection point.</t>
            </li>
            <li>
              <t>bytes_newly_acked (0): The number of bytes that was acknowledged with the last received acknowledgement, i.e., bytes acknowledged since the last CWND update.</t>
            </li>
            <li>
              <t>max_bytes_in_flight (0): The maximum number of bytes in flight in the last round trip.</t>
            </li>
            <li>
              <t>max_bytes_in_flight_prev (0): The maximum number of bytes in flight in previous round trip.</t>
            </li>
            <li>
              <t>send_wnd (0): Upper limit to how many bytes can currently be transmitted. Updated when cwnd is updated and when RTP packet is transmitted.</t>
            </li>
            <li>
              <t>target_bitrate (0): Media target bitrate [bps].</t>
            </li>
            <li>
              <t>rate_media (0.0): Measured bitrate [bps] from the media encoder.</t>
            </li>
            <li>
              <t>s_rtt (0.0): Smoothed RTT [s], computed with a similar method to that described in <xref target="RFC6298"/>.</t>
            </li>
            <li>
              <t>rtp_size (0): Size [byte] of the last transmitted RTP packet.</t>
            </li>
            <li>
              <t>loss_event_rate (0.0): The estimated fraction of RTTs with lost packets detected.</t>
            </li>
            <li>
              <t>bytes_in_flight_ratio (0.0): Ratio between the bytes in flight and the congestion window.</t>
            </li>
            <li>
              <t>cwnd_ratio (0.0): Ratio between MSS and cwnd.</t>
            </li>
            <li>
              <t>l4s_alpha (0.0): Average fraction of marked packets per RTT.</t>
            </li>
            <li>
              <t>l4s_active (false): Indicates that L4S is enabled and packets are indeed marked.</t>
            </li>
            <li>
              <t>last_update_l4s_alpha_time (0): Last time l4s_alpha was updated [s].</t>
            </li>
            <li>
              <t>last_update_qdelay_avg_time (0): Last time qdelay_avg was updated [s].</t>
            </li>
            <li>
              <t>packets_delivered_this_rtt (0): Counter for delivered packets.</t>
            </li>
            <li>
              <t>packets_marked_this_rtt (0): Counter delivered and ECN-CE marked packets.</t>
            </li>
            <li>
              <t>last_congestion_detected_time (0): Last time congestion event occured [s].</t>
            </li>
            <li>
              <t>last_cwnd_i_update_time (0): Last time cwnd_i was updated [s].</t>
            </li>
            <li>
              <t>bytes_newly_acked (0): Number of bytes newly ACKed, reset to 0 when congestion window is updated [byte].</t>
            </li>
            <li>
              <t>bytes_newly_acked_ce (0): Number of bytes newly ACKed and CE marked, reset to 0 when congestion window is updated [byte].</t>
            </li>
            <li>
              <t>pace_bitrate (1e6): Packet pacing rate [bps].</t>
            </li>
            <li>
              <t>t_pace (1e-6): Pacing interval between packets [s].</t>
            </li>
            <li>
              <t>rel_framesize_high (1.0): High percentile of frame size, normalized by nominal frame size for the given target bitrate</t>
            </li>
            <li>
              <t>frame_period (0.02): The frame period [s].</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="network-cc-2">
        <name>Network Congestion Control</name>
        <t>This section explains the network congestion control, which performs
two main functions:</t>
        <ul spacing="normal">
          <li>
            <t>Computation of congestion window at the sender: This gives an upper limit to the number of bytes in flight.</t>
          </li>
          <li>
            <t>Calculation of send window at the sender: RTP packets are transmitted if allowed by the relation between the number of bytes in flight and the congestion window. This is controlled by the send window.</t>
          </li>
        </ul>
        <t>SCReAMv2 is a window-based and byte-oriented congestion control protocol, where the number of bytes transmitted is inferred from the size of the transmitted RTP packets. Thus, a list of transmitted RTP packets and their respective transmission times (wall-clock time) MUST be kept for further calculation.</t>
        <t>The number of bytes in flight (bytes_in_flight) is computed as the sum of the sizes of the RTP packets ranging from the RTP packet most recently transmitted, down to but not including the acknowledged packet with the highest sequence number. This can be translated to the difference between the highest transmitted byte sequence number and the highest acknowledged byte sequence number. As an example: If an RTP packet with sequence number SN is transmitted and the last acknowledgement indicates SN-5 as the highest received sequence number, then bytes_in_flight is computed as the sum of the size of RTP packets with sequence number SN-4, SN-3, SN-2, SN-1, and SN. It does not matter if, for instance, the packet with sequence number SN-3 was lost -- the size of RTP packet with sequence number SN-3 will still be considered in the computation of bytes_in_flight.</t>
        <t>bytes_in_flight_ratio is calculated as the ratio between bytes_flight and cwnd. This value should be computed at the beginning of the ACK processing. cwnd_ratio is computed as the relation between MSS and cwnd.</t>
        <t>Furthermore, a variable bytes_newly_acked is incremented with a value corresponding to how much the highest sequence number has increased since the last feedback. As an example: If the previous acknowledgement indicated the highest sequence number N and the new acknowledgement indicated N+3, then bytes_newly_acked is incremented by a value equal to the sum of the sizes of RTP packets with sequence number N+1, N+2, and N+3. Packets that are lost are also included, which means that even though, e.g., packet N+2 was lost, its size is still included in the update of bytes_newly_acked. The bytes_newly_acked_ce is, similar to bytes_newly_acked, a counter of bytes newly acked with the extra condition that they are ECN-CE marked. The bytes_newly_acked and bytes_newly_acked_ce are reset to zero after a CWND update.</t>
        <t>The feedback from the receiver is assumed to consist of the following elements.</t>
        <ul spacing="normal">
          <li>
            <t>A list of received RTP packets' sequence numbers. With an indication if packets are ECN-CE marked.</t>
          </li>
          <li>
            <t>The wall-clock timestamp corresponding to the received RTP packet with the highest sequence number.</t>
          </li>
        </ul>
        <t>It is recommended to use RFC8888 <xref target="RFC8888"/> for the feedback as it supports the feedback elements described above.</t>
        <t>When the sender receives RTCP feedback, the qdelay is calculated as outlined in <xref target="RFC6817"/>. A qdelay sample is obtained for each received acknowledgement. A number of variables are updated as illustrated by the pseudocode below; temporary variables are appended with '_t'. Division operation is always floating point unless otherwise noted. l4s_alpha is calculated based in number of packets delivered (and marked). This makes calculation of L4S alpha more accurate at very low bitrates, given that the tail RTP packet in a video frame is often smaller than MSS.</t>
        <artwork><![CDATA[
    packets_delivered_this_rtt += packets_acked
    packets_marked_this_rtt += packets_acked_ce
    if (now - last_update_l4s_alpha_time >= s_rtt)
      # l4s_alpha is calculated from packets marked istf bytes marked
      fraction_marked_t = packets_marked_this_rtt/
                          packets_delivered_this_rtt
      l4s_alpha = L4S_AVG_G*fraction_marked_t + (1.0-L4S_AVG_G)*l4S_alpha

      last_update_l4s_alpha_time = now
      packets_delivered_this_rtt = 0
      packets_marked_this_rtt = 0
    end

    if (now - last_update_qdelay_avg_time >= s_rtt)
      # qdelay_avg is updated with a slow attack, fast decay EWMA filter
      if (qdelay < qdelay_avg)
        qdelay_avg = qdelay
      else
        qdelay_avg = QDELAY_AVG_G*qdelay + (1.0-QDELAY_AVG_G)*qdelay_avg
      end
      last_update_qdelay_avg_time = now
    end
]]></artwork>
        <section anchor="reaction-delay-loss-ce">
          <name>Reaction to Delay, Packet Loss and ECN-CE</name>
          <t>Congestion is detected based on three different indicators:</t>
          <ul spacing="normal">
            <li>
              <t>Lost packets detected. The loss detection is described in Section 4.1.2.4.</t>
            </li>
            <li>
              <t>ECN-CE marked packets detected.</t>
            </li>
            <li>
              <t>Estimated queue delay exceeds a threshold.</t>
            </li>
          </ul>
          <t>A congestion event occurs if any of the above indicators are true AND it is than one smoothed RTT (s_rtt) since the last congestion event. This ensures that the congestion window is reduced at most once per smoothed RTT.</t>
          <section anchor="reaction-loss">
            <name>Lost packets</name>
            <t>The congestion window back-off due to loss events is deliberately a bit less than is the case with TCP Reno, for example. TCP is generally used to transmit whole files; the file is then like a source with an infinite bitrate until the whole file has been transmitted. SCReAMv2, on the other hand, has a source which rate is limited to a value close to the available transmit rate and often below that value; the effect is that SCReAMv2 has less opportunity to grab free capacity than a TCP-based file transfer. To compensate for this, it is RECOMMENDED to let SCReAMv2 reduce the congestion window less than what is the case with TCP when loss events occur.</t>
          </section>
          <section anchor="reaction-ecn-ce">
            <name>ECN-CE and classic ECN</name>
            <t>In classic ECN mode the cwnd is scaled by a fixed value (BETA_ECN).</t>
            <t>The congestion window back-off due to an ECN event MAY be smaller than if a loss event occurs. This is in line with the idea outlined in <xref target="RFC8511"/> to enable ECN marking thresholds lower than the corresponding packet drop thresholds.</t>
          </section>
          <section anchor="reaction-l4s-ce">
            <name>ECN-CE and L4S</name>
            <t>The cwnd is scaled down in proportion to the fraction of marked packets per RTT. The scale down proportion is given by l4s_alpha, which is an EWMA filtered version of the fraction of marked packets per RTT. This is inline with how DCTCP works <xref target="RFC8257"/>. Additional methods are applied to make the congestion window reduction reasonably stable, especially when the congestion window is only a few MSS. In addition, because SCReAMv2 can quite often be source limited, additional steps are taken to restore the congestion window to a proper value after a long period without congestion.</t>
          </section>
          <section anchor="reaction-delay">
            <name>Increased queue delay</name>
            <t>SCReAMv2 implements a delay based congestion control approach where it mimics L4S congestion marking when the averaged queue delay exceeds a target threshold. This threshold is set to qdelay_target/2 and the congestion backoff factor (l4s_alpha_v) increases linearly from 0 to 100% as qdelay_avg goes from  qdelay_target/2 to qdelay_target. The averaged qdelay (qdelay_avg) is used to avoid that the SCReAMv2 congestion control over-reacts to scheduling jitter, sudden delay spikes due to e.g. handover or link layer retransmissions. Furthermore, the delay based congestion control is inactivated when it is reasonably certain that L4S is active, i.e. L4S is enabled and congested nodes apply L4S marking of packets. The rationale is reduce negative effect of clockdrift that the delay based control can introduce whenever possible.</t>
          </section>
        </section>
        <section anchor="cwnd-update">
          <name>Congestion Window Update</name>
          <t>The congestion window update contains two parts. One that reduces the congestion window when congestion events (listed above) occur, and one part that continously increases the congestion window.</t>
          <t>The target bitrate is updated whenever the congestion window is updated.</t>
          <t>Actions when congestion detected</t>
          <artwork><![CDATA[
      if (now - last_congestion_detected_time >= s_rtt)
        if (loss detected)
          is_loss_t = true
        end
        if (packets marked)
          is_ce_t = true
        end
        if (qdelay > qdelay_target/2)
          # It is expected that l4s_alpha is below a given value,
          l4_alpha_lim_t = 2 / target_bitrate * MSS * 8 / s_rtt
          if (l4s_alpha < l4_alpha_lim_t || !l4s_active)
            # L4S does not seem to be active
            l4s_alpha_v_t = min(1.0, max(0.0,
               (qdelay_avg - qdelay_target / 2) /
               (qdelay_target / 2)));
            is_virtual_ce_t = true
          end
        end
      end

      if (is_loss_t || is_ce_t || is_virtual_ce_t)
        if (now - last_cwnd_i_update_time > 0.25)
          last_cwnd_i_update_time = now
          cwnd_i = cwnd
        end
      end


      # Scale factor for cwnd update
      cwnd_scale_factor_t =
        (LOW_CWND_SCALE_FACTOR + (MUL_INCREASE_FACTOR  * cwnd) / MSS)

      # Either loss, ECN mark or increased qdelay is detected
      if (is_loss_t)
        # Loss is detected
        cwnd = cwnd * BETA_LOSS
      end
      if (is_ce_t)
        # ECN-CE detected
        if (IS_L4S)
          # L4S mode
          backoff_t = l4s_alpha / 2
          # Increase stability for very small cwnd
          backOff_t *= min(1.0, cwnd_scale_factor_t)
          backOff_t *= max(0.8, 1.0 - cwnd_ratio * 2)

          if (now - last_congestion_detected_time > 5)
            # A long time since last congested because link throughput
            # exceeds max video bitrate.
            # There is a certain risk that CWND has increased way above
            # bytes in flight, so we reduce it here to get it better on
            # track and thus the congestion episode is shortened
            cwnd = min(cwnd, max_bytes_in_flight_prev)

            # Also, we back off a little extra if needed
            # because alpha is quite likely very low
            # This can in some cases be an over-reaction
            # but as this function should kick in relatively seldom
            # it should not be to too big concern
            backoff_t = max(backoff_t, 0.25)

            # In addition, bump up l4sAlpha to a more credible value
            # This may over react but it is better than
            # excessive queue delay
            l4sAlpha = 0.25
          end
          cwnd = (1.0 - backoff_t) * cwnd
        else
          # Classic ECN mode
          cwnd = cwnd * BETA_ECN
        end
      end
      if (is_virtual_ce_t)
        backoff_t = l4s_alpha_v_t / 2
        cwnd = (1.0 - backoff_t) * cwnd
      end
      cwnd = max(MIN_CWND, cwnd)

      if (is_loss_t || is_ce_t || is_virtual_ce_t)
        last_congestion_detected_time = now
      end
]]></artwork>
          <t>The variable max_bytes_in_flight_prev indicates the maximum bytes in flights in the previous round trip. The reason to this is that bytes in flight can spike when congestion occurs, max_bytes_in_flight_prev thus ensures better that an uncongested bytes in flight is used.</t>
          <t>The cwnd_scale_factor_t scales the congestion window decrease upon congestion as well as the increase. In a normal addititive increase setting this would be 1.0/MSS. However to increase stability especially when with L4S when cwnd is very small, the cwnd_scale_factor_t can be as small as low as LOW_CWND_SCALE_FACTOR / MSS. The result is then that the congestion window increase can be as small as LOW_CWND_SCALE_FACTOR MSS per RTT. Because the same restriction is applied to both decrease and increase of the congestion window, the net effect is zero. The cwnd_scale_factor_t is increased with larger cwnd to allow for a multiplicative increase and thus a faster convergence when link capacity increases.</t>
          <t>Congestion window increase</t>
          <artwork><![CDATA[
      # Additional factor for cwnd update
      post_congestion_scale_t = max(0.0, min(1.0,
        (now - last_congestion_detected_time) / POST_CONGESTION_DELAY))

      # Calculate bytes acked that are not CE marked
      bytes_newly_acked_minus_ce_t = bytes_newly_acked-
                                     bytes_newly_acked_ce

      increment_t = bytes_newly_acked_minus_ce_t*cwnd_ratio

      # Reduce increment for small RTTs
      tmp_t = min(1.0, s_rtt / VIRTUAL_RTT)
      increment *= tmp_t * tmp_t

      if (!is_l4s_active)
        # The increment is scaled down for more cautious
        # ramp-up around the last known congestion window
        # when congestion last occured.
        # This is only applied when L4S is inactive
        scl_t = 1.0
        scl_t = (cwnd - cwnd_i) / cwnd_i
        scl_t *= 4
        scl_t = scl_t * scl_t
        scl_t = max(0.1, min(1.0, scl_t))
        increment_t *= scl_t
      end

      # Slow down CWND increase when CWND is only a few MSS
      # This goes hand in hand with that the down scaling is also
      # slowed down then. Cwnd increase can be as slow as
      # LOW_CWND_SCALE_FACTOR*MSS per RTT
      float tmp_t = cwnd_scale_factor_t

      # Further limit multiplicative increase when congestion occured
      # recently.
      if (tmp_t > 1.0)
        tmp_t = 1.0 + ((tmp_t - 1.0) * post_congestion_scale_t);
      end
      increment *= tmp_t

      # Increase CWND only if bytes in flight is large enough
      # Quite a lot of slack is allowed here to avoid that bitrate
      # locks to low values.
      max_allowed_t = MSS + max(max_bytes_in_flight,
        max_bytes_in_flight_prev) * BYTES_IN_FLIGHT_HEAD_ROOM
      int cwnd_t = cwnd + increment_t
      if (cwnd_t <= max_allowed_t)
        cwnd = cwnd_t
      end
]]></artwork>
          <t>The variable max_bytes_in_flight indicates the max bytes in flight in the current round trip.</t>
          <t>The multiplicative increase is restricted directly after a congestion event and the restriction is gradually relaxed as the time since last congested increased. The restriction makes the congestion window growth to be no faster than additive increase when congestion continusly occurs. For L4S operation this means that the SCReAMv2 algorithm will adhere to the 2 marked packets per RTT equilibrium at steady state congestion.</t>
          <t>It is particularly important that the congestion window reflects the transmitted bitrate especially in L4S mode operation. An inflated cwnd takes extra RTTs to bring down to a correct value upon congestion and thus causes unnecessary queue buildup. At the same time the congestion window must be allowed to be large enough to avoid that the SCReAMv2 algorithm begins to limit itself, given that the target bitrate is calculated based on the cwnd. Two mechanisms are used to manage this:</t>
          <ul spacing="normal">
            <li>
              <t>Restore correct value of cwnd upon congestion. This is done if is a prolonged time since the link was congested. A typical example is that SCReAMv2 has been rate limited, i.e the target bitrate has reached the TARGET_BITRATE_MAX.</t>
            </li>
            <li>
              <t>Limit cwnd when the target_bitrate has reached TARGET_BITRATE_MAX. The cwnd is restricted based on a history of the last max_bytes_in_flight values. See <xref target="SCReAM-CPP-implementation"/> for details.</t>
            </li>
          </ul>
          <t>The two mechanisms complement one another.</t>
        </section>
        <section anchor="detect-loss">
          <name>Lost Packet Detection</name>
          <t>Lost packet detection is based on the received sequence number list. A reordering window SHOULD be applied to prevent packet reordering from triggering loss events. The reordering window is specified as a time unit, similar to the ideas behind Recent ACKnowledgement (RACK) <xref target="RFC8985"/>. The computation of the reordering window is made possible by means of a lost flag in the list of transmitted RTP packets. This flag is set if the received sequence number list indicates that the given RTP packet is missing. If later feedback indicates that a previously lost marked packet was indeed received, then the reordering window is updated to reflect the reordering delay. The reordering window is given by the difference in time between the event that the packet was marked as lost and the event that it was indicated as successfully received. Loss is detected if a given RTP packet is not acknowledged within a time window (indicated by the reordering window) after an RTP packet with a higher sequence number was acknowledged.</t>
        </section>
        <section anchor="send-window">
          <name>Send Window Calculation</name>
          <t>The basic design principle behind packet transmission in SCReAM was to allow transmission only if the number of bytes in flight is less than the congestion window. There are, however, two reasons why this strict rule will not work optimally:</t>
          <ul spacing="normal">
            <li>
              <t>Bitrate variations: Media sources such as video encoders generally produce frames whose size always vary to a larger or smaller extent. The RTP queue absorbs the natural variations in frame sizes. However, the RTP queue should be as short as possible to prevent the end-to-end delay from increasing. A strict 'send only when bytes in flight is less than the congestion window' rule can cause the RTP queue to grow simply because the send window is limited. The consequence is that the congestion window will not increase, or will increase very slowly, because the congestion window is only allowed to increase when there is a sufficient amount of data in flight. The final effect is that the media bitrate increases very slowly or not at all.</t>
            </li>
            <li>
              <t>Reverse (feedback) path congestion: Especially in transport over buffer-bloated networks, the one-way delay in the reverse direction can jump due to congestion. The effect is that the acknowledgements are delayed, and the self-clocking is temporarily halted, even though the forward path is not congested. The CWND_OVERHEAD allows for some degree of reverse path congestion as the bytes in flight is allowed to exceed cwnd.</t>
            </li>
          </ul>
          <t>In SCReAMv2, the send window is given by the relation between the adjusted congestion window and the amount of bytes in flight according to the pseudocode below. The multiplication of cwnd with CWND_OVERHEAD and rel_framesize_high has the effect that bytes in flight is 'around' the cwnd rather than limited by the cwnd when the link is congested.
The implementation allows the RTP queue to be small even when the frame sizes vary and thus increased e2e delay can be avoided.</t>
          <artwork><![CDATA[
       send_wnd = cwnd * CWND_OVERHEAD * rel_framesize_high -
         bytes_in_flight
]]></artwork>
          <t>The send window is updated whenever an RTP packet is transmitted or an RTCP feedback messaged is received.</t>
        </section>
        <section anchor="packet-pacing">
          <name>Packet Pacing</name>
          <t>Packet pacing is used in order to mitigate coalescing, i.e., when packets are transmitted in bursts, with the risks of increased jitter and potentially increased packet loss. Packet pacing is also recommended to be used with L4S and also mitigates possible issues with queue overflow due to key-frame generation in video coders. The time interval between consecutive packet transmissions is greater than or equal to t_pace, where t_pace is given by the equations below :</t>
          <artwork><![CDATA[
      pace_bitrate = max(RATE_PACE_MIN, target_bitrate) *
        PACKET_PACING_HEADROOM
      t_pace = rtp_size * 8 / pace_bitrate
]]></artwork>
          <t>rtp_size is the size of the last transmitted RTP packet, and s_rtt is the smoothed round trip time. RATE_PACE_MIN is the minimum pacing rate.</t>
        </section>
        <section anchor="stream-prioritization">
          <name>Stream Prioritization</name>
          <t>The SCReAM algorithm makes a distinction between network congestion control and media rate control. This is easily extended to many streams. RTP packets from two or more RTP queues are scheduled at the rate permitted by the network congestion control.</t>
          <t>The scheduling can be done by means of a few different scheduling regimes. For example, the method for coupled congestion control specified in <xref target="RFC8699"/> can be used. One implementation of SCReAM and SCReAMv2 <xref target="SCReAM-CPP-implementation"/> uses credit-based scheduling. In credit-based scheduling, credit is accumulated by queues as they wait for service and is spent while the queues are being serviced. For instance, if one queue is allowed to transmit 1000 bytes, then a credit of 1000 bytes is allocated to the other unscheduled queues. This principle can be extended to weighted scheduling, where the credit allocated to unscheduled queues depends on the relative weights. The latter is also implemented in <xref target="SCReAM-CPP-implementation"/> in which case the target bitrate for the streams are also scaled relative to the scheduling priority.</t>
        </section>
      </section>
      <section anchor="media-rate-control-2">
        <name>Media Rate Control</name>
        <t>The media rate control algorithm is executed whenever the congestion window is updated and updates the target bitrate. The target bitrate is essentiatlly based on the congestion window and the (smoothed) RTT according to</t>
        <artwork><![CDATA[
         target_bitrate = 8 * cwnd / s_rtt
]]></artwork>
        <t>The role of the media rate control is to strike a reasonable balance between a low amount of queuing in the RTP queue(s) and a sufficient amount of data to send in order to keep the data path busy. Because the congestion window is updated based on loss, ECN-CE and delay, so does the target rate also update.</t>
        <t>The code above however needs some modifications to work fine in a number of scenarios</t>
        <ul spacing="normal">
          <li>
            <t>L4S is inactive, i.e L4S is either not enabled or congested bottlenecks do not L4S mark packets</t>
          </li>
          <li>
            <t>Frame sizes vary</t>
          </li>
          <li>
            <t>cwnd is very small, just a few MSS or smaller</t>
          </li>
        </ul>
        <t>The complete pseudo code for adjustment of the target bitrate is shown below</t>
        <artwork><![CDATA[
        tmp_t = 1.0

        # limit bitrate if bytes in flight exceeds is close to or
        # exceeds cwnd. This helps to avoid large rate fluctiations and
        # variations in RTT
        # Only applied when L4S is inactive
        if (!l4s_active && bytes_in_flight_ratio > BYTES_IN_FLIGHT_LIMIT)
          tmp_t /= min(BYTES_IN_FLIGHT_LIMIT_COMPENSATION,
            bytesInFlightRatio / BYTES_IN_FLIGHT_LIMIT)
        end

        # Scale down rate slighty when the congestion window is very
        # small compared to MSS
        tmp_t *= 1.0 - min(0.8, max(0.0, cwnd_ratio - 0.1))

        # Scale down rate when frame sizes vary much
        tmp_t /= rel_framesize_high

        # Calculate target bitrate and limit to min and max allowed
        # values
        target_bitrate = tmp_t * 8 * cwnd / s_rtt
        target_bitrate = min(TARGET_BITRATE_MAX,
          max(TARGET_BITRATE_MIN,target_bitrate))
]]></artwork>
        <t>The variable rel_framesize_high is based on calculation of the high percentile of the frame sizes. The calculation is based on a histogram of the frame sizes relative to the expected frame size given the target bitrate and frame period. The calculation of rel_framesize_high is done for every new video frame and is outlined roughly with the pseudo code below. For more detailed code, see <xref target="SCReAM-CPP-implementation"/>.</t>
        <artwork><![CDATA[
        # frame_size is that frame size for the last encoded frame
        tmp_t = frame_size / (target_bitrate * frame_period / 8)

        if (tmp_t > 1.0)
          # Insert sample into histogram
          insert_into_histogram(tmp_t)
          # Get high percentile
          rel_framesize_high = get_histogram_high_percentile()
        end
]]></artwork>
        <t>A 75%-ile is used in <xref target="SCReAM-CPP-implementation"/>, the histogram can be made leaky such that old samples are gradually forgotten.</t>
      </section>
      <section anchor="competing-flows-compensation">
        <name>Competing Flows Compensation</name>
        <t>It is likely that a flow will have to share congested bottlenecks with other flows that use a more aggressive congestion control algorithm (for example, large FTP flows using loss-based congestion control). The worst condition occurs when the bottleneck queues are of tail-drop type with a large buffer size. SCReAMv2 takes care of such situations by adjusting the qdelay_target when loss-based flows are detected, as shown in the pseudocode below.</t>
        <artwork><![CDATA[
        adjust_qdelay_target(qdelay)
          qdelay_norm_t = qdelay / QDELAY_TARGET_LOW
          update_qdelay_norm_history(qdelay_norm_t)
          # Compute variance
          qdelay_norm_var_t = VARIANCE(qdelay_norm_history(200))
          # Compensation for competing traffic
          # Compute average
          qdelay_norm_avg_t = AVERAGE(qdelay_norm_history(50))
          # Compute upper limit to target delay
          new_target_t = qdelay_norm_avg_t + sqrt(qdelay_norm_var_t)
          new_target_t *= QDELAY_TARGET_LO
          if (loss_event_rate > 0.002)
            # Packet losses detected
            qdelay_target = 1.5 * new_target_t
          else
            if (qdelay_norm_var_t < 0.2)
              # Reasonably safe to set target qdelay
              qdelay_target = new_target_t
            else
              # Check if target delay can be reduced; this helps prevent
              # the target delay from being locked to high values forever
              if (new_target_t < QDELAY_TARGET_LO)
                # Decrease target delay quickly, as measured queuing
                # delay is lower than target
                qdelay_target = max(qdelay_target * 0.5, new_target_t)
              else
                # Decrease target delay slowly
                qdelay_target *= 0.9
              end
            end
          end

          # Apply limits
          qdelay_target = min(QDELAY_TARGET_HI, qdelay_target)
          qdelay_target = max(QDELAY_TARGET_LO, qdelay_target)
]]></artwork>
        <t>Two temporary variables are calculated. qdelay_norm_avg_t is the long-term average queue delay, qdelay_norm_var_t is the long-term variance of the queue delay. A high qdelay_norm_var_t indicates that the queue delay changes; this can be an indication that bottleneck bandwidth is reduced or that a competing flow has just entered. Thus, it indicates that it is not safe to adjust the queue delay target.</t>
        <t>A low qdelay_norm_var_t indicates that the queue delay is relatively stable. The reason could be that the queue delay is low, but it could also be that a competing flow is causing the bottleneck to reach the point that packet losses start to occur, in which case the queue delay will stay relatively high for a longer time.</t>
        <t>The queue delay target is allowed to be increased if either the loss event rate is above a given threshold or qdelay_norm_var_t is low. Both these conditions indicate that a competing flow may be present. In all other cases, the queue delay target is decreased.</t>
        <t>The function that adjusts the qdelay_target is simple and could produce false positives and false negatives. The case that self-inflicted congestion by the SCReAMv2 algorithm may be falsely interpreted as the presence of competing loss-based FTP flows is a false positive. The opposite case -- where the algorithm fails to detect the presence of a competing FTP flow -- is a false negative.</t>
        <t>Extensive simulations have shown that the algorithm performs well in LTE test cases and that it also performs well in simple bandwidth-limited bottleneck test cases with competing FTP flows. However, the potential failure of the algorithm cannot be completely ruled out. A false positive (i.e., when self-inflicted congestion is mistakenly identified as competing flows) is especially problematic when it leads to increasing the target queue delay, which can cause the end-to-end delay to increase dramatically.</t>
        <t>If it is deemed unlikely that competing flows occur over the same bottleneck, the algorithm described in this section MAY be turned off. One such case is QoS-enabled bearers in 3GPP-based access such as LTE. However, when sending over the Internet, often the network conditions are not known for sure, so in general it is not possible to make safe assumptions on how a network is used and whether or not competing flows share the same bottleneck. Therefore, turning this algorithm off must be considered with caution, as it can lead to basically zero throughput if competing with loss-based traffic.</t>
      </section>
      <section anchor="coder-errors">
        <name>Handling of systematic errors in video coders</name>
        <t>Some video encoders are prone to systematically generate an output bitrate that is systematically larger or smaller than the target bitrate. SCReAMv2 can handle some deviation inherently but for larger devation it becomes necessary to compensate for this. The algorithm for this is detailed in <xref target="SCReAM-CPP-implementation"/>.</t>
        <t>ToDo: A future draft version will describe this in more detail as it has been fully integrated into SCReAMv2.</t>
      </section>
    </section>
    <section anchor="scream-receiver">
      <name>Receiver Requirements on Feedback Intensity</name>
      <t>The simple task of the receiver is to feed back acknowledgements with with time stamp and ECN bits indication for received packets to the sender. Upon reception of each RTP packet, the receiver MUST maintain enough information to send the aforementioned values to the sender via an RTCP transport- layer feedback message. The frequency of the feedback message depends on the available RTCP bandwidth. The requirements on the feedback elements and the feedback interval are described below.</t>
      <t>SCReAMv2 benefits from relatively frequent feedback. It is RECOMMENDED that a SCReAMv2 implementation follows the guidelines below.</t>
      <t>The feedback interval depends on the media bitrate. At low bitrates, it is sufficient with a feedback every frame; while at high bitrates, a feedback interval of roughly 5ms ms is preferred. At very high bitrates, even shorter feedback intervals MAY be needed in order to keep the self-clocking in SCReAMv2 working well. One indication that feedback is too sparse is that the SCReAMv2 implementation cannot reach high bitrates, even in uncongested links. More frequent feedback might solve this issue.</t>
      <t>The numbers above can be formulated as a feedback interval function that can be useful for the computation of the desired RTCP bandwidth. The following equation expresses the feedback rate:</t>
      <artwork><![CDATA[
      # Assume 100 byte RTCP packets
      rate_fb = 0.02 * [average received rate] / (100.0 * 8.0);
      rate_fb = min(1000, max(10, rate_fb))

      # Calculate feedback intervals
      fb_int = 1.0/rate_fb
]]></artwork>
      <t>Feedback should also forcibly be transmitted in any of these cases:</t>
      <ul spacing="normal">
        <li>
          <t>More than N packets received since last RTCP feedback has been transmitted</t>
        </li>
        <li>
          <t>An RTP packet with marker bit set is received</t>
        </li>
      </ul>
      <t>The transmission interval is not critical. So, in the case of multi-stream handling between two hosts, the feedback for two or more synchronization sources (SSRCs) can be bundled to save UDP/IP overhead. However, the final realized feedback interval SHOULD notexceed 2*fb_int in such cases, meaning that a scheduled feedback transmission event should not be delayed more than fb_int.</t>
      <t>SCReAMv2 works with AVPF regular mode; immediate or early mode is not required by SCReAMv2 but can nonetheless be useful for RTCP messages not directly related to SCReAMv2, such as those specified in <xref target="RFC4585"/>. It is RECOMMENDED to use reduced-size RTCP <xref target="RFC5506"/>, where regular full compound RTCP transmission is controlled by trr-int as described in <xref target="RFC4585"/>.</t>
    </section>
    <section anchor="discussion">
      <name>Discussion</name>
      <t>This section covers a few discussion points.</t>
      <ul spacing="normal">
        <li>
          <t>Clock drift: SCReAM/SCReAMv2 can suffer from the same issues with clock drift as is the case with LEDBAT <xref target="RFC6817"/>. However, Appendix A.2 in <xref target="RFC6817"/> describes ways to mitigate issues with clock drift. A clockdrift compensation method is also implemented in <xref target="SCReAM-CPP-implementation"/>.</t>
        </li>
        <li>
          <t>Clock skipping: The sender or receiver clock can occasionally skip. Handling of this is implemented in <xref target="SCReAM-CPP-implementation"/>.</t>
        </li>
        <li>
          <t>The target bitrate given by SCReAMv2 is the bitrate including the RTP and Forward Error Correction (FEC) overhead. The media encoder SHOULD take this overhead into account when the media bitrate is set. This means that the media coder bitrate SHOULD be computed as:
    media_rate = target_bitrate - rtp_plus_fec_overhead_bitrate
It is not necessary to make a 100% perfect compensation for the overhead, as the SCReAM algorithm will inherently compensate for moderate errors. Under-compensating for the overhead has the effect of increasing jitter, while overcompensating will cause the bottleneck link to become underutilized.</t>
        </li>
        <li>
          <t>The link utilization with SCReAMv2 can be lower than 100%. There are several possible reasons to this:  </t>
          <ul spacing="normal">
            <li>
              <t>Large variations in frame sizes: Large variations in frame size makes SCReAMv2 push down the target_bitrate to give sufficient headroom and avoid queue buildup in the network. It is in general recommended to operate video coders in low latency mode and enable GDR (Gradual Decoding Refresh) if possible to minimize frame size variations.</t>
            </li>
            <li>
              <t>Link layer properties: Media transport in 5G in uplink typically requires to transmit a scheduling request (SR) to get persmission to transmit data. Because transmission of video is frame based, there is a high likelihood that the channel becomes idle between frames (especially with L4S), in which case a new SR/grant exchange is needed. This potentially means that uplink transmission slots are unused with a lower link utilization as a result.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Packet pacing is recommended, it is however possible to operate SCReAMv2 with packet pacing disabled. The code in <xref target="SCReAM-CPP-implementation"/> implements additonal mechanisms to achieve a high link utilization when packet pacing is disabled.</t>
        </li>
        <li>
          <t>RFC8888 Feedback issues: RTCP feedback packets can be lost, this means that the loss detection in SCReAMv2 may trigger even though packets arrive safely on the receiver side. <xref target="SCReAM-CPP-implementation"/> solves this by using overlapping RTCP feedback, i.e RTCP feedback is transmitted no more seldom than every 16th packet, and where each RTCP feedback spans the last 64 received packets. This however creates unnecessary overhead. <xref target="RFC3550"/> RR (Receiver Reports) can possibly be another solution to achieve better robustness with less overhead.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The feedback can be vulnerable to attacks similar to those that can affect TCP. It is therefore RECOMMENDED that the RTCP feedback is at least integrity protected. Furthermore, as SCReAM/SCReAMv2 is self-clocked, a malicious middlebox can drop RTCP feedback packets and thus cause the self-clocking to stall. However, this attack is mitigated by the minimum send rate maintained by SCReAM/SCReAMv2 when no feedback is received.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3550" target="https://www.rfc-editor.org/info/rfc3550" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3550.xml">
          <front>
            <title>RTP: A Transport Protocol for Real-Time Applications</title>
            <author fullname="H. Schulzrinne" initials="H." surname="Schulzrinne"/>
            <author fullname="S. Casner" initials="S." surname="Casner"/>
            <author fullname="R. Frederick" initials="R." surname="Frederick"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>This memorandum describes RTP, the real-time transport protocol. RTP provides end-to-end network transport functions suitable for applications transmitting real-time data, such as audio, video or simulation data, over multicast or unicast network services. RTP does not address resource reservation and does not guarantee quality-of- service for real-time services. The data transport is augmented by a control protocol (RTCP) to allow monitoring of the data delivery in a manner scalable to large multicast networks, and to provide minimal control and identification functionality. RTP and RTCP are designed to be independent of the underlying transport and network layers. The protocol supports the use of RTP-level translators and mixers. Most of the text in this memorandum is identical to RFC 1889 which it obsoletes. There are no changes in the packet formats on the wire, only changes to the rules and algorithms governing how the protocol is used. The biggest change is an enhancement to the scalable timer algorithm for calculating when to send RTCP packets in order to minimize transmission in excess of the intended rate when many participants join a session simultaneously. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="64"/>
          <seriesInfo name="RFC" value="3550"/>
          <seriesInfo name="DOI" value="10.17487/RFC3550"/>
        </reference>
        <reference anchor="RFC4585" target="https://www.rfc-editor.org/info/rfc4585" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4585.xml">
          <front>
            <title>Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF)</title>
            <author fullname="J. Ott" initials="J." surname="Ott"/>
            <author fullname="S. Wenger" initials="S." surname="Wenger"/>
            <author fullname="N. Sato" initials="N." surname="Sato"/>
            <author fullname="C. Burmeister" initials="C." surname="Burmeister"/>
            <author fullname="J. Rey" initials="J." surname="Rey"/>
            <date month="July" year="2006"/>
            <abstract>
              <t>Real-time media streams that use RTP are, to some degree, resilient against packet losses. Receivers may use the base mechanisms of the Real-time Transport Control Protocol (RTCP) to report packet reception statistics and thus allow a sender to adapt its transmission behavior in the mid-term. This is the sole means for feedback and feedback-based error repair (besides a few codec-specific mechanisms). This document defines an extension to the Audio-visual Profile (AVP) that enables receivers to provide, statistically, more immediate feedback to the senders and thus allows for short-term adaptation and efficient feedback-based repair mechanisms to be implemented. This early feedback profile (AVPF) maintains the AVP bandwidth constraints for RTCP and preserves scalability to large groups. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4585"/>
          <seriesInfo name="DOI" value="10.17487/RFC4585"/>
        </reference>
        <reference anchor="RFC5506" target="https://www.rfc-editor.org/info/rfc5506" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5506.xml">
          <front>
            <title>Support for Reduced-Size Real-Time Transport Control Protocol (RTCP): Opportunities and Consequences</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="April" year="2009"/>
            <abstract>
              <t>This memo discusses benefits and issues that arise when allowing Real-time Transport Protocol (RTCP) packets to be transmitted with reduced size. The size can be reduced if the rules on how to create compound packets outlined in RFC 3550 are removed or changed. Based on that analysis, this memo defines certain changes to the rules to allow feedback messages to be sent as Reduced-Size RTCP packets under certain conditions when using the RTP/AVPF (Real-time Transport Protocol / Audio-Visual Profile with Feedback) profile (RFC 4585). This document updates RFC 3550, RFC 3711, and RFC 4585. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5506"/>
          <seriesInfo name="DOI" value="10.17487/RFC5506"/>
        </reference>
        <reference anchor="RFC6298" target="https://www.rfc-editor.org/info/rfc6298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6298.xml">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC6817" target="https://www.rfc-editor.org/info/rfc6817" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6817.xml">
          <front>
            <title>Low Extra Delay Background Transport (LEDBAT)</title>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
            <author fullname="G. Hazel" initials="G." surname="Hazel"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="December" year="2012"/>
            <abstract>
              <t>Low Extra Delay Background Transport (LEDBAT) is an experimental delay-based congestion control algorithm that seeks to utilize the available bandwidth on an end-to-end path while limiting the consequent increase in queueing delay on that path. LEDBAT uses changes in one-way delay measurements to limit congestion that the flow itself induces in the network. LEDBAT is designed for use by background bulk-transfer applications to be no more aggressive than standard TCP congestion control (as specified in RFC 5681) and to yield in the presence of competing flows, thus limiting interference with the network performance of competing flows. This document defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6817"/>
          <seriesInfo name="DOI" value="10.17487/RFC6817"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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="RFC8888" target="https://www.rfc-editor.org/info/rfc8888" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8888.xml">
          <front>
            <title>RTP Control Protocol (RTCP) Feedback for Congestion Control</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="V. Singh" initials="V." surname="Singh"/>
            <author fullname="M. Ramalho" initials="M." surname="Ramalho"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>An effective RTP congestion control algorithm requires more fine-grained feedback on packet loss, timing, and Explicit Congestion Notification (ECN) marks than is provided by the standard RTP Control Protocol (RTCP) Sender Report (SR) and Receiver Report (RR) packets. This document describes an RTCP feedback message intended to enable congestion control for interactive real-time traffic using RTP. The feedback message is designed for use with a sender-based congestion control algorithm, in which the receiver of an RTP flow sends back to the sender RTCP feedback packets containing the information the sender needs to perform congestion control.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8888"/>
          <seriesInfo name="DOI" value="10.17487/RFC8888"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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="RFC7478" target="https://www.rfc-editor.org/info/rfc7478" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7478.xml">
          <front>
            <title>Web Real-Time Communication Use Cases and Requirements</title>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
            <author fullname="S. Hakansson" initials="S." surname="Hakansson"/>
            <author fullname="G. Eriksson" initials="G." surname="Eriksson"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>This document describes web-based real-time communication use cases. Requirements on the browser functionality are derived from the use cases.</t>
              <t>This document was developed in an initial phase of the work with rather minor updates at later stages. It has not really served as a tool in deciding features or scope for the WG's efforts so far. It is being published to record the early conclusions of the WG. It will not be used as a set of rigid guidelines that specifications and implementations will be held to in the future.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7478"/>
          <seriesInfo name="DOI" value="10.17487/RFC7478"/>
        </reference>
        <reference anchor="RFC8298" target="https://www.rfc-editor.org/info/rfc8298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8298.xml">
          <front>
            <title>Self-Clocked Rate Adaptation for Multimedia</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>This memo describes a rate adaptation algorithm for conversational media services such as interactive video. The solution conforms to the packet conservation principle and uses a hybrid loss-and-delay- based congestion control algorithm. The algorithm is evaluated over both simulated Internet bottleneck scenarios as well as in a Long Term Evolution (LTE) system simulator and is shown to achieve both low latency and high video throughput in these scenarios.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8298"/>
          <seriesInfo name="DOI" value="10.17487/RFC8298"/>
        </reference>
        <reference anchor="RFC8511" target="https://www.rfc-editor.org/info/rfc8511" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml">
          <front>
            <title>TCP Alternative Backoff with ECN (ABE)</title>
            <author fullname="N. Khademi" initials="N." surname="Khademi"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="G. Armitage" initials="G." surname="Armitage"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <date month="December" year="2018"/>
            <abstract>
              <t>Active Queue Management (AQM) mechanisms allow for burst tolerance while enforcing short queues to minimise the time that packets spend enqueued at a bottleneck. This can cause noticeable performance degradation for TCP connections traversing such a bottleneck, especially if there are only a few flows or their bandwidth-delay product (BDP) is large. The reception of a Congestion Experienced (CE) Explicit Congestion Notification (ECN) mark indicates that an AQM mechanism is used at the bottleneck, and the bottleneck network queue is therefore likely to be short. Feedback of this signal allows the TCP sender-side ECN reaction in congestion avoidance to reduce the Congestion Window (cwnd) by a smaller amount than the congestion control algorithm's reaction to inferred packet loss. Therefore, this specification defines an experimental change to the TCP reaction specified in RFC 3168, as permitted by RFC 8311.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8511"/>
          <seriesInfo name="DOI" value="10.17487/RFC8511"/>
        </reference>
        <reference anchor="RFC8699" target="https://www.rfc-editor.org/info/rfc8699" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8699.xml">
          <front>
            <title>Coupled Congestion Control for RTP Media</title>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Gjessing" initials="S." surname="Gjessing"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>When multiple congestion-controlled Real-time Transport Protocol (RTP) sessions traverse the same network bottleneck, combining their controls can improve the total on-the-wire behavior in terms of delay, loss, and fairness. This document describes such a method for flows that have the same sender, in a way that is as flexible and simple as possible while minimizing the number of changes needed to existing RTP applications. This document also specifies how to apply the method for the Network-Assisted Dynamic Adaptation (NADA) congestion control algorithm and provides suggestions on how to apply it to other congestion control algorithms.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8699"/>
          <seriesInfo name="DOI" value="10.17487/RFC8699"/>
        </reference>
        <reference anchor="RFC8869" target="https://www.rfc-editor.org/info/rfc8869" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8869.xml">
          <front>
            <title>Evaluation Test Cases for Interactive Real-Time Media over Wireless Networks</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="X. Zhu" initials="X." surname="Zhu"/>
            <author fullname="J. Fu" initials="J." surname="Fu"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>The Real-time Transport Protocol (RTP) is a common transport choice for interactive multimedia communication applications. The performance of these applications typically depends on a well-functioning congestion control algorithm. To ensure a seamless and robust user experience, a well-designed RTP-based congestion control algorithm should work well across all access network types. This document describes test cases for evaluating performances of candidate congestion control algorithms over cellular and Wi-Fi networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8869"/>
          <seriesInfo name="DOI" value="10.17487/RFC8869"/>
        </reference>
        <reference anchor="RFC8985" target="https://www.rfc-editor.org/info/rfc8985" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8985.xml">
          <front>
            <title>The RACK-TLP Loss Detection Algorithm for TCP</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="N. Cardwell" initials="N." surname="Cardwell"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="P. Jha" initials="P." surname="Jha"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document presents the RACK-TLP loss detection algorithm for TCP. RACK-TLP uses per-segment transmit timestamps and selective acknowledgments (SACKs) and has two parts. Recent Acknowledgment (RACK) starts fast recovery quickly using time-based inferences derived from acknowledgment (ACK) feedback, and Tail Loss Probe (TLP) leverages RACK and sends a probe packet to trigger ACK feedback to avoid retransmission timeout (RTO) events. Compared to the widely used duplicate acknowledgment (DupAck) threshold approach, RACK-TLP detects losses more efficiently when there are application-limited flights of data, lost retransmissions, or data packet reordering events. It is intended to be an alternative to the DupAck threshold approach.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8985"/>
          <seriesInfo name="DOI" value="10.17487/RFC8985"/>
        </reference>
        <reference anchor="RFC8257" target="https://www.rfc-editor.org/info/rfc8257" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8257.xml">
          <front>
            <title>Data Center TCP (DCTCP): TCP Congestion Control for Data Centers</title>
            <author fullname="S. Bensley" initials="S." surname="Bensley"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian"/>
            <author fullname="L. Eggert" initials="L." surname="Eggert"/>
            <author fullname="G. Judd" initials="G." surname="Judd"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This Informational RFC describes Data Center TCP (DCTCP): a TCP congestion control scheme for data-center traffic. DCTCP extends the Explicit Congestion Notification (ECN) processing to estimate the fraction of bytes that encounter congestion rather than simply detecting that some congestion has occurred. DCTCP then scales the TCP congestion window based on this estimate. This method achieves high-burst tolerance, low latency, and high throughput with shallow- buffered switches. This memo also discusses deployment issues related to the coexistence of DCTCP and conventional TCP, discusses the lack of a negotiating mechanism between sender and receiver, and presents some possible mitigations. This memo documents DCTCP as currently implemented by several major operating systems. DCTCP, as described in this specification, is applicable to deployments in controlled environments like data centers, but it must not be deployed over the public Internet without additional measures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8257"/>
          <seriesInfo name="DOI" value="10.17487/RFC8257"/>
        </reference>
        <reference anchor="Packet-conservation">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/52325.52356"/>
          <refcontent>ACM SIGCOMM Computer Communication Review</refcontent>
        </reference>
        <reference anchor="LEDBAT-delay-impact" target="http://home.ifi.uio.no/michawe/research/publications/ledbat-impact-letters.pdf">
          <front>
            <title>Assessing LEDBAT's Delay Impact</title>
            <author initials="D." surname="Ros" fullname="David Ros">
              <organization/>
            </author>
            <author initials="M." surname="Welzl" fullname="Michael Welzl">
              <organization/>
            </author>
            <date year="2013" month="May"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/LCOMM.2013.040213.130137"/>
          <refcontent>IEEE Communications Letters, Vol. 17, No. 5,</refcontent>
        </reference>
        <reference anchor="QoS-3GPP" target="http://www.3gpp.org/ftp/specs/archive/23_series/23.203/">
          <front>
            <title>Policy and charging control architecture</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="July"/>
          </front>
          <refcontent>3GPP TS 23.203</refcontent>
        </reference>
        <reference anchor="SCReAM-CPP-implementation" target="https://github.com/EricssonResearch/scream">
          <front>
            <title>SCReAM - Mobile optimised congestion control algorithm</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SCReAM-evaluation-L4S" target="https://github.com/EricssonResearch/scream/blob/master/L4S-Results.pdf?raw=true">
          <front>
            <title>SCReAM - evaluations with L4S</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TFWC" target="http://www-dept.cs.ucl.ac.uk/staff/M.Handley/papers/tfwc-conext.pdf">
          <front>
            <title>Fairer TCP-Friendly Congestion Control Protocol for Multimedia Streaming Applications</title>
            <author initials="S." surname="Choi" fullname="Soo-Hyun Choi">
              <organization/>
            </author>
            <author initials="M." surname="Handley" fullname="Mark Handley">
              <organization/>
            </author>
            <date year="2007" month="December"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/1364654.1364717"/>
        </reference>
      </references>
    </references>
    <?line 850?>

<section anchor="acknowledgements">
      <name>Acknowledgments</name>
      <t>We would like to thank the following people for their comments, questions, and support during the work that led to this memo: Mirja Kuehlewind</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V9a3PbRpbod/0KrF27IW2SethKHHk8u4osO9q1bI+kJLs1
tVcFkiCJMQhw8JCicby//Z5n92kAlJzZuXVdMzFNAv04ffq8H+PxeGdezPJ4
nRxF8zJe1OO/FKs4r6oiH89mt8txuZi9OPj+xTStxtWsTOL1zcF4b2+nTusM
XrlMssX4JCtmn5J5dBHXSXQ8jzd1XKdFHi2KMjpvsjpdJ/M03omn0zK5gXdO
LpLj85uDnWJaFVlSJ9VRhFPszOL6KEp+3eykm/Ioqsumqg/29r7fO9i5XR5F
Jye/vN2JYQVH0VUJK9wUZb1TNdN1WlUwW323gfWcnV69iaLHUZxVxVH0KM3n
ySaB/+T1o1H06Oz4B/gLVvXo7OLqzaOdnZskb5KjnShalkWzgTmKfJlUtHj4
WJdFFv1SlJ/SfBm9xSeiAcJkCC+s4zQ7ivBf/5Ym9WJSlEscJq1XzfQoWmZF
mjfZbi9EGYxjgOjOTtzUq6LEFYx34D/4J80BHmeT6N/1Lfmez+gMFriOy86v
MP9RdFqmM/NdwotM+ZVJNXEL+bdEnpzMijVNbuaOzifRLwCFpMyafB7Mfh4v
86bq/nrP7Gt6ZXLrXgnn3klzQJM1IMwNHUR08ebkYH//e/383fPvXuhnRBL3
+XB/333+9nv3/Av4h/v8/YtD/+7hd0cE4o8xIGs9nhV5lZQ3hKlHsmRBaoMF
xzdFOo/zWRLF+VxxQp72Zyd/xv6jgPJnOMZ4hnie298YmD/HefvXMlnAumpA
16Po+OQ8ujx7e/Lh/BwmXm8agB9+WDd5OuMLdpHcpMmtvAu7SZMKwWmW9PrD
2VG0vzfZ339+uHt48OzgcAL/PfxWnpjDjYWZmiVctWj/+xcvCELvTl//cHw1
nidZfDdO15t4Vh9t2bPdMu349SS6KCrzLe/1dXyTzoNfOm8S1mV/yzrvnqez
VZxkwa8WUGenp6chYKroXVIDuKpR9HORTaL970bR+2ISHY6+DlZ73+++Q7hP
Dvb2n032nu8dwF/7z+Af3wWAO4/vInwkRJ/jqkqAJAHNYEB+U0WvEZTRGYFS
H47LZQKrX9X15mh3d1Wsk0m6SCdNWkzyYneNm75NdsukSuJyttrdNNNMt7eb
JfNpXMvZjDPe7GQzX9D5/am4HD97+/FjC60ffSxghDvCZBi8XOISZ0LmcI60
TmZ1UyaPeoCM40VXl9HBMwDKs/493N7eTp4tNxskhruLerNbbZJZtUtD3yS7
B8+uGe67PMhuAMt/bzIC5ne0BeYR45OPH3GTWbKGRfRdVX4uGkfnxTTNkqjY
ALdJK2BGM3+J3R6zZVEChV5/1QVmrFSiBneND6Jn6xXsnSk/krRdfUXf2GWC
b/eV3MRZQ/sZv3t+uW1P/qkquoXxI3j2/8vSd6dZMd1dx0jCd2ERY/gd+Dph
3L+W8e0r4NUJ7e/qzS8nbbR7E6clkK6rk4/jN3D8+RwOuofRfiyLupjBh1Bs
iC5rXALi6vFm467Ao98BiMtJdLIq0uAHJi2XRTH+8a7JW7/3jAHU6Ue4OFly
1zPMeVx+av38MDXef/bt828Pn0/w7+/2v9t6pYAOb+rJrJo0s2wSzybNp92q
jheL3fOJTLm7iTdw/3frxe0M+Vrya020gEfk6/U6mSXrKRwDSFRwxfI2z312
eLinn58fer4JX3+rn781/PfbF/vfOd66/91zz39fwDM74/E4iqdVXSLB27la
pVW0TtZFNE8Ao9JpUkVxVKK4GHtx0V1PwgDYxw1sin6Ks4hxATl2OoO3q2a2
iuIKzgZQEuaAnUTAYRIg8lerJAK5stGrj+JFFdVFVMMPG2L+kWX+0aZM81kK
RIYoY4pLW91NS+BXWVFVY/qWeGE0jfspyy5tZR3n8ZIoldlKvYprkkZhyRsU
Wavo9OQ9jQkXiVfrn4bJ5dLDPAXsP5oWcO+rdN1k9N0Z7jeHHcD3cLvyZPYp
qmZJHpdpUSFAbpMsY8DANt7BSq+Sch2d3ihABu+uToc0/eHbqLqDG73W4QHo
AoBqVdzmCLIYKHcCoKVVZMVthKvIhYes0uWKgQ67BOl4uQIZBScGQFeJXxZu
EgcFZgAMTkQXJ/sj0pD434aFg9cKsRzvf7GI1kgX8KgEH4g2AJsH6R9GzqIG
Jp7BKQEsykR+xlcRo0pAQDgmObNRdHxB23j2Ovr5IloWxTJLqgmj7jqdw8Xa
2XmMAC+LeTOjRX9+nJp/ftnZMWSM9+0PqJjNmhLOY5XwDzXqLOu0xlOcpjVh
DEAFgQjHDGjCj8U3IDXH0wy3Acia1neMBzHoFjc4FA9DKg9gc72aBGRR8A32
DlQjK+5gsvbCVjEcKJxtssYH+vikOfiymKJoCOSFpHQVhPEJlIzDt7Ms3gD8
WxMCSM/MLYUTycZI2+EFK8sCmy/o3ADPajzqMvlrA4wD71MVFQaIiBUv8Z8g
nxRlMkJSQsscRckCECzFG9gmLogAMV6NGZCPCvEF5sK7zjOXdQwvbeKSpk4f
Xi/gXFzZg+UTAbkqz0FWnQKUbtM53JoZzHATl3KMOBAA5BfYWIbrkOUoOYPL
KXdzBJgDIqAuERa0LAG/dYU4MeBXiVtVQI/gMWTXCEX8XfcFZ4bgbFNbfqi7
YHg2BuxZxHDVaEFTEAVg6Z8/q1z55QvtCl9d0n2qgAiUgLR3THZgo3dIQ2Cp
BLhFCVwSr3dTjXroviPWeEb9oKfbPnJg+iWZXlydwIpEQfzyZYTzNRlcLSFW
gDtAGhGW8A3dJ8DZAvAYJ5cblSGvheXgLlJ/dnrxJv2M63eYPBAShBYH0UCt
HsMRHmizQbaMaxJpr+ca4lgXVx+VyPF2kU9/+QKq0grFXXn5FmACVBMEekDx
O1jrDYnAOACDaqRPGg6hC6KzJA4FkGr0vQLvVxRb0nKLN65voYAxdp0AMuBL
gNaA9ROdGL5k7ik3uUIozhCKSJ49C4axQFCkg2sIkZPZKk//2iDPB8kejgyB
dotUDoak5Qq92S5OuInfAQc7/RUurChkP4A0gJYfmMyZlIBDktY2ZHijnAPw
3tlx4MLtAYWCm4eX+M7sBCZBzgv0t1ky2Qp3STI84hZ8xg3GwGdy4L3A60Aq
pg1MojdNiaAfhedTx59wczdApUDGQCid/opHA5MZHvS+qD2HHYCcwZwet/1O
GDd9LpDywA+XwDL5bnj+PQCxZEjXgQgJHzqKLIAU8BOJB8yZkZHdEeiB+NwW
JV83/PeqqEA5iH4sboGHwFbC1xF6QtwZ1/AVOKN01nsLmnzGMiDyQliXwkWv
ZyhXlMD24plQwE0JN6FoKjQqgjxOSmTmLiWdL0oeQM8AoHqX8JDcHCiTwP6R
oQL3Y7lnAfoMnnu6zGleIMFMCp2UqXfR3TpFRVpzIPAh7joaky4WsLZoCfeo
hhniZQy6Rx1uRVfvVsxy0xoelQHgnFn+ATn8CQFdDgwQaJ7M+Xn8WpaxBpGg
4u3JFUvrNBGVE+d+faJX8mMZL5teGjBtahomjhbJLcAbL9m6mLuDIdisEYsB
ZQlZiA7xlYCzmcPpV0VTWuGeBXrcBK74fhEcEYtPgaQTZzSABYFM0syLMe14
sykLkG1GDPUKH4MlCrrcP4NbyAL0YMdqcZMkyKF0eaPQNW/fpvkc7hyAPiWm
5l6kdwhZ5wwGJMNIvvApkXMJePYllNvyFfF0VpCWeNp4B2BqXWCgT6xBRGLa
yBsjSdPSLFlxnM1Ex+guXiktIhngJSzCPQ6IiVxV5HERbOHu/3CHsj3g5CID
CZeI9YrJAYph8ImOKfl1liQJE43OtG4/wdhuahIaK3RaoCY7I86nGIC46g6X
AXNMB0C6JAhymySv3BB0LRx+OrpLeoeqE4qTLDPQPKRXoGgDU/2NVIedx48j
J9oNvDA3jI5ZzvtIwKLb9flxVifjwyVoEUyIXnz7PRAiL2cwTNZt2R65ATBq
0J9AgWXud6tTJvlNWhY58Z5J9LCQqWoTQg5kH6DLyyYGRlgniVM4nGD4ku8M
/A+tPVFCdJfeRRquAiMLixUjlfIFw16cOGzFxpGIfhVJq6M290FIuD2CeLgm
2kq4fUO8lFj4BLRc0rVwKtwcTqWUTxFTpJ8pXNVof28vOp9uUHt0RN5N29bG
PPYR+NcIS0Tj8iUgcYzURlTOtA5MdqQkKxyyImbc3BRk4YDbANwcNLhc6IND
z8ypRXLs9XZwzgGpCIBG5CYx+gakumiQTJYTkDlrwmeccvhSNXR6fgmMdbaS
5YM8UvOhkhCPDCWd4bnWyJ7gdubLJq1WgPfFmkkL4DOwDlK5ElGMK2Zruki4
GD/lWfpJDjHNE2O9EDDxtapQdKvoMjtN/1eYcoRMQyQH0BKrVOT5urzjawvb
jUn1EJyVw6JzNHQFyUWCRm4luSysbBKGMcu8CzhWXBXgyV2aZHMxX6AAm8xi
NDB4dAHqC0dIdwC4nn2faEytpgeSeJFS+I0DugIjQrpawjA1yo0gxN/S7Ujb
Qpl/bWTuhHmA3ZykJy9AeypAiiCIq07z14bkp1GAiiMx41TwPMHcnBndX5wW
zpmOLIV7ki468wLu8QUiGRb2gkJAXggs0BxPAn9M5iTCEF67HNEk+pDLN2U8
T4uoAlScN5kMxC8wfygTlg+If8yMVi80B1VLhD0jX6ykKIpTNv+ZyXGpeDSE
JCCI8n9nn+AcB4gXMEIBW764uiJJuChxY87mgUwLcPAGX0oaHIcFB1iLmBfR
bjhhbrC6Q8xBnaClKCiP/lfgBLeruzH+Sj8CQ7i0T97nyKiQ/aKYRFDIkwVM
xHaGVZKWtL+xyjMNkgS0H1QOQggLtOskJZPjClEQzvi2sIrUOkEsSqt1RQLl
cY+AMCP/ZKyHDdrRTZHdAE1RTRvfYOtHBYiWRIMKRQFAOYBxNbTMxNHe7iyJ
s2LiRU5ndSw6CD62pn/wSQyQKKBqBXw5umkyvKTTlBSIuhhFTBGJ+o2Rnchb
dPGIfg1ZYogWgPjjZQmkpf8chNrcdTXal3jkYm6gWxnzfAKESKCwTzgml43P
j04g1BuR0pCCDsucFiVttNmwzfHzZ3S5oEXgqqNVO4FrVoscSDQB7iKIxiQ5
grQLcuUnlAqmLYENOQuJZ1Y6M4dRiCQYRzOQaEj7SEBxSXghpdjtScytC2uE
UUOo0Hw2IJMcxUopXzLFzzvafZOrRSGFWfHaEQi8MYFID8oTI9JE4JiAfKPO
xCrAtCjUWk4v7+wch5dj+xUzMlI8/0uDV8RZG5xhgREIV09Xv60DMNPBTznA
UwEyRxrDkr+DISFHFi89tcEbBGfEr8O31aYpSRE049M2vYDHq6k2cNiwltdw
uZDC0WWHcRxohYfhbQfSRfhheSWQSGfqJKW2qeGaJ1YiKelfDGzCB9yRIxe0
BwJZh+gKT0V5m4hjIGfgbpk1LwuUYOA+kBRl2A7JUCCCbOrIwsYvn6kvhk0A
ylSEteg/JcsOvY23BrEdNVsQxdmfjg60L6yizxAcbfXdGGV502qSMmaJETGu
QJEWqwCsbpZs+i64mrHQRbpQFynfs+0YqjefbRJFRmLHgz4uxs373WAkJrEa
QhatOPoE95DlCkBcYI9zsUkUitewJZEsKpYNzYI/f+4JuSGbWr+qLFIaivkM
lji6je+s+U/O0Rro9Dty391/nxF5ybZIVjeEXgnEBfk58acapHk6M+UqtNeQ
1Q9ojzmRQfgK5FJY6aO/0o+PhjAZLKDrHGB3DUuTGvXEzIwQILwuXXWYTk4k
ToQ90NO1OSgxg5IvOFAbEINk3Ski36JC/+Gdj05BqZPIItDONJs3G2FI6dJY
lPgGNSauRWf0Fuw6+RXIeppU+tOCWI9biQhwaPlAuGZworVo6+4ZtCTzYtYI
CqCTn+DSiK4yAJK+EFdDArf/DnjnmVeeHKFCGkFHFAt/gR0Uc4ZLGZPZFpGR
nD4iib5k7WMWScgLCBFxxmw0iedVqKIOifUDqmXrAhb5t6QsZCIn19IxkwJR
EYmFI140mZhL2L6Gko5HW8IBY318yexvlWQbzw3Ir1NVaA4PTv7z556grS9f
QGDbVxsm3owMLlJl2A1ikZOM8AS8tZ4BDvd6Htex5dsv1WIZ5z26KR8daU+g
LiG/oHNCFoU+MEQkvtHovwAScKDmy19DAKqiTTq2d4+CKvLJO2iiM1ZIum/D
Ag9JuXc2aedOhZ/2jeKff83y0YdZs+nbeRjZ05rfqTsODxlwhzGxEhsDvAKn
voDxjIWpdSnFF8SYkd05F8CanJtbTtZGUuSMEow8LNZm6Q1xDaeEInegu8In
PLImAHnaKL5Oz20xKpQ/UMUCcpSL2QQICVEN4mOb8Aq/JDrQlLnYW0sOG2IM
UN1OPGXt24O+QsHGyrE2PV4SVlRTUNON22x3Uw5/atQyxc6CW4Szkxs4LxIR
3NgV0fE74OvhK47r4zGzGklGR9j3Sl0ffn1sGa/qZFMFSqVDCZEPxDqOZ9kX
A3NkjZnsrGUI8q1peU1IkTnpsNgb2NVc1DXnYNtmulbaRJIAAqdyNg2OVuoz
zQIW0zMxSWgV0mbUr1BwjcVIRMInbD635C3ewv0wQhsPsijY9jZN7gq52S3N
ZRKaegEeaB7i6cifiWQWUSd1tiH4Bok/xzY4BRSpSmuDhMMxmigIsD8xOgAz
z0QO2hQ0V7pNhbXGaxtmIXeBCcJfMEqkjAbMILzTjN3iopySpEAeDlgBSx66
2gWJaTSGDdwQa5jeEsIwNtNQnFNb0BwLLmV6i9R5hYRtjDPDQ/hbEmPQaKVU
M2RMdFNBnIvTjO6LwAnImoTB82/JfMyvbQLhkK/XrneFdgW7dVKvinudxV1p
ka4dYGUjhjQGHyAOm7dXbAe2OoO1QDrnNg6DFKG6y2egm+Tp3xCASCsdBohm
aoTMMrj8bDgJV+HcpjKln87pxI46o02RZgRxJ4GNg0pPCQ7+IoU/RvK1W4yw
WUBhVDNxlVlK4pWzauAG4DbDIRG4EHJJrfTchehEGUpJTM8ypT6hhHjvMXr5
fN7QLKCMFLAi0FdFDhdy1+XWAja5jOJMeYFeXaBYiwRVOwBBkleEpV4YRdiR
vj0Vd5yqYT2HhvpkdGEjkt7F+bJBX/znxzZSSdRHVJhgiQCRR+c/XV5h8gn+
Hb3/QJ8vTv/009nF6Wv8fPnj8bt37oM+cfnjh5/evfaf/JsYmH76/jW/DN9G
ra/Oj//rEVt2H334eHX24f3xu0fOzzwvZg27Rfksp+IqALm6ZhIf3N4fQDve
f84wxawMgCnDd/+75/AZKQpPRdo//5ONNptNwnpxTOLEJgVpmmOmOLgQ2SIB
9cMNxnSi9XzhXW/HDhs+PxY6UchzAGAfi8FaeGC7XJWJeMPJ1nnkkKWLdCM9
6TCES3/EfXVZK1CJLBNErBKeBAUbMsLW9tLjV3Bx0iXem33aNxMXL1pEhdl9
7Pevt+7KXNUxT2F9uxxoRSIHczM1d4wkEIWOhVVG5JHuMuBeAERkXJx9Aj0W
CPBSQ+0WOuWcJDm2FbAg7Y1CFIJy8h45o5i63wuce0K7Pz+WQxjP1L6y/VRg
8zQbSJOoyZKSiGo2gI9ZPykkjm4FBGHQkgWGoqzwIBgiEBM/O/nl/eto0GHP
Qw2AtXFF9+CIcCl5wvnEqy3MPwiAcmdBeqqKzY7ecKSBPoNcSW0TtEYEPTC7
QrTSeQryc0PmdHdgsjhH6YV2MkbjuxxsCRfn3iMnMc/NLYP4h4wfDSNZYbCK
WQ0cSkMB57QBMYEJpPB8dGu62shA8lOCQrJfnI2dledH6uIg1wEFSZAXfhQs
monRLTnM/Bj322Cc7YkxizcBi2DUsj54uyzRBSVIl12wZF+Y9DpMgOlvxXEc
hyfzSM7oDCLBJJmMwljipiap5C6p7V3eGohiAjFIpswxTh/9KmKPYTG/ygTt
ZEOFD61Fs/92E/5Wq16VJJ8qYewcyzIlaQTkBjzkHA+fouZQZkW3iBwkHZS8
USbLuJxTGICZQCKtC9rQaMvdC8NuqrpMUd6mqPAs/hXhaC+nhtZiLH7i4m27
QT0W1RKKfsa4E0T+DHfVNtFvOxOxAJitklsLgXJ+eRkNQBOhMEE83dxePkT5
oQMY6/9otHCuLL+tnhNB7xhtobt8srX0b+F8S2hS7C3Q5qX2gSOaOJPx7Fb1
LfMGO5AlgF4iBNVetB2n61VTfV0ElYSOSixTNy6L1gM6YTy/E63Qa31022Sj
MQWCJZqpwoFY5BCTmH6yVWlkVlcHd+ESHFKTLpdJSedOGv5H70lGLD2Bw0Cr
BNL9dcwZyTaa4Wg7ZFS3JOiDnGds63oWpFGeOieqEavFBVj5/AOQr0CSyb5q
Sucfdby7XrUHloACHnSiEYt2n79nk2zTxJAfQT5itQbllLW5PAmcBV4cVBoL
25VIhizgXDJzurKCgJdwmHWNaxVw7hEbmNBW1lgtdtZR6FJG2sS3GOSbRE2V
LY7kXbbO1NnvOniYF8DdK+e8upGNSOpyA2OuCQSGMjHe2dBr2/XVqhcwtCS7
qFS29bO3FC2MOGQsyNmS+0C8dVk0ffOEFiFHm3hKEgvJfkAWDJgVrTkst1Cu
LBlDY3NhtzGEiV5bCfI2UgWANF0yMSHrPdHq45P/IKG9TBg/aEGgv8mUnhmI
RQhWsxtGmSggWKoDZEMu3V6GQTd5NcBK0m4CvPPxFETDbFgQxdhJHBD5z5QV
MlF0hkE7Aek2Hm2tBFclAe4gFlrhJl3Txuoku3sph6wKZijSIRx8zFuwGcMq
3Q25Z4MfzXJ8eNeGwnTj2lP3kj2DalcO7IRi7nbu7TBmTWQn4G9xRTgJ45Mg
VYbBEGQlR94Mv68xjKtkOnROZ02ZJ578EJzGFNMgVEboUI9xmCJHq5a/MQyy
RTc8yvtw5TQyKskpsBJ+wZ3GFAYPSi3CSe6DpBNqoJZ4uFoQ9klKTkHxDnwf
7+UeVy+guPu74Viwmpp9E4XRD4UKyfUwIhP9MKiGoXo3iVqwYl1RQ6JD4bBX
DgQBTG3eYj6k2+wSFjU7BuGV5Mhp5iMDeM5eWavf2OTSYNhl2YDggQg4m8Hu
xRPD3OEGQZMWHGpAuXad2Fne4jeVRCsTBKxUHW/SOQbh+qRavwm6uxcUmicx
zFd3myQaXGCGjEaUjoyVz1kviJCZOHxPgsUB4CeELc5i3hfMx75atb3IZQDA
Sqz1p3SzIeJqMIGNe1HXiczwnksIl6AynFM4lPFLibyw1gifhICdYCodszFB
UcrAgtWL+VkswRR9ME8wNSQCDTuduZxi4PNkv6HzmGHIKV0acso6y6e3gJNp
7LWYxjGER38IzGRqqOxay3qt6powIzb4MNRc5Je2kSmw4E8i8YKCXF2HQsk/
2MgWyFAOiao+akYxY7mJG0AeRCFEwhQRXzE6moiSxs9aqcVYw3pxj3iNQQGM
l9XUJbOpXlsfA05IYYza1dJnL3M4xAAXR/d9qBIDGg0CePmw2AHySLahKrrS
rMMgk0Hj3tvkh+nclqEp5A+NIrAoDvyQ3DyhLsGJO3qG4J/VElqIcaabrDdg
CWdAkLkliU/6UpYa/Gbonzt9jXTYWhuE3Eb/8z//E8fVzTIo06B/no63/3na
+8Zv+oG5rsaR8G//oDnwz//pmXqwP9z6/G+dbwCjtz89eDZsf/U7ho5+/rqH
nz60Vf/A0573e5f0m0DeP4p//4lu+tZXiEC0XnlgFiUn7hVDIXpf+Tv2Qn+C
k34QYp2BHxz/t2hw0Drs3wbP/2GY9PuW0vlz03o4uC1P+77sAgaGVWcD/WPw
3VDmEhW9tSgY7o+/WYr0G48LXwbKvH3nN/6/YkWISifu2847v3c/PSBqbXZw
OAz3Yv5cYMRoMF337Abftq++mXn72fU83D67vj9Pt2303pGjn15//Nrl4AtV
QbL8173QWhIwiJ3PR9FjYJtjEXrIA0flil49EhR64310P8Ovj0B4Om/LBCos
cABueQsiLHPfQASNgIwz42rNqEH7bQPKJqW8j8AvJCM9H456eCg/SiKPf9ap
LGQQnicLkoCFmd+J6IySB/JQKdxAeXTjspiiTSmuVhRSGQQC9EpxGWmmDxi9
SHaRxL6gkstCrKn9QsmQxqxaWpyLqUa8EWSAe0IBbvi1RsniZCNyQUstKfal
L13Fmq/YmkrwGq1aFV7P2G6LwxcoXVEtBD1aYwbaRa0ZAGxjC01rFitCYxrZ
UEP9lo4dzgFpQvCmc+0hJVALiHV+xVPQTvpCqdj81Wc2TH7VVNuv0wLcvPeZ
RYGOb3UfdS036PFIKdFOqrL4u9ejJSBPbMXbUDL4Bh0lbfuNSMmd2C/207DL
IpE0qy0Bc/xkYHncxEg6sFKfz+hpr94FAwaLJxWsqsk8fU9+lIsIWCPGw93u
DyDzCY0+1oNmoBweitSaJhnlX1MOBfsxWdLX5ETMX9YI6mrsvuWSSOZ5dqD4
t2JKQqpqRV2vjsKqRMW6az2PK+d3XpJTNYnnxgiIkSb5XEOnv7muv5FLgZyB
U/+RSrMjiqIXEnEdYxZhxso4bdXu1exO7GgmyobdgtUoklxBOFhQQdCYWUWP
BsNHI2cGdYNEUpOJzVtMr11NiorcHn96ffru+L+ur44v3p5eXb/7EA32JvvD
o+iK0ZBdkTqwFg6RwL8/V//dM8aPZzjG861jiFfRjMGY4RBVsws7rmoAZuDS
kasiIw3472v+dujd2GrODiPgNolGu2pooolHFCXxRxNP25oNA3cJR7Sw1dSl
MVNAHtEEqbTFENDomFuqGOTsYIBG47oYJ67cG6m2eEv7b2WLODrnTlFsAKuz
ZrlMqxUdy/nZ+2sOOXm2t7c3xJKmfHzdO/xnJMF8mOfH/3n9w39dnV5ew+tv
3p29/RGO9PT49fXFhw/nIFUQdvwIt6EsirU7VTogF6KDs9JgP5xeHQNSoTd5
b/IdvEjr4TREyeyRwDtyK7Cv172I7jh478V971FIinuN/Nb7sFviKbhlwTb1
8pM9/hV+3XZoc90HRuEfzq4ujq9OrwGCHmptwpwD1DbVf0cDDEYibzjQlCKf
D3tHOv5Pv5gtI9F79PTH4xOaHKSLvfDoxLfSfQ8BdP3h59MLPCs8psMhlm1m
0lP5e9MjMbQrY8zJQ65O0evjn99ev8UR93b3v4VBT385P9ZDwOPPnlfXcbZZ
xYYUmHee97wiNzW+WZLT+cPl1fXJh/dvTy8xcPCahgCpc4Ibf61+Y94DpTgN
GNAVyBULclB14gWiB0K6OWNBKnfNYkzvbZgenv/0DhD/5OL0+PL0+s3xydWH
C8TBvYPuWgieA64+0wovGJoF3JIzL/c3XgInGMAffqE7en15cvzOToi37NLi
uwaRI/G65Vq6WEGMmC3djoAP0+Bnl9fIhgcLICd4GU66ZMMlC6fMsrGuDL37
89nF1U/H765R3qH9Iz79nJY1x3tdIeGmwzs++Q/Ac/jr7P1bIhRKJ/AFLnuF
qUyRIxcb6yXky76d3BwQEvhh3Cjt8HtmpZfE+H824gKJAoGogGyVWek2TupZ
tlB0eZ4WG3CZaNDmn7DaMCwe4IQ1Alx9hfBXCr7h4o4qimE5z8CZAuiVYqxQ
+CazEYqkv00rEtTKG+YXF+cnx1dclaBhdzRi6iwtZ82aM8lcgY43QASZAyaV
qYrlqvKpuNkqIyHJ4529GFJC5VZUTO9IGcjF2mKDBa9eKKQRhH8A1zfyHZyH
TLxIs1rCV2iVp79uCiwKwjn9vySIGfDrORdsOebCJ9EAydHQzoZ1aa+xIsWf
gXcARf+8N5pMRntfEOUTun3ia6TgJKzgQpVsmdPLWioux0LD0gUdKP8Nb56p
MoSPXaeoqfc80cnvoFcI7a/z5DYD8kkK+wBBc7UtZhBr9Nn4PB84SVtxSlor
HldD/nikYIBWpBaRHtY7aIEg3l3zItP8WniMW6LKfvcosLlZHJXIq8t0s23k
a8y1/53Du5JmreFRRbymc8PhfuoRO8MISQnWw5yFVpjnT0ZfY1QwSpzL9THi
B0Vi+QFwNXylrlVEoDWxJaglPHgJAP95zTqoXJhzTjaZhw97E8/aOhcYCNdl
Xevrl+sCyctcyf1I9di5sx5Iuot3RxLStXJEpYYz+UlgmfXmmqQw2tMlfmLp
M7hjNsjCQ4oGQEnxmrj8tcBmogjg1XTLkLHYh9T7wbRZNVJogJe5Vx6xqJKE
Dn1B/7Amh6+PgXL3/J4RUWolsV7FLidS6fNKuuy2JIRMt2OlCnqfw5Md8/ey
IJ2R6OcSE8ClDYz1BluYoIJOc/CYcCzXjMXXbn3XFMRJJ/mOjo0KSbjVI/VR
xFdl0Y7j5cDegfzPvSPJeq/hKQw1T+bXqHEJBhNJpeIzUihMnjFx6n4E3uaW
1/2rEgI/PjltAd9vzCPAteJX79Y6AqvGnQZgYgah0Oodh1lIH3i2sIr3LeJI
D2BMGEaGYN8HInh7nQDZjpXJKo2dua5nyYPTcXMTheXfPzlGSXlKuZ+gkhKG
orUoJfCNeEaPjuVZjuzgQC53LfU+KEDLJLtmOzwQrWtS7FHDQXUYP8MFnKHs
weVkfYm+kRUWQFDJC64k559wgpcEOgYUHmemR6/RcFPMnTZy5WJG5Ade59fn
xIwP2rEZya+bDIt/PhhcwQVJJM2z2sEkdEp+0hwjrtl0YuozoWLUNa/azKUj
NgNJiYOO5edewzerwCbLlYqdmDjBcKK27yMI6Vs4Kfb/QTwsW0BNjqvxc3iW
Yav+xmFJFqotDTOOC6zY0iqcqVrdRppa2LJtHfHQ7rnyqZhOOiDM1CoDvey4
8tW1+3JmenJ6wtSZwBxP2T7R4BaAz5n/9M0wogRGrceBF2XBdQqCtG/J7tp6
JoMWfx+KDZ+lGSlKXoHoqDGFmNTTTTuqqGw3V+A0bjIR46goB0rUQbZKjaRt
Lp0NNG0GZOis4Yg6dAlY+forE5wEmWxOUGadEaaEikVbHS3I5bnDEgKt/ClX
VFleCNbY9wblMVP1LlKEjrBKRhyIuZwo0prn8n1L/HUzkxzY0kucZl7Bi+ND
PTldpFNnWrNIyY22XvIwDmiRcT3+LVsYPx/hf5/Rfw/ov/scZHb5nqLXnLUY
pFOUKdJFu/ioiRneNskzYvMkw47HW5Z438tUOqqWdPmZFEL13rxZSK1bwIIr
1i8jhyGrsatTZuRbftE691DQZQRm54AxxrkDEd9gAvctlxhN/AKj14G+zbjZ
1cQK1z3n2aHdLVk7KHpirDRd4UnTpCQmTDQgXj7ljFebItcg2cBNsS1FcRXb
zKuWXq2Zin3XinBF1dhtN2R+79zv3TWDPd4zxvunz4LLcw9EKNOH4ZFg4U+X
fdlDVh+8U++fwgV6//SAbxGswofIuxwaugnOp8kkFYntrYTIuvyOxFfo1TKM
cltgBnepRlQLla6Uq7Smg7pKLJwy566HAYdUcekThLGIqakM0XlmxBGMpG20
BGWGtGMGXOHc1fuJfG2GmOvle91ky3qcANFZJTvtRQSn2lJqXQ9tPCR3dtKI
fZ0JbAgEZy6mak6SVwTggnEU8iqxtVLz8r6E4G/a2EFVprl0uUkNTxeBTBcC
Q4t6t8QLTi/uXF+zoXmHuN7HlLVgU4lVnNbsIZYgbakPEVSKULnfgZM9hK4H
UfCbQsxWycOiKNjYRb3zEucga68iisrQEZjJ/NXVZAvJdtHUmZa+C0rcHYcW
Tgorn9Yc2u6CnrcZEvF1L5aFHnZnEoNNZ1lT1aVWViUC553oFBfw0gVDtz31
XV/8JHqd3qScBUQODsl3lEpki6yIyeNLdtWoySlmxpvSqbDexNgx+tIyAEyd
5CJjKxhQiDkh3zCoOzkLtRTuiICTUDBEjGYASsqo2ZuDRnwtIz5y2ZDCHClq
whoSc1d6jjVDqrxXY2YpOoU0Vw14IIcsUxjbPWaUp6/cr0QmgufbRpP2w0BT
6Hm4lwOsWTi+z4T0x1dse9Sgw8dboU8UR+EtZhggHko2+RsZxXkRdK3Rq23L
370npG87hOQlv9ZX3mX6pDv7UzIYjN0jwycZfBTnqQy1HUavsPTjzkNLgsf2
Wg+1T0qfgFuzc88Rta1z3TMyBjobp6ShZaR410R5qHvFPJkBGWFnMHlutP/v
QoM3oj+YMX0AqpnnlfxD2/1mVdL/mPVEP5HRBf72p+ET44yWMV2D4fug4U8D
n8fLRB7IC5NXRu1+RmqLcv1vhDNhBR9+VorsUfzJLPmCgxrTjU24NhlhWHBG
lTwnsRVlxe2Gn+B0PbZuYoIUa+GrA6et8jtaLev5ZH9yMHk+kQF7LZ/Wis5P
PZDPbZOuj7eYQSsywvgah1LU0G1RbDYw+jH6vWupO8rl0yvrtRgwwj5cXoAI
dKdY071J37Fo/FRdksI/zMzsj34cnoI9cjyDL9vCDpFbj4vFohscIwF0GZxV
SQmqEWVPmqjPTikxFAEukrxgjVP0iAl9jeY2l2yqOcMuVfQWjgnzfGDsl5Ly
I5W1OcGSMm8km+jWyWML9Jn7mokNWkTpbT8caT7TxPcVZL+Zr2UsKY9cJg7T
/UbS5UdnIwlf4yM1RJaqIIhCBhBLVJLz7TTc1kotu8fckQQMPnZ6n7ebwOWa
KXLVtkOLRNkWJKY1OVd4j5ZlPMWaZ6bqJ51ITBWWJbAs1WUsyIbDsaHUFkbN
wNTygKa1wX+IBYlZhOkr0MUfjw3asqyLEpwlaxCLrp7irVx20pRNEQiLwcks
J2pFuZ+2UEQhCYfq+qSwLdEPOZKBD2mgQV7b42/bFwF25AK+KNNzmoSiDRIO
syuhJ97ymubcV8JJ8iAsxV3ZF/u8c8E+dpAFlSEcCavadWJDRUKEMmqU4t/p
gTDKgJY0PGc2wDAJgTiXDLz7y01scQ1ysSMKKqJxzCCpSV93YkfYDdLwbTxC
3xDs62fXM/BHgIYSbvTFVbylO9ohax4+ipk9zGE5zVYV062FTrgSKJUX5Gjm
0Vd2fkDpmaq1UA1VlJrDss/amSXomccVWZWuKMUSGhXWt6CirEE9UqwRVJTb
tkQETjpf8RVSDZ3C4sQNhHDFyHr/vqLcmTM2Wd7clkO+WP+Dz4GNH2qFpl3O
xOcAJGwNm55VhN7meb1Gpt0RObe3SgzsDvOCAyOSLwlDDiyyWgSxWbsHfa4Y
pChIUCSqbuBl7JuhLxJARCLGfnukbuzh4Pt7e/+MuqqRMpdo1qUnOlO3VyN9
ht1Ww5hllHaDiuxhXdr7SlhiiNaYTpDSUySFBQHM5Tsw330+T7RbBPdnUHqK
xjCXT4+x+1Q2AZM80Ihg/TNVq0A0+Rge7I2X5hSG4MNhUjGPuBvpWlCYoAQO
XeAYpL5AhZmrn5sXFCa+wVwiCl8U3PIqeU9jEGGdebLkQgbC59FDiYaheZku
TABpa5O0Mw7nlLA9n5ehBTd8XL+C5Be+wBwZhGH+QNXHrFhsFQLF1ihp4lzO
neo+YvciqTrAW9lW+a/tRRdGP5BUCBKrh8witZ4ml5bkwXHmNC+aihK1bI/f
vjCXq39Q7gqoBVKpub18VTW86aKjuW4Nv2jrrvymUYSSuc13BEWZwoxQV0ZF
w/3kdUMeITREtIaYJQ8PIITgj20CYod6LAUQMHdjxpZ9LGFnDSQswWq5LM43
MCNkz4XIAR+iNR1Eu+0YM46efxK9gJ+sccMBy833h/Z4v/0W/ZOPOQqTfh/T
xXQOsCpJ1tqah54OHjbUmJa5TnPU2EcY2odxD6O2lcYQUMCBMDZ3NzoYRh27
zqD70HD4MngKju6GI517jzA8RP/ZmVMYXh6HADyKDfzRjh5ipMXlbvDPH6O9
yUGQmLvtSWsrwj8SJ/SKPmxbu7PrBIHnqJWQFMrj75gBSZa85ucQTm7gQX9c
+9No0BdfHz2RoPldRMGhX8dpWmuh8JETwSPymzpJxpmzHXnoOQIPssdsh+k+
z1sSCEUmdaVjFZKRw8NzAn1nWHycI/HDO63h9uZLEU4I5fx1AxQNiYEmEqA0
y1008IxMEl5wyDzsBxr2iblSPSc43PoSXb8XowjeBPw0PtcncH92WpTiqwhy
dNimE8csxnKnsk45S9QgRd5u1XZqDaOSY6c9x6T14JVrUOKkkDKtPjF1JZ9X
6KHFdkDEM1vjtIJNRpire6vV9VHi4RgcrmDFFWzI05e3xoFFzrSbddNhtMkm
raTpL/d0y5N5MICgL54vfhxtDZgOzosAn1XFCJdMfiaUjjGgB2P9xeGYLqiF
WGvCx+5AHBti5QdNQ9rLMwvIEINd4lZSyRLnXIcptYjz0mzagQ9VwazIQuIC
zTRy4FOKpQJzV52KO6TPi3VrjLTWN5AZTdlGVBTUdWiGlrwynNXeSLwE7t8j
IcWt8UP9sOFaZnCVjwlCpMBxyzPADqrNRqy6D0Jr7O14Q3I4FrrBzbPwLOiD
RocezPctIkV0bfPXY/FT4PK3sDSHSwO+7m7TQ6HUnoFY8zsu4aRlCOqOackr
PLWFF/EnobT97LKXWJLcYAnm1+3ET6m3CM5a8zeYVA7/V7z9fmJoubXzJlyt
fArz9uSH1IR1+wyIFklyNcb6kh+k3DtqZC5rVW2efe0ZSYPsCOdsaNtOdJim
qYXd4zDVgobL7Il8N0GRalN5c1hb7KB/btOB5okwS2pdaX6PtSszv6lknk08
ErIrdzms1Ftp5T8E1K3GLWGqI1mIJGc4KEHsGXXb8MTNPkASCJJFPCsfOUtq
e9cS+YetDYjnUxTLLXXa7pW9dtmAxYeNheecJf8+d4fuoGe2/mlQh3AWvx8S
09KJqttxDWznj/eWvGkBgHCHxVX/5R/b6p6OJH6pNpZ6jFuRurM9MAtKXfsO
0CLfInXG8BSp/bytlLNj0L2lmH3xSd/6y5Se7Evz4l+tVvvYmj7vFcM3RUhX
eMPKrfZIdRKBzwvnXyGfoSzem5c7NOK5BlxrPgwHGLn4LOSwzmEoL3Ujj2B5
jVOVOz+Pv65SUF9Ak6PXGqPWP4NZwBMv1/pNXogYp6Nwz3O6BJhYJM/V602o
sLKnfdfm0Q7bC0LJml98wn9bFvNPyGN6dGqSW80YLd/AwjVVlaxm8yLWVh1j
OWOh/uoO5QLvnftl3mxTe3pNUlYmwdKYebDZ3La9EjOeGAS9XFDNMgIcAK3z
Hcmxqm6kiJL8qfUgQPF55135if/u/MqXY39kzgt/GRpl3GDNk1fBMEbPB1VZ
G9NJEnZQz13zskMvgnuX8x3QMrJigsd/i29K7Y84Np6wlHbGYEc3QsWJChxe
DjNOopNbSzoN2Wbm4N7spd5PDPXWEBqMlXLo3UNUPSjEPiwpG9vIZ6/g4OjD
YxdAPzF3gaf/IyKJPyFdE0p2T6OBPDSmh+Dgt1BGZ+oxUmbnPvo9OV2bjpLO
Me0vu0Q9KbhasXv7T6QOoXuGzMuuoLkmmKhiaMz9mvWjQ3BfL4oBuHVp6Pwj
iloyEgECD+8poXaPEObJ/1a1MLonE9+BqmYcUGSACc1NMUcmT/3hVbhMf3xG
HQhu1lfJvl2xd1smsfbUCLJ9cfht+Jm6Th3U2T3FZmB4e7dVmlAfU0u0WZYx
tsah0r3c6kMEze3mDSeaOCnNDcihg/0ymtSzYJtqXqhQwqEH/X0mWs4aZIBY
Kl985VhOGsm1D53sa73qfFK+bC9lGMRzxWp86mCLNxhDxEEinpYpaCtxHXa+
CDyXbPpGrwS26iafXIpxoNRF9x7RVQrqC9BtuovYu40obopf+F1PomOKZ+Gw
Q5YQ6RjYJkJZxQh0KlerCT5xpP3j2EHb0TpUeJTa/76+2l27GfJxu2Fc/z61
UrkpvYANbA05us+h6A+PEi2Y0nDbqhqbsPaEnLZdPFsLlnOSB6YGam92ifvV
5gRc6gKRi9IFL8T5HUJQG7a0IGnKiaHXCkgOGfI2ZYFGxGRu7xkJOiiSY6i/
u29U7fhuk2I5LomK6o/1oUgl2zqaPJN90MCntWcL/twtAsRFXwjAvg2NH+m6
b6SeUZyG0yJX7gCwYQBC08XQEa3po6TCU6LLJLm/yrHkUVNhafX3hYeLoUxS
dx3PJM4pgEu8oRQJJ6GQr13s4efHrHZoPJyJlwsjFAPU2pbnRWkEeK5lQpW+
uOEoXROpwTgNwkeQ7VHvJ57QvMV5DdweR2uDif9UqXN7BqpQDhRlkSbStZZQ
EMPDgvQPjTqqtKn9BUk8mNgUJOEMLuCboUTEfP/iUAt3tvK06m2LWcdAzVwP
iOmdEPBCIqRAkcnipSu4cX/+ptw2foPDLdLFw0cRsGkhIExPwuoXFGOAyVxn
iwgpSWl60IUjxM6Ehe0rCsJpw1/ohkvtAl2Z6bfdCyd1UVP4DTdhaT0rrT63
HnvQ+MMkXqbSk80mYLbKU5lly0Y0xc+VnvQvpG5/kp2Fcn1D/REWDYsavOVJ
x8nFgXF9sOcKja0KMa4JiO5y4Cd1WdEtSLhqXN2kT9e+pI0k7fI0WsYJs6El
ZsJmdXO/ozHPJ4ET3Ddbuh9sYD0zqu8qd6uv84xvoI3TO6tP2DxGJH2yMP0v
yq1OxMsUY8yMb899W4jFFaMc7li+YiIelU0mreDxZCgDv9hgTDUcMLHJ6Afh
Ea7dWqW1YbQDina4YPeXFHixsb4bCV2RssK3KwyX5V41nCJzI42GY7WQqdEj
wRDi2nWV85V/sZ9fOZXSAdibmcpm6QoJaK7gQbu0oh/FJ4LG4ufCD7aTjdJs
uhvt2olEtkXWJYJyrGD9hjLsXcPYv+Mov+Gjodo/zqrpV04BwNTfjiobT63p
01Qi8PHKrj2WuxSpIZM90TyKEyrLU8vlW0lTZOmeDceAzdhYxS7hnuBGLzeG
SkLt3aNVo20YsVlMk7vOYaYCA9ejoMoWrcBp0tCCPj8+msgsWFopUrsjKWAH
rBHjTLGKjfCDIdxoblEv2zmKTgM5nm4xdXYg59m0QWo8nqIVA+PFuKYFd4FC
IWWMTl0JIVAewVOy5kcqEpz4X9CVJ0FzoRDaiROnkMZ2e1uuw0rVk32vUBSw
ORlRbDu23ccqzkjUNMmrHGnLJb8ZDkK/jUyLCwprQZoeWVKUe4kx6pRsyVtt
gVQ11d9TKvIsN+H7PTj/cIM5bgqV9FV+Vnh53OvU3LAdiuqe7EHptGR0/sL0
gkQe1QIadeHu1HtZCWjkyHt9ZLDbb9jC+o3Tg4JWcZqvINAI9QDSU1KrphCX
C4Vx2/UyoEAaDs9Y4wY1lJcpu1NDvTskOdBYRzUaospILNk7JnyVNOfIDeHW
WyXHGPFb2oe39rTwpRM3GN9TMQ0pB/1ukl2B4oBWvUxEQxK5iMUL0UKk7s/n
xzzomIsFgVjR307Plg92ffVmBfoe8TktmUdA31pcBiDblFUtVZz5NqTVJxLL
+xrvAeurXUFD/4DpxdfT/Y/y4VspyFPRu53D0ZcZlr0YNmu7BTJuITGlgpJC
Az8ld2PGKunzLYIVSxwsb0g9c+5K3KqtRGxv1nAjsa6MVrEJLYmdJQtTl1xV
Aarf5IrbcDWnNpHBp1n04NjII4vHQckodgcEhXdHLX18GD1xONxf8VT9QLyY
V77MHQdU2gkZ6d0Dkp1jy+3cUwKPuQd7l/RNzTvzNk6C+qRVTFgeX3dLCbvq
qdj+KPoorZf+5oRu+n68Cb4X8VskaW9HYlNlTA3kUgnS0VN/oFJ/X9t7tfKg
QIftAFH2nDv70Z3vMGVLSrD2DkK2OsNandm0z4OrMkJzbrC4b20o8/blauMJ
H2wvRJOMUaGujV4fn6hpXimTJZYgYIOrWKC0OR/VUySX79bOVsba4NKWvv3+
+y9fdC3c0gtjxVvcwzVz4xI1auu63/pD5koKW6oll81vhYImtvw2kh84sH/W
rNVWeOdOhPAS5PI4Fe8q0ArTxA72mdfcipmgYw6SG+XJ83OGpK+pA/obHof0
bg2kF5cJ6IqFV2IniHW9ACX/o74eNHzg/MQm9+jES9OC9k4ZlQOxyHurxWkt
pHy1LllDMGV3ImDYG+pT4uxi0puRRxcKnEnNIWEMv6ezGT7AOWDSW7Jj8tQS
FrbRJE0jTmm3JK0G4/Ffu8L8rv6iUrSut9uGaSCIVnrkL78n9YDwjT9XPVvd
1p4D5Azi0DWy6K9o2Ym/DJRmD7nnvBFfA3EratuFXwE3kfrCGqXvRKiyyBwH
6YFOyvlBwB4+cV9hycFBE0oW20JhMUcSOWkbkU16XwYSJ/YzJTHiHgURp0zy
UHr6lCQbtpXhE6R9TJvqLowXuvekHJhdaLjmUs455x4QkFIOzDFyzi+iZlDK
hnQEzjB3XakpfpiUpXUBpFv0BYIfMQTsasTFNrxtqJolOWhuRaXNxE20AzsM
NJOJg9pRb9OkJqLzLgDOVdlG3wY9p6lNyuBwijctmd7VnW7Fj1GrXRd7YOw4
un288rVqTAwOCoAifYyN+Ystrh9uCEnyVYi2xjfvI2Qfi2fJDdDV4zR2GxUg
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
AAA=

-->

</rfc>
