<?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.35 (Ruby 3.2.11) -->


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

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC3339 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml">
<!ENTITY RFC4648 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8259 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
<!ENTITY RFC8785 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
<!ENTITY RFC9457 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml">
]>


<rfc ipr="trust200902" docName="draft-solana-charge-00" category="info" submissionType="independent">
  <front>
    <title abbrev="Solana Charge">Solana Charge Intent for HTTP Payment Authentication</title>

    <author initials="L." surname="Galabru" fullname="Ludo Galabru">
      <organization>Solana Foundation</organization>
      <address>
        <email>ludo.galabru@solana.org</email>
      </address>
    </author>
    <author initials="I." surname="Gitter" fullname="Ilan Gitter">
      <organization>Solana Foundation</organization>
      <address>
        <email>ilan.gitter@solana.org</email>
      </address>
    </author>

    <date year="2026" month="April" day="17"/>

    
    
    

    <abstract>


<?line 72?>

<t>This document defines the "charge" intent for the "solana" payment
method within the Payment HTTP Authentication Scheme
<xref target="I-D.httpauth-payment"/>. The client constructs and signs a native SOL
or SPL token transfer on the Solana blockchain; the server verifies the
payment and presents the transaction signature as proof of payment.</t>

<t>Two credential types are supported: <spanx style="verb">type="transaction"</spanx> (default),
where the client sends the signed transaction to the server for
broadcast, and <spanx style="verb">type="signature"</spanx> (fallback), where the client
broadcasts the transaction itself and presents the on-chain transaction
signature for server verification.</t>



    </abstract>



  </front>

  <middle>


<?line 86?>

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

<t>HTTP Payment Authentication <xref target="I-D.httpauth-payment"/> defines a
challenge-response mechanism that gates access to resources behind
payments. This document registers the "charge" intent for the
"solana" payment method.</t>

<t>Solana is a high-throughput blockchain with sub-second finality
and low transaction fees <xref target="SOLANA-DOCS"/>. This specification
supports payments in both native SOL and SPL tokens (including
Token-2022 <xref target="SPL-TOKEN-2022"/>), making it suitable for
micropayment use cases where fast confirmation and low overhead
are important.</t>

<section anchor="pull-mode"><name>Pull Mode (Default)</name>

<t>The default flow, called "pull mode", uses <spanx style="verb">type="transaction"</spanx>
credentials. The client signs the transaction and the server
"pulls" it for broadcast to the Solana network:</t>

<figure><artwork><![CDATA[
   Client                     Server              Solana Network
      |                          |                        |
      |  (1) GET /resource       |                        |
      |----------------------->  |                        |
      |                          |                        |
      |  (2) 402 Payment Required|                        |
      |      (recipient, amount, |                        |
      |       feePayerKey?)      |                        |
      |<-----------------------  |                        |
      |                          |                        |
      |  (3) Build tx, set fee   |                        |
      |      payer, sign         |                        |
      |                          |                        |
      |  (4) Authorization:      |                        |
      |      Payment <credential>|                        |
      |      (signed tx bytes)   |                        |
      |----------------------->  |                        |
      |                          |  (5) Co-sign (if fee   |
      |                          |      payer) + send     |
      |                          |----------------------> |
      |                          |  (6) Confirmation      |
      |                          |<---------------------- |
      |                          |                        |
      |  (7) 200 OK + Receipt    |                        |
      |<-----------------------  |                        |
      |                          |                        |
]]></artwork></figure>

<t>In this model the server controls transaction broadcast, enabling
fee sponsorship (<xref target="fee-sponsorship"/>) and server-side retry logic.
When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the challenge includes <spanx style="verb">feePayerKey</spanx>
so the client sets the server as fee payer. The server co-signs
with its fee payer key before broadcasting.</t>

</section>
<section anchor="push-mode"><name>Push Mode (Fallback)</name>

<t>The fallback flow, called "push mode", uses <spanx style="verb">type="signature"</spanx>
credentials. The client "pushes" the transaction to the network
itself and presents the confirmed signature. The client
broadcasts the transaction itself and presents the confirmed
transaction signature:</t>

<figure><artwork><![CDATA[
   Client                     Server              Solana Network
      |                          |                        |
      |  (1) GET /resource       |                        |
      |----------------------->  |                        |
      |                          |                        |
      |  (2) 402 Payment Required|                        |
      |      (recipient, amount) |                        |
      |<-----------------------  |                        |
      |                          |                        |
      |  (3) Build & sign tx     |                        |
      |                          |                        |
      |  (4) Send transaction    |                        |
      |----------------------------------------------->   |
      |  (5) Confirmation        |                        |
      |<-----------------------------------------------   |
      |                          |                        |
      |  (6) Authorization:      |                        |
      |      Payment <credential>|                        |
      |      (tx signature)      |                        |
      |----------------------->  |                        |
      |                          |  (7) getTransaction    |
      |                          |----------------------> |
      |                          |  (8) Parsed tx data    |
      |                          |<---------------------- |
      |                          |                        |
      |  (9) 200 OK + Receipt    |                        |
      |<-----------------------  |                        |
      |                          |                        |
]]></artwork></figure>

<t>This flow is useful when the client cannot or does not wish to
delegate broadcast to the server. The server verifies the payment
by fetching and inspecting the on-chain transaction via RPC.</t>

</section>
<section anchor="relationship-to-the-charge-intent"><name>Relationship to the Charge Intent</name>

<t>This document inherits the shared request semantics of the
"charge" intent from <xref target="I-D.payment-intent-charge"/>. It defines
only the Solana-specific <spanx style="verb">methodDetails</spanx>, <spanx style="verb">payload</spanx>, and
verification procedures for the "solana" payment method.</t>

</section>
</section>
<section anchor="requirements-language"><name>Requirements Language</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="terminology"><name>Terminology</name>

<dl>
  <dt>Transaction Signature</dt>
  <dd>
    <t>A base58-encoded <xref target="BASE58"/> unique identifier for a Solana
transaction, produced by the first signer. Serves as both
the transaction identifier and proof of payment in this
specification.</t>
  </dd>
  <dt>SPL Token</dt>
  <dd>
    <t>A fungible token on Solana conforming to the SPL Token
program <xref target="SPL-TOKEN"/> or the Token-2022 program
<xref target="SPL-TOKEN-2022"/>.</t>
  </dd>
  <dt>Associated Token Account (ATA)</dt>
  <dd>
    <t>A deterministically derived token account for a given
owner and mint, per the Associated Token Program. The
address is a Program Derived Address (PDA) seeded by
the owner's public key, the token mint, and the token
program ID.</t>
  </dd>
  <dt>Lamports</dt>
  <dd>
    <t>The smallest unit of native SOL. 1 SOL = 1,000,000,000
lamports.</t>
  </dd>
  <dt>Base Units</dt>
  <dd>
    <t>The smallest transferable unit of an SPL token, determined
by the token's decimal precision. For example, USDC uses
6 decimals, so 1 USDC = 1,000,000 base units.</t>
  </dd>
  <dt>Fee Payer</dt>
  <dd>
    <t>An account that pays Solana transaction fees. When the server
acts as fee payer, it adds its signature to the transaction
before broadcasting, covering the transaction fee on behalf
of the client.</t>
  </dd>
  <dt>Pull Mode</dt>
  <dd>
    <t>The default settlement flow where the client signs the
transaction and the server broadcasts it
(<spanx style="verb">type="transaction"</spanx>). The server "pulls" the signed
transaction from the credential. Enables fee sponsorship
and server-side retry logic.</t>
  </dd>
  <dt>Push Mode</dt>
  <dd>
    <t>The fallback settlement flow where the client broadcasts
the transaction itself and presents the confirmed
signature (<spanx style="verb">type="signature"</spanx>). The client "pushes" the
transaction to the network directly. Cannot be used with
fee sponsorship.</t>
  </dd>
</dl>

</section>
<section anchor="intent-identifier"><name>Intent Identifier</name>

<t>The intent identifier for this specification is "charge".
It <bcp14>MUST</bcp14> be lowercase.</t>

</section>
<section anchor="intent-charge"><name>Intent: "charge"</name>

<t>The "charge" intent represents a one-time payment gating access
to a resource. The client builds and signs a Solana transfer
transaction, then either sends the signed transaction bytes to
the server for broadcast (<spanx style="verb">type="transaction"</spanx>) or broadcasts the
transaction itself and sends the on-chain signature
(<spanx style="verb">type="signature"</spanx>). The server verifies the transfer details
and returns a receipt.</t>

</section>
<section anchor="encoding"><name>Encoding Conventions</name>

<t>All JSON <xref target="RFC8259"/> objects carried in auth-params or HTTP
headers in this specification <bcp14>MUST</bcp14> be serialized using the JSON
Canonicalization Scheme (JCS) <xref target="RFC8785"/> before encoding. JCS
produces a deterministic byte sequence, which is required for
any digest or signature operations defined by the base spec
<xref target="I-D.httpauth-payment"/>.</t>

<t>The resulting bytes <bcp14>MUST</bcp14> then be encoded using base64url
<xref target="RFC4648"/> Section 5 without padding characters (<spanx style="verb">=</spanx>).
Implementations <bcp14>MUST NOT</bcp14> append <spanx style="verb">=</spanx> padding when encoding,
and <bcp14>MUST</bcp14> accept input with or without padding when decoding.</t>

<t>This encoding convention applies to: the <spanx style="verb">request</spanx> auth-param
in <spanx style="verb">WWW-Authenticate</spanx>, the credential token in <spanx style="verb">Authorization</spanx>,
and the receipt token in <spanx style="verb">Payment-Receipt</spanx>.</t>

</section>
<section anchor="request-schema"><name>Request Schema</name>

<section anchor="shared-fields"><name>Shared Fields</name>

<t>The <spanx style="verb">request</spanx> auth-param of the <spanx style="verb">WWW-Authenticate: Payment</spanx>
header contains a JCS-serialized, base64url-encoded JSON
object (see <xref target="encoding"/>). The following shared fields are
included in that object:</t>

<dl>
  <dt>amount</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The payment amount in base units, encoded as a
decimal string. For native SOL, the amount is in lamports.
For SPL tokens, the amount is in the token's smallest unit
(e.g., for USDC with 6 decimals, "1000000" represents
1 USDC). The value <bcp14>MUST</bcp14> be a positive integer that fits
in a 64-bit unsigned integer (max 18,446,744,073,709,551,615).</t>
  </dd>
  <dt>currency</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. For native SOL, <bcp14>MUST</bcp14> be the lowercase
string <spanx style="verb">"sol"</spanx>. For SPL tokens, <bcp14>MUST</bcp14> be the base58-encoded
mint address (e.g.,
<spanx style="verb">"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"</spanx>
for USDC). The mint address uniquely identifies the token
and is used by the client to construct the transfer
instruction. <bcp14>MUST NOT</bcp14> exceed 128 characters.</t>
  </dd>
  <dt>description</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A human-readable memo describing the resource or
service being paid for. <bcp14>MUST NOT</bcp14> exceed 256 characters.</t>
  </dd>
  <dt>recipient</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The base58-encoded public key of the account
receiving the payment. For native SOL transfers, this is the
destination account. For SPL token transfers, this is the
owner of the destination associated token account, not the
ATA address itself.</t>
  </dd>
  <dt>externalId</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Merchant's reference (e.g., order ID, invoice
number), per <xref target="I-D.payment-intent-charge"/>. May be used
for reconciliation or idempotency. <bcp14>MUST NOT</bcp14> exceed 566
bytes (Solana Memo Program limit). When present, clients
<bcp14>SHOULD</bcp14> include this value as a Memo Program instruction
in the transaction, making it visible on-chain for
auditing and reconciliation. Servers <bcp14>MAY</bcp14> verify the memo
matches the <spanx style="verb">externalId</spanx> from the challenge.</t>
  </dd>
</dl>

</section>
<section anchor="method-details"><name>Method Details</name>

<t>The following fields are nested under <spanx style="verb">methodDetails</spanx> in
the request JSON:</t>

<dl>
  <dt>network</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Identifies which Solana cluster the payment
should be made on. <bcp14>MUST</bcp14> be one of "mainnet",
"devnet", or "localnet". Defaults to "mainnet"
if omitted. Clients <bcp14>MUST</bcp14> reject challenges whose
network does not match their configured cluster.</t>
  </dd>
  <dt>decimals</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14>. The number of decimal places
for the token (0–9). <bcp14>MUST</bcp14> be present when <spanx style="verb">currency</spanx>
is a mint address; <bcp14>MUST</bcp14> be absent when <spanx style="verb">currency</spanx> is
<spanx style="verb">"sol"</spanx>. Used by the client to construct a
<spanx style="verb">TransferChecked</spanx> instruction.</t>
  </dd>
  <dt>tokenProgram</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. The base58-encoded program ID of the token
