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


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

]>


<rfc ipr="trust200902" docName="draft-gallagher-openpgp-hkp-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="HKP">OpenPGP HTTP Keyserver Protocol</title>

    <author fullname="Daphne Shaw">
      <organization>Jabberwocky Tech</organization>
      <address>
        <email>dshaw@jabberwocky.com</email>
      </address>
    </author>
    <author fullname="Andrew Gallagher" role="editor">
      <organization>PGPKeys.EU</organization>
      <address>
        <email>andrewg@andrewg.com</email>
      </address>
    </author>

    <date year="2025" month="March" day="17"/>

    <area>sec</area>
    <workgroup>openpgp</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 53?>

<t>This document specifies a series of conventions to implement an OpenPGP keyserver using the Hypertext Transfer Protocol (HTTP).
As this document is a codification and extension of a protocol that is already in wide use, strict attention is paid to backward compatibility with these existing implementations.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://andrewgdotcom.gitlab.io/draft-gallagher-openpgp-hkp"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gallagher-openpgp-hkp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OpenPGP Working Group mailing list (<eref target="mailto:openpgp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/openpgp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/openpgp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/andrewgdotcom/draft-gallagher-openpgp-hkp"/>.</t>
    </note>


  </front>

  <middle>


<?line 58?>

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

<t>For ease of use, public key cryptography requires a key distribution system.
For many years, the most commonly used system has been a key server - a server that stores public keys and can be searched for a given key.
The HTTP Keyserver Protocol is a OpenPGP keyserver implemented using HTTP.</t>

</section>
<section anchor="conventions-definitions"><name>Conventions and Definitions</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="hkp-and-http"><name>HKP and HTTP</name>

<t>As HKP is implemented over HTTP, everything in <xref target="RFC1945"></xref> applies to HKP as well, and HKP error codes are the same as the ones used in HTTP.</t>

<t>Due the very large deployment of HKP clients based on HTTP version 1.0, HKP keyservers <bcp14>MUST</bcp14> support HTTP 1.0.
HKP keyservers <bcp14>MAY</bcp14> additionally support other HTTP versions.</t>

<t>(( dshaw : I expect this to be controversial, but we've got tons of deployed code that only works with 1.0.
I'd be willing to discuss removing this <bcp14>MUST</bcp14> or make it a <bcp14>SHOULD</bcp14> and add a "implementation notes" section pointing out the problem instead.
See issue #5.
))</t>

<t>When used over HTTPS, HKP is commonly referred to as "HKPS".</t>

<t>HKP(S) are distinguished from generic use of HTTP(S) by using the URI schemes "hkp" and "hkps" <xref target="RFC7595"></xref>.
HKP is assigned port number 11371 and HKPS is assigned 11372 (although this is rarely used in practice).
For reasons of maximum compatibility with firewalls and filtering HTTP proxies, HKP(S) are often served over the standard HTTP(S) port(s) (TCP ports 80 and 443).</t>

<t>By convention and history, HKP defaults to HTTP on TCP port 11371, and HKPS defaults to HTTPS on TCP port 443.</t>

<t>(( andrewg : if we assign hkps, we appear to be required to specify a dedicated port, even though nobody uses it.
See issue #14.
))</t>

<t>A keyserver <bcp14>SHOULD</bcp14> support both HKP and HKPS.
A client <bcp14>SHOULD</bcp14> use HKPS, or a transport method with equivalent security properties, such as Tor hidden services <xref target="TOR"></xref>.</t>

<t>See <xref target="locating-keyserver"/> for an automated way for clients to discover the correct port.</t>

<section anchor="request-paths"><name>Request Paths</name>

<t>HKP defines two paths, namely "/pks/lookup" for lookups (see <xref target="key-lookups"/>) and "/pks/add" for submission (see <xref target="submitting-keys"/>).
A keyserver <bcp14>MAY</bcp14> support requests to other paths under "/pks", but these are outside the scope of this document.
These alternative paths have historically been used to provide human readable interfaces such as HTML forms, and functionality extensions such as <xref target="SKS"></xref>.</t>

</section>
<section anchor="http-status"><name>HTTP Status Codes</name>

<t>When a status or error code needs to be returned by a keyserver, the most appropriate HTTP code from <xref target="RFC9110"></xref> should be used.
It is good practice to return the most specific error code possible: for example, returning 404 ("Not Found") rather than 400 ("Bad Request") when a key is not found.</t>

<t>This document gives suggested HTTP error codes for several common situations.
Note that these are only suggestions, and implementations may have good reasons (such as not revealing the reason why a request failed) for using other error codes.</t>

<t>Clients <bcp14>SHOULD</bcp14> understand the following codes:</t>

<texttable title="Status Codes" anchor="status-codes">
      <ttcol align='left'>Status Code</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>200 OK</c>
      <c>Request succeeded</c>
      <c>202 Accepted</c>
      <c>Submitted key was altered to match keyserver policy</c>
      <c>403 Forbidden</c>
      <c>The requested operation is not permitted</c>
      <c>404 Not found</c>
      <c>The search returned no results, or path not found</c>
      <c>410 Gone</c>
      <c>Key has been permanently deleted, e.g. due to RTBF</c>
      <c>413 Content too large</c>
      <c>The search returned too many responses</c>
      <c>422 Unprocessable content</c>
      <c>Submitted key was rejected as per keyserver policy</c>
      <c>501 Not implemented</c>
      <c>The requested operation is not supported</c>
</texttable>

<t>In addition, a client <bcp14>SHOULD</bcp14> understand 3xx redirect codes.</t>

<t>(( andrewg : In draft-shaw-00 it was suggested that a novel header be used for statuses that could not be represented by the HTTP response codes of the time.
This was only partially specified, and it is unclear if any implementations of this header existed.
In the meantime many new HTTP response codes have been defined, so I am using them instead - even if their semantics does not exactly match that of <xref target="RFC9110"></xref>.
NB therefore that codes 202, 410, 413, 422 may not have been implemented anywhere yet.
))</t>

<t>(( andrewg : note also that 413 and 202 may be incorrect usage, see issues #25 and #26 respectively.
))</t>

</section>
</section>
<section anchor="key-lookups"><name>Looking up Data from a Keyserver</name>

<t>Key lookups are done via an HTTP GET request.
Specifically, the abs_path (<xref section="3.2" sectionFormat="of" target="RFC1945"/>) is built up of the base path "/pks/lookup", followed by request-specific URL components.
These components differ slightly between the Legacy and v1 request formats (see below).</t>

<t>Most HKP lookups contain both the "op" (operation) and "search" fields.
The "op" field determines what operation the keyserver will execute, and the "search" field determines which keys are operated on.</t>

<t>There may also be modifier variables, as specified in <xref target="modifier-variables"/> below.
Variables are passed using HTTP query strings as specified in <xref section="8.2.2" sectionFormat="of" target="RFC1866"/>.
HTTP query strings <bcp14>MAY</bcp14> be given in any order.
Keyservers <bcp14>MUST</bcp14> ignore any unknown query strings.</t>

<section anchor="request-formats"><name>Legacy and v1 Request Formats</name>

<t>For backwards compatibility with the existing installed client base, a Legacy request format is defined.
New implementations <bcp14>SHOULD</bcp14> use the v1 request format.</t>

<section anchor="legacy-request-format"><name>Legacy Request Format</name>

<t>In the Legacy request format, the "op" and "search" fields are supplied as HTTP query strings, in the form "&lt;field-name&gt;=&lt;value&gt;":</t>

<figure><artwork><![CDATA[
/pks/lookup?op=<op>&search=<search>[&...]
]]></artwork></figure>

<t>They are treated in the same way as modifier variables, including arbitrary ordering, however the "op" field <bcp14>MUST</bcp14> be supplied, and the "search" field <bcp14>MUST</bcp14> be supplied unless the "stats" operation is being requested (see <xref target="stats-operation"/>).
No URL path components under "/pks/lookup" are used.</t>

</section>
<section anchor="v1-request-format"><name>v1 Request Format</name>

<t>In the v1 request format, the values of the "op" and "search" fields are supplied as URL path components.
They are appended to "/pks/lookup/v1" as follows:</t>

<figure><artwork><![CDATA[
/pks/lookup/v1/<op>/<search>[?...]
]]></artwork></figure>

<t>The "op" and "search" fields <bcp14>MUST</bcp14> be supplied.
Modifier variables are supplied as HTTP query strings, same as in the Legacy request format.</t>

<t>If the v1 request format is being used, machine readable output format (<xref target="output-formats"/>) <bcp14>MUST</bcp14> be returned.
Note that the "stats" operation <bcp14>MUST NOT</bcp14> be used in v1 request format (see <xref target="stats-operation"/>).</t>

<t>The v1 request format is designed so that a basic HKP service can be implemented using static files.</t>

</section>
</section>
<section anchor="op-field"><name>The "op" (operation) Field</name>

<t>The "op" field specifies the operation to be performed on the keyserver.
The "op" field is generally used with the "search" field to specify the keys that should be operated on.</t>

<t>If a particular operation is not supported, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 501 ("Not Implemented").
The server <bcp14>SHOULD NOT</bcp14> return an error code (such as 404 ("Not Found")) that could be interpreted by the client as an explicit statement of non-existence.</t>

<section anchor="get-operation"><name>The "get" Operation</name>

<t>A keyserver <bcp14>SHOULD</bcp14> support the "get" operation.</t>

<t>The "get" operation requests keys from the keyserver by textual search.
A string that specifies which key(s) to return is provided in the "search" field.</t>

<t>The response to a successful "get" request is a HTTP document containing an ASCII-armored keyring as specified in <xref target="keyring-format"/>.</t>

<t>The response <bcp14>MAY</bcp14> be wrapped in any HTML or other text desired, except that the actual key data consisting of an initial line break, the "-----BEGIN PGP PUBLIC KEY BLOCK-----" header, the armored key data itself, the "-----END PGP PUBLIC KEY BLOCK-----" header, and a final line break <bcp14>MUST NOT</bcp14> be modified from the form specified in <xref target="RFC9580"></xref>.</t>

<t>A keyserver <bcp14>SHOULD</bcp14> limit the returned keyring to a reasonable length.
Entries <bcp14>SHOULD</bcp14> be sorted in order of decreasing confidence (<xref target="confidence"/>), and then by creation date (most recent first).
If no keys match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="authget-operation"><name>The "authget" (authoritative get) Operation</name>

<t>A keyserver <bcp14>SHOULD</bcp14> support the "authget" operation.</t>

<t>The "authget" operation is similar to the "get" operation, but is used for authoritative lookups by User ID only, in particular during key discovery (<xref target="key-discovery"/>).
The keyserver <bcp14>SHOULD</bcp14> only return results where the User ID being searched for has a nonzero confidence value (<xref target="confidence"/>).
If a keyserver is being used for key discovery, it <bcp14>MUST</bcp14> return only results for which it is has complete confidence.
In addition, exact textual matching <bcp14>MUST</bcp14> be used even if the "exact" variable is set to "off" (<xref target="exact-variable"/>).</t>

</section>
<section anchor="since-operation"><name>The "since" Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "since" operation.</t>

<t>"since" requests a list of fingerprint prefixes that indicate which TPKs have been modified since midnight UTC on a specific date.
The date is provided in the "search" field in ISO format with no time component, i.e. "2025-12-01".</t>

<t>The returned data is a list of CRLF-separated, hexadecimal-encoded fingerprint prefixes.
The keyserver <bcp14>SHOULD</bcp14> calibrate the prefix length so that it is long enough to provide collision resistance, but short enough to maintain a useful anonymity cohort.
A client <bcp14>MUST NOT</bcp14> make any assumptions about the length of the prefixes returned.</t>

<t>A client that wishes to update its local keyring from a keyserver <bcp14>MAY</bcp14> first make a "since" request with the date of the last successful refresh.
It can then compare the returned list of prefixes to see if any of them are present in its local keyring, and make subsequent "vfpget" requests as appropriate (<xref target="vfpget-operation"/>).
In this way, it can avoid making unnecessary requests that will return no updates, but will still leak information to the keyserver.</t>

