<?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.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-richer-wimse-token-container-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title abbrev="Multi-token Container Data Structure">Multi-token Container Data Structure</title>
    <seriesInfo name="Internet-Draft" value="draft-richer-wimse-token-container-00"/>
    <author fullname="Justin Richer" role="editor">
      <organization>Bespoke Engineering</organization>
      <address>
        <email>ietf@justin.richer.org</email>
      </address>
    </author>
    <date year="2023" month="September" day="15"/>
    <keyword>access token</keyword>
    <keyword>http</keyword>
    <abstract>
      <?line 32?>

<t>In many use cases, particularly in workload environments, a single access token or similar security artifact is not sufficient for conveying the type of security and provenance information necessary. This draft describes a data model and format for an additive data container to address these concerns.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/bspk/draft-richer-wimse-token-container"/>.</t>
    </note>
  </front>
  <middle>
    <?line 37?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In most HTTP-based protocols, there's a single item sent with the message to represent authentication and authorization - an OAuth access token, a username/password pair, or a TLS client certificate.</t>
      <t>Within many API deployments, multiple independent services are tied together into webs of processes that work together in a concerted fashion to fulfill the incoming requests. These systems need a means for different nodes to:</t>
      <ul spacing="normal">
        <li>convey the current state of the transaction to processing nodes further down the graph</li>
        <li>augment this state with new information, optionally tied to existing elements of this state</li>
        <li>attest to the state at the time it was processed by the node</li>
        <li>work in a non-linear fashion</li>
      </ul>
      <t>In order to address this set of concerns, this draft defines a data structure for a single element of transactional state as well as a container for holding multiples of these elements in a cohesive and addressable structure.</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?>

