<?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.25 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mcmillion-key-transparency-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title>Key Transparency</title>
    <seriesInfo name="Internet-Draft" value="draft-mcmillion-key-transparency-00"/>
    <author fullname="Brendan McMillion">
      <organization/>
      <address>
        <email>brendanmcmillion@gmail.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="06"/>
    <area>SEC</area>
    <workgroup>KT Working Group</workgroup>
    <keyword>end-to-end encryption</keyword>
    <keyword>append-only log</keyword>
    <abstract>
      <t>While there are several established protocols for end-to-end encryption,
relatively little attention has been given to securely distributing the end-user
public keys for such encryption. As a result, these protocols are often still
vulnerable to eavesdropping by active attackers. Key Transparency is a protocol
for distributing sensitive cryptographic information, such as public keys, in a
way that reliably either prevents interference or detects that it occurred in a
timely manner. In addition to distributing public keys, it can also be applied
to ensure that a group of users agree on a shared value or to keep
tamper-evident logs of security-critical events.</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/Bren2010/draft-key-transparency"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Before any information can be exchanged in an end-to-end encrypted system, two
things must happen. First, participants in the system must provide to the
service operator any public keys they wish to use to receive messages. Second,
the service operator must distribute these public keys to any participants that
wish to send messages to those users.</t>
      <t>Typically this is done by having users upload their public keys to a simple
directory where other users can download them as necessary. With this approach,
the service operator is trusted to not manipulate the directory by inserting
malicious public keys, which means that the underlying encryption protocol can
only protect users against passive eavesdropping on their messages.</t>
      <t>However most messaging systems are designed such that all messages exchanged
between users flow through the service operator's servers, so it's extremely
easy for an operator to launch an active attack. That is, the service operator
can insert public keys into the directory that they know the private key for,
attach those public keys to a user's account without the user's knowledge, and
then inject these keys into active conversations with that user to receive
plaintext data.</t>
      <t>Key Transparency (KT) solves this problem by requiring the service operator to
store user public keys in a cryptographically-protected append-only log. Any
malicious entries added to such a log will generally be visible to all
users, in which case a user can detect that they're being impersonated
by viewing the public keys attached to their account. However, if the service
operator attempts to conceal some entries of the log from some users but not
others, this creates a "forked view" which is permanent and easily detectable
with out-of-band communication.</t>
      <t>The critical improvement of KT over related protocols like Certificate
Transparency  <xref target="RFC6962"/> is that KT includes an efficient
protocol to search the log for entries related to a specific participant. This
means users don't need to download the entire log, which may be substantial, to
find all entries that are relevant to them. It also means that KT can better
preserve user privacy by only showing entries of the log to participants that
genuinely need to see them.</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>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>From a networking perspective, KT follows a client-server architecture with a
central <em>Transparency Log</em>, acting as a server, which holds the authoritative
copy of all information and exposes endpoints that allow clients to query or
modify stored data. Clients coordinate with each other through the server by
uploading their own public keys and downloading the public keys of other
clients. Clients are expected to maintain relatively little state, limited only
to what is required to interact with the log and ensure that it is behaving
honestly.</t>
      <t>From an application perspective, KT works as a versioned key-value database.
Clients insert key-value pairs into the database where, for example, the key is
their username and the value is their public key. Clients can update a key by
inserting a new version with new data. They can also look up the most recent
version of a key or any past version. From this point forward, "key" will refer
to a lookup key in a key-value database and "public key" or "private key" will
be specified if otherwise.</t>
      <t>While this document uses the TLS presentation language <xref target="RFC8446"/> to describe
the structure of protocol messages, it does not require the use of a specific
transport protocol. This is intended to allow applications to layer KT on top of
whatever transport protocol their application already uses. In particular, this
allows applications to continue relying on their existing access control system.</t>
      <t>Applications may enforce arbitrary access control rules on top of KT such as
requiring a user to be logged in to make KT requests, only allowing a user to
lookup the keys of another user if they're "friends", or simply applying a rate
limit. Applications <bcp14>SHOULD</bcp14> prevent users from modifying keys that they don't
own. The exact mechanism for rejecting requests, and possibly explaining the
reason for rejection, is left to the application.</t>
      <t>Finally, this document does not assume that clients can reliably communicate
with each other out-of-band (that is, away from any interference by the
Transparency Log operator), or communicate with the Transparency Log
anonymously. However, later sections will give guidance on how these channels
can be utilized effectively when or if they're available. <!-- TODO: Link later section -->
      </t>
      <section anchor="basic-operations">
        <name>Basic Operations</name>
        <t>The operations that can be executed by a client are as follows:</t>
        <ol spacing="normal" type="1"><li>
            <strong>Search:</strong> Performs a lookup on a specific key in the most recent version of
the log. Clients may request either a specific version of the key, or the
most recent version available. If the key-version pair exists, the server
returns the corresponding value and a proof of inclusion. If the key-version
pair does not exist, the server returns a proof of non-inclusion instead.</li>
          <li>
            <strong>Update:</strong> Adds a new key-value pair to the log, for which the server
returns a proof of inclusion. Note that this means that new values are added
to the log immediately in response to an Update operation, and are not queued
for later insertion with a batch of other values.</li>
          <li>
            <strong>Monitor:</strong> While Search and Update are run by the client as necessary,
monitoring is done in the background on a recurring basis. It both checks
that the log is continuing to behave honestly (all previously returned keys
remain in the tree) and that no changes have been made to keys owned by the
client without the client's knowledge.</li>
        </ol>
      </section>
      <section anchor="deployment-modes">
        <name>Deployment Modes</name>
        <t>In the interest of satisfying the widest range of use-cases possible, three
different modes for deploying a Transparency Log are described in this document.
Each mode has slightly different requirements and efficiency considerations for
both the service operator and the end-user.</t>
        <t><strong>Third-party Management</strong> and <strong>Third-party Auditing</strong> are two deployment modes
that require the service operator to delegate part of the operation of the
Transparency Log to a third party. Users are able to run more efficiently as
long as they can assume that the service operator and the third party won't
collude to trick them into accepting malicious results.</t>
        <t>With both third-party modes, all requests from end-users are initially routed to
the service operator and the service operator coordinates with the third party
themself. End-users never contact the third party directly, however they will
need a signature public key from the third party to verify its assertions.</t>
        <t>With Third-party Management, the third party performs the majority of the work
of actually storing and operating the log, and the service operator only needs
to sign new entries as they're added. With Third-party Auditing, the service
operator performs the majority of the work of storing and operating the log, and
obtains signatures from a lightweight third-party auditor at regular intervals
asserting that the service operator has been constructing the tree correctly.</t>
        <t><strong>Contact Monitoring</strong>, on the other hand, supports a single-party deployment
with no third party. The tradeoff is that the background monitoring protocol
requires a number of requests that's proportional to the number of keys a user
has looked up in the past. As such, it's less suited to use-cases where users
look up a large number of ephemeral keys, but would work ideally in a use-case
where users look up a small number of keys repeatedly (for example, the keys of
regular contacts).</t>
        <t>The deployment mode of a Transparency Log is chosen when the log is first
created and isn't able to be changed over the log's lifetime. This makes it
important for operators to carefully consider the best long-term approach based
on the specifics of their application.</t>
      </section>
      <section anchor="security-guarantees">
        <name>Security Guarantees</name>
        <t>A client that executes a Search or Update operation correctly (and does any
required monitoring afterwards) receives a guarantee that the Transparency Log
operator also executed the operation correctly and in a way that's globally
consistent with what it has shown all other clients. That is, when a client
searches for a key, they're guaranteed that the result they receive represents
the same result that any other client searching for the same key would've seen.
When a client updates a key, they're guaranteed that other clients will see the
update the next time they search for the key. <!-- subject to caching? -->
        </t>
        <t>If the Transparency Log operator does not execute an operation correctly, then
either:</t>
        <ol spacing="normal" type="1"><li>The client will detect the error immediately and reject the result of an operation, or</li>
          <li>The client will permanently enter an invalid state.</li>
        </ol>
        <t>Depending on the exact reason that the client enters an invalid state, it will
either be detected by background monitoring or the next time that out-of-band
communication is available. Importantly, this means that clients must stay
online for some fixed amount of time after entering an invalid state for it to
be successfully detected. <!-- need oob communication with someone not attacked? -->
        </t>
        <t>The exact caveats of the above guarantee depend naturally on the security of
underlying cryptographic primitives, but also the deployment mode that the
Transparency Log relies on:</t>
        <ul spacing="normal">
          <li>Third-Party Management and Third-Party Auditing require an assumption that the
Transparency Log operator and the third-party manager/auditor do not collude
to trick clients into accepting malicious results.</li>
          <li>Contact Monitoring requires an assumption that the client that owns a key and
all clients that look up the key do the necessary monitoring afterwards.
<!-- write down why collusion-resistant KT is better than just having two operators stay in sync? -->
          </li>
        </ul>
        <!-- TODO: Once the whole protocol is written, ensure this is as precise as possible. -->
<!-- TODO: In Security Considerations, calculate how long you need to stay online for Contact Monitoring to detect an attack -->

</section>
    </section>
    <section anchor="tree-construction">
      <name>Tree Construction</name>
      <t>KT relies on two combined hash tree structures: log trees and prefix trees. This
section describes the operation of both at a high-level and the way that they're
combined. More precise algorithms for computing the intermediate and root values
of the trees will be given in a later section.
<!-- TODO: Link later section -->
      </t>
      <t>Both types of trees consist of <em>nodes</em> which have a byte string as their <em>value</em>.
A node is either a <em>leaf</em> if it has no children, or a <em>parent</em> if it has either
a <em>left child</em> or a <em>right child</em>. A node is the <em>root</em> of a tree if it has no
parents, and an <em>intermediate</em> if it has both children and parents. Nodes are
<em>siblings</em> if they share the same parent.</t>
      <t>The <em>descendants</em> of a node are that node, its children, and the descendants of
its children. A <em>subtree</em> of a tree is the tree given by the descendants of a
node, called the <em>head</em> of the subtree.</t>
      <t>The <em>direct path</em> of a root node is the empty list, and of any other node is the
concatenation of that node's parent along with the parent's direct path. The
<em>copath</em> of a node is the node's sibling concatenated with the list of siblings
of all the nodes in its direct path, excluding the root.</t>
      <section anchor="log-tree">
        <name>Log Tree</name>
        <t>Log trees are used for storing information in the chronological order that it
was added and are constructed as <em>left-balanced</em> binary trees.</t>
        <t>A binary tree is <em>balanced</em> if its size is a power of two and for any parent
node in the tree, its left and right subtrees have the same size. A binary tree
is <em>left-balanced</em> if for every parent, either the parent is balanced, or the
left subtree of that parent is the largest balanced subtree that could be
constructed from the leaves present in the parent's own subtree. Given a list of
<tt>n</tt> items, there is a unique left-balanced binary tree structure with these
elements as leaves. Note also that every parent always has both a left and right
child.</t>
        <t>Log trees initially consist of a single leaf node. New leaves are added to the
right-most edge of the tree along with a single parent node, to construct the
left-balanced binary tree with <tt>n+1</tt> leaves.</t>
        <t>While leaves contain arbitrary data, the value of a parent node is always the
hash of the combined values of its left and right children.</t>
        <t>Log trees are special in that they can provide both <em>inclusion proofs</em>, which
demonstrate that a leaf is included in a log, and <em>consistency proofs</em>, which
demonstrate that a new version of a log is an extension of a past version of the
log.</t>
        <t>An inclusion proof is given by providing the copath values of a leaf. The proof
is verified by hashing together the leaf with the copath values and checking
that the result equals the root value of the log. Consistency proofs are a more
general version of the same idea. With a consistency proof, the prover provides
the minimum set of intermediate node values from the current tree that allows
the verifier to compute both the old root value and the current root value. An
algorithm for this is given in section 2.1.2 of <xref target="RFC6962"/>.</t>
      </section>
      <section anchor="prefix-tree">
        <name>Prefix Tree</name>
        <t>Prefix trees are used for storing key-value pairs while preserving the ability
to efficiently look up a value by its corresponding key.</t>
        <t>Each leaf node in a prefix tree represents a specific key-value pair, while each
parent node represents some prefix which all keys in the subtree headed by that
node have in common. The subtree headed by a parent's left child contains all
keys that share its prefix followed by an additional 0 bit, while the subtree
headed by a parent's right child contains all keys that share its prefix
followed by an additional 1 bit.</t>
        <t>The root node, in particular, represents the empty string as a prefix. The
root's left child contains all keys that begin with a 0 bit, while the right
child contains all keys that begin with a 1 bit.</t>
        <t>A prefix tree can be searched by starting at the root node, and moving to the
left child if the first bit of a search key is 0, or the right child if the
first bit is 1. This is then repeated for the second bit, third bit, and so on
until the search either terminates at a leaf node (which may or may not be for
the desired key), or a parent node that lacks the desired child.</t>
        <t>New key-value pairs are added to the tree by searching it according to this
process. If the search terminates at a parent without a left or right child, a
new leaf is simply added as the parent's missing child. If the search terminates
at a leaf for the wrong key, one or more intermediate nodes are added until the
new leaf and the old leaf would no longer reside in the same place. That is,
until we reach the first bit that differs between the new key and the old key.</t>
        <t>The value of a leaf node is the encoded key-value pair, while the value of a
