<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.3.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-zehavi-oauth-app2app-browserless-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Native OAuth App2App">OAuth 2.0 App2App Browserless Flow</title>
    <seriesInfo name="Internet-Draft" value="draft-zehavi-oauth-app2app-browserless-01"/>
    <author fullname="Yaron Zehavi">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>yaron.zehavi@rbinternational.com</email>
      </address>
    </author>
    <author fullname="Henrik Kroll">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>henrik.kroll@rbinternational.com</email>
      </address>
    </author>
    <author fullname="Grese Hyseni">
      <organization>Raiffeisen Bank International</organization>
      <address>
        <email>grese.hyseni@rbinternational.com</email>
      </address>
    </author>
    <date year="2025" month="May" day="09"/>
    <area>Security</area>
    <workgroup>Web Authorization Protocol</workgroup>
    <keyword>native-apps</keyword>
    <keyword>oauth</keyword>
    <keyword>app2app</keyword>
    <keyword>browserless</keyword>
    <abstract>
      <?line 90?>

<t>This document describes a protocol enabling native apps from different app publishers, using the App2App pattern to act as OAuth Client And Authorization Server, native browser-less user navigation.</t>
      <t>The native experience is also retained when the Client uses any number of brokers to federate across trust networks, while retaining highest levels of security.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://yaron-zehavi.github.io/oauth-app2app-browserless/draft-zehavi-oauth-app2app-browserless.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-zehavi-oauth-app2app-browserless/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Authorization Protocol Working Group mailing list (<eref target="mailto:oauth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/oauth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/oauth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/yaron-zehavi/oauth-app2app-browserless"/>.</t>
    </note>
  </front>
  <middle>
    <?line 96?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document, OAuth 2.0 App2App Browserless Flow (Native App2App), discusses the <xref target="App2App"/> pattern where two applications act as OAuth Client and Authorization Server respectively, to natively authenticate and authorize an end-user.</t>
      <t>It addresses the challenges introduced when a web browser is involved in OAuth flows through one or more Brokering Authorization Servers, which are needed because Client App is not an OAuth client of the User-Interacting Authorization Server.</t>
      <t>Since no app owns OAuth Brokers' urls, App2App flows involving brokers require using a web browser, which degrades the user experience.</t>
      <t>This document presents a protocol enabling native App2App <strong>browser-less</strong> navigation, through any number of brokers, without compromising on any security property.</t>
      <section anchor="difference-from-openidnative-sso">
        <name>Difference from <xref target="OpenID.Native-SSO"/></name>
        <t><xref target="OpenID.Native-SSO"/> also offers a native SSO flow across applications without requiring the browser. However, it is dealing with the specific sub-case when both apps are published by the same issuer and leverage this fact to share information.</t>
      </section>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>In addition to the terms defined in referenced specifications, this document uses
the following terms:</t>
        <dl>
          <dt>"OAuth":</dt>
          <dd>
            <t>In this document, "OAuth" refers to OAuth 2.0, <xref target="RFC6749"/> and <xref target="RFC6750"/> as well as <xref target="OpenID"/>, both in their <strong>authorization code flow</strong>.</t>
          </dd>
          <dt>"PKCE":</dt>
          <dd>
            <t>Proof Key for Code Exchange (PKCE) <xref target="RFC7636"/>, a mechanism
to prevent various attacks on OAuth authorization codes.</t>
          </dd>
          <dt>"OAuth Broker":</dt>
          <dd>
            <t>A component acting as an Authorization Server for its clients, as well as an OAuth Client towards Downstream Authorization Servers.
Brokers are used to facilitate a trust relationship when there is no direct relation between an OAuth Client and the final Authorization Server where end-user authenticates and authorizes.
Brokers are an established pattern for establishing trust in federation use cases, such as in Academia and in the business world across corporations.
Brokers may be replaced in the future with dynamic trust establishment leveraging <xref target="OpenID.Federation"/>.</t>
          </dd>
          <dt>"Client App":</dt>
          <dd>
            <t>Native app implementing <xref target="RFC8252"/> as OAuth client of Primary Broker, and whose redirect_uri is claimed as a deep link.</t>
          </dd>
          <dt>"Primary Broker":</dt>
          <dd>
            <t>An OAuth Broker serving as Authorization Server of Client App.
And also an OAuth client of a Downstream Authorization Server.
Primary Broker performs additional handling for App2App use-case, covered in <xref target="protocol-flow"/>.</t>
          </dd>
          <dt>"Downstream Authorization Server":</dt>
          <dd>
            <t>An Authorization Server which may be a <em>Secondary Broker</em> or a <em>User-Interacting Authorization Server</em>.</t>
          </dd>
          <dt>"Secondary Broker":</dt>
          <dd>
            <t>A Broker redirecting the flow, which does not perform user authentication and authorization.</t>
          </dd>
          <dt>"User-Interacting Authorization Server":</dt>
          <dd>
            <t>The Authorization Server which interacts with end-user to perform authentication and authorization. May or may not offer App2App via a native app claiming it's urls as deep links.
Such app may or may not be installed on end-user's device.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="challenge-of-app2app-with-brokers">
      <name>Challenge of App2App with Brokers</name>
      <section anchor="app2app-with-brokers-requires-a-web-browser">
        <name>App2App with brokers requires a web browser</name>
        <figure anchor="app2app-w-brokers-and-browser">
          <name>App2App with brokers and browser</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="696" viewBox="0 0 696 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,320" fill="none" stroke="black"/>
                <path d="M 32,64 L 32,128" fill="none" stroke="black"/>
                <path d="M 32,224 L 32,304" fill="none" stroke="black"/>
                <path d="M 120,136 L 120,160" fill="none" stroke="black"/>
                <path d="M 152,64 L 152,128" fill="none" stroke="black"/>
                <path d="M 152,224 L 152,304" fill="none" stroke="black"/>
                <path d="M 200,96 L 200,152" fill="none" stroke="black"/>
                <path d="M 200,168 L 200,256" fill="none" stroke="black"/>
                <path d="M 216,128 L 216,192" fill="none" stroke="black"/>
                <path d="M 296,128 L 296,192" fill="none" stroke="black"/>
                <path d="M 360,128 L 360,192" fill="none" stroke="black"/>
                <path d="M 432,128 L 432,192" fill="none" stroke="black"/>
                <path d="M 496,128 L 496,224" fill="none" stroke="black"/>
                <path d="M 560,232 L 560,288" fill="none" stroke="black"/>
                <path d="M 640,128 L 640,224" fill="none" stroke="black"/>
                <path d="M 656,96 L 656,256" fill="none" stroke="black"/>
                <path d="M 688,32 L 688,320" fill="none" stroke="black"/>
                <path d="M 8,32 L 688,32" fill="none" stroke="black"/>
                <path d="M 32,64 L 152,64" fill="none" stroke="black"/>
                <path d="M 200,96 L 656,96" fill="none" stroke="black"/>
                <path d="M 32,128 L 152,128" fill="none" stroke="black"/>
                <path d="M 216,128 L 296,128" fill="none" stroke="black"/>
                <path d="M 360,128 L 432,128" fill="none" stroke="black"/>
                <path d="M 496,128 L 640,128" fill="none" stroke="black"/>
                <path d="M 120,160 L 208,160" fill="none" stroke="black"/>
                <path d="M 304,160 L 352,160" fill="none" stroke="black"/>
                <path d="M 440,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 216,192 L 296,192" fill="none" stroke="black"/>
                <path d="M 360,192 L 432,192" fill="none" stroke="black"/>
                <path d="M 32,224 L 152,224" fill="none" stroke="black"/>
                <path d="M 496,224 L 640,224" fill="none" stroke="black"/>
                <path d="M 200,256 L 552,256" fill="none" stroke="black"/>
                <path d="M 568,256 L 656,256" fill="none" stroke="black"/>
                <path d="M 160,288 L 560,288" fill="none" stroke="black"/>
                <path d="M 32,304 L 152,304" fill="none" stroke="black"/>
                <path d="M 8,320 L 688,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="496,160 484,154.4 484,165.6" fill="black" transform="rotate(0,488,160)"/>
                <polygon class="arrowhead" points="360,160 348,154.4 348,165.6" fill="black" transform="rotate(0,352,160)"/>
                <polygon class="arrowhead" points="216,160 204,154.4 204,165.6" fill="black" transform="rotate(0,208,160)"/>
                <polygon class="arrowhead" points="168,288 156,282.4 156,293.6" fill="black" transform="rotate(180,160,288)"/>
                <g class="text">
                  <text x="396" y="84">Mobile</text>
                  <text x="456" y="84">Browser</text>
                  <text x="76" y="100">Client</text>
                  <text x="120" y="100">App</text>
                  <text x="256" y="164">Primary</text>
                  <text x="560" y="164">User-</text>
                  <text x="136" y="180">Authorization</text>
                  <text x="252" y="180">Broker</text>
                  <text x="328" y="180">Auth.</text>
                  <text x="464" y="180">Auth.</text>
                  <text x="564" y="180">Authenticating</text>
                  <text x="128" y="196">Request</text>
                  <text x="324" y="196">Req.</text>
                  <text x="460" y="196">Req.</text>
                  <text x="568" y="196">Authorization</text>
                  <text x="392" y="212">Secondary</text>
                  <text x="564" y="212">Server</text>
                  <text x="384" y="228">Brokers</text>
                  <text x="96" y="260">User-</text>
                  <text x="92" y="276">Authenticating</text>
                  <text x="96" y="292">App</text>
                  <text x="260" y="308">Deep</text>
                  <text x="300" y="308">Link</text>
                  <text x="324" y="340">Mobile</text>
                  <text x="380" y="340">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+------------------------------------------------------------------------------------+