</section>
    <section anchor="single-element-containers">
      <name>Single Element Containers</name>
      <t>A single element container represents a token and its set of properties.</t>
      <t>The token value is a string whose contents are opaque to the container. Commonly, the token value will contain things like an OAuth access token, a JWT assertion, or another security artifact. The token value is <bcp14>REQUIRED</bcp14>, <bcp14>MUST NOT</bcp14> be the empty string, is covered by the hash, and is immutable.</t>
      <t>The single element has a deterministic hash that is calculated from the token value and several core properties.</t>
      <section anchor="properties">
        <name>Properties</name>
        <dl>
          <dt>format:</dt>
          <dd>
            <t>A string that indicates the format of the token value, to aid downstream nodes in reading and processing the token value. This is covered by the hash.</t>
          </dd>
          <dt>tag:</dt>
          <dd>
            <t>A string that indicates an application-specific tag, to aid downstream nodes in identifying the source and purpose of a given single element within a collection. This is covered by the hash.</t>
          </dd>
          <dt>parents:</dt>
          <dd>
            <t>An ordered set of single element hashes, indicating other single element containers that this element is dependent on or otherwise related to. This is covered by the hash.</t>
          </dd>
          <dt>signatures:</dt>
          <dd>
            <t>An ordered set of signatures for this element, coupled with the identifiers of the key that created the signature. This is not covered by the hash.</t>
          </dd>
        </dl>
      </section>
      <section anchor="calculating-the-hash">
        <name>Calculating the Hash</name>
        <t>In order to calculate a hash, the element needs to be canonicalized and serialized in a deterministic fashion. For the purposes of this exercise, a serialization algorithm is defined that is inspired by, but not compatible with, HTTP Structured Fields defined in <xref target="RFC8941"/>. An interoperable implementation of this data structure would need to define a more robust hash base generation algorithm. For example, this algorithm defines a fixed order for properties, and does not allow for extension. Additionally, the values are not appropriately mapped to robust serializations (accounting for escaping syntax-relevant characters like double quotes, semicolons, and equal signs). All of these would need to be addressed for a full specification.</t>
        <ol spacing="normal" type="1"><li>Start with an empty string</li>
          <li>Take the token value and represent it as an <tt>sf-string</tt> value (enclosed in double quotes with internal double quotes, control characters, and escape characters escaped).</li>
          <li>If the <tt>tag</tt> property is set, append ";tag=" and the tag value.</li>
          <li>If the <tt>format</tt> property is set, append ";format=" and the format value.</li>
          <li>
            <t>If the <tt>parents</tt> property is set and is not empty, append ";parents=("
            </t>
            <ol spacing="normal" type="1"><li>For each parent, append the hash value encoded in base64</li>
              <li>If there are more parents, append "," and repeat the previous step on the next parent</li>
              <li>When all parents are accounted for, append ")"</li>
            </ol>
          </li>
          <li>Take the resulting string and hash it using SHA256 (note: there should be some crypto agility here probably?)</li>
          <li>Encode the resulting hash value in base64</li>
        </ol>
        <t>Note that this algorithm does not include the <tt>signatures</tt> property in the hash calculation.</t>
      </section>
      <section anchor="immutability">
        <name>Immutability</name>
        <t>Once the hash is calculated on a single element, all properties included in the hash calculation <bcp14>MUST</bcp14> be immutable. Additional properties that would be including in the hash calculation <bcp14>MUST NOT</bcp14> be added to the single element.</t>
        <t>Effectively this means that an element is considered immutable once it is added as the parent of another element, is added to a multiple element container, or is signed.</t>
      </section>
      <section anchor="adding-a-signature">
        <name>Adding a Signature</name>
        <t>To add a signature of a single element, the signer takes the hash value of the element, decoded from base64, as the input to the signature algorithm.</t>
        <t>The signer calculates the signed value (note: there needs to be some form of crypto agility here) and adds it to the <tt>signatures</tt> dictionary with the key identifier as the key and the signed output (encoded in base64) as the value.</t>
        <t>Note that since signatures are not covered by the element's hash, signatures can be added or removed from the set without violating the element's immutability requirement.</t>
      </section>
    </section>
    <section anchor="multiple-element-collection">
      <name>Multiple Element Collection</name>
      <t>The container for multiple single element containers is a dictionary, where the key is the hash of the single element and its set of properties (including signatures). The dictionary structure <bcp14>SHOULD</bcp14> preserve insertion order.</t>
      <t>There are no properties tied to the collection itself, nor is there an identifier for the collection. There is not a provision to sign the entire collection, but it is possible to add an element that lists every other node as its parent and apply a signature to that node, effectively giving a signature over a specific state of the collection.</t>
      <t>The elements are tied together using the <tt>parent</tt> property. If an element has a <tt>parent</tt> property, all hashes listed in that property <bcp14>MUST</bcp14> exist as keys in the collection before the single element can be added to the collection.</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="208" width="360" viewBox="0 0 360 208" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,80" fill="none" stroke="black"/>
            <path d="M 40,88 L 40,144" fill="none" stroke="black"/>
            <path d="M 80,32 L 80,80" fill="none" stroke="black"/>
            <path d="M 128,112 L 128,176" fill="none" stroke="black"/>
            <path d="M 168,64 L 168,104" fill="none" stroke="black"/>
            <path d="M 200,32 L 200,80" fill="none" stroke="black"/>
            <path d="M 200,112 L 200,176" fill="none" stroke="black"/>
            <path d="M 272,32 L 272,80" fill="none" stroke="black"/>
            <path d="M 280,112 L 280,144" fill="none" stroke="black"/>
            <path d="M 352,112 L 352,144" fill="none" stroke="black"/>
            <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
            <path d="M 200,32 L 272,32" fill="none" stroke="black"/>
            <path d="M 88,64 L 200,64" fill="none" stroke="black"/>
            <path d="M 8,80 L 80,80" fill="none" stroke="black"/>
            <path d="M 200,80 L 272,80" fill="none" stroke="black"/>
            <path d="M 128,112 L 200,112" fill="none" stroke="black"/>
            <path d="M 280,112 L 352,112" fill="none" stroke="black"/>
            <path d="M 208,128 L 280,128" fill="none" stroke="black"/>
            <path d="M 280,144 L 352,144" fill="none" stroke="black"/>
            <path d="M 56,160 L 128,160" fill="none" stroke="black"/>
            <path d="M 128,176 L 200,176" fill="none" stroke="black"/>
            <path d="M 56,160 C 47.16936,160 40,152.83064 40,144" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="216,128 204,122.4 204,133.6" fill="black" transform="rotate(180,208,128)"/>
            <polygon class="arrowhead" points="176,104 164,98.4 164,109.6" fill="black" transform="rotate(90,168,104)"/>
            <polygon class="arrowhead" points="96,64 84,58.4 84,69.6" fill="black" transform="rotate(180,88,64)"/>
            <polygon class="arrowhead" points="48,88 36,82.4 36,93.6" fill="black" transform="rotate(270,40,88)"/>
            <g class="text">
              <text x="44" y="52">token1</text>
              <text x="236" y="52">token3</text>
              <text x="40" y="68">tag=1</text>
              <text x="232" y="68">tag=b</text>
              <text x="128" y="84">parents</text>
              <text x="240" y="116">parents</text>
              <text x="164" y="132">token2</text>
              <text x="316" y="132">token4</text>
              <text x="88" y="148">parents</text>
              <text x="164" y="164">format</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