parent node is the hash of the combined values of its left and right children
(or a stand-in value when one of the children doesn't exist).</t>
      </section>
      <section anchor="combined-tree">
        <name>Combined Tree</name>
        <t>Log trees are desirable because they can provide efficient consistency proofs to
assure verifiers that nothing has been removed from a log that was present in a
previous version. However, log trees can't be efficiently searched without
downloading the entire log. Prefix trees are efficient to search and can provide
inclusion proofs to convince verifiers that the returned search results are
correct. However, it's not possible to efficiently prove that a new version of a
prefix tree contains the same data as a previous version with only new keys
added.</t>
        <t>In the combined tree structure, which is based on <xref target="Merkle2"/>, a log tree
maintains a record of updates to key-value pairs while a prefix tree maintains a
map from each key to a counter with the number of times it's been updated. Importantly, the
root value of the prefix tree after adding the new key or increasing the counter
of an existing key, is stored in the log tree alongside the record of the
update. With some caveats, this combined structure supports both efficient
consistency proofs and can be efficiently searched.</t>
        <t>To search the combined structure, users do a binary search for the first log
entry where looking up the search key in the prefix tree at that entry yields
the desired counter. As such, the entry that a user arrives at through binary
search contains the update with the key-value pair that they're looking for,
even though the log itself is not sorted.</t>
        <t>Binary search also ensures that all users will check the same or similar entries
when searching for the same key, which is necessary for the efficient auditing
of a Transparency Log. To maximize this effect, users start their binary search
at the entry whose index is the largest power of two less than the size of the
log, and move left or right by consecutively smaller powers of two.</t>
        <t>So for example in a log with 70 entries, instead of starting a search at the
"middle" with entry 35, users would start at entry 64. If the next step in the
search is to move right, instead of moving to the middle of entries 64 and 70,
which would be entry 67, users would move 4 steps (the largest power of two
possible) to the right to entry 68. As more entries are added to the log, users
will consistently revisit entries 64 and 68, while they may never revisit
entries 35 or 67 after even a single new entry is added to the log.</t>
        <t>While users searching for a specific version of a key jump right into a binary
search for the entry with that counter, other users may instead wish to search
for the "most recent" version of a key. That is, the key with the highest
counter possible. Users looking up the most recent version of a key start by
fetching the <strong>frontier</strong> of the log, which they use to determine what the
highest counter for a key is.</t>
        <t>The frontier of a log consists of the entry whose index is the largest power of
two less than the size of the log, followed by the entry the largest power of
two possible to the right, repeated until the last entry of the log is reached.
So for example in a log with 70 entries, the frontier consists of entries 64,
68, and 69 (with 69 being the last entry).</t>
      </section>
    </section>
    <section anchor="preserving-privacy">
      <name>Preserving Privacy</name>
      <t>In addition to being more convenient for many use-cases than similar
transparency protocols, KT is also better at preserving the privacy of a
Transparency Log's contents. This is important because in many practical
applications of KT, service operators expect to be able to control when
sensitive information is revealed. In particular, an operator can often only
reveal that a user is a member of their service to that user's friends or
contacts. Operators may also wish to conceal when individual users perform a
given task like rotate their public key or add a new device to their account, or
even conceal the exact number of users their application has overall.</t>
      <t>Applications are primarily able to manage the privacy of their data in KT by
enforcing access control policies on the basic operations performed by clients,
as discussed in <xref target="protocol-overview"/>. However, the proofs of inclusion and
non-inclusion given by a Transparency Log can indirectly leak information about
other entries and lookup keys.</t>
      <t>When users search for a key with the binary search algorithm described in
<xref target="combined-tree"/>, they necessarily see the values of several leaves while
conducting their search that they may not be authorized to view the contents of.
However, log entries generally don't need to be inspected except as specifically
allowed by the service.</t>
      <t>The privacy of log entries is maintained by storing only a cryptographic
commitment to the serialized, updated key-value pair in the leaf of the log tree
instead of the update itself. At the end of a successful search, the service
operator provides the committed update along with the commitment opening, which
allows the user to verify that the commitment in the log tree really does
correspond to the provided update. By logging commitments instead of plaintext
updates, users learn no information about an entry's contents unless the service
operator explicitly provides the commitment opening.</t>
      <t>Beyond the log tree, the second potential source of privacy leaks is the prefix
tree. When receiving proofs of inclusion and non-inclusion from the prefix tree,
users also receive indirect information about what other valid lookup keys
exist. To prevent this, all lookup keys are processed through a Verifiable
Random Function, or VRF <xref target="I-D.irtf-cfrg-vrf"/>.</t>
      <t>A VRF deterministically maps each key to a fixed-length pseudorandom value. The
VRF can only be executed by the service operator, who holds a private key.
But critically, VRFs can still provide a proof that an input-output pair is valid,
which users verify with a public key. When a user requests to search for or
update a key, the service operator first executes its VRF on the input key to
obtain the output key that will actually be looked up or stored in the prefix
tree. The service operator then provides the output key, along with a proof that
the output key is correct, in its response to the user.</t>
      <t>The pseudorandom output of VRFs means that even if a user indirectly observes
that a search key exists in the prefix tree, they can't immediately learn which
user the search key identifies. The inability of users to execute the VRF
themselves also prevents offline "password cracking" approaches, where an
attacker tries all possibilities in a low entropy space (like the set of phone
numbers) to find the input that produces a given search key.</t>
    </section>
    <section anchor="ciphersuites">
      <name>Ciphersuites</name>
      <t>Each Transparency Log uses a single fixed ciphersuite, chosen when the log is
initially created, that specifies the following primitives to be used for
cryptographic computations:</t>
      <ul spacing="normal">
        <li>A hash algorithm</li>
        <li>A signature algorithm</li>
        <li>A Verifiable Random Function (VRF) algorithm</li>
      </ul>
      <t>The hash algorithm is used for computing the intermediate and root values of
hash trees. The signature algorithm is used for signatures from both the service
operator and the third party, if one is present. The VRF is used for preserving
the privacy of lookup keys. One of the VRF algorithms from <xref target="I-D.irtf-cfrg-vrf"/> must be used.</t>
      <t>Ciphersuites are represented with the CipherSuite type. The ciphersuites are
defined in <xref target="kt-ciphersuites"/>.</t>
    </section>
    <section anchor="cryptographic-computations">
      <name>Cryptographic Computations</name>
      <section anchor="commitment">
        <name>Commitment</name>
        <t>Commitments are computed with HMAC <xref target="RFC2104"/>, using the hash function
specified by the ciphersuite. To produce a new commitment to a value called
<tt>message</tt>, the application generates a random 16 byte value called <tt>opening</tt> and
then computes:</t>
        <sourcecode type="pseudocode"><![CDATA[
commitment = HMAC(fixedKey, opening || message)
]]></sourcecode>
        <t>where <tt>fixedKey</tt> is the 16 byte hex-decoded value:</t>
        <artwork><![CDATA[
d821f8790d97709796b4d7903357c3f5
]]></artwork>
        <t>This fixed key allows the HMAC function, and thereby the commitment scheme, to
be modeled as a random oracle.</t>
        <t>The output value <tt>commitment</tt> may be published, while <tt>opening</tt> and <tt>message</tt>
should be kept private until the commitment is meant to be revealed.</t>
      </section>
      <section anchor="prefix-tree-1">
        <name>Prefix Tree</name>
        <t>The leaf nodes of a prefix tree are serialized as:</t>
        <sourcecode type="tls"><![CDATA[
struct {
    opaque key<VRF.Nh>;
    uint32 counter;
} PrefixLeaf;
]]></sourcecode>
        <t>where <tt>key</tt> is the full search key, <tt>counter</tt> is the counter of times that the
key has been updated (starting at 0 for a key that was just created), and
<tt>VRF.Nh</tt> is the output size of the ciphersuite VRF in bytes.</t>
        <t>The parent nodes of a prefix tree are serialized as:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque value<Hash.Nh>;
} PrefixParent;
]]></sourcecode>
        <t>where <tt>Hash.Nh</tt> is the output length of the ciphersuite hash function. The value
of a parent node is computed by hashing together the values of its left and
right children:</t>
        <sourcecode type="pseudocode"><![CDATA[
parent.value = Hash(0x01 ||
                   nodeValue(parent.leftChild) ||
                   nodeValue(parent.rightChild))

nodeValue(node):
  if node.type == emptyNode:
    return make([]byte, Hash.Nh)
  else if node.type == leafNode:
    return Hash(0x00 || node.key || node.counter)
  else if node.type == parentNode:
    return node.value
]]></sourcecode>
        <t>where <tt>Hash</tt> denotes the ciphersuite hash function.</t>
      </section>
      <section anchor="crypto-log-tree">
        <name>Log Tree</name>
        <t>The leaf and parent nodes of a log tree are serialized as:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque commitment<Hash.Nh>;
  opaque prefix_tree<Hash.Nh>;
} LogLeaf;

struct {
  opaque value<Hash.Nh>;
} LogParent;
]]></sourcecode>
        <t>The value of a parent node is computed by hashing together the values of its
left and right children:</t>
        <sourcecode type="pseudocode"><![CDATA[
parent.value = Hash(hashContent(parent.leftChild) ||
                    hashContent(parent.rightChild))

hashContent(node):
  if node.type == leafNode:
    return 0x00 || nodeValue(node)
  else if node.type == parentNode:
    return 0x01 || nodeValue(node)

nodeValue(node):
  if node.type == leafNode:
    return Hash(node.commitment || node.prefix_tree)
  else if node.type == parentNode:
    return parent.value
]]></sourcecode>
      </section>
      <section anchor="tree-head-signature">
        <name>Tree Head Signature</name>
        <t>The head of a Transparency Log, which represents the log's most recent state, is
represented as:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  uint64 tree_size;
  uint64 timestamp;
  opaque signature<0..2^16-1>;
} TreeHead;
]]></sourcecode>
        <t>where <tt>tree_size</tt> counts the number of entries in the log tree and <tt>timestamp</tt>
is the time that the structure was generated, in milliseconds since the Unix
epoch. If the Transparency Log is deployed with Third-party Management then the
public key used to verify the signature belongs to the third-party manager;
otherwise the public key used belongs to the service operator.</t>
        <t>The signature itself is computed over a <tt>TreeHeadTBS</tt> structure, which
incorporates the log's current state as well as long-term log configuration:</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  contactMonitoring(1),
  thirdPartyManagement(2),
  thirdPartyAuditing(3),
} DeploymentMode;

struct {
  CipherSuite ciphersuite;
  DeploymentMode mode;
  opaque signature_public_key<0..2^16-1>;
  opaque vrf_public_key<0..2^16-1>;

  select (Configuration.mode) {
    case contactMonitoring:
    case thirdPartyManagement:
      opaque leaf_public_key<0..2^16-1>;
    case thirdPartyAuditing:
      opaque auditor_public_key<0..2^16-1>;
  };
} Configuration;

struct {
  Configuration config;
  uint64 tree_size;
  uint64 timestamp;
  opaque root_value<Hash.Nh>;
} TreeHeadTBS;
]]></sourcecode>
      </section>
    </section>
    <section anchor="tree-proofs">
      <name>Tree Proofs</name>
      <section anchor="log-tree-1">
        <name>Log Tree</name>
        <t>An inclusion proof for a single leaf in a log tree is given by providing the
copath values of a leaf. Similarly, a bulk inclusion proof for any number of
leaves is given by providing the fewest node values that can be hashed together
with the specified leaves to produce the root value. Such a proof is encoded as:</t>
        <sourcecode type="tls"><![CDATA[
opaque NodeValue<Hash.Nh>;

struct {
  NodeValue elements<0..2^16-1>;
} InclusionProof;
]]></sourcecode>
        <t>Each <tt>NodeValue</tt> is a uniform size, computed by passing the relevent <tt>LogLeaf</tt>
or <tt>LogParent</tt> structures through the <tt>nodeValue</tt> function in
<xref target="crypto-log-tree"/>. Finally, the contents of the <tt>elements</tt> array is kept in
left-to-right order: if a node is present in the root's left subtree, its value
must be listed before any values provided from nodes that are in the root's
right subtree, and so on recursively.</t>
        <t>Consistency proofs are encoded similarly:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  NodeValue elements<0..2^16-1>;
} ConsistencyProof;
]]></sourcecode>
        <t>Again, each <tt>NodeValue</tt> is computed by passing the relevent <tt>LogLeaf</tt> or
<tt>LogParent</tt> structure through the <tt>nodeValue</tt> function. The nodes chosen
correspond to those output by the algorithm in section 2.1.2 of <xref target="RFC6962"/>.</t>
      </section>
      <section anchor="prefix-tree-2">
        <name>Prefix Tree</name>
        <t>A proof from a prefix tree authenticates that a search was done correctly for a
given search key. Such a proof is encoded as:</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  inclusion(1),
  nonInclusionLeaf(2),
  nonInclusionParent(3),
} PrefixSearchResult;