<t>Note that prefixes are always used, regardless of key version.
This contrasts with key IDs, which are version-dependent.</t>

<t>A keyserver <bcp14>SHOULD NOT</bcp14> support lookup by prefix.</t>

</section>
<section anchor="index-operation"><name>The "index" Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "index" operation.</t>

<t>The "index" operation requests a list of keys on the keyserver that match the text in the "search" field.
Historically, the "index" operation returned a human readable HTML document containing links for each found key, but this is not required.</t>

<t>A keyserver <bcp14>SHOULD</bcp14> limit the returned index to a reasonable length.
Entries <bcp14>SHOULD</bcp14> be sorted in order of decreasing confidence, and then by creation date (most recent first).
If no keys match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="vindex-operation"><name>The "vindex" (verbose index) Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "vindex" operation.</t>

<t>The "vindex" operation is similar to "index" in that it provides a list of keys on the keyserver that match the text in the "search" field.
Historically, a "vindex" response was the same as "index" with the addition of showing the signatures on each key, but this is not required.
The "vindex" operation only differs from the "index" operation in Legacy human readable mode, and a server <bcp14>MAY</bcp14> treat the two operations as synonyms.</t>

<t>A server that supports "vindex" <bcp14>SHOULD</bcp14> treat it as a synonym for "index" in machine-readable mode.
A client <bcp14>SHOULD NOT</bcp14> make machine-readable "vindex" requests.</t>

</section>
<section anchor="stats-operation"><name>The "stats" (statistics/status) Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "stats" operation in Legacy request format.
The "stats" operation is deprecated, and <bcp14>MUST NOT</bcp14> be used in a v1 request.
It is <bcp14>RECOMMENDED</bcp14> to use a URL outside "/pks/lookup" (such as "/pks/stats") instead.</t>

<t>The output of the "stats" operation is implementation-dependent, but may include diagnostic output, configuration state, or other metadata.
The "search" field <bcp14>SHOULD NOT</bcp14> be supplied, and <bcp14>SHOULD</bcp14> be ignored if received.</t>

</section>
<section anchor="vfpget-operation"><name>The "vfpget" (versioned fingerprint get) Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "vfpget" operation.</t>

<t>"vfpget" requests a key from a keyserver by specifying its versioned fingerprint.
The versioned fingerprint is provided in the "search" field in hexadecimal encoding, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

<t>A versioned fingerprint consists of one octet of key version number and N octets of fingerprint.
This is the same octet sequence used in the Issuer Fingerprint and Intended Recipient Fingerprint subpackets (<xref section="5.2.3" sectionFormat="of" target="RFC9580"/>).</t>

<t>If no keys match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="kidget-operation"><name>The "kidget" (keyid get) Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "kidget" operation.</t>

<t>"kidget" requests a key from a keyserver by specifying its key ID (<xref section="5.5.4" sectionFormat="of" target="RFC9580"/>).
The key ID is provided in the "search" field as 16 hexadecimal digits, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

<t>If no keys match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="hget-operation"><name>The "hget" (hash get) Operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "hget" operation.</t>

<t>"hget" requests a key from a keyserver by specifying its <xref target="SKS"></xref> digest.
The digest is provided in the "search" field in hexadecimal encoding, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

<t>If no keys match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="other-operations"><name>Other Operations</name>

<t>Other site-specific or nonstandard operations can be indicated by prefixing the operation name with the string "x-".</t>

</section>
</section>
<section anchor="search-field"><name>The "search" Field</name>

<t>The "search" field contains arbitrary text encoded as usual for a HTTP URL.
This text may represent the key ID, or fingerprint, or some text from a user ID on the key being sought, depending on the operation.</t>

<section anchor="searches"><name>Key ID and Fingerprint Searches</name>

<t>To search for a key by its key ID or fingerprint, a client <bcp14>SHOULD</bcp14> use a v1 request and either the "kidget" or "vfpget" operation (as appropriate).</t>

<t>If making a Legacy request, a client <bcp14>SHOULD</bcp14> use the "get" operation and prefix the "search" string with "0x" to indicate a hexadecimal number.
Key ID strings are 16 hexadecimal digits (64 bits).
Fingerprint strings are either 32 (version 3), 40 (version 4), or 64 (version 6) hexadecimal digits.
The hexadecimal digits are not case sensitive.</t>

<t>A keyserver:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> accept fingerprints and <bcp14>MAY</bcp14> accept 64-bit key IDs in the Legacy request "search" field.</t>
  <t><bcp14>MUST NOT</bcp14> return results for 32-bit "short key ID" searches, as these do not provide sufficient collision resistance.</t>
  <t><bcp14>MUST NOT</bcp14> return v6 keys in the results for Legacy machine readable requests, but <bcp14>MAY</bcp14> do so for Legacy human readable requests (see also <xref target="legacy-mr-indexes"/>).</t>
</list></t>

<t>V3 keys are no longer considered secure, but <bcp14>MAY</bcp14> be distributed for historical reference.</t>

</section>
<section anchor="text-searches"><name>Text Searches</name>

<t>To search for a key by the text of a user ID, a client <bcp14>SHOULD</bcp14> use the "get", "authget", or "index" operation (as appropriate) and <bcp14>SHOULD NOT</bcp14> prefix the "search" string with "0x".</t>

<t>A keyserver <bcp14>MUST NOT</bcp14> return v6 keys in the results for Legacy machine readable requests, but <bcp14>MAY</bcp14> do so for Legacy human readable requests (see also <xref target="legacy-mr-indexes"/>).
Otherwise, how a keyserver handles textual search is implementation defined.
See also the definition of the "exact" variable (<xref target="exact-variable"/>) for a method to give additional instructions to the server on how the search is to be executed.</t>

</section>
</section>
<section anchor="lookup-examples"><name>Lookup Examples</name>

<t>Search for all keys containing the string "dshaw", using plaintext HTTP:</t>

<t><list style="symbols">
  <t>Legacy request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  http://keys.example.com:11371/pks/lookup?search=dshaw&op=index
]]></artwork></figure>
  </t>
  <t>v1 request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  http://keys.example.com:11371/pks/lookup/v1/index/dshaw
]]></artwork></figure>
  </t>
</list></t>

<t>Get key 0xDEADBEEFDECAFBAD (64-bit key ID), using HTTPS:</t>

<t><list style="symbols">
  <t>Legacy request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  https://keys.example.com/pks/lookup?op=get&search=0xDEADBEEFDECAFBAD
]]></artwork></figure>
  </t>
  <t>v1 request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  https://keys.example.com/pks/lookup/v1/kidget/DEADBEEFDECAFBAD
]]></artwork></figure>
  </t>
</list></t>

</section>
</section>
<section anchor="submitting-keys"><name>Submitting Keys To A Keyserver</name>

<t>A keyserver <bcp14>MAY</bcp14> accept submissions via an HTTP POST request.
Specifically, the abs_path (<xref section="3.2" sectionFormat="of" target="RFC1945"/>) is set to "/pks/add", and the key data is provided via HTTP POST as specified in <xref section="8.3" sectionFormat="of" target="RFC1945"/>, and <xref section="8.2.3" sectionFormat="of" target="RFC1866"/>.</t>

<t>The body of the POST message contains a "keytext" variable which contains an ASCII-armored keyring as specified in <xref target="keyring-format"/>.
The ASCII armored keyring should also be urlencoded as specified in <xref section="8.2.1" sectionFormat="of" target="RFC1866"/>.
Note that more than one key may be submitted in a single transaction.</t>

<t>There may also be modifier variables, as specified in <xref target="modifier-variables"/> below.</t>

<t>If a keyserver does not support adding keys via HTTP, then requests to do so should return an appropriate HTTP error code, such as 403 ("Forbidden") if key submission has been disallowed, or 501 ("Not Implemented") if the server does not support HTTP key submission.
The keyserver <bcp14>MUST NOT</bcp14> return an error code (such as 404 ("Not Found")) that could be mistaken by the client for a valid response.</t>

</section>
<section anchor="modifier-variables"><name>Modifier Variables</name>

<t>These variables are used to modify basic requests.</t>

<section anchor="options-variable"><name>The "options" Variable</name>

<t>This variable takes one or more option values, separated by commas.
These are used to modify the behavior of the keyserver on a per-request basis.
Each value indicates a boolean flag, where the presence of the value indicates "true" and the absence "false".</t>

<section anchor="mr-option"><name>The "mr" (Machine Readable) Option</name>

<t>The machine readable option instructs the server that a program (rather than a person) is making the request, so the output <bcp14>SHOULD</bcp14> be in machine readable format.
If the v1 request format (<xref target="v1-request-format"/>) is being used, machine readable output <bcp14>MUST</bcp14> be returned, so this option has no effect.
See <xref target="output-formats"/> for the specific details of machine readable output.</t>

</section>
<section anchor="nm-option"><name>The "nm" (No Modification) Option</name>

<t>As keyservers may modify submitted keys to suit a particular policy, this option is used to inform the keyserver that the submitter would rather have the submission fail completely then have the submitted key(s) modified.
An example of this would be a keyserver that does not accept user IDs with an email address outside of the local domain.
If such a key was submitted, the keyserver <bcp14>MAY</bcp14> trim any noncompliant user IDs before accepting the key.
If this option was set, then such a key submission <bcp14>SHOULD</bcp14> fail with an appropriate error code such as 422 (Unprocessable content).</t>

<t>"nm" is meaningful for submissions only.</t>

</section>
<section anchor="other-options"><name>Other Options</name>

<t>Other site-specific or nonstandard options can be indicated by prefixing the option name with the string "x-".
Non-standard options <bcp14>MUST</bcp14> represent boolean values with a default value of "false".</t>

</section>
</section>
<section anchor="fingerprint-variable"><name>The "fingerprint" Variable</name>

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to provide the key fingerprint for each key in an "index" or "vindex" operation.
This variable has no effect on any other operation.
The exact format of the displayed fingerprint, like the "index" and "vindex" operations themselves, is implementation defined in Legacy human readable output.
In machine readable indexes, a value of "on" indicates that the "keyid" field <bcp14>SHOULD</bcp14> contain the fingerprint, except for v3 keys (see <xref target="mr-indexes"/>).
An implementation <bcp14>SHOULD</bcp14> treat this variable as being "on" for all machine readable indexes.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable and/or set the default behaviour to "on" for Legacy human readable indexes.</t>

<t>"fingerprint" is meaningful for lookups only.</t>

</section>
<section anchor="hash-variable"><name>The "hash" Variable</name>

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to provide the <xref target="SKS"></xref> digest of each key in an "index" or "vindex" operation in the Legacy human readable output format.
This variable has no effect on any other operation, or on machine readable output.
The exact format of the displayed digest, like the "index" and "vindex" operations themselves, is implementation defined.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable and/or set the default behaviour to "on".</t>

<t>"hash" is meaningful for lookups only.</t>

</section>
<section anchor="exact-variable"><name>The "exact" Variable</name>

<t>This variable takes one argument: "on" or "off".
If set to "on", it instructs the server to search for an exact match for the contents of the "search" field.
An implementation <bcp14>SHOULD</bcp14> set the default behaviour to "on" and <bcp14>MAY</bcp14> ignore this variable.</t>

<t>When "exact" is set to "on", a keyserver <bcp14>SHOULD</bcp14> only return results if the "search" field exactly matches one of the following:</t>

<t><list style="symbols">
  <t>The full text string of a User ID.</t>
  <t>The portion between angle brackets ("&lt;(.*)&gt;") in an email-address style User ID.</t>
</list></t>

<t>In either case, the string matching <bcp14>SHOULD NOT</bcp14> be case sensitive.</t>

<t>"exact" is meaningful for lookups only.</t>

</section>
<section anchor="other-variables"><name>Other Variables</name>

