<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-thomson-ppm-l1-bound-sum-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="Prio L1 Bound Sum">A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions</title>
    <seriesInfo name="Internet-Draft" value="draft-thomson-ppm-l1-bound-sum-01"/>
    <author fullname="Martin Thomson">
      <organization>Mozilla</organization>
      <address>
        <email>mt@lowentropy.net</email>
      </address>
    </author>
    <author fullname="David Cook">
      <organization>ISRG</organization>
      <address>
        <email>divergentdave@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="June" day="27"/>
    <area>Security</area>
    <workgroup>Privacy Preserving Measurement</workgroup>
    <keyword>vectors</keyword>
    <keyword>manhattan</keyword>
    <keyword>multi-dimensional</keyword>
    <abstract>
      <?line 48?>

<t>A Prio Verifiable Distributed Aggregation Function is defined
that supports vector or histogram addition,
where the sum of the values in the contribution is less than a chosen value.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://martinthomson.github.io/prio-l1-bound-sum/draft-thomson-ppm-l1-bound-sum.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-thomson-ppm-l1-bound-sum/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Privacy Preserving Measurement Working Group mailing list (<eref target="mailto:ppm@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ppm/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ppm/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/martinthomson/prio-l1-bound-sum"/>.</t>
    </note>
  </front>
  <middle>
    <?line 55?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Existing Prio instantiations of a Verifiable Distributed Aggregation Function (VDAF)
<xref target="VDAF"/>
all support a simple summation of measurements.
From Prio3Count (<xref section="7.4.1" sectionFormat="of" target="VDAF"/>),
which adds measurements containing a single one or a zero value,
to Prio3SumVec (<xref section="7.4.3" sectionFormat="of" target="VDAF"/>),
which adds measurements containing a vector where each dimension is a limited number of bits,
all instantations take the same basic form.</t>
      <t>One case that is presently not included in the suite of instantiations
is the addition of vectors or histogram contributions,
where each measurement has an L1 bound.
The L1 norm of a vector is defined as the sum of its components.
An L1 bound limits that sum to some maximum.</t>
      <t>This document defines the Prio3L1BoundSum instantiation.
This instantiation limits the L1 norm of a vector or histogram
to a value that is one less than a chosen power of 2,
or 2<sup>n</sup>-1.
This choice significantly reduces the size of the encoding
relative to a more flexible limit.</t>
      <t>This instantiation has similarities with other instantiations.
Unlike Prio3Histogram (<xref section="7.4.4" sectionFormat="of" target="VDAF"/>),
in which measurements need to have an L1 norm of exactly 1,
a valid measurement for Prio3L1BoundSum can have an L1 norm equal to any value
between 0 and the chosen limit.
Unlike Prio3MultiHotCountVec (<xref section="7.4.5" sectionFormat="of" target="VDAF"/>),
in which each component can only be zero or one,
components in Prio3L1BoundSum can take any value up to the L1 bound
as long as their sum is within that bound.</t>
      <t><xref target="def"/> defines the Prio3L1BoundSum VDAF.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses the terminology and functions defined in <xref section="2" sectionFormat="of" target="VDAF"/>.</t>
    </section>
    <section anchor="def">
      <name>Prio3L1BoundSum Definition</name>
      <t>The Prio3L1BoundSum instantiation of Prio <xref target="CGB17"/>