program governing the token. <bcp14>MUST</bcp14> be either the
Token Program
(<spanx style="verb">TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA</spanx>) or
the Token-2022 Program
(<spanx style="verb">TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb</spanx>).
If omitted, clients <bcp14>MUST</bcp14> determine the correct token
program by fetching the mint account from the network
and inspecting its owner program. If that lookup
fails, returns an unexpected owner, or cannot be
verified, clients <bcp14>MUST</bcp14> reject the challenge rather
than falling back to the Token Program. Servers
<bcp14>SHOULD</bcp14> include this field as a hint to avoid the
extra RPC lookup. <bcp14>MUST NOT</bcp14> be present when
<spanx style="verb">currency</spanx> is <spanx style="verb">"sol"</spanx>.</t>
  </dd>
  <dt>feePayer</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A boolean indicating whether the server will
pay transaction fees on behalf of the client. Defaults
to <spanx style="verb">false</spanx> if omitted. When <spanx style="verb">true</spanx>, the <spanx style="verb">feePayerKey</spanx>
field <bcp14>MUST</bcp14> also be present. See <xref target="fee-sponsorship"/>.</t>
  </dd>
  <dt>feePayerKey</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14>. The base58-encoded public key
of the server's fee payer account. <bcp14>MUST</bcp14> be present when
<spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>; <bcp14>MUST</bcp14> be absent when <spanx style="verb">feePayer</spanx> is
<spanx style="verb">false</spanx> or omitted. The client uses this key as the
transaction fee payer when constructing the transaction.</t>
  </dd>
  <dt>splits</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. An array of at most 8 additional payment
splits. Each entry is a JSON object with the following
fields:
</t>

    <t><list style="symbols">
      <t><spanx style="verb">recipient</spanx> (<bcp14>REQUIRED</bcp14>): Base58-encoded public key of
the split recipient.</t>
      <t><spanx style="verb">amount</spanx> (<bcp14>REQUIRED</bcp14>): Amount in the same base units
and asset as the primary <spanx style="verb">amount</spanx>.</t>
      <t><spanx style="verb">memo</spanx> (<bcp14>OPTIONAL</bcp14>): Human-readable label for this
split (e.g., "platform fee", "referral"). <bcp14>MUST NOT</bcp14>
exceed 566 bytes (Solana Memo Program limit).</t>
    </list></t>

    <t>When present, the client <bcp14>MUST</bcp14> include a transfer
instruction for each split in addition to the primary
transfer to <spanx style="verb">recipient</spanx>. All splits use the same asset
as the primary payment (native SOL or the token from <spanx style="verb">currency</spanx>).</t>

    <t>The top-level <spanx style="verb">amount</spanx> is the total the client pays.
The sum of all split amounts <bcp14>MUST NOT</bcp14> exceed <spanx style="verb">amount</spanx>.
The primary <spanx style="verb">recipient</spanx> receives <spanx style="verb">amount</spanx> minus the
sum of all split amounts; this remainder <bcp14>MUST</bcp14> be
greater than zero. Servers <bcp14>MUST</bcp14> reject challenges
where splits consume the entire amount. Servers <bcp14>MUST</bcp14>
verify each split transfer on-chain during credential
verification. If the same recipient appears more than
once in <spanx style="verb">splits</spanx>, each occurrence is a distinct
payment leg and <bcp14>MUST</bcp14> be verified separately; servers
<bcp14>MUST NOT</bcp14> implicitly aggregate such entries.</t>

    <t>This mechanism is a Solana-specific extension to the
base <spanx style="verb">charge</spanx> intent. It can be used for fee payer cost
recovery, platform fees, revenue sharing, or referral
commissions.</t>
  </dd>
  <dt>recentBlockhash</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A base58-encoded recent blockhash for the
client to use when constructing the transaction. When
provided, clients <bcp14>SHOULD</bcp14> use this blockhash instead of
fetching one from an RPC node. This avoids an extra
RPC round-trip and ensures the server can verify
blockhash freshness. This field is advisory and
short-lived; it <bcp14>MUST NOT</bcp14> be assumed to remain valid for
the full lifetime of the payment challenge. If omitted,
clients <bcp14>MUST</bcp14> fetch a recent blockhash themselves.</t>
  </dd>
</dl>

<section anchor="native-sol-example"><name>Native SOL Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "sol",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Weather API access",
  "methodDetails": {
    "network": "mainnet"
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 0.01 SOL (10,000,000 lamports).</t>

</section>
<section anchor="spl-token-example"><name>SPL Token Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Premium API call",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 1 USDC (1,000,000 base units).</t>

</section>
<section anchor="fee-sponsorship-example"><name>Fee Sponsorship Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "sol",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Weather API access",
  "methodDetails": {
    "network": "mainnet",
    "feePayer": true,
    "feePayerKey": "9aE3Fg7HjKLmNpQr5TuVwXyZ2AbCdEf8GhIjKlMnOp1R"
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 0.01 SOL where the server pays
transaction fees.</t>

</section>
<section anchor="payment-splits-example"><name>Payment Splits Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1050000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Marketplace purchase",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "splits": [
      { "recipient": "3pF8Kg2aHbNvJkLMwEqR7YtDxZ5sGhJn4UV6mWcXrT9A", "amount": "50000", "memo": "platform fee" }
    ]
  }
}
]]></sourcecode></figure>

<t>This requests a total payment of 1.05 USDC. The platform
receives 0.05 USDC and the primary recipient (seller)
receives 1.00 USDC.</t>

</section>
</section>
</section>
<section anchor="credential-schema"><name>Credential Schema</name>

<t>The <spanx style="verb">Authorization</spanx> header carries a single base64url-encoded
JSON token (no auth-params). The decoded object contains the
following top-level fields:</t>

<dl>
  <dt>challenge</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. An echo of the challenge auth-params from the
<spanx style="verb">WWW-Authenticate</spanx> header: <spanx style="verb">id</spanx>, <spanx style="verb">realm</spanx>, <spanx style="verb">method</spanx>,
<spanx style="verb">intent</spanx>, <spanx style="verb">request</spanx>, and (if present) <spanx style="verb">expires</spanx>. This
binds the credential to the exact challenge that was
issued.</t>
  </dd>
  <dt>source</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A payer identifier string, as defined by
<xref target="I-D.httpauth-payment"/>. Solana implementations <bcp14>MAY</bcp14>
use the payer's base58-encoded public key or a DID.</t>
  </dd>
  <dt>payload</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. A JSON object containing the Solana-specific
credential fields. The <spanx style="verb">type</spanx> field determines which
additional fields are present. Two payload types are
defined: <spanx style="verb">"transaction"</spanx> (default) and <spanx style="verb">"signature"</spanx>
(fallback).</t>
  </dd>
</dl>

<section anchor="transaction-payload"><name>Transaction Payload — Pull Mode</name>

<t>In pull mode (<spanx style="verb">type="transaction"</spanx>), the client sends the
signed transaction bytes to the server for broadcast. The
<spanx style="verb">transaction</spanx> field contains the base64-encoded serialized
signed transaction.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"transaction"</spanx></c>
      <c><spanx style="verb">transaction</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base64-encoded serialized signed transaction bytes (max 1232 bytes decoded)</c>
</texttable>

<t>The transaction <bcp14>MUST</bcp14> be a valid Solana versioned transaction
that does not exceed the 1232-byte transaction size limit.
containing the transfer instruction(s) matching the challenge
parameters. The client <bcp14>MUST</bcp14> sign the transaction with the
transfer authority key. When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or absent,
the client <bcp14>MUST</bcp14> also be the fee payer and the transaction <bcp14>MUST</bcp14>
be fully signed. When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the transaction
<bcp14>MUST</bcp14> set the server's <spanx style="verb">feePayerKey</spanx> as fee payer, and the
client signs only as transfer authority; the server adds the
fee payer signature before broadcasting (see
<xref target="fee-sponsorship"/>).</t>

