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


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

]>


<rfc ipr="trust200902" docName="draft-ietf-ippm-responsiveness-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Responsiveness under Working Conditions">Responsiveness under Working Conditions</title>

    <author initials="C." surname="Paasch" fullname="Christoph Paasch">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>cpaasch@apple.com</email>
      </address>
    </author>
    <author initials="R." surname="Meyer" fullname="Randall Meyer">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>rrm@apple.com</email>
      </address>
    </author>
    <author initials="S." surname="Cheshire" fullname="Stuart Cheshire">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>cheshire@apple.com</email>
      </address>
    </author>
    <author initials="W." surname="Hawkins" fullname="Will Hawkins">
      <organization>University of Cincinnati</organization>
      <address>
        <email>hawkinwh@ucmail.uc.edu</email>
      </address>
    </author>

    <date year="2024" month="March" day="01"/>

    <area>Transport</area>
    <workgroup>IP Performance Measurement</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>For many years, a lack of responsiveness, variously called
lag, latency, or bufferbloat, has been recognized
as an unfortunate, but common, symptom in today's networks.
Even after a decade of work on standardizing technical solutions,
it remains a common problem for the end users.</t>

<t>Everyone "knows" that it is "normal" for a video conference to
have problems when somebody else at home is
watching a 4K movie or uploading photos from their phone.
However, there is no technical reason for this to be the case.
In fact, various queue management solutions
have solved the problem.</t>

<t>Our network connections continue to suffer from an unacceptable amount
of latency, not for a lack of technical solutions, but rather a lack of awareness
of the problem and deployment of its solutions.
We believe that creating a tool that measures the problem and matches people's
everyday experience will create the necessary awareness,
and result in a demand for solutions.</t>

<t>This document specifies the "Responsiveness Test" for measuring responsiveness.
It uses common protocols and mechanisms to measure user
experience specifically when the network is under working conditions.
The measurement is expressed as "Round-trips Per Minute" (RPM)
and should be included with goodput (up and down) and
idle latency as critical indicators of network quality.</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<t>For many years, a lack of responsiveness, variously called
lag, latency, or bufferbloat, has been recognized
as an unfortunate, but common, symptom in today's networks <xref target="Bufferbloat"/>.
Solutions like fq_codel <xref target="RFC8290"/>, PIE <xref target="RFC8033"/>, Cake <xref target="Cake"/> or L4S <xref target="RFC9330"/> have been standardized
and are to some extent widely implemented.
Nevertheless, people still suffer from bufferbloat.</t>

<t>Although significant, the impact on user experience can be transitory --
that is, its effect is not always visible to the user.
Whenever a network is actively being used at its full capacity,
buffers can fill up and create latency for traffic.
The duration of those full buffers may be brief:
a medium-sized file transfer, like an email attachment
or uploading photos,
can create bursts of latency spikes.
An example of this is lag occurring during a videoconference,
where a connection is briefly shown as unstable.</t>

<t>These short-lived disruptions make it hard to narrow down the cause.
We believe that it is necessary to create a standardized way to
measure and express responsiveness.</t>

<t>Including the responsiveness-under-working-conditions test
among other measurements of network quality (e.g., goodput
and idle latency) would raise awareness of the problem and
establish the expectation among users that their network providers deploy
solutions.</t>

<section anchor="terminology"><name>Terminology</name>

<t>A word about the term "bufferbloat" -- the undesirable latency
that comes from a router or other network equipment
buffering too much data.
This document uses the term as a general description of bad latency,
using more precise wording where warranted.</t>