<t>Other site-specific or nonstandard variables can be indicated by prefixing the variable name with the string "x-".</t>

</section>
</section>
<section anchor="output-formats"><name>Output Formats</name>

<t>HKP was originally intended for both human and programmatic use.
In general, the Legacy human readable output is implementation specific.
The "machine readable" option is used to tailor the output of Legacy requests for automated use.
By contrast, the v1 request format <bcp14>MUST</bcp14> return machine readable output.
For interoperability, the machine readable output <bcp14>MUST</bcp14> carefully follow the guidelines given here.</t>

<t>A client implementation <bcp14>SHOULD</bcp14> request machine readable output and <bcp14>SHOULD NOT</bcp14> attempt to parse human readable output.</t>

<section anchor="mr-output"><name>Machine Readable Output</name>

<t>Clients requesting machine readable output:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> use the v1 request format, or else supply "options=mr" (<xref target="mr-option"/>) in a Legacy request.</t>
  <t><bcp14>MUST</bcp14> silently ignore any content preceding or following a returned armored key block.</t>
  <t><bcp14>MUST</bcp14> silently ignore any keys with unknown versions or algorithms.</t>
</list></t>

<t>Keyservers returning machine readable output:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> set the HTTP header "Access-Control-Allow-Origin: *", as specified in <xref target="CORS"></xref>.</t>
  <t><bcp14>MUST</bcp14> set "Content-Type: application/pgp-keys" when returning keys (the "get", "vfpget", "kidget", and "hget" operations), as specified in <xref section="7" sectionFormat="of" target="RFC3156"/>.</t>
  <t><bcp14>MUST</bcp14> use the format specified in <xref target="mr-indexes"/> when returning indexes (the "index" and "vindex" operations).</t>
  <t><bcp14>MAY</bcp14> return statistics in JSON format <xref target="RFC8259"></xref>, the schema of which is otherwise implementation-dependent.</t>
</list></t>

</section>
<section anchor="mr-indexes"><name>Machine Readable Indexes</name>

<t>The machine readable index format is a list of newline-separated records.
The document is 7-bit clean, and as such is sent with no encoding and Content-Type: text/plain.</t>

<t>The machine readable response <bcp14>MAY</bcp14> be prefixed by an information record:</t>

<figure><artwork><![CDATA[
info:<version>:<count>
]]></artwork></figure>

<texttable title="Information Record Fields" anchor="information-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>version</c>
      <c>the version of this output format</c>
      <c>count</c>
      <c>the number of keys returned</c>
</texttable>

<t>If this line is not included, or the version information is not supplied, the version number is assumed to be 1.
Currently, only version 1 is defined.</t>

<t>Note that "count" is the number of keys, and not the number of lines returned.
That is, it <bcp14>SHOULD</bcp14> match the number of "pub:" lines returned.</t>

<t>The key listings themselves are made up of several records per key.
The first record specifies the primary key:</t>

<figure><artwork><![CDATA[
pub:<keyid>:<algorithm>:<keylen>:<creationdate>:<expirationdate>:<flags>:<keyversion>
]]></artwork></figure>

<texttable title="Public Key Record Fields" anchor="public-key-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>keyid</c>
      <c>the fingerprint or the key ID</c>
      <c>algorithm</c>
      <c>the algorithm ID</c>
      <c>keylen</c>
      <c>the key length in bits</c>
      <c>creationdate</c>
      <c>creation date of the key</c>
      <c>expirationdate</c>
      <c>expiration date of the key</c>
      <c>flags</c>
      <c>letter codes to indicate details of the key</c>
      <c>keyversion</c>
      <c>the version of the primary key</c>
</texttable>

<t>Since it is not possible to calculate the key ID from a V3 key fingerprint, for V3 keys the "keyid" field <bcp14>SHOULD</bcp14> contain the 16-digit key ID only.
Otherwise, a keyserver <bcp14>SHOULD</bcp14> return a fingerprint if available (see <xref target="fingerprint-variable"/>).</t>

<t>The algorithm ID is as specified in <xref section="9.1" sectionFormat="of" target="RFC9580"/>, i.e.
1==RSA, 17==DSA, etc.</t>

<t>Following the "pub" record are one or more "uid" records to indicate user IDs on the key:</t>

<figure><artwork><![CDATA[
uid:<uidstring>:<creationdate>:<expirationdate>:<flags>
]]></artwork></figure>

<texttable title="User ID Record Fields" anchor="user-id-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>uidstring</c>
      <c>the user ID string</c>
      <c>creationdate</c>
      <c>creation date of the User ID</c>
      <c>expirationdate</c>
      <c>expiration date of the User ID</c>
      <c>flags</c>
      <c>letter codes to indicate details of the User ID</c>
      <c>confidence</c>
      <c>the confidence that the server has in this User ID</c>
</texttable>

<t>The user ID string <bcp14>MUST</bcp14> use HTTP % encoding for anything that isn't 7-bit safe as well as for the ":" and "%" characters.
Any other characters <bcp14>MAY</bcp14> be HTTP encoded, as desired.</t>

<t>The information for the "creationdate", "expirationdate", and "flags" fields is taken from the User ID self-signature, if any, and applies to the user ID in question, not to the key as a whole.
The "confidence" value is specified in <xref target="confidence"/>.</t>

<t>Primary key and User ID records may contain a "flags" field containing a sequence of alphabetical characters, one per flag.
Flags <bcp14>MAY</bcp14> be given in any order.
The meaning of "disabled" is implementation-specific.
Note that individual flags may be unimplemented, so the absence of a given flag does not necessarily mean the absence of the detail.
Client implementations <bcp14>MUST</bcp14> ignore unknown flags.</t>

<texttable title="Record Flags" anchor="record-flags">
      <ttcol align='left'>Flag</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">r</spanx></c>
      <c>revoked</c>
      <c><spanx style="verb">d</spanx></c>
      <c>disabled</c>
      <c><spanx style="verb">e</spanx></c>
      <c>expired</c>
</texttable>

<t>Note that empty fields are allowed.
For example, a key with no expiration date would have the "expirationdate" field empty.
Also, a keyserver that does not track a particular piece of information may leave that field empty as well.
Colons for empty fields on the end of each line <bcp14>MAY</bcp14> be left off, if desired.
Client implementations <bcp14>MUST</bcp14> ignore unknown trailing fields.
All dates are given in the number of seconds since midnight 1/1/1970 UTC.</t>

<section anchor="legacy-mr-indexes"><name>Legacy Machine Readable Indexes</name>

<t>For backwards compatibility with the installed client base, Legacy machine readable requests <bcp14>SHOULD</bcp14> return a restricted index format:</t>

<t><list style="symbols">
  <t>The "keyversion" field and its preceding colon, and any subsequent fields, <bcp14>SHOULD</bcp14> be omitted.</t>
  <t>The "confidence" field and its preceding colon, and any subsequent fields, <bcp14>SHOULD</bcp14> be omitted.</t>
  <t>Version 6 (and later) keys <bcp14>SHOULD</bcp14> be omitted.</t>
</list></t>

</section>
</section>
</section>
<section anchor="confidence"><name>Confidence</name>

<t>Traditionally, keyservers did not perform any checks against uploaded content other than simple parseability.
This left them open to abuse such as flooding and third-party signature spam.
Most modern keyservers are now able to perform cryptographic validity tests, and automated content moderation is generally possible.</t>

<t>It is <bcp14>RECOMMENDED</bcp14> that a keyserver assigns a "confidence" value to each User ID in its database.
The exact definition of "confidence" is implementation-dependent, but <bcp14>MAY</bcp14> include checks such as email deliverability or third-party certifications.
A keyserver <bcp14>MAY</bcp14> publish its internal confidence value as a number between 0 and 255, where values of 120 or greater indicate "complete confidence".
This is numerically compatible with the "trust amount" field specified in <xref section="5.2.3.21" sectionFormat="of" target="RFC9580"/>, but it is not required to calculate it in the same way or represent it internally as an integer value.</t>

<t>Keyserver confidence is intended as a heuristic for sorting and filtering responses to lookup requests, and is not a replacement for cryptographic verification.
A client <bcp14>SHOULD NOT</bcp14> rely on the confidence value returned from a keyserver, and <bcp14>SHOULD</bcp14> perform its own checks.</t>

</section>
<section anchor="keyring-format"><name>Keyring Format</name>

<t>HKP uses an ASCII-armored keyring as its primary data representation for both input and output.</t>

<t>A keyring is a sequence of one or more OpenPGP Transferable Public Keys, concatenated directly, as specified in Sections <xref target="RFC9580" section="10.1" sectionFormat="bare"/> and <xref target="RFC9580" section="3.6" sectionFormat="bare"/> of <xref target="RFC9580"/>.
An ASCII-armored keyring is a keyring that has been encoded as a single armored block, as specified in <xref section="6.2" sectionFormat="of" target="RFC9580"/>.</t>

<section anchor="detached-revocations"><name>Detached Revocations</name>

<t>For OpenPGP keys prior to v6, revocation signatures have customarily been distributed as a detached "revocation certificate", as per <xref section="10.1.3" sectionFormat="of" target="RFC9580"/>.
An HKP server <bcp14>SHOULD</bcp14> allow submission of these detached revocations.</t>

<t>An HKP implementation <bcp14>MAY</bcp14> accept or serve an ASCII-armored "mixed keyring" where one or more revoked transferable public keys have been replaced by their detached revocation certificate(s).
Such a "mixed keyring" <bcp14>MUST</bcp14> be sorted so that all detached revocation certificates appear first.
This ensures that detached revocations cannot be mistaken for signatures over another key.</t>

</section>
</section>
<section anchor="locating-keyserver"><name>Locating a HKP Keyserver</name>

<t>Clients are usually manually configured with the address of a HKP keyserver.
Client implementations should be aware that it is reasonably common practice to use a single name in DNS that resolves to multiple address records.
When receiving a DNS response with multiple addresses, clients <bcp14>SHOULD</bcp14> try each address until a server is reached.
The order to try these addresses in is implementation defined.</t>

<t>A far more flexible scheme for listing multiple HKP keyservers in DNS is the use of DNS SRV records as specified in <xref target="RFC2782"></xref>.
DNS SRV allows for different priorities and weights to be applied to each HKP keyserver in the list, which allows an administrator much more control over how clients will contact the servers.
The SRV symbolic service name for HKP keyservers is "hkp" when used over plaintext HTTP, or "hkps" when using HTTPS.
For example, the SRV record for HKP keyservers in domain "example.com" would be "_hkp._tcp.example.com".</t>

<t>SRV records contain the port that the target server runs on, so SRV can also be used to automatically discover the proper port for contacting a HKP keyserver.
HKP clients <bcp14>SHOULD</bcp14> support SRV records.</t>

</section>
<section anchor="key-discovery"><name>Key Discovery</name>

<t>Well-known URIs <xref target="RFC8615"></xref> are commonly used by clients to discover the location of internet services.
We can use the "openpgpkey" well-known base path to locate an HKPS service for key discovery.
This is done by serving an "hkps" discovery file that redirects a client to an authoritative HKPS service for the domain in question.</t>

<section anchor="openpgpkey-well-known-base-path"><name>The "openpgpkey" Well-Known Base Path</name>

<t><xref target="I-D.koch-openpgp-webkey-service"></xref> defines the well-known "openpgpkey" base path for a given domain as:</t>

<figure><artwork><![CDATA[
https://openpgpkey.<domain>/.well-known/openpgpkey/<domain>/
]]></artwork></figure>

<t>The "hkps" discovery file is placed under this directory, which is shared with other discovery methods such as WKD.
The domain is repeated in a trailing path component in order to simplify serving multiple discovery files from a single host.</t>

<t>Some web hosting providers automatically return a zero length file successfully when a nonexistent file is requested, therefore:</t>