<t>Example (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "solana",
    "intent": "charge",
    "request": "eyJ...",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "transaction",
    "transaction": "AQAAAA...base64-encoded-signed-tx..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="signature-payload"><name>Signature Payload — Push Mode</name>

<t>In push mode (<spanx style="verb">type="signature"</spanx>), the client has already
broadcast the transaction to the Solana network. The
<spanx style="verb">signature</spanx> field contains the base58-encoded transaction
signature for the server to verify on-chain.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"signature"</spanx></c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58-encoded Solana transaction signature</c>
</texttable>

<t>Example (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "solana",
    "intent": "charge",
    "request": "eyJ...",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "signature",
    "signature": "5UfDuX7hXbPjGUpTmt9PHRLsNGJe4dEny..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="signature-limitations"><name>Limitations of Push Mode</name>

<t>The <spanx style="verb">type="signature"</spanx> credential has the following limitations:</t>

<t><list style="symbols">
  <t><bcp14>MUST NOT</bcp14> be used when <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx> in the challenge
request. Since the client has already broadcast the
transaction, the server cannot add its fee payer signature.
Servers <bcp14>MUST</bcp14> reject <spanx style="verb">type="signature"</spanx> credentials when
the challenge specifies <spanx style="verb">feePayer: true</spanx>.</t>
  <t>The server cannot modify or enhance the transaction (e.g.,
add priority fees, adjust compute units, or retry with
different parameters).</t>
</list></t>

</section>
</section>
<section anchor="fee-sponsorship"><name>Fee Sponsorship</name>

<t>When a challenge includes <spanx style="verb">feePayer: true</spanx> in <spanx style="verb">methodDetails</spanx>,
the server commits to paying Solana transaction fees on behalf
of the client. This section describes the fee sponsorship
mechanism.</t>

<section anchor="server-paid-fees"><name>Server-Paid Fees</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>:</t>

<t><list style="numbers" type="1">
  <t><strong>Client constructs transaction</strong>: The client builds the
transfer transaction with the server's <spanx style="verb">feePayerKey</spanx> set
as the transaction fee payer. The client's account is the
transfer authority but NOT the fee payer.</t>
  <t><strong>Client partially signs</strong>: The client signs the transaction
with only its own key (the transfer authority). The fee
payer signature slot remains empty.</t>
  <t><strong>Client sends credential</strong>: The client sends the partially
signed transaction as a <spanx style="verb">type="transaction"</spanx> credential.</t>
  <t><strong>Server adds fee payer signature</strong>: The server verifies the
transaction contents, then signs with the fee payer key to
complete the transaction.</t>
  <t><strong>Server broadcasts</strong>: The fully signed transaction
(containing both the client's transfer authority signature
and the server's fee payer signature) is broadcast to the
Solana network.</t>
</list></t>

</section>
<section anchor="client-paid-fees"><name>Client-Paid Fees</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted, the client <bcp14>MUST</bcp14> set
itself as the fee payer and fully sign the transaction. The
server broadcasts the transaction as-is without adding any
signatures.</t>

</section>
<section anchor="server-requirements"><name>Server Requirements</name>

<t>When acting as fee payer, servers:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> maintain sufficient SOL balance in the fee payer
account to cover transaction fees</t>
  <t><bcp14>MUST</bcp14> verify the transaction contents before signing
(see <xref target="transaction-verification"/>)</t>
  <t><bcp14>SHOULD</bcp14> implement rate limiting to mitigate fee
exhaustion attacks (see <xref target="fee-payer-risks"/>)</t>
</list></t>

</section>
<section anchor="client-requirements"><name>Client Requirements</name>

<t><list style="symbols">
  <t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>: clients <bcp14>MUST</bcp14> set <spanx style="verb">feePayerKey</spanx>
from <spanx style="verb">methodDetails</spanx> as the transaction fee payer and <bcp14>MUST</bcp14>
sign only with the transfer authority key. Clients <bcp14>MUST</bcp14>
use <spanx style="verb">type="transaction"</spanx> credentials.</t>
  <t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted: clients <bcp14>MUST</bcp14> set
themselves as the fee payer and fully sign the transaction.
Clients <bcp14>MAY</bcp14> use either <spanx style="verb">type="transaction"</spanx> or
<spanx style="verb">type="signature"</spanx> credentials.</t>
</list></t>

</section>
</section>
<section anchor="verification"><name>Verification Procedure</name>

<t>Upon receiving a request with a credential, the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Decode the base64url credential and parse the JSON.</t>
  <t>Verify that <spanx style="verb">payload.type</spanx> is present and is either
<spanx style="verb">"transaction"</spanx> or <spanx style="verb">"signature"</spanx>.</t>
  <t>Look up the stored challenge using
<spanx style="verb">credential.challenge.id</spanx>. If no matching challenge
is found, reject the request.</t>
  <t>Verify that all fields in <spanx style="verb">credential.challenge</spanx>
exactly match the stored challenge auth-params.</t>
  <t>If <spanx style="verb">payload.type</spanx> is <spanx style="verb">"signature"</spanx> and the challenge
specifies <spanx style="verb">feePayer: true</spanx>, reject the request (see
<xref target="signature-limitations"/>).</t>
  <t>Proceed with type-specific verification:  <list style="symbols">
      <t>For <spanx style="verb">type="transaction"</spanx>: see <xref target="transaction-verification"/>.</t>
      <t>For <spanx style="verb">type="signature"</spanx>: see <xref target="signature-verification"/>.</t>
    </list></t>
</list></t>

<section anchor="transaction-verification"><name>Pull Mode Verification</name>

<t>For credentials with <spanx style="verb">type="transaction"</spanx>:</t>

<t><list style="numbers" type="1">
  <t>Decode the base64 <spanx style="verb">payload.transaction</spanx> value.</t>
  <t>Deserialize the transaction and verify that it
structurally matches the challenge request:
  <list style="symbols">
      <t>the fee payer matches the challenge policy;</t>
      <t>the transfer authority is signed by the client;</t>
      <t>the transaction contains only expected transfer,
ATA-creation, memo, and compute-budget instructions;</t>
      <t>the payment semantics match the challenge request,
as described in <xref target="sol-verification"/> or
<xref target="spl-verification"/>.</t>
    </list></t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, add the server's fee payer
signature using the <spanx style="verb">feePayerKey</spanx> and re-serialize.
The transaction <bcp14>MUST</bcp14> have the server's <spanx style="verb">feePayerKey</spanx>
set as the fee payer account.</t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, simulate the transaction
using the <spanx style="verb">simulateTransaction</spanx> RPC method. The
server <bcp14>MUST</bcp14> reject the credential if simulation
fails. If <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted, the
server <bcp14>SHOULD</bcp14> simulate the transaction before
broadcast and <bcp14>SHOULD</bcp14> reject the credential if
simulation indicates the transaction will fail.
This catches invalid transactions without spending
fees, which is especially important in fee payer
mode (see <xref target="fee-payer-risks"/>).</t>
  <t>Broadcast the transaction to the Solana network using
<spanx style="verb">sendTransaction</spanx>.</t>
  <t>Wait for confirmation at the required commitment level.</t>
  <t>Fetch the confirmed transaction using <spanx style="verb">getTransaction</spanx>
with <spanx style="verb">jsonParsed</spanx> encoding and verify the transfer
details still match the challenge request, as described in
<xref target="sol-verification"/> or <xref target="spl-verification"/>.</t>
  <t>Record the transaction signature as consumed to
prevent replay (see <xref target="replay-protection"/>).</t>
  <t>Return the resource with a Payment-Receipt header.</t>
</list></t>

</section>
<section anchor="signature-verification"><name>Push Mode Verification</name>

<t>For credentials with <spanx style="verb">type="signature"</spanx>:</t>

<t><list style="numbers" type="1">
  <t>Verify that <spanx style="verb">payload.signature</spanx> is present and is a
valid base58-encoded string.</t>
  <t>Verify the transaction signature has not been
previously consumed (see <xref target="replay-protection"/>).</t>
  <t>Fetch the transaction from the Solana network using
the RPC <spanx style="verb">getTransaction</spanx> method with <spanx style="verb">jsonParsed</spanx>
encoding and the <spanx style="verb">confirmed</spanx> commitment level.</t>
  <t>Verify the transaction was successful (no error in
the transaction metadata).</t>
  <t>Verify the transfer details match the challenge
request, as described in <xref target="sol-verification"/> or
<xref target="spl-verification"/>.</t>
  <t>Mark the transaction signature as consumed to
prevent replay.</t>
  <t>Return the resource with a Payment-Receipt header.</t>
</list></t>

<t>Note: both credential types reuse the same on-chain
transfer verification logic defined in
<xref target="sol-verification"/> and <xref target="spl-verification"/>.</t>

</section>
<section anchor="sol-verification"><name>Native SOL Verification</name>

<t>For native SOL payments (<spanx style="verb">currency</spanx> is <spanx style="verb">"sol"</spanx>),
the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Compute the primary payment amount as the top-level
<spanx style="verb">amount</spanx> minus the sum of all <spanx style="verb">splits</spanx>, if any.</t>
  <t>Locate a System Program <spanx style="verb">transfer</spanx> instruction in the
transaction's parsed instructions whose <spanx style="verb">destination</spanx>
matches the top-level <spanx style="verb">recipient</spanx> and whose <spanx style="verb">lamports</spanx>
field matches that primary payment amount.</t>
  <t>For each split in <spanx style="verb">splits</spanx>, if any, locate an
additional System Program <spanx style="verb">transfer</spanx> instruction whose
<spanx style="verb">destination</spanx> and <spanx style="verb">lamports</spanx> fields match that split.  <vspace blankLines='1'/>
Each required payment leg <bcp14>MUST</bcp14> be matched to a
distinct transfer instruction. A single transfer
instruction <bcp14>MUST NOT</bcp14> satisfy more than one required
payment leg, even if multiple legs share the same
recipient.</t>
</list></t>

<t>If any required transfer instruction is missing, the
server <bcp14>MUST</bcp14> reject the credential.</t>

</section>
<section anchor="spl-verification"><name>SPL Token Verification</name>

<t>For SPL token payments (<spanx style="verb">currency</spanx> is a mint address,
not <spanx style="verb">"sol"</spanx>), the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Compute the primary payment amount as the top-level
<spanx style="verb">amount</spanx> minus the sum of all <spanx style="verb">splits</spanx>, if any.</t>
  <t>Locate a <spanx style="verb">transferChecked</spanx> instruction from the
appropriate token program (Token Program or
Token-2022) in the transaction's parsed instructions
whose <spanx style="verb">mint</spanx> field matches the top-level <spanx style="verb">currency</spanx>
field from the challenge request.</t>
  <t>Derive the expected destination associated token
account for the top-level <spanx style="verb">recipient</spanx> from the
<spanx style="verb">recipient</spanx>, <spanx style="verb">currency</spanx>, and <spanx style="verb">tokenProgram</spanx> in the
challenge request. Verify that at least one matching
<spanx style="verb">transferChecked</spanx> instruction uses that derived ATA
as <spanx style="verb">destination</spanx> and has <spanx style="verb">tokenAmount.amount</spanx> equal
to the primary payment amount.</t>
  <t>For each split in <spanx style="verb">splits</spanx>, if any, derive the
expected destination ATA for that split recipient and
verify that at least one additional <spanx style="verb">transferChecked</spanx>
instruction uses that ATA as <spanx style="verb">destination</spanx> and has
<spanx style="verb">tokenAmount.amount</spanx> equal to the split amount.  <vspace blankLines='1'/>
Each required payment leg <bcp14>MUST</bcp14> be matched to a
distinct <spanx style="verb">transferChecked</spanx> instruction. A single
instruction <bcp14>MUST NOT</bcp14> satisfy more than one required
payment leg, even if multiple legs resolve to the
same destination ATA.</t>
</list></t>

<t>If any required <spanx style="verb">transferChecked</spanx> instruction is missing,
the server <bcp14>MUST</bcp14> reject the credential.</t>

</section>
<section anchor="replay-protection"><name>Replay Protection</name>

<t>Servers <bcp14>MUST</bcp14> maintain a set of consumed transaction
signatures. Before accepting a credential, the server
<bcp14>MUST</bcp14> check whether the signature has already been
consumed. After successful verification, the server
<bcp14>MUST</bcp14> atomically mark the signature as consumed.</t>

<t>The transaction signature is globally unique on the
Solana network, making it a natural replay prevention
token. A signature that has been consumed <bcp14>MUST NOT</bcp14> be
accepted again, even if presented with a different
challenge ID.</t>

<t>For <spanx style="verb">type="transaction"</spanx> credentials, the transaction
signature is derived after broadcast. For
<spanx style="verb">type="signature"</spanx> credentials, the signature is
provided directly by the client.</t>

</section>
</section>
<section anchor="settlement-procedure"><name>Settlement Procedure</name>

<t>Two settlement flows are supported, corresponding to
the two credential types.</t>

<section anchor="pull-mode-settlement-typetransaction"><name>Pull Mode Settlement (type="transaction")</name>

<t>For <spanx style="verb">type="transaction"</spanx> credentials, the client signs
the transaction and sends it to the server. The server
optionally adds a fee payer signature and broadcasts:</t>

<figure><artwork><![CDATA[
   Client                        Server                   Solana Network
      |                             |                           |
      |  (1) Authorization:         |                           |
      |      Payment <credential>   |                           |
      |      (signed tx bytes)      |                           |
      |-------------------------->  |                           |
      |                             |                           |
      |                             |  (2) If feePayer: true,   |
      |                             |      co-sign as fee payer |
      |                             |                           |
      |                             |  (3) simulateTransaction  |
      |                             |------------------------>  |
      |                             |  (4) Simulation OK        |
      |                             |<------------------------  |
      |                             |                           |
      |                             |  (5) sendTransaction      |
      |                             |------------------------>  |
      |                             |  (6) Confirmation         |
      |                             |<------------------------  |
      |                             |                           |
      |                             |  (7) getTransaction       |
      |                             |      (verify transfer)    |
      |                             |------------------------>  |
      |                             |  (8) Parsed tx data       |
      |                             |<------------------------  |
      |                             |                           |
      |  (9) 200 OK + Receipt       |                           |
      |<--------------------------  |                           |
      |                             |                           |
]]></artwork></figure>

<t><list style="numbers" type="1">
  <t>Client submits credential containing signed transaction
bytes.</t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the server co-signs with its
fee payer key.</t>
  <t>Server simulates the transaction to catch failures
without spending fees.</t>
  <t>Server broadcasts the transaction to Solana.</t>
  <t>Transaction reaches the required commitment level.</t>
  <t>Server fetches the confirmed transaction and verifies
the transfer details match the challenge request.</t>
  <t>Server records the signature as consumed and returns
the resource with a Payment-Receipt header whose
<spanx style="verb">reference</spanx> field is the transaction signature.</t>
</list></t>

</section>
<section anchor="push-mode-settlement-typesignature"><name>Push Mode Settlement (type="signature")</name>

<t>For <spanx style="verb">type="signature"</spanx> credentials, the client broadcasts
the transaction itself and presents the confirmed signature:</t>

<figure><artwork><![CDATA[
   Client                     Server              Solana Network
      |                          |                        |
      |  (1) Build & sign tx     |                        |
      |                          |                        |
      |  (2) sendTransaction     |                        |
      |----------------------------------------------->   |
      |                          |                        |
      |  (3) Poll confirmation   |                        |
      |----------------------------------------------->   |
      |  (4) Confirmed           |                        |
      |<-----------------------------------------------   |
      |                          |                        |
      |  (5) Authorization:      |                        |
      |      Payment <credential>|                        |
      |      (tx signature)      |                        |
      |----------------------->  |                        |
      |                          |  (6) getTransaction    |
      |                          |----------------------> |
      |                          |  (7) Verified          |
      |                          |<---------------------- |
      |                          |                        |
      |  (8) 200 OK + Receipt    |                        |
      |<-----------------------  |                        |
]]></artwork></figure>

<t><list style="numbers" type="1">
  <t>Client builds a transfer transaction and signs it.</t>
  <t>Client sends the transaction to the Solana network.</t>
  <t>Client polls for confirmation status.</t>
  <t>Transaction reaches <spanx style="verb">confirmed</spanx> commitment level.</t>
  <t>Client presents the transaction signature as the
credential.</t>
  <t>Server fetches the transaction via RPC and verifies
transfer details.</t>
  <t>Server confirms the payment matches the challenge.</t>
  <t>Server returns the resource with a Payment-Receipt.</t>
</list></t>

</section>
<section anchor="client-transaction-construction"><name>Client Transaction Construction</name>

<section anchor="native-sol"><name>Native SOL</name>

<t>The client <bcp14>MUST</bcp14> construct a transaction containing a
System Program <spanx style="verb">transfer</spanx> instruction with:</t>

<t><list style="symbols">
  <t><spanx style="verb">source</spanx>: the client's signing account</t>
  <t><spanx style="verb">destination</spanx>: the <spanx style="verb">recipient</spanx> from the challenge</t>
  <t><spanx style="verb">lamports</spanx>: the <spanx style="verb">amount</spanx> from the challenge</t>
</list></t>

</section>
<section anchor="spl-tokens"><name>SPL Tokens</name>

<t>The client <bcp14>MUST</bcp14> construct a transaction containing:</t>

<t><list style="numbers" type="1">
  <t>An idempotent Associated Token Account creation
instruction for the recipient's ATA, ensuring
payment succeeds even if the recipient has never
held the token. The payer covers the rent-exempt
minimum (~0.002 SOL) if the account does not exist.</t>
  <t>A <spanx style="verb">transferChecked</spanx> instruction on the appropriate
token program with:  <list style="symbols">
      <t><spanx style="verb">source</spanx>: the client's associated token account</t>
      <t><spanx style="verb">mint</spanx>: the <spanx style="verb">currency</spanx> field</t>
      <t><spanx style="verb">destination</spanx>: the recipient's derived ATA</t>
      <t><spanx style="verb">authority</spanx>: the client's signing account</t>
      <t><spanx style="verb">amount</spanx>: the <spanx style="verb">amount</spanx> from the challenge</t>
      <t><spanx style="verb">decimals</spanx>: the <spanx style="verb">decimals</spanx> from <spanx style="verb">methodDetails</spanx></t>
    </list></t>
</list></t>

</section>
<section anchor="fee-payer-configuration"><name>Fee Payer Configuration</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx> in the challenge:</t>

<t><list style="symbols">
  <t>The client <bcp14>MUST</bcp14> set the server's <spanx style="verb">feePayerKey</spanx> as the
transaction fee payer.</t>
  <t>The client <bcp14>MUST</bcp14> sign the transaction only with its own
key (transfer authority).</t>
  <t>The fee payer signature slot <bcp14>MUST</bcp14> be left empty for the
server to fill.</t>
</list></t>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or absent:</t>

<t><list style="symbols">
  <t>The client <bcp14>MUST</bcp14> set itself as the transaction fee payer.</t>
  <t>The client <bcp14>MUST</bcp14> fully sign the transaction.</t>
</list></t>

<t>Clients <bcp14>SHOULD</bcp14> set a compute unit limit and priority
fee appropriate for current network conditions.</t>

</section>
</section>
<section anchor="confirmation-requirements"><name>Confirmation Requirements</name>

<t>For <spanx style="verb">type="signature"</spanx> credentials, clients <bcp14>MUST</bcp14> wait for
at least the <spanx style="verb">confirmed</spanx> commitment level before presenting
the credential. Servers <bcp14>MUST</bcp14> fetch the transaction with at
least <spanx style="verb">confirmed</spanx> commitment. Servers <bcp14>MAY</bcp14> require
<spanx style="verb">finalized</spanx> commitment for high-value transactions.</t>

<t>For <spanx style="verb">type="transaction"</spanx> credentials, the server controls
the broadcast and confirmation process. Servers <bcp14>MUST</bcp14> wait
for at least <spanx style="verb">confirmed</spanx> commitment before returning the
receipt.</t>

</section>
<section anchor="finality"><name>Finality</name>

<t>Solana provides two commitment levels relevant to
payment verification:</t>

<t><list style="symbols">
  <t><spanx style="verb">confirmed</spanx>: optimistic confirmation from a
supermajority of validators (~400ms). Sufficient
for most payment use cases.</t>
  <t><spanx style="verb">finalized</spanx>: deterministic finality after ~31 slots
(~12 seconds). Required for high-value transactions
where rollback risk is unacceptable.</t>
</list></t>

<t>In theory, a <spanx style="verb">confirmed</spanx> transaction could be rolled
back if validators shift consensus to a competing fork
that excludes the confirmed block. In practice, this
has never occurred on Solana mainnet. The <spanx style="verb">confirmed</spanx>
level is <bcp14>RECOMMENDED</bcp14> as the default for payment
verification to minimize latency.</t>

</section>
<section anchor="receipt-generation"><name>Receipt Generation</name>

<t>Upon successful verification, the server <bcp14>MUST</bcp14> include
a <spanx style="verb">Payment-Receipt</spanx> header in the 200 response.</t>

<t>The receipt payload for Solana charge:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">method</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"solana"</spanx></c>
      <c><spanx style="verb">challengeId</spanx></c>
      <c>string</c>
      <c>The challenge <spanx style="verb">id</spanx> from <spanx style="verb">WWW-Authenticate</spanx></c>
      <c><spanx style="verb">reference</spanx></c>
      <c>string</c>
      <c>The transaction signature (base58-encoded)</c>
      <c><spanx style="verb">status</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"success"</spanx></c>
      <c><spanx style="verb">timestamp</spanx></c>
      <c>string</c>
      <c><xref target="RFC3339"/> verification time</c>
</texttable>

<t>Example (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "solana",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "5UfDuX7hXbPjGUpTmt9PHRLsNGJe4dEny...",
  "status": "success",
  "timestamp": "2026-03-10T21:00:00Z"
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="error-responses"><name>Error Responses</name>

<t>When rejecting a credential, the server <bcp14>MUST</bcp14> return HTTP
402 (Payment Required) with a fresh
<spanx style="verb">WWW-Authenticate: Payment</spanx> challenge per
<xref target="I-D.httpauth-payment"/>. The server <bcp14>SHOULD</bcp14> include a
response body conforming to RFC 9457 <xref target="RFC9457"/> Problem
Details, with <spanx style="verb">Content-Type: application/problem+json</spanx>.
Servers <bcp14>MUST</bcp14> use the standard problem types defined in
<xref target="I-D.httpauth-payment"/>: <spanx style="verb">malformed-credential</spanx>,
<spanx style="verb">invalid-challenge</spanx>, and <spanx style="verb">verification-failed</spanx>. The
<spanx style="verb">detail</spanx> field <bcp14>SHOULD</bcp14> contain a human-readable
description of the specific failure (e.g., "Transaction
not found", "Amount mismatch", "Signature already
consumed").</t>

<t>All error responses <bcp14>MUST</bcp14> include a fresh challenge in
<spanx style="verb">WWW-Authenticate</spanx>.</t>

<t>Example error response body:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "type": "https://paymentauth.org/problems/verification-failed",
  "title": "Transfer Mismatch",
  "status": 402,
  "detail": "Destination token account does not belong to expected recipient"
}
]]></sourcecode></figure>

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

<section anchor="transport-security"><name>Transport Security</name>

<t>All communication <bcp14>MUST</bcp14> use TLS 1.2 or higher. Solana
credentials <bcp14>MUST</bcp14> only be transmitted over HTTPS
connections.</t>

</section>
<section anchor="replay-protection-considerations"><name>Replay Protection Considerations</name>

<t>Servers <bcp14>MUST</bcp14> track consumed transaction signatures and
reject any signature that has already been accepted.
The check-and-consume operation <bcp14>MUST</bcp14> be atomic to
prevent race conditions where concurrent requests
present the same signature. Transaction signatures are
globally unique on the Solana network (derived from the
signer's key and the blockhash), making them natural
replay prevention tokens.</t>

</section>
<section anchor="client-side-verification"><name>Client-Side Verification</name>

<t>Clients <bcp14>MUST</bcp14> verify the challenge before signing:</t>

<t><list style="numbers" type="1">
  <t><spanx style="verb">amount</spanx> is reasonable for the service</t>
  <t><spanx style="verb">currency</spanx> matches the expected asset</t>
  <t><spanx style="verb">recipient</spanx> is the expected party</t>
  <t>If <spanx style="verb">currency</spanx> is a mint address, verify it is a known token</t>
  <t><spanx style="verb">splits</spanx>, if present, contain expected recipients
and amounts — malicious servers could add splits
to redirect funds</t>
  <t><spanx style="verb">feePayerKey</spanx>, if present, is the expected server</t>
</list></t>

<t>Malicious servers could request excessive amounts,
direct payments to unexpected recipients, or add
hidden splits.</t>

</section>
<section anchor="rpc-trust"><name>RPC Trust</name>

<t>The server relies on its Solana RPC endpoint to
provide accurate transaction data for on-chain
verification. A compromised RPC could return
fabricated transaction data, causing the server to
accept payments that were never made. Servers <bcp14>SHOULD</bcp14>
use trusted RPC providers or run their own nodes.</t>

</section>
<section anchor="front-running-push-mode"><name>Front-running (Push Mode)</name>

<t>In push mode, the client broadcasts the transaction
before presenting the credential, making it visible
on-chain. A party monitoring the chain could attempt
to present the same signature to the server. The
challenge binding (the credential echoes the challenge
<spanx style="verb">id</spanx>, which is HMAC-verified) and single-use signature
enforcement mitigate this: only the party that received
the challenge can construct a valid credential.</t>

<t>Push mode does not require the on-chain transaction to
carry a challenge-specific marker. It proves that a
payment matching the challenged terms was made, but not
necessarily that the payment was created for one unique
challenge instance. If multiple valid challenges have
identical terms, the same confirmed transaction could
satisfy any one of them, and the first accepted
presentation wins.</t>

<t>Requiring an on-chain marker such as a Memo carrying
the challenge <spanx style="verb">id</spanx> would provide stronger binding, but
would also reveal extra correlation metadata on chain.
This specification does not require such a marker in
the base flow, but implementations <bcp14>MAY</bcp14> define a
backward-compatible profile that does.</t>

<t>Pull mode is not susceptible to front-running because
the transaction is not broadcast until the server
receives and validates the credential.</t>

</section>
<section anchor="fee-payer-risks"><name>Fee Payer Risks</name>

<t>Servers acting as fee payers accept financial risk in
exchange for providing a seamless payment experience.</t>

<dl>
  <dt>Denial of Service via Bad Transactions</dt>
  <dd>
    <t>Malicious clients could submit transactions that
fail on-chain (insufficient balance, invalid
instructions), causing the server to pay ~5,000
lamports per failed transaction. Mitigations:
</t>

    <t><list style="symbols">
      <t><strong>Transaction simulation</strong>: <spanx style="verb">simulateTransaction</spanx>
catches most failures before broadcast, without
spending fees. Servers <bcp14>MUST</bcp14> simulate fee-sponsored
pull mode transactions before broadcasting.
Servers <bcp14>SHOULD</bcp14> simulate non-fee-sponsored pull
mode transactions before broadcasting.</t>
      <t><strong>Rate limiting</strong>: per client address, per IP, or
per time window.</t>
      <t><strong>Balance verification</strong>: check the client's
balance covers the transfer amount before signing.</t>
      <t><strong>Client authentication</strong>: require API keys or
OAuth tokens before accepting fee-sponsored
transactions.</t>
    </list></t>
  </dd>
  <dt>ATA Rent Drain</dt>
  <dd>
    <t>When the fee payer funds creation of an Associated
Token Account (ATA), it pays ~0.002 SOL in rent.
The recipient can close the ATA to reclaim rent,
then the next payment re-creates it at the fee
payer's expense. Servers <bcp14>SHOULD</bcp14> verify the
recipient's ATA exists before co-signing, or factor
rent cost into the payment amount via <spanx style="verb">splits</spanx>.</t>
  </dd>
  <dt>Fee Payer Balance Exhaustion</dt>
  <dd>
    <t>Servers <bcp14>MUST</bcp14> monitor fee payer balance and reject
new fee-sponsored requests when insufficient. The
server <bcp14>SHOULD</bcp14> return a 402 with <spanx style="verb">feePayer: false</spanx>,
allowing the client to pay its own fees as fallback.</t>
  </dd>
</dl>

</section>
<section anchor="transaction-payload-security"><name>Transaction Payload Security</name>

<t>In pull mode, the server receives raw transaction
bytes from the client. A malicious client could craft
a transaction that transfers funds FROM the server's
fee payer account rather than simply paying fees.</t>

<t>Servers <bcp14>MUST</bcp14> verify that the transaction contains
only the expected instructions: transfer instruction(s)
matching the challenge parameters, ATA creation
(idempotent), and optionally compute budget
instructions. Any unexpected instructions <bcp14>MUST</bcp14> cause
rejection.</t>

</section>
<section anchor="blockhash-freshness"><name>Blockhash Freshness</name>

<t>When the server provides <spanx style="verb">recentBlockhash</spanx> in the
challenge, clients <bcp14>SHOULD</bcp14> verify it is plausible
(not obviously stale). A malicious server could
provide an expired blockhash, causing the client to
sign a transaction that will never land — wasting
the signing effort. However, since the transaction
is not broadcast by the client in pull mode, the
practical risk is limited to a failed payment
attempt that the client can retry.</t>

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

<section anchor="payment-method-registration"><name>Payment Method Registration</name>

<t>This document requests registration of the following
entry in the "HTTP Payment Methods" registry established
by <xref target="I-D.httpauth-payment"/>:</t>

<texttable>
      <ttcol align='left'>Method Identifier</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">solana</spanx></c>
      <c>Solana blockchain native SOL and SPL token transfer</c>
      <c>This document</c>
</texttable>

</section>
<section anchor="payment-intent-registration"><name>Payment Intent Registration</name>

<t>This document requests registration of the following
entry in the "HTTP Payment Intents" registry established
by <xref target="I-D.httpauth-payment"/>:</t>

<texttable>
      <ttcol align='left'>Intent</ttcol>
      <ttcol align='left'>Applicable Methods</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">charge</spanx></c>
      <c><spanx style="verb">solana</spanx></c>
      <c>One-time SOL or SPL token transfer</c>
      <c>This document</c>
</texttable>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

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

&RFC2119;
&RFC3339;
&RFC4648;
&RFC8174;
&RFC8259;
&RFC8785;
&RFC9457;
<reference anchor="I-D.payment-intent-charge" target="https://datatracker.ietf.org/doc/draft-payment-intent-charge/">
  <front>
    <title>'charge' Intent for HTTP Payment Authentication</title>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <author initials="B." surname="Ryan" fullname="Brendan Ryan">
      <organization></organization>
    </author>
    <author initials="T." surname="Meagher" fullname="Tom Meagher">
      <organization></organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="I-D.httpauth-payment" target="https://datatracker.ietf.org/doc/draft-ryan-httpauth-payment/">
  <front>
    <title>The 'Payment' HTTP Authentication Scheme</title>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <date year="2026" month="January"/>
  </front>
</reference>


    </references>

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

<reference anchor="SOLANA-DOCS" target="https://solana.com/docs">
  <front>
    <title>Solana Documentation</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="SPL-TOKEN" target="https://solana.com/docs/tokens">
  <front>
    <title>SPL Token Program</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="SPL-TOKEN-2022" target="https://solana.com/docs/tokens/extensions">
  <front>
    <title>SPL Token-2022 Program</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="BASE58" target="https://datatracker.ietf.org/doc/html/draft-msporny-base58-03">
  <front>
    <title>Base58 Encoding Scheme</title>
    <author initials="M." surname="Sporny" fullname="Manu Sporny">
      <organization></organization>
    </author>
    <date year="2023"/>
  </front>
</reference>


    </references>

</references>


<?line 1272?>

<section anchor="examples"><name>Examples</name>

<t>The following examples illustrate the complete HTTP exchange
for each flow. Base64url values are shown with their decoded
JSON below.</t>

<section anchor="native-sol-charge-pull-mode"><name>Native SOL Charge (Pull Mode)</name>

<t>A 0.01 SOL charge for weather API access.</t>

<t><strong>1. Challenge (402 response):</strong></t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 402 Payment Required
WWW-Authenticate: Payment id="kM9xPqWvT2nJrHsY4aDfEb",
  realm="api.example.com",
  method="solana",
  intent="charge",
  request="eyJhbW91bnQiOiIxMDAwMDAwMCIsImN1cnJlbmN5Ij
    oiU09MIiwiZGVzY3JpcHRpb24iOiJXZWF0aGVyIEFQSSBhY2
    Nlc3MiLCJtZXRob2REZXRhaWxzIjp7Im5ldHdvcmsiOiJtYWl
    ubmV0LWJldGEiLCJyZWZlcmVuY2UiOiJmNDdhYzEwYi01OGNj
    LTQzNzItYTU2Ny0wZTAyYjJjM2Q0NzkifSwicmVjaXBpZW50I
    joiN3hLWHRnMkNXODdkOTdUWEpTRHBiRDVqQmtoZVRxQTgzVF
    pSdUpvc2dBc1UifQ",
  expires="2026-03-15T12:05:00Z"
Cache-Control: no-store
]]></sourcecode></figure>

<t>Decoded <spanx style="verb">request</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "sol",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Weather API access",
  "methodDetails": {
    "network": "mainnet"
  }
}
]]></sourcecode></figure>