struct {
  PrefixSearchResult result;
  NodeValue elements<0..2^16-1>;
  select (PrefixProof.result) {
    case inclusion:
      uint32 counter;
    case nonInclusionLeaf:
      PrefixLeaf leaf;
    case nonInclusionParent:
  };
} PrefixProof;
]]></sourcecode>
        <t>The <tt>result</tt> field indicates what the terminal node of the search was:</t>
        <ul spacing="normal">
          <li>
            <tt>inclusion</tt> for a leaf node matching the requested key</li>
          <li>
            <tt>nonInclusionLeaf</tt> for a leaf node not matching the requested key</li>
          <li>
            <tt>nonInclusionParent</tt> for a parent node that lacks the desired child</li>
        </ul>
        <t>The <tt>elements</tt> array consists of the copath of the terminal node, in
bottom-to-top order. That is, the terminal node's sibling would be first,
followed by the terminal node's parent's sibling, and so on. In the event that a
node is not present, an all-zero byte string of length <tt>Hash.Nh</tt> is listed
instead.</t>
        <t>Depending on the <tt>result</tt> field, any additional information about the terminal
node that's necessary to verify the proof is also provided. In the case of
<tt>nonInclusionParent</tt>, no additional information is needed because the
non-terminal child's value is already in <tt>elements</tt>.</t>
        <t>The proof is verified by hashing together the provided elements, in the
left/right arrangement dictated by the search key, and checking that the result
equals the root value of the prefix tree.</t>
      </section>
      <section anchor="proof-combined-tree">
        <name>Combined Tree</name>
        <t>A proof from a combined log and prefix tree follows the execution of a binary
search through the leaves of the log tree, as described in <xref target="combined-tree"/>. It
is serialized as follows:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  PrefixProof prefix_proof;
  opaque commitment<Hash.Nh>;
} SearchStep;

struct {
  SearchStep steps<0..2^8-1>;
  InclusionProof inclusion;
} SearchProof;
]]></sourcecode>
        <t>Each <tt>SearchStep</tt> structure in <tt>steps</tt> is one leaf that was inspected as part of
the binary search, starting with the "middle" leaf (i.e., the leaf whose index
is the largest power of two less than the size of the log). The <tt>prefix_proof</tt>
field of a <tt>SearchStep</tt> is the output of searching the prefix tree whose root is
at that leaf for the search key, while the <tt>commitment</tt> field is the commitment
to the update at that leaf. The <tt>inclusion</tt> field of <tt>SearchProof</tt> contains a
batch inclusion proof for all of the leaves accessed by the binary search,
relating them to the root of the log tree.</t>
        <t>A verifier interprets the output of each <tt>prefix_proof</tt> as <tt>-1</tt> if it is a
non-inclusion proof, or as <tt>counter</tt> if it is an inclusion proof. The proof can
then be verified by checking that:</t>
        <ol spacing="normal" type="1"><li>The elements of <tt>steps</tt> represent a monotonic series over the leaves of the
log, and</li>
          <li>The elements of <tt>steps</tt> correspond exactly to the lookups that would be made
by the verifier while conducting the binary search.</li>
        </ol>
        <t>Once the validity of the search steps has been established, the verifier can
compute the root of each prefix tree represented by a <tt>prefix_proof</tt> and combine
it with the corresponding <tt>commitment</tt> to obtain the value of each leaf. These
leaf values can then be combined with the proof in <tt>inclusion</tt> to check that the
output matches the root of the log tree.</t>
      </section>
    </section>
    <section anchor="update-format">
      <name>Update Format</name>
      <t>The updates committed to by a combined tree structure contain the new value of a
search key, along with additional information depending on the deployment mode
of the Transparency Log. They are serialized as follows:</t>
      <sourcecode type="tls"><![CDATA[
struct {
  select (Configuration.mode) {
    case thirdPartyManagement:
      opaque signature<0..2^16-1>;
  };
} UpdatePrefix;

struct {
  UpdatePrefix prefix;
  opaque value<0..2^32-1>;
} UpdateValue;
]]></sourcecode>
      <t>The <tt>value</tt> field contains the new value of the search key.</t>
      <t>In the event that third-party management is used, the <tt>prefix</tt> field contains a
signature from the service operator, using the public key from
<tt>Configuration.leaf_public_key</tt>, over the following structure:</t>
      <sourcecode type="tls"><![CDATA[
struct {
  opaque search_key<0..2^16-1>;
  uint32 version;
  opaque value<0..2^32-1>;
} UpdateTBS;
]]></sourcecode>
      <t>The <tt>search_key</tt> field contains the search key being updated, <tt>version</tt> contains
the new key version, and <tt>value</tt> contains the same contents as
<tt>UpdateValue.value</tt>. Clients <bcp14>MUST</bcp14> successfully verify this signature before
consuming <tt>UpdateValue.value</tt>.</t>
    </section>
    <section anchor="user-operations">
      <name>User Operations</name>
      <section anchor="search">
        <name>Search</name>
        <t>Users initiate a Search operation by submitting a SearchRequest to the
Transparency Log containing the key that they're interested in. Users can
optionally specify a version of the key that they'd like to receive, if not the
most recent one. They can also include the <tt>tree_size</tt> of the last TreeHead that
they successfully verified.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque search_key<0..2^16-1>;
  optional<uint32> version;
  optional<uint64> last;
} SearchRequest;
]]></sourcecode>
        <t>In turn, the Transparency Log responds with a SearchResult structure:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  TreeHead tree_head;
  optional<ConsistencyProof> consistency;
  select (Configuration.mode) {
    case thirdPartyAuditing:
      AuditorTreeHead auditor_tree_head;
  };
} FullTreeHead;

struct {
  opaque index<VRF.Nh>;
  opaque proof<0..2^16-1>;
} VRFResult;

struct {
  opaque opening<16>;
  opaque value<0..2^32-1>;
} SearchValue;

struct {
  FullTreeHead full_tree_head;
  VRFResult vrf_result;
  SearchProof search;

  optional<SearchValue> value;
} SearchResult;
]]></sourcecode>
        <t>If <tt>last</tt> is present, then the Transparency Log <bcp14>MUST</bcp14> provide a consistency proof
between the current tree and the tree when it was this size, in the
<tt>consistency</tt> field of <tt>FullTreeHead</tt>.</t>
        <t>Users verify a search result by following these steps:</t>
        <ol spacing="normal" type="1"><li>Verify the VRF proof in <tt>VRFResult.proof</tt> against the requested search key
<tt>SearchRequest.search_key</tt> and the claimed VRF output <tt>VRFResult.index</tt>.</li>
          <li>Evaluate the search proof in <tt>search</tt> according to the steps in
<xref target="proof-combined-tree"/>. This will produce a verdict as to whether the search
was executed correctly, and also a candidate root value for the tree. If it's
determined that the search was executed incorrectly, abort with an error.</li>
          <li>
            <t>With the candidate root value for the tree:
            </t>
            <ol spacing="normal" type="1"><li>Verify the proof in <tt>FullTreeHead.consistency</tt>, if one is expected.</li>
              <li>Verify the signature in <tt>TreeHead.signature</tt>.</li>
              <li>Verify that the timestamp in <tt>TreeHead</tt> is sufficiently recent.
Additionally, verify that the <tt>timestamp</tt> and <tt>tree_size</tt> fields of the
<tt>TreeHead</tt> are greater than or equal to what they were before.</li>
              <li>If third-party auditing is used, verify <tt>auditor_tree_head</tt> with the steps
described in <xref target="auditing"/>.</li>
            </ol>
          </li>
          <li>If the proof in <tt>search</tt> determined that a valid entry was found, check that
<tt>value</tt> is populated, and that the commitment in the terminal search step
opens to <tt>SearchValue.value</tt> with opening <tt>SearchValue.opening</tt>. If the proof
determined that a valid entry was not found, check that <tt>value</tt> is empty.</li>
        </ol>
        <t>Provided that the above verification is successful, users decode the encoded
<tt>UpdateValue</tt> structure in <tt>SearchValue.value</tt>. Depending on the deployment mode
of the Transparency Log, the <tt>UpdateValue</tt> may or may not require additional
verification, specified in <xref target="update-format"/>, before its contents may be
consumed.</t>
        <t>If the Transparency Log is deployed with Contact Monitoring, users <bcp14>MUST</bcp14> retain
the most recent version of the key that they've seen (even if that is not the
most recent version overall) and the position of that it was stored at in the
log. Users <bcp14>MAY</bcp14> retain the entire <tt>SearchResult</tt> if they wish to later be able to
provide non-repudiable proof of misbehavior.</t>
      </section>
      <section anchor="update">
        <name>Update</name>
        <t>Users initiate an Update operation by submitting an UpdateRequest to the
Transparency Log containing the new key and value to store. Users can also
optionally include the <tt>tree_size</tt> of the last TreeHead that they successfully
verified.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque search_key<0..2^16-1>;
  opaque value<0..2^32-1>;
  optional<uint64> last;
} UpdateRequest;
]]></sourcecode>
        <t>If the request is valid, the Transparency Log adds the new key-value pair to the
log and returns an UpdateResult structure:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  FullTreeHead full_tree_head;
  VRFResult vrf_result;
  SearchProof search;

  opaque opening<16>;
  UpdatePrefix prefix;
} UpdateResult;
]]></sourcecode>
        <t>Users verify the UpdateResult as if it were a SearchResult for the most recent
version of <tt>search_key</tt>.</t>
        <t>Note that the contents of <tt>UpdateRequest.value</tt> is the new value of the lookup
key and NOT a serialized <tt>UpdateValue</tt> object. To aid verification, the update
result provides the <tt>UpdatePrefix</tt> structure necessary to reconstruct the
<tt>UpdateValue</tt>.</t>
        <t>Users <bcp14>MUST</bcp14> retain the new version of the key and the position that it is stored
at in the log for the purpose of monitoring. Users <bcp14>MAY</bcp14> retain the entire
<tt>UpdateResult</tt> if they wish to later be able to provide non-repudiable proof of
misbehavior.</t>
      </section>
      <section anchor="monitor">
        <name>Monitor</name>
        <t>Users initiate a Monitor operation by submitting a MonitorRequest to the
Transparency Log containing information about the keys they wish to monitor.
Similar to Search and Update operations, users can include the <tt>tree_size</tt> of
the last TreeHead that they successfully verified.</t>
        <sourcecode type="tls"><![CDATA[
opaque SearchKey<0..2^16-1>;

struct {
  opaque search_key<0..2^16-1>;
  uint32 version;
} ContactKey;

struct {
  SearchKey search_keys<0..2^16-1>;
  select (Configuration.mode) {
    case contactMonitoring:
      ContactKey contact_keys<0..2^16-1>;
  };
  optional<uint64> last;
} MonitorRequest;
]]></sourcecode>
        <t>Users include each of the keys that they own in <tt>search_keys</tt>. If the
Transparency Log is deployed with Contact Monitoring, users also include any
keys they've looked up in <tt>contact_keys</tt>, potentially omitting any that they
reasonably expect will not produce new monitoring data.</t>
        <t>The Transparency Log responds with a MonitorResponse structure:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  PrefixProof prefix_proof;
  opaque commitment<Hash.Nh>;
} ContactProofStep;

struct {
  ContactProofStep steps<0..2^8-1>;
  InclusionProof inclusion;
} ContactProof;

struct {
  FullTreeHead full_tree_head;
  SearchProof search_proofs<0..2^16-1>;
  select (Configuration.mode) {
    case contactMonitoring:
      ContactProof contact_proofs<0..2^16-1>;
  };
} MonitorResponse;
]]></sourcecode>
        <t>Each proof in <tt>search_proofs</tt> represents a search for the most recent version of
the corresponding key in <tt>search_keys</tt>. If <tt>MonitorRequest.last</tt> is populated,
any search steps in <tt>SearchProof.steps</tt> for entries of the log before <tt>last</tt> are
omitted to save space.</t>
        <t>The elements of <tt>contact_proofs</tt> also correspond one-to-one with the elements of
<tt>contact_keys</tt>. Each <tt>ContactProof</tt> is meant to convince the user that the key
they looked up is still properly included in the log and has not been
surreptitiously concealed.</t>
        <t>The steps of a <tt>ContactProof</tt> represent the <strong>parents</strong> of the entry that
contain the specified version of the search key. That is, the parents of an
entry are defined as the log entries that are accessed while following a binary
search to the given entry, before the entry itself is reached. However, if
<tt>MonitorRequest.last</tt> is populated, then any parents before <tt>last</tt> are omitted
to save space.</t>
        <t>Each step contains a <tt>prefix_proof</tt> which is a search for the
user-specified key in the prefix tree rooted at that parent, along with the
<tt>commitment</tt> contained in the parent. Users verify that the <tt>prefix_proof</tt> is an
inclusion proof and that the included counter is greater than or equal to what
they'd expect, assuring them that the tree is being constructed correctly. The
<tt>prefix_proof</tt> combined with the <tt>commitment</tt> allow the user to compute the
value of each parent's log entry which, combined further with
<tt>ContactProof.inclusion</tt>, produces the root value of the tree for verification
against <tt>full_tree_head</tt>.</t>
        <t>In full, users verify a monitor response by following these steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify that the length of <tt>search_proofs</tt> is the same as <tt>search_keys</tt>. For
each proof in <tt>search_proof</tt>:
            </t>
            <ol spacing="normal" type="1"><li>Evaluate the search proof according to the steps in
<xref target="proof-combined-tree"/>, which will produce a verdict as to whether the
search was executed correctly and also a candidate root value for the
tree.</li>
              <li>Verify that each search arrives at the expected version of the key, at the