<t><list style="symbols">
  <t>If the file "&lt;base-path&gt;/hkps" exists, and is of non-zero size, it <bcp14>SHOULD</bcp14> be used.</t>
  <t>If the file "&lt;base-path&gt;/hkps" does not exist, or is of zero size, then it <bcp14>MUST</bcp14> be ignored, and a client <bcp14>MAY</bcp14> fall back to other key discovery methods.</t>
</list></t>

<t>Requests for the discovery file <bcp14>MUST</bcp14> be made over HTTPS.
The alternative "direct" well-known base path from <xref target="I-D.koch-openpgp-webkey-service"></xref> <bcp14>MUST NOT</bcp14> be used for HKPS discovery.</t>

</section>
<section anchor="hkps-discovery-file"><name>The "hkps" Discovery File</name>

<t>The discovery file contains a sequence of lines containing keywords and one or more values, separated by colons.
Blank lines and comment lines beginning with "#" <bcp14>MUST</bcp14> be ignored.</t>

<t>The following keywords are defined:</t>

<figure><artwork><![CDATA[
version:<version>
server:<hostname>[:<port>[:<options>]]
]]></artwork></figure>

<t>If "port" is not given, it defaults to 443.
"options" is a colon-separated list of options.
No options are currently defined, and unknown options <bcp14>MUST</bcp14> be ignored.
Unknown keywords <bcp14>MUST</bcp14> be ignored.</t>

<t>The discovery file is parsed by a client as follows:</t>

<t><list style="symbols">
  <t>If a "version" line does not exist, a client <bcp14>MUST NOT</bcp14> continue with HKPS discovery, and <bcp14>MAY</bcp14> fall back to other discovery methods.</t>
  <t>If a "version" line exists but a "server" line does not, then the HKP service is located on the same hostname as the discovery file.</t>
  <t>If more than one "server" line exists, a client <bcp14>SHOULD</bcp14> try them in the given order, returning after the first successful response; a 404 ("Not Found") or 410 ("Gone") response in this context counts as a success.</t>
</list></t>

<t>Thus a minimal HKPS discovery file will contain just "version:1".</t>

<t>In addition:</t>

<t><list style="symbols">
  <t>Only HKPS version 1 is supported in the discovery file, and clients <bcp14>MUST</bcp14> use the v1 request format and HTTPS for HKPS key discovery.</t>
  <t>If a client wishes to receive v6 or higher keys it <bcp14>SHOULD</bcp14> make an HKPS discovery request.</t>
  <t>If a server wishes to serve v6 or higher keys it <bcp14>SHOULD NOT</bcp14> do so over WKD, for compatibility with clients that do not support v6 keys.</t>
</list></t>

</section>
<section anchor="key-discovery-example"><name>Key Discovery Example</name>

<t>For example, a client trying to locate a key for isabella@silvie.example.com could consult:</t>

<figure><artwork><![CDATA[
https://openpgpkey.silvie.example.com/.well-known/openpgpkey/silvie.example.com/hkps
]]></artwork></figure>

<t>This discovery file might contain the following lines:</t>

<figure><artwork><![CDATA[
version:1
server:keyserver.example.com
]]></artwork></figure>

<t>On finding this file, a client <bcp14>SHOULD</bcp14> make a GET request for the following URL:</t>

<figure><artwork><![CDATA[
hkps://keyserver.example.com:443/pks/lookup/v1/authget/isabella@silvie.example.com
]]></artwork></figure>

<t>The domain owner <bcp14>MUST</bcp14> ensure that any keys returned from this keyserver are valid keys for the identity in the search field.
This <bcp14>MAY</bcp14> be achieved at low cost by serving the keys from a static filesystem.</t>

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

<t>As described here, a keyserver is a searchable database of public keys accessed over the network.
While there may be security considerations arising from distributing arbitrary keys in this manner, this does not impact the security of OpenPGP itself.</t>

<t>Without some sort of trust relationship between the client and server, information returned from a keyserver in arbitrary search results cannot be trusted by the client until the OpenPGP client actually retrieves and checks the key for itself.
This is important and must be stressed: without a specific reason to treat information otherwise, all search results must be regarded as untrustworthy and informational only.</t>

<t>The sole exception to the above is if the openpgp key discovery method has been used, and all requests in the chain of indirection have been made over HTTPS/HKPS.
In such a scenario, a client <bcp14>MAY</bcp14> assume that any keys returned are authoritative for the requested identity.</t>

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

<t>This document allocates the ports 11371 and 11372, the URI schemes "hkp" and "hkps", and the well-known URI suffix "openpgpkey".</t>

<section anchor="updated-registry-entries"><name>Updated Registry Entries</name>

<t>IANA is requested to update the contact details for port 11371 in the "Service Name and Transport Protocol Port Number" registry to "Daphne Shaw".</t>

</section>
<section anchor="new-registry-entries"><name>New Registry Entries</name>

<t>IANA is requested to add the following entry to the "Service Name and Transport Protocol Port Number" registry as per <xref target="RFC6335"></xref>:</t>

<texttable title="Service Name and Transport Protocol Port Number Registry" anchor="service-name-port-registry">
      <ttcol align='left'>Service Name</ttcol>
      <ttcol align='left'>Port</ttcol>
      <ttcol align='left'>Transport Protocol</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Contact</ttcol>
      <c>hkps</c>
      <c>11372</c>
      <c>tcp and udp</c>
      <c>OpenPGP HTTP Keyserver (Secure)</c>
      <c>Daphne Shaw</c>
</texttable>

<t>IANA is requested to add the following entries to the "URI Schemes" registry as per <xref target="RFC7595"></xref>:</t>

<texttable title="Uniform Resource Identifier (URI) Schemes Registry" anchor="uri-schemes-registry">
      <ttcol align='left'>URI Scheme</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>hkp</c>
      <c>OpenPGP HTTP Keyserver</c>
      <c>Permanent</c>
      <c>This document</c>
      <c>hkps</c>
      <c>OpenPGP HTTP Keyserver (Secure)</c>
      <c>Permanent</c>
      <c>This document</c>
</texttable>

<t>IANA is requested to add the following entry to the "Well-Known URIs" registry as per <xref target="RFC8615"></xref>:</t>

<texttable title="Well-Known URIs Registry" anchor="well-known-uris-registry">
      <ttcol align='left'>URI Suffix</ttcol>
      <ttcol align='left'>Change Controller</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Related Information</ttcol>
      <c>openpgpkey</c>
      <c>OpenPGP WG</c>
      <c>This document</c>
      <c>permanent</c>
      <c><xref target="I-D.koch-openpgp-webkey-service"></xref></c>
</texttable>

</section>
</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC1945">
  <front>
    <title>Hypertext Transfer Protocol -- HTTP/1.0</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="H. Frystyk" initials="H." surname="Frystyk"/>
    <date month="May" year="1996"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is an application-level protocol with the lightness and speed necessary for distributed, collaborative, hypermedia information systems. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1945"/>
  <seriesInfo name="DOI" value="10.17487/RFC1945"/>
</reference>
<reference anchor="RFC1866">
  <front>
    <title>Hypertext Markup Language - 2.0</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="D. Connolly" initials="D." surname="Connolly"/>
    <date month="November" year="1995"/>
    <abstract>
      <t>This document defines a HTML 2.0 (to distinguish it from the previous informal specifications). [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1866"/>
  <seriesInfo name="DOI" value="10.17487/RFC1866"/>
</reference>
<reference anchor="RFC2782">
  <front>
    <title>A DNS RR for specifying the location of services (DNS SRV)</title>
    <author fullname="A. Gulbrandsen" initials="A." surname="Gulbrandsen"/>
    <author fullname="P. Vixie" initials="P." surname="Vixie"/>
    <author fullname="L. Esibov" initials="L." surname="Esibov"/>
    <date month="February" year="2000"/>
    <abstract>
      <t>This document describes a DNS RR which specifies the location of the server(s) for a specific protocol and domain. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="2782"/>
  <seriesInfo name="DOI" value="10.17487/RFC2782"/>
</reference>
<reference anchor="RFC3156">
  <front>
    <title>MIME Security with OpenPGP</title>
    <author fullname="M. Elkins" initials="M." surname="Elkins"/>
    <author fullname="D. Del Torto" initials="D." surname="Del Torto"/>
    <author fullname="R. Levien" initials="R." surname="Levien"/>
    <author fullname="T. Roessler" initials="T." surname="Roessler"/>
    <date month="August" year="2001"/>
    <abstract>
      <t>This document describes how the OpenPGP Message Format can be used to provide privacy and authentication using the Multipurpose Internet Mail Extensions (MIME) security content types described in RFC 1847. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3156"/>
  <seriesInfo name="DOI" value="10.17487/RFC3156"/>
</reference>
<reference anchor="RFC7595">
  <front>
    <title>Guidelines and Registration Procedures for URI Schemes</title>
    <author fullname="D. Thaler" initials="D." role="editor" surname="Thaler"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <author fullname="T. Hardie" initials="T." surname="Hardie"/>
    <date month="June" year="2015"/>
    <abstract>
      <t>This document updates the guidelines and recommendations, as well as the IANA registration processes, for the definition of Uniform Resource Identifier (URI) schemes. It obsoletes RFC 4395.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="35"/>
  <seriesInfo name="RFC" value="7595"/>
  <seriesInfo name="DOI" value="10.17487/RFC7595"/>
</reference>
<reference anchor="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</reference>
<reference anchor="RFC9110">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>
<reference anchor="RFC9580">
  <front>
    <title>OpenPGP</title>
    <author fullname="P. Wouters" initials="P." role="editor" surname="Wouters"/>
    <author fullname="D. Huigens" initials="D." surname="Huigens"/>
    <author fullname="J. Winter" initials="J." surname="Winter"/>
    <author fullname="Y. Niibe" initials="Y." surname="Niibe"/>
    <date month="July" year="2024"/>
    <abstract>
      <t>This document specifies the message formats used in OpenPGP. OpenPGP provides encryption with public key or symmetric cryptographic algorithms, digital signatures, compression, and key management.</t>
      <t>This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format. It is not a step-by-step cookbook for writing an application. It describes only the format and methods needed to read, check, generate, and write conforming packets crossing any network. It does not deal with storage and implementation questions. It does, however, discuss implementation issues necessary to avoid security flaws.</t>
      <t>This document obsoletes RFCs 4880 ("OpenPGP Message Format"), 5581 ("The Camellia Cipher in OpenPGP"), and 6637 ("Elliptic Curve Cryptography (ECC) in OpenPGP").</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9580"/>
  <seriesInfo name="DOI" value="10.17487/RFC9580"/>
</reference>

<reference anchor="CORS" target="https://fetch.spec.whatwg.org/#cors-protocol">
  <front>
    <title>Cross Origin Resource Sharing</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC6335">
  <front>
    <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="L. Eggert" initials="L." surname="Eggert"/>
    <author fullname="J. Touch" initials="J." surname="Touch"/>
    <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
    <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
    <date month="August" year="2011"/>
    <abstract>
      <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry. It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
      <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP). It also updates the DNS SRV specification to clarify what a service name is and how it is registered. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="165"/>
  <seriesInfo name="RFC" value="6335"/>
  <seriesInfo name="DOI" value="10.17487/RFC6335"/>
</reference>
<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>

<reference anchor="SKS" target="https://github.com/sks-keyserver/sks-keyserver/wiki">
  <front>
    <title>Synchronising Key Server Wiki</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="TOR" target="https://spec.torproject.org/">
  <front>
    <title>Tor Specifications</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>



<reference anchor="I-D.koch-openpgp-webkey-service">
   <front>
      <title>OpenPGP Web Key Directory</title>
      <author fullname="Werner Koch" initials="W." surname="Koch">
         <organization>g10 Code GmbH</organization>
      </author>
      <date day="5" month="December" year="2024"/>
      <abstract>
	 <t>   This specification describes a service to locate OpenPGP keys by mail
   address using a Web service and the HTTPS protocol.  It also provides
   a method for secure communication between the key owner and the mail
   provider to publish and revoke the public key.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-koch-openpgp-webkey-service-19"/>
   