|                                                                                    |
|  +--------------+                                                                  |
|  |              |                           Mobile Browser                         |
|  |  Client App  |     +--------------------------------------------------------+   |
|  |              |     |                                                        |   |
|  +--------------+     | +---------+       +--------+       +-----------------+ |   |
|             |         | |         |       |        |       |                 | |   |
|             +---------->| Primary |------>|        |------>|     User-       | |   |
|         Authorization | | Broker  | Auth. |        | Auth. | Authenticating  | |   |
|           Request     | +---------+ Req.  +--------+ Req.  |  Authorization  | |   |
|                       |                   Secondary        |     Server      | |   |
|  +--------------+     |                   Brokers          +-----------------+ |   |
|  |              |     |                                            |           |   |
|  |     User-    |     +--------------------------------------------|-----------+   |
|  |Authenticating|                                                  |               |
|  |      App     |<-------------------------------------------------+               |
|  +--------------+           Deep Link                                              |
+------------------------------------------------------------------------------------+
                                     Mobile Device
]]></artwork>
          </artset>
        </figure>
        <t>Since OAuth Brokers reside on web domains which no native app claims as Deep Links, OAuth requests to Brokers and responses to Broker's redirect_uri will be handled by a web browser.</t>
      </section>
      <section anchor="impact-of-using-a-web-browser">
        <name>Impact of using a web browser</name>
        <t>Using a web browser downgrades the user experience in several ways. The browser may be noticed by end-user as it is loading urls and redirecting to native apps.</t>
        <t>The browser may prompt end-user for consent before opening deep links, introducing additional friction.</t>
        <t>App developers have limited control as to which browser will be opened on the return redirect to the Broker, so any cookies used to bind session identifiers (nonce, state or PKCE verifier) to the user agent may be lost, causing the flow to break.</t>
        <t>Finally, the browser may be left after the flow ends with "orphan" browser tabs used for redirection. While these do not impact the process directly, they can be seen as clutter which degrades the overall UX's cleanliness.</t>
      </section>
    </section>
    <section anchor="app2web">
      <name>App2Web</name>
      <figure anchor="app2web-w-brokers">
        <name>App2Web with brokers</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="368" width="664" viewBox="0 0 664 368" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,336" fill="none" stroke="black"/>
              <path d="M 24,64 L 24,144" fill="none" stroke="black"/>
              <path d="M 88,152 L 88,176" fill="none" stroke="black"/>
              <path d="M 120,64 L 120,144" fill="none" stroke="black"/>
              <path d="M 136,112 L 136,168" fill="none" stroke="black"/>
              <path d="M 136,184 L 136,320" fill="none" stroke="black"/>
              <path d="M 152,144 L 152,208" fill="none" stroke="black"/>
              <path d="M 232,144 L 232,208" fill="none" stroke="black"/>
              <path d="M 296,144 L 296,208" fill="none" stroke="black"/>
              <path d="M 384,144 L 384,208" fill="none" stroke="black"/>
              <path d="M 448,144 L 448,240" fill="none" stroke="black"/>
              <path d="M 464,240 L 464,304" fill="none" stroke="black"/>
              <path d="M 600,240 L 600,304" fill="none" stroke="black"/>
              <path d="M 616,144 L 616,240" fill="none" stroke="black"/>
              <path d="M 640,112 L 640,320" fill="none" stroke="black"/>
              <path d="M 656,32 L 656,336" fill="none" stroke="black"/>
              <path d="M 8,32 L 656,32" fill="none" stroke="black"/>
              <path d="M 24,64 L 120,64" fill="none" stroke="black"/>
              <path d="M 136,112 L 640,112" fill="none" stroke="black"/>
              <path d="M 24,144 L 120,144" fill="none" stroke="black"/>
              <path d="M 152,144 L 232,144" fill="none" stroke="black"/>
              <path d="M 296,144 L 384,144" fill="none" stroke="black"/>
              <path d="M 448,144 L 616,144" fill="none" stroke="black"/>
              <path d="M 88,176 L 144,176" fill="none" stroke="black"/>
              <path d="M 240,176 L 288,176" fill="none" stroke="black"/>
              <path d="M 392,176 L 440,176" fill="none" stroke="black"/>
              <path d="M 152,208 L 232,208" fill="none" stroke="black"/>
              <path d="M 296,208 L 384,208" fill="none" stroke="black"/>
              <path d="M 448,240 L 616,240" fill="none" stroke="black"/>
              <path d="M 464,304 L 600,304" fill="none" stroke="black"/>
              <path d="M 136,320 L 640,320" fill="none" stroke="black"/>
              <path d="M 8,336 L 656,336" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="448,176 436,170.4 436,181.6" fill="black" transform="rotate(0,440,176)"/>
              <polygon class="arrowhead" points="296,176 284,170.4 284,181.6" fill="black" transform="rotate(0,288,176)"/>
              <polygon class="arrowhead" points="152,176 140,170.4 140,181.6" fill="black" transform="rotate(0,144,176)"/>
              <g class="text">
                <text x="76" y="100">Client</text>
                <text x="356" y="100">Mobile</text>
                <text x="416" y="100">Browser</text>
                <text x="72" y="116">App</text>
                <text x="192" y="180">Primary</text>
                <text x="336" y="180">Secondary</text>
                <text x="528" y="180">User-</text>
                <text x="80" y="196">Authorization</text>
                <text x="188" y="196">Broker</text>
                <text x="264" y="196">Auth.</text>
                <text x="336" y="196">Brokers</text>
                <text x="416" y="196">Auth.</text>
                <text x="532" y="196">Authenticating</text>
                <text x="56" y="212">Request</text>
                <text x="260" y="212">Req.</text>
                <text x="412" y="212">Req.</text>
                <text x="528" y="212">Authorization</text>
                <text x="540" y="228">Server</text>
                <text x="528" y="260">User-</text>
                <text x="532" y="276">Authenticating</text>
                <text x="520" y="292">Web</text>
                <text x="548" y="292">UI</text>
                <text x="324" y="356">Mobile</text>
                <text x="380" y="356">Device</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------------------------------------+