expected position in the tree (based on the original Update query).</li>
            </ol>
          </li>
          <li>
            <t>Ensure that all of the candidate root values are the same. With the candidate
root value:
            </t>
            <ol spacing="normal" type="1"><li>Verify the proof in <tt>FullTreeHead.consistency</tt>, if one is expected.</li>
              <li>Verify the signature in <tt>TreeHead.signature</tt>.</li>
              <li>Verify that the timestamp in <tt>TreeHead</tt> is sufficiently recent.
Additionally, verify that the <tt>timestamp</tt> and <tt>tree_size</tt> fields of the
<tt>TreeHead</tt> are greater than or equal to what they were before.</li>
              <li>If third-party auditing is used, verify <tt>auditor_tree_head</tt> with the steps
described in <xref target="auditing"/>.</li>
            </ol>
          </li>
          <li>
            <t>If contact monitoring is used, verify that the length of <tt>contact_proofs</tt> is
the same as <tt>contact_keys</tt>. For each proof in <tt>contact_proofs</tt>:
            </t>
            <ol spacing="normal" type="1"><li>Verify that <tt>steps</tt> has the expected number of entries, based on any new
parents that have been created over the entry being monitored.</li>
              <li>For each new parent, which should be in <tt>steps</tt> in the same order that
each entry is stored in the log tree, verify that <tt>prefix_proof</tt> is an
inclusion proof and that the included version counter is greater than or
equal to the most recent version of the key observed by the user.</li>
              <li>Compute the log entry represented by each <tt>ContactProofStep</tt> and evaluate
the inclusion proof <tt>inclusion</tt> with these log entries. Verify that the
root value outputted is equal to the candidate root value verified in step
2.</li>
            </ol>
          </li>
        </ol>
        <t>Some information is omitted from <tt>MonitorResponse</tt> in the interest of
efficiency, due to the fact that the user would have already seen and verified
it as part of conducting other queries. In particular, the VRF output and proof
for each search key is not provided, given that it can be cached from the
original Search or Update query for the key.</t>
        <t>Generally, users <bcp14>MUST</bcp14> retain the most recent <tt>TreeHead</tt> they've successfully
verified as part of any query result, and populate the <tt>last</tt> field of any query
request with the <tt>tree_size</tt> from this <tt>TreeHead</tt>.</t>
      </section>
    </section>
    <section anchor="third-parties">
      <name>Third Parties</name>
      <section anchor="management">
        <name>Management</name>
        <t>With the Third-party Management deployment mode, a third party is responsible
for the majority of the work of storing and operating the log, while the service
operator serves mainly to enforce access control and authenticate the addition
of new entries to the log. All user queries specified in <xref target="user-operations"/> are
initially sent by users directly to the service operator, and the service
operator proxies them to the third-party manager if they pass access control.</t>
        <t>The service operator only maintains one private key that is kept secret from the
third-party manager, which is the private key corresponding to
<tt>Configuration.leaf_public_key</tt>. This private key is used to sign new entries
before they're added to the log.</t>
        <t>As such, all requests and their corresponding responses from <xref target="user-operations"/>
are proxied between the user and the third-party manager unchanged with the
exception of <tt>UpdateRequest</tt>, which needs to carry the service operator's
signature over the update:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  UpdateRequest request;
  opaque signature<0..2^16-1>;
} ManagerUpdateRequest;
]]></sourcecode>
        <t>The signature is computed over the <tt>UpdateTBS</tt> structure from <xref target="update-format"/>.</t>
      </section>
      <section anchor="auditing">
        <name>Auditing</name>
        <t>With the Third-party Auditing deployment mode, the service operator obtains
signatures from a lightweight third-party auditor attesting to the fact that the
service operator is constructing the tree correctly. These signatures are
provided to users along with the results of their queries.</t>
        <t>The third-party auditor is expected to run asynchronously, downloading and
authenticating a log's contents in the background, so as not to become a
bottleneck for the service operator. This means that the signatures from the
auditor will usually be somewhat delayed. Applications <bcp14>MUST</bcp14> specify a
maximum amount of time after which an auditor signature will no longer be
accepted. It <bcp14>MUST</bcp14> also specify a maximum number of entries that an auditor's
signature may be behind the most recent <tt>TreeHead</tt> before it will no longer be
accepted. Failing to verify an auditor's signature in a query <bcp14>MUST</bcp14> result in an
error that prevent's the query's result from being consumed or accepted by the
application.</t>
        <t>The service operator submits updates to the auditor in batches, in the order
that they were added to the log tree:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque index<VRF.Nh>;
  opaque commitment<Hash.Nh>;
} AuditorUpdate;

struct {
  AuditorUpdate updates<0..2^16-1>;
} AuditorRequest;
]]></sourcecode>
        <t>The <tt>index</tt> field of each <tt>AuditorUpdate</tt> contains the VRF output of the search
key that was updated and <tt>commitment</tt> contains the service provider's
commitment to the update. The auditor responds with:</t>
        <artwork><![CDATA[
struct {
  TreeHead tree_head;
} AuditorResponse;
]]></artwork>
        <t>The <tt>tree_head</tt> field contains a signature from the auditor's private key,
corresponding to <tt>Configuration.auditor_public_key</tt>, over the serialized
<tt>TreeHeadTBS</tt> structure. The <tt>tree_size</tt> field of the <tt>TreeHead</tt> is equal to the
number of entries processed by the auditor and the <tt>timestamp</tt> field is set to
the time the signature was produced (in milliseconds since the Unix epoch).</t>
        <t>The auditor <tt>TreeHead</tt> from this response is provided to users wrapped in the
following struct:</t>
        <sourcecode type="tls"><![CDATA[
struct {
  TreeHead tree_head;
  opaque root_value<Hash.Nh>;
  ConsistencyProof consistency;
} AuditorTreeHead;
]]></sourcecode>
        <t>The <tt>root_value</tt> field contains the root hash of the tree at the point that the
signature was produced and <tt>consistency</tt> contains a consistency proof between
the tree at this point and the most recent <tt>TreeHead</tt> provided by the service
operator.</t>
        <t>To check that an <tt>AuditorTreeHead</tt> structure is valid, users follow these steps:</t>
        <ol spacing="normal" type="1"><li>Verify the signature in <tt>TreeHead.signature</tt>.</li>
          <li>Verify that <tt>TreeHead.timestamp</tt> is sufficiently recent.</li>
          <li>Verify that <tt>TreeHead.tree_size</tt> is sufficiently close to the most recent
tree head from the service operator.</li>
          <li>Verify the consistency proof <tt>consistency</tt> between this tree head and the
most recent tree head from the service operator.</li>
        </ol>
        <!-- # Owner Signing

TODO


# Out-of-Band Communication

TODO -->

</section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>While providing a formal security proof is outside the scope of this document,
this section attempts to explain the intuition behind the security of each
deployment mode.</t>
      <section anchor="security-contact-monitoring">
        <name>Contact Monitoring</name>
        <t>Contact Monitoring works by splitting the monitoring burden between both the
owner of a key and those that look it up. Stated as simply as possible, the
monitoring obligations of each party are:</t>
        <ol spacing="normal" type="1"><li>The key owner, on a regular basis, searches for the most recent version of
the key in the log. They verify that this search results in the expected
version of the key, at the expected position in the log.</li>
          <li>The user that looks up a key, whenever a new parent is established on
the key's direct path, searches for the key in the prefix tree stored in this
new parent. They verify that the version counter returned is greater
than or equal to the expected version.</li>
        </ol>
        <t>To understand why this is secure, we look at what happens when the service
operator tampers with the log in different ways.</t>
        <t>First, say that the service operator attempts to cover up the latest version of
a key, with then goal of causing a "most recent version" search for the key to
resolve in a lower version. To do this, the service operator must add a parent
over the latest version of the key with a prefix tree that contains an
incorrect version counter. Left unchanged, the key owner will observe that the
most recent version of their key is no longer available the next time they
perform monitoring. Alternatively, the service operator could add the new
version of the key back at a later position in the log. But even so, the key
owner will observe that the key's position has changed the next time they
perform monitoring. The service operator is unable to restore the latest version
of the key without violating the log's append-only property or presenting a
forked view of the log to different users.</t>
        <t>Second, say that the service operator attempts to present a fake new version of
a key, with the goal of causing a "most recent version" search for the key to
resolve to the fake version. To do this, the service operator can simply add the
new version of the key as the most recent entry to the log, with the next
highest version counter. Left unchanged, or if the log continues to be
constructed correctly, the key owner will observe that a new version of their
key has been added without their permission the next time they perform
monitoring. Alternatively, the service operator can add a parent over the
fake version with an incorrect version counter to attempt to conceal the
existence of the fake entry. However, the user that previously consumed the fake
version of the key will detect this attempt at concealment the next time they
perform monitoring.</t>
      </section>
      <section anchor="third-party-management">
        <name>Third-party Management</name>
        <t>Third-party Management works by separating the construction of the log from the
ability to approve which new entries are added to the log, such that tricking users
into accepting malicious data requires the collusion of both parties.</t>
        <t>The service operator maintains a private key that signs new entries before
they're added to the log, which means that it has the ability to sign malicious
new entries and have them successfully published. However, without the collusion
of the third-party manager to later conceal those entries by constructing the
tree incorrectly, their existence will be apparent to the key owner the next
time they perform monitoring.</t>
        <t>Similarly, while the third-party manager has the ability to construct the tree
incorrectly, it cannot add new entries on its own without the collusion of the
service operator. Without access to the service operator's signing key, the
third-party manager can only attempt to selectively conceal the latest version
of a key from certain users. However, as discussed in
<xref target="security-contact-monitoring"/>, this is also apparent to the key owner through
monitoring.</t>
      </section>
      <section anchor="third-party-auditing">
        <name>Third-party Auditing</name>
        <t>Third-party Auditing works by requiring users to verify a signature from a
third-party auditor attesting to the fact that the service operator has been
constructing the tree correctly.</t>
        <t>While the service operator can still construct the tree incorrectly and
temporarily trick users into accepting malicious data, an honest auditor will no
longer provide its signatures over the tree at this point. Once there are no
longer any sufficiently recent auditor tree roots, the log will become
non-functional as the service operator won't be able to produce any query
results that would be accepted by users.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests the creation of the following new IANA registries:</t>
      <ul spacing="normal">
        <li>KT Ciphersuites (<xref target="kt-ciphersuites"/>)</li>
      </ul>
      <t>All of these registries should be under a heading of "Key Transparency",
and assignments are made via the Specification Required policy <xref target="RFC8126"/>. See
<xref target="de"/> for additional information about the KT Designated Experts (DEs).</t>
      <t>RFC EDITOR: Please replace XXXX throughout with the RFC number assigned to
this document</t>
      <section anchor="kt-ciphersuites">
        <name>KT Ciphersuites</name>
        <t>TODO</t>
      </section>
      <section anchor="de">
        <name>KT Designated Expert Pool</name>
        <t>TODO</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk">
              <organization/>
            </author>
            <author fullname="M. Bellare" initials="M." surname="Bellare">
              <organization/>
            </author>
            <author fullname="R. Canetti" initials="R." surname="Canetti">
              <organization/>
            </author>
            <date month="February" year="1997"/>
          </front>
          <seriesInfo name="RFC Editor" value="report"/>
          <seriesInfo name="DOI" value="10.17487/rfc2104"/>
        </reference>
        <reference anchor="RFC6962">
          <front>
            <title>Certificate Transparency</title>
            <author fullname="B. Laurie" initials="B." surname="Laurie">
              <organization/>
            </author>
            <author fullname="A. Langley" initials="A." surname="Langley">
              <organization/>
            </author>
            <author fullname="E. Kasper" initials="E." surname="Kasper">
              <organization/>
            </author>
            <date month="June" year="2013"/>
          </front>
          <seriesInfo name="RFC Editor" value="report"/>
          <seriesInfo name="DOI" value="10.17487/rfc6962"/>
        </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-vrf">
          <front>
            <title>Verifiable Random Functions (VRFs)</title>
            <author fullname="Sharon Goldberg" initials="S." surname="Goldberg">
              <organization>Boston University</organization>
            </author>
            <author fullname="Leonid Reyzin" initials="L." surname="Reyzin">
              <organization>Boston University and Algorand</organization>
            </author>
            <author fullname="Dimitrios Papadopoulos" initials="D." surname="Papadopoulos">
              <organization>Hong Kong University of Science and Technology</organization>
            </author>
            <author fullname="Jan Včelák" initials="J." surname="Včelák">
              <organization>NS1</organization>
            </author>
            <date day="9" month="August" year="2022"/>
            <abstract>
              <t>   A Verifiable Random Function (VRF) is the public-key version of a
   keyed cryptographic hash.  Only the holder of the secret key can
   compute the hash, but anyone with the public key can verify the
   correctness of the hash.  VRFs are useful for preventing enumeration
   of hash-based data structures.  This document specifies VRF
   constructions based on RSA and elliptic curves that are secure in the
   cryptographic random oracle model.

   This document is a product of the Crypto Forum Research Group (CFRG)
   in the IRTF.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-vrf-15"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton">
              <organization/>
            </author>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <author fullname="T. Narten" initials="T." surname="Narten">
              <organization/>
            </author>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters.  To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper.  For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed.  This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="Merkle2" target="https://eprint.iacr.org/2021/453">
          <front>
            <title>Merkle^2: A Low-Latency Transparency Log System</title>
            <author initials="Y." surname="Hu" fullname="Yuncong Hu">
              <organization/>
            </author>
            <author initials="K." surname="Hooshmand" fullname="Kian Hooshmand">
              <organization/>
            </author>
            <author initials="H." surname="Kalidhindi" fullname="Harika Kalidhindi">
              <organization/>
            </author>
            <author initials="S. J." surname="Yang" fullname="Seung Jin Yang">
              <organization/>
            </author>
            <author initials="R. A." surname="Popa" fullname="Raluca Ada Popa">
              <organization/>
            </author>
            <date year="2021" month="April" day="08"/>
          </front>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+196ZbbRpbm/3gKtPRDUg5JayvZll2eTstSWe1FGitdnjp9