</reference>



    </references>


<?line 734?>

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

<t>This document is a formalization and extension of HKP, originally implemented in the PKS keyserver by Marc Horowitz, which in turn was based on earlier work by Brian LaMacchia and Michael Graff.
Without their grounding, this document would not exist.</t>

<t>The openpgpkey discovery file is based on previous work by Werner Koch, without whom the key discovery method would not exist in its current form.
The "since" operation is based on an earlier proposal by Daniel Kahn Gillmor and Vincent Breitmoser.</t>

<t>The authors would like to thank Peter Gutmann for his work on the Certstore protocol, some of which was applicable here, and the members of the pgp-keyserver-folk mailing list who contributed valuable comments and suggestions.
They would also like to thank Bart Butler, Daniel Huigens, Daniel Kahn Gillmor, and Justus Winter for help with the v1 request format and discovery file specifications.</t>

</section>
<section anchor="document-history"><name>Document History</name>

<t>Note to RFC Editor: this section should be removed before publication.</t>

<section anchor="changes-between-draft-gallagher-openpgp-hkp-06-and-draft-gallagher-openpgp-hkp-07"><name>Changes Between draft-gallagher-openpgp-hkp-06 and draft-gallagher-openpgp-hkp-07</name>

<t><list style="symbols">
  <t>Added "authget" and "since" operations.</t>
  <t>Defined confidence.</t>
  <t>Added more explicit guidance re sorting, filtering and error codes.</t>
  <t>Key version MR output field is now "keyversion" to distinguish from the output format version.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-05-and-draft-gallagher-openpgp-hkp-06"><name>Changes Between draft-gallagher-openpgp-hkp-05 and draft-gallagher-openpgp-hkp-06</name>

<t><list style="symbols">
  <t>Updated references.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-04-and-draft-gallagher-openpgp-hkp-05"><name>Changes Between draft-gallagher-openpgp-hkp-04 and draft-gallagher-openpgp-hkp-05</name>

<t><list style="symbols">
  <t>Allow detached revocations in keyrings.</t>
  <t>Redesigned v1 request format to use path components for required fields.</t>
  <t>Added openpgpkey discovery file.</t>
  <t>Added "vfpget" and "kidget" operations.</t>
  <t>Added meaningful "exact" semantics.</t>
  <t>HKPS is now <bcp14>SHOULD</bcp14>.</t>
  <t>Defined port 11372.</t>
  <t>IANA registry tables.</t>
  <t>Deprecated <spanx style="verb">op=stats</spanx>.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-03-and-draft-gallagher-openpgp-hkp-04"><name>Changes Between draft-gallagher-openpgp-hkp-03 and draft-gallagher-openpgp-hkp-04</name>

<t><list style="symbols">
  <t>Reworded <xref target="key-lookups"/> for clarity.</t>
  <t>Separate section for keyring format.</t>
  <t>Specify detached revocations.</t>
  <t>Updated references.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-02-and-draft-gallagher-openpgp-hkp-03"><name>Changes Between draft-gallagher-openpgp-hkp-02 and draft-gallagher-openpgp-hkp-03</name>

<t><list style="symbols">
  <t>Clients <bcp14>SHOULD</bcp14> supply the <spanx style="verb">v=1</spanx> api-versioning variable.</t>
  <t>Machine-readable output includes key version field.</t>
  <t>Clients <bcp14>MUST</bcp14> silently ignore leading and trailing cruft, trailing unknown fields, and unknown flags.</t>
  <t>Clients <bcp14>MUST</bcp14> silently ignore keys with unknown versions or algorithms.</t>
  <t>All other m-r index specs (CORS, Content-Type etc.) are now <bcp14>MUST</bcp14>.</t>
  <t>Included the <spanx style="verb">hash</spanx> variable from SKS.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-01-and-draft-gallagher-openpgp-hkp-02"><name>Changes Between draft-gallagher-openpgp-hkp-01 and draft-gallagher-openpgp-hkp-02</name>

<t><list style="symbols">
  <t>Tightened up BCP-14 language.</t>
  <t>Included <spanx style="verb">op=hget</spanx> from SKS.</t>
  <t>Options now strictly boolean with default false, variables less strict.</t>
  <t>More detail about HTTP status code usage.</t>
</list></t>

</section>
<section anchor="changes-between-draft-shaw-openpgp-hkp-00-and-draft-gallagher-openpgp-hkp-01"><name>Changes Between draft-shaw-openpgp-hkp-00 and draft-gallagher-openpgp-hkp-01</name>

<t><list style="symbols">
  <t>Improved text structure.</t>
  <t>Added references to HTTPS/HKPS, and hkp:/hkps: URL schemes.</t>
  <t>Forbade short IDs and deprecated V3 keys.</t>
  <t>Included <spanx style="verb">op=stats</spanx> from SKS.</t>
  <t>Mentioned CORS.</t>
  <t>Made use of terminology more consistent.</t>
  <t>Replaced custom status codes with standard HTTP status codes.</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA9V9a3PbyLXgd/4KLF03kaZIypL8mFHsSWTL9ih+rmRnKuVy