<t><strong>2. Credential (retry with signed transaction):</strong></t>

<figure><sourcecode type="http"><![CDATA[
GET /weather HTTP/1.1
Host: api.example.com
Authorization: Payment <base64url-encoded credential>
]]></sourcecode></figure>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "solana",
    "intent": "charge",
    "request": "<base64url-encoded request>",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "transaction",
    "transaction": "<base64-encoded signed transaction>"
  }
}
]]></sourcecode></figure>

<t><strong>3. Response (with receipt):</strong></t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Payment-Receipt: <base64url-encoded receipt>
Content-Type: application/json

{"temperature": 72, "condition": "sunny"}
]]></sourcecode></figure>

<t>Decoded receipt:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "solana",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "4vJ9YFuPzUgdLkWYJf3KqfNM8cTnBp3jXx...",
  "status": "success",
  "timestamp": "2026-03-15T12:04:58Z"
}
]]></sourcecode></figure>

</section>
<section anchor="spl-token-usdc-charge-with-fee-sponsorship"><name>SPL Token (USDC) Charge with Fee Sponsorship</name>

<t>A 1 USDC charge where the server sponsors transaction fees
and includes a <spanx style="verb">recentBlockhash</spanx> to eliminate client RPC
dependency.</t>

<t>Decoded <spanx style="verb">request</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Premium API call",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "feePayer": true,
    "feePayerKey": "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr",
    "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N"
  }
}
]]></sourcecode></figure>