uosgCWaikgRYAJgpllr1LPMs82Rzv7vEAoBSqrrnz5zx6S5JBBDLjbtvMZ1O
XVd2m+JpduuH4pCdNXnV7vKmqJaHW26Zd8V53RyeZmW1rp1b1csq39K7qyZf
d9PtcltuNmVdTS+Lw7SLPp3ev+/a/WJbti097g47+ubl87MXrtpvF0Xz1K1o
5KduWVdtUbX79mnWNfvCXT3NHjkaIX+avXn+zF3XzeV5U+93T7MfzrLf6F9l
dZ79Ab84mpEer566bJoV1Wra1VP6g/66bA67jibFg3y3w7O62hyyTX3ubmdX
RbWniW9nWaYj//YH/pesMZ0Dv2/zcoOX/rl4m293m2K2rLf8IG+WF0+zi67b
tU8/+yx6+pmOeF52F/vF0+zXN89/+eyX569f8a8b2njbjX/44+nZ8zdnzuX7
7qJusDVHX2Tr/WYjYP+WgLvKq+yn5U8CeH5eyBoX8tAfyj+f43der6vqZpt3
5RVtPct+efHs4YP7j59m3716OXtwf/bg88dffP6Z/irPn3z55OHwOX51DqgQ
jfZT0VxuiodPeSld3pwX8e52TVl1szJfNrO6Of/s4f2HDz57/LtH8rLinYzw
7zThafZjfT39kUBEOJTgIj04z94c2q7Y3uKPGYEyjDe9/3h6/wv+0QOO/5tm
ArU/7StCtPPs+33vwQ8lwfL7um4vtnm16j38Pm/Kyzz7Id+Uq4uyWpW952+K
PY35L2WV/SmvznsPf8k3+2Wena7y7HW9y52bTgkbFy3RyLJz7reLclNk3UXR
FIRHRdYWV0WTbzLCjHyxKduLYpXtmrqrl/WmzQjc4yg+cU2x4YMAfpcdgTPL
OwIeHmYXeZstiqIiRCSsz7qaplnuG7y7Kmkl5WLfAddpGTz8vi0at9vT/MuM
qEvmbffLi2jGWXbaZnnWFO1+003waVtEK8Ve6jUtIGs7QkJ3td9UtLEFNltn
RX5VtKum3u0w7eKQESxoaVhyvrwsmnaW9VlQVmI6m8BhRcnawT1KHoRXWJ83
+e6C1u9xlIAkeyBgRHub0BtZ7q7zA+0h72hDm5KWeciKEqdCM9KJVF1Lr3VF
sy6wGNoazV50xZJ+56/KLquXBNKGjovH68otwEvYRNueZS/pt9Wq5NOg/Scr
TxfTZUtCxXzT1nRkYFubslg5wIy4Y1PIdLmwLIJwhrMiyJw3Ba2KPszaixyr
uCK843XSp5dFsXMdcZeimRZX5Yr2AybY4nvGhLI7TJf0v+USqMf7nQmmbsvV
alM4Ylgvq66pV/slc1T3bUFgpfVVhxjCvHZadvF2eUGkoMCoRnCWHrVMw4Q6
17XriK5oPdt92xG2glfPshdl0xJm0fnTuspdLofASCqfyuuEEtgS9kmPHIHj
qsQJ0WbzjvaPJca4TC8dsmuiLHxB0MMfTbEsgDrbom3z84LQ701BjGI1cTxb
f0ie159hYcgfT1LLvPHacXLOJm4BC5tO1l7TGHyaBPqzww5nsQFSEuLT/63q
qgClXORXQBo59v1uU+crzF82g/mztoQ8cauStkfLpl0zm6kZr2UAnNeqvq5s
mC2ooyJo0MKawyz7jYhAlkCH0tT58uIISOgNktstzpXmruoOqF/u9hByfGRh
FQugDA0A5HdbYqrLst73aPKaSPeC4EP0LxiPIfbVqmg2B2w/8CHPErAXx/Id
v9BcnjRymo7wJCcNhM445T11pdDzR+/c9/U1uHC2rekz+Z05DCOdsLZV0Zbn
FZAYHEVocrMJB+oJwC2K7hqsVxaz3tTX9DoR7/lFNgbIOy3/RO8St6qJHdzB
YF1TgJ24Im8PzIzp2DzoCd6bnATbBX5NGOksO2Pm1E5G53I4fTmKBHmI09W9
M7MzOGSXFe8AvL68wuHSJ1jSxPGcF4rIA2TE/mkv+XJZ74n9XBNi1Xs9V3mE
kTfF6ryYZJDB9ASr+wtOUggsLE53SSQKSDHraXlIWSgGjMja7TY5uPfbDrpC
Tic8EC53fzi7R/DeXIEYge6EQySrtkDWpvjrvmxMPg4wv6td24EX8qwpHGnf
iTQCRU8VPQl5ekopidTqEFEEseGmpAWR5BCyEvGFV2mzhG7nBWQquATx3Kuy
LVW80k+O8Y2Fm9DSMicIyjEI1bP4Cgd7h3awKLDLEnKirSs6XELfAw1cXNvu
4+3JecvKhIb0cGeZUhBNv46B5gJTJt1ku+sYN+gUlwXJnbbeFn7PtXyIra6b
eisPhYaI5YLBOOZjjNp0XksyFTrAKrtFyHgJAUjLvqWbx4EWJKMqSL4cUihv
S2g/DARoJY6xhzByWq+nC7xC2vJ2X9GZsbZDLPkCqoXKSIIRiR0iShqPlko2
SQ2OwUpYorFtyssiewZmt8ZQhUvQLnv3TpXp9++ZheI0aLCyWm72K2yHZOea
vixpIuc5HcsPWB0BRqwYCuhsESIDdsUSU8eiCGyhbJ1wV4EpSZc7BNVCPosl
AoYlNoBZPFvOGeHIqiMllZ7mmwmoYE2qMXNBW4iwRfqWVlRc0ZuKKVvShzpR
cSIOT9sW7YFQg7RPUizBB5WqwGuWLDqYWNqL+lrEwABbaIqh1CVC2ZcVFDLb
YlsUshQH3eYZGEklbARn/11Bm2FtrZWDB5ODkdmSjfLrm7NbE/kz+/kV//2X
5//j15e/PP8Of3/z/emPP/q/OH3jzfevfv3xu/C38OWzVz/99Pzn7+Rj+jVL
fnK3fjr90y3miNmtV6/PXr76+fTHW6IHsVaw3DMSAswdq4yspxL4mMG0jrCI
sHYhqti3z17/7//14DGh3T+xkffgS8I7+ccXZNvRP0hFqGQ2BrT8E/zBgVnl
DTO1DYTtruzoCCdQGHAcZGWQckHgPPlXQObfnmZfL5a7B4+/0R+w4eRHg1ny
I8Ns+MvgYwHiyE8j03hoJr/3IJ2u9/RPyb8N7tGPjDavjSBfXYHBFdfOvQCz
ygnNumt1IICZEhFCYE2A5Ot6Q0oAONVyA7KeirxnL0IJdgQtn7lR7pZAcGI3
J30D+GTCMpCGzzGSDGH0eVFvVqznqhVMB4XZ3bLeHUAqOL9YaWeG+HZHYhsy
Z7WrSyMcvEriXhbKzPqv+4LUAdIdtvWqXBMlQvStRK5mz/S9ZU2kUkKAyEYK
6AWidvZ1H/ppcXCix6qQIUECdEpEDa3QmNKYKKJN8fBOVxqWArqgvYm8pfVv
oQnQ/2dDe5mYWUdHtCm3JV4G/sPuuhYVStUAGYVpjA7AdA5hPQzHyEor+btF
ISq7uyANvu02h5lhSSXmnUiYAZ4Af1o5Xig59ArNDe+aWHaA+IJk+szZVlWT
C6/scrKgIm1OvxAzYCIyQ3xOoh+CyZFckCMA34UHg3eFpzImC6nU2ojOnba0
38EfQ4vGaHS0XtVnqri2vQjk8IOgzhl0S2/5bur6kkbieVkLhyZHEtA+BhLz
BGbf5fSOPiTDEdAVLQ6ojI1e582K2Ct9cktUp6YgU96xiMRkNBfvvpJxezAW
7ht2fAvz3ooUYBnUQSiKvAW7VZwkiw9s0Rw9MdPet4XQ6dmPbzKWeFUnyLAh
42FPloQx58ePnxBzhmhWdi5WGJlcwi8IIF47MCOEnQmrmqaAOaboawq3gNC0
Ayce27rp/DCiJOC8geyVaqDCDyK0bcX8OBAdQwmCdwNuCQeqYSNqOLIpixHu
5xtS31YHBgg7S0SEk/XYiH7ncmWavZlJdyTc2rOKcUjsueIt2eeMdktYs/xm
Q5OLFUcHchoPBZWmAEtcwg23KGnVzaH/abPfQNewPWLD6lBywUbIvfWxYK6g
ThBmPaQK0jd4lxgBnQ+LWN5Z8qVTjFSaZPaWV8FsV62aVfZba1KAqlVLKgJ8
dLD4DwylgwzZQOdklkbWRbxjFZfq3jLzFJQjnB2fq7/ETD9WEh2xYSZX8I4l
7GNYumW7ZX7SFLDX8G3YJYiHhAuskwN4MYwxZeIEt5wsjfhTuOkI6TbF2tTF
+NDBO0mwkMkz6dGSR3Qy8+kXWfYyYkzesRcUe9X6I/EUGwB3OzOec3gH18Kz
D6kjcHHgfQwc1Gbp3ONziaYMIqP/jaMzrg5bsvxIRgQTCsp8AzedWbkw/GD9
nu/LVc7OSNK9xCgnusZpkKbbOnXF7btyU/6NkJDsCJEuqtZhXREi5Vd5uYEl
NMu+/qfpNDt79d2rp9mPZXWZriCbTkn7uX07+5ZMqGX2ivcZFOXa/1tPwByC
xXIPqQpfrx4Ly+a8NYXoqXMPZtnJyRu2bJ6enGSvCcykpLSBR4uD00wa5dg9
IZEFIQFXvArnIKRA6oqc5uONxowkjJIfHyDOGCGgkWkiwL30H03tKWSw8KLI
CUOShwYjFX3fVCIAlnVD7H9XV6zeiPQBDrLHG9rNWmxCEXDDeTAeT+XJgOeM
p/TzRWMSwk39uFAgOmLDM/cQ5/ArC3Kcw+lq1ar0TpULI1C2DUHDon+Ob3N8
Kz/XXWEshsg5sgdZWcBUosSxE4QP1M9JVvi2WJW0yg0jgkBQPLqEdrKBgJHC
iTAW4EMIsJcBsXBBcdVVTDvJs0XegTWoJNflzNwjwOenmizEugGARLYL4vIk
OjXbvvtKmYRH+8jDOhGs4pHY96KOXkXrRb7ksCebYxxtQYyBYyZEfS3b0Qta
G1F9sbxsBd/VW8oAak1CMsOtRRktMlNFs7uwBSADSmY7eliiaLZyetCYbT1d
UxT3VCPEEdWZuDnbjIflGNM2F2e8SK7rSoheCUhBEHv/5KfY/zdj/vJdQUbB
gXn7TzWpPc69lEUw/wX1InpBJ9uKsMKj63KFBw3WpMGRKRxfrQkg1nRpE45E
HLPwDuKukAjXimcUuTlg6Or1DbZ0In5m7jmECMbiaFu7Kc8vOo6v2TyqgG3F
LKlW3rGzhEiqWlq6cU5ajONjHXU4mkJukTrY3CekrDWrKdSmQ/ZTXpH+h4kI
N/F2+vh0j0BUdY6HUAiva9351oPDaSgsqIwjbk/6alOcA88xrnFMT276w1A0
stLdYUH8Icm6X8VRDypXDyaoZgunqvd+Qa1pSTMSk7fz5kIk7T8IrWhCMq2g
yJAqCicbM5SmXF5K/EP9y8tix2pM8MZKpBPxAQ6K6PkEsDLgJmxcm+4jOoOd
k+yQ/UrssyW6FqN0PKJiCx88CNZ1G5SJaHsYbtsWm/Use+6nrlgZBzPIxZ+e
AEQc/VCqLjT2oVEyMmrYY4Zg0jlNCVsj2EGyv/5gBD8aAc6BEpjeKk/1kBtH
1clgnJ2Jfxbw+V/gyDgYmsE6dtCLyf5haLbKQdl1JTioTIGl01Fosg6OPbaw
BrFLljze994GDQkSSENiY/SUBFmCq/uj22A+9tHVu3oBv0UbDkLRi5Qj8Jrr
Av+bYGSOhbGznTDyHMaU8E4SY2RQtWaXH6cdnzcA/sS2pq0KgkCUlqV4NE5O
nilu/eSl2cnJRO0xlZ8kK1YIwu9gD7Lfit7aFLrcwIRELa/qlEuc8bwkXer1
2jvLe1IyEqU+VUDZGKswnHMEgHsSxSh3ON6DRRGe5htTMcLb4oRiI8kBKFBH
iSpII1XBCAcEZ0TAIJxI2G4D27Hdl+p5CrJIwrBMl848HXSKSJiJ5ix2RMac
CyIhUYQ9ruv9ZiVIQ+KC8Z5dFja2i4bOwtDtFlypt52m2CFksoIWMOYKgtnp
DG+UcbT3NBDSExjiTRhweqgfiAZWYnBEWskasX0nQZsVY33ZIgJh/H9RZJZB
UCs7wqeAarkukFyh/gkY1S3B25HlS+eXi7vHo7A4CWhJyJwKclbQBqoCBMqU
aGLrA9xQrUgxVMQ1w8BiDKnjQjSVN5pCkf1hnxMIugLKyqnpOoymav8AiVRN
pEX2FdRAUKSXsceTI0AH512PEXrna1o13FrtPYtzYvRzW0Igj4GdGUQMfG3e
NEuld1gLnw6wzHJk6BTON/UC6Md5e2RomFKn3tJOlCAOCwD1hPy9c9ZHpRkt
zB50EtNSZSwX28uYr9/XKmxMJLKIKsvgIKwWP1orUhUeTP8eHNpkwMer0UAa
ILoWO0++kYAPUdudKzDGgo76t3ix6udsP7bOZOdivGvoyamnlDkNYtPAatmM
BvdsQexjZaO83S8kHg6k5lX/d7HH1SI86oaI7UI+7pBBkBw2b6RyYheLRX4W
LBdevg8ck3LWNHAiRFYYcEUcOfEJsf8qNsRIv304HNmHaOEngqDKOD/hCnl3
4p0neiOzoBArWSlU3FDqSPK4oePyMO1gHHaNsnajHoBFofsSa2VcouhxxIeF
Ew4uI5fEjDljLXIOGIPyvqvI2DUE4cwiWuIBmSwlGYKceYfY97p8C0655ewJ
8CIsgJmAbFK0h3Sb/HUJdGHX9J7dmcIJbbeKWKzk1fUijXoLSWN62KTsXJME
vZWiXXADLsn+yzsfic0X9VVEDJAXSHhixYXFlrFXY50ka6L0njSFb9fAfwkG
J1KQ2VY3IoXs9Ic2B5x/7LslnJ6q9va6p4Ey8saPTLHzhpDZG5J45GfLPkB3
iflhlgJP2Xxm+tlKEqbUHnFZsEiWPrTzMaNkmg31ryxoPqMLTyQUsWplZplk
wHKU1wJ/eCMOylyyO1jJQX0Z49JpRkMxil3TORccxSO2f5Ddwgc0pQWWnEjA
mQ+tZgBgzir7iyQEcsobDNUg10EkEEvtoVoqNkZ+y1fwi7KCfVFvQl4qhsc6
OkS1fahOwhxICyUmWLbslDR/wYyHjkZ+WQV5/ywx2ydEBJulZLzBH8u26qHe
h5wDLDmi65ETY6ua+SuOjIlN9uZuE5IRIT3zmjiyMDmaoJjN8CHyXZRwuZD8
vRAt3QeJ2qeSIEE/igOCtktcRX7QnBBz8pqnox3a9Gz4cg7qBVkc0w2ZixuP
5j6NVuWhswXNaJewHQ3Cm3PYQRdbEfb01i6kILORojJFJEpN5CHON6cMRnbB
YoNYm+Q1s5KSOKtn7ga+7G/Zkj/sNI+EB1a1Bj+cVDDsTyy2Dj9XTjKiY8iW
3h1BiuEJL/FkRrofvgFSeQfzyabI1ydwuKtyxL6zcrNqCpaHeIUZSBe/JJ87
/nzdyQcn+nbD9p78RKaHnxLQOQHETkQrZySI53Uyj0ZmCM9OYoDH06trUVYp
KCOfwm+7EsesOwGdIHv3xMIJkoIcdCn5SC2HE6AWlyd0ra6QV55b1Bz/mrDr
IMDH0Cv6FhIjfgkgOCH9CNtNdt4Gg1XQRL2x6VhZ7mRi5OipMnxyUeSrExNp
OrbfBrtMaG/dhU7HWBqfAjLckF0APzwb9utI/YxehBKN0FAV+c0UELBMGXpE
MWAn3t8jv9LjaB2sUbmTZR0tKl6PDqjnlYVZab8hkUHR3k7VacKIDcBpjQB8
NPEE+a4ku4yAAQkxjSALwbec+zGwHrFQV6LbmOM7ykdRm3p50dRVTSyLM+7q
Ruw2Ni/cdW5pkebT9y4KTnsSgiGlbIMIGR0iMSGIKOF1sM6iHwCfk/Aq4z/A
9LdCiw7qa7GbwWEx39qnHeAQnMA4eMgFe5limXsxoSr6qKfc0wZmAepGy3Hl
cPm0JrbRr5B9I9NOjLkEdGDpqd/4sBWvQ2f3uBXe5zOH64GO3b71r4tuyk6H
BaOpB7H3/G04n9qyF4I/RNET4t4oJ/sD019uOObm1ZxAVWwlNNYouEn9/Ou+
yBIIJMcV0h4Ma9vCFRtzrbe6Jg0uqbYIIzyCHv1MsqoNbC7vHZhjxjKLETe4
biPxYE4sTLpmCqF5i2uDiw9dWX0CDz7lQCJiHVkkz2Ia98PqcoU5ScaD7N8f
7jiQeJR59d8ezA0cloOiK2OXDkSmT3dAuou4f7R4BLuL5ufjEbBhblYxdPle
79CIXb0eowHPq/vsgL0sSKsNyqm49624g4/oJIQqOZTYnmjGm1sVWwZLbsHE
XI6Ds1c4lVZdGN4XfOIdF8vDDUaLM5cYLOrHQn7u2w6lR/YgTkWyEAjiz8Rz
qqy3AYzgZZJs1VioMPEInLIjMZr5Y7AJ9rOXYrPiOESFPC88X2AoeN6eDspJ
zogbIjmt71Qhy4EIx3PzgBGdj6cPACjIznEbp6np/Xg68zy4LtWPnmeDcxAM
5PTqxs5fnDlbIsDtfkvaWydR5EhNZPzUjXnexAVZMHA8L5M0Ih5NYdcIUUH/
LDIfdKs3sdbp9Q8bMDxCzr7z2qy6bMSg8EqpaZsPZw9mD7HyKOtbxORr0cRF
Ur6O1PJxYdlP8btmutaUacOgfFFuyo5TGOMgWvAKywgLCdOkCQjwODkJaXq2
JgQU2QyRr62XlREtbqKLQ46Ni3lJ9DH7N3Rg0bKhcFgJRaR7ZVDILJ6cq+Bl
eVpW7LmoNTVp+H4eRFJQpY0HtlwxEbKdRH8FWHRVkqKiI4VSPsLv+8R0O9tk
tFQ3OnXEBpO5s+Nzu+NzP8Dcqo965ZNLPuL0uQjQQSkNposdqSiPGOY4iKJl
Lorz0qdJDIAQSdAbDWA7OU3wS3OH1C3MACATWpNJu8CbZNs5O+uu1Ir2mo8s
QutQOOyAuVRyi59V8l6z+6YyJcckX7rwJb35ICRHwl3qQynBhczVgwIViWHx
X7FEUkbIct9XXbnRV3kNpssRR9PQbpBijOZ3Q+0FKhDpD/iMFuxJcGrPcIyA
dnNPLcqY3sSFky8v2yx+27ScnwfJPUPdRU5lcYh85gQPFP00Kw/2skWdClxC
Pk/JalV6e9PVWS6IKmDIBAzgn8AuE22KpaUlOIrq36a6JvcYgGHDezo6uwuQ
tfO6bmrheghYctUsJx8MJEwME3+EYYEmJiA9RPKy6lzV7AviFCz4izxXY+OY
zqQIIRHFjGswyFxzqQLu8SFKSgn7ybiyUJxw1+a68ysQJn6WqnMRO1d+UC3r
VZJZHrPtVBl0PWUQT/9xLdDdZSSF6281JZDIPJKaWHldw7sfEMFAiJAT2+6J
3HxmE47ZmIziHFBcFMucK337aqUXjEM1BJFDBMlhZpiqYJlpNZcrh/B4Qwrj
lRlFohvyi9d5YhjlzjKtQq56SPP0a6cF3mHKjsW2Z4JKLq5fDhHKtGbZQIMI
+wylY6z+BVi4vnKtxgYx1OUAAqIoaqqYjqeuaPYJaTwpLgQEgYJjmWM16+kl
rPAdU7ddIhZMoHgaguHiZVkCYBEwmuNxLVltksfh08k80qa25SSUDnJAGB7W
d++0xcX79xM7ZyCeFZVIQwSwQ04+0wih5MKNKGypNhUNQgPuNHcoV/nESVNc
XUlsxCv0IaSPcFArUGaUlMlXg7CTiPhUnY9XIRElKBmKV8ZZEEmqELBvg4nC
q3ES3fP59sxFwaqlMqgMcf9g4zIXFCQyaHU+IqqmAWuFGlayIk87quAB8Mkk
rLqHWskRejaEP0JZ4JVJXeVwtomvloQLWIztXqxWeDU6zCCDyEruoXRz1f4u
FklR/nJyBJYzwAMcymKzahMJr4CP8k2UAVihtlYS5E0jWQEYUMquZNEaaU8p
ScPRHrf6qb5xobDth+u+C+4pcuHLutg07pCABjQAzbd0QgzgbxOYSfoBR2FC
uZmCmD37bJ0GMpcChxL5KJqe5VhaHA/hR0QcwlT2UmCKuQb63GgaCwlnFG+8
pan/puEiyaU3dGClNJMYQIIVTlmloQIK48tqVbztO94SDyPnDXH0i7eCSYMf
weu5RU9dWohXCsF9yfHnpB+Y0Bi71cHpDN7UceWXd4vIwX9+30A7sXRwSU8z
tdufnfifbkl/kFta58f7fPQ7A4yoPwIej9BPHnvVjCPpNImlURlelsw0eZO8
uWQtiY6v/Uk4X0oz9p48ZhB9fn/i5PCv1X9p83+eLo+neczLaFHzMX4qzuTW
PZtZwM6NWXjYL5geJWnVkgf7CjQfoCR+CYL77BnOvUYJf9ffyJMvImXsIJp/
Ifn8/L6z9x/9Dtjw5HPLChBfq7oRLadR+uj01uRdg4rPCT2NF0dIpPgv++1O
ASEh6h6D8aQmBOAbNCgHmyS9SLYc0JVzDm1SmI5snFtRAcatwXJ67S44hce4
GWKVBVLOVISG+O6vPlku4tDj9SS6a0HoxcGti07gxNGiE5LYpIQVzclJ5Cib
hKKIg7WbQYgX1kgh6VLsTJX1eRHvU6BoO6rF2/DBAano47Mubsxn3Af5jNVz
BL9DLF+OjBbrdZ48JsE0DhbvBh5SGS2q2+cK21wE8Y1ZVBeDJYZGoKGJAwEx
IX1JRjRGoL9Ip4t0NWxTQHc2L9pr6TrAmmLcvUk+ZkrnDiQVC5E1m+XVIUr0
ZOCqyHJxU7zQIGKiSQ/a8IkzHxCfSX151v+AdeG+fLojvnxLrdOiTZ8OacZP
WcnydihcRkjNJcWUXM84GeQAt1o9rUmZlp9pJZGQvy603kqieDhQ0t42rIWm
Pqm4fQ1UMukUxhXX8k2ix3BUaFt4VZcFrS200+CONpHRckhkmFnO6kyL1Grl
MQxqYzDWfORaus2sSrKF9rlpIZq7TUDXzml5eyktPej8NHkvqYVmv8tqpSbM
qghLjPqjcP4bs2ebnemL86iCRi8r6Aa1srA6a24St+lXseacYVFu8wbNTeys
JN2oj0cyMFtOhBmEhMTPpAJ2pGh2VyPhSNNMLgquPlrGtX4KKOEWmjU0IfMZ
XbKW+7YVQ+DdO8P7aa0dE96/j4zEzmIbbVIlxglJaamaj5qMZB1LVyMraYDH
4zJtd7CA/SySx0tq4g+hDlxiZb5pUyTM8lSqLHr6rIUB4kIh9+6dWRJT6Pew
HVkYmEZashES+Vq0L5s0AtRoHWsAQOlVyMJnKlBzxYJmkWNQmz/8TUQ9gK1m
jfAKmmTmEveDASO0FUrbwnBzkVZ7KRRvkY3G3T9UPeB84DwVGkqlKsEi9Ivn
4zRuMX7Ny6sJl1wfnWYDco5l2W0L304Gk5Q5F7lOzO7tWy9mhcL7FTeL4XB7
0C0jO0gsGNLpTIVfqc/YZ1Eq8I+VfWjkykzJLbLOVr49QprNEe2JBqi4mERi
kVr3zgvTunItrglZfOHjvrHdFHqMZCqFCI/BTZdoi5pl33IbqnNJDrFB21j5
9p201FZvTZcmyDYVPJ0DSpP+fyRfIzlF2oBqHyOQQ4k4cRtzCvWAGAMJFmVx
qNXnabu2A2EX/K7mJpjcXmqP6n7ulCBoCM5gTnyLtkiiwm/i1UdKuZaSjPGk
XvmsDztGxvzEaeUXZI7lqBtzGoHVdcgZlzzeiCk5drGwNWpV+zBGpeQsek/F
APvgOZNJTP88+yM78bjb1S+0fFrti321tIzs7I+/vEC7iZfT72Zl062ny3Vz
Pr1q1hykPOXHprjC1SPtCbc5WU2pl4ozlaebojon7N61xX5VNzKdRkyJFTiM
xpK/ku5lcYF4hBVeTQA91NrZJo97z83ctwQ3a8wFJxcNLRX/3HnU+3qt/ljL
AAj4O2Ru7zv6Q5lEK0A3w1GOTslNI1Vx2xMtCGC6DPVEdSwvSNDHDVHG+/Cp
08jXiMBnDvjUVu+KFQp4tQpMfPyydH7A3mbs1tfDLYqoSkljx8Edl2D72dia
Omwuob8w3yTNVAlwdb11la2VFkwsbSwu0jauZuIhxhUdhQbm84xy5VlzKtde
Owyivl5w2bmWrybxPSnBH3G3TXxUgCRdXMogHE24sLDenucObVThFG8FgqQK
SMQ9Ut58dQ1/TBux2kx2y4En+Pay9XrNicG30KcSrcYIp3POzbjlS5MKKZnh
THRnvXIz1WCA6myDYRFl0ZrZJHY/Wj+RlkQnfJf1V9kMw3eHanBtx92ye4M7
uQXUk4wxbv4qNUasfAVQaA+1cod+fKh3azV3YKCaccMb75OQkoZl+G5ypFzM
RZlXUjI2kUVZtx1BULFYhWFbxYDqLZZC4dLKAsn7EB32qXMn2anEs7wmxz+F
0tf098BPsx4/ze7SWd+LXmf8TocGcfjMjpsnQMPe9sndinojC0xG75eM9mvL
3YeqpbmJI/ck8MEsmRUsKp4l2KyuZ2vEmnX2KsT2MEKcCY61jUsgKYzRgyR8
i5FNWwzq2uJcVnnrDd7iBG8tOep961bo9mcWymU3jV9g4QfsTvDmWYQ3FohU
3YTWFqlOkpnKyUW6ru9/On0mCUDosQ5jYO8jKnyua8UhF1pJWf+IsC7VApgk
1dhM9WJL75F0ZjfXplBzkUCxPSnavpSyKe998EQS3OMhsrkqXfPQnVV3BtL5
+9//rvwb4eRYSf89b/kuE/sPHGGXcbL/+A9rVXUPnzstXp3bm3NTzWw5F8Xb
6aqQcDUvTeZ1qy8ePlh/8fmX91dffv75/S8///LJ4vGK/vno0e8+Xz5a/05G
Z8+IsByOlAfFmo9k7VUhpYGmMLCHvbRL1OROtKAKNUcbyUPwoCPxtdyYvaMy
TMA4D+PMrYUmaxPo8W4u3gTImT81116YE/sSVpfpP8GpFhsBIi3NZeOdMMNM
s7OLKG1VswyTSFQTG1e0Tz3obtM6TUJ9x+3u612OlF2C69dE07OfL775in/f
Eyd79NCcml+59zr/jzTpV8mhX0bnjQq1SLxMADoewL9hXlIf+PS1WDhaH5c3
Y/BunDZ0PzLkfZSe64xUttyTevu57MTPqYcZ+0kjghRuWDGimsM2ypb4x4Gr
oGUc+vp7YhACXYPka54jhaW+1V+5auQja0/4jjBJns+NZQB7dnYs53Q8+cOl
yR9DlqFVIkIsxDRo6Lv3395/QHxCr1RI/sNy/oh37+qHmOgZRr930y94RfLJ
PefCY/ztHq6OKDWhG7Ij+/3vJXcOlS9yr4RkQHAJ+t1//Tec/CRT2N+jF4pN
WwyGALkNRrC93gdP5NeBnPZ3RfajQ8puBoPyO3KMfeSYkyFX1Z3Z1UcxISnh
yN7dFuVpSkqZeLIiDhKKg2J8D1H/T0L2wMwijPdPhYj+jHETgqCFCl+5EfnQ
2wnteKQfTXv/NKR3RzKebob0GP+ZOEpujNvZyEcpescvHEXwUeyMETMikE9E
RyXlwSg3obvjRKME4mWf0UyEI5+60PhIBDVua+3l93CCvTFdWnV6dYwN/dAW
+Ovl30oXizi+aBXp6CIZlNhjJAKR+uQxU9WfIYu+in6DKMQ1HxGxeNX/6/uz
2cN/f/Bk+oDRHxvCflLJ4Uedi4jVurHQk8Q8tv2kHigrfvq5s6K7MmnNFMp2
8tarnSv2DPBFReKyQ5KnVe/+WpVvXbGrlxc+Z2CsyYjUgZuGPd5fSBwaUBGi
aA3bLrFLNbalFgWnKvnk12EF91fOd3gVt0Jv5N4IfR+LqglhxpA14/kNV0Hk
2dzO6+zbN/NBkhpy9+pmV4saH7DMyhWkGQAB/bqAi6iNup5oGHldnu8llhNh
XUEHzzinvdhXd+/fQ8M6DayFsuW7D/h3hhCXzgew333Ye2RF9Xcf0YP3UZc3
NHlLeXdsvkVCCtidfsaa+BjS/1lO5M9QTGP8D3KhWR97h16i04Cb9u6zGEAz
THZPFV++VWEAj6fh2RhM7FYqXQO42/GFDsYxAPZG0WYCxwd6D7JPdtKDdvxI
ceKrT2c4cFX8eShuI/xVlmMV7a/Zud6rFh2pldJclKjYzucFWBHneC2VO1pL
9UZC83Aa59liv7kcn7Q6BBboNB53vHJrXVwjOSIuSIo7oUIOM9MR5cF5Z0Uw
93WKLlj4nFAR1Ry9kYtAfBGZJXEnQkMP5GeTr9F5xOfun2dWQtkTFS8NJnxS
enrs35v7b+e+dJPj5cCTSaI08e07Vh6M6yDAl+aqss0dgXnuNbKIwbVZ3DB+
XoX5TEnVCGtPM32P66N8n+Ak6Ckj2V7nyJLM2VPNljWNxjWVNJjoblx3/FT8
zaYN9opd46IZLf+REmDRIcx1hapXFgr+5ixFDx+HYweYqM/+7oxkDpfUEkcF
JdIZtOXMP7jHxmvzDE1aw/txFeOjGBENH+PEKW5amkg0qIcaN0cFhExGUeGj
mCCGq4BP/MiDmCcSo9QaVudO5DD95EK9U2MSkvafGPd7qBsdd3y2wzSXBrQf
bvIaWmwxm3EDv/rN6PyYmPa8TMVzVVeelAFqFc3xzwJ0Fc2yV2lX9gsn96eM
Y/hcawC++jgOBdmqbgzscCafJ7LVb8LEXd+l5N/sb88+CB4n5vpHvpCdPzU5
Ga0qsg/nskBCOSRlc+RJDtjS+KzKaCOsok4qkK751KbZ3O9prkItFOVs8yij
UGOK4rDEh/0tDr+Xi9duOobR2PqTqsUUFn0O2k9GVKlr9e0xYKDyo8FtV2/B
aLmdPthsL4Ez+SZqXOETejluOnH9TMX+d75ATAeI+CZnpnF+h8bTQajO+DzX
qwiv55w1kifTvxVNnbR/QXxDPGuJ4024vfM9tYeNy1JsmrBEiKo7h8kB8d6c
P6Y7cW57ast4vqGhRhEzfs9MBNyGYYgTE+RyHFkNZ9MXXN0aCqs4QctDnhHl
ThsuDbEbHojLBszxaUG6zI+Ws3tJaUNMLHMcwvczkY5Ax0qNPiLQLk/SCoJX
Oa5/z6KyJhyK+2D9e8TpR+rQsne3eUfTNO1rIC98fYndHRMLELsliHGTY8g+
BTlNsY6loiqOvQQnvqIpaV09yEhDI3EY7YmLLmrMP6IkRBzSPHI7YZcfduO9
1waYb7pil8qT8Lsk44vA+ELlRaqFBrkQRhyqp2HEWI8ACvIETKcQxMw/fSwg
5LjlrbW25ohmku03CUURXoX31RA84N1yVswmdjDrOC/bHCSfVv+BE70nWs48
BvnciTxi7Eg2nQYAOKvQUvt7eKyrY1wvW2c1SEmVbEw8oTw0iWupYOwnbDlL
9tBcmGh03U8sE20z8+hc51EduZO2/KO2GpqNrmNikEzWwAHSQ9RrkwUeW5+7
Dij0qIhzoHzPCH/JWh/AovwmpwM0mk8fzLWxFphhL5tV+15g/W0c7PLvD6zh
qA8I33vKzq1FkXDQhLeFXp6+UQ4grHTgHY/cvoPEXl2VS+YGRRs14I3ZC9Qo
35v64fGhIxWcM5w3h1B4gqwA1Y69TMf1ARhbj8tDXBAuTYBND5NOyLf94zyu
qM+2oq4U+fj4YHTJ9iSdDTC1piAxRvDxjvbAsF4P/bOXmyTBbF3ZxRmfcb+N
hIYIPFGWlxc8hXXjYFi3EHlEm2pCLoVbMA54uRKahSnLTMgMye9aX6exU8Vi
1h+L9kOU4G5b8+IXrBWIHLeC15Dtigj0IRZ1vf5N1oOIvcx234dUOSSSOso2
G1dJVn3lqtca1NoGjtT2IftrEJ76sOy7oV/wBr6/cfe8GiECYhG0qaiMnyg6
xk5N9vbwgI8eqskuX7BFFhs0V2pCM8tNykGT40i5f6idjrTmoXvckhHgChfy
UtoYzEen7X3gPot2mAEaEmV6VxC4eXoSPY8qKbOeh4UcMY+FHwxFyq5H3Klq
h2px2I2gH3yfDPsw9OgBRKmGUnCk2QwTOjWZNMhEZyeGt/WpKLh2wsOiee8S
y1s3j9BDIl/zcGES396ZNA/2JkbZJvESOLa48nq/Za42MqrwDqRTxjdHcRN1
rvRzUo4nCX+cNmv90n0PUhQI7BfgMFKRah4IudJJe78Mq0IEAIZBPvuj05Jm
u1WGNWSrCuQrxXfCb1ClwS5aMLThNVHRaCspEQoXUE8k9ihcNg79kfLZv/pQ
+5UJvUTxOGPCKFczZ3pmObeHkfMpOeXnH8Bs2/DXguLfpDgePXvy+BteT1DB
9RAUy8Ek9o3cHzuM26n4ay2LOHEkfYQ4AwAAoAuOY0aL6/snv4nbe3z1jzDw
ftDlVKItfh0WfUnWw0z8BZ1ICLaOnAMbBHHalE9zoJX3HK/01pgnTr/Q3LGv
Hzz55iP8SGCt0iAeKV4t52GlO/Lzc+AsePsiRV3xiuNn/kCi+b6RBcU4I6MI
ypDiCJSaR2526Uk/jkTMm0KG/6Drg4ub5CTt4Hymqxg/SCkX80+52t8K71uY
R8PG5kkMLHC2X+N6Ae/u1YZ6i0Mkezq+qo+1UVHM/xicNkgkCwqbh/jMFEo4
2VvzVZhzLwgLIOg8ocZZLGh8J7tNXqJcj+sMRO+L5mKcnPNFcM9xXHZPgU4T
lic/zPtNoHRvcPNlmZT9Dfwh77VY9VqLNDSVlcAHpw03d8Llu8H5o7XgNCCO
yReMRHcXcC9YMNEc/HRVsoYauW/MkJWyh5dr7peCAX1BdnS7ROSt93NxnN3P
tsCtpsK9KrkLga+G+83r+B9bA3OT9PQDaGPsmsUYGCdk29XG6LKePUxGitIK
qpA/MPM/z/mbR9E35sO2qG7yIVNku48ap4gMmxlH9Io5YNOvUYuSQzRZJEg2
JqjYrAQGh2mhm59zZqb2hEeJGLxzmV3OzALwuvAqCC/Jukz0rkPSS/ZEJ9VV
zgfcex5sJ0ZkXVXPiWYDIjgUmloMiaOPXbnWdmm5Plsbe9yMFOwxpuIrHz7b
1TvuK7+y7OSjpX/eAxtZvI7tjUJuzJ1HvFiVMm2SpGnZyQuWjpzuboxkhpuC
wjPYWLwrTqecoeGlenX9vuT6CFFjwmUaQcfxjXg4G1xMEQmNJaps3+s33Pos
G7jlb2g5qkWTzNZrzuevjfCk4eItTeLLooFPouBPxapFZYCGiqU/p2rrkjmu
Wrb0sbppYtTwvgGDI4vRpoCCLJ1Wx9tfDFVdvRwnu2tFWXpn7qi260eS6vV7
Xhjt6rZMWp+rKNaatbzzXn5Y7CJmfzr9k65Yj5/bn81jnWLuG9Jbtb90/w99
DJypDhXfQ7EjguYn/qbSbdnK/e2crXXb3B5DM2V43WjfTrE3PtFQiTv7iQTh
myTA5oKRwlIvtlQ+2YrIBlaE+89aEUe0zw8YEQmAgkYYqTqhRnMc53NcVRuB
bXhZrbNoi7+XNhzMTUyP/2oNeUxzH3XvvE+WqdBJVE7sO9kKghnsQ2bh2DOx
TBGJKNRFtB67J9AfNLqnN02nmSenNgvsfdSLJE5fZxj986sz1pS96y1lqDVf
d8XFTjnJlpR7hoCCUx07KVedx1CMJUESLUUDurihejK/1+kj/hi2NeSLA35m
zMy3w3N5UqRvZ7DbNzvOTVlHl+h8kNO5eXzSH+d02Uc4nRtwOpUSIx4ZffIB
l4y+8Qmsbjzare2Co30peGZOc/fw2/Di5dCZxCTc0mIoo0zR3ZQpjrlWlIZl
FT/0s0j/Ey7F9yaxadCxUOkP/qo4DHYsweYfS17NorntnbFZ3n+Qoad4kPAs
OwwOawQaaiPA4+6IoEfz7F4RHSLTJ6g7iaMNFyx6PINCk1zuOY/3TqaX7yeB
cvMg2yOdyMlVdERdB+udxCauJJOImQv+Ed2WhS48mgvxUTeZB6mW0X9EXP3j
YXoFH386DNb3n35qyD7+/pNcUENBKhv6v4T+MpEhwehM7xNMl2OJ0xD6BqGO
EkVd2+AtGpHKkaRxw9ChNhEdEsk8Jb5ZcKt5Y9IBcZPQaLCSJCNPg7jcjU1r
P6JooNon6rFDKXUdAn8t+vJzywFF7SQ6nEJ0LiQZxYrrqkBqGNwc3hSPBnAp
Xc4ySfiID22eFML6TsasNbRFaGjKTjPmNxHht6F5yA6XEibXiNj2IXAu1NBF
PNm1cDASL+zQgliuiVla7e2Zd4pJmka61BCAx+AnehVYGzoJFr67q4uDpsGC
7F+0EWWRJkl1OjKvotImtdItW4rgc19A4k/c5yL7XAoJxgd/5iApSZyAktDK
c3hjNmwmVLtY47+oXTSd8MfxVxzD4SamdoiRmWKk62MkIwz3Hg1hyH7w3jeP
7ZMnNwSZBuAf6eQLt5/Yr9GlS5Ne8yeXBP91MVGnFilHy3qavvnV0gVzrki/
k3fqMvKIbDXUqGT4kHvNaUxLZNmEL5JsQsaM9xpqDYbEKuOrosI14dz5p7fk
YbZCAg8u04+INtzVAtClyRHhhg9F3oOc4CRMst437E/GZC6hwVlIjZiEZifd
xVj+n2boNYlB4swzP0+F1lzC5fhxkrYUyk0HCE1xbhglUJiHiu6+aCmjQC9y
ilLp8ILUehJxxXHpNDfX9HH3/wdd/se9/lYWeVO3v4425o1Pr6i+geNfx5Ik
lp7DHI2FmCWoMRH3zi68n33E6ptYL2QZ3L/pjcDoZrjsru8lj59I4ThnZ62a
LcTouA0pwi52Oal2xbak6pHdtVl82+JY/AFLC+///6jD/zNRh0c8napCsUXR
n2yMZfRVsJInTNhGT8l6ASCkTKM3yAC34PFXJfIib1NaGtQVT8JVC1x0V1wr
CEy883h84RPn72nDjpDdI0zf+vMyNAKW+tXD+jJZLMwotFeJk4OjW1rC7ZNG
5hiosIba43cdpNAfFdUy2M0EtrGe44Lb1mZ4egNXvrZM8+mx0o5NSPRZlAAZ
RGov47EYKN6Seow9FCo8jO9eFIOtxhmJ4TbHWP0csAodLRbLHMDmAG2b7n5U
GvgkWZR8aXyMUQTN8beDLsZm03Bm2rxn6Hk0sfwhGCd2s8CSeNJq71vdrfNl
F86V9RlJe5VLhbVCguMp7O3XZSJvNGSixymw0igSUoPh1Guy3GkygYb3pcIA
0bu1EUJ6/5U6KDgUN1Hd3RyYWry6ZD3d5+g5L8AsSatJRJm3ZiVp8A/WV3Yk
7DTA1YgX+0jTWHQiBg2YhkwsDmGJlpq9ICJBLIOQMG+fOIswBD00lhayY4JS
WJfksnG3gQxJQriPgh2nPvvROS+LjzQl6AUbUYcctV4T24gRDa3VfRv8bf6X
uomym6/r5lKuadDb12FAiwvUupxrPwq7pK7f9036JnIbXknQllbQRb8RNCta
UW0jj2bxTYRK7Z6BsvBtDzhod6o3exi2DmKfMKiC2/b9e3YnhL5/bBsvDhb3
tY6PRzorhBujx/ryvtWGgT7ff6S1g3eoo1q1BwWz5vstM7mXabjGB8pS1Kg0
s9Ao1xm3BQmvLlDSyBKiy0tERwtDpS6grv5YAqym2sRDWOc+2MWknMUH54Kp
zqmRI9dF+JtnoJv63qcK9LLpLdDMG9/ib3DaTnvWvuXahShnSy6yibsS9s5p
Xy0vUO4VDEgnraktjpWEp+YGVBSwyRVXpOmPt5y900ZpyV7FkIjTuLM1DfA2
5vX+aDMWYQjNWPjzLNWp+51BuhDoSjuDeEinOQUS2rFsxiP8yR4PudMYmLRY
IQJW6y9CQz3edSEXpfR1YlS7kFyVS6PGJKQbzMTbV8eCcTa9Eix2MbRF3PES
fMTXDdI8FgJIGnDb5WW+Mb4JVTmBscVHdhAHEvcktdtDJbeWw/1Hsj+6ow1l
MhHnFK/ZJrm9wVSJRb68PG8kcwY2rWZToJvfEvpJzrWzpMkjqSYUZ/WaywjJ
R31zE/Ms3JLrbENske9b3z4YF3CxpbMqNvkB7rnksgFJC7eMaMcXJO3p1LdQ
T60zn95Fo7e6Vh54AaU1NmI3JC5oPUuQL9epdjILm/Yh+dqmGvYlst7OOk1C
wdpycVFcWHfbI+qGz7r54Npe5OVGMdfcOdG8qR2cq1ai+g7HqvFz5ThrUL2D
0gn4jnB7/uBOa29L21bvWkPmD5eL6XJUe49v9DgmpCRO28a307EMN6wmPU/q
fyz9VWwf16U2b18maD7jBzJFjuU5Hwk/aYa18LY0QpQ8so30WKq+M2Smc8lt
DRqgGDDJmL1yiUiJTrzrLmkhac0m2dEw4tJNut2bog0UHV5oYP34z6KDSeKA
2vj0IxnxERSSqNSZV27F69CvxslGqnECZkdKxMT1FZGsp4gMuxLFxTgh78Md
aXCl1aF9v41v45L4iWLLzw2ZQ2iJb70/TAwpP4jdRb6QFU2yScEyF1XPySU3
fLITc5Xd/XAjs4wbmd1TwrTJoy0EI8P7g8uoO4yXXdcN0bl3N7h+SdOnlUwc
b9qUDfq8pGUU7/tVEEmnDD/iaHETW+Px1bHh5kOkz5RVrAaMQ1vpLMrMjzB4
UAhgSqVLJ+NwEmbLPywT/CGk1xO4uJVbUk9JwmDeA0+SjerT2ORI5Qyz4x7/
G3lWe/7s8FKE2Mf8qY+Ofhtor//tclOHRv5xHpk62aU74tGKPs6ajnY4PLT0
fINdAJPIj69Hh0nj07vRApz7+p+m0+x29uq6Im6B5o6sF5+9+u4Vm/evcEfE
evotJkFj731l4R5+J5tOv+H33qD/EkxypplVKG2Ti/VCi7A8Y10cCdr6hW9/
QTLGX4zaLmmRQhxIbKmXewiIiZPqFO1TBP15u+v0ogG+m8V8UXuJPUTajp9P
ZZ7raffWyaKfNJO9u22fTtXbOw2e5vfcbKr/CRwSLWeFkT7SeV09clAv9qRV
VP5IrSO9q/kcartqT86WsYwbBtT1JRSz/W6WvZHGHnm4FLz1l9DJTbfRdDWJ
n/Nw05mFCzuOfYfa+EvJOuKbCSu+zPccvjS+76qd2FWx7ceyNNTXGUWFN77U
OHXIl/52KbNALMtPTQuMdTzmdDzaxGa6luWHdAfAD5qK3UaCuqdCOkwGpziL
0lAZj+vqw4bumPMlQ3efEZAcCYXHHnIJNIQJRyFTDPzd/sLp4PiWhfWiMwlc
7KJt5s9kUdE/cd847VzrV4WcpJem5H4BttcSaNhx1YS/jWLgTAJLldtqu+ju
20qvaAcsr3O+TewFdyrK2jza30A1j8l5yUqS3kYJ72WbYJidn85bZed1zkFC
9OMRNnNrBDlv9dOM9FYZQr56c+VvWkQzEn9DOcFtVWdy09Dosrm/nVx6J+fp
QseI/sL9pP7qmIAiejOoyfDK+WqrPirMsh/Ra8+7fsJ9n8I+2G7TyEbQI45H
Qsje9z5wM/byKzLwJHn2Qm+qNf3v4OxewDhZ93RDKyNRzD34joBqye5+wEoG
vXYjoIH5n3FFjSTxjpF2hkuPuOairf3u3Qd2r7Trx0IwzhxnN9zgqDkJN2Jl
OcaIf1iOT3r0rnf0SPC9KutN4qGm9THFrabsSZXcq45LajTkxJgNNzjytPhG
u7g3RR3RHatVCOiwKv4plBc6oazzy36qd5/w/ovozru/LotPILyl3C7Ksk9Q
yh1LTG8H4koTyqJ7icOt8rjfzS6k/Sjp1eYrt17CdEp7u3jHjSYCfZxe85EU
+7JJb3cQF4Rhk5DxDjVpbVvW1QhW2y2V7pPJNq8SBuctWBefmC8FPcq3+GIW
QbX47lHxWYua63OMeGQ+pN4FmUGaw2MUMg3FKWSfjjEWBjPq9paqethahO9i
LdYp+wb8QPqij4a1+LKVsXBX0AsLehaIP3h1w4q5PsL7KPVqLQAQl2FdFd6P
H+JN49dtI06hpN+U0hBJbuCWG6vZg8b5AjluHSRwyqWoWrxnnaw2GrWGJQld
dScBv2NethAFyocxIJhsbbJybZ3RHQm4WNAicuaWnc+niGDDkRy/EZcAp9I4
c4fAV1LT4G+hiTAtIquwe+PiY3EYX3MSsBpqu9/hYeC6d5IyWKVsoWyyQAuM
sQu+r0gIT2ESWIfnVwMqT3E1avUcwqBj+xiBalIhZHeGRquW+Dh89GASMdBr
ufMOhQyjALX0o6Hz/jd9XSOPR+Kc6mjWPHCxesY25W9ajLiPJMgz24s50Yjg
zn2jnWxJAhlWpojXgC69m37du3cfshn5BlzRvSVr7wPHy90NXXKWfcYTwlmj
USzPdISkPQOIXfd9l2fuPj1eNeQCJqpcH/X7UStzExwX85yNPkTEmHzkXq4C
F3/LpcLM73SvH2R23NwUtwBCkY+jQVXtVB228jGgcxRE8pr+0KWGm97E+9nI
/S9hMC47GDqh/Nw+eVo1H7n7nVkBAmDcPc+6Pucb024GgLvm24vTGjhJN42S
PsTqTnvQxWEVUyTd7ezl6c+nA//OWeyfia4BBZnDSI0kWnDUgkfwaE1xXrbM
K/j6wR/OkmsUs7sj99Hdc+7UJ4SiZaMfIkpjY0uX0Br+L21SewuVXHF50S3U
f8CBgvMM19WhAR/p1jkv+Y3d7cz7+EVk4kruAz/grr5fXjz74sHDJ+jm8Yb4
4rt3q+L9e2nF+LFWtrTZ7wrBJRry+Vso+7Tl75638JHTwNnz716evfrlafZ6
U+S8090GN1j+T/rPOANfmmuKK75Rv7/siqWoS1xozD16cDZ/nzwZLCp7Xdeb
7N3tFd94JJ7B6XTKhhrw4nR5WdXXm2J1zlB0757KIorV72+ticEVt/Q7Qix7
s5i5/wN45e9Bcc8AAA==

-->

</rfc>