ZUCySSICAV40KJnx+L/sb9lftufZDwCU5LlzK3eV1JgEG/06p8/7nB4Oh706
q3NzlPTfrkzx7sW75Kf3798lL83GmurSVMm7qqzLSZn3e+l4XJlLaPnTy3f9
3iStzbysNkeJrae9aTkp0iV0M63SWT2cp3mezhemGpbQ62q+Gi4uVsO7D3vZ
qjpK6mpt64O7d3+4e9BLK5NCF2bSuyqri3lVrldHibzUuzAbeDo9Sk6L2lSF
qYcn2H3PrsfLzNqsLN5vVjDo6bP3z3uXplibo16SSCe6oD48qqlZ/2cYIivm
yQtsgc+XaZbDcxnvL5mpZ6OymuNPaTVZwE+Lul7Zo709bImPsksz0mZ7+GBv
XJVX1uxJH3v4bmVWZfDuHHY4HY8m5XIvLaaVuZpPyxq/XbNZ2E0OW2zroKPo
7ZF0m5XX92NreO0faV4WsAUbY3ur7Cj5CDAdJLas6srMLHzaLPHDp166rhdl
Bds4hAkkyWyd5wzYk3S1KExyvkiv6BdYf1pk/0prgMJR8ldADlNdlZOLTfLe
TBbUxPD2Ti2885d/+ha4E+0BjmlxyQtdRccoAE1EzNGzD2H/sit/kX+5d/ir
SsRrM83qsuoVZbWEXi4JQ86eP93/4d59/fj9gwfy8eDh9wfy8XD/vj59eP8H
bfv9g339+MP+/l39eP97+vj07dn5EY1dp9XcAOgUcjNTTxYjuzKT0dUirWGW
iD93JmVlhys5Yfwin8anVWlt8rbK5lmRnBlbrqsJbX4F+NvLilljOQ8OD90U
D+7/gB/PX26ZC+DNYs3oaC/s8EKPeuPbVXaRhVM63xSTRVUWmcUjBHBIzplC
/MwN37896x6PVg0wgHX+00xqWnnY8fuySs6hTTbLJgRoC7+eDk9GF+Vk4XD5
yoxhbkOcXDaBt+Cv1xsOh0k6tnWVTupe7/0iswlQovXSFHViuUtjkxToS4Uf
ylkyKQsgFDRKUpdJtlzlhpqnRaIU0O1Bsqa11guT/AQUpKrN5zp5X6WFnQWU
MdlBkrk76h1Dl9EUMhx7Uk7dyhBXE+jEFEi8cD5pouCHd1N+JQeaON0kAPmr
bGpgEgYOaF1lE5hlXfPsseEqzaa4iHE6ubhKqykMtVzBOOMsz+oNvFwvcO7W
wJCZrXEpbr280SPewmU2neam17uDhLYqp+sJDfHlThZ8/drrPQdImRT6g4nT
rFbrcZ5NcMOSSbVZ1eW8AjKxAQL4n+usoq3H36YZTn+8pl7txtZmOaLOlmmx
AZqUVkCCcJeXpa1xFcuyyDc4xFSaJ4vUJmNjCulR4DNk2OJH2j0LaAaj+mlZ
2vEJAHdsoCUSbOgTTg+8OIfjU2CjEWCO2cb3GIht1HA7Cf0xmmAHI9zEpwGO
4fAnZpYVGX//cifAwOHU//K1R7PAxSHPs0n/9Yfz9/0B/5u8eUufz5797w+n
Z89O8PP5T8evXrkPPWlx/tPbD69O/Cf/5tO3r18/e3PCL8PTJHrU678+/jv8
ghPuv333/vTtm+NXfUTCGKeBYRPOGfgJmPKqMrgDqe1NjZ0AkOELvPPk6bv/
+3/27yVfvvwvJKv7+z98/Spfvt9/eA++XC1MwaMRrPkr4MCml65WACjsBVgB
wG6V1WkOCAIYYBflVZEAczCw0d99xJ35dJQ8Gk9W+/d+lAe44Oih7ln0kPas
/aT1Mm9ix6OOYdxuRs8bOx3P9/jv0Xfd9+Dhoz/nGfDd4f73f/6xh9gF0hdt
G+HrlzsoWMHXIVJbwCGgQdgAIBYiaIkYiy8MEgMfNwBSJAZF8lFY4acEdj1H
GgmwpRFscmXynCGED0xVwakBYoanGnEAkNUC48aW+BnEC8snFrqVo3Cy5nY4
JEgzwBaSqVnl5YYwCYgIdjyBYYsaTneKL5f8Mr5CJHJ/dHdAzdzJswlB2a5X
KxBfuDW0GvWarY7/nqTTKZ0uQKSNe6OEKVXRKEgHd3ZYUElAnAR6CcyjZsxn
ZIdTC6SQ2qewK0DLYH/+eGmSeQnt8GTDcnhxZkrbxBSJkRvkTsv0mGZ6+scp
9nmV5TnxlxIp5GQNHL8yy/KSeU4mCyUyeQHHDc5eIriHQIG1wYN+TNGTogSZ
sY8CNX1dlXBKsb9yXRMogNuMoT0ACchqOh31zg10bS1A6s79UW93t9f7GY4i
Q9KhzflAscoRZxAXASUMMSBAAVQKzvuwj/DvzvkuociUmc46s0R0q3KZzE0B
rHiC3RP8oW9sPd4ErPbD2WligU4vAaH6KMIyTYJPsLCPIo99YngjcQZFYF7A
AATcYr0EMTPZ3z98uK+4ex41w58Okp00B0F3PV/wTsP/K5iyMh1A4RXKFCBp
7DKnApZsBcrL9HO2XC+7uO0MmN4VIBvT/VmWA4VU1oBb/xlOGG2lblE5A37O
LEy2m84ViuzI0HV/cGk7djfZef/0HX2xyfd3aYx79w5hhr0nm0CyoR9gVcAM
Nww44DPpOq/5dONcoJF2xXs18JvVbHwetYYB+bSIuA3nJZvBWZANThBMA/rO
ZJyPjwgEhC0smG0AeacgnKMeybAj2oTshsBSlONySuAA6NQRnu7fY0Q9Dtix
HAw942M45J5SwqpAOhNKo00RBfGXQULSQI1iHb27NDCFKQMUp32Z5iRPmsm6
QkgDHFEWJFDa9WSB6I8y7AKkKAEm4I1NPoJEDGhKM//yJS9RBCzmXsIGJkiC
CMBrXZdL2oerdEMPlSgKaXCYAQpDhZQJJ4qyxh1QDv5zDVpi8i6tFyheVPx9
uMLvX+k8JiRmIG2/KhN6PkhQ5wJs7++tLuxeXpYXoBDTyPzZJjuWpo0ytzz6
+nWXTyK9A+SHX/DKuL5DT2q3WHhvFMEKKbMCSqZLK2XCTBNM1sUUPtNQfSa3
LMnSoVnXNpsKC5oAMPBURlIKSXTYGg9gQYqS9LtI4SOfDUA9ZAskVdKphykA
bC+x68UaRFM89NMUyCWLOrMUoaoQ/+n961e4/qXlozNbFxNmNYgjTsb3L3wE
hewTw4yO4DlQ7LUFYRE5KvBx4N9DS8++Cg1OE/6OCOrZb1IYM7XuXNXrCqna
eMOSMW9xIE3DMQR8rTJALx6X+iBi/FG02E8oV61z4km4EcCgSBGZl3AMlA7i
gDya71tUrEk4uxUortkY9TpEDvM5Rf40kFeRFt67ey/Z6b8Btvm8BCj3d4Hy
EuCBXxbw61349Uk6VcSG368WTu6HWQGHg67hzVFT40OBHvd7Pof3jEhIodxC
6IoCUJoLI0tsVq9VF4I5CdcOcK0gyYG6xFYM7IYaBSxhw5hFW6a8YkdBj1Ou
YNw0Vx7HTWBlCDY5A8kszXIz3aVpMjvkExEsAdb8VEiDkjE8KMQwqONZmefl
Fb5L7Y96vS9HrGg/7ocY10/uMHINqd3XXvBjEv/9CgoMivYrXCvqi1v+ft3+
0/a/3gEA/O3LpOPvV0fbYB8ngPRmCq0PkmP4skL4NlqfM9mBH0iJSi0ffz7Y
QF4BFp4GrUrQEDe9e3cPAQ2rMZPuuL/3C6OgQeYMND9VzRsBCt95uB5i9BvF
yo5OWO/0Z7XAk2SRxRLvQcLksbp3b/9u8gKk6a4NQauL04RxAmkBuAAYOjU5
6mHAQkfzUTJd03E9e//kOXR3iAopmg3gWSli+PbJYRtSy2GKK8BiY3v3Dg6S
DwWQEaB/lujhRDrs2vTKoJWHdEKcYnvP79/dp+0KFZRb7rlwDdjz3mnhpPsB
Wlli3u4PxeHnz9DjNCO2qWcoEl+gJzagovg/BHQESRsX4gkJ0YQUZnBpctA+
U2RNQiuZptDZQQaLDSdES3G6RKBBQ7a8SKDRtRoadHeFMhEDA6BlSzNiqoYz
IOKzSkHWYAVGLFpTIUJEpIHt5KQuzxKEWpMyKWeUWZMhiCi8kHGTFjgog7ww
V52zI9JGOMeSxBRNx6AmpUsvtjuVIhmyHJfRkjKkuEscZIKU2jAcgS1MEG35
VLKiNPP8CEjxE3wZdIyyMrqrOBM4/4METgj+5xD+A5iJtBf79JMMEQuWdYUd
JRtTs9QYwR7VJSATsBoaBA8Lbi2SGeyXrBwqc61tOkdLnAqiNrlzcJ+a3zl4
QFuGShegyIYHupO8AsEJt2e9Sk7SOmWumwZGpi93Qvmq18PzrQIYaVBIBy6z
FIVEAsyLZ+/1fIBIrEZTQA7m+OnY/oPIyc6XL+eiAh6ODnBzRdFHIQ7QYbwG
3QTnJYiHyjcTokgiHAg/YeRV0dKx/Q9nr0gLKpEKWRW6/BOQXWdoKbV5Nl/U
JGvVV8Yw6r0y83Syof273Pc8kAzbIn6ODYyN6s1rlDZQktXNQQKUgpZGcj72
1i9Bft1xBEMkVSZuIKdmJp/yBLklPQBsrpGIo2h8RTjo6E3NpjgBEyrqgLOg
ANSGzx4NGfUed5YJs2EZgrol4wbJLIiOiF2Ed2OUpdBCDONcpiCnAX0VY5ce
d1RHv3zRVkPXChQI2qFR72/6iMZbgSoWWSUT2NtqQzbkYm47+lZc+X504LHl
+wcPvn4FNbvdAQrwMG82oKKdDmhHWQF9GfVeNsw0oBLiEcYW6+KiQPNd1BcL
xDEuKNt/LrjglRrBDjFFq93bbjF8B2ZvIE1wStAyw3wC8R3ZhgwcYx8eECF0
QImAJjaJaqBBknmrib60KLeqeDmwmpyeD+NFfe0pTe6c08BjeQdmE9iROeYZ
M9420AZsyjXUX9L/Q17/id4doib4h3n9p8f4CHTdNX3rg+SILDmgBn8uV48f
lasf/8BjP37E//748Q+j0egTIfaGTYMg3daMWs5KiIotzKsL1YHC5uspgikF
QQz08EqwCR4NkgVQH9V+g6NLyDX2i956LJsNAQ1hVCtNAaIgCkdyxtjgVLwQ
okotNh26lqTUvimJBBLdDKheoLs61Rr3hXUrQo0WlgNaXO5vRYkWhjE6ELSc
8HBr5OiY88hDD+02sACSmsM17F3u9/Ft5gi2jR/QYA/xY88hxp8dYmyfXBM+
IyD2TRy5FXqrMTq75hTB7p/OunfUgx7BNAACPVmg4d3ZAMp1vVq71sBg+YGj
ScBYdS0qTDdUyg58U4eFEydh9u2pXYOCtLmdiwFxiQ2eKtykSPWAayMfFSOV
esbaziwcC9rOQCMVGv2+i8s+pzP25U65GhI8v/aaPNa7YclL4DkssT74ijNm
w3/EdFvMGg0SaD0mUZj2ytH5xpEPbIzapbgHnZkjZsmn5IdFOXuyBv3oGr1j
0JAMhBOIYQRNeU1zS2AaUXMAKkBsATn1+97f5RXHHSNq+M6DvpxtoWVO2Q21
kIabTjQQYYKoIRfo6wC1LKsJ5EY9M0VZDFlZKCZGiBYBZG7qPrpDZYO+3IEH
AU5ea5WtXQfuBcHgxlNvFiTgkdwcbzyuxHyu12kuGiyaGJkWCKwd3jlpDC3o
3oqFDnS29jlOFeORTM3pQujoYFOEtbN1LnPWg0duYoK4s0eJkEqcrUiOz5+e
ng7TallWrC3TXNuymPyiPOBrcxoifF1VSKinKn6RORKQgy1GFKiABKAim8Bn
NJh4MgS6F+4beeZRLYF5WhGUMCIBRboMVc6EPI9joIAXIn6QyebJsxenbzAW
J3n34cmr06fJy2d/T568evv0Jf3cF11TNBK/Xh4sq63JZ2F/z96c3KY38nkB
ZIpoYhEFFeli6hGGhJ1ogz9KvA6aYjtQNc+WWS0mOrGIKKgI/my4I4aQm2Je
A949K2qKLpEekJcRrcDRSI5h1+AEX2XDXDEDrINzhVzEfwN67qSYAhEc36DT
MEVqskMmV9BEEbVmWWVroBineFL5kKgu7QwovwutapGXkBZgsBgdgh0OG8tq
NrXDs92IRkjDb6ITrvMWrWj/gqfPAuRydjh10Bn2IWTWG23iKatiCdv+ASaV
nJ6Q9YWk5oAzTNeEChLUQn6ZDUIR1Xj3gBjz+669F88pAUBMgAmbJ8jxKQOz
GBJFq6DRDw1Qxb9MVYYYRCJgC49GzNKCaJVQuKEeoyUM0JhEJ0kmJxPlGWJz
JqJscsLJoOiIJsdgLqPYJkc2HkekCTtxAioj0UQCQ1HSpxf6TuojmJqaxNBy
NuvjIqmJU4BZAHLYCIdrYmLeRI+2Yl3oh6qDHkKE02eOIaVAIiyxSCBFc+Ss
wGCBk4C++FktgFnBfk3ZtffvXoY2NEelqGsMvirQPJJ8eP8UpaDUu1Xw3DMm
EQW4kWPh09PztyoEknwE5IEMfE7WB1iPzCjpH9w9uD/cPxje3e87FiMUjwl1
uNanZ6+eD62Bk5CSFLQASABJy5ZpPgTYlzilrv3Ycg4maZ6NsSuJScDGQk+d
uMq4lpeAM6ZgT733z01ACcksSwrIu1LYST7iIOMBOP0bS+DAZCpKEeWQb6dw
jDZLNBRMygX5UZ1r2DETirhAvppau16uJJZrrFEUMlVRvBzwvdzvu6S1XGEI
BPns1isGZY1LmzAXJpIitsEYO4nMy2SSBip68Zd6lLnkqfpLWEiBqcEOLcil
h8I+8RYylwjRcUBXUHtULtnWyYZl7n/JBiY2aSO6tRbCLIymbNdji3OFlv3L
2SoUl8gIFfIfONzcpKHfnEr82VXKRArXkF6WGQ1BBK0oDPklqo3vXDY9z5We
FbrzVmJ38DcQeeC/OUoRLqKWNZOGJhKocW53SFXOYVpWFMYKFM5qSrYF2Csk
rxJdJAZ9iiBKcXYEOGxweoKhEkQjsDtpP5wa0sDRjd3FJRE/lWwx20KuxRML
6SFQIfM5pof06Pb0UHpoMeDm8y7qSDJJy5JKe+glFZJTtwjfPwVO+kH3fDzy
pk2PPcnDXZI4iI4XzNIMaPjis4MJapABBwOxx5ZjVm4tKNL0/hvExP/PpMJL
AdMOdD8ureF9iQXCy2/ExMttqNj6oSEKKs4QkjFXER7y34isqZ+XU9uuJE5S
zVQ6MUfFVXLC+WCcq4YKoBUnBeAYmiEh7Q3oumVjSKZjj0ygUrcPFSxRjGeN
MwWCi1E9LAAUmXt5h65K3w/7GTbEbC2doShSm6Fr/UQFEbm3jK0T+j6d1wCU
YpwbRlNrh3g5Tt5qH8CHKVckSLKVbodsYBY9l3vs4Y1xuGmOu0m4bNmai21G
yvfd7dGmB2R+wiIYwqHLfJgG5kCN5Anij0kIweAWMgNrKFVsrHbGJX7MM9n1
MaM0QbGHqvG5a7qx38TzNUZedIGx7R9DRdN5UeJeS78Dpn/ztfRGxqmBt3As
TZ2imKqbFYnBAfhbLgJPftk1NUUBB+knaIHTiIyJxLIjbLkh4bZ03Jb4chNJ
k/4jbaMtJpGg0BIOxxoNsCH3FjTsnCXvTvcCbqVNBHJ+QnI+SXhIs1AUxuQV
2Dny3fTvfu7zcOE702yOk0PpBmnUBN3MFiPjUOkmotA9OTFJkSiFPvByUpu6
IVdprC9C9Q23sA29TESvLCC93BPLpRN/avD3U/TqV8nzYB7YNyYfkkPkDBa1
IvoSNgEpd5VOLnDwwOt+f3QwOhRPKpqbWFf99zLmi2zKGA2DgADdwmD+/fYY
rP1FGKwPvx2DWSKON/H+6F5zE0WhxKY3ozBsyf6DDoz8PXH43wtUMcAtUrto
Q/Rao1sLnm1zmzz6dlhSsCvuHDEhsmDQ5/8ZVOffBrG3xLveehHpyx1iZx5G
GNvArWC2xofawAggCbnEgEDKUhdeobH0ThlUCdLz5IJc8Spxiruk/3nYD1x8
Cg117fH32L0XQ0y0Kxv470lWVsNQiioyGgE57442DYQPIc7UFGUBFyqnEIAj
Thw/IOj03ZZLkcYFE9fOYuteFRsqWoHgJZY8yMFRxFsigHnJBAXJfUjbz9kG
a902GMrTKzVqkhdE421CGtacdCs+kQSwwG1LeaEZ+24i0lp1CArJTmw8Ec4i
BpFmUEv36B0mcpqE2OKicyl4QniDB44SZ9XEmUYnj1kyhQHhPriIIziJnXQ4
2XlwLwGksZhmEzLV4EXZl8MDJ4olh7sDOGP++71dQgzoyz16sNsx3G8RUBwp
OOr1vnMJWBSDHAKZU34o6Yx/e3BvCAtTO8+WsISmHvmdF+kbbgJEtcMD6rLP
Nk7uua+OAg4aqykEb1pyiLJYS+16BjQkY0tI23DaNezlA6aPMu1wFrKEVoCE
cgmW7nEnYBq2DN9pKJSOr1CAA4XDffki0VHLakgqmuH8kd7fDn1AHRBvtAub
iuXEKQV5U36O8YOPjc87Vi+K09I5fS30bSM5CY47kpfhzWfe2QUolVvo0A0n
buA9WIS1bQ28eb5DxQVhdJtD2rBa/U+HL/G8qwyj8hblVSRdLGD1GAQU+/vb
+qWP2Ts3LqjXJD7H2umqTU9Tl2dJ4CzJYEDxMNoxSCglbbji1HirNmOZMQyF
i+AnOlkOeJEo0qnEPbL59hlnySDesQo+lLwZxLzzAO3ynKEW2DNDRk4JrIBU
HMKzytH1gciJHJeoV6e9QSK58A+TkI729nCMkUwB60QcUYpgGAooIYA04B/K
1WMCJY7QCkX6Db1jIBl1uEf993ovDFO7u59Pnh2fPHn27PnJs6fHz58cnyD/
CMjs7iCIej2/9ZJtx6wagY9wWjXusT2L2yz8hjFwzcz099q939E0C6m8gfmG
yXEUR97MuWuL+sKWfLqejSLL3709/31Cy9Vn67IEfWimDwIJtACchJ/BdbHJ
h9Fg3G0cu3zYiF0mdk95pHL0aYwluovmJpBbQeAyGzwqAVFgv4xv81+J4MFp
0NtJ820JSdNQ8HWVB1LzNVHa+42Veg/VUlImCjKc4JZLJoN1qTpkJcRzkhvO
e00n3qb+uwenN2MRXBaIKp9IVDmowjpsGLC/I0wPZW4jG3YrfWwQKGSHoJC5
TC80ZrItKchedYlVIDaknPVA/HlLuJ7GLWxbFc0lHqLpDW8y5d8a4rdEQe6C
3UO1j+9jDnaZ5tnU+SGoQImLsPV5A1/udICwJxkdcSCu5srSCxsJKo3s6Bor
Sryx70ahOFEufOIYreRwulOH67Bs8qsYlfkViXXG9BsJQiBfWLlcpi7xpGNy
uBtjs0gvs7JSGuD3n6ItQOrSuGtaC3T3DJ0sHFmjeg4SiXFZ5gZgNMtTNEe4
uB1WWyfOB998sw9yguk7KgiUlFr3Z3DGTD805iyrfrLzWgSvMxGj0KQj9pwl
WgrElIMvtIOUV+JaYNnEhhgqQcBwWuZVukx2wrRb2gaLEb2ZVUUyMoqIMCVG
/8CIXrQnoW6MraHW6OxvBbtLYtItQrCbYdYyO3hblr+gnNvEzGZYb0oS8Jvh
2nQ8aHtcuI0BUp9LjYfOoUNYFUuA1ZtSDtNEAqIdqIqlB9WxDQuTIHUV9LRh
9iRHXKypzkcQcsZZk4NogRrHRoo4xTh2eC5pbTJAlVwx2WSYUzCS+53JH2Yf
u7CufMP0N26oM8VAWo1iGvWOC03zdtmGV0qZ0uakHJkUcURUJgmKQAKIRd2Q
JVQUSSH+KY1uoUiTaYlBPYRfTCJd7qmbZdOKx37KbEmhLEVZ0DqztAgmMOZk
Q56X4v8FVoc6nUWbTwOZWjhUMINgM+WA0J7qykJG1WUzPDhIdjrTbFH9JXTD
swkECCaHoT1x8QXOFm3YGZtGxm+yMN7evHiTbfFNWQxbHUu4odr8lLhKTgtv
mtYiEZIKWBASTT6HgQ0mYjXB89uwm7SaU6wIloMs2PCGUYcEfZ0jV6uiOKRu
CusD1FTcDZ1aLuiEKhkQu3e6f9UZ4xBPNiJrxLwwLotAGb1jJPZSqK2cHZBq
QCPcxI62QZJnFyYKBKAkndZcaJ1La/JLStnapntvDx5QAnrawTDEEDBgaUUA
jVDwPNTn0JDzquHp1XRQbBCtTkLfcecvxYAkyTQN+8Nx0VxRFI9QR4BIlU/R
JFUz37asrs7JegIHb0ppBZIk2RikmO5RvYpazRh0EkSaWXN0i47fveduAr34
lLTpiIY/OxoizqXULqJDhQ/+TacpdCkhgnzLSWpYXztRM4i++NZDx3EJHYit
SH/zmeR1/d7H8b8Z9chDSChya4wS01uAUg3L22/DKRcoXvSvRajQhlsISNgF
qNKg8FyfVdmw0G8lFDcfVHUQdO35SGr+6AaFwe+4plCQuiaZIOuadFxuQdUr
bunqxZCxDEGEFXnZpi08nEzbkpswkkao4eLaNaE/JVvCuNJACMov3hl9t0u5
xLtyRkm2G6psZ+tNbnzHyBnE1TOh7OxAjHDZA3FkT8tbE+zejejIMlCoAbOU
FKq/t5CTvG58s6TkkPpaP2zylumRT39vqC5c1IsKhFCBYMqIzDRKBVdLZRGY
yrFTj1S+JaV0ri1nakgy5eBmwtgmL7oZEn3VpHv9Dj0FVSs5Yj5yLDbOWs3L
kWJoNFOubEeR04Mt6mSYuLKVBGPBAEqFJBrKlQKkTNZ1auYkrTBpIN/ISaE3
5mugnjmVeuAaCFKR1MUfdlMInfa2ARteHqz1u1wRDQB10LaKkgUqadK0GSgO
scmAPn/1paNkInyyOucC1GB4Y5kDYnsmtxJit3Emn8dkxyAZS3Tgr0wCGgDH
8sNSzTPLuZBRUC9Ciwz5aA90q7v6VmkQ/R0kGY5BR7y4vmMSA+n0aUkKrQNK
pQDzOaaFLShoNShn4SuYXbdnPKiwAjIBSuWd/jHlZAyfUiHRfHiM6xhyhe+j
5Lt+26r6EcuJfxpFvfallNOQC99T0VY2PexhkWxcWZ/rpfnpstQbuh8lomDg
4gyk7G8jAMjudpl61Qr9UCzQWCidbO0yTUUXOZxNQ3EgdjcnKj/IXK+Xf3Z5
QOCmcvB9sC4O9Nfzt290Bh+lKPonYSlYWjTFyUtOm2VxDp2PWyNWt5yyU5kx
HTNd1xbTHGcH+Px8H31emCskJj6/CuNRsQa0RE4F5cQfkrMLKz5J8eRUCgyS
vFD4nC8Nm6JGMdIgb98j5+Boy1SbucaS9MJVBosoWYZnKr4u/OHokRymH48e
Tcp1Uf8YlqA7DV49o1c5zgjr0QXdDrlbDjqCHeVYpOuK0W0vPtfTiBB8ufbh
sM5YFYn/PZqzDIWtJchUkwSU5vScVYhykSUGX8KZ2W8QjhVuWVBTgMOSw4Yy
HBesXS+ZdwII9ke9p+uqIlo2YNHPlUiO6tUEnqA+raWv4a/xShh9cCLxb8zW
fCbbe65KT1K1MAQfM+df66/W46N+620XrZlzgnmot5C9fplihXuqQ6WVGQX5
tXgcHwLOhOOfGjUlQKldYswZtBU8xLk8IjsBIKGj5z/SM2AHiJmSRIM5NPDV
fF5lVfgATfyWX1B0DtH4HReYxyinJhZz7XmkxNuRuI3JSbOu4jX4zNG7QT8N
q4fiHrvEe279YXP/EFrwrjQ6JKBxmiPW2cpq2ws3jdrFqUjevdKL9xNa+get
trTV4XJyQwZrLvgWhpoF9nl92cMnmHp0wCP86PXOKeeWc0spRErKleJAkzRH
k3ttgu3TEEMOP4qNSyitaljSrUxT+w+GFG/mwgRJGQlCXzq0PHUNxrH7oJJd
4o00FL3CBq1Oe6crERMCnKnLNr7+g/Mtc8g15wv39h8/Pjs/HiT7Dx8/PsEP
pgbxH8RqlcdoBwD7+3pKuXyqd+T117g5erpDwDobvA/glJMMrxw9gv+winTr
gxueVc2qbx5UHHSYTb/llH7DIXVzDs+UxqnyL7c8TzL/W58pbf+bz5V2EFQZ
8EsIHnonk8ZpWXddhPZBuBcv20uJJB7/hxdV2CojlxPIbSjFH2sRemw6M3ot
AdehkljZIxES/6OfTBYpliuG84+GGrXT+acq0HCcAAdakIwrtVLksITc2g0T
QgtF5xgeKkLTrrviVsh5yTHv0u0UG7EIytCl9g0ky1pkOn8VQ4g1GZXOs2xw
JMbtEpU5We5qUeZSL6Dv4dRXf3TrxIclI2Dl7zydpGnoVPXEot9SqVkarzQq
deOTa9BylK8W6djUFHTpATEgyoAcHrsB7ZyQ9Zq6giSnskmHxA2M0QACN+13
5Jl564SXhRDZL7MpRaHTWBIUsy6C2lfOza0uejJ98XTwLe+91JzzDK1qhvPq
w7fYEIjHaiRad6uIYFgeUfVQmtoopF5KtXiz7yixwq9fade6KFSLLvV+qX7B
E1yZy/IChNdfpvRVN7H3i6HvhNIo2/p9QwvEJiwkJ5ExbFBx5b3FBavKR4My
sTvY+ZKbR0etlDgUnNvcloNrHMd42dNFw0WeGd728OAigEFPupSFBGMoFQHQ
lDmCghxz4UKFDxn0UIingcR8QdDczFBxm9GxdaTjG+AMa8ioFrgWJj0Gmjbl
MJMqOACxjG0B+MXUNuuG7O/B/354eBcLiMSVJ6/RV9tRuLesqbmllOZNQcMt
cQZ0TLrSyuXNu6jJ7yRbzYl2LpmLih7bwCA0QfgJ0Sw2YcEJ3thBEKlScmSA
WrAjCvk79/83zUFIdvBVFCmrXZYTO9rzjVHKVemCKCXLwI6q1F9hMwjDSKbZ
VOuQUwQImcwWZnIBODTHkEWs75uX6dRMnSmt9BE/lvCULYtiDhXXF2E3qml0
DyPVMxivrQ9UmOWlNy0AswZ6hGdx4zPVgdGkyxFX7cXM7KoIJ84R/FdJKmK3
LiC4QQx0KwpbQ8yrOeacYOBMw7og6t2p1b4+oIr16FZoZ0BzIJQnMHx1CcWB
tvkmzJAIwAfPhhFJMI4VUT907sWh5lFfN2ZDk2NIsqEFjLrhHBKDFudLZ7pm
Jc/v/QRvJHEX6LXv2yC11C5o6mQGL+gOhEYdKa4yxQRHXTt8z8zB/fsa8uar
ju4f3MV5zKnea+UFyn5Hdai+z8WFAYzevqFUJg/8IX26IDRJl2y+iOtINrQV
yrMdHTRVFir25ZS88PYZr+RlrpqDq1BLF/246ja126l8I8US8cGcgmFhD0L7
cLiXmfXeGNrRhVlXZJvkmB30ncnx8VcEuXL7OEkp6+IzLog0SeAUTjFPJ1yq
kS6LiQ8O9KeI0F0Sge45EhbXQgFnVG9meUbp83pmEZ2QoTHGEi17KZHNrq5t
IxyavVdULv+6mGomxCyRUsy4A4yXy8nNlRXqO3EOkWPXUWYb8miokOqlfnqj
IxEkb9qxVIMAEbogmsN3CFB9j23Ks03274743qnD0YMIJ8lz3L3aTBJrffFK
F4ocBIO7iG19nTwd11noH7jwfJ0CGrFPQCylunJnIAxOXB7qVB4PK/9YZILw
8kOESUku7csHg8S3DcuUkKA3gSMMxJokZI2qdslYtBwdMekH3Xg6ZtglgjqC
XxJubyOvnjZWa9p6uwnJqWFIHkvl1vhxg5Ui0nAvHdESEqpIEREVJgE1Adlf
knVcQNgXOhmimgjeHG2vqBZeU+nLw8np1mKtWdU14XCfdtAZcs5hiM2ZuOrK
XGrIlQJGcfP6Xq1e4EWWVyHeprAEYZbIO/YRneBy84ULSieaFxSxIY5bsChC
9l26KYFvx8L04JfvosyWjouzvCeTQ77XRKGXabEWnsKVQ8ISwS6gdCZDuN62
Cu6+WnB6leo1FMxUXHmnjd4jFF6TxNm9clrJ1Q/H8uTNOfcA0yjJ/I1R6uu8
zlAM0+k5x8/P7BrDsiS8Lfi+LyaEy2q+jJFAk/hyoBqIJwkv2j8wVIyu1bPC
S0EgshjDdajQrlBt5LS4zknw2R5oBER3lgq2z3LzmVg6X+PHARhSYdbNunFd
o2yR+CrkfkB8cn72N2eCaLlI5c7mT6OeNqVzzyod1zpiF3KG1k+6DBho85VB
xUlT8lKpK66CXjQxFRFw+q5WGw+BwRXTJQh8eP9wjScdzyBtAN8WmTOuYyqg
woXqzpGxZBLazsTTh/O3m+UYI75diW5CIFxOc8P0dsSr+L7GOO2PM0z57kRp
6PLjGjp8LTMQ823XkIXEXlOYkmax9X24d/8fMNLoH/VkFaa5YVRLCMXQJC7V
J7SAFF0drdhZrSmqmawy+D7V/tNEKQkrEZVApMnorjy+p49HIDGJt91TmYAE
hBeRNorRBjNX+SY5cbVf+QYXX/q11/vZ5PmQ1fwPZ6eW3c8P9vGKVcKM8HJj
TGHZctNfrjSZzBoohsrG4N2CQB+4drtLLJZrsmEyfbJtyAz8vS4kVXLGfsH3
PCqCtarBekmd7p8Z83XLUsZacMlXv8US8UrZWESyPv8ZIVQ0Su22BidjGeNV
YOOMMon84mh7X9LinuDi8N5DSizSJkO//CEun25CBLh8vOFK8U/+mkQYM9jD
aHi/oeEl0jL7VG9F0IRP/+boEbf5cW/kuw5+33O/S4mNzm3GvEkWDviOCb70
kDad7vp0EQ12kTr2x5zW98QpzV69/PnliQYaMAyQKazcFR6pt1bFl0b4woUY
WIl8gVJaBFUcnY+XYFWvEPa4KCkM6BxLegA86DsNxZG/aC6ITrizH1EhZHFQ
0t74oqdynTQXTJYi9rXbQHezB1E8vmKKrE6SrkTtKH7RYQ8GMe4xQKg7r5BJ
pXyajM3+ZUI3ubtN8ZZdB7djEbMpKxkh6L3GdWU+BUpqmGlVPi1ji6VjUcZD
a56/WTM65IoGsPlnYfidhCWHWKeDka/e3wk8Eseiv2Kzz6i4hQLxnZM3nsJW
TTthROchgfIR6rR1nh4/zzhOHR57qjzEZUhcTmNtQQ5wqCZyHEPg1YAp8rXs
HLXuJfsteYk5KRVP8rS4kM7oInqg/gggfjI286wofNWGO/0mXMUf5YPe/DQq
o7KX0Bwxlvr4G3oqpUse4blCSeLHj0ePkK3hvxKt9+OnTxTN0sfnfTUzEGEj
dA7vA6bbf31mJ2mutNggeEnDmqQVXZOjST/EAjWOxd8mh3ujtvEoPyjcig/S
wO1B92Z1kEy0ccoVqf7qC3+PDZ1PrNmp5may9TePY9oqEo3okRVrEcdjFB24
aO+Og9hxCLvnwNSGrFlY/5lg2Zie0AQKNwwudsmssHt3swoZuRQN9Nb2eLNk
GnEGeTyso38Nu5IoDEuVl5kvEnsIL39NZ7XINxzQE1WqZuXmT9B3+45YOG54
MeZOH6/GxDtjVRVSjzNZhD9TUnQh5aW1d0KMNT5AaR2r/sSwYkTxojl0+U80
QCowjqhCelDcnnDmLUpx1FEUiOWuitGdiIdhvFChLwqYbAc20+XVdAO3o4EN
QU3QRmDhy4xLQUss80J1b+ZC/20UxnXhhUE/SxebK327O/C0bzaCXNczHg7O
1iduAQLGQCTwlkvJib/s44sy6KVGDVP7WOyWiilN8VvrpojhKnBPqjxabeQq
DxWGOayHeG06BraV/sVm+WVmQgVGMu2x2BAQwu0yXvvNbdJeR0tkWXqjcYyZ
S3LzRTlujiEQJ2lwgP2Q8nslJxis13tbYEDRlC2OMKTgZuNUS+X54NZJJyP4
KXw4e6VbcuHKnLSGPALW0ah3IlWQ9q7Z+V4omMIeatEENkSJMUtDumPTNS0r
8PEwr84k1VqXgbbvGrFRXQGSIMTJPgQNcfqiZ9NcovESy66DSo/erUA3klAM
L+AGN2htQN5ckvZ4rrfIP5XKVc4Aq/fLDyfRL5w+PiUX/xhGR5E1do+LjRvn
TWZF9UxRMf/AxJgSMVQzAbmWTQ2c9AKtTazEafEPtBjqROPpwD5m1t1X4Gy6
WXR734WrLEXVBIqCbwPKghtgQV3wJhAZCearpma+JQiToqToI9X8Qysm2XHJ
P1SZnOe0yFbRzaLK44tpoq6LOGR5i4eDtB23CHcxMmdWecMmjd66TIsta/hA
16DToNuWWHWpEINEFGQfnwbwEAWSRav2DXsEC05lKUtc85iyhQiMR0FBTJec
JPeKkwWP6mgH63ZR7gOy/zbWp93zNQZStbGgtQKO1AuOCQr6AzYqyVR4RG2Z
G8m2zfwdCukYcI2WwgqQUMBOTcQ7Pbj6A2k0dIODaCdyQgHLM7GKsLrBFR/c
7SqxkrKH3I3ynSRR305MAThcDmJ1iaOttxEUCnyJjBhKP/w9kUpJ6JifHr85
bh/xLC3S9vGOL7FH46KmPLN5zCZUIIs2BD8dsKnuw9mp2FfVEMg5HKgQ+ZJL
V5E1iisBfo5MGsxeP9DtGOgUmuOZBg7L1xWA3INLCfXm4BoT8SDW7PzmKELc
GWLfPGst8nougukbkj5hduR1o4bvqrIuQYtI3uG3N+R+xkBRmQnmQJ6kqwVI
n+dY34wnjPey3nKyILY1WBZsNHf8X5ya+KfQxPfg8PD+p6MwdOsbu3Wr6Sd3
RIqnu1mH+MZQh/zai7pNfuUu8Or0du+NGPPuv18pPQQg2Ihu/bXx721DX69r
00PsDIcmfMbQ0smKlcDpKvhVKSmFa3qf0A4xUbPL4bkeM74J/EGAZR9Pxjkf
pW7gPrz/QwO4H4qMHOBnxpbrCsBxSsefqirtQH+72mEIVmBzQzmyAUD96LcF
GP+d050E/smZlrTsXQ+E6wHVDbSbgRJN8J0BJkE2QsDLkLxFCHA7AG/v67ed
9sCAjPb5boCTwT4CeOO1EKyBwRnjPJqgZZILxww06rlJJAEwh5F+9TDTHQmB
eoYCjsEC9I7p9q6FVMez60Hb/ut5zhDA5+cXHmYxu4IHqwBAN5r3ergCMocg
mzye4LblZjrHzmyTF5JkS2vPs3/5GsWg5mPON/tGgL8Pojzo4Cpb4T3vXp7H
xcpfg+ST/FRWgB71v5zVHBqjaRnzqlF8nvJ1K1WeUfWk6gLffFIBD09epa9B
mF5Q9cRp8hreTk2evKjSGUhvKrGy735eoQGD6pfX0drYZ+bsS3qpht/9th3L
zWpVGawsYN20fkb3UJW8hI33ddKvFv7W1La01Rhfw9rEOEe7rndrNG7Fi6aS
+j1Cf1tpQSyECZ2kBWhQyct0USQvsjxflnxPw9+wL+j+SWWyellaul2LzMgk
XWnlKK6CQcEKxQVQADQavVjXqEpoIV9eu9i2nhoQk+qSriZj3jdgjcFleV5x
SV3MlqWqHqxFiZC0NMiAXQKEZtISvgyBjlzgLXI5q9uWNpY9vBLNgiZgqddE
5l0W8O16PmdPlt6ufeVLPcYLfJIC136yBjoDqops3U/rbA5YPujaSp75X0E0
Bxz4mbyDvC0mX/mQh257UgOtVHNwYTB3khNFUb7UaKPh4CXG3CTPphk8PGJs
tiJ++1CJyixLVJKlmhbrn77SuhBBmzwRfW0Kh6YezuHopnMphE9kA/jE8O4D
nvF1TR6iKe54igqLvxeU7xlvoC0ZWU+kTFF4a6W+T2ZPdxsy5vhjceykMhqx
NwjC9YgOuSJe1PfL4GqS12curVQvr8aQ1yiomT2+2PEaIzNdikh80filXiL3
zbt3/+bde4C7p6K/K4ltf8Ng924e7D6BisKyOkOHskLjlmg7z4y7wbyNyRJl
07jFng6BC/bU2HqF71ba6pu4WvuEQa37TYLOgvIiWnTEGqBPmICOrcioKlBn
Y1qIfk4/OiAzK4oxXt2haiLcWm97Sn4pV4/phqVffgNsDm+Gzb0e7Tj6VcyU
S9gOpWSKVEqc5GlF2u13ybm4etzxlwiCSpK4qIoSNJM72Lvj7X4nvDu4eW2H
uLan7eAOrnGY/HL5eP8X4A3ZUI4arsKX5flOsyiGrbIoHK1tozuJXB3/p6GJ
v1mFIoeuXAS9etcn1XqG7hz97pKCJNUgdJJJotANw9y+0AUdTL1aa1hJSgYy
B5vsYB2KQVREgJI/d10kPw5OiCzp77yvWBnqF1/zhujb+cvz3wDk/ZuBfEB5
I2goN3jA1qvkydN3w/17SQ7jrNO5ieaHxwlZxS/BrL5z9RJxSZycgrGrUpeQ
tlFrO1ERwkFQ+yfngkb4DqFMWWn+l9waSxoO3yLHZR/Xlia1fS+w9Hm8xrs3
b8M+eTOXGD2BYJAqTusJhl564uVPHBJSbydjHIOOjsgbcURXxInCim9j/WQ0
r/H9E5iwSxPyZEqyoVt7zaQr2uzXqC7TvV+IXnzOpi7wD7jsMivKvJxvXESd
5UAO5g0SBsNRxuHGCsK7+kzNjYfJ/T+EPxIq9qQAAA==

-->

</rfc>