<t>The client uses <spanx style="verb">recentBlockhash</spanx> from the challenge (no RPC
call needed), sets <spanx style="verb">feePayerKey</spanx> as the transaction fee payer,
and partially signs with its own key only. The server
verifies the transaction contents, co-signs as fee payer,
and broadcasts.</t>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": { "..." : "echoed challenge" },
  "payload": {
    "type": "transaction",
    "transaction": "<base64-encoded partially-signed tx>"
  }
}
]]></sourcecode></figure>

</section>
<section anchor="push-mode-typesignature"><name>Push Mode (type="signature")</name>

<t>The client broadcasts the transaction itself and presents
the confirmed signature. Cannot be used with fee sponsorship.</t>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": { "..." : "echoed challenge" },
  "payload": {
    "type": "signature",
    "signature": "4vJ9YFuPzUgdLkWYJf3KqfNM8cTnBp3jXx..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="payment-splits"><name>Payment Splits</name>

<t>A marketplace charge of 1.05 USDC where 0.05 USDC goes to
the platform as a fee.</t>

<t>Decoded <spanx style="verb">request</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1050000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Marketplace purchase",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "splits": [
      {
        "recipient": "3pF8Kg2aHbNvJkLMwEqR7YtDxZ5sGhJn4UV6mWcXrT9A",
        "amount": "50000",
        "memo": "platform fee"
      }
    ]
  }
}
]]></sourcecode></figure>

<t>The client builds a transaction with two transfers: 1,000,000
base units to the primary recipient and 50,000 to the platform.
The total paid remains 1,050,000 base units, matching the
top-level <spanx style="verb">amount</spanx>.</t>