|                                                                                |
| +-----------+                                                                  |
| |           |                                                                  |
| |   Client  |                          Mobile Browser                          |
| |    App    | +--------------------------------------------------------------+ |
| |           | |                                                              | |
| +-----------+ | +---------+       +----------+       +--------------------+  | |
|         |     | |         |       |          |       |                    |  | |
|         +------>| Primary |------>|Secondary |------>|       User-        |  | |
|  Authorization| | Broker  | Auth. | Brokers  | Auth. |   Authenticating   |  | |
|  Request      | +---------+ Req.  +----------+ Req.  |   Authorization    |  | |
|               |                                      |        Server      |  | |
|               |                                      +-+----------------+-+  | |
|               |                                        |     User-      |    | |
|               |                                        | Authenticating |    | |
|               |                                        |     Web UI     |    | |
|               |                                        +----------------+    | |
|               +--------------------------------------------------------------+ |
+--------------------------------------------------------------------------------+
                                     Mobile Device
]]></artwork>
        </artset>
      </figure>
      <t>When the user's device does not have an app owning the User-Authenticating Authorization Server's urls as deep links, the flow requires the help of a browser.</t>
      <t>This is the case when the User-Authenticating Authorization Server offers no native app, or when such an app exists but is not installed on the end-user's device.</t>
      <t>This is similar to the flow described in <xref target="RFC8252"/>, and referred to in <xref target="App2App"/> as <strong>App2Web</strong>.</t>
    </section>
    <section anchor="browser-less-app2app-with-brokers">
      <name>Browser-less App2App with Brokers</name>
      <section anchor="flow-diagram">
        <name>Flow Diagram</name>
        <figure anchor="app2app-browserless-w-brokers">
          <name>Browser-less App2App with Brokers</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="392" viewBox="0 0 392 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,384" fill="none" stroke="black"/>
                <path d="M 24,96 L 24,160" fill="none" stroke="black"/>
                <path d="M 24,304 L 24,368" fill="none" stroke="black"/>
                <path d="M 40,168 L 40,296" fill="none" stroke="black"/>
                <path d="M 72,168 L 72,296" fill="none" stroke="black"/>
                <path d="M 104,168 L 104,224" fill="none" stroke="black"/>
                <path d="M 120,64 L 120,88" fill="none" stroke="black"/>
                <path d="M 120,168 L 120,208" fill="none" stroke="black"/>
                <path d="M 144,96 L 144,160" fill="none" stroke="black"/>
                <path d="M 160,304 L 160,368" fill="none" stroke="black"/>
                <path d="M 264,48 L 264,144" fill="none" stroke="black"/>
                <path d="M 264,192 L 264,272" fill="none" stroke="black"/>
                <path d="M 360,48 L 360,144" fill="none" stroke="black"/>
                <path d="M 360,192 L 360,272" fill="none" stroke="black"/>
                <path d="M 384,32 L 384,384" fill="none" stroke="black"/>
                <path d="M 8,32 L 384,32" fill="none" stroke="black"/>
                <path d="M 264,48 L 360,48" fill="none" stroke="black"/>
                <path d="M 120,64 L 256,64" fill="none" stroke="black"/>
                <path d="M 24,96 L 144,96" fill="none" stroke="black"/>
                <path d="M 152,112 L 256,112" fill="none" stroke="black"/>
                <path d="M 152,128 L 256,128" fill="none" stroke="black"/>
                <path d="M 264,144 L 360,144" fill="none" stroke="black"/>
                <path d="M 24,160 L 144,160" fill="none" stroke="black"/>
                <path d="M 264,192 L 360,192" fill="none" stroke="black"/>
                <path d="M 120,208 L 256,208" fill="none" stroke="black"/>
                <path d="M 104,224 L 256,224" fill="none" stroke="black"/>
                <path d="M 264,272 L 360,272" fill="none" stroke="black"/>
                <path d="M 24,304 L 160,304" fill="none" stroke="black"/>
                <path d="M 24,368 L 160,368" fill="none" stroke="black"/>
                <path d="M 8,384 L 384,384" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="264,224 252,218.4 252,229.6" fill="black" transform="rotate(0,256,224)"/>
                <polygon class="arrowhead" points="264,208 252,202.4 252,213.6" fill="black" transform="rotate(0,256,208)"/>
                <polygon class="arrowhead" points="264,112 252,106.4 252,117.6" fill="black" transform="rotate(0,256,112)"/>
                <polygon class="arrowhead" points="264,64 252,58.4 252,69.6" fill="black" transform="rotate(0,256,64)"/>
                <polygon class="arrowhead" points="160,128 148,122.4 148,133.6" fill="black" transform="rotate(180,152,128)"/>
                <polygon class="arrowhead" points="128,168 116,162.4 116,173.6" fill="black" transform="rotate(270,120,168)"/>
                <polygon class="arrowhead" points="112,168 100,162.4 100,173.6" fill="black" transform="rotate(270,104,168)"/>
                <polygon class="arrowhead" points="80,296 68,290.4 68,301.6" fill="black" transform="rotate(90,72,296)"/>
                <polygon class="arrowhead" points="48,168 36,162.4 36,173.6" fill="black" transform="rotate(270,40,168)"/>
                <g class="text">
                  <text x="192" y="52">(8)</text>
                  <text x="192" y="100">(1)</text>
                  <text x="312" y="100">Primary</text>
                  <text x="84" y="116">Client</text>
                  <text x="308" y="116">Broker</text>
                  <text x="80" y="132">App</text>
                  <text x="192" y="148">(2)</text>
                  <text x="192" y="196">(3)</text>
                  <text x="312" y="228">Secondary</text>
                  <text x="192" y="244">(7)</text>
                  <text x="304" y="244">Brokers</text>
                  <text x="24" y="276">(6)</text>
                  <text x="88" y="276">(4)</text>
                  <text x="96" y="324">User-</text>
                  <text x="92" y="340">Authenticating</text>
                  <text x="192" y="340">(5)</text>
                  <text x="96" y="356">App</text>
                  <text x="172" y="404">Mobile</text>
                  <text x="228" y="404">Device</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------------------------------------------+