supports the addition of a vector of integers.</t>
      <t>The instantiation is summarized in <xref target="_table-l1-bound-sum"/>.</t>
      <table anchor="_table-l1-bound-sum">
        <name>Prio3L1BoundSum Parameters</name>
        <thead>
          <tr>
            <th align="left">Parameter</th>
            <th align="left">Value</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">field</td>
            <td align="left">Field128 (<xref section="6.1.2" sectionFormat="of" target="VDAF"/>)</td>
          </tr>
          <tr>
            <td align="left">Valid</td>
            <td align="left">L1BoundSum(field, length, bits, chunk_length)</td>
          </tr>
          <tr>
            <td align="left">PROOFS</td>
            <td align="left">1</td>
          </tr>
          <tr>
            <td align="left">XOF</td>
            <td align="left">XofTurboShake128 (<xref section="6.2.1" sectionFormat="of" target="VDAF"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>The function takes three parameters:
<tt>length</tt>, <tt>bits</tt>, and <tt>chunk_length</tt>.
The vector contains "<tt>length</tt>" components,
each of which is a non-negative integer less than 2<sup><tt>bits</tt></sup>.</t>
      <section anchor="chunk-length-selection">
        <name>Chunk Length Selection</name>
        <t>The <tt>chunk_length</tt> parameter can be chosen
in approximately the same way as for Prio3SumVec,
as detailed in <xref section="7.4.3.1" sectionFormat="of" target="VDAF"/>.
The difference is that Prio3L1BoundSum involves validation of
<tt>bits * (length + 1)</tt> values,
which might increase the most efficient value for <tt>chunk_length</tt>.</t>
      </section>
      <section anchor="encoding-and-decoding">
        <name>Encoding and Decoding</name>
        <t>The encoded form of each measurement appends a bitwise decomposition
of the L1 norm (the sum of the vector components) to the encoding:</t>
        <sourcecode type="python"><![CDATA[
def encode(self, measurement: list[int]) -> list[F]:
    encoded = []
    weight = self.field(0)
    for v in measurement:
        weight += v
        encoded += self.field.encode_into_bit_vector(v, self.bits)
    w_bits = self.field.encode_into_bit_vector(weight, self.bits)
    return encoded + w_bits
]]></sourcecode>
        <t>The encoded measurement has a total length of <tt>(length + 1) * bits</tt>.</t>
        <t>This extra information is not included in the output share
that is submitted for aggregation.
That is, the <tt>truncate()</tt> function emits only the core measurements.</t>
        <sourcecode type="python"><![CDATA[
def truncate(self, meas: list[F]) -> list[F]:
    return [
       self.field.decode_from_bit_vector(m)
       for m in chunks(meas, self.bits)
    ]
]]></sourcecode>
        <t>This uses a <tt>chunks(v, c)</tt> function that takes a list of values, <tt>v</tt>,
and a chunk length, <tt>c</tt>,
to split <tt>v</tt> into multiple lists from <tt>v</tt>,
where each chunk has a length <tt>c</tt>.</t>
        <t>The <tt>decode()</tt> function is therefore identical to that in Prio3SumVec.</t>
        <sourcecode type="python"><![CDATA[
def decode(self, output: list[F], _count) -> list[int]:
    return [x.as_unsigned() for x in output]
]]></sourcecode>
      </section>
      <section anchor="validity-circuit">
        <name>Validity Circuit</name>
        <t>The validity circuit for Prio3L1BoundSum uses an extended version
of the validity circuit used by Prio3SumVec,
see <xref section="7.4.3" sectionFormat="of" target="VDAF"/>.</t>
        <t>The encoded measurement is checked
to ensure that every component of the vector –
plus the added L1 norm –
is encoded in the specified number of bits.
That is, the circuit checks that each component has a value between
0 (inclusive) and 2<sup><tt>bits</tt></sup> (exclusive)
by checking that each of the first "<tt>bits</tt>" bits of the value
are either zero or one.
This process is identical to the Prio3SumVec check,
except that one additional value is checked.</t>
        <t>The validity circuit then checks whether the added L1 norm value
is consistent with the encoded vector elements.
The L1 norm is checked by decoding the measurement values,
including the encoded L1 norm,
recomputing the L1 norm as the sum of the individual components, and
subtracting the reported and computed values
to confirm that they are identical.</t>
        <t>The complete circuit is specified in <xref target="fig-eval"/>.</t>
        <figure anchor="fig-eval">
          <name>Evaluation function for Prio3L1BoundSum</name>
          <sourcecode type="python"><![CDATA[
def eval(self, meas: list[F],
         joint_rand: list[F], num_shares: int) -> list[F]:
    assert len(meas) == (self.length + 1) * self.bits
    shares_inv = self.field(num_shares).inv()
    parallel_sum = ParallelSum(Mul(), chunk_length)

    num_chunks = ceil(len(meas) / self.chunk_length)
    pad_len = self.chunk_length * num_chunks - len(meas)
    meas += [self.field(0)] * pad_len

    range_check = self.field(0)
    for (r, m) in zip(joint_rand, chunks(meas, self.chunk_length)):
        inputs = []
        for i in range(self.chunk_length):
            inputs += [
                r**(i + 1) * m[i],
                m[i] - shares_inv,
            ]
        range_check += parallel_sum.eval(self.field, inputs)

    components = [
        self.field.decode_from_bit_vector(m)
        for m in chunks(meas, self.bits)
    ]
    observed_weight = sum(components[:self.length])
    claimed_weight = components[self.length]
    weight_check = observed_weight - claimed_weight

    return [range_check, weight_check]
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The Prio3L1BoundSum VDAF is subject to the same considerations
as other Prio-based VDAFs.
These considerations are detailed in <xref section="9" sectionFormat="of" target="VDAF"/>.</t>
      <t>In particular, this instantiation uses Field128 to ensure robustness
despite the use of joint randomness in proofs.
Joint randomness increases the risk of an attacker finding
a combination of invalid inputs that passes validation.
A larger field increases the computational cost
of finding such a combination.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers a codepoint for Prio3L1BoundSum
in the "Verifiable Distributed Aggregation Functions (VDAF)" registry
as defined by <xref section="10" sectionFormat="of" target="VDAF"/>.
This entry contains the following fields:</t>
      <dl spacing="compact">
        <dt>Value:</dt>
        <dd>
          <t>0xTBD</t>
        </dd>
        <dt>Scheme:</dt>
        <dd>
          <t>Prio3L1BoundSum</t>
        </dd>
        <dt>Type:</dt>
        <dd>
          <t>VDAF</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>RFCXXXX (this document)</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="VDAF">
          <front>
            <title>Verifiable Distributed Aggregation Functions</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="David Cook" initials="D." surname="Cook">
              <organization>ISRG</organization>
            </author>
            <author fullname="Christopher Patton" initials="C." surname="Patton">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Phillipp Schoppmann" initials="P." surname="Schoppmann">
              <organization>Google</organization>
            </author>
            <date day="17" month="June" year="2025"/>
            <abstract>
              <t>   This document describes Verifiable Distributed Aggregation Functions
   (VDAFs), a family of multi-party protocols for computing aggregate
   statistics over user measurements.  These protocols are designed to
   ensure that, as long as at least one aggregation server executes the
   protocol honestly, individual measurements are never seen by any
   server in the clear.  At the same time, VDAFs allow the servers to
   detect if a malicious or misconfigured client submitted an invalid
   measurement.  Two concrete VDAFs are specified, one for general-
   purpose aggregation (Prio3) and another for heavy hitters (Poplar1).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vdaf-15"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="CGB17" target="https://dl.acm.org/doi/10.5555/3154630.3154652">
          <front>
            <title>Prio: Private, Robust, and Scalable Computation of Aggregate Statistics</title>
            <author initials="D." surname="Boneh" fullname="Dan Boneh">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs" fullname="Henry Corrigan-Gibbs">
              <organization/>
            </author>
            <date year="2017"/>
          </front>
          <refcontent>USENIX Symposium on Networked Systems Design and Implementation (NSDI)</refcontent>
        </reference>
      </references>
    </references>
    <?line 289?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Chris Patton provided extensive input into the construction of this VDAF.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA5Vaa3IbN7b+j1Xg0n+ohKRE25lkWFEmsmTFmrItX0vOzZTL
JYHdIIlRPzgAmhLtODV7mA3MWu5SZiXznQM0u5tkUonKFbJB4Lwf30FnOBwK
b3ymJ7J3It9YU8qLwnlVeKO8KQs5K638USceH1dV7uS98QupCvlyLF+XNpfP
yqpIJTaeloW3ZlrRKdcTajq1egWqTBO7w0bQ6IlEeT0v7XoinU+FSMukUDkk
SK2a+aFflLkri+FymQ+z8XBK54auyodHY+GqaW6cAwu/XuLExfPrc1FU+VTb
iUhBdiISsNeFq9xEeltpARmeCGW1gixXOqms8eueuC/t3dyW1TJIuFLJGtpr
p+3KFHP5SitXWZ3rwvfEnV5jezoRcihXbApHX3NVLJSHqfihyrwZpgYnSDqV
iZUuKogj5e9lI2XQqfd/kI1+/YEO0nquTIZ1GOR7o/1sVNo5LSubLLC88H7p
JoeHtIuWzEqP6m2HtHA4teW904c4f0jn5nBhNcXJXFlvimjvwyUc1TE47c1g
U+c7XFpnRoHUyJS7pw9/25ujhc+znhCqwg5LtgU3KWdVloVg6L1iTvI6EOjx
z1BJFeYjh+ZEvio/mixT/IuORsr991l5D4PacrkeFZoMu0P6TK1Miogt7/aR
vbh6+0OHZgqT2jlopmqlv5/T6igpYR9RIAVwagVHC1PMmicpT394Nv56wnTq
BKNUmEiOA68H8m05rZwfIJuQF4nK1DTTECpfVj7kXjmTJ/O51XNsl1e06LxJ
XJB5Yzj+G8qg2hlS81lZ6MXW+gtd2DWIW2ug6vAHM5063sJJIx8fjb/mR6tn
SCAPXSHvu6vnry9+klfrfFk6U+WU5q+1p9zREHntvEZFONPOzAvW4iJfZhzN
Qf7+66uzi4MgrlewIIjWcZRmI5XkHKNpaQ7HR6Ov8Hf4ZPzV0z89ORrx51eP
hRgOh1JNnbcq8ULEEvWjtmZm2F5nsAmXHUhUG4t4n1dFwl+Mk6memUKnwiNf
pauWy9J6F1MZvpcL0CjnVuVSpamhUwNxv9BWS7/QOJCTJ+jrSmWVdhJRSU9J
q+IRm0w7hx/gASWTRYkqFA6MRFAjN2maaSEeocQiPNOKBRTi+QP5FQnPupl2
+XXEWf0hffs/np2cH4hPn/6HvhxfDM9GxvrZMJnZ+XCVqtnnz0JlWW0HUHeG
3EZ65pu4y5vK5Ebi3JY5S/fkFPnrZf/TJ5RS3vv16OloTCeI2+fPB2Q5kyzI
kq5Dhc2lTEGKEs9iDp6IVHKAkh+1LYO1BsKXgRd6BTrPNrMnf5xZ9HRwqVY4
sCnU5DclM5MbMmjoJMRgarwbsJ2iP6I7vLqLUYG0klPlTEItMoePL6FLohz9
jDAD3SUV+sJna1mUWCiSrErBJEaPq8CSWHUdLozjn+tIpB2x6XRDtR19ro5X
Vq5lCLlQLnZrrrwjcQ3aeKLCFWIrGqdJE6lcO+4NWxMVoAixcNJQC3ZzMuZV
LuE5V8IuuXoweUVGuV4Q4TKpWJrAIZBnF78cMyyAp7tmGIWDnbWG234N2tah
GFIhnjbuoFjbk6JLdAt2+eOBAInH3yIxviu+PaSP4TgKgr0mgUlQ6JCIiWKv
Wo0Ujto481HXVUIXSZki8oTVGbcDydLkJRw0y/SDoTxmZWoDdfUknyEnqZsj
BHTEXCVI261gGYl3RWbuojFfbGJjK2WedlIG8ReyppMwhYbnIecCLS5GTG1h
/YDaC33HSAiyKVpnO8QIIW47ExbaoaT/UamMTVGsg2vEFM1EwwdH3D24pgan
ROu0tXtFCOtF6bkC7akLX+1XkjNiE78sWFlAmakONYcCp0DRaUKcEnSfPpz6
G9lltSRdYjByOgj4LSup4nBMGMs5YYL/OOsRiDENUZ+RDJ8//2ZKkDbUPB4R
uAaeDCWITHVGp0woGJzSwKiSQKoDbnp3dd0bhE/5+pK/v33+v+8u3j4/o+9X
L05evtx8EXHH1YvLdy/Pmm/NydPLV6+evz4Lh7EqO0ui9+rkb70AYnqXb64v
Ll+fvOyFItdOfWU5DWB2oEdtURs9lxqRapegjoXC+Oz0zf//e/xUonu9PT99
PB7/GSYKD9+Mv36KB9S5InBjN4ZHGG8t1HKpFWWIpLKdqKXxKnMD8oZblPcI
SFRImPOL92SZDxP57TRZjp9+FxdI4c5ibbPOIttsd2XncDDinqU9bDbW7Kxv
Wbor78nfOs+13VuL3/4lQ1zJ4fibv3wntutw5WLEwRO5KcqsnK/ZprOIIppm
AHM2efa4ybEQl9sR28Sl/PSIAjxE52/WeqLJyOfTJ8bMwCcbjLbdCZtiP+M4
mmvrRoFHlya0ZTxjUZejEp7wU2cGYS1+lm8UaibC0cqf5Y+c2z+LnydD+odf
Z0ZnKX45p8/x42/adedPo/GoZZMDOkgkDB1o9O0zjQG6TzH3i0EAFyh1VXF3
E9bCyTdvLy/Pr3B0zI8/XZ7j+0/l7Lqy0/Jqgfqzw/9xB3zh2KeJfLSraRhB
jnvbjtio7nrRVXUEcLkjB1it5XKzbSJug8S3A3lLetyGZLxta3MbYEZ0VYRi
qEz10V4LUAwEV2joEOo147ECA2PByHalaz+3enfo0YF9aNQcjSiTJIR8yVzk
lc50RNgkTVfCRiWu7dO681DjQCGxJQAMJiNUmA3Yu1drqiWbdhfg6YCqfqqh
YbadLYxW2/4JZknNbIZKVABPmIiddvNjVWYrmJ+7bZ0lgjWWX8h+UEJ+KccH
t3EoqaFwbuYLBptWBywKNFY6L/UMuMVQ8of2RWpsO41t+Dyil9hnIpRhyRnY
QMtZDQy20SaV4CIlD0LSewP+qWZXO85gEQFSjQj62+NVHTB1cBzULbaGVBiz
f/nlF7lcY/Yt0DpmUaa+09ls0JZlAgzh/HsEz4cDOfwuPJ1/CPNyrcixfP+B
F+41m+1YEp0Rp2v/6CBcG0CiFTm2TTxO15uDXx7L1Watpv5lm9worN5AoPIG
1rkJyvZXg7CJXBsY3t+wm3/P4cB9hwJ6a2WLRo5IkkzXdeTOpAB7o2nGQkVu
uW3HGkKPc66GrfoBY7nc3HuEsrtv1ikrv6wwIiyAAkSNx/kuz/sQT1I1syyl
CW/hxi5vvUVNQjL2Eeyb8qR5FmAMEGZx4Ivu0LodKRsyTaxM6rDYDZFow/e1
V1vOoJiGM2YYitvOyA/qvaQPJXEo8a5PrHac9KF2B0zB/VjFfHQUE0lbV7ZY
qMeKpeShMKS9vF3dogYhV1Vgt+kyt8ktz9JumRlP26iSluGmcskTiIMFSYtA
ozVBBkIhIqL/QS022tugf8cbYWi1ekZuMClB1SSA/eDtol0yd10TKQbHhGDZ
uGYgbxKC/I2LKKe7TnoYKXdTFTSe6bR/wA54IK6BVjQ1VTduzsav5amxCSbw
oNKqXk3C6t6ZJjipoKhHkUPYrtAPW1VthwgOpHK67nYLh3b6qxcao19PTx5C
dXJH11ilpAtuG0dbDTnWrRGnW0z/889/iWVWbaAUyNbll36iLI7c6nuJpU4w
4+7chmxlZa0kCxXb2NasFeIntJs46Ykj2efi4NDZD7jF7DZz2dcP9RYB+zEL
6kgNk6jjzFgkQy8c7rGYnas6uveX2vDk3Jr24lCPLp8QpqABvBuyunMBxfyB
Ux4SvfRBCLpLqHEpDgUdGxeNfiWsQLmoLYZ0Y7l2/RJEN3yJ5RDwZEu+AvCt
2Iju1Vld7toXO40kFH9pbOIBDLRiqkYOoVzXO2oOkdhAWO7hla831Fy690Se
MXhqVialOb+F8MjN9OaG73BrIlYTwqcREDEQ6JNWLBFFOHSHd/NY+zDf8QS5
8VO0MB3MgOI2Fqa+sglgRmMzMx9q0OXs2gYPWN/XDgabXi7/XqLc3FhI2apI
yIwbbmY4Ytqlqe4eyjltPdVOLv4H8vhYMqNRt51uegKfCiTR5VddJNKwOxjh
x35oIIRgs0xnN+SAY4by9Ejzxqsq6x9sTRiCDxGp0GVwJNEm6zcyHgae3VOB
U0rPtVDtDdChRXLYaMwH6RvBoPcdWPUBhyLJIBSsO9c3HLG/CsH6Fj46IJd+
NMt+45XBnibb0eCgAWumQJS5BvXVtA2RZSH6u+eb4y0SpFNnndX44ou+qT2b
vzftMIp/tAorNY7ubmnEapsEzNq+Hm2idhTnyiBU9HDrIqst5B/BL78XwNB/
yym9zNTpTQOhEYCNEO8nrbD/EE4mmTJ5+0hre3t3C5pvomOb33CLmugAg5YZ
Bx1KARLQsFzXh3pEfk41KL77ruHNHjhA87J4JOs3ynRD51CdrGpdyu27z4vI
9++wed1reLpMuueRN+HCl2gMp4qgBB0Phd5t7+fiuH8K/XMHXlwUFEsooVWm
7CDc0XVvThjmbC47Gqxh+W1lgYZJV3ZLenlBwmM7MeCEpKhNy7zgplpQfy1n
EPivu7+F6TT0D2vcHd/tYPL2XqFrWTT2gsdORaExNcXmoggpw9crMQ+5Oyyp
2rZn5ZE4kRm9b7Tx9qbLMGlesXKjcp4gXGQJ59ALpTbfcNV1cfL6ZI+X29dq
GGCoXVvH51N0OLP/flxErNX7Ay/2XHyz14ts7DrcPIRrOrT5xuXjo+6dA4M8
zyAxXsUweCqzrLwnldlIDrM1335NxEQePVw/OxPiCrmS88K2AuKa/l8F/EBc
hHir45UGLb09P/0JfzTet6xzQNnmlioBx+Me+QBogLOI3o1O4Xey8klyV5T3
COI5wxqcCShUp8e9mcqcphOnC8QMGp73JUcZIAdMwLjchRsjmjZ52onvaWGu
8LY1IBWcDnfr/wWIHXbQ/yIAAA==

-->

</rfc>