,--------,              ,--------,
| token1 |              | token3 |
| tag=1  |<---------+---+ tag=b  |
`--------`  parents |   `--------`
    ^               v
    |          ,--------, parents ,--------,
    |          | token2 |<--------+ token4 |
    |  parents |        |         `--------`
     `---------+ format |
               `--------`

]]></artwork>
      </artset>
      <t>Adding an element with an unlisted parent <bcp14>MUST</bcp14> produce an error.</t>
      <t>Adding an element with a conflicting hash <bcp14>MUST</bcp14> produce an error.</t>
      <t>Single elements in the collection <strong><bcp14>MAY</bcp14></strong> be removed if they are not the target of any <tt>parent</tt> properties. Removing an element that is the <tt>parent</tt> of another element <bcp14>MUST</bcp14> produce an error.</t>
    </section>
    <section anchor="allowable-actions">
      <name>Allowable Actions</name>
      <t>Due to the nature of the data structure, the following actions can be taken by processing nodes without affecting existing items in the data structure.</t>
      <dl>
        <dt><strong>Adding a new single element</strong>:</dt>
        <dd>
          <t>A new node can be added to the multiple element collection without affecting any of the existing elements in the collection.</t>
        </dd>
        <dt><strong>Adding a signature to an existing single element</strong>:</dt>
        <dd>
          <t>A new signature can be calculated on any single element without affecting its hash or relationship to any other elements in the collection.</t>
        </dd>
        <dt><strong>Removing an unattached single element</strong>:</dt>
        <dd>
          <t>An element that is not listed as the <tt>parent</tt> of any other node can be safely removed without affecting the collection.</t>
        </dd>
        <dt><strong>Re-ordering the collection</strong></dt>
        <dd>
          <t>The collection can be re-ordered, though insertion order should be kept to facilitate processing of element relationships.</t>
        </dd>
      </dl>
      <t>Consequently, if a node wants to attest to the existing state of a multiple-element collection, the node can add a new element to the collection that lists a sufficient set of existing nodes as <tt>parents</tt> and signs the new element.</t>
    </section>
    <section anchor="example-implementation">
      <name>Example Implementation</name>
      <t>An example implementation of this data structure is available at https://github.com/bspk/token-bucket</t>
      <t>In this implementation, the single element structure is called a <tt>Bucket</tt>, and the multiple element container is called a <tt>Crate</tt>. Immutability is enforced from the time the hash is calculated.</t>
      <t>An example of the program's output follows, where a single crate is filled with several interrelated buckets. The serialization here is inspired by, but not compatible with, HTTP Structured Fields defined in <xref target="RFC8941"/>.</t>
      <artwork><![CDATA[
CNgfrWGz8iIRndkFis9RjozfdNUKnx5drNDl_qtmVNE="876ytghj4nb2ghj23rjnfdu o2i3rj asdflk 23r"
   ;tag=weird
   ;format=illgal-probably
   ;parents=(6IdWzEZCGGRbA_mFtcO2Msm2_J2n5lFgARFxcpuJen8)
   ;sig=(k2=MEUCIQDWKyxZdprVENPWrd12MCwXefLBYYa0_7S9wflpNWkTjAIgaCmRB4A0GHf62vV34I2An4UFJacoT3pL6xyNL5J12Wg),

6IdWzEZCGGRbA_mFtcO2Msm2_J2n5lFgARFxcpuJen8="2wsdfghgfr45tyhjkiuytg"
   ;tag=gateway
   ;format=jwt
   ;parents=(NJSQl7yrzij1338sfK4XDE9aP0tZzw7R71cySlQwQ7I)
   ;sig=(k1=KNLuDTHrf9f_rBDwFwsnE-MdGYgGEeqPhlKmEFRoFSoiZ65txKizNTsfW2TXvUJ3zq7BuQa4xn0riBYlfCUiyHUgz6F38LmZkEN9qhFdii5cBY5ite-hQV--2nsKdeyvGrh21wtLhQu4NRhu91lYppn_j8L30nRQ1RlbNlrgpAQ,k2=MEYCIQDJQ-lm_sFnVynXP1BvdwUpH5hwFIGpEPY2DBx9wY523QIhAIsQIlzwGtN_8sAor8eLp-O43N66XHT9wdGsm4RbXFz2),

fV_0qN9qExdZKa46O0i6UE_UfNkxltH_QZjMlZMrCJA="a"
   ;format=secure
   ;parents=(NJSQl7yrzij1338sfK4XDE9aP0tZzw7R71cySlQwQ7I,ISdNpXb-StTmZvWZDTZLHlzhmpyivMorHOSL3UKTP7k)
   ;sig=(k1=O1NlrhtrtQ9ykDTR2uBOwk6ofFcL1_WvF0tj3CkrRbbLaBwVxUVslswCa4iHCbza8GS1G4mhNhJXUJ6O-Y6xG9xupoql1QVl_04a4oJOOStfNnptZ8embVMksXfAJQDhog7XAtsZ0vWmG_VkekIG7ZmvbhfAsS9QalC6oMiiVQs),

NJSQl7yrzij1338sfK4XDE9aP0tZzw7R71cySlQwQ7I="8765trfghjuyt5rtghjki987y6tfghj"
   ;tag=api
   ;format=opaque
   ;sig=(k1=Os27rze-ZOKNAX0BuQUr91ztA59vJIUXznzoG87Ka0IkuwTcWjz6DDsDLhh42Qh9UGH2C6oO9n9TSc41Y0EhUWi8oGt3LKwjHzNm7ziwolosl_JmpaNUDWVn8VabxYGDFUGnieUGMfb7DqRi59qAs6RpH-qTEZMF3Ihw2mPZinc),

ISdNpXb-StTmZvWZDTZLHlzhmpyivMorHOSL3UKTP7k="vcxsawertghju7654rtyuikjhgfr54refghjukjhgtr54redfghj"
   ;tag=magic
   ;parents=(NJSQl7yrzij1338sfK4XDE9aP0tZzw7R71cySlQwQ7I,6IdWzEZCGGRbA_mFtcO2Msm2_J2n5lFgARFxcpuJen8)
   ;sig=(k2=MEUCIHS9M_TkQouH5Icb731gBmKhB5FCKNfiUu6bJc7x0H-tAiEAmVe0mlQcfqASWIGaJYkOc3f6e3iDopJS58YKYBTKSJA)

]]></artwork>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC8941">
        <front>
          <title>Structured Field Values for HTTP</title>
          <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
          <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
          <date month="February" year="2021"/>
          <abstract>
            <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8941"/>
        <seriesInfo name="DOI" value="10.17487/RFC8941"/>
      </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>
    <?line 226?>

<section anchor="why-not-http-sf">
      <name>Why Not HTTP-SF?</name>
      <t>HTTP Structured Fields <xref target="RFC8941"/> defines a set of data structures and strict serializations for those structures that would be a perfect fit for this multi-token format. The serialization is HTTP-native, not requiring any additional encoding. Furthermore, SF seems to support all of the core elements we need: dictionaries, lists, properties, strings, etc. And finally, unlike general-purpose formats like JSON or CBOR, SF does not provide infinite recursion. Lists can only be two levels deep, dictionaries can't contain other dictionaries, etc.</t>
      <t>Unfortunately, SF falls short of being able to naturally represent the data structure here in a couple key ways:</t>
      <ul spacing="normal">
        <li>the multi element collection uses hashes as keys, but binary objects (the natural representation for hashes) cannot be keys</li>
        <li>the value of the parents parameter is a list and the value of the signature parameter is a dictionary, but the values of parameters have to be bare items, not lists or dictionaries</li>
      </ul>
      <t>For the purpose of this draft, a new syntax was invented to be able to show the core functions required. Ultimately, a fully robust serialization will need to be specified. Ideally that would be based on SF in some way, but initial experiments in defining that were met with having to follow undesirable workarounds such as using multiple headers to convey a single data structure.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank UberEther for supporting the initial conception of this work. The author would also like to thank Pieter Kasselman, George Fletcher, and Rifaat Shekh-Yusef for feedback.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
3mxrMDn3X/esaNB2n15i73bQ+bZ1eLC/imfOc8Of1uFXfTd69m0rIUGdw59g
mJbtzgm8ll0m2RhbMh5Z8kk3uEAWM+pW02aK/JR1p/b71t1b57HV691Mm09e
NzaH9Uvh1Z/O6v6e2501b7qvZpicMf/wi5wJpv/t87z+7bIzafWv23fnq9dH
K4xuO4Oru8iq1S9by3tmX5w8PNCdp4PR0dJ2w8HdfPzc7M9oy7s5aTR3eqf2
fn1xu9vo15t+Y9I9o2Yw3g0v9l9Xg4u9s1r9bvalYhh/grZvW/UlyGLmgGwb
e/HKeZ7zBCSXi2UGel/SVVEwz8u4LIzB2ejaPVhFb/y5trt7KOzzxn27c0Sv
duLHt+XBzUHNXI3c6+X1Qb8ojNq388FF0h6fRvaR/RSdtJfdpfA71Uur9zDr
ddjLleOee53uTdAdBfxxfy9+Pedvg7Gw7+rj+8XkbPft5eAkuaaNV38n4icP
rt2a8NXpZPa23909vPAe553B0YvTtTjfM08e9gAVVJ3r22q17otzi60Wvcip
15bxhXOdNAY3TnJUcx/C0H96PrzY3fFvrms37nTgRrOweV2RuntA3Z1dV13v
SXT925V/f1U7WVjLSXi65yy7/V7YuXqot09ej5YPe/Xd677T7Ivrvvu27MWD
p0PRDKJDdhFWh43dwf7+/en4aGn1hNe4md533+qoPPv2aecFqO68Wo/ntLE/
3OH7k87TxB7MX9349On68fnSfbyMWmfNb1t0q6gXeSTL/m3VVPojaxDeT6uj
eOw9Lu4e2+PHi1P3zfHCFV9cBtHpcHSxOzkfXx3My2oc1kBIThzF10ereXt8
U09Ohsv5fmB3zYva092iuxM/77bm0c10ekFPlrevk1vhimWLNvhpa/pGD3uj
Wq/hOQPn7H5ytj+sPuy/9o5ekzB4cWvXt+7TToM2grPhcBTbAz+MHw+ZN729
nIt7u3l23XaC2cF9MxaPO4s7r/d0O2fzfu/g0VtMHbspRkfX1G3tB5ec314L
FPGfkImMJHtxBB7yDH6xF2FQmfOjw4PVfowvc0ehIS8qQx3Pl8Uk6gfRG6s+
Ds8HzfsdsNxJdFR7i5t7R4uz/uT+zX8LeocH53SnP0+WY/Pu+W2/3RbtC8dp
1K+do0nvtA6MDI/8o/HIbNQedjrO5I4fBr149+J8+Xz6NvAO3vgycAPhPp1B
xB1M2ne3/uEtnb4+9NrdSc/nbNK7tKcH7Zcbvnf00hT7N+Fp9WXcebzs7vad
Zd27euS+iWL6E+bwbWthvgq6ZFI+CYisAaVywufPGFjggUkB4mMsH62y7Dw6
4+a/b7j/t2B8Ojq6fBrPr4PkdK9vTg92a7MT79w52eu2zgc2nyT70zPz4HXn
tBo3eafp3bIdz7027Zfm6K7fo2cP86G5a++zXd4OwrPR3uHD+cPJ+Hx01vyi
a8xPZJTelmjpJi9NLyAN28Psq7xr0m8OmpvDSheCsH3hB2qkrpbS24pTas5x
lTtnRQaBvp046v5kGB9k3CzNFo4UNZorIyt1ewqPKsyNYz/VocILAIXh5Z46
JVCAIgoHkBHn595e4XKx8pz3sAUMlIz48mJrRUIK1XdMyyuat/VlRxXeb5Ou
urOHZz4VMurColgVYocsCcMgkkeieacpKtTfS9UrPs6bgPI8VSLfSumIVZ3d
wB8sNvGwGPAa16ep2D6Yp4e7ACT0HQnFpj73PBsNB1hjtU6GN5LG7KRFtvQs
eQcW76thyQFWok5tLyQCR9Aub3JhlbwMiAuIzUUMxcJKiXAc+ZcMgOqyqcwZ
Um8YE8ScMZZqDBkAcmxgRV4Ci6RJTJkUuG4byipTXmjMD0U3C26NDNXdD7zc
oG7c0ZWQFzMzrPxeLZ3gnQDdkNPdNgUqp1w2ZoPpM4wU5HPWZAADyIhRxiMv
FcolvqAgULayJlsJvXvpeCLtN8Fv6uGlBdV+dmW/T0P70oS82l6bUuxYI8mF
w3VsQqeDkb9FesFvir0c2byoZPWvIEFZW4axdm0ir4XwhmYlbWvII3d5PZTL
K5D5CbnWH97ty43fTnzdedEtfWubTEAvnrYGdZK+evfkX10tKxzC63YurtG3
mLr0WooH6sY0zAQjA9uQpzFgE7pDjRc00ZVfwc941mKQESq70LREs/L0cQUK
UX4JdJUD3gclKFdXNvAaLI0CeAW2nJgO2pJqF2dVmsOoJW8FBelV4aw82ugf
fSJNc+4HS6iV5N1fYfx8rP7VAbO+bYHLCLb1q+pXq7vbmm3p8ao57s/JBMZ3
pCuiheqQlDYhUgnIK7hhqeBFZlSQLC2O/1JibYcrLq3xHG/wuR6FerbHgmjG
SNcFf3fwCBBN+obbFOQ5ctjcqT6Ay9mSIhu0iekEGP5fBbrJ/z4yAAA=

-->

</rfc>