|                     (8)       +-----------+  |
|             +---------------->|           |  |
|             |                 |           |  |
| +--------------+    (1)       |  Primary  |  |
| |    Client    |------------->|  Broker   |  |
| |     App      |<-------------|           |  |
| |              |    (2)       +-----------+  |
| +--------------+                             |
|   ^   |   ^ ^                                |
|   |   |   | |       (3)       +-----------+  |
|   |   |   | +---------------->|           |  |
|   |   |   +------------------>| Secondary |  |
|   |   |             (7)       | Brokers   |  |
|   |   |                       |           |  |
|(6)|   |(4)                    +-----------+  |
|   |   v                                      |
| +----------------+                           |
| |      User-     |                           |
| | Authenticating |  (5)                      |
| |       App      |                           |
| +----------------+                           |
+----------------------------------------------+
                  Mobile Device
]]></artwork>
          </artset>
        </figure>
        <ul spacing="normal">
          <li>
            <t>(1) Client App uses HTTP to call Primary Broker's authorization endpoint with an authorization request including <em>app2app</em> scope.</t>
          </li>
          <li>
            <t>(2) Primary Broker prepares authorization request for Downstream Authorization Server including scope app2app:<em>client_app_deep_link</em></t>
          </li>
          <li>
            <t>(3) Client App loops through Brokers, natively calling their authorization endpoint over HTTP using previously obtained authorization request urls, and processing their HTTP 3xx redirect directives, until a deep link owned by an app on the device is reached.</t>
          </li>
          <li>
            <t>(4) Client App natively invokes User-Authenticating App via its deep link.</t>
          </li>
          <li>
            <t>(5) User-Authenticating App authenticates user and authorizes the request. It identifies app2app mode and uses client_app_deep_link to override the request's redirect_uri.</t>
          </li>
          <li>
            <t>(6) User-Authenticating App natively invokes Client App using client_app_deep_link, handing it redirect_uri response.</t>
          </li>
          <li>
            <t>(7) Client App loops through Brokers, starting from the redirect_uri it received from User-Authenticating App. It natively calls them using HTTP traversing through their redirect directives, until Primary Broker redirects to Client App's own deep link.</t>
          </li>
          <li>
            <t>(8) Client App exchanges code for tokens.</t>
          </li>
        </ul>
      </section>
      <section anchor="protocol-flow">
        <name>Protocol Flow</name>
        <section anchor="client-app-calls-primary-broker">
          <name>Client App calls Primary Broker</name>
          <t>Client App calls Primary Broker's authorization_endpoint to initiate an authorization code flow, it <bcp14>SHALL</bcp14> indicate App2App flow using the dedicated scope app2app.</t>
          <t>Client App's redirect_uri <bcp14>SHALL</bcp14> be claimed as a deep link and will be referred to as <em>client_app_deep_link</em>.</t>
        </section>
        <section anchor="primary-broker-returns-authorization-request-to-downstream-authorization-server">
          <name>Primary Broker returns authorization request to Downstream Authorization Server</name>
          <ul spacing="normal">
            <li>
              <t>Primary Broker <bcp14>SHALL</bcp14> validate Client's request and prepare an authorization request to Downstream Authorization Server's authorization_endpoint.</t>
            </li>
            <li>
              <t>Primary Broker <bcp14>SHALL</bcp14> provide <em>client_app_deep_link</em> to Downstream Authorization Server as a suffix to the dedicated scope app2app. The combined scope is: app2app:<strong>client_app_deep_link</strong>.</t>
            </li>
            <li>
              <t>Primary Broker <bcp14>SHALL</bcp14> respond with HTTP 302 with the authorization request url towards Downstream Authorization Server in the Location header.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-app-traverses-brokers-with-request">
          <name>Client App traverses Brokers with request</name>
          <t>Client App <bcp14>SHALL</bcp14> use OS mechanisms to detect if the authorization request URL it received is handled by an app installed on the device.
If so, Client App <bcp14>SHALL</bcp14> natively invoke the app claiming the url to process the authorization request. This achieves native navigation across applications.
If an app handling the authorization request URL is not found, Client App <bcp14>SHALL</bcp14> natively call the authorization request URL using HTTP GET and processe the response:</t>
          <ul spacing="normal">
            <li>
              <t>If the response is successful (HTTP Code 2xx), it is assumed to be the User-Interacting Authorization Server. This means the Client App "over-stepped" and <bcp14>MUST</bcp14> downgrade to App2Web.</t>
            </li>
            <li>
              <t>If the response is a redirect instruction (HTTP Code 3xx + Location header), a Secondary Broker was reached and Client App <bcp14>SHALL</bcp14> repeat the logic previously described:  </t>
              <ul spacing="normal">
                <li>
                  <t>Check if an app owns the obtained url, and if so natively invoke it.</t>
                </li>
                <li>
                  <t>Otherwise natively call the obtained url and analyze the response.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Handle error response (HTTP 4xx / 5xx) for example by displaying the error.</t>
            </li>
          </ul>
          <t>As the Client App traverses through Brokers, it <bcp14>SHALL</bcp14> maintain a list of all the domains it traverses, which serves later as the Allowlist when traversing the response.</t>
          <section anchor="secondary-brokers">
            <name>Secondary Brokers</name>
            <t>Secondary Brokers engaged in the journey <bcp14>MUST</bcp14> retain structured scope app2app:<strong>client_app_deep_link</strong> in downstream authorization requests they create.</t>
          </section>
          <section anchor="downgrade-to-app2web">
            <name>Downgrade to App2Web</name>
            <t>If Client App reaches a User-Interacting Authorization Server with no app handling its urls, it may be impossible to relaunch the last authorization request URL on the browser as it might have included a single use request_uri which by now has been used and is therefore invalid.</t>
            <t>In such a case the Client App <bcp14>MUST</bcp14> start over, generating a new authorization request without App2App indication, which is then launched on the browser.
The remaining flow follows <xref target="RFC8252"/> and is therefore not further elaborated in this document.</t>
          </section>
        </section>
        <section anchor="processing-by-user-interacting-authorization-server">
          <name>Processing by User-Interacting Authorization Server:</name>
          <t>The User-Interacting Authorization Server <bcp14>SHALL</bcp14> handle the authorization request using its native app:</t>
          <ul spacing="normal">
            <li>
              <t>Native app authenticates end user and authorizes the request.</t>
            </li>
            <li>
              <t>The <em>client_app_deep_link</em> provided in the strcutured scope, <bcp14>SHALL</bcp14> override the request's original redirect_uri:  </t>
              <ul spacing="normal">
                <li>
                  <t>User-Interacting Authorization Server's native app <bcp14>SHALL</bcp14> validate that an app owning <em>client_app_deep_link</em> is on the device</t>
                </li>
                <li>
                  <t>If so it <bcp14>SHALL</bcp14> natively invoke it, handing it the redirect url with its response parameters</t>
                </li>
                <li>
                  <t>If such an app does not exist it is an error and the flow <bcp14>SHALL</bcp14> terminate</t>
                </li>
              </ul>
            </li>
            <li>
              <t>To establish trust towards client_app_deep_link, User-Interacting Authorization Server <bcp14>MAY</bcp14> use mechanisms outside the scope of this document, or OpenID Federation:  </t>
              <ul spacing="normal">
                <li>
                  <t><bcp14>SHALL</bcp14> strip url path from <em>client_app_deep_link</em> (retaining the domain).</t>
                </li>
                <li>
                  <t><bcp14>SHALL</bcp14> add url path /.well-known/openid-federation and perform trust chain resolution.</t>
                </li>
                <li>
                  <t><bcp14>SHALL</bcp14> inspect Client's metadata for redirect_uri's and validate <em>client_app_deep_link</em> is included.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="client-app-traverses-brokers-in-reverse-order">
          <name>Client App traverses Brokers in reverse order</name>
          <t>Client App is natively invoked by User-Interacting Authorization Server App, with the request's redirect_uri.</t>
          <t>Client App <bcp14>MUST</bcp14> validate this url, and any url subsequently obtained through a 3xx redirect instruction from the brokers it traverses, against the Allowlist generated for this flow, and <bcp14>MUST</bcp14> fail if any url is not included in the Allowlist.</t>
          <t>Client App <bcp14>SHALL</bcp14> invoke the url it received using HTTP GET:</t>
          <ul spacing="normal">
            <li>
              <t>If the response is a redirect instruction (HTTP Code 3xx + Location header), Client App <bcp14>SHALL</bcp14> repeat the logic and proceed to call obtained urls until reaching its own redirect_uri (<em>client_app_deep_link</em>).</t>
            </li>
            <li>
              <t><bcp14>SHALL</bcp14> handle any other HTTP code (2xx / 4xx / 5xx) as a failure.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-app-obtains-response">
          <name>Client App obtains response</name>
          <t>Once Client App's own redirect_uri is returned in a redirect 3xx directive, the traversal is complete.</t>
          <t>Client App <bcp14>SHALL</bcp14> proceed according to OAuth to exchange code for tokens, or handle error responses.</t>
        </section>
      </section>
    </section>
    <section anchor="detecting-presence-of-native-apps-owning-urls">
      <name>Detecting Presence of Native Apps Owning Urls</name>
      <t>Native Apps on iOS and Android <bcp14>MAY</bcp14> use OS SDK's to detect if an app owns a url.