<t>"Latency" is a poor measure of responsiveness,
because it can be hard for the general public to understand.
The units are unfamiliar ("what is a millisecond?") and
counterintuitive ("100 msec -- that sounds good --
it's only a tenth of a second!").</t>

<t>Instead, we define the term "responsiveness under working conditions"
to make it clear that we are measuring all, not just idle, conditions,
and use "round-trips per minute" as the unit.
The advantage of using round-trips per minute as the unit are two-fold: First, it allows for a unit
that is "the higher the better". This kind of unit is often more intuitive for end-users.
Second, the range of the values tends to be around the 4-digit integer range which
is also a value easy to compare and read, again allowing for a more intuitive use.
Finally, we abbreviate the unit to "RPM", a wink to the
"revolutions per minute" that we use for car engines.</t>

<t>This document defines an algorithm for the "Responsiveness Test"
that explicitly measures responsiveness under working conditions.</t>

<t>This document imports terminology and concepts from <xref target="RFC9110"/>, such as request
and response header fields and content.</t>

</section>
</section>
<section anchor="design-constraints"><name>Design Constraints</name>

<t>There are many challenges to defining measurements of the Internet:
the dynamic nature of the Internet,
the diverse nature of the traffic,
the large number of devices that affect traffic,
the difficulty of attaining appropriate measurement conditions,
diurnal traffic patterns,
and changing routes.</t>

<t>In order to minimize the effects of these challenges,
it's best to keep the test duration relatively short.</t>

<t>TCP and UDP traffic, or traffic on ports 80 and 443, may take
significantly different paths over the network between source and destination
and be subject to entirely different Quality of Service (QoS) treatment.
The traditional delay measurement tools use ICMP, which may experience even
more drastically different behavior than TCP or UDP.
Thus, a good test will use standard transport-layer traffic -- typical
for people's use of the network --
that is subject to the transport layer's congestion control algorithms
that might reduce the traffic's rate and thus its buffering in the network.</t>

<t>Traditionally, one thinks of bufferbloat happening in the network, i.e., on
routers and switches of the Internet.
However, the networking stacks of the clients and servers can
have huge buffers.
Data sitting in TCP sockets or waiting for the application
to send or read causes artificial latency, and affects user experience
the same way as in-network bufferbloat.</t>

<t>Finally, it is crucial to recognize that significant
queueing only happens on entry to the lowest-capacity
(or "bottleneck") hop on a network path.
For any flow of data between two endpoints
there is always one hop along the path where the capacity
available to that flow at that hop is the lowest among
all the hops of that flow's path at that moment in time.
It is important to understand that the existence of a
lowest-capacity hop on a network path and a buffer to smooth bursts
of data is not itself a problem.
In a heterogeneous network like the Internet it is
inevitable that there must necessarily be some hop
along the path with the lowest capacity for that path.
If that hop were to be improved by increasing its capacity, then some other hop would
become the new lowest-capacity hop for that path.
In this context a "bottleneck" should not be seen as a problem to
be fixed, because any attempt to "fix" the bottleneck is futile --
such a "fix" can never remove the existence of a bottleneck
on a path; it just moves the bottleneck somewhere else.
Arguably, this heterogeneity of the Internet is one of its greatest strengths.
Allowing individual technologies to evolve and improve at their
own pace, without requiring the entire Internet to change in
lock-step, has enabled enormous improvements over the years
in technologies like DSL, cable modems, Ethernet, and Wi-Fi,
each advancing independently as new developments became ready.
As a result of this flexibility we have moved incrementally,
one step at a time, from 56kb/s dial-up modems in the 1990s to
Gb/s home Internet service and Gb/s wireless connectivity today.</t>

<t>Note that in a shared datagram network, conditions do not remain static.
The hop that is the current bottleneck may change from moment to moment.
For example, changes in simultaneous traffic may result in changes
to a flow's share of a given hop. A user moving around
may cause the Wi-Fi transmission rate to vary widely,
from a few Mb/s when far from the Access Point,
all the way up to Gb/s or more when close to the Access Point.</t>

<t>Consequently, if we wish to enjoy the benefits of the Internet's great
flexibility, we need software that embraces and celebrates this
diversity and adapts intelligently to the varying conditions it encounters.</t>

<t>Because significant queueing only happens on entry to the bottleneck
hop, the queue management at this critical hop of the path almost
entirely determines the responsiveness of the entire flow.
If the bottleneck hop's queue management algorithm allows an
excessively large queue to form, this results in excessively large
delays for packets sitting in that queue awaiting transmission,
significantly degrading overall user experience.</t>

<t>In order to discover the depth of the buffer at the bottleneck hop,
the proposed Responsiveness Test mimics normal network operations and data transfers,
with the goal of filling the bottleneck buffer to capacity, and then
measures the resulting end-to-end latency under these so-called working conditions.
A well-managed bottleneck queue keeps its occupancy
under control, resulting in consistently low round-trip times
and consistently good responsiveness.
A poorly managed bottleneck queue will not.</t>

</section>
<section anchor="goals"><name>Goals</name>

<t>The algorithm described here defines the Responsiveness Test that serves as a means of
quantifying user experience of latency in their network connection. Therefore:</t>

<t><list style="numbers">
  <t>Because today's Internet traffic primarily uses HTTP/2 over TLS, the test's
algorithm should use that protocol.  <vspace blankLines='1'/>
As a side note: other types of traffic are gaining in popularity (HTTP/3)
and/or are already being used widely (RTP).
Traffic prioritization and QoS rules on the Internet may
subject traffic to completely different paths:
these could also be measured separately.</t>
  <t>Because the Internet is marked by the deployment of countless middleboxes like
transparent TCP proxies or traffic prioritization for certain types of traffic,
the Responsiveness Test algorithm must take into account their effect on
TCP-handshake <xref target="RFC0793"/>, TLS-handshake, and request/response.</t>
  <t>Because the goal of the test is to educate end users, the results should be expressed in an intuitive, nontechnical form
and not commit the user to spend a significant amount of their time (it is left to the implementation to chose a suitable time-limit and we recommend for
any implementation to allow the user to configure the duration of the test).</t>
</list></t>

</section>
<section anchor="measuring-responsiveness-under-working-conditions"><name>Measuring Responsiveness Under Working Conditions</name>

<t>Overall, the test to measure responsiveness under working conditions proceeds in two steps:</t>

<t><list style="numbers">
  <t>Put the network connection into "working conditions"</t>
  <t>Measure responsiveness of the network.</t>
</list></t>

<t>The following explains how the former and the latter are achieved.</t>

<section anchor="working-conditions"><name>Working Conditions</name>

<t>What are <em>the</em> conditions that best emulate how a network
connection is used? There is no one true answer to this question. It is a
tradeoff between using realistic traffic patterns and pushing the network to
its limits.</t>

<t>The Responsiveness Test defines working conditions as the condition where the path between the
measuring endpoints is utilized at its end-to-end capacity and the queue at the bottleneck link
is at (or beyond) its maximum occupancy. Under these conditions, the network connection's responsiveness
will be at its worst.</t>

<t>The Responsiveness Test algorithm for reaching working conditions combines
multiple standard HTTP transactions with very large data objects according to realistic traffic patterns
to create these conditions.</t>

<t>This allows to create a stable state of working conditions during which the
bottleneck of the path between client and server has its buffer filled
up entirely, without generating DoS-like traffic
patterns (e.g., intentional UDP flooding). This creates a realistic traffic mix
representative of what a typical user's network experiences in normal operation.</t>

<t>Finally, as end-user usage of the network evolves to newer protocols and congestion
control algorithms, it is important that the working conditions also can evolve
to continuously represent a realistic traffic pattern.</t>

<section anchor="single-flow-vs-multi-flow"><name>Single-flow vs multi-flow</name>

<t>A single TCP connection may not be sufficient
to reach the capacity and full buffer occupancy of a path quickly.
Using a 4MB receive window, over a network with a 32 ms round-trip time,
a single TCP connection can achieve up to 1Gb/s throughput.
Additionally, deep buffers along the path between the two endpoints may be
significantly larger than 4MB.
TCP allows larger receive window sizes, up to 1GB. However, most transport stacks
aggressively limit the size of the receive window to avoid consuming too much
memory.</t>

<t>Thus, the only way to achieve full capacity and full buffer occupancy on those
networks is by creating multiple connections, allowing to actively fill the
bottleneck's buffer to achieve maximum working conditions.</t>

<t>Even if a single TCP connection would be able to fill the bottleneck's buffer,
it may take some time for a single TCP connection to ramp
up to full speed. One of the goals of the Responsiveness Test is to help the user
quickly measure their network. As a result, the test must load the network, take its measurements, and then finish
as fast as possible.</t>

<t>Finally, traditional loss-based TCP congestion control algorithms
react aggressively to packet loss by reducing the congestion window.
This reaction (intended by the protocol design) decreases the
queueing within the network, making it harder to determine the
depth of the bottleneck queue reliably.</t>

<t>The purpose of the Responsiveness Test is not to productively move data
across the network, the way a normal application does.
The purpose of the Responsiveness Test is to, as quickly as possible, simulate
a representative traffic load as if real applications were doing
sustained data transfers and measure the resulting round-trip time
occurring under those realistic conditions.
Because of this, using multiple simultaneous parallel connections
allows the Responsiveness Test to complete its task more quickly, in a way that
overall is less disruptive and less wasteful of network capacity
than a test using a single TCP connection that would take longer
to bring the bottleneck hop to a stable saturated state.</t>

<t>One of the configuration parameters for the test is an upper bound on the number of parallel load-generating
connections. We recommend a default value for this parameter of 16.</t>

</section>
<section anchor="parallel-vs-sequential-uplink-and-downlink"><name>Parallel vs Sequential Uplink and Downlink</name>

<t>Poor responsiveness can be caused by queues in either (or both)
the upstream and the downstream direction.
Furthermore, both paths may differ significantly due to access link
conditions (e.g., 5G downstream and LTE upstream) or routing changes
within the ISPs.
To measure responsiveness under working conditions,
the algorithm must explore both directions.</t>

<t>One approach could be to measure responsiveness in the uplink and downlink
in parallel. It would allow for a shorter test run-time.</t>

<t>However, a number of caveats come with measuring in parallel:</t>

<t><list style="symbols">
  <t>Half-duplex links may not permit simultaneous uplink and downlink traffic.
This restriction means the test might not reach the path's capacity in both directions at once and thus not expose
all the potential sources of low responsiveness.</t>
  <t>Debuggability of the results becomes harder:
During parallel measurement it is impossible to differentiate whether
the observed latency happens in the uplink or the downlink direction.</t>
</list></t>

<t>Thus, we recommend testing uplink and downlink sequentially. Parallel testing
is considered a future extension.</t>

</section>
<section anchor="achieving-full-buffer-utilization"><name>Achieving Full Buffer Utilization</name>

<t>The Responsiveness Test gradually increases the number of TCP connections (known as load-generating connections)
and measures "goodput" (the sum of actual data transferred across all connections in a unit of time)
continuously.
By definition, once goodput is maximized, buffers will start filling up, creating the
"standing queue" that is characteristic of bufferbloat. At this moment the test starts
measuring the responsiveness until it, too, reaches saturation.
At this point we are creating the worst-case scenario within the limits of the
realistic traffic pattern.</t>

<t>The algorithm notes that goodput increases rapidly until TCP
connections complete their TCP slow-start phase.
At that point, goodput eventually stalls,
often due to receive window limitations, particularly in cases of
high network bandwidth, high network round-trip time,
low receive window size, or a combination of all three.
The only means to further increase goodput is by
adding more TCP connections to the pool of load-generating connections.
If new connections leave the goodput the same,
full link utilization has been reached.
At this point, adding more connections will allow to achieve full buffer occupancy.
Responsiveness will gradually decrease from now on, until the buffers
are entirely full and reach stability of the responsiveness as well.</t>

</section>
<section anchor="avoiding-test-hardware-bottlenecks"><name>Avoiding Test Hardware Bottlenecks</name>

<t>The Responsiveness Test could be run from various devices which are either consumer devices
or internet infrastructure such as routers. Many routers are cost-sensitive embedded devices
optimised for switching packets rather than terminating TLS connections at line rate. As a
result, they may not have sufficient processing power or memory bandwidth to saturate a
bottleneck link in order to be a useful test client for the responsiveness test.</t>

<t>In order to measure responsiveness from these devices, the test can be conducted without TLS
over plain HTTP. Whenever possible, it is preferred to test using TLS to resemble typical
internet traffic to the maximum extent.</t>

</section>
</section>
<section anchor="test-parameters"><name>Test parameters</name>

<t>A number of parameters can be used to configure the test methodology. The following list
contains the names of those parameters and their default values. The detailed description of the
methodology that follows will explain how these parameters are being used. Experience has shown
that the default values for these parameters allow for a low runtime for the test and produce
accurate results in a wide range of environments.</t>

<texttable>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Explanation</ttcol>
      <ttcol align='left'>Default Value</ttcol>
      <c>MAD</c>
      <c>Moving Average Distance (number of intervals to take into account for the moving average)</c>
      <c>4</c>
      <c>ID</c>
      <c>Interval duration at which the algorithm reevaluates stability</c>
      <c>1 second</c>
      <c>TMP</c>
      <c>Trimmed Mean Percentage to be trimmed</c>
      <c>95%</c>
      <c>SDT</c>
      <c>Standard Deviation Tolerance for stability detection</c>
      <c>5%</c>
      <c>MNP</c>
      <c>Maximum number of parallel transport-layer connections</c>
      <c>16</c>
      <c>MPS</c>
      <c>Maximum responsiveness probes per second</c>
      <c>100</c>
      <c>PTC</c>
      <c>Percentage of Total Capacity the probes are allowed to consume</c>
      <c>5%</c>
</texttable>

</section>
<section anchor="measuring-responsiveness"><name>Measuring Responsiveness</name>

<t>Measuring responsiveness while achieving working conditions is an iterative process.
Moreover, it requires a sufficiently large sample of measurements to have confidence in the results.</t>

<t>The measurement of the responsiveness happens by sending probe-requests.
There are two types of probe requests:</t>

<t><list style="numbers">
  <t>An HTTP GET request on a connection separate from the load-generating connections ("foreign probes").
This probe type mimics the time it takes for a web browser to connect to a new
web server and request the first element of a web page (e.g., "index.html"),
or the startup time for a video streaming client to launch and begin fetching media.</t>
  <t>An HTTP GET request multiplexed on the load-generating connections ("self probes").
This probe type mimics the time it takes for a video streaming client
to skip ahead to a different chapter in the same video stream,
or for a navigation mapping application to react and fetch new map tiles
when the user scrolls the map to view a different area.
In a well functioning system, fetching new data
over an existing connection should take less time than
creating a brand new TLS connection from scratch to do the same thing.</t>
</list></t>

<t>Foreign probes will provide three (3) sets of data-points: First, the duration of the TCP-handshake
(noted hereafter as <spanx style="verb">tcp_f</spanx>).
Second, the TLS round-trip-time (noted <spanx style="verb">tls_f</spanx>). For this, it is important to note that different TLS versions
have a different number of round-trips. Thus, the TLS establishment time needs to be
normalized to the number of round-trips the TLS handshake takes until the connection
is ready to transmit data. In the case that TLS is not being used, it is undefined.
And third, the HTTP elapsed time between issuing the GET
request for a 1-byte object and receiving the entire response (noted <spanx style="verb">http_f</spanx>).</t>

<t>Self probes will provide a single data-point that measures the duration of time between
when the HTTP GET request for the 1-byte object is issued on the load-generating connection and when the
full HTTP response has been received (noted <spanx style="verb">http_s</spanx>). For cases where multiplexing GET requests into
the load generation connections is not possible (e.g. due to only HTTP/1.1 being available), the TCP
stack estimated round-trip-time can be used as a proxy or substitute value.</t>

<t><spanx style="verb">tcp_f</spanx>, <spanx style="verb">tls_f</spanx>, <spanx style="verb">http_f</spanx> and <spanx style="verb">http_s</spanx> are all measured in milliseconds.</t>

<t>The more probes that are sent, the more data available for calculation. In order to generate
as much data as possible, the Responsiveness Test specifies that a client issue these probes regularly.
There is, however, a risk that on low-capacity networks the responsiveness probes
themselves will consume a significant amount of the capacity. Because the test mandates
first saturating capacity before starting to probe for responsiveness, the test will have an
accurate estimate of how much of the capacity the responsiveness probes will consume and never
send more probes than the network can handle.</t>

<t>Limiting the data used by probes can be done by providing an estimate of the number of bytes exchanged for
each of the probe types. Taking TCP and TLS overheads into account, we can estimate
the amount of data exchanged for a foreign probe to be around 5000 bytes.
For self probes we can expect an overhead of no more than 1000 bytes.</t>

<t>Given this information, we recommend that a test client does
not send more than <spanx style="verb">MPS</spanx> (Maximum responsiveness Probes per Second - default to 100) probes per <spanx style="verb">ID</spanx>.
The probes should be spread out equally over the duration of the interval. The test client
should uniformly and randomly select from the active load-generating connections on which to send self probes.</t>

<t>According to the default parameter values, the probes will consume 300 KB (or 2400Kb) of data per second, meaning
a total capacity utilization of 2400 Kbps for the probing.</t>

<t>On high-speed networks, these default parameter values will provide a significant amount of samples, while at
the same time minimizing the probing overhead.
However, on severely capacity-constrained networks the probing traffic could consume
a significant portion of the available capacity. The Responsiveness Test must
adjust its probing frequency in such a way that the probing traffic does not consume
more than <spanx style="verb">PTC</spanx> (Percentage of Total Capacity - default to 5%) of the available capacity.</t>

<section anchor="aggregating-the-measurements"><name>Aggregating the Measurements</name>

<section anchor="for-the-tls-enabled-case"><name>For the TLS-Enabled Case</name>

<t>The algorithm produces sets of 4 times for each probe, namely:
<spanx style="verb">tcp_f</spanx>, <spanx style="verb">tls_f</spanx>, <spanx style="verb">http_f</spanx>, <spanx style="verb">http_l</spanx> (from the previous section).
The responsiveness of the network connection being tested evolves over time as buffers gradually reach saturation. Once
the buffers are saturated, responsiveness will stabilize. Thus, the final calculation of network responsiveness
considers the last MAD (Moving Average Distance - default to 4) intervals worth of completed responsiveness probes.</t>

<t>Over that period of time, a large number of samples will have been collected.
These may be affected by noise in the measurements, and outliers. Thus, to aggregate these
we suggest using a single-sided trimmed mean at the <spanx style="verb">TMP</spanx> (Trimmed Mean Percentage - default to 95%) percentile, thus providing the following numbers:
<spanx style="verb">TM(tcp_f)</spanx>, <spanx style="verb">TM(tls_f)</spanx>, <spanx style="verb">TM(http_f)</spanx>, <spanx style="verb">TM(http_l)</spanx>.</t>

<t>The responsiveness is then calculated as the weighted mean:</t>

<figure><artwork><![CDATA[
Responsiveness = 60000 /
(1/6*(TM(tcp_f) + TM(tls_f) + TM(http_f)) + 1/2*TM(http_s))
]]></artwork></figure>

<t>This responsiveness value presents round-trips per minute (RPM).</t>

</section>
<section anchor="for-the-tcp-only-case"><name>For the TCP-Only Case</name>

<t>If there are no TLS connections being used, then the notion of a normalised round-trip time for the TLS handshake does not apply.
Zeroes cannot be substituted for <spanx style="verb">tls_f</spanx>, as that will result in an artificially low responsiveness value.
Instead, the same principle of giving each contribution to the foreign RTT equal weight, and then giving the foreign and self RTTs
equal weights is applied.</t>

<t>The TCP-only responsiveness is therefore calculated as the weighted mean:</t>

<figure><artwork><![CDATA[
Responsiveness = 60000 /
(1/4*(TM(tcp_f) + TM(http_f)) + 1/2*TM(http_s))
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="final-algorithm"><name>Final Algorithm</name>

<t>Considering the previous two sections, where we explained the meaning of
working conditions and the definition of responsiveness, we can now describe
the design of the final algorithm. In order to measure the worst-case latency, we need to transmit
traffic at the full capacity of the path as well as ensure the buffers are filled
to the maximum.
We can achieve this by continuously adding HTTP sessions to the pool of connections
in an ID (Interval duration - default to 1 second) interval. This technique ensures that we quickly reach full capacity full
buffer occupancy. First, the algorithm reaches stability for the goodput. Once
goodput stability has been achieved, responsiveness probes will be transmitted
until responsiveness stability is reached.</t>

<t>We consider both goodput and responsiveness to be stable when the standard deviation
of the moving averages of the responsiveness calculated in the most-recent MAD intervals is within SDT
(Standard Deviation Tolerance - default to 5%) of the moving average calculated in the most-recent ID.</t>

<t>The following algorithm reaches working conditions of a network
by using HTTP/2 upload (POST) or download (GET) requests of infinitely large
files.
The algorithm is the same for upload and download and uses
the same term "load-generating connection" for each.
The actions of the algorithm take place at regular intervals. For the current draft
the interval is defined as one second.</t>

<t>Where</t>

<t><list style="symbols">
  <t><spanx style="verb">i</spanx>: The index of the current interval. The variable <spanx style="verb">i</spanx> is initialized to <spanx style="verb">0</spanx> when the algorithm begins and
increases by one for each interval.</t>
  <t>moving average aggregate goodput at interval <spanx style="verb">p</spanx>: The number of total bytes of data transferred within
interval <spanx style="verb">p</spanx> and the <spanx style="verb">MAD - 1</spanx> immediately preceding intervals, divided by <spanx style="verb">MAD</spanx> times <spanx style="verb">ID</spanx>.</t>
</list></t>

<t>the steps of the algorithm are:</t>

<t><list style="symbols">
  <t>Create a load-generating connection.</t>
  <t>At each interval:
  <list style="symbols">
      <t>Create an additional load-generating connection.</t>
      <t>If goodput has not saturated:
      <list style="symbols">
          <t>Compute the moving average aggregate goodput at interval <spanx style="verb">i</spanx> as <spanx style="verb">current_average</spanx>.</t>
          <t>If the standard deviation of the past <spanx style="verb">MAD</spanx> average goodput values is less than SDT of the <spanx style="verb">current_average</spanx>, declare goodput saturation and move on to probe responsiveness.</t>
        </list></t>
      <t>If goodput saturation has been declared:
      <list style="symbols">
          <t>Compute the responsiveness at interval <spanx style="verb">i</spanx> as <spanx style="verb">current_responsiveness</spanx>.</t>
          <t>If the standard deviation of the past MAD responsiveness values is less than SDT of the <spanx style="verb">current_responsiveness</spanx>, declare responsiveness saturation and report <spanx style="verb">current_responsiveness</spanx>
as the final test result.</t>
        </list></t>
    </list></t>
</list></t>

<t>In <xref target="goals"/>, it is mentioned that implementations may chose to implement a time-limit
on the duration of the test.
It is left to the implementation what to do when stability is not reached
within that time-frame. For example, an implementation might gather a provisional
responsiveness measurement or let the test run for longer.</t>

<t>Finally, if at any point one of these connections terminates with an error, the test should be aborted.</t>

<section anchor="confidence-of-test-results"><name>Confidence of test-results</name>

<t>As described above, a tool running the algorithm typically defines a time-limit for
the execution of each of the stages. For example, if the tool allocates a total
run-time of 40 seconds, and it executes a full downlink followed by a uplink test,
it may allocate 10 seconds to each of the saturation-stages (downlink capacity saturation, downlink responsiveness saturation, uplink capacity saturation, uplink responsiveness saturation).</t>

<t>As the different stages may or may not reach stability, we can define a "confidence score"
for the different metrics (capacity and responsiveness) the methodology was able to measure.</t>

<t>We define "Low" confidence in the result if the algorithm was not even able to
execute MAD iterations of the specific stage. Meaning, the moving average is
not taking the full window into account.</t>

<t>We define "Medium" confidence if the algorithm was able to execute at least MAD
iterations, but did not reach stability based on standard deviation tolerance.</t>

<t>We define "High" confidence if the algorithm was able to fully reach stability
based on the defined standard deviation tolerance.</t>

<t>It must be noted that depending on the chosen standard deviation tolerance or
other parameters of the methodology and the network-environment it may be that a
measurement never converges to a stable point.
This is expected and part of the dynamic nature of networking and the accompanying
measurement inaccuracies. Which is why the importance of imposing a time-limit
is so crucial, together with an accurate depiction of the "confidence" the methodology
was able to generate. The confidence score should be reported to the user as part of
the main results.</t>

</section>
</section>
</section>
<section anchor="interpreting-responsiveness-results"><name>Interpreting responsiveness results</name>

<t>The described methodology uses a high-level approach to measure responsiveness.
By executing the test with regular HTTP requests a number of elements come into
play that will influence the result. Contrary to more traditional measurement methods
the responsiveness metric is not only influenced by the properties of the
network but can significantly be influenced by the properties of the client
and the server implementations. This is fully intentioinal as the properties of the
client and the server implementations have a direct impact on the perceived responsiveness by the user. This section describes how the different
elements influence responsiveness and how a user may differentiate them
when debugging a network.</t>

<section anchor="elements-influencing-responsiveness"><name>Elements influencing responsiveness</name>

<t>Due to the HTTP-centric approach of the measurement methodology a number of
factors come into play that influence the results. Namely, the client-side
networking stack (from the top of the HTTP-layer all the way down to the physical layer),
the network (including potential transparent HTTP "accelerators"), and the server-side
networking stack. The following outlines how each of these contributes to the responsiveness.</t>

<section anchor="client-side-influence"><name>Client side influence</name>

<t>As the driver of the measurement, the client-side networking stack can have a
large influence on the result. The biggest influence of the client comes
when measuring the responsiveness in the uplink direction. Load-generation will
cause queue-buildup in the transport layer as well as the HTTP layer. Additionally,
if the network's bottleneck is on the first hop, queue-buildup will happen at the
layers below the transport stack (e.g., NIC firmware).</t>

<t>Each of these queue build-ups may cause latency and thus low responsiveness.
A well designed networking stack would ensure that queue-buildup in the TCP layer
is kept at a bare minimum with solutions like TCP_NOTSENT_LOWAT <xref target="RFC9293"/>.
At the HTTP/2 layer it is important that the load-generating data is not interfering
with the latency-measuring probes. For example, the different streams should not
be stacked one after the other but rather be allowed to be multiplexed for
optimal latency. The queue-buildup at these layers would only influence latency
on the probes that are sent on the load-generating connections.</t>

<t>Below the transport layer many places have a potential queue build-up. It is
important to keep these queues at reasonable sizes or that they implement techniques
like FQ-Codel. Depending on the techniques used at these layers, the queue build-up
can influence latency on probes sent on load-generating connections as well as
separate connections. If flow-queuing is used at these layers, the impact on
separate connections will be negligible.</t>

</section>
<section anchor="network-influence"><name>Network influence</name>

<t>The network obviously is a large driver for the responsiveness result.
Propagation delay from the client to the server as well as queuing in the
bottleneck node will cause latency. Beyond these traditional sources of latency,
other factors may influence the results as well. Many networks deploy transparent
TCP Proxies, firewalls doing deep packet-inspection, HTTP "accelerators",...
As the methodology relies on the use of HTTP/2, the responsiveness metric will
be influenced by such devices as well.</t>

<t>The network will influence both kinds of latency probes that the responsiveness
tests sends out. Depending on the network's use of Smart Queue Management and whether
this includes flow-queuing or not, the latency probes on the load-generating
connections may be influenced differently than the probes on the separate
connections.</t>

</section>
<section anchor="server-side-influence"><name>Server side influence</name>

<t>Finally, the server-side introduces the same kind of influence on the responsiveness
as the client-side, with the difference that the responsiveness will be impacted
during the downlink load generation.</t>

</section>
</section>
<section anchor="root-causing-responsiveness"><name>Root-causing Responsiveness</name>

<t>Once a responsiveness result has been generated one might be tempted to try to localize
the source of a potential low responsiveness. The responsiveness measurement
is however aimed at providing a quick, top-level view of the responsiveness
under working conditions the way end-users experience it.
Localizing the source of low responsiveness involves however a set of different
tools and methodologies.</t>

<t>Nevertheless, the Responsiveness Test allows to gain some insight into what the
source of the latency is. To gain this insight, implementations of the responsiveness
test are encouraged to have an optional verbose mode that exposes the inner workings
of the algorithm as well as statistics from the lower layers.
The following is a non-exhaustive list of additional information that can be exposed
in the verbose mode: Idle-latency (measured at the beginning from the initial connections),
achieved capacity on load-generating connections, TM(tcp_f), TM(tls_f), TM(http_f) and TM(http_l)
(and even their raw values), HTTP-protocol (HTTP/1.1, HTTP/2, HTTP/3), transport protocol (TCP, QUIC, ...), congestion-control
algorithm (Cubic, BBR, ...) used on the client-side, ECN or L4S statistics, IP version, ... and many more.</t>

<t>The previous section described the elements that influence
the responsiveness. From there it became apparent that the latency measured
on the load-generating connections and the latency measured on separate connections
may be different due to the different elements.</t>

<t>For example, if the latency measured on separate connections is much less than the
latency measured on the load-generating connections, it is possible to narrow
down the source of the additional latency on the load-generating connections.
As long as the other elements of the network don't do flow-queueing, the additional
latency must come from the queue build-up at the HTTP and TCP layer.
This is because all other bottlenecks in the network that may cause a queue build-up
will be affecting the load-generating connections as well as the separate latency
probing connections in the same way.</t>

<t>Beyond the difference in the latency of the load-generating connections and the
separate connections, another element can provide additional information: Namely
testing against different servers located in different places along the path will
allow, to some extent, the opportunity to separate the network’s path in different segments. For
example, if the cable modem and a more distant ISP server are hosting
responsiveness measurement endpoints, some localization of the issue can be done.
If the RPM to the cable modem is very high, it means that the network segment
from the client endpoint to the cable modem does not have responsiveness issues,
thus allowing the user to conclude that possible responsiveness issues are
beyond the cable modem.
It must be noted, though, that due to the high level approach to the testing
(including HTTP), a low responsiveness to the cable modem does not necessarily
mean that the network between client and cable modem is the problem (as
outlined in the above previous paragraphs).</t>

</section>
</section>
<section anchor="responsiveness-test-server-api"><name>Responsiveness Test Server API</name>

<t>The responsiveness measurement is built upon a foundation of standard protocols:
IP, TCP, TLS, HTTP/2.
On top of this foundation, a minimal amount of new "protocol" is defined,
merely specifying the URLs that used for GET and POST in the process of
executing the test.</t>

<t>Both the client and the server MUST support HTTP/2 over TLS.
The client MUST be able to send a request with a GET or POST method.
The client MUST send the GET with the "Accept-Encoding" header set to "identity" to ensure the
server will not compress the data.
The server MUST be able to respond to both of these
HTTP commands.
The server MUST have the ability to respond to a GET request with content.</t>

<t>The server MUST respond to 4 URLs:</t>

<t><list style="numbers">
  <t>A "small" URL/response:
The server must respond with a status code of 200 (OK) and 1 byte of content.
The actual message content is irrelevant.
The server SHOULD specify the Content-Type header field with the media type "application/octet-stream".
The server SHOULD minimize the size, in bytes, of the response fields that are encoded and sent on the wire.</t>
  <t>A "large" URL/response:
The server must respond with a status code of 200 (OK) and content size of at least 8GB.
The server SHOULD specify the Content-Type header field with the media type "application/octet-stream".
The content can be larger, and may need to grow as network speeds increases over time.
The actual message content is irrelevant.
The client will probably never completely download the object,
but will instead close the connection after reaching working condition
and making its measurements.</t>
  <t>An "upload" URL/response:
The server must handle a POST request with an arbitrary content size.
The server should discard the content.
The actual POST message content is irrelevant.
The client will probably never completely upload the object,
but will instead close the connection after reaching working condition
and making its measurements.</t>
  <t>A .well-known URL <xref target="RFC8615"/> which contains configuration information for
the client to run the test (See <xref target="discovery"/>, below.)</t>
</list></t>

<t>The client begins the responsiveness measurement by querying for the JSON <xref target="RFC8259"/> configuration.
This supplies the URLs for creating the load-generating connections in
the upstream and downstream direction as well as the small object
for the latency measurements.</t>

</section>
<section anchor="discovery"><name>Responsiveness Test Server Discovery</name>

<t>It makes sense for a service provider (either an application service provider like a video conferencing service
or a network access provider like an ISP) to host Responsiveness Test Server instances on their
network so customers can determine what to expect about the quality of their connection to
the service offered by that provider.
However, when a user performs a Responsiveness Test and determines
that they are suffering from poor responsiveness during the connection to that service,
the logical next questions might be,</t>

<t><list style="numbers">
  <t>"What's causing my poor performance?"</t>
  <t>"Is it poor buffer management by my ISP?"</t>
  <t>"Is it poor buffer management in my home Wi-Fi Access point?"</t>
  <t>"Something to do with the service provider?"</t>
  <t>"Something else entirely?"</t>
</list></t>

<t>To help an end user answer these questions, it will be useful for test clients
to be able to easily discover Responsiveness Test Server instances running in various
places in the network (e.g., their home router, their Wi-Fi access point, their ISP's
head-end equipment, etc).</t>

<t>Consider this example scenario: A user has a cable modem
service offering 100 Mb/s download speed, connected via
gigabit Ethernet to one or more Wi-Fi access points in their home,
which then offer service to Wi-Fi client devices at different rates
depending on distance, interference from other traffic, etc.
By having the cable modem itself host a Responsiveness Test Server instance,
the user can then run a test between the cable modem and their computer
or smartphone, to help isolate whether bufferbloat they are experiencing
is occurring in equipment inside the home (like their Wi-Fi access points)
or somewhere outside the home.</t>

<section anchor="well-known-uniform-resource-identifier-uri-for-test-server-discovery"><name>Well-Known Uniform Resource Identifier (URI) For Test Server Discovery</name>

<t>Any organization that wishes to host their own instance of a Responsiveness Test Server can advertise that capability
by hosting at the network quality well-known URI a resource whose content type is application/json and contains a valid JSON object meeting the
following criteria:</t>

<figure><artwork><![CDATA[
{
  "version": 1,
  "urls": {
    "large_download_url":"https://nq.example.com/api/v1/large",
    "small_download_url":"https://nq.example.com/api/v1/small",
    "upload_url":        "https://nq.example.com/api/v1/upload"
  }
  "test_endpoint": "hostname123.provider.com"
}
]]></artwork></figure>

<t>The server SHALL specify the content-type of the resource at the well-known URI as application/json.</t>

<t>The content of the "version" field SHALL be "1". Integer values greater than "1" are reserved
for future versions of this protocol.
The content of the "large_download_url", "small_download_url", and "upload_url" SHALL
all be validly formatted "http" or "https" URLs. See above for the semantics of the fields.
All of the fields in the sample configuration are required except "test_endpoint".
If the test server provider can pin all of the requests for a test run to a specific
host in the service (for a particular run), they can specify that host name in the
"test_endpoint" field.</t>

<t>For purposes of registration of the well-known URI <xref target="RFC8615"/>, the application name is "nq". The media type
of the resource at the well-known URI is "application/json" and the format of the resource is as specified
above. The URI scheme is "https". No additional path components, query strings or fragments are valid
for this well-known URI.</t>

</section>
<section anchor="dns-based-service-discovery-for-test-server-discovery"><name>DNS-Based Service Discovery for Test Server Discovery</name>

<t>To further aid the test client in discovering instances of the Responsiveness Test Server, organizations
wishing to host their own instances of the Test Server MAY advertise their availability using
DNS-Based Service Discovery <xref target="RFC6763"/> using conventional, unicast DNS <xref target="RFC1034"/> or multicast DNS <xref target="RFC6762"/>
on the organization network's local link(s).</t>

<t>The Responsiveness Test Service instances should advertise using the service type <xref target="RFC6335"/>
"_nq._tcp".  Population of the appropriate DNS zone with the
relevant unicast discovery records can be performed
automatically using a Discovery Proxy <xref target="RFC8766"/>,
or in some scenarios simply by having a human
administrator manually enter the required records.</t>

<section anchor="example"><name>Example</name>

<t>An obscure service provider hosting a Responsiveness Test Server instance for their
organization (obs.cr) on the "rpm.obs.cr" host would return the following answers
to PTR and SRV conventional DNS queries:</t>

<figure><artwork><![CDATA[
$ nslookup -q=ptr _nq._tcp.obs.cr.
Non-authoritative answer:
_nq._tcp.obs.crname = rpm._nq._tcp.obs.cr.
$ nslookup -q=srv rpm._nq._tcp.obs.cr.
Non-authoritative answer:
rpm._nq._tcp.obs.crservice = 0 0 443 rpm.obs.cr.
]]></artwork></figure>

<t>Given those conventional DNS query responses, the client would proceed to access the rpm.obs.cr
host on port 443 at the .well-known/nq well-known URI to begin the test.</t>

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

<t>The security considerations that apply to any Active
Measurement of live paths are relevant here. See <xref target="RFC4656"></xref> and <xref target="RFC5357"></xref>.</t>

<t>If server-side resources are a concern, a server can choose to not reply or delay
its response to the initial request for the configuration information through the
.well-known URL.</t>

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

<section anchor="well-known-uri"><name>Well-Known URI</name>

<t>This specification registers the "nq" well-known URI in the
"Well-Known URIs" registry as defined by <xref target="RFC5785"></xref>.</t>

<t>URI suffix: nq</t>

</section>
<section anchor="service-name"><name>Service Name</name>

<t>IANA has added the following value to the "Service Name and Transport
Protocol Port Number Registry" in the System Range.  The registry for
that range requires IETF Review or IESG Approval <xref target="RFC6335"></xref>.</t>

<t>Service Name: nq
Transport Protocol: TCP
Assignee: <contact fullname="Stuart Cheshire"/>
Contact: <contact fullname="Stuart Cheshire"/>
Description: Network Quality test server endpoint</t>

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

<t>Special thanks go to Jeroen Schickendantz and Felix Gaudin for their
enthusiasm around the project and the development
of the Go responsiveness measurement tool and the librespeed implementation.
We also thank Greg White, Lucas Pardue, Sebastian Moeller, Rich Brown, Erik Auerswald, Matt Mathis and Omer Shapira for their constructive feedback on the I-D.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>



<reference anchor='RFC9110' target='https://www.rfc-editor.org/info/rfc9110'>
  <front>
    <title>HTTP Semantics</title>
    <author fullname='R. Fielding' initials='R.' role='editor' surname='Fielding'/>
    <author fullname='M. Nottingham' initials='M.' role='editor' surname='Nottingham'/>
    <author fullname='J. Reschke' initials='J.' role='editor' surname='Reschke'/>
    <date month='June' year='2022'/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='97'/>
  <seriesInfo name='RFC' value='9110'/>
  <seriesInfo name='DOI' value='10.17487/RFC9110'/>
</reference>




    </references>

    <references title='Informative References'>

<reference anchor="Bufferbloat" >
  <front>
    <title>Bufferbloat: Dark Buffers in the Internet</title>
    <author initials="J." surname="Gettys">
      <organization></organization>
    </author>
    <author initials="K." surname="Nichols">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
  <seriesInfo name="Communications of the ACM, Volume 55, Number 1 (2012)" value=""/>
</reference>
<reference anchor="Cake" >
  <front>
    <title>Piece of CAKE: A Comprehensive Queue Management Solution for Home Gateways</title>
    <author initials="T." surname="Høiland-Jørgensen">
      <organization></organization>
    </author>
    <author initials="D." surname="Taht">
      <organization></organization>
    </author>
    <author initials="J." surname="Morton">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
  <seriesInfo name="2018 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN)" value=""/>
</reference>


<reference anchor='RFC0793' target='https://www.rfc-editor.org/info/rfc793'>
  <front>
    <title>Transmission Control Protocol</title>
    <author fullname='J. Postel' initials='J.' surname='Postel'/>
    <date month='September' year='1981'/>
  </front>
  <seriesInfo name='RFC' value='793'/>
  <seriesInfo name='DOI' value='10.17487/RFC0793'/>
</reference>

<reference anchor='RFC1034' target='https://www.rfc-editor.org/info/rfc1034'>
  <front>
    <title>Domain names - concepts and facilities</title>
    <author fullname='P. Mockapetris' initials='P.' surname='Mockapetris'/>
    <date month='November' year='1987'/>
    <abstract>
      <t>This RFC is the revised basic definition of The Domain Name System. It obsoletes RFC-882. This memo describes the domain style names and their used for host address look up and electronic mail forwarding. It discusses the clients and servers in the domain name system and the protocol used between them.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='13'/>
  <seriesInfo name='RFC' value='1034'/>
  <seriesInfo name='DOI' value='10.17487/RFC1034'/>
</reference>

<reference anchor='RFC4656' target='https://www.rfc-editor.org/info/rfc4656'>
  <front>
    <title>A One-way Active Measurement Protocol (OWAMP)</title>
    <author fullname='S. Shalunov' initials='S.' surname='Shalunov'/>
    <author fullname='B. Teitelbaum' initials='B.' surname='Teitelbaum'/>
    <author fullname='A. Karp' initials='A.' surname='Karp'/>
    <author fullname='J. Boote' initials='J.' surname='Boote'/>
    <author fullname='M. Zekauskas' initials='M.' surname='Zekauskas'/>
    <date month='September' year='2006'/>
    <abstract>
      <t>The One-Way Active Measurement Protocol (OWAMP) measures unidirectional characteristics such as one-way delay and one-way loss. High-precision measurement of these one-way IP performance metrics became possible with wider availability of good time sources (such as GPS and CDMA). OWAMP enables the interoperability of these measurements. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='4656'/>
  <seriesInfo name='DOI' value='10.17487/RFC4656'/>
</reference>

<reference anchor='RFC5357' target='https://www.rfc-editor.org/info/rfc5357'>
  <front>
    <title>A Two-Way Active Measurement Protocol (TWAMP)</title>
    <author fullname='K. Hedayat' initials='K.' surname='Hedayat'/>
    <author fullname='R. Krzanowski' initials='R.' surname='Krzanowski'/>
    <author fullname='A. Morton' initials='A.' surname='Morton'/>
    <author fullname='K. Yum' initials='K.' surname='Yum'/>
    <author fullname='J. Babiarz' initials='J.' surname='Babiarz'/>
    <date month='October' year='2008'/>
    <abstract>
      <t>The One-way Active Measurement Protocol (OWAMP), specified in RFC 4656, provides a common protocol for measuring one-way metrics between network devices. OWAMP can be used bi-directionally to measure one-way metrics in both directions between two network elements. However, it does not accommodate round-trip or two-way measurements. This memo specifies a Two-Way Active Measurement Protocol (TWAMP), based on the OWAMP, that adds two-way or round-trip measurement capabilities. The TWAMP measurement architecture is usually comprised of two hosts with specific roles, and this allows for some protocol simplifications, making it an attractive alternative in some circumstances. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='5357'/>
  <seriesInfo name='DOI' value='10.17487/RFC5357'/>
</reference>

<reference anchor='RFC5785' target='https://www.rfc-editor.org/info/rfc5785'>
  <front>
    <title>Defining Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname='M. Nottingham' initials='M.' surname='Nottingham'/>
    <author fullname='E. Hammer-Lahav' initials='E.' surname='Hammer-Lahav'/>
    <date month='April' year='2010'/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='5785'/>
  <seriesInfo name='DOI' value='10.17487/RFC5785'/>
</reference>

<reference anchor='RFC6335' target='https://www.rfc-editor.org/info/rfc6335'>
  <front>
    <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
    <author fullname='M. Cotton' initials='M.' surname='Cotton'/>
    <author fullname='L. Eggert' initials='L.' surname='Eggert'/>
    <author fullname='J. Touch' initials='J.' surname='Touch'/>
    <author fullname='M. Westerlund' initials='M.' surname='Westerlund'/>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <date month='August' year='2011'/>
    <abstract>
      <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry. It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
      <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP). It also updates the DNS SRV specification to clarify what a service name is and how it is registered. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name='BCP' value='165'/>
  <seriesInfo name='RFC' value='6335'/>
  <seriesInfo name='DOI' value='10.17487/RFC6335'/>
</reference>

<reference anchor='RFC6762' target='https://www.rfc-editor.org/info/rfc6762'>
  <front>
    <title>Multicast DNS</title>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <author fullname='M. Krochmal' initials='M.' surname='Krochmal'/>
    <date month='February' year='2013'/>
    <abstract>
      <t>As networked devices become smaller, more portable, and more ubiquitous, the ability to operate with less configured infrastructure is increasingly important. In particular, the ability to look up DNS resource record data types (including, but not limited to, host names) in the absence of a conventional managed DNS server is useful.</t>
      <t>Multicast DNS (mDNS) provides the ability to perform DNS-like operations on the local link in the absence of any conventional Unicast DNS server. In addition, Multicast DNS designates a portion of the DNS namespace to be free for local use, without the need to pay any annual fee, and without the need to set up delegations or otherwise configure a conventional DNS server to answer for those names.</t>
      <t>The primary benefits of Multicast DNS names are that (i) they require little or no administration or configuration to set them up, (ii) they work when no infrastructure is present, and (iii) they work during infrastructure failures.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='6762'/>
  <seriesInfo name='DOI' value='10.17487/RFC6762'/>
</reference>

<reference anchor='RFC6763' target='https://www.rfc-editor.org/info/rfc6763'>
  <front>
    <title>DNS-Based Service Discovery</title>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <author fullname='M. Krochmal' initials='M.' surname='Krochmal'/>
    <date month='February' year='2013'/>
    <abstract>
      <t>This document specifies how DNS resource records are named and structured to facilitate service discovery. Given a type of service that a client is looking for, and a domain in which the client is looking for that service, this mechanism allows clients to discover a list of named instances of that desired service, using standard DNS queries. This mechanism is referred to as DNS-based Service Discovery, or DNS-SD.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='6763'/>
  <seriesInfo name='DOI' value='10.17487/RFC6763'/>
</reference>

<reference anchor='RFC8615' target='https://www.rfc-editor.org/info/rfc8615'>
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname='M. Nottingham' initials='M.' surname='Nottingham'/>
    <date month='May' year='2019'/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8615'/>
  <seriesInfo name='DOI' value='10.17487/RFC8615'/>
</reference>

<reference anchor='RFC8766' target='https://www.rfc-editor.org/info/rfc8766'>
  <front>
    <title>Discovery Proxy for Multicast DNS-Based Service Discovery</title>
    <author fullname='S. Cheshire' initials='S.' surname='Cheshire'/>
    <date month='June' year='2020'/>
    <abstract>
      <t>This document specifies a network proxy that uses Multicast DNS to automatically populate the wide-area unicast Domain Name System namespace with records describing devices and services found on the local link.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8766'/>
  <seriesInfo name='DOI' value='10.17487/RFC8766'/>
</reference>

<reference anchor='RFC8290' target='https://www.rfc-editor.org/info/rfc8290'>
  <front>
    <title>The Flow Queue CoDel Packet Scheduler and Active Queue Management Algorithm</title>
    <author fullname='T. Hoeiland-Joergensen' initials='T.' surname='Hoeiland-Joergensen'/>
    <author fullname='P. McKenney' initials='P.' surname='McKenney'/>
    <author fullname='D. Taht' initials='D.' surname='Taht'/>
    <author fullname='J. Gettys' initials='J.' surname='Gettys'/>
    <author fullname='E. Dumazet' initials='E.' surname='Dumazet'/>
    <date month='January' year='2018'/>
    <abstract>
      <t>This memo presents the FQ-CoDel hybrid packet scheduler and Active Queue Management (AQM) algorithm, a powerful tool for fighting bufferbloat and reducing latency.</t>
      <t>FQ-CoDel mixes packets from multiple flows and reduces the impact of head-of-line blocking from bursty traffic. It provides isolation for low-rate traffic such as DNS, web, and videoconferencing traffic. It improves utilisation across the networking fabric, especially for bidirectional traffic, by keeping queue lengths short, and it can be implemented in a memory- and CPU-efficient fashion across a wide range of hardware.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8290'/>
  <seriesInfo name='DOI' value='10.17487/RFC8290'/>
</reference>

<reference anchor='RFC8033' target='https://www.rfc-editor.org/info/rfc8033'>
  <front>
    <title>Proportional Integral Controller Enhanced (PIE): A Lightweight Control Scheme to Address the Bufferbloat Problem</title>
    <author fullname='R. Pan' initials='R.' surname='Pan'/>
    <author fullname='P. Natarajan' initials='P.' surname='Natarajan'/>
    <author fullname='F. Baker' initials='F.' surname='Baker'/>
    <author fullname='G. White' initials='G.' surname='White'/>
    <date month='February' year='2017'/>
    <abstract>
      <t>Bufferbloat is a phenomenon in which excess buffers in the network cause high latency and latency variation. As more and more interactive applications (e.g., voice over IP, real-time video streaming, and financial transactions) run in the Internet, high latency and latency variation degrade application performance. There is a pressing need to design intelligent queue management schemes that can control latency and latency variation, and hence provide desirable quality of service to users.</t>
      <t>This document presents a lightweight active queue management design called "PIE" (Proportional Integral controller Enhanced) that can effectively control the average queuing latency to a target value. Simulation results, theoretical analysis, and Linux testbed results have shown that PIE can ensure low latency and achieve high link utilization under various congestion situations. The design does not require per-packet timestamps, so it incurs very little overhead and is simple enough to implement in both hardware and software.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='8033'/>
  <seriesInfo name='DOI' value='10.17487/RFC8033'/>
</reference>

<reference anchor='RFC8259' target='https://www.rfc-editor.org/info/rfc8259'>
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname='T. Bray' initials='T.' role='editor' surname='Bray'/>
    <date month='December' year='2017'/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='90'/>
  <seriesInfo name='RFC' value='8259'/>
  <seriesInfo name='DOI' value='10.17487/RFC8259'/>
</reference>

<reference anchor='RFC9293' target='https://www.rfc-editor.org/info/rfc9293'>
  <front>
    <title>Transmission Control Protocol (TCP)</title>
    <author fullname='W. Eddy' initials='W.' role='editor' surname='Eddy'/>
    <date month='August' year='2022'/>
    <abstract>
      <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
    </abstract>
  </front>
  <seriesInfo name='STD' value='7'/>
  <seriesInfo name='RFC' value='9293'/>
  <seriesInfo name='DOI' value='10.17487/RFC9293'/>
</reference>

<reference anchor='RFC9330' target='https://www.rfc-editor.org/info/rfc9330'>
  <front>
    <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
    <author fullname='B. Briscoe' initials='B.' role='editor' surname='Briscoe'/>
    <author fullname='K. De Schepper' initials='K.' surname='De Schepper'/>
    <author fullname='M. Bagnulo' initials='M.' surname='Bagnulo'/>
    <author fullname='G. White' initials='G.' surname='White'/>
    <date month='January' year='2023'/>
    <abstract>
      <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
      <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='9330'/>
  <seriesInfo name='DOI' value='10.17487/RFC9330'/>
</reference>




    </references>


<section anchor="example-server-configuration"><name>Example Server Configuration</name>

<t>This section shows fragments of sample server configurations to host an responsiveness
measurement endpoint.</t>

<section anchor="apache-traffic-server"><name>Apache Traffic Server</name>

<t>Apache Traffic Server starting at version 9.1.0 supports configuration as a responsiveness
server. It requires the generator and the statichit plugin.</t>

<t>The sample remap configuration file then is:</t>

<figure><artwork><![CDATA[
map https://nq.example.com/api/v1/config \
    http://localhost/ \
    @plugin=statichit.so \
    @pparam=--file-path=config.example.com.json \
    @pparam=--mime-type=application/json

map https://nq.example.com/api/v1/large \
    http://localhost/cache/8589934592/ \
    @plugin=generator.so

map https://nq.example.com/api/v1/small \
    http://localhost/cache/1/ \
    @plugin=generator.so

map https://nq.example.com/api/v1/upload \
    http://localhost/ \
    @plugin=generator.so
]]></artwork></figure>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIADtZ4mUAA9V96XIjR5Lm/3yKWPSOiewFUGRdUnFNNkNVlSS26qCK1Mh2
Z9pUCSAIZFciE8rIJAqtVtu8xr7J/J832SdZ/9w9jkyAVLXN2Nhsz9EsABkZ
4eHh/vkZk8kka4u2tGfmnXWbunLFra2sc6arFrYxP9bNh6Jamud1tSjagr7P
8tmssbef/vtFPa/yNb1g0eQ37aSw7c2k2GzWk6Y3wOTkcbbIW3uWzen/L+tm
d2Zcu8gy183WhXM01vVuQ8NcvLz+OpvXC3rNmelosC+yYtOcmbbpXPvw5OTZ
ycMsb2x+Zq6bvKJXNG22pWktm7rb0OOX5tI2N3Wzzqu5Na9t7rrGrm3VZh/s
jn64oN9UrW0q205eYMo0hTavFj/lZV3R+3fWZZvizPxTW8/HxtHwjb1x9Ndu
jT/+mGV5167q5iwzZkL/Z0xRuTPzfGou89zNV/yRUOT5qilcW29W6Vd1Q+s6
32xKS/OYT/kzR++w7Zl5W1n96jJvPpgf8x1/PS9aotbzbmObtqjqsXmelwUt
sSpy8+zJyelj+VXdVS3I+kNVtHZhrloitDP1jTlf26aY5/wru86L8szMNzyj
f8jxtum8Xmf95bybEul2tklW846IlJdl8vl/jaU0zfrOZVxNaROsWxWNTVZy
1XZ50/a/+a+xlrlO6c4F/Tg13+ZbOoMuWc+PBW1L+jEvht53axtHk8TLnhfV
vKiqvC3S9634oe3qH7o5Pph286lddFlW4fy09Dy4/N3Xz5+dnp6cZVlR3aRf
fNXd3NhmVtZ5e8ajxpNB/5nIjP8wNd/Ytt253qffTc2bYr6qS/lYZdQoHdG8
ALHlE0dPmXZlw9EdyQYRAa3DrGgf6vW6q4ieLJawZPz+/PnrsfnHuuzW1jx5
MjZvuvWM5NipOXp4cvrwmEZ5nn+wd8/+muj9b/9alMT7kz/82782S1s5W/V+
8mJqrvNVO1z0a5IcddVb3WVhSSRhM86/e0nchjlvGruyLCXN953tSGLlVb5k
gWWuaN5YjSGqm29rWsI3xDvbfOf2l0/L+YJk58uXSiImQ16aq916U7uiWxsa
51U9p49oLXSI26be1GVBos+ckzg1b2wLMerM0avzN6/P3xzLzp98/uyRMsHp
yaPH+ufjp0+e6p9PHj353P/5+RdP9M+njx6FPz9/+jD+6Qf74ump/8EXnz/1
g33x8NmJ//PkUfjtwyfPPCM+DNN59ugReHIymZh8Rkc1n5Mo/5ooRZJ/R2I8
b0hq56bM5x9A8746GpvbvCnqzpU7QzQp7SIr8+WYft3aar4b0xEys8iMYzop
zsysrWiceb2sij/TE/QRUa/DoWg7orgd0zMtnfj1uq5YY2zaes2sWy/y3WfO
VErkafaS5mFI+xAz5mZh5/mCOQPfYqdYJeXNovgz1G1r5yuwdkn6SFjCjbOi
pbnQqSVmz/WdZtPUs9KumWHA/pa2uiM2oRfijc2OVJwZfajqrRvRD/LW0CiF
MyM+8OWIH8zNbbGwNY1Z0fot1GhbZ6ucWFTHd2ZLTEuTWdtZvdgZWzpraLAV
eLRw2TZv5ytMPDePvzPr+rawIGi3IVpCsZvNqm5rZ24aIg/Ns2jwSWWn2bf1
1tI8x/i0wVimqpPlE6M6PQ/tir5sa9oUXuk8d/T4BX1HfBB21/zMZ2odz1Qg
oCyI/nlLQhkj6NqIUm+7xu8UiFDZucgU+psEfQdyGMfMIStgJsjnc7tpcxrC
5GvI/Iy2M7BTVbdKW8+Ph/aU2afJsfbkl/mW8A6YNlOh5ncZB3lhiag7Xhp9
W7QuDjfNfrREnrIgispmz4l+rexLW9elfLgWiOT2hl5jF+nzja1JGX3mMuzM
jhjZ2I8biB5wxha6h8eVfSBi0UzzZhenPc4wGr2hK1scBvD7Gh+BIMlss2ts
KeHJTnZqY+fFTaETGw3w6LV1rbCrzB+r6h9x4oYWzO+Sw0GYjlSOrI7on1eF
WzMXKRH4sGTJ8nQSEBE7YXpZpDBH4XHxVnHxPODiKa3G+mF5PfRjGpjm6Ijh
SHSM3hGXLCZtU2wcMKt5TbzV2pE5enf5+php5lZ1Vy7A4qS9y25BD26LdmWW
db3YEKscdRthgnpbHeOvrFgQ/ynX4SXzhqYDJitoYqQb64ZVo1/Azx1BlnY3
FTG6Lhb0eJb9DjqkqRcd8/3/N0LV/PJLgh9+/XWaeQXqTFl8sObm55/IsLAl
/VB1za+/js3lxUv9gDQOPgAioE/wX7/+ijm/enwlv4DKoY9YcvC8o5jGzGkn
iOVZOkAQ2o8t9n1LwpQIUqzpEIER7GKavcFRIk4qmWpywGgwnKVUsCTEoi06
LwmfdMuVcQXRCkxZtSwoMTZJPegN8G96POk3LCFhKhW0+zsDi5AFP70Y4sLS
K+atSNrW5CXgBSkAV0CS0VIwPkYlaULsj3nT/icHgF5M208LnFmcgI65u+Wh
bzrIhpzmRjw2zmYK5TCnGyxVuVelh+daFu5kmNEC5RAtuobRjGC6mlQND+yH
W+d4t5nRim/OspzO3ILgzsRhT/AeXf0NtAqzAb2e4S9Ns83nK7YND2incYaJ
6uRmXeNaPjp+mm5DY9ExP6fRPubYXJkfkYT+l/je1PN517BgWoh8UsUa9eo4
27KayxM1g6d5LURSOv/bCse4qxyrFhaSlihA3zTtpCygvBaFa7qN8PkavEs6
fUVMid2r8qaptywgVE120JNDxSAoIMpuelIXnvd43BB3AAx4cYntU6G2J31J
GUNmMX6hNw/cASw3Jyo3J1Fukl50bUYalB6rWREmMvSQ7DJHdrqcjr1M5FOY
SsFjEs4Qok1eAKR4pWT2dWlmmciFWwl2olM0b4XzZD6MpIRgAlr8VGgQ7Cx9
Keo4S7Xa735HyqpZk4VY1ssdHWNoCzojs7rjcWjFzdqMkrM+okMq546I5IqG
QYUuRw4vSUOr8Ck3DQ1EdCIWFoL5Wdmfu2LD3C1j807UpOu6+cos8jafDjQu
K8swIwhiQ/aObUh90DxIlWz8MZzliyDVs85h5HXdgJqkLonMWCE+FPYmmtMJ
ZMGXjV7JYyOWHWZTBw1uDyiUbGaZY8GgKsqYsz2+9dPbdLRvc7At8xWzrAgP
MgmJbSCWSaXk66Is8sYcjbYiAmkG9BFtuQUH/v1IlCib7KBX2xUQbvT705MT
s6Zfyc7kwJH0JsdcB5FatKSI6orOLEErouWKgZuRcf/b6JiPg2ttvhibLYk0
e1NUNtn95pC3bR9VjDJgFT3j85LUscyGhsQSIxQi7Sug80+da/k8jJNhBJGB
rqMmASEbnDYFIblTDixaIWS+uKU9JBiNlcmWH342fVT04bae3NTl4sx8XdDW
QO1gfmSDKCTGL71SMiM8uyqW4GT8ObMtkWhERjZ4leix4AlUIrJqsqAq4b24
XRiVLJ+JWj5XvAmiKYkPl9af/du87MDxFjsppkTOa+JvH08WxRJvIV5Y0mTk
0e2qmK8ycE7pakh0jGGI7iI0yaDPVS42vNn5MgfkxXJBMlnwYL4skr8uKoBM
Zg/xwRYeU/NiafQRAcMR4BcN9UF1c0ascxtgTrqDnjGwzXjtPAdVlsR3+1hb
+JGRV14uawKNq2hEHoTesl8kI+ncFS3xfTAjPpGV9+ZAIIZ0muMDocJS4EFd
wbJScSc47PSUoZuDJMvxSrLzXOvtDLyeeIjoDyBV2HLh/Eg4m5DJ5oUFioIj
G64D2gvHqrXRgwS0S/YBYVjadGYOJhELuoE+St1SZxn+tdhVJGnmpHxbFWvp
b8byG3bO2cFvFPfIT8q8IYarxGNFP1gQS8ytKqBcYFvvgUWBv8nKYo8f0I3M
ON+Qgto0zE+pRZIKBMJMDfxFOqDZ5Dh2XlTAVFrqkW+tKHdSOKAvBBK9Zk3w
QNQmT8xThlYYyTgWMTmjrcJjH6zdqAikDwLKa2yZK6RklANGeX7JG/jDi8uw
YhNhIoCv8M4XJ/y7x48fjRkXtiQqswQu05ggEtBXiyWuaJ63Kmi82iSBs2Vs
X3fN3KqRTdhcXGpMDhIUrpv9iTegpkPVFo3tDf29YhMiwpVtsG3m6Pv66phm
TKhqzUx4LfstO8Aqtsx3vf2Bje74/F48f305FtnD60oQPmG4KmOBsmhy16qp
Gqcys2SuFHyU6XSDkvQ3ERIT6NiYYx3Ge8DGPN7nMZ9A5w1jzXxnI8WhBncb
vCyDmPAuAn5YednTMxocKdGU22Vww4N/xh6WJWhNG4rD2tRllEdOhlmTaoDn
i6xTm54ZerphwMriu3NsgUTgU/Qsd/BUJD2kbs3qmOQqc24CxghwbDa22h+D
9NjUTvFkJghMhIwjC53dJoNj3/dt+UEwLBF7/iH8fk6wHJKFxyLeUYtJ3FWr
bmm94TPNXhCGI2OwbXVy2FxXzz9YHD+SuXnRep2DkRFTUP84YISDc5C+gp4S
uwA4qcVJKYgdg9HOZq0e6oF5yVLH5WvLdkEOL/0kHKOe7Rq0m6jtedPxS2ga
wfRXXBUPa8bOO6yAgZXsA1AWTpwYKSwmiayunXg7MzuiNY1mdduS0LHzD4Tp
VvUGT0WzFSd/ym4NyPkbGoHlK8jpTz/9EBhiU7NqCN5ItY/BLRgVMUMxbzCk
wl2xs3Q2+S1ZmnmwpWmF/Do2IdhjusGwcR1iamQItDEQqjfKGfoksTm/yg+w
rkV50oyLtWWfFyxQ1qU5y5AEEgfbhfawcC3LD2iKbEDDwxQTTtCNZS/HuiaL
Q23jzFNQPQl0/GwJDBz8qhcYcGXpONTA7XDP+uHZLk9Pi/BJRqDkthCnqp86
tDMwrTdWC3Y9iMeFpp0NtwT+soS8YYlyKvJWmeHiJm7I1ooXZ8aeFbLtyPCd
7eCDg/+ZD1vromMDw4szXA0wHgNGJ8wXfCwHfjtkVf7hcB6V+BAYq3wkdujx
svcIgsBYNDiV7TRvxpJtTp/fFB8tYU9vPIHJoc7XG4GR9PVIsHUYGbt2QyCS
CE3yWnCV/hB2l/h9SC3Vt/YA/yQDZcw2WMv/xB6y+YGn3PCFoJecF0QPptl5
s+xoo5mcNJnIJ6pH+9whR1A93kt2VdCLELCtlqTVaTiPuOH4JOO8g7SByx3A
shBIB+B8KxpD99l40z6Dw4R2icwmcBBMdYDMovHuDFH6cUYA/yu2EIqKjtP8
w4TosxEXp63AwQv677pZg+31bQohPQBh72qGk5zOk4/Gi6tXZL/xOVjXC7sm
vf0SrAY4yfP/sZh8XYwzm2PjYKnNde2WZObCMvLJHTMhwUhb1ht5OVhkbVkH
7IhoYCV11Htn1k1Jez0rGM5srfg+13wk+DxgGJbsGTYEawYNc5ZGY4HsT55+
mD0goE8Cf9JtdAFemZ4+e3aCzci+wW84gBRo6hQ6YYH89RY4C0aFd5fdYlbs
ByYd86ZuvTsLPOhWhOQXLJOWTb6OajtxNi1qPkoSR4Mibr3TEUfTwxYW6F0j
cCpyMICY7jmvU0UxAHEtEA8aRp2DY/0pL9wVayJxLjLQQyoMF4Mk+mso6twL
fl6RHLglzCtMcmrORSsjygaszwZsxnPjw4/JM3cI3NJcG8FKNPgt3H3ioh5n
6lC6IS55zfSGYLvJmxCoM+dzSF1zCbU4DloK2p92lobjbYJLB4CUH5+X8Niq
rk4fpx2D9QXTDexJ0OAGDLZl/xuU75/qnXoAKrK99o2tz/TkZwmLsvlcWdp3
V9+0W3Y/sKG6njX53KodSEw0azgNAyyeLUKiBGu4RQ5rE2Z/WRZLOTs6f1Cr
b8ZCyJEcFI8RDKOvVOgmQMZ8GpBJhChtrMDEvfglC6giCeywqr6JCi8v1zWZ
wtEosWJQqwQeWOf6pEoz8Jmqwp6spnd8diCWGl0F6s4hmGo/YofFfBMDVh6j
NSJ3RKW78Dmfhb0HMjaExDdEEpjRbAJyeTtlzNwj3JSzx0N7zy4bcetD0OZi
4KQgdmDMLgo3DyKZxKe48pggAnwUQfXJIwY4zOwaAZADHhMyXNbFHNgIkfaA
fGqahqassKUJBOXjFWQwB/iyrOkhmggCJ14HJVOIoCzCEgF8sA7TCK+QHkPA
RdbWE5gBPqghzhqx2109kSDeQefNOR20spwINyzSqcjewLgXGwxhkE0O17WM
robdOJlJweaeY0iBPQNCjs5F1iUuUw9O/BXbrcOowzm7lOGPumtmbOSS1Gc3
0DdEVvH8JNwszu4ZPcz4xDvHQL1DGyt2C0w1J2CM6M0ZSGTAEA8WNzsNjPUi
c0koSVRhcSjpAG5PmgOdBXuWZadT48WLD35GAOIdN02xFlTMFt2319eXDx4K
yLh+dTUODpfPiKJhxQorRV8Ai2qofIr0M8OwwJGOANnsmaJcsv/VytU3Q9gu
1eVUwCOz6ehAc4iGZ/GIg9oPYHXBzVYy6EjDhhopPXp3fXk8hYHuF4RZFn/W
UAyxwff1lWm60rIM7QFD0ntZ8DLoAOqXLUkQ7vt/2GMHLxUTgJ26s+AlgwW+
yaEpSgCMlPwDNEok/yBWgoqNJCmDlQPDFgmwz+qPiusy8YDkPB1Y70T3jwB9
iW9rsHz25NoGrr29HRAhdIhF406z7dRyBKECtpjz7JT/NBZcV/C4TQiBLAhy
cDBcM8HgdCUuil+N1dXN/tcH3ve6TysvvoK7T5J34MUBEAl5SuNERrkk/yFm
TgDbVdF5jihHFXNpoGNYUgDWIWegaEMEm01WwGHm5qidJV1HZ0dUgLgxR+Ko
KO1NcFeFCL7sBCN+YBsarfNGKj06KQu8FZPYWnZvrNdWsl0yWGL7w7D27E0T
IeJi2akzoR8AFwIes/h6HQI+g13/4a507eytaMEoCNL0l0/03YNP5wSyBMVv
a8b9TgTUpUY192WZcNzoUFTr4dRnat8BUBK/3QrhDG/dIQDBKXArpSAYAEpa
gzglu7FF4MxXCHgvJCR7iDQ/smOdfvp7evT36XpZKLLf2hJyB8fifcE9kvXD
9xBmfy+CWzPY2LvYALJUbitbzDiIjw2LefHb5JAIC1vf3ARHlIbabF4W8O7u
Oeh5qZvOrTwq8IQnmwrql7nRKeEOyQav3g5ss0bywieJg4uxZnCWrWwWY4/B
bca0aAmX/znmhCSgI7hB/GYpqtvDVwR4PnDIrTVw7s3sjiZ0zMOt849kS60j
yJgq63upHiIcdzDlZ8OAVcb4YGb9hOn3rr2HfP14WQMLnCPf+9QkQTADpTMY
f4Vk/KibHfpRYF+uuYYM/JBvpyiagWHNis2x1JYAOztQ72KNLKZxDMnho28K
3Af5HjOZWxtSUgcr0XwWiUdg85PNSm0Rzx/i005c2uwWiQ56RrV2kZEN6e2W
6HeRGD/jxBf11URchbLSLBwCTQIpOMAn8RQEi8ig4UqSYw0fyyLFyzGk2rr4
mDUWakZk862sfiXuDAl2sICOKWcJnmNRqNg+YPrU8Z27EJOmUfLlXpxEvFG8
F5WFkOjnK8bQSLYfGvF+9cTv6z29h441UA7cevLKTBQOUlsldy9Q4SCdlOa0
NpKjvzNXNHhpJ+zVvqUDCd7mfyHTxfGXDG0SEQnnhPdgdhgT3JEJKwtD9WVD
ku4VD7r4QZjNfu6K+QcgtB+cJh2//gqK12IPSU0s6u1YEHB0aPP5ys2jh2bt
hrbGOMvvmDmIpnpEHR6n7PFoVw0y8zYdSYrzRRpXWiDI6VPVBr7pRHz24w2a
0zawZFkQaByPVjiVsKgcYP2uv2iDHDjiDT/Tr6YmxKDgJEgCcBKDyvLlsonW
eOHRE8bx7Dp4BeDLbV2Iadat0xwjUgnrutmxqOlUALMDRJLIAiF7aYL3bTgo
RYArCwmfSJXbxazmIFeTpO1xzL3gV2pkmfMP+5LrM5dY0X5uXr8czF/gHP6C
83wOcsvWo1cf//FvNQfeygn9PmYt0QQGopIxcvgFODL5epPJBjPVCOASxOGS
Jd0wQO+Aow5pMIHiK1tuAgbN9EgFYNizT6cmcRQnQJJtCyRR9sOkYm2Aq5PM
ieieMMircCsk/t7kUKgEL2vH+aep/ExD5SV9P5nlMAeUIvdEjSFUaNSUs2m5
4lnikcBDHE/2CCoZT7hcE+V4JHx6xHpmEQ0+L6rhOqAze4yKDsSKxGsQA5mQ
OsMo8jr/ICElTm1TJ5R32vHjfS/U0J9B2rJA4EQxyqZr4IP6jQ2H+AUVNMub
qcLBHeCMLJ83oEt/F9XPm3stl4STzaK2mvH+aa9va1aInsuSLR+Lc5y0dJab
gTr2GohZDADihtVTOhMnwbsFidFl5ogfyTiwQ7ea5v8Hzk48UQNNkMUcXu8a
w+KiUkzlgbd3NXIyVuge0V7q9YdbgTBPmcqqzKOxuxxN0ZHB56nN3QfxtCsh
xxL5YPlK+j/zHk82ZJ0LmcIa9OLPtnTmLImONLU2RK9Z1+RyujtVrneIIs42
Y4HH5x2ajuQIoqghZtZ3mbKYDWgTaVA56iMZd6IIJ0owbw0Lr4Fya8v5Fj6z
wXsUUDiwQQ7cjLP41DkUM6gC0cFBkwgsE/vNTc2PqdWOYpWbHEEZyfQLpUdh
Ghj49KmHQ5f+FYSFriS2gUSHHzYwYpjqL+ptxRZNdlmzxdDbaM1yZU5i8cKH
XDzlBfvd2ASq29Uxe3u6DYKe+ToYUUj11o8WhKTFi5h93aHcoAGzjPlpzX6C
whGPmBm4zcVnn0vAhuebIEiF20++SV+HGby6fhmmdMzZJQThWXFqPCuRgBdX
lxAaf7P3QdxcA5cWHAE4Cby2sHCnjMQZcMCWc6+S73Z66Oy6uGMLv2NFFViI
LfatOg2BfVVPI2MNcgIc2XTVRLIyYu5PnrDjPL8l5MKGoRVAGo3o5FUocjTf
5uXNZEGTsh95N1xA0RtoirYvXQ5MPq2pkAgMSTnF4+yvjmqcM6wkLurxOLjl
s5jzgOkNKA17GZmaMQELI9C2ALH5QOGmbvVASHadVFTA2z9w40/MCzvrlstc
I88BfIpjUPIqnGrMs+yFEC2c717dVbCMXChqCU5gzoncriwOB7NVPWMLNYZE
fLSuzxYqeAJxk6OmaLfn+2s5gXB5cF9ckBKkw6P80EcyyQWB9x3+6BxZGmBa
Li5y8kLInXMGrHjH14CBUghlfmDvi6R83enBQHys46xBzXDRWEdk1L6sp+OP
ClLOPBkI0vRXUsIWYk8jLdAYmSM2KeC0uQEgR2ZGTz/zOgWBgG/SF7N643Ro
MAQdreMstVxJB+80URe/HwtD+mq5Qt1FcEeNg03G7h5SOmQE+dhatxlHowIA
bMSOGvyLpbEvnXWQaqg7to2ggX7mIMFkDdb6zAB/wvh1LnGZHYjMdrQs0tzA
13U9lqNIZFRFyRvvh2ej0dcApBMX59UEtbHGzW2F6rwUg4pvUA9Xdp+p3w+Q
IQykTtFA3MA6Tb4pFgg/8QKIdVLtGgGMWBScskgCYCI7sFlxGe+5+i94YaG0
h1NdW+FUh6QT0gSS/6/KamCa8upytQI3SG2cIyDFfM71whyjQ6lBzP2lbd4W
i3Y1Nr3P9xwEIrP2jG3OSs7V0xd89iL9GmsFIrMNrDIXVhtr5kDAlF1nuyxf
LEJ1zfAYalxig1JelqN3nkUO6iP5J328tPmtj87IK1tN5xxnbEuyeOqiCEnr
NcGNiwELknZLZpu+ig+ZhjkGhv/QzJ9mAxnFz0YZ5S0ryUmpkLpJB12YLUbp
HXrExMxsfpMWZZBGA+gc6pX0lbnj6LYXrfBvYFksLb8llcN5JV8FNOvulq0B
bxAWkBn7ynSfzS9OVJ6t4DtxpNAf+gvUJhYh1FjdIMu7IaMNWiAUQEgC8hTd
I3YmpCPzLpAAcFAVDPstifQFDNcwOJkD6wJYk6uxOXlZVKlkXmg1OhsCYpMK
c12/uurtMJ3WEvYqQLz4B7LEP7ALaEWq7oPXTyJJjk2LTb2VMjbxG8XDyIE7
NRBo3EFkAKc5ZG/A2QIPBgwaFrXqevaWwmCj8ZNhMcNhVOgzoJz1pEscHx60
E0SljdEqbfiuiUpshBmOUrGbn+wLX0cbbV7BKGTsqvrDyY42F2jN4s3R9gHA
aOZ9MYz9q0DwTispQPYliK5NTCc4Z/t2kZpUuhS2PvYCkQIPCSzVC67P4eyE
JBoH9cEKmUNyjCHytU+Fh+GcvEjtlaLpG1hOxlxYGqNkPu0VHkqkKUxA1IRM
QCWFRgR9QHDwUlgIIeFgal7GfAzINq63zYLrvD8xz0ODERPwz0oBkmht+6Yp
h+jY1UJQGB4FMHKSA5Vz6kMsTrPVbdHUFTvKaPv+Yt4gSfMvmG6Zq175CyFk
md4/smH6F/rZBFX88l/6n/6/8G/62evzF4a+eC0Zg+dwEtB7XxRAOahUiYzB
HHYL/yFYay9rwC/S5x7KSMc09mN+0QW9h/5xoaPEQDZ8BT54lOAKUpGgNYdo
ooz+iznVQkoe9Pr1JQa9bgrC1uhkQxx7acmYkOpEbQmi3/7FPHvyd/zY1Ytr
PHblQ24vuMAOk7muS5o3Vs4iMLwXTri50loHef2G3/1aD9gBz8KwYCaVkbSQ
pzLM5VU6zEDUIJfbSi2fX7ZB/SmevLx+jieT9QKe14SGzHNvm6lDcmadJtog
7dyfZqgWvx7IhbsyCLIsfjOYH+1c6cPpd4Q6xRdTtAxFpG/MnO2614QMajaE
C59RzeG4qBFC3qALRfW9iju4qqFDWDIt+OgqmtUDpWg1NQEPa3lv2c12XAvD
Kghkm2g6i3g0tSIQ8ZmQb8M/81kvmvdwLuLdfPPy2n8jJRSJk8xnE8V82nsw
mzkaIe0LVYqym6gipvPE5rvMABPyeYUsbCB5Csnv8cW1Wzszs4bEY8gsqbQE
C8GwLUbETzQum2TzSDoFKnaNLQMdZcANOE+dQCNkmX+crtp1OToeZ9x+TJAk
IH23ScMY0lhI3EO8XNHONJky76q5lJjM7JJ29MYqEkE/hxzutYeHiez9qx9t
8PjdT1WuS/n3kPTwKjAQgMoHMhJyFJ8KjWO+GRmLm5aRfgDavaE87eQlVX5b
LHONl242WscZPO4aLRXdwrRifE8/Naji4LZqoV8NB51Jj5KedIoQ2P16W9ht
b4porMgU4VodYGCCzhVTjivVdq6163HcG64nQMQAMxf+kdKQPtV9Ipd4hhl4
FVwWk3ODtKQt0azh5C0atg8w5cTQEtCTiD04dSQi7NnllPvUJMdF4IC2ZhD7
yxw9OiZOF5MX855IvDVUph/KtuqlwmVHsH0lMVS7dznzvp1vfrp5f9wvNccC
ot04kawyefp9Wzp+wHyt7uQDAXwuTdB8zLhDGJWz1UMLq3T/okJKavOBqHz8
FY+HNhfilMC8Kk7mYtUpvf8kZ0fx5MFRw3AxTVDOSDTF4vZlEj1bSK67ZGu3
0oPCXPjOJD75FINqiCpiNU8gOIWRrwTbkxFk0Si9WTDYMt8wdMWqfHy9cK7z
HhGSHJmXHHLQTiezHTJdJGlUBCAM+0GlT6gr93u4alvdddr2IFH6XBeiJZHZ
zH7TrR7HJRPPwgHeE3oeefUnz71nXPcpglDyE3V8Mff5JbF8PunNZLnPTG/h
znOvOFK2WpinohjvSqbL1RR15mcUUnokYBu9e7LpwVHLCsY7d9hrwnnEp9NT
ZYxQXHk89kc140wG8Hix5njS8AimBo4vnfu4g9x13YyeatHCghE/baye7LE/
seOw7Uw/TwqPs2LeMMn4pLFIwCTSI4X5pPXJhohvjhVGN5roFatGpXNDCc+V
JgomtqrS0SJ2Hrq69KOpd8US0+5qnOGkqpj5x5s5MtPGLsVv5vEQxNUqBjSa
wn2QUWg/4csLUYKQqHEAfcng4Ik1KeRbf3I8RL0nRTdEIfopxmKcAt3TX5kA
F+8tBev7Sc04m17QiaaFiOq/2YvGJSY+T07kbRVtOM9mmBkMTt6EwSzvXvxg
xaz4iKYZV2YPeKXfeA5MDLnLKRKv4Of00oo5wMcO9XFl+QWyUOXTW3FoQVsn
K+jLeggWtKyTyJ3kL7P3LOmcJHgJGkaSGHyjBohw4AHAINezGTkwMk9eLMG8
sL88/95LEfNIFXu/U8uTE7KMeKpSbudSUaxv4kZOWKyfEse6ayEx0/Y0GSX7
hmvrpJOXb3gLH2M/oqN5gYmPCUkQGQRY3D8e/D2Ze+/N0R3W3mW09gQ9mElw
PCBr6+TkOLUI31+8eK+ZFvJhzJF3Gy7lh9/J/izO0ljINAA13rAXb0uyisyX
glRoZbwuJSELqKzGP4i8oGWwXySh6l7AzWnDhaA2pkyyRehql+aypl6XGGAX
/8s4NWx7J+cRbd53X3Fg/OHjk5PvZseBk6IRPWaXOyJqaH4Jgzkc0NTFTQ9i
DPPdbBPzC/BSgZhvKw4MTDjNKsi3cfAMHp76Pig4JNrE4HVjb2C3sb0Cay5t
s+JPuk4qMHXSYIJNTfrLciNGWSV6rEmrm2TivYG8F1F81krcrD9boNOEjaKe
ijL5Llc4wvRZvpCGVK0Lr71hkKB1UFp57jNYDs4P50zrO2SKyVG7vH5OR+1e
90jveD35u+N71qL+f6SOLWNQLekp7/gXv1MYz3h48lKrvZ8TMBoGztQJ6IIR
8liK26RlFYQr8/eY/abl7uweAOL/Kmm94Thu0DYK0QUnp+9YRMW9NRUpKBRY
BXGAcnVNSBYhAg7MXQibxoCMhlRiXNK89a1BQt5rk2T4jPf8SRqBnXGlQGqt
3CD5L4U/aZLSIG3fB8m1mQYyCeHnPLrLy9ljg8fHiauTRpd0Ox+rHFYZRuH1
VuRrzlkYRb3wCF56pPbbN+nxTpAEw+s5GeV2zs3xrlmIaD9Labkieryq0VRP
/Qb7WZQk8Ul2N9HQqyXdcRky/7Mtgi7L5X4e1wREWwR/KWSkr8B4f/36kpjr
Lkdrj4DPcJA28mUhuLNzCdJoe3ECIYoj9r5+fcQcfgx+xj/A5f4fwum9f5XH
7xVLD7N2eN+rwCyC7jkGbpHPoms7y7K//vWvwxDjl+bpCRDAg+zo9MHT3x+F
WZn/YcKk5G+dE/51+uDh7/0n7viYBw7JNenwkjmmqYzurrZ53PZ3OhQozy8n
b2H5iDSR0mx1SRKCGUbhUnu5Dd2K6xCI1txNjvcNYtpB2fVt+iBs4Xwiifi/
bVMLpAwZ/N5qErQWBFWupgXze9L9uUq6DPla3wP0msaGiUENbhrcYqBe4aWY
6FbSuipayKzzrjFhNwGN766vBQ8pJySZx8to5ftf5x6g0GMuS58TrzZccFxD
dq27w3bpQWaUst3/AI58vMeRv8WF8Oxz5rQ597pHui1AQkYAocqCK/hCvrz2
7LQ+kqbt0RU9IWXiUEmJzz4MyTeH2kMrIEfQ3tdYS+M6acanekmkflCafZM3
TdtNsltCtyrf/iHxM2WhQFl92r16g17vBIn7S61OeE2qxbRQqR9o5X66aWkI
2w6oTEirajQ3gr0sznKvgr0UjjQZWM7KBamw/fhZ30RQhHvcQ/XgQS6L/Rn9
KSvvbZKekD7xWnR3nyD4V7aXlZF6SNOAnWYlhaBZ6MwqKSUKBnyCSfxdcC/5
ssw9WJAifd/CmnazRZ0YuxgHv49ja6o+J6jw1ijjS8qin0vSLDKkA7BlqSnJ
wfkWqvQWPmToG/H3454BWO2l9AYB4FU4kjLgV6sEpETsUTifn3X14jo7ujda
eReQ7c/qN15/8WKvpnZ/ew8ceNEmWv462ymq0G4D0kqbcPjbq2vOAuZkR/7o
m5f0SXALcoiZJUZs/4GW3VpMEGeiXXhYC9yEZt0xkdL/Az0PErOJe+vebZyO
Au7W983D4vp8zoELkoZzLgtVh1jctmnQ175NEF+GlaWWNpagrmvIF+6WxMcW
PAqRiyzf98X7MzagOKYWPEk6aN9oRyIRMyo9xJ5fyN3ouH9/8j6ycFwJB9dY
XmcmSdqb7XhGwQwJr6JJDfgpQstwkuLUzPuNriACX7G2xZ3k7fI011MYnqcT
Bwka5T0OyMSc0hrXHApkVkGjabuQRGndhLHhRl+CmPHUe7WtxGWSCVugUH1/
f3NurzExz30R7N08A4qct30q8V1g4eGKRX0oVbp7IDxEiM6TESKR3UfeUpKr
iCZ8TVCnvYD/ts0gzkB8ShnoJ33q/VQH1k4/+wIuakUyGISW/o3+PerZ8KUl
bH4jx0Kf3HsnSiHnJfcI8cogmIxSkIPyI4FvPr7ezwkfkCt5PCgTfcVByg1z
/O6hU/+nfyO5wK+HAO0n0Grw3kiyoarrU66xXMN51zByuZVLsJVUJzAkl+y3
X37hKkG095Aw21rKqK06Ovs9K5y2PtPGXuFLbfsmDTAyDUEdal7h21Te012D
664lzit3DaXaPdQmEBYI6cy5xDInN/C9iUQOvdeQjNIfX4oclv6uHbZUHR/Z
bEDsXiJJQ3NOErk5qxMfcrVTr8/pDffBq3aanV2HcibXT431SZVWa/7hsG6a
ukliD9HFm89QXrJQx9TzmAKDoS1rdc6BydDKL7Yxosdu2SfBt/7QpCtvAyQq
TpIKy11sBp62M4H3n6OhH+288/uZhgMcnAJuQPdC97yuJf13rtX3rBIyXx/D
jrATVYfq00BbNX4V/54RaqiYEKgigj73NRVYfqih9e8yp2FYbjeTzjecoYlM
3RyFFwQsHH80jq+/8zCO/VwOPq/f3fk0bP9zDQiHgL5ODWviS3h2SV1OOBLB
sNJrBXIzSrKj3Jys0FHmgXkce21RAUTr7tVe9+d3rLZfzLjcImiqZTR6NARl
68tHr+rt6M7sLM8Rke+2qvUsX4gmA2e69QKO29AhzW+dXsok1OHWMWDo8SEF
WUhIppX4VDD/NGc/jUz1V/Gab5HpL+TQ1D0p/IyRB21VDWRx6nKJ0aJYHNo/
I6XMybVviWppPd7vz+9bkl+fPjuseTd8bRZeGyx3qb+8bwoXWuY9k2Zgqh+k
zSi7BzSbA8rh/vUQQ2fSSSxJp/UmTMJwHgiqsTFJkmONHveZZo7kWSqsJcma
SET/pU38Q73pRjpQXut1PRIitGJDoFTET2S/lX/SuNvPDAy0JjMZfd56Mygq
iRTPC0jGHzkKBgtvtfMqj5N9RH5zhZq4ZhMtiq7pte+XDdfukmvVgq4IoWja
Ai3n06knMmA0JGqWMofPIhCzYig5Eu0jOCPmBXFaWe48wTJxiRRVkokpd4nZ
hvB6eyCVNKira/ECqb5Kt1/6kkvUrUTr2ljMeWe2PteBqabSU69BfCKat940
3UUt0bQuU9MdtTCTU1c2pY9IsT+CjNayk5sRg2ibQh+TXSMNPSUmlfQsSPlC
1ieG6h7agFD2IIedi+FlabsBvnQ2uByyUMDUSTVCv5iXL5D7zUF8BNiztaaE
DrCf+pYKp0LFt9wRp527Y35JB6C7hzYhn63hbKZwqxmPieAC5yENKKbL4TvK
ZG7qywwMFbuDBeWXhT2OWzk0EGiu0uVL+uvmu0HZKA24lhStBdeqytmNncoI
ob0cvmX/DGTZiy70xwVPTuCXAQ8EPg9CcchBKiAj62a4/RJ3/AXONZFzDzEt
becbDjWOEw7gmFCWCDrJqYphxjb2nOUZS6p72g1YLhxT5+Zq57h5Ev/sWMq3
PcMeFeGWsFgcnLZF5GM6Qh069AYWNzoeDxjp8ISH1SkcJquUGxIoKIBc4gc2
uGT3rjNjxC1szL0wAzkjbGvQSPjAdu0Rd+/6B83oAftnEjiMu1VXPSmDRc0K
ieUlP0qPsNwPJrx5b5Fpv6g5FjGbV6nbgvuglGUmuVZcAjuZdUW56DZ+hMFV
Hqkn3XOJfDM1vf5IWdGLRaMbTq8nva5dsrm4K3L/9RpMRSK/uvczfg38Ab6p
4qDLkc9bf3PxHOOuUcwH7P2yxxHSW4VfM+k2avHy+sPtmr7O/VD9urTH1cBG
TLiI+y2tA0KUwfc0HtIVCVW8IACBD3bTSnf1GV9ShHwQ9CaCVnP9qy7puZ/e
vL2+evnm+qdXb388v9aLkx6ih6eWbVrvrpUtu7OD2NCF1bvlAcpdrliJvYqV
QpPIehow7xuHQ0sHOfAuueEgE1/8/AODVKu3JeMpgY3JZbmzXpnLzPaKAmC6
cpljvNVETlGf4rJa3mBmINmhvgYOt/B5pXQgl/MTihC4Tfg+e8o+8N1T7GsO
CjFKxj5batvIrJc17q9V8kzsxGWNi5Ol1Qqaghl/60SL4szowQkhI5cxH339
/eQ5rkydmhdDiB9/Gi79TOmX9i/38+UbNfeIaeqQsu/pd18+WRQtWain6fVv
ubjhRuYTvJs9xPdNMICMg4OF6FNll2Wx1J5U0ARv/A2oUQtcJ2qtnt3qRbh8
yaD2cBT9cEctqvfHXRJ4yrXyQ+6ECno3lsskICoRtWHFktWdiNKKNlGT5lIh
hgxaNNNUwqR4NW3Q4W96lHPnMQZE4kFMEeqnpRw5JJtJW+RUu3MLu0tpejyG
NLZb1PVL/ybpnSeFyJOigtUvnpQDkGA8nU69Gk6xEZpjxTbR2p1JxN740CYo
/GZ1t4eaOTnN123HGvF03wfWAQcccWdh7+rYVGrszyFr2SBxfCthjRDq3tGL
2lJXdLWGCfY9H7bXSYN+yfFvpbkJx4j4GmnXPyDEjyRux6ns9nM8LMt6HR3U
AE9IFYR6uTMhdbk/oD9sWV8qckNJYeshxoqN4PqwDyrIZ9W1PvDnr4k8BKJS
UvsGtxGZjeONQX4Zc3vXVgXxIFLELrJFhFrBXzgoeRDL4F1dI3VBwqbD0su3
3EfnsICIwQ5vt4t2FIc2PCG458dnQLAtCl8o4oISAZNr7aR7ZtArBzAMq8i7
feEAJFoEYPJiLfI1SS2XHAN4LDZqt3O12cEQeXZno2lvT4TrPNMW+ria9JWs
zRM9ru5AXlFRaUZjmDfyMDkmGexCuXNPOtd4MVJwrl//zm687HA7YN9Qly/+
dGKHOd4ctse2ykpZnGp67goQXh/WI+ska2loLB+mpNSbc++LOb2Ar0DwJbPI
gN+oeKe1zBC/wW08xt/lWfvWPwUdyrAfzqc7JPHSqHP40hx0jXFpVSs6OYia
nQ6yC1gfVnU1sR9XxP6SPl44KS6NcdMk816mp0UMMstFpvg4XcaZuViUduIp
eRSKcXxHaYS+K0k51olqzLzXtmic+ZSUJEnoXkgyNiE9axzzBcdJopYURYQc
xuyIL86WMgO0QGjyrQYJj0W9TUJHySNf8zQOektvUxgn0DH+nDTq2Hz/w8Xz
sSGdeDxOullOtDtmcvHD0fNuhss0v/rqnfxeoJL34qZy8eXzN9AUrx5fJXs+
NheXvh6RB5CjA7UPD5jvSTlIS05cfXhN8MX03RQH3GNkQejWNVyVq9dXkf0n
zoJosygTeB7IfhuUpz3je8+atHI7zdBSzRdtmEX05MQP/eqkQHUvNvapb+Oo
LABIDCGLtbv/+G8sNLQbSRqiyT3xWbgnvi+c0nyGiNl/08g5dxwY9U4AQY9h
swdZ6Iu6+gw1NBGa2BDTie+P6+2cuDniYe7bGv7UM1jk4+dN6ej2DxfkkShT
mzI29Rlc9ym8Fd0A+dC2CX3jOXHbK6RPs2R6mCgYmb7wYdABLaCcLV97FhF8
ilh8hy+/XTefyv4H7SA43Hrbx+I4FLQcFNtn6lnMfPM7vgrbpcXM/n5TCdZy
flpyPYuYwHv3OZal9EnlPHfWr9LnRhtMbyAP0SJuJwVHuphkJ//vv/wfvUSz
9z5nl3JO4aXIhsc0uXxP78GUak0uJ2jRyzLYYw1uh5DmffekEoRm32NZhIK0
fpUWF2Mm5Xvhcq53l6+9pElnRjzNdwYgWsLH3Ld2zPuXcuhas6Fl6Sd1aOyQ
Cc5YYi/j2aFEK2OHWOy4vepdacK2h9HObip7Do4DGmazyNfJNKZ7EUjsO5qv
j2XkRAZzC7f9mFGr4SBsUOJ+hqA4Hvs2PnuJoXeSI7mINOPyiT1qH7gGYbBp
3kDCFZ5HOQEucVWHjE1O4IhqFDy9bPLNyh1LjO0QElU76vzy4mDBRC9O6ViM
tabbcMuSG5QGBE4MQdxwIcFZdkEgg5EG3yklwGSK6rgQGkCAKAwDsrK7EjGi
UPCGNg8jP+goSZAcEyG5eE0i/TvPSz+8e6XM3PmOZagyB0GRauqppd1mEA/Z
DwJCYtZq4R2OSr3+gYZyHQuS4f1Zgmb1Of5h0t7dScNgX6OvVwxghjRRnqDY
FPuDOKtTwI+DATrCdYmbdvKSoDxYdOTvtHdy4egIcdqWJN2IMxBCxnqmC/E3
nXEhU2O1ozd3XeAZpOtNliGMIp7Uuo0+8YxVKQpgcy5pHw6x8u0EfVpDf6y8
18CAFwk8Kh3KhmMlzz3mbdcmO2bkiIeIWeizcN3UWfo4ywb/uG4B8GqHoNiC
Ic3DkxNz9PY7QeWnRjoo3MTZYDRtTLrG0V5a/x17yBtcQnqb+1/qe6++ffvD
qxeeY5kOz+WhyTV6yujW3RS2XMQt5oxWaTozStq7PKjnrSXgzT7x0aH3aDGo
EFxaT6InL5JsxwPT0MpLEzc1bMOFZjukLmvcrzqVRjtmxD7L/0BCexL6yyRC
pswX33z1n0tJPxNVrHJ3xlgtl12oH1k2iP7Gy1645tclSdOhMPJvZRk9+r4q
eIb2/SFdJd5U5xPbGddwh49xhqCHOhm5Osrfr7pK8ZqGSu6+jEha8/qLB/o3
MxADPOJOSyNJsv8tFpA+BLT5LOH6wg+1XrNCkiLS/e/tt0Z8cPEmtEwbd6hH
VxWg/0HE1QKC/3TSPsbZmvLdmdJEmYgrsbkvnp4++fVXrZUPTRT7ve9Tr4jP
yIxBAWSjejVnjq4sLu7z15nukNvLMdHpcZbSSQsCDvrCI0KQRvRy+a2PX/zh
6u0bnfrDJ89o6r25qpUFPVoW6lZi/c0dTdImxfcZJUW13+X+UIf7PVtqzTYd
72xIfRzYyn5L7oVPLzz9zC+/i7SUPDhud4TequGWFr2wWg2jxhxpT1cchKR5
197vONbmG4uBjGzFcbRYfprV6eVF2pV/8HgFK+SYvX243OeeRYHBc760qlYP
VEggQrIZnWqySLQZaLyKxKdk+34as1pbBqNIMpbSFWnTQ6Ntf/yKa7a2NAcp
OIxhk4fmBZy1oEk3G9uA4eEyPOhsBTeE+42zGNDkWCyXsAV33+bAZQuJt75/
q0640pXmPNa+RUvOYanI2AzX9rngdR8zPBnhBkFuk69Xf+zktboMkPzvR/zD
C744mr/UUrvkXmUiDj1Jm/kpP0anoZ1cnC7XfOsd22zH6QBXNYCn9thY1FFp
Dhlx7/e2dLGNMn2L6xr4piCkqeulneFSQx9zdtHN5J0i2pKXT2JsNsI31CXI
k85lwVe06hXMn8TCPp2dCKG9lTN1HQwcOJr3ISzKBJNGyf4jIV+ekM9/Q1vx
mcuAO/jiQrSt3Ehej23nx9NYWit2j/oOQsv1M39H+4obTiW2X9Y7F1gFGn3y
3etB+zPsGHsGpbNzW+TZssDVCK15CfFSiTnAJQZ69fr+Wjw5dO3jLDRgreTt
gRloKHnc97XxEc/UdcPXp2e9vN+FtlYYh6wQ9kTx6dMrg/WeWpCNczTJZAgH
MLWIWy7BZjF2+OQPuEDOKNN4Lo7RirWhNuhJL1obOnK8xOJCoQZy1iGYulkR
OcfhYqzC1WVyVUTa5j9KnBCaKuTehnh5EG5v8UzDEZ2F4ArmwiO50vAOHnTH
PCf6oRRmE8v2HtfrTAEovhNAIZ17QDZx4l6wlUhwmfTRD+8ujjkL56COy7Lz
CoUGy7zynijNeXUryYzjLZGp4l2e/hJOvGejuDp6gQBa4dv8IbjiE9F33mNm
Bq4Tr1p6gOlCYqOyui2XIXk8yPjf1+mrBfAnp3VSAVTlCLYUC0Ew2jtvbW24
7yFGq+YNcviLXKv0f8mMGWm4Y3RmTtGyc9Q1paN//MJ1VmI2/eRP70/05ehs
hLiPO3vwoPp5qsJhShz3IN8UD25PH4ilNZbnGbn8bc+LSazPC7CV54z+5zee
V5xPz/+K9eDI/OQ9gTTICHuDhjSnDx9Ng8Km50fZr77pRWK8nb961bPddGsm
vDXRMpXd85dUDrZ3fwPVR+D32ee4+71Qa1DeThpldDqacub5MjZhWnJ9pvay
px8Yrazj+14YJOrdKr6/ZnBkxevQD83hwI6PD+6jmJjpDsmE+XqcmRWmLLmG
fo2bNxaycSNIddlCtsXc1ADbi0/QY1tn17hrfh7iKmLzT7Pzsux/lIQQ9K7E
xMAQknBb5gXasCHjkBninyNHBCe0FKfJvgcsyoEB9C6I7w1J9oKSQ+WcFGRo
MU/GosXPTVXRkTwRL+/Ac8d6pQDnuQdGy1sRTmBUnwA1nLlQQANxelOdk0YV
ywLNsVLn+4AnExtNg1IJoJeXOjOqfh5J4kR0R2SfxvN4esj0o+CaFJbYOz4F
B5F8L8dFxjwhE8CYbr6yOjFhn6l5U6fhGo6CQPeRsuNQBBt5yMVE3J+bETe5
hEWYNZhDs3AHWn8JoolevLmafMWFRVe6idGEurlb8VzHm1DyYhHZy7elrAIq
FH0aDJi77xmUl4x7+gwXkDmPhO9QZmHQdKqvz/9XT4HhIe0YJs5ORvzZfatn
Dnr6+dNHZCqLfcC1SXpfMe4wob2nN9IY8tvTk0eP6bfAdEhn7X9JAz389Vcf
1+7p7JgexkElviXjiEMF1/eQquCooSeBOmXikmXG6eFkgS5zefSIjkU2+on0
y0/tfEN8Zi7rTdK0Sw9MU28arp3AMv4MwOpNkcw7cQIZgrXNXRebRehjqdYU
2L0jQzVvtW7VN7aKFL/k1q5ycj9/+pROrlymIhE3D88d7k7boEwmANLcrLo1
Gn0u4GdlycDll5W0PLOVz0QOslLnqDlsL0XJAk/hRrE539UyNPoD5PkUhOsF
fQGImuz1EQ0/nTfH3oU7ajbrqXw2EgaXPObGkmrTZPrY6YMNN7bCLq/fsbC5
evePPbbknYJUKKxTEPTfTeXKuv7Qbczk5y83bWP8vuuLp9mbuprQ5qyQZZLr
fZN41Vk2+CkLzi8NJr03SP89rrk9/LO733Xg534TvjQn9D+PHz8ykV5TATO+
/afCyn1KhHZPviel9zgyoTn4JA5khfHMJ+EtoueQ8ozwEmag+iBxChJOG6oH
NpSXRXTwsePqyhJrQfp4A1SFnCIy/XLe+1LDAGjnxZMkxH/OXTyz17Z3ZULJ
NzfwNZECC/SAwgwRCPJPdLAeP33y9I/MOvjXk0dPPv/jlBuVpTmaXmHpjRQc
DCa7daw+M4UN81WtLQWkSBYzRPMYJEFn8KWGgIbvGaDpW8Ou2Hc7TfWibpY4
Ay8sE/Ti/M35HjEH9tW7C23z5qGLDC0YwjcgBBLYU/GKSvqDEahT+MEX4fo6
XBJGTNDPv3gCgrI6xyUZH89M9bN0+PJSG3kWRHJMnT0MfMFT/6RLCzol2yh9
UHJjfCIZss8lkewS7PlGCsve6fxGHp9d8UUA5h2a9E6NZorqGsQvjZoDvs4m
XPJx8fL6axpJskAb+ufVN+YcKgEdOP5JtcgfuZt6nB0vNszO+Nmdcavvc8fV
NfSjX3755artkAP9nAzVFb3vV9JHiBrl8/aur1/Eq4XOQj7/92pwptjW40cw
yPkc+1naxVL7f16BCVCzRlbFBzIyalD5D+iSV5mr+aqYf6DH6dj8mQn9tS2L
j+abHCkHiUinoVakvnK39n2NW4ljh570HLlFKkPNTgQPKr+p7/PaS98Fn9ZW
zPBTyKZ+Kim3L8tLV8sazDe0lShWbu3YvOpIF+NSykVH/7qyM9LMBR3V1zXx
MMDVOziRvmqIl8fmZVN8MOckId02Lxdj85qMGPy/VSHZRW9xq9nViqzOJo+L
N9KYVq6hNjc0vxkKpFSfXUzQoAo3F+FT7IDqVq8gn6dn3R/MeO3E1iUQNnTh
DFInfTg6OPJqmFZ7KHNH8O75Bn1IcIK4x5zMihT/oY9j03E6HmplmmfT0+mJ
zzcYBnxyt5cHrtF9rv0Jhwuk0hBK3cSEBmww8SCSqTpSHj7QLjSg5eSbwfvQ
fEvcZ4VX9/jR/f4DGcL8Mzsg8FP6JSNPEPOBfv4PMoUvw5ymxHD+K+4A8OVk
gtdPoHK+lDHTt03ZjzN8Yo1SeSDRL4fGU/YJM5e6nDsmPscOPvjiyRfPnj16
/OTZw+FKAr1pJZ/yMolJ3fuy03/vOzSs+Wlb0RscW/3/AEh5KvIvuAAA

-->

</rfc>