</section>
</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The authors thank the Tempo team for their input on this 
specification.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+19WXLb2JbgP1ZxWxnRKblIWqMH5cuskiXZli3JsiSPFRVB
kARFWCBAA6Bk2umM2kP3AnotvZRaSZ/pTgAoUzlXx1O8fJZI4A7nnnvmod1u
B2VcJtG2OsuSMA3V7ijMLyJ1kJZRWqphlqun5+cn6iScjfGDnWk5gn/jfljG
WRqEvV4eXVVeDgZZPw3HMOYgD4dlu6Av2336sr26GlxFeQFvbyv4HQaKLrJ8
tq3idJgF8STfVmU+Lcr11dWHq+tBMe2N4wIfL2eTCJ8aRJMI/i8tg36WFlFa
TIttNQyTIgqCEJaX5duBUm3FSzicDjL1JEzCXj6FjxUMAI8fdrzPonEYJ9sq
gWc7F/z5v/GqO1l+QY/Av2abj7NpOmAAODMdwHfqSVyWUW4nOui4H8k8MTzZ
uaCPF50mzfIx/HoV4d5OH++ur609lF83Njb0r5v3Nh/Irw/W7m/qX9e39AMP
7j/Ykl8fbm7dx18P2nudCZ9uO6ZTl5PapgUJdix9zx9+vyBmLPHL+Eq5rUZl
OSm2796F3YRlHvYvo7wTR+UQt30XsOUuI0rjMu7SSPZg8UeD/Fl4Gamj7FM0
q3zxKAcUgeM4nYVp5avzbKyOovBiJGcCa4JP11fX7wkwcLE4nV6OD4fzUaS+
lz1/zxDwd67O+qNoHP0qAOSw3HZ1/lsAwO6lvboWBHijHLQ5e3G4c7zT3nux
e+bvSfBtL+tPccIbDlCwtZ+NcdVF48rmoHAN1mcnh+3zF8/3jyuLOTmEM7qM
UnWSZxd5OF5oJXdLfOV3WlAbPlifsyr67tcs7W70CbAaCVmhftMyH+2c7W89
8Jf3KCyirQdqP+1ngzi9+HU4OCrHiSDiuJhkeTpr92jc9urGDTh4FKZTdUbP
+4vdCNrAXvD/VNgrcMoyCM5HcaEGgmlqEA3jNCoUXCC1xPd9ScWWwtDnDM8l
JfchGEewjIG6jstRnNIjmgbNv47Bly9Nd/vr147CG91PYnwfGQown35ZqDAd
qCK+gMMKYZ94hfD+BLAmRAU6UuBTYVoMo1xlvAw5vF6S9S9hM3H6A31cRDlw
PAX/xcOYNxvI/DTNJI+AjZUMBRoTIIVLx/nDcppHKizgqSwbKvifvNoBWF5n
qp9HyAvjMFHIIGG58HgxncB5lNFgW3Xx0x+XnGGXumoZ4B5Ok3KlFVwDHYxo
ZoEBLGXAS8Hpo4G3ojJzdwQnFPTyLBz0w6Js0V5kOrNynAx4c9IDfFtpqeps
9vX67uOyiJJhHUJZ2ibgug8HFlSINh7EGQ86jIjjeDBIQFD4DvlYng2m/Hpw
AytT81DHYG8YwIKSJEpBvIGVTlAsUeMIPkzjYgyLDkt1AbcCnuz3o6JAMMJz
2TSHv1QvAjQeaIwoECHdK5JHF3EBksKNlySoXhLFlwR2LUgZIyKP4otRuxzl
2fRiNJmWDqbSbQK86bWLCG7BQMHOwiQuZwHCP8muvaMZRrDuL18chsIXCSYp
JlHfAD0QRCz0sgpYt+plMJW9U3TC5lIVajlO+yCJARkLHIoLs3nk+etXQKdx
eInULgasncZl2Evo+INx3M8zDYgpnAUgGCyYkW8IyIYXfRgTa4Td6B1mgC+j
KBwEeIXiMS48pHv23XfqZJokwGgHkVrek7ujvnw3gU/bY/j0KxK2SMm1UkMY
rgWzAk4M1BI+pfCppRaupmi8k4G9yIVHk5gIVS8HrtnexIDmKJYQEogR5lbp
CytIkEbldZZfbgfBL7/8gsR6l+do+jnjO+R/xsMc8zDCB35ufP3mr3627y6v
ragn++fqrr4RC7/bbv75abF5f9Oa11fU5uq6IRin0cdpDOe36LzLOVySCYIe
qOYYeD38u/Ca4fLBvFH+PJr968qia/7HHGD9CbDaWFGPpnEC+PqpBfha4gYW
fBd/JrjXFl2DW837m9a8uUJMIMvjz0Qjtm83r8aLf9hL/dPCuKHZ7ifVmwHP
WFlo3j/sLixvrajdrE3gX46H+vAWhjMd34r6F5IrFp533m4WXPM9XLND4Ree
d841+d3w6v4KCMar6sVzAMhp1I/iSbnYu3/6/UUGERygXAtMHZlX4kp+wD9B
ekoKjyc5omCUAjNGDo7oQgJRlhejeKKWv3yBj9rOR8DIWdimkQHRgMfmUZnP
gCdfxP1O8AZkMdXVVK+LkkwXhPSo22JBUoteiuUG5K8OiewGReaLtyJGyk5A
ssY1Epoy3zVbJKQvApKMQBi1z6nLaAZiG3DayG4adqtFhWIkosJjLfmSrFCM
XFlBS8U1YQHebhAWHIl6rqhAL0cgBlSlBZEChP0H8yRrkYqigdU83PF/jbBu
hgwaFZt/SiJ/O0lk5e9IjcwDVpr4nywSAJtc9N3fNC9IBGfIwVw0XujdOaCa
9/NTZd6tJlb2WzjGvJ/fEVb3/kLpCfDBUJeFpeP5Z/FbpSdg+BdReV5Bmj9e
AnqwAmDMC5Yj0eK36Lx/tAT08L+XBEQ2DeTQKHYAPx5OE7QjpK5I0Q/TNCsV
6N2DDBg2/n4dAxcvswDEpggtP3WNnKUMT+JwDYTG2NmbgdxR9kdo50DuGqdo
YUFpY64xTF3FoTo92WVx5DRK6BKS+CWTe06+qk02TkewEC0lwZOARDmwlahA
6WkcomGsQEMk2Z2q9qg8G4vBrNGbg3aiA2P3DbI0mTkGira2Hqku26/2ojKM
kwJEvS4MlwAMu2RnDFzTHppG+9EALnwx12hs7WHfaR7J9qjDML2YhhcRC2Uo
2IFAMSjU0tGrs3OQwehfdfyCfj/df/nq4HR/D38/e7pzeGh+CeSJs6cvXh3u
2d/sm7svjo72j/f4ZfhUeR8FS0c775bYhrr04uT84MXxziFClQVwczhomoJD
7EUE8BxkrRKOJywA04p+HvcixBD1aPfk//6ftU04iP8hvsKvX+UP9AvCH4jD
PBsdAf8JgJsF4WQShTmOAhIp4PYkLkHObKGgXIyy61ShFQ3geOffETL/sa3+
0etP1jZ/kg9ww96HGmbehwSz+ie1lxmIDR81TGOg6X1egbS/3p133t8a7s6H
//hXUGMi1V578K8/BYg851E+jtMMdJMZoIxz6c401wm21Y4Sx0mEDhk4ky9f
2GsDkJ+mMdwlFRNng+tOZnQVyg0AiuXc5Bai9mAKyK16fE9AECjYJojEgyTj
Ao8Gbar4blUst7OwaO77EDR+wZue3RbNxtrhRdsZTtOLGM2r7PjA7bIAjvJ9
hhC5MKZG86LC+dBN5hpvAQJyRR3jrjwHb9TNvLCWnaLI+nGImM6ewZ1+H0VV
tbxzvrNCCxzAPcBlxAWa7RNA6QFQiCvkf/RGKG8wrC/gG1wfoLNABl4FCXgS
8dJqE4q/j8g1vBcOBjna8cmoLt+pPZlwR75cPtnbWQGKGQ3o+OR0aMrvCzWZ
goLcR4LDaiwvk5ehjbtlBYwHewCMw5As0wVsm3jHGBVHwAnAqxKP1hrWO2qN
7Os/qrXW6uqq/g8GTGQMGA49h+oVvFsbUHu3yKyuRw9Ta6pvGaiDeqc0htJX
sMEB4BMMhepgP0a3Z0c9BuBHn2DuJGqpV2d7u6Thwqv39NNAZ0BdX+MvnXXT
faJF4JofR+Tyi3I8enu25GcBzC40clZdFh31RrNusZvDUZKzz1HuW2hEhwMu
SOe3fiVBb9fppJqMAKDKoyNBM+jKGvDq9KJRmAwR/YaOGAH7Mk4GOQrtTiii
skyIX7EoUvfZaR+BTz4qXgLl6O9xCY8uNzkiVjyZRDsWrD+wMgUxfFqKEdY7
ah/NPxED1TH1ILhvsvQExnQiADA2km9CwG6tiQp+0zihnINerltcVuaaWSrQ
8A0tagBiRr9MZh21yzIi8O0pCuVoUwpUFT4d8UviJAeGcrNkIvJVhW2UNZcb
0iQtlHUCELWIKcO8ALYoR0eYM8u2eZQnqUpzeWTgFQLmRu0yHhvRFF2aJJWS
TzOArYfGq+nBq4f6uu9Rdy8okJjA43nofFURQCjKb/ZGk30cxWzfJ+0I280Y
rjLvLuAxzkEXO70RtA1aBPMRpUmgN8ECA5ZpybEK6D/NCSI560J0OCaMAzT/
KzxvjBn58l0kH38FjgiE4tnZi2PglxLghXy19yFCatYP8zxmQVAc1sA8CiUB
WwG6ONGdrGVLH300usAW4CrHn2GcaaGJGU4ZACpnKTJZ0e4lwkItP9s9W5EF
3X+wBQsS6qjX3VHwRCASDe7ZY9p0mjAtCEdpP8JQgbg/QmzOxaRFrt0wBc4e
XyB/Qj+/ubQZsG5Wc0S3MBITcQ7c4/wQEEZ+wF0gtrhVxiuCBOFiT/ZgYIFj
3tuc5klA28WwO9juWcT4s0XXO5siMxrQOeK1AuRCqC93fwQsCQ6QCZpgK5kM
ZVUUvzGO4seueZv0TQ3EFuENPY4Xb4IyHLryyUoNIKlOTS8Dd+UTEF1PD4YU
UBAMJ04IV7NtgltXdL6ug0QB4Ez3zZs3bSdCwtjhnUAUkmXwWc8M1OW1lwRr
1vztk2L0aYtNoGs0NTxqwrCQ1NkzVkgfxxHQFD64ppVq3lpb7bY2L3XlIpAv
Ay42IiTgZ9sifsuesxHk6QbwRVPLINsBvptr+VVu/zBLgNgieEV7HtJiUXcL
xEcx4NsH8gqPtR0EbH0FxqcVJh7MBArR1xQ+YUShlkHLEINQlJG5ijKn+4YC
l5UH+Zz0QEQArCCo6GEbhtHwsCvdeWInihJR56LTIupLshuhoyvWLa2t0s+S
w1TgPRb1BHBXYQKakaZAoZpkRUyLR3Z0QbI5QGwY05tI3dS9zXYvxkUId9AP
Lo/DT2rtQWtz817r/uZma/X+Ruv+6sPW1tZa697aFlzAoD/NcwDfzIN4FWB6
Lbh1w0BRWiAAqy6aGZa6nRrs3Pd8VRBeRiHfqBAMOPi0u7R/8uHxm8Fga2c6
/Hh29jE6Wv94vPbp86wXTnYfPNm83n/y5PL99ex8r1y7Wuqi+CDQFvB547Ka
CXqQkRgKT6cgW1LB0ohQSmHXwMhNHJzHuQjo/DmJ84ZmRZ/6oOWotfUHDqUD
ELNNYkKy8rbS2nUH1LXRdBym7RwuIGkX42icKbFgaF5jnDAZTowcNYY/ehF+
PwljYgf1Naxv3fPXYPwbtZtVUdGtQqZph+gVMDuRqyu9Mh2AV8EWAye6OzFp
hywhws6Ar0iwEQ9aQZn577KKKivyBrI6qqfitsgAyS+Demx1VZJqACIYh5qn
YXIw8A7lCJB7FKbl98hxYSXIhfW1znIklAd7oBulVxmcA4ydTse9KF9hpfkb
Fr+jcKZFX0HbHKPM+nES82bgE8BToEUlXsn6sW7du0caJvLlZREejxBptPKd
xOO4XBEFT+hLSzAaqYVYjYT8MoyZ3CDp9MdykJzpTEWfcOPOrkC1RQw24uGQ
0DWcDuJSm2z9vYrVBkSBo513LCLy9cNLgNQhLIHb8WXt2rPqOpqW9nizgfeI
w2HFVCrOZcOCLO8BraRAbJmmeJgVAytsM+BbxxwX+RwwJe0xdhHlwBIUltG0
KSiZYpyiZ71WaDOcJgM8/TFwW2XoRg9/jxCxl8YAN5hoCang0iC6ot8RJZaS
DMRM/LOjJOqOYifNG3g8Q5WNMZVi0BEfsghTeURM2gALV5sR8TbambbWE8hx
3XHOOuHFFNm2bIgIGbMxgAOI5Hi0WUpGJp+i8JXAPRnjRxL2ycKh7dJ8VZdX
/+s//9fDFQsKwViW1rqaNSGNJxOTS9l/sAyy1/SOInOe4UyvvkHgUWzongv1
2R1F/cto0PXofBDQouV2eKjQREaNrUoTraoV6wLNI6mxj+C3FhCi9jH58mxv
ZK+gTy6ji5fD6P0sPr7eedY77j15fvL47e6b6aOr4cOz4t76xuuXW3s7pOaJ
MaAeuW9H+/xy8Oi4d/jxZOv1/mhwuXN2b//k8eHu2snT9NHH3bf7k5NP0/0e
yuxKHRhkM7SFV24MYWJXyFHvr+3c9eWUhmFry6S+3qmJaaj4e9Aexexgos2R
B0OWiZIsu5yifWWIt7ll9coUrnv0CUeAs6GX6Wb1tTkCXhEttboluT9+iA3o
WJw3A7OmZJ5hdah/qU0fFXup0Lo5FJiIE1PgUcyYGQJ/Gcj5A/XLyZMl+3P4
QuXOIBK7N8DgfxDoWKCKBNLLsiQKUfcYkOrLqpJGPq3BX8dJElAQWz3+2Vjy
KnY8Q6oQTJnqUmpa1yNUHNLkBDH5EUtKAMNaXlJkznYRpKh11KKonK3CIN+g
VHNlH2uVZAh874Y9GdmliWzhETQEac0hV+6T9CYDCVDTAMmxIFEgFGEMimdh
k6nTrpImMASuwQ4LkCpA1yWLt4MSIEHleUjSH9yocQZc8AESXYGhy9Po7Y7a
D4FtwEf5jMk0WWREOSQFqHRZsT7WYpuzBrtGNO2qZX08K9vq0Q1yKTm06XRw
CcqM0OERWV3zh9sxiiO9F44jR4Ok8ZDMgDQZlQJZOFZgXrApPZ6MjgIKjK1B
BmM/9cX4JOxFibFL0ti8ThEjl4AdluguwtNCNygJmnmYLK3Yq02vWbFvAaEP
wenLfQ6zo2E10Qnn6DK05ghPk9eLuqUcvKZrAhONdWjIw8ttzxAwKEkENSjp
wICbYIvk3Ieu1uyXHRXCkxKII1iyxhs9p68n7SS6AlibE4+1dleGibt9dId0
5LViSmaRUC9TtPuiJm27537u4oODsawSYXyiXgJws6m+mfOm+oFvcY6JsCSG
CnGAVy4AjVh8BKr8OcozR1BulOfgHXYDCMzxyk/HDHeUUHNtvvAH0hxv5h64
k8klcvxgShq+tWoZTikuUua9csQGMIrd5xgySw4KSj/NUJVCIxevFGg+TZ31
5WwjJh8DtIOm/ZIZDuFGErEKoWmo5tVAndHMVYKC/4NQaoSHOch4DDP14xII
f3gBkKUYlGIq5ApEd8EljO01eUqxtczbQAyTtSgXAdUwJB9d1u664iqgqA6Q
KoyHA2+Upcl9oKasR6PwN2splxKQvHIVpVMONyEfGqmITBzgvX42liRwUelh
xkeYuzQKi1GVsfvkkx/mTCd82mRMKUccxuv6bbZBRIbFuSvQVh2BSWQbvvUA
RjsbEhkgj0y6jfCHmg/dbkxRBvEmhaVK/hTJPyS4kfQDb+EDOeaDtuHkJoQO
mPSeR14cM8Ke8RpPyO4WHhuB4qfTyliwwHkGoLpmcKkxmobUtLxsJ+jA/gH1
WlfQAvo1HZOZQS4uas5sgBH5eoiOyySG/aF/SAQIjcNWXXXlZwN/ud4EG/GD
eOcFQ42LKLkinP0O9N1jSy732ZlMQcQfClDXv6AKybd+advYHFdZtdSUFL9B
6ZA+NDcXP73/6fnb8mJ9982D+4OH98/fPjvbm/T2tj48uhxF5x93Hmycvz+d
PsuKi53ilVZXjYkLB3gTkYCsdk4OxC/Gj3nKNjz4hbjckoj6+Kaj0n4NvjrB
Z6KRFw7zQgivdlbZu7+8Zjz7xpy7IqCyudQLQqoOqFsZJf8AiJ4AysXATRCi
GNhxW3i2+ButwcNX9+QjV6vFN26hWy58ShLJsNwUyKAPCaMZzpwUif8PkVog
roX+JSrxEVU+Ba0F33kY7m88vrj/9MPzw/Hx5GW+dT59ff129n59p7c72B8+
eDI6+PA8OUpfTNZOb39bbOCA0E0UkIJaoAifjA5EPmMB49sHs/X3vENHYX4Z
lWSLAnUCzbxF9PvdIxZq4IN/Dzh09ktl/RuTxw+eX6yHT3vHV88uD4+u9z+e
3n9X7n16v1U8GT1LN1+9vjd+03+bnz/cQa3AQlTgiescZ/iBp0DA0eN0/3Ej
EpBArFkR3sjO6hZdSnGvyYCBkWdX9QMmekaLv1bIWwaGlET5in0Lhl3lYdFv
uWt9odp1SY5K3x2qtAOS/PW4WnQuJ1Hd7RiQZim2wzRz3fri+yEPL5p4WPs0
Pk2UdKwx2CoORhM13Nnzj4AyDGJhZiwbxgDkBhRoixXq7zWnsGxuW3VjjNkF
1SFMxvgLo1yXXF4sO/LX7MLl4DdMNBRlbgWN4BMQ5osuizAo3sQ6KsNzOrPk
/yl0tQQ2j12H5DEEOSbCEGB2LFXkRhZUnfga9vFR4KsNKQjU3HIAHW0Ij6u+
/Z138JpWCWme74ub3E8YorhHwX4S9OyfjWdnkJPW8mpFfEcpy4KID50RhmJX
uiIPGvOlmPQD5Ro+HBeCMUJh6QlZnK07Qa4ughQc+7ySE1wmwstnU06NCPZp
uIG1JzLNf/3n/3bS8L9854zflqV8pZRFk28/J/zHsw+YCJ/ghgAjl2F4AUYc
ENp13tEgdW+gXGhz1jbEoGFSAMDPHN6gflbnsHz4R2d1wa97lrSrnwOdJvKz
90/lV/wLxpQT/1k7r382OAW/Vo+LX3C31fzeo3k7mx+vxb759Y11+VtI1wrM
SVTSfcPGArDKITdMCoj5wwd01Y1TR2wZCH6crE3hRX4S4ueITUidoHKLjOjg
2IiWixV2FOmHLOUkehiRw9m1WtLiOUmtsi1tHAzMRFxaJy5nSAG0gdg3p1oT
KVtSW0HVzKVNxaSSWautjiauwDXoseI2k6NqntUxUruw5r1FpW8q9szYlaha
WUbghaxS8kFYqDocvNI5FI5LrMzsyoZ+NcTgUmhO0JRqDLdLxDikSIx42xWJ
zhysFYjiAUofl0cPP518fHN1vp4+y58W7zbDveF+T4tGxOHwsXASdyTMGYtA
6e+Z8Ymcjrkp8jkzwSUbi2nGI5aIX0SzZ51OR38h/BC/4FJfG+21rfO19e3V
re3V1fckFJN0J1TRbgMpAL7m3nWtDTkfwRM7L3fgByb1SVebUaVdfsL1uIIX
apvmSHySrdOhv3xnDq1KsCXnuTH21iPXI3QWJWhxngVOTlUFvRurngitNkPP
pdQOV55fYsjBTphNLIraevhX0XC37BI97mx2Pv129tsQOG+3/fM/7w4uwMBY
6z/mA9RYXg33pm/vj972Tj48eTU5H5cPT56eHhbHT55Fm4P9dNZwbw6RB4ms
CAJ384VJ7ENSQKCh1JYj643E22CFf2cEOLW2Z+LjoPR55F87jyzHU1rHAqE3
RgN28xVV3hUNKrlNvvUSeTbQ+UqlBVuIIFCN/oAboVBoz6SvxIh07FaKYIsE
+ovbXhEIXhfQJrreuYrSUaj3694SE8aHWwCFkXk5G7fDwYcp1ZwaT6alCd0k
Cze6DiUXAGagqCv02WhxgqThmoHoy3dVvhZwkYzwxmIYskVyRFSyK90AerK1
c5wNHAEVE2zOpnFSWSoOcC4EJtHQOjGxMGKJmxFivA8s9/MJt08wvg+2XQTz
q38ADq911J07u7XSfc5C79zZbshEYFx0HHkNotk8oYZdedqX1+iBdoXA7wsT
4BHXJ7ZSX29a0l30RDeAybqzRcALRGoR2IrK3hrrhOFsHBmOgpYEkJCSuezJ
uWYhOoQ5ooVWRa0iyUrxARQqGk/KGSxxw1kia1P2AlbXaNIpzF5wmgZVgWJC
GmsXOnlGQbCJc585QmID5dBraCrDqPwgAhQF0CUhOSgMUuvJ9+q/lBisR5c6
icoaQYC1bTlrs9kmejWu5F09sWVHHaFieaWLTw3YY3NSxJ0/J4DDqYyAXqpK
Tjq+XBGZ6FLy2X7rUtYiOOpueLw7OrmmqIAUV21hUve9oexWT2Or3sGwaMeF
yYGQFIgwnVnhrXAJjZcKrokoO/985UVcrJZv4hUoKR1oOhzGfdoj2pd7YRKK
t9fbH3IGnaaYcYZgjaDqsZ2Y0Cbk1AoPbonDSiQRwTWIuK5qUHtgaB1/pY1T
GMsl+q9k7+Jv5Cjm2x99GoXAtwisZRn2Lws9EbIf2lU7j4vLAse3eFKBaXu+
VrntewBRm6zFQVEIRCVU9Sbaa7zlAZMVSW/XV3ievu1Gjoqt7hvEB/CoeWu1
e1DfJgsk4tW89VUIlF3uzjtaq0RNNi6ZnLQ3S0kkZbx2Kyqc6IoKIGx4qBQE
r4B7OwHxoQkZJiCHzriehId7Z5a9R6qDYxeb5okruVKaJtYuoUfQ1sl88LW+
FmFpqkF0WB+KCxOKJnkNDBGkaFXLFhyMpygxBzvMsks1nfCKy4zCf40sRUlf
NJbDfKxbOx50ybWdZtZA5IrKuJ4hOvBbblClFqCJibl7w6AZMbmiqNY0JV4N
tnQDkpjo5frCHWs9MyRYZR10vt6o2Ye3g/kSc9Oe2PyCnqAvzQoM2WHudRjN
JB2WzMg27sTFOqo43aaMiSYU31bfon+d2gDOjvXrdqnVl/0CsN5F8c3QlauC
83nKCG6zcQfNF8M5K9cSS3kLfCf2ImNxrfNCOMgrB68oT0uxkDzNSY50cw2c
IF8+RYG6T5ua35hkSdyf/WBfaKCzcaGlHS8avfqSw+xIyiT6bSKY9bisemN+
S7uPcWOclRGNM7YziqrV7k0HF1HpWnELZz7tFbRFbexVqkFDZiRnkFNpBdAm
SyoIwySX0X9S/ZLJDd7DRjsrqo/NwpsWlFkStzm5FZsr5ZvYJEbC/Ear+ii8
ivypqsxXOSGh9SBgoltz91HE42kS1uViHNZZu37s3MVvDHiScj1Sb8NlIl5g
uuUa8VDPKbNQJHzTCpsFVWcWkZTmbUHkL3zBStBUw5rfm7c+PkC9RB14HtWF
GQw6p+XL4cWY0s3XLk7ZD+I8bsXdAjOHhVOx5cHkUEdEV+nOm8LWiL4edrEF
dp6Ixwzk0e1srg7rRN3PPWbmAG9CKVntV+S27IRMpmyTkIjIqwg1v/sd0EXM
bTWFK90VMZ51/fprXaMSd9FqyUXSujYj2qOaXu6jTtwHEooHdBOtqJIJ4YVN
lGIekXjQwfJoWV733XhdASTodSDq6IQCKalwQxLO9GHyX+1JnpVslOHjfIhT
YJ6IAFvyLUWOqyRkiz+/WuK0wgzn8NCbWaHLi4kRNkp6jim7Lu5hnKS4CCsW
fEmF9iXIeQBF0yXnxZDVkMAZZ9MCro0B9M0w3XDRsrFOyrwLgt8h5aviq3La
XXg4SzKgi7ZEUc1V6Dbdms25QLjG+l5Tiu7CGncYZRLlOeZlpnp17uOwqBDL
CgpZqA7q1Llouig44ry7chNLnXNX7mGGKcDy198UJii/5jYcZ1hTgKw0tVYc
eeTlAWjvkPX6elXsqAiOCTWBxxoBgQc9Bwx+bGz1ZlaH4jvp5B6YFg3LjalU
K56V2Kpzu2LWLkf11AYpH6AVdh19RPygljbgJg3YSPkYC7HM+P4eZsgwMUh9
VpTR2OSBdDVAvcRFscFUbHxYeosLY7pSIeeGqq6TYE33yxV3nawLJw8Cz0Ne
1tG39Cb7Fu37WJqqETpCNGoJKFUQtFQi26cL6cTnLAYNnf3qb5KjcczKteKp
72xY8oIoXYDznQxTdnMUdJwG75dCxYkk65SGxogKDGWSiDeXzbqLNj6qApZb
AIUxaRUUQ6/XIrZqvZyWwruNcBtjRRd0WMKnBZfjMPeRiZBJoAoOCMx2f01L
xvtAmQgYGFZak+R8wVTMjSYQu3otqxeZr6UtDDDvVvpJwa0A2Za5qc2Gl7/i
phpkbEotdiMIMXEmz2BZJHHz1gWhl72cUmEFNqV3pSFFv/mWk+jHdxWB161d
Uu+Su1nY8mQ9Bd8x42x0pAQgPWFU1ptqNtC+ncqE88mMCynn85azTN2AyQlr
7zo0sL5k3+qENwflerxX2oxFs914gpKZiYFXuvzh+Y44yOqEBuUrXiBnJXY0
asGKKNGnkm1XJ5Wbi5HKgTkItpQ1nAXWxmCYayLnZnFRUoxnPvEA5FDfGnyq
NMyCiMpxzIELg3oeaEwMopNM95tp8o0na4nzH0uTUdBKriLHBUWyUuWkGsjz
zXjp0Omq2HITnT5lvenESPVAouuSfhB4kQjGFxSSxQQIo5U1m+KHClCj2YXD
FbzYjN5sN+dAuz5u0c9P93QWE26BeoueHE5wiAmVjlTvcpr6LGGZjaV46liL
040idKceqGmfA8hfJFmPhpFat9weL/A1H7eKCrXYQ5ukVlxFOqeoTi4QseOW
4sTLhPvG/VpgOwEtAUMWK2NdwMlY5BO9UducQxt2YSPhuc7qPGuzq8bW4yI9
OGiSGNI5OEHDMHZws0umVYF+XAQ67dBUlfQNqeTEObN1Mo0Lh/sEVipoVvoE
trhmBUZmDNgbSLembGgwWDWHO1Mu18G1chtAupEMQZM5m+MH4huKqAfZhOky
xpViQEDY5P6mwawbeaEuJKq5EQl/cctuJN/4ttKTpKmXwuIj4E9TR4XbjdDU
lWrREeYU7m/f3GChvoZ5T/0eI2AflYOh8p1brduuQXoGecEDf+ouNlZUg0l9
4RFuOqeF14CdUqyZ+8XzW+5ibt+SPxcftlZUxWJ9qxF+F0g2tjFbfA1/E0g2
tkC5zQj4s6xFcRH6Vm4xwu9yFo0NVRZfw591FvP6qyw6wg1dg/54Wk0B0Ws6
Gge70VIkqiOBOIFxzaFzxJw6aIKY65p01AHd403pHm/iOrNhfh1U64Xva8pa
99hhSBdZzNBrhxK+djK5bjnJLN40490QxwYDskzRQeu6e3dyVH1lCTf4x+6Z
WaiwgvbYN/rJjMsr5oUvasW3to/7ZracfFbFfN1BOWWv9WSLGdsdC6YpUNm1
BS3mGv+rLqu6wGplcF9cvVE2rxeer67gFm32/nZ98P6SHmvrzTz3j+6x9pvW
DBLXSZYkvv/6j18zSlm7Bo9us+a/sC/c1j/7wslXKNr9JX3hQBh7rWtI3WrN
f3RfuAd/al+4iqShO1Q0p4TYxhXoCFu38onJZvh27iGKETqNA8hFUY95KUrA
TZYPmvj9zY79LTu6y2nmOsO1T8AxfzZLDO4I0lauLi9UZAVXHpBVez3tmoMI
OxjyYqQILl+6gHDgpih4gNvNnDLOlcJRbL90UxOcgrhNcYhkog0WdLTCOilR
oMsL72478sL3hY7bN+XF275DwHRfqPl+nPiJtuOzlRe0v6Dhab8WVPFrds8e
xJ3Uluku612ydFsuHZJZ9RxoF5fZG0Bj53ynxfXMxN9kojLRbB3BBdOmW+9N
DtWJuIcTCIiJ0zHLNE4g/CM7Pb8LWBN9wrQlcu3DvsbTsVr+ZbWzurqOaLGi
p9E+OaeYQEw+vnU0RN/seWBjt+vOZL+W69FkFFFUVbMZSeZVd5eXyH0pB2/d
wiQLyxN1lHKhXnHWYelQHaj7LXRVbqXRb+OeXg2XDdIvmL8bMzxsXSzS3ljQ
uZhyg5cbUgJrearbOp2zkoV0Q9zrN6rLdpoGbCrxYPNOJOsORuS8u4acOxm0
yVJNKXemh1M0LDnvziljaLPQh3GCfqxFikfMhYyfn7UwDG7KVwl0uooOrMWw
Yi8dltOQRFPi3Fkq9eDGBBDDJFQvTfBcX5c4Fq+EZy3z85AWUeu8PJ1riUwN
jOP3W/F1OjFLWDDSs4qP0c9gHjYGCjKbKwOes3k+v4eAmAGC7hAuPBVf8daG
gBvFF6M29ztwQ4dv5eYyNpO0zLOE1V0/ANqTZ6gpK9ad9PaMUA2oCaOG6hyI
CixZEpB48SB3ef5j2i1ginYsioOsYLdV5XDQ0wy/hJSAF2gm42eZIFu1q9lW
6Esac3Mqb2tcuhOv3nQSwYcfOMMhG3IIalhm2Ojpl83VVarPdWZSBANuBEC1
pfUSMEQQu8pQQplzhNuV9lhD2a54E3/ZWCPagBLY8i9r65hvDbcB5zOVJm44
+UAXz4Wj5BZ7GOdNHWFS9p1iRecOlecAyGdYszX0zsqXE6THA44WDQIaMPbA
UYziIWdpI7On9HKmARH5v4dovSC/bvRJEtd9UwkVBO0orBaCzV1ibBFGVaaN
IKDr6Q6c9qRSvU5KXtnVB3xhYbtOb1hN9HTbRQSfLvrtRWpSriRID1RAKOSW
JRI+wIrLkyiNNLeifLkFfPBepeogrHfE0mYwYXKoLbHHllr6nY9sVy1dmAs3
oJtzUHmM7Ya6JIsWI2lLBRKp3+bWE+nqqhxdrjpi+O+B/9y5Zz3EwnDC/uvV
42gcx8xXGaVZsVn2Y79XpAYKKVbVBfOB6BVj3Vp4bjzxHqPmbhsbG9hcz0cA
LHO7SDmUxrolSw58vlEaZcmAYOHiIvQa75nmnToVO802vfonq+fra9urq1z/
RJclUfsU/X0qGKazozl25qaIFR1jQ6HU1HBwE6TrZW280cRpRetzVKE4uKFP
m5tnBuL+/PJ7Ngqg2mwiDPRNUb1sMKt0LYZDVg83t+7zeeNvcN6g5AEBHAci
k7Yk/n6Xk7DbeHm2uWce48TdCb/wL3j43Y4fIWTCwEtgk2FOXVLwYYkT92K+
m3e3DRcvTHDR0aBtAd9tBV3JCWrb7FCJBHRRto2eiWjQlSJIrKlr67lAS7Q9
bMbh1fV3+3iZ7hA6T1M8HqbEv6OCU0wqJb5iCU/pQwD8lNR/apFuTRJS0kl7
CZYwrwDr6XMOgj69olrOn5DHq3pSx6SuU/PLH46QoXpldZ0fPINi++5dOQI8
jk6WX+hzLu42gFffsjKhIc61qH9kNu1dTrgYUq4VTwPf2HPC3vzG1UYV7UVJ
xnhrwhpttVV7fc8iYIYoLqAdBKQi6Y5pqyui8cA8xcBGmWmaep1AEXPPD8/U
WmddiTRBjce5Wbmb0UOPk9bTE/rM2XWKah0gITjD402jviOw1+Ptqsv17hEM
279sjK6zXIAazQYS44cRgw1xY268nNKhYh02i6BO34Yh2rqfgGktaqsRUqAc
yZE6iwRL61ptRGQrbPslGosuSRvoxCWTFWL9VJ75yt0PyPbNIXXVZKJlrdeb
cGHuFP+9NE6RJCFTXH3FBOHBx2MdhBfUgvCkr6FXDuQsrqR/WT2vWsXC3k+/
dAUbldweFnAscBGpmYhbZA07zq13XFOHa0I094AbbWx0POtZXHkIK8/MdO7q
TSH1egdxyV9eplg7h+O2tzp+0LHtOCc0tH43yVRKrVak6wYWxwOaDppBNi10
hRERpTENWHrUkPEIhuGoP1C0QchHY61ntfAXUd2yhMYFR3Nm02n7WDKzKNBG
KmtsBTKryULAZglpw+aonhWsOhjFgwGWzuEWOXzJT3YBtadFyVJqoW281G6W
/aQakfHRKB1Mslj0NFbp8I5OqV6Je+UpCgPRxCRW+Q06dki/gJsQY9gGDq23
i7JJMAx7OTGIQW1UOMfQZikbA4tElTrQoOLCEfXWu6LseOzjoEkWs9WAmD9u
XxYhe8qpI3M+pYsc51SYCftACNAe54BJbfialN9l475e8SsmzvFF1+JSa6aJ
SvhzQ0/DwFQzpOrIcGtgxjQGbc6pgBpr5S8EWo+WVSwbNpfENcRtOmG3WNaZ
NusvjSpRV70FAZeVNgnOT492dtu6O8qKuGwwer2N4Lf1kSIU/Prs/Tf1blCP
3GbexW4K3CudrdT3HgQ+GcNmG67NnDNPvWDyE1PT0nBusdPQHKbPjO86CrAW
+Mwt5GYrYmBMNgLtoCQU0kkFYeC5VWrVaQG7I3TAYIIn4meLao3BegJgxXDd
wzxOZLeujwYfJzu+2BEwtJ95T+CKWyjR9rmzh4nrF2jYxotYaiDgytp9DCPG
9bQsejRHpRBaBTrHABm59ItEVmXKyYIEmxel4eGavYZiSiOexSoHZ8lawDM4
uSmO7QFK8DeWO19XvSZE1yQJDh/kMAzjYbQluAb8DBXiRe6J2EtN7Ci8WkIi
de4s0j4pF3peb8ReQxteqV639OukdhIY0M3H2lB6XLQLwBO0ylyD9tFGsggP
IJeF3QzjREQjnJJQV9fPjnkFxbSgPAV8Ac3MHmnqRUgro3r0i4irxkIIDCVO
3KQDUzyfHIpsKtL3vJKXYX0Bp1iOQEogugUKrKTYUMCr0L3S0YiWYiEEMXel
AfC8UYhHTNYeOlvWbosoHCfYOFffCOR6eYy6OKxpL0pxFEDHM+lMjN7RR+HA
FeKwwZzludq6zPSSg9v8Qg54CAFXrrB4ugxIbGuMSX2xlq4EEXgetmJlDuei
Doa/bGEHEnhDuw6pdS9rLn6xtSOmjDGXCkUPzp07vnCq43uxnF1jFQ9yz+uy
FWTw1LFxtYLNLR0qR+/44XK+9diU5HAKYHKmkVP03QNpQ3FoqqpRYdJ25BSV
OXd0GpleWXh0BNepW10NoYSwFj5tJEz87OCkpQvG4J9kWgLCNciu9VCPpKac
K93giJwV5DrraBRdgs5xfVqfEyvhvhiu5xEnemh1Z5lIUyBsAAN6RKHX+wLV
bNEN9Jg2pal+RhXXA6bDneKMezkKb9tcTq30HGEk7hqHMiWdpo7jOVAV1/My
DAqXIObOd8r6dtFsmkfcKfHc8yQTM08yMdHgokje7idhPKZXUEcv9dJA+LW2
+zzi8kMRJaUIB+XqebrNA1INtNBWEc6qR4FSFYc4u5sNSCVKVfdFGwIE6QBI
scTOatiDLfO4t5wz0iStp6Cvx1BRjVL7psYfgN9PamNRzzkKjVccwInqdYC9
lK/9g7bNV6icsEu8dDUf30YnlsIQrSFiZLNZGOy2pLq6poeJlXeFrumyplSU
Fsm+9JKY30rCmj3cdhGeFdMwpzy89iVpalpgPd1S83bH0eX6uiQtEvp+Hg7L
wI+rYGlLLmUhSP749MWR55h2qt1rKxD33+VkywKZ/UwX6ZW2Rd4ZuumrVfas
C2wFRuw1Wp3LULbn9UIImqVNp3hxi1DZxIIs28iRFRbfnFQt7Qzmgl2BuwKM
Opm5SqdXt4HDV0gAEdM0eZzh3E1/QFClpAee2LCdUzYuw26lqaDJnDY7q3X7
88wDkwTZLmpNyyj1ZD1dNwYE5CRa8fHDeFJRwjUqLhkNyG9n7DM+NzdYH3CS
UR2lqHIUq6IJQhhNDNfMlzgLVmI5oiEQFkDap9k1PozluhqKWgc1Ec7vIx5X
704grjkjXhXMASX5WIsa2qcmKqPFT31vwpRLY1NK48HO8U6TEVM7FI64PM5p
dAE0UzvdSJ4eZP3p2DW+wS/2IW3Jtv15I+7kywiyhBbLyiTFkh5hptCP0kvi
YoTuztncpkDkcZMlHtjeQhW3G6xe3DyOC87zvM39i11cZD1B35XYUQiDWH50
KrxQkTJTWcJc7J+VD66fPfgekMPjD4YvT/Jr4StL/FntsD8G9RQ5scUg/StA
rtufetB/kUZtEuCkl+9iwMZgVeRX5HVjR4XE6Nni/dITAeSMJJkSiHWreak/
TeDUykxg+hmjatiRLj1YZ5UiAST5d4RMU5fGjXPdiIebjaGb4bpWVGiXdo3m
KEn/XQExznbXY6CQKnVdaxoIg925gzG3hlcsI8vXzpiV7Tt3yBWDhxzgdu6u
ddZIKqj6DoO5zkIVD368yZ9KfSZ+bOwywa7aH11HLXeX+NHtLSGo/iO2lRj1
3jxc66Uv4xfxwaejvZ1r+m/3oDgYH6/102dJb3y8dfCBRN8sfrX68Oggvo7f
P3n9+d3Gs0n/6emkt74JLz97+/7N49XwyevZwf7jl2dnj0bv1uml46S/cRQf
7j4r3789zXrrp/vw7yh88+nzwYfJ/YPxVjJ4OrjqjwscpHz3htUUUCxfrx6+
eZYMnuzjy7P3b94n/fHr6bv1V/jg+HhvMHr3ef/6Xby69uLJMS/w8Pzl5+PP
B+W781frx7PV6/fnO7N3H559OFp/uXr8+TIenl3HMMiH8O2jyfs3W6sH9NaH
LD7eGB2+eXqaHl0ev32xN7h8cT549WZ/cn769FF8uvf648txmb1/ffrp5fnF
59ePWc85G7yaXPXXB4/6a6/i4UuCrHTm+HFOX45dDINu73Lw0TbwpTZVu2V3
1550vzNt5KpOvf/W3TMDp13InTsYf25to8u2h0RDRpx/p57sn6u7+l7qCxY8
BQUCPdnejQgqeRom9aLWmtAx1fzkH4b94u/fJKZhX/LtT39m16V/VBvF1U70
pwo2bHRMiIZaJiyQIKA55JRzLIJKbNF208HKQD8F82Me6EiDL0sox6Fwxk1w
7q+3ANTaGcpBKGk6W/rq44eM/8eGzGxePXv47vH05POri8Hh5Zt3z4Ybzz8O
j48e9M/TR5OND28//bqYGT75ze2tB07MjFvnaxmbga5ohkknU+njgpxT+gML
36w1p9WdUuqtAqjupW7xEjaoLxgfgMJ3ipKCCNanJ7vBIEL7moSs3Z5u/v2a
2/49G0TfpuPxk9HD99f748Hhswd7Rf/58fnl+ceT3vH14fHxow/Ts8/hk4ev
J+vPn5TPn+WWdnnnTQdxeZYev4kH6/2r6/3X6etPD8NHH8PrdBzvHsd7F5ON
i1eDy72T8+fHa8eVxskGQ6hWVR2ZGuqeYYFQxCcEOaicEUa/YZ+MsjmevjmS
vBVIsX+3r40XNc8NUdNk5hV5cXu4zGngYlK7vUYegV/4pXNrbqWWkF4o7CuG
XknHzbX0+5N/A5i2qb7yU7V5mM1rbkpmdo72hmzzhkTlwI++dYJUdrkllmka
hodV6er0p4L15n5si9H/Kky9vt9Ip8dOB20h1m4vaaHctnX0BTmsuYiS6Vkd
SjWi2xLef3YVx58vgU7f/C3dxe0gtS7j9qvGbuPydWPP8WqDMd80xyr2dWYt
vttqDV1x5I4jDy71hKsWP/TKEaotetw8I0vjoDXd5TwemO5cMIG8YSdoeSEC
gVNpUkKwyOC208dIpyQaXOjcGZyCs5XIR5my0+kczbmqjMKxjtWK0Ug8mZYc
nRYXKvBc2p3g/wFgWrd0b8QAAA==

-->

</rfc>