The general method is the same - App calls an SDK to open the url as deep link and handles an exception thrown if no matching app is found.</t>
      <section anchor="android">
        <name>Android</name>
        <t>App <bcp14>SHALL</bcp14> invoke Android <xref target="android.method.intent"/> method with FLAG_ACTIVITY_REQUIRE_NON_BROWSER, which throws ActivityNotFoundException if no matching app is found.</t>
      </section>
      <section anchor="ios">
        <name>iOS</name>
        <t>App <bcp14>SHALL</bcp14> invoke iOS <xref target="iOS.method.openUrl"/> method with options <xref target="iOS.option.universalLinksOnly"/> which ensures URLs must be universal links and have an app configured to open them.
Otherwise the method returns false in completion.success</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="oauth-request-forgery-and-manipulation">
        <name>OAuth request forgery and manipulation</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> Client App acts as a confidential OAuth client.</t>
      </section>
      <section anchor="secure-native-application-communication">
        <name>Secure Native application communication</name>
        <t>If Client App uses a Backend it is <bcp14>RECOMMENDED</bcp14> to communicate with it securely:</t>
        <ul spacing="normal">
          <li>
            <t>Use TLS in up to date versions and ciphers.</t>
          </li>
          <li>
            <t>Use DNSSEC.</t>
          </li>
          <li>
            <t>Perform certificate pinning.</t>
          </li>
        </ul>
      </section>
      <section anchor="deep-link-hijacking">
        <name>Deep link hijacking</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that all apps in this specification shall protect their deep links using Android universal links / iOS App Links including the most specific package identifiers to prevent deep link hijacking by malicious apps.</t>
      </section>
      <section anchor="open-redirection">
        <name>Open redirection</name>
        <t>Client App <bcp14>SHALL</bcp14> construct an Allowlist of domains it traverses through while processing the request, used to enforce all urls it later traverses through during response processing.
This mitigates open redirection attacks as urls outside of this Allowlist will be rejected.</t>
        <t>In addition Client App <bcp14>MUST</bcp14> ignore any invocation for response processing which is not in the context of a request it initiated.
It is <bcp14>RECOMMENDED</bcp14> the Allowlist is managed as a single-use object and destructed after each protocol flow ends.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> Client App allows only one OAuth request processing at a time.</t>
      </section>
      <section anchor="authorization-code-theft-and-injection">
        <name>Authorization code theft and injection</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that PKCE is used and that the code_verifier is tied to the Client App instance.</t>
      </section>
      <section anchor="handling-of-cookies">
        <name>Handling of Cookies</name>
        <t>It can be assumed that Authorization Servers will use Cookies to bind security elements (state, nonce, PKCE) to the user agent, and will break if these cookies are later missing.</t>
        <t>Therefore, Client App <bcp14>MUST</bcp14> handle Cookies as a web browser would:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>SHALL</bcp14> store cookies it obtains on HTTP responses.</t>
          </li>
          <li>
            <t><bcp14>SHALL</bcp14> send cookies on subsequent HTTP requests to servers that returned cookies.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC6750">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC7636">
          <front>
            <title>Proof Key for Code Exchange by OAuth Public Clients</title>
            <author fullname="N. Sakimura" initials="N." role="editor" surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Agarwal" initials="N." surname="Agarwal"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>OAuth 2.0 public clients utilizing the Authorization Code Grant are susceptible to the authorization code interception attack. This specification describes the attack as well as a technique to mitigate against the threat through the use of Proof Key for Code Exchange (PKCE, pronounced "pixy").</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7636"/>
          <seriesInfo name="DOI" value="10.17487/RFC7636"/>
        </reference>
        <reference anchor="RFC8252">
          <front>
            <title>OAuth 2.0 for Native Apps</title>
            <author fullname="W. Denniss" initials="W." surname="Denniss"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>OAuth 2.0 authorization requests from native apps should only be made through external user-agents, primarily the user's browser. This specification details the security and usability reasons why this is the case and how native apps and authorization servers can implement this best practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="212"/>
          <seriesInfo name="RFC" value="8252"/>
          <seriesInfo name="DOI" value="10.17487/RFC8252"/>
        </reference>
        <reference anchor="RFC9126">
          <front>
            <title>OAuth 2.0 Pushed Authorization Requests</title>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="D. Tonge" initials="D." surname="Tonge"/>
            <author fullname="F. Skokan" initials="F." surname="Skokan"/>
            <date month="September" year="2021"/>
            <abstract>
              <t>This document defines the pushed authorization request (PAR) endpoint, which allows clients to push the payload of an OAuth 2.0 authorization request to the authorization server via a direct request and provides them with a request URI that is used as reference to the data in a subsequent call to the authorization endpoint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9126"/>
          <seriesInfo name="DOI" value="10.17487/RFC9126"/>
        </reference>
        <reference anchor="OpenID" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0</title>
            <author initials="N." surname="Sakimura">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="M. B." surname="Jones">
              <organization/>
            </author>
            <author initials="B." surname="de Medeiros">
              <organization/>
            </author>
            <author initials="C." surname="Mortimore">
              <organization/>
            </author>
            <date year="2014" month="November"/>
          </front>
        </reference>
        <reference anchor="OpenID.Federation" target="https://openid.net/specs/openid-federation-1_0.html">
          <front>
            <title>OpenID Federation 1.0</title>
            <author initials="R." surname="Hedberg, Ed">
              <organization/>
            </author>
            <author initials="M. B." surname="Jones">
              <organization/>
            </author>
            <author initials="A. A." surname="Solberg">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="G." surname="De Marco">
              <organization/>
            </author>
            <author initials="V." surname="Dzhuvinov">
              <organization/>
            </author>
            <date year="2025" month="March"/>
          </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 anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="App2App" target="https://openid.net/guest-blog-implementing-app-to-app-authorisation-in-oauth2-openid-connect/">
          <front>
            <title>Guest Blog: Implementing App-to-App Authorisation in OAuth2/OpenID Connect</title>
            <author initials="J." surname="Heenan">
              <organization/>
            </author>
            <date year="2019" month="October"/>
          </front>
        </reference>
        <reference anchor="OpenID.Native-SSO" target="https://openid.net/specs/openid-connect-native-sso-1_0.html">
          <front>
            <title>OpenID Connect Native SSO for Mobile Apps</title>
            <author initials="G." surname="Fletcher">
              <organization/>
            </author>
            <date year="2022" month="November"/>
          </front>
        </reference>
        <reference anchor="iOS.method.openUrl" target="https://developer.apple.com/documentation/uikit/uiapplication/open(_:options:completionhandler:)">
          <front>
            <title>iOS open(_:options:completionHandler:) Method</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="iOS.option.universalLinksOnly" target="https://developer.apple.com/documentation/uikit/uiapplication/openexternalurloptionskey/universallinksonly">
          <front>
            <title>iOS method property universalLinksOnly</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="android.method.intent" target="https://developer.android.com/reference/android/content/Intent">
          <front>
            <title>Android Intent Method</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 415?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank the attendees of the OAuth Security Workshop 2025 session in which this was discussed, as well as the following individuals who contributed ideas, feedback, and wording that shaped and formed the final specification:</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7Vc63LbOJb+z6p5B6zyI7Yj0bE76U67ZnrGiXNxdxJnY2ey
vVs7KYiEJLQpUkuQdtR2+ln2WfbJ9lwAEKQo2bm0qhJLJAEcnOuHgwOORqOo
0lWmDsTg5LCuZmI/vi8OF4t9+Ccel8WlUWWmjBHPsuJyEMnxuFQX8PBrWekL
JbiNfX4QJbJS06JcHghTpVGUFkku59B3WspJNfpdzeSFHhUS2owktIF/o3Ez
xuj+XmTq8Vwbo4u8Wi6g5fHTs2dRXs/HqjyIUuj+IEqK3Kjc1OZAVGWtIiDn
u0iWSgJZpyqpS10tB9FlUZ5Py6JewNX3aiyQ0KLUvwPdRS7elEVVJEU2iM7V
Eh5NDyIxEjlNCkkz+JMIxS+WVvwakBtdqLwGeoS4zThC8IQG74EwnU/Fc2yE
1+dSZ3CdRvuHVtUkLsop3pBlMoMbs6pamIPdXXwOLwGJsXtsFy/sMlG71MMu
tpzqalaPoe1SlkVuGb+7lvHYJAPemioYLmwac4exLtZ3sns7Icezag7siCTx
CdkOgwsxqbOMdeVXHFf8J3VDt2CaMrcMPRBvpZ5MlAYNEI9lfi6O80qVOd2U
GT2vmKFEf8zk/KMc6/C5OCnmqyO/UHmpz8UvZZFlXzPyjPqJz7Gf2438vFRG
iRdL6Pur5jzFfuIZ9dM7cpQX5Zy0HPX27bMn3//w4Ef/9eF9+/WH77/73n59
tP9w3379cW+frp4sVH58dEADW+fBl8STIs9VUsHfUom9+D4/IsupAs1yilXA
szqNc1XtmoVKjL0wSrgx/C3VaO/DfdIU6oHsXrwuLhT6AfFoKPbv7z2gW16N
6DMSOge38DoWp/Jcz+tStm/8HINPk2mmlu3rr+LHsfi5yJVpX4erqRKvVKp0
WXTuPYnFq6Ks9BzI9UyJn8GzJYuthz/N3c/mzsQ37ePNK/QD4iEyZv/hesa8
jUHJU+DhdCiepvHtmHAYHwI/iwyb3Y6dz2NxpIimon3jn3Dj91l9ofPiItL5
JFRGG0RabBs8r8EpicdZMYVQMF9kaq7yCr0nPDmqihFGKetxDfNV5xyU9nfb
Ojm4idtTHGo0hqFGOhgJfRiOhH9kONJI5+zl9kdtBd5dz/+fkf8ql3kgupOk
KlCr9/dIrX9sdIlj7Oj09GSTrdlIDE8J4Cfo5FhnCvljvsj6bAw0pmjrWe98
QNDPMlUlM1X2GSoo4z5c1yen8VxB8zTGwd6VWWs+cFvg9a0PB8UCOWsOwFWB
BPD7C5mDfpUH22CF2EPvnFJ1oTLoooxBSplCT7cL2KNGEZKsdmt9riv4H+/r
hK+tHXPmxrS08xNxnQNjSiOzlzo/Nyd5tlyZBs9SLEokplqK1SbfmH71kTx8
VpeZnQfgmV0/bIbDFjwsTKosQPJWEhgb8qo1g0N+gsJLXt2S4bZXJLlUE1Wq
PFG79uouKBV2tcs9RqMRYKmxqUqZVFF0NtNGuGmCnzVJqcfKCIn8I9QkwFTG
GZo7ayUCMSMmZTEXKUbEEhvCNbGo4TEDWmiGojbYoJopD2MXskIuiaoQMLCQ
xsLWJ5nGDmDaHdR2qkrg39CNatHLiHBwDd/gxoWe0rMxzkO5J9VH4IlGFgiY
m8xMIUpVSZ2rVFwCLCCy7LDQETySLwWjW1FMcKBzmAMSat09TDmByGMQ6YIj
BKtFXAuzvJyhlXPnON+Zns7QVWYoGYOdGQuFgULk+1ynoNRRdAfFWxZpnSD5
HSkMxc2LALFlPY59YHsIwjBJbXA+OL+rK3vn0yfPepg8IAIgXgQabHrFIdeI
AyaLDguHzpZD5BEzPVuSb0JvnRDDoL111L/jL1CidIRSA0YcQ/dpCh05WpMZ
GInKp/BTW7Y4UUlxCXDeyh7FqfOLIruA2y7EiAmwA/sBJD+dCYicgNsE4gFk
GkiSAlXPVFh+ELBh1QIyBVGnYqwSCVR6pQTOw5h5gQyxwyV8C2SLpL9DlSQk
CFxcNxLM+VSjOubEeVFc5o7dTKK5K8B3AEFO3Dwnniv26nSyVP9TayCXzavF
HDebVE0BDVjOkp009hB37X2BUDWvNpq7o2lnJzTBnZ3A/oae/b2mBKTByqWo
K4HuHRyHJvKBP/i4MxHvsIHKO3fEkfUtwDbyNVdXKwH506co6r3MRl9gBzi1
PAjOaDvWmltG4ChkDjvnZWcMgKG4VOSNdIUakSpJLMJW9CAahZ7oRMDSeZRI
UCFS33EB98lfopI5Bwl6tuRWsO6A7kwN7EKLQb9RyinYKEppgoYJFmZm2NgD
NXJ3wKAzVc4BwgFUWoJN5WhTmpQOmmDnoJNzpHRCjg/MxUeG1JPLkx/yeF4r
0ClG2MUE1k7FJTEDOzuIIs5PDA4iQIJ5u9nQJi8GPBA5UO/IhiA/u9BB8cBc
7e+H9/E38F9lGf518vz0acjc0+SvdQn6J1u2lRSwKkB57uwAQwZvfnnylOiC
1T6o3i9qSUjsCT719CO4GPAvYguf2uaxcXmFo0gADHhbmznmBwo0igtkw4Us
dVGD6KpKJucG9ZXns0qHiR1rrEUTJYek7+CR0KGye5AYbfo9K1KrwRTZwYBQ
Aq5472MdU1VcyjI14ghdSVUqOe93cXFkHQzpH8g1pbAmE53pivy0jWmlylgX
Znrhg2Sp2PtBaCkR5LqHwE1Wlwq9c74aNUhvNKCh/llyDHLRoBU0TDtqdIjH
GGIq6SzIxTTkmr9OmkrzAa1p1mo4cYFGCUw1NXp89K3iMAE/OdeShmU1E2P0
rBhkIcJnqfMUsBheFNxXQNVcLoETwJVFJhPlu5jUVQ30kmtIl7mcg1dgojyd
ZGXW2JFm78SapemnT6hSTRwihXrtAZgIV0esz5gjYFvqBqo3pZ7LcmlVc0jz
vZwVBmln0X4AD4yyTjKp5zAVVDlwHWohELySebX6YPXOW0EMHHl5YXW8V/RA
STOfOELER366J7TKmzQ7jtoECYgc6B+Nd4OggLSEQIpQSVwYA10gBz0EqUJH
LLerKxf+RuhRmPk3kOB4sEbNMRZbDZFi51QBCk8bencQpMD1W+EH8m/dHqyH
sdN3gnSBC2fhEUGhGMNYHomu5WmKxGnbr+GYt6KOCEH4vYER2vbBcbYxf/S2
lqgb6RGvgJsI7eAPzobCuxfrBdpxsEJhVUaadXXXELxCxfQ6DXZ8Sq4AHp23
Ox5jsAVTBUyaotN31N7F5heaYNQdXPljlGAEDcQeYaAlzTO8GoE1IHoR8NKD
V+9OzwZD/iten9D3t0///d3x26dH+P30xeHLl/5LZJ84fXHy7uVR861p+eTk
1aunr4+4MVwVrUvR4NXhrwM288HJm7Pjk9eHLwfsnsIwj14VBEDTBfFA2KvI
9CO3CiTTePzkzf/9794DMJF/Ayezv7eHAZx/PNr74QH8wHDBo+Ei1/4EYS4j
YK6SJfYCzAQPvICgk3FkMzOwLoHBALi581/Imf8+EH8dJ4u9Bz/ZCzjh1kXH
s9ZF4tnqlZXGzMSeSz3DeG62rnc43ab38NfWb8f34OJf/w6Kp8Ro79Hff4pI
hdy6B12eU2QyEBtiCOe1bnQWAqa9BoiiP/74Q0hpLqbRvdGf8Ln3l+ha/Amf
a+q3Q/K9b9Vvh+RNM7CJO7vcvrnfYKFo+/1ivt/bTO8X8/1abOTvdXDZcfze
2gvBo02/K7Tyt+uVq9drL3SarfQbEPDTtQc01/6Ka926QOFrfb/teIUP2GAK
3/BeHNLrLhwGYQqCSz+9b8E6MQ+0yl+4E7f4yxeuu9Ss40Mfp5tPgxFaD9lQ
vMKHNfqw+nGIt08cPfrw9fp73fke9uul+gX2dt2Zru23LdQvsLRukxYfyDng
xb9+DqmBSLr9bvCTR4hvMM/9mfT/5U+LF7ca37rdI4JXGMSiqwNxx21cX45s
2BsByHDb2Jwv/9ugNzwiGLHPDcQnl35rpdwwk6lThQAPI2hazKXGPBDh1bxY
gZIEHz17jUvSlmzqlO14HIyOeVIskQhu3DXt9dalBlAE6It3Oigp1IrmnOY5
ni8wDwQIoSfpF0XvVi/CXC7z9UlAhGOG1p6ZuJRLExN4d23tkgVwsE6Ypmat
bmz2KytkiqMyqKbJBquPkHXGZubD3jEBuKiabnFxxtUkCL0nmLil3TDoq0Hr
Q58Zpuk2a7xJqRO7XEEt8HsiBtgKNGSwBkBUi3sgZUG5FCCQheyIcnKgrRxC
/Mg1QMN1mfupuayaW0PTunUJ/RbnWhmfWhlrYAdI3dAuaIpOZaKRmq28AN5D
O0q7wJQxEyVACnR/23XPjJ4iL6wkssJUsFaVzY4K5TBxLFia4tr8GWZbKBu/
KsdMTQDoTyq0F9cUOG/XYYOiXID2DXyrSo7tXFAqXqy4+npPex3QiVGgYLRQ
0qya2DEINcG0CTewxAB7JCaLgCGYLML0Qo1Zm75MdUEKmYl3/3EXn1MyzygR
Q2sttPH3avxnots/A9mStw4p/VaIthsev1WfFs1u6vOWADmg04a/6y9Hxo55
PXP/ytlf98loIyLehIn55nUbtTn0swENb8LDfLHTpx26Dwk3ELALjkM0HPbZ
Ap79KNjjvxAYd5Fw2GcIgDcj4BYG7oLgvrlvYFQv6/jThsBf1ee90Yrk7/XI
/bP6XMG29sLX9tmR0TfpEz9YY/nu+FvRucrPtX1+Cx/yZ8SOW81zPcoF9Nag
3BDZIqNDZEto9r0rYmhlJZs8LyEfiLx2r9nhBlKujkb05Wx706XDBj/43BNe
malswRn7BrXSHrO2e/t+L/RzSHB7ty0cPkTYRF3xJg5PUH3UCL/HdeW26lvJ
Wxy1L4HraDQAEDNZOvxFE2zlP4O9laEFu0BayXCP7jeFFsCxnR0rNtqVvOMC
JZetrM3xUUnHkZYAiOZfjnLWYpitR9s99nNvc56FPz+F9683Znz6rrgWfUvW
rb3t5ikXyHwL6sUBEp/ZCahyYardwq+2u8vtPqr6EhVb+5t49VkpSsurf9mu
/0XfbtOi+eco3PpuswSbf7eVoPvXo2PQIoARKy2az9YPjQSbHNGmFi1KulRt
fb9NLbYebPe1WD/zi81c9cP0SHCzDEMtaWLzpsBmW6wG3q2HvZPqaGKjvd96
Hp/vS1a72ZymCQ+RrASzG/0gRbYROYUgqU71eS/Ozt6gt01wgdje9wWX3q7G
AF+/KDS0pr4xRrRu23QNOG5Yi1ISY8eSvyNMUiwgNIzIBXS3l0u1kLTf0tsd
rpZv2C4OhqSB3HmWgx3e9v4A3z9gvP2A8XYHyfiuxYqsKBZNndtjV1rl6+8S
qjSd2mqZNVzBZTbzk/MJWOuCRS7QvhjbGsn+KXKBGgZAu9ZvxqL+vvv4sUmW
2LzBBVZc1GAGWVhOgJjEprssRuEwbWGMxjSZTGYqJVk8aDHBzxZr485BHr2I
wu4HYzVNUMQwIhtc16BdicJ5mFY5is0KETdicVw16R3jZCnmWG2EzUhv+wSL
eoxCKDH3GPTYSQ4Std+vp3aFDy2bwaf6Bh9SrpE3xdu5SJeupHF/uI3eAcYq
iRyqzuOZhMUkOECiNJZq0hNrZkKcbOkwMXpuZ8GmX0osZmKFYzJY8TboW8d+
3ZOU/msmB1zHbei2kjxqTV/Z2jFjC84KxIrnKjecnnVnyxjCXd1p15HgI3fC
3niCbeKi6IYHuk7ugzdngqC60lxy21OYZgtBQBq8Ka5B/FSgG1aaBtXaqeL7
adtJxSGN3Tw29zxWa6qHuNzI5lhD8Ixoudf3xcy2FRFiQnadB4b+bnDAUbTT
7ZIpv5CZxjMTVk53je+UvR15/vWh5OaR18ovXkcSaNEFOoh+/txiSJaBqScT
/dGtbdbJlvL/STEfk/fne9ocNAGqn4qdtdSzM0k5BHNwuL/f1MqujS+3LWt0
lXYvC1ssNFMytfslLWuzjgNs16FTIsIO2bI7phwLBekEiS0IJXeRqgp9jJ5s
oP7d25ctl6dNa1uH49zKwtStRo8nwhRDsUJOx8vz+GFtEyUBiHE+A7+WRpQz
nodIZlpdYKaAF9ZNFXdfXTTRZsn35XQ3sIFX4ZOiztNNcyI0t7mrIAY8f3oW
gg8XOzlqHaBtH09a12hxXyf48KTOxBb1QtXA+x8/brtCbmlMPbdbN+ozKvqZ
l3MlcxMeJ8FpDjC8j0ylFguVDohoKmbyu3I4mE0SxP10yyayoc6UfEwknAOi
rXtdA9jGYuZunaC4lB5QETErEgEHpyRv42TFVCchKPSpEGCxEDviyUwl52gK
TXrJ7t849AjqyDBRo1KvqLCuYuroBOuLL7VRPQoR9sUgLJfZ8ve2zJF1fC5N
QEQpyoaBzKYHwKFd8RBkzTXCHyVWzKI1ptosMrl0mkytcftwRZKN+1hBPz6g
4q4xUgucz7Th4lU7DbelDM/6nlxNJtbKQr943pt8NZ2UwmJ76oTzZSHqCeeN
Xu7OipxNFK1cAtw/ldOmNPm3AiKoWrI+8rElwepVl92wsNbtY2dp46B7rdfY
7T94ovIUH/UYQIT+JWA5KypawK3skP25PVbj/RPifl6uaL+NqucL8G16nNHo
WMle5wnHo0xiqF/rhKyvdlukvAs+19OZTbTyug6NS6CwMkrLuh54o5+3m7G6
9BLaGKBH5bzNSoZiuNietr7BTBCOxHSkg/OcnEPt6CaJkDA4LSeGYqpyKh2n
aoBcXa6ZkTvn4vCfBYR0iMfW6hI5uWAONcHK53fPSBvn9swbAUg+KGLahejd
qVFUqEu8IID/Y6yod7oZ1KV69OdXmcC5W2nDARcb3E5z2Hw5SG+CJcZpVJOI
pnAT1OK3l46Kl38bl4/QHildA+8s+vNmC5aW1IGJDi3xa9aRMN6UDmCEKN36
71vx5m442S5Irmay6mwurJmGNm2cQwQQ1Gnc52p4aK1Rw2UlRQOyd5SG9/YA
zuUcEFppfP/B7oDfE6FtAhf0cxsy/HkV1GEmqKJTVTBRlPFZ0ZzZsGc4HETt
X17fTvVeHf5KPiKAmWCSxkmS3TAdMGwdrwKCV95gYMXKtIOe6AWxaSHxYCQu
u9fIZqs5tNqEqu046EymadPVbownkUbn4MDy1XchMDCzdfzMJpgYnTgzRVZz
eU7TM8TEBb2fwi23QHwSdEu2ik5Qae9yeZHXvfWK5pzwbdYARBhdA5amnfW3
Nl2dTG/tf7CDYbPOWZfZibpuPLAtbRoAhfVFKAFTjw12lVdhls6fuGxn3kK8
6DMzLhfbRiJyivCk6mAPG0dsCRAfRKQcggeyE6kzhoBMn992s3HQei3fZdyz
0AoWNNRFsHRqg/510P7LIfLN+NevM3hhQLg0xKTG5pgIrLjwgHmkVlpkq19b
t9H5t4IP8rGgqEjEU9pma5/gawBiaUGPrK9LtarlTF7jFqPoBEv9VjJd3QNf
nFRhoQUsRd75nBpv/VrFkSRv+5oG1SdaxzmZJGBetiSQiyXhi0undbNp5N5m
fXieS8COaBGOvb2hM8sJecjmELwRJxyM3oF8oii8gZV4sKinI+325QrOA8Pl
06Nf7naW+eHaRqLAGfOwZWTu/RJ2g5vO8I6C3B20hj4pz7tw+/Rl1tpNJ1p4
shyNPiZqwWd3wapBTEAEgNq5rFi/JDsmWlJz2tFOhIseWyblpnh11fuuCQBm
ln7yU89eHj7/cPjk7Pifx2e/frDnaz68Pnn94fHbk/enT986VEiEGXGIGqGr
5euieobUPPWU30gyyKCHXJTM1dXqy0k6dNr3athH174LhE4jIbn4ajLcrgEA
D/EFIxKsAfzzXNJgpdDUSsDqaaKntU1POunN46hZrKI0LV0uHzmRmaGi2ubd
JbFNPKDiupeh4YExDPH2GCmxpFVCjMYwVeWSyJoDLljUfNyW3pgAvAyOHoWm
T8fqyDsQ/bQpAVMMj1SyAIgSFQBXl+VByufAnMQNN1nZgpPisUzOEdrqFVrQ
RfoOlINofK5f4ftZIsKd4uzlKbKpXpC14aO0vnUH6BK9mNGRZX766PXp6dMn
lGO0yCJRZcWH1gH16Ryt3b4qwNvVTP8GZMKNPp4xcsUD1egV3LKjdRQez9rD
A5jEV1zZqsugCMbGJmdiXX3aJW1GnpFCBjt+pDYFyNi/J2ABdOJJ/7BGODh7
nq5OCWHIHJBCwofSubgalQj1NCjV7XHJWF5NIZIOn/tQDw60L0fhoQW/3qS9
3ee0dehLnhW+mADcMTKOgiP0xXmN1R7Tml6t0IB333fMFTlzXWE2EpoUnWn5
Y/jSlic5yOyAcpA+8ZsNv0FbZRfT/v0IXfilp3lRchhGp2Q1YRKmlAIe+EUy
Yx4ucsI37Hy0J5f9FnPl92aAgj51DGEXzl3mlKzh1D2lErBsCWI7ToNsJFUs
R3yKiroRgTSv7vDl3fFNPoOX63ReE9+Y0nZEwWzRYkSl58qGndUNJpjGpLJH
6H9zGrjG+KjmXZsm9UFXmYOp+uCq4Sm0atauTtqDUuj8JhMg54XL+ODRcq7E
p7Ft2blP7uIove9HYFWhN77YQv6mht+6bcXH7I3YotL9obCF/PwmiZWy/WGw
3YX1+XbbAF9AYEfAzSS2D3rHJjmxM5ckGa5op8VEjj7ZOfIpLos6S8nHukUg
KrMbDJTQQUOYNeHLAFf5NujYXRP0gn7F4Zo0h1yM5Rwx1cNH25ig2vHh68OV
aNd+7wwmwQAt0JMysTsN9IakMdg4lfwnuNjMVDol7kdXB/xaGZX+bUARd/CJ
sz2cYTHMB3CZ54qFgq9opLROBbAH3Klxr+xhXfdhGd8EambFgl7a1xzdyD3u
Aboxhe5er5S2XsxRtd6Sgsm0C53WQB++YIFPnehxTWmuVElAuROAxjhHqycO
ISMzIfYsrF1gvFPhuzRaUeog+n9z5SsrMlYAAA==

-->

</rfc>
