<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" consensus="true" docName="draft-goessner-dispatch-jsonpath-00" indexInclude="true" ipr="trust200902" prepTime="2020-07-13T21:56:09" scripts="Common,Latin" sortRefs="true" submissionType="IETF" symRefs="true" tocDepth="3" tocInclude="true" xml:lang="en">
  <!-- xml2rfc v2v3 conversion 2.45.0 -->
  <front>
    <title abbrev="JSONPath">JSONPath -- XPath for JSON</title>
    <seriesInfo name="Internet-Draft" value="draft-goessner-dispatch-jsonpath-00" stream="IETF"/>
    <author initials="S." surname="Gössner" fullname="Stefan Gössner">
      <organization showOnFrontPage="true">Fachhochschule Dortmund</organization>
      <address>
        <postal>
          <street>Sonnenstraße 96</street>
          <city>Dortmund</city>
          <code>D-44139</code>
          <country>Germany</country>
        </postal>
        <email>stefan.goessner@fh-dortmund.de</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization ascii="Universitaet Bremen TZI" showOnFrontPage="true">Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date month="07" year="2020" day="12"/>
    <area>Applications</area>
    <keyword>Internet-Draft</keyword>
    <abstract pn="section-abstract">
      <t pn="section-abstract-1">insert abstract here</t>
    </abstract>
    <note removeInRFC="false" pn="section-note.1">
      <name slugifiedName="name-contributing">Contributing</name>
      <t pn="section-note.1-1">This document picks up the popular JSONPath specification dated
2007-02-21 and provides a more normative definition for it.
It is intended as a submission to the IETF DISPATCH WG, in order to
find the right way to complete standardization of this specification.
In its current state, it is a strawman document showing what needs to
be covered.</t>
      <t pn="section-note.1-2">Comments and issues can be directed at the github repository <em>insert
repo here</em> as well as (for the time when the more permanent home is
being decided) at the dispatch@ietf.org mailing list.</t>
    </note>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t pn="section-boilerplate.1-1">
        This Internet-Draft is submitted in full conformance with the
        provisions of BCP 78 and BCP 79.
        </t>
        <t pn="section-boilerplate.1-2">
        Internet-Drafts are working documents of the Internet Engineering Task
        Force (IETF). Note that other groups may also distribute working
        documents as Internet-Drafts. The list of current Internet-Drafts is
        at <eref target="https://datatracker.ietf.org/drafts/current/" brackets="none"/>.
        </t>
        <t pn="section-boilerplate.1-3">
        Internet-Drafts are draft documents valid for a maximum of six months
        and may be updated, replaced, or obsoleted by other documents at any
        time. It is inappropriate to use Internet-Drafts as reference
        material or to cite them other than as "work in progress."
        </t>
        <t pn="section-boilerplate.1-4">
        This Internet-Draft will expire on 13 January 2021.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t pn="section-boilerplate.2-1">
            Copyright (c) 2020 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Simplified BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Simplified BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-terminology">Terminology</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.2">
                <t keepWithNext="true" pn="section-toc.1-1.1.2.2.1"><xref derivedContent="1.2" format="counter" sectionFormat="of" target="section-1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-inspired-by-xpath">Inspired by XPath</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.3">
                <t keepWithNext="true" pn="section-toc.1-1.1.2.3.1"><xref derivedContent="1.3" format="counter" sectionFormat="of" target="section-1.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-overview-of-jsonpath-expres">Overview of JSONPath Expressions</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-jsonpath-examples">JSONPath Examples</xref></t>
          </li>
          <li pn="section-toc.1-1.3">
            <t pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-detailed-definition">Detailed definition</xref></t>
          </li>
          <li pn="section-toc.1-1.4">
            <t pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-discussion">Discussion</xref></t>
          </li>
          <li pn="section-toc.1-1.5">
            <t pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.6">
            <t pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t pn="section-toc.1-1.7.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-early-jsonpath-implementati">Early JSONPath implementations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t pn="section-toc.1-1.7.2.1.1"><xref derivedContent="A.1" format="counter" sectionFormat="of" target="section-a.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-implementation">Implementation</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t pn="section-toc.1-1.7.2.2.1"><xref derivedContent="A.2" format="counter" sectionFormat="of" target="section-a.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-usage">Usage</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.3">
                <t pn="section-toc.1-1.7.2.3.1"><xref derivedContent="A.3" format="counter" sectionFormat="of" target="section-a.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-parameters">Parameters</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.4">
                <t pn="section-toc.1-1.7.2.4.1"><xref derivedContent="A.4" format="counter" sectionFormat="of" target="section-a.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-return-value">Return value</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.5">
                <t pn="section-toc.1-1.7.2.5.1"><xref derivedContent="A.5" format="counter" sectionFormat="of" target="section-a.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-javascript-example">JavaScript Example</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.6">
                <t pn="section-toc.1-1.7.2.6.1"><xref derivedContent="A.6" format="counter" sectionFormat="of" target="section-a.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-php-example">PHP example</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.7">
                <t pn="section-toc.1-1.7.2.7.1"><xref derivedContent="A.7" format="counter" sectionFormat="of" target="section-a.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-results">Results</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t pn="section-toc.1-1.8.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.b"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgements</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t pn="section-toc.1-1.9.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.c"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="include" removeInRFC="false" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t pn="section-1-1">This document picks up the popular JSONPath specification dated
2007-02-21 <xref target="JSONPath-orig" format="default" sectionFormat="of" derivedContent="JSONPath-orig"/> and provides a more normative definition for it.
It is intended as a submission to the IETF DISPATCH WG, in order to
find the right way to complete standardization of this specification.
In its current state, it is a strawman document showing what needs to
be covered.</t>
      <section anchor="terminology" numbered="true" toc="include" removeInRFC="false" pn="section-1.1">
        <name slugifiedName="name-terminology">Terminology</name>
        <t pn="section-1.1-1">The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t pn="section-1.1-2">The grammatical rules in this document are to be interpreted as
described in <xref target="RFC5234" format="default" sectionFormat="of" derivedContent="RFC5234"/>.</t>
        <t pn="section-1.1-3">The terminology of <xref target="RFC8259" format="default" sectionFormat="of" derivedContent="RFC8259"/> applies.</t>
        <dl newline="false" spacing="normal" pn="section-1.1-4">
          <dt pn="section-1.1-4.1">Data Item:</dt>
          <dd pn="section-1.1-4.2">
  A structure complying to the generic data model of JSON, i.e.,
composed of containers such as arrays and maps (JSON objects), and
of atomic data such as null, true, false, numbers, and text strings.</dd>
          <dt pn="section-1.1-4.3">Object:</dt>
          <dd pn="section-1.1-4.4">
  Used in its generic sense, e.g., for programming language objects.
When a JSON Object as defined in <xref target="RFC8259" format="default" sectionFormat="of" derivedContent="RFC8259"/> is meant, we specifically
say JSON Object.</dd>
          <dt pn="section-1.1-4.5">Query:</dt>
          <dd pn="section-1.1-4.6">
  Short name for JSONPath expression.</dd>
          <dt pn="section-1.1-4.7">Argument:</dt>
          <dd pn="section-1.1-4.8">
  Short name for the JSON data item a JSONPath expression is applied to.</dd>
          <dt pn="section-1.1-4.9">Output Path:</dt>
          <dd pn="section-1.1-4.10">
  A simple form of JSONPath expression that identifies a Position by
providing a query that results in exactly that position.  Similar
to, but syntactically different from, a JSON Pointer <xref target="RFC6901" format="default" sectionFormat="of" derivedContent="RFC6901"/>.</dd>
          <dt pn="section-1.1-4.11">Position:</dt>
          <dd pn="section-1.1-4.12">
  A JSON data item identical to or nested within the JSON data item to
which the query is applied to, expressed either by the value of that
data item or by providing a JSONPath Output Path.</dd>
        </dl>
      </section>
      <section anchor="inspired-by-xpath" numbered="true" toc="include" removeInRFC="false" pn="section-1.2">
        <name slugifiedName="name-inspired-by-xpath">Inspired by XPath</name>
        <t pn="section-1.2-1">A frequently emphasized advantage of XML is the availability of plenty tools to analyse, transform and selectively extract data out of XML documents. <xref target="XPath" format="default" sectionFormat="of" derivedContent="XPath"/> is one of these powerful tools.</t>
        <t pn="section-1.2-2">In 2007, the need for something solving the same class of problems for
the emerging JSON community became apparent, specifically for:</t>
        <ul spacing="normal" bare="false" empty="false" pn="section-1.2-3">
          <li pn="section-1.2-3.1">Finding data interactively and extracting them out of <xref target="RFC8259" format="default" sectionFormat="of" derivedContent="RFC8259"/>
data items without special scripting.</li>
          <li pn="section-1.2-3.2">Specifying the relevant parts of the JSON data in a request by a
client, so the server can reduce the data in the server response,
minimizing bandwidth usage.</li>
        </ul>
        <t pn="section-1.2-4">So how does such a tool look like when done for JSON?
When defining a JSONPath, how should expressions look like?</t>
        <t pn="section-1.2-5">The XPath expression</t>
        <artwork name="" type="" align="left" alt="" pn="section-1.2-6"><![CDATA[
/store/book[1]/title
]]></artwork>
        <t pn="section-1.2-7">looks like</t>
        <artwork name="" type="" align="left" alt="" pn="section-1.2-8"><![CDATA[
x.store.book[0].title
]]></artwork>
        <t pn="section-1.2-9">or</t>
        <artwork name="" type="" align="left" alt="" pn="section-1.2-10"><![CDATA[
x['store']['book'][0]['title']
]]></artwork>
        <t pn="section-1.2-11">in popular programming languages such as JavaScript, Python and PHP,
with a variable x holding the JSON data item.  Here we observe that
such languages already have a fundamentally XPath-like feature built
in.</t>
        <t pn="section-1.2-12">The JSONPath tool in question should:</t>
        <ul spacing="normal" bare="false" empty="false" pn="section-1.2-13">
          <li pn="section-1.2-13.1">be naturally based on those language characteristics.</li>
          <li pn="section-1.2-13.2">cover only essential parts of XPath 1.0.</li>
          <li pn="section-1.2-13.3">be lightweight in code size and memory consumption.</li>
          <li pn="section-1.2-13.4">be runtime efficient.</li>
        </ul>
      </section>
      <section anchor="overview-of-jsonpath-expressions" numbered="true" toc="include" removeInRFC="false" pn="section-1.3">
        <name slugifiedName="name-overview-of-jsonpath-expres">Overview of JSONPath Expressions</name>
        <t pn="section-1.3-1">JSONPath expressions always apply to a JSON data item in the same way
as XPath expressions are used in combination with an XML document.
Since a JSON data item is usually anonymous and doesn't necessarily
have a "root member object", JSONPath used the abstract name <tt>$</tt> to
refer to the top level object of the data item.</t>
        <t pn="section-1.3-2">JSONPath expressions can use the <em>dot-notation</em></t>
        <artwork name="" type="" align="left" alt="" pn="section-1.3-3"><![CDATA[
$.store.book[0].title
]]></artwork>
        <t pn="section-1.3-4">or the <em>bracket-notation</em></t>
        <artwork name="" type="" align="left" alt="" pn="section-1.3-5"><![CDATA[
$['store']['book'][0]['title']
]]></artwork>
        <t pn="section-1.3-6">for paths input to a JSONPath processor.  Where a JSONPath processor
uses JSONPath expressions for internal purposes or as output paths,
these will always be converted to the more general <em>bracket-notation</em>.</t>
        <t pn="section-1.3-7">JSONPath allows the wildcard symbol <tt>*</tt> for member names and array
indices. It borrows the descendant operator <tt>..</tt> from <xref target="E4X" format="default" sectionFormat="of" derivedContent="E4X"/> and
the array slice syntax proposal <tt>[start:end:step]</tt> <xref target="SLICE" format="default" sectionFormat="of" derivedContent="SLICE"/> from ECMASCRIPT 4.</t>
        <t pn="section-1.3-8">JSONPath can employ an <em>underlying scripting language</em>, expressions of
which, written in parentheses: <tt>(&lt;expr&gt;)</tt>, can be used as an
alternative to explicit names or indices as in:</t>
        <artwork name="" type="" align="left" alt="" pn="section-1.3-9"><![CDATA[
$.store.book[(@.length-1)].title
]]></artwork>
        <t pn="section-1.3-10">The symbol <tt>@</tt> is used for the current object.
Filter expressions are supported via the syntax <tt>?(&lt;boolean expr&gt;)</tt> as in</t>
        <artwork name="" type="" align="left" alt="" pn="section-1.3-11"><![CDATA[
$.store.book[?(@.price < 10)].title
]]></artwork>
        <t pn="section-1.3-12">Here is a complete overview and a side by side comparison of the JSONPath syntax elements with its XPath counterparts.</t>
        <table anchor="tbl-overview" align="center" pn="table-1">
          <name slugifiedName="name-overview-over-jsonpath-comp">Overview over JSONPath, comparing to XPath</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">XPath</th>
              <th align="left" colspan="1" rowspan="1">JSONPath</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>/</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>$</tt></td>
              <td align="left" colspan="1" rowspan="1">the root object/element</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>.</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>@</tt></td>
              <td align="left" colspan="1" rowspan="1">the current object/element</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>/</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>.</tt> or <tt>[]</tt></td>
              <td align="left" colspan="1" rowspan="1">child operator</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>..</tt></td>
              <td align="left" colspan="1" rowspan="1">n/a</td>
              <td align="left" colspan="1" rowspan="1">parent operator</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>//</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>..</tt></td>
              <td align="left" colspan="1" rowspan="1">nested descendants. JSONPath borrows this syntax from E4X.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>*</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>*</tt></td>
              <td align="left" colspan="1" rowspan="1">wildcard. All objects/elements regardless of their names.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>@</tt></td>
              <td align="left" colspan="1" rowspan="1">n/a</td>
              <td align="left" colspan="1" rowspan="1">attribute access. JSON data items don't have attributes.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>[]</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>[]</tt></td>
              <td align="left" colspan="1" rowspan="1">subscript operator. XPath uses it to iterate over element collections and for predicates. In JavaScript and JSON it is the native array operator.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>|</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>[,]</tt></td>
              <td align="left" colspan="1" rowspan="1">Union operator in XPath results in a combination of node sets. JSONPath allows alternate names or array indices as a set.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">n/a</td>
              <td align="left" colspan="1" rowspan="1">
                <tt>[start:end:step]</tt></td>
              <td align="left" colspan="1" rowspan="1">array slice operator borrowed from ES4.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>[]</tt></td>
              <td align="left" colspan="1" rowspan="1">
                <tt>?()</tt></td>
              <td align="left" colspan="1" rowspan="1">applies a filter (script) expression.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">n/a</td>
              <td align="left" colspan="1" rowspan="1">
                <tt>()</tt></td>
              <td align="left" colspan="1" rowspan="1">script expression, using the underlying script engine.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">
                <tt>()</tt></td>
              <td align="left" colspan="1" rowspan="1">n/a</td>
              <td align="left" colspan="1" rowspan="1">grouping in Xpath</td>
            </tr>
          </tbody>
        </table>
        <t pn="section-1.3-14">XPath has a lot more to offer (location paths in unabbreviated syntax,
operators and functions) than listed here.  Moreover there is a
significant difference how the subscript operator works in Xpath and
JSONPath:</t>
        <ul spacing="normal" bare="false" empty="false" pn="section-1.3-15">
          <li pn="section-1.3-15.1">Square brackets in XPath expressions always operate on the <em>node set</em> resulting from the previous path fragment. Indices always start at 1.</li>
          <li pn="section-1.3-15.2">With JSONPath, square brackets operate on the <em>object</em> or <em>array</em> addressed by the previous path fragment. Indices always start at 0.</li>
        </ul>
      </section>
    </section>
    <section anchor="jsonpath-examples" numbered="true" toc="include" removeInRFC="false" pn="section-2">
      <name slugifiedName="name-jsonpath-examples">JSONPath Examples</name>
      <t pn="section-2-1">This section provides some more examples for JSONPath expressions.
The examples are based on a simple JSON data item patterned after a
typical XML example representing a bookstore (that also has bicycles):</t>
      <figure align="left" suppress-title="false" pn="figure-1">
        <name slugifiedName="name-example-json-data-item">Example JSON data item</name>
        <artwork type="json" name="" align="left" alt="" pn="section-2-2.1"><![CDATA[
{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
]]></artwork>
      </figure>
      <t pn="section-2-3">The examples in <xref target="tbl-example" format="default" sectionFormat="of" derivedContent="Table 2"/> presume an underlying script language
that allows obtaining the number of items in an array, testing for the
presence of a map member, and performing numeric comparisons of map
member values with a constant.</t>
      <table anchor="tbl-example" align="center" pn="table-2">
        <name slugifiedName="name-example-jsonpath-expression">Example JSONPath expressions applied to the example JSON data item</name>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">XPath</th>
            <th align="left" colspan="1" rowspan="1">JSONPath</th>
            <th align="left" colspan="1" rowspan="1">Result</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>/store/book/author</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$.store.book[*].author</tt></td>
            <td align="left" colspan="1" rowspan="1">the authors of all books in the store</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>//author</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$..author</tt></td>
            <td align="left" colspan="1" rowspan="1">all authors</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>/store/*</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$.store.*</tt></td>
            <td align="left" colspan="1" rowspan="1">all things in store, which are some books and a red bicycle.</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>/store//price</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$.store..price</tt></td>
            <td align="left" colspan="1" rowspan="1">the price of everything in the store.</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>//book[3]</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$..book[2]</tt></td>
            <td align="left" colspan="1" rowspan="1">the third book</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>//book[last()]</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$..book[(@.length-1)]</tt><br/><tt>$..book[-1:]</tt></td>
            <td align="left" colspan="1" rowspan="1">the last book in order.</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>//book[position()&lt;3]</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$..book[0,1]</tt><br/><tt>$..book[:2]</tt></td>
            <td align="left" colspan="1" rowspan="1">the first two books</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>//book[isbn]</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$..book[?(@.isbn)]</tt></td>
            <td align="left" colspan="1" rowspan="1">filter all books with isbn number</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>//book[price&lt;10]</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$..book[?(@.price&lt;10)]</tt></td>
            <td align="left" colspan="1" rowspan="1">filter all books cheapier than 10</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">
              <tt>//*</tt></td>
            <td align="left" colspan="1" rowspan="1">
              <tt>$..*</tt></td>
            <td align="left" colspan="1" rowspan="1">all Elements in XML document. All members of JSON data item.</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="detailed-definition" numbered="true" toc="include" removeInRFC="false" pn="section-3">
      <name slugifiedName="name-detailed-definition">Detailed definition</name>
      <t pn="section-3-1">[TBD: This section needs to be fleshed out in detail.  The text given
here is intended to give the flavor of that detail, not to be the
actual definition that is to be defined.]</t>
      <t pn="section-3-2">JSONPath expressions, "queries" for short in this specification, are
character strings, represented in UTF-8 unless otherwise required by
the context in which they are used.</t>
      <t pn="section-3-3">When applied to a JSON data item, a query returns a (possibly empty)
list of "positions" in the data item that match the JSONPath expression.</t>
      <figure anchor="fig-abnf" align="left" suppress-title="false" pn="figure-2">
        <name slugifiedName="name-abnf-definition-for-jsonpat">ABNF definition for JSONPath</name>
        <artwork type="abnf" name="" align="left" alt="" pn="section-3-4.1"><![CDATA[
JSONPath = root *(step)
root = "$"

step = ".." name ; nested descendants
     / "." name ; child (dot notation)
     / "[" value-expression *("," value-expression) "]"
        ; child[ren] (bracket notation)
     / "[" value-expression *2(":" value-expression) "]"  ; (slice)
value-expression = *DIGIT / name
                 / script-expression / filter-expression
name = "'" text "'"
     / "*" ; wildcard
script-expression = "(" script ")"
filter-expression = "?(" script ")"
script = <To be defined in the course of standardization>
text = <any text, restrictions to be defined>
DIGIT = %x30-39
]]></artwork>
      </figure>
      <t pn="section-3-5">Within a script, @ stands for the position under consideration.
[TBD: define underlying scripting language, if there is to be a
standard one]</t>
      <t pn="section-3-6">[TBD: define handling of spaces]</t>
      <t pn="section-3-7">A JSONPath starts at the root of the argument; the "current list" of
positions is initialized to that root.  Each step applies the
semantics of that step to each of the positions in the "current list",
returning another list; the "current list" is replaced by the
concatenation of all these returned lists, and the next step begins.
When all steps have been performed, the "current list" is returned,
depending on the choices of the context either as a list of data items
or as a list of output paths.  [TBD: define the order of that list]</t>
      <t pn="section-3-8">[TBD: Define all the steps]</t>
      <t pn="section-3-9">[TBD: Define details of Output Path]</t>
    </section>
    <section anchor="discussion" numbered="true" toc="include" removeInRFC="false" pn="section-4">
      <name slugifiedName="name-discussion">Discussion</name>
      <ul spacing="normal" bare="false" empty="false" pn="section-4-1">
        <li pn="section-4-1.1">Currently only single quotes allowed inside of JSONPath expressions.</li>
        <li pn="section-4-1.2">Script expressions inside of JSONPath locations are currently not recursively evaluated by jsonPath.
Only the global <tt>$</tt> and local <tt>@</tt> symbols are expanded by a simple regular expression.</li>
        <li pn="section-4-1.3">An alternative for jsonPath to return false in case of no match may
be to return an empty array in future. [This is already done in the
above.]</li>
      </ul>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="include" removeInRFC="false" pn="section-5">
      <name slugifiedName="name-iana-considerations">IANA considerations</name>
      <t pn="section-5-1">TBD: Define a media type for JSON Path expressions.</t>
    </section>
  </middle>
  <back>
    <references pn="section-6">
      <name slugifiedName="name-references">References</name>
      <references pn="section-6.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="1997" month="March"/>
            <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>
        </reference>
        <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234" quoteTitle="true" derivedAnchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <seriesInfo name="STD" value="68"/>
            <seriesInfo name="RFC" value="5234"/>
            <seriesInfo name="DOI" value="10.17487/RFC5234"/>
            <author initials="D." surname="Crocker" fullname="D. Crocker" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="P." surname="Overell" fullname="P. Overell">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2008" month="January"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="May"/>
            <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>
        </reference>
        <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259" quoteTitle="true" derivedAnchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <seriesInfo name="STD" value="90"/>
            <seriesInfo name="RFC" value="8259"/>
            <seriesInfo name="DOI" value="10.17487/RFC8259"/>
            <author initials="T." surname="Bray" fullname="T. Bray" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="December"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
        </reference>
      </references>
      <references pn="section-6.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="E4X" quoteTitle="true" derivedAnchor="E4X">
          <front>
            <title>Information technology -- ECMAScript for XML (E4X) specification</title>
            <seriesInfo name="ISO/IEC 22537:2006" value=""/>
            <author>
              <organization showOnFrontPage="true">ISO</organization>
            </author>
            <date year="2006"/>
          </front>
        </reference>
        <reference anchor="JSON-PHP" target="http://mike.teczno.com/json.html" quoteTitle="true" derivedAnchor="JSON-PHP">
          <front>
            <title>JSON-PHP</title>
            <author>
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2005" month="January"/>
          </front>
        </reference>
        <reference anchor="JSONPath-impl" target="https://code.google.com/archive/p/jsonpath/downloads" quoteTitle="true" derivedAnchor="JSONPath-impl">
          <front>
            <title>jsonpath (Downloads)</title>
            <author>
              <organization showOnFrontPage="true"/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSONPath-orig" target="https://goessner.net/articles/JsonPath/" quoteTitle="true" derivedAnchor="JSONPath-orig">
          <front>
            <title>JSONPath - XPath for JSON</title>
            <author initials="S." surname="Gössner" fullname="Stefan Gössner">
              <organization showOnFrontPage="true">Fachhochschule Dortmund</organization>
            </author>
            <date year="2007" month="February" day="21"/>
          </front>
        </reference>
        <reference anchor="RFC6901" target="https://www.rfc-editor.org/info/rfc6901" quoteTitle="true" derivedAnchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <seriesInfo name="RFC" value="6901"/>
            <seriesInfo name="DOI" value="10.17487/RFC6901"/>
            <author initials="P." surname="Bryan" fullname="P. Bryan" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="K." surname="Zyp" fullname="K. Zyp">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Nottingham" fullname="M. Nottingham" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2013" month="April"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
        </reference>
        <reference anchor="SLICE" target="https://github.com/tc39/proposal-slice-notation" quoteTitle="true" derivedAnchor="SLICE">
          <front>
            <title>Slice notation</title>
            <author>
              <organization showOnFrontPage="true"/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="XPath" target="http://www.w3.org/TR/2010/REC-xpath20-20101214" quoteTitle="true" derivedAnchor="XPath">
          <front>
            <title>XML Path Language (XPath) 2.0 (Second Edition)</title>
            <seriesInfo name="World Wide Web Consortium Recommendation" value="REC-xpath20-20101214"/>
            <author initials="A." surname="Berglund" fullname="Anders Berglund">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="S." surname="Boag" fullname="Scott Boag">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="D." surname="Chamberlin" fullname="Don Chamberlin">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Fernandez" fullname="Mary Fernandez">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Kay" fullname="Michael Kay">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="J." surname="Robie" fullname="Jonathan Robie">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="J." surname="Simeon" fullname="Jerome Simeon">
              <organization showOnFrontPage="true"/>
            </author>
            <date month="December" day="14" year="2010"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="early-jsonpath-implementations" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.a">
      <name slugifiedName="name-early-jsonpath-implementati">Early JSONPath implementations</name>
      <t pn="section-appendix.a-1">This appendix has been copied from the similar section in
<xref target="JSONPath-orig" format="default" sectionFormat="of" derivedContent="JSONPath-orig"/>, with few changes.  It is informative, intended to
supply more examples and give an impression for what could be a
typical JSONPath API.</t>
      <section anchor="implementation" numbered="true" toc="include" removeInRFC="false" pn="section-a.1">
        <name slugifiedName="name-implementation">Implementation</name>
        <t pn="section-a.1-1">JSONPath is implemented in JavaScript for client-side usage and ported over to PHP for use on the server.</t>
      </section>
      <section anchor="usage" numbered="true" toc="include" removeInRFC="false" pn="section-a.2">
        <name slugifiedName="name-usage">Usage</name>
        <t pn="section-a.2-1">All you need to do is downloading either of the files</t>
        <ul spacing="normal" bare="false" empty="false" pn="section-a.2-2">
          <li pn="section-a.2-2.1">
            <tt>jsonpath.js</tt> <xref target="JSONPath-impl" format="default" sectionFormat="of" derivedContent="JSONPath-impl"/></li>
          <li pn="section-a.2-2.2">
            <tt>jsonpath.php</tt> <xref target="JSONPath-impl" format="default" sectionFormat="of" derivedContent="JSONPath-impl"/></li>
        </ul>
        <t pn="section-a.2-3">include it in your program and use the simple API consisting of one single function.</t>
        <artwork type="js" name="" align="left" alt="" pn="section-a.2-4"><![CDATA[
jsonPath(obj, expr [, args])
]]></artwork>
      </section>
      <section anchor="parameters" numbered="true" toc="include" removeInRFC="false" pn="section-a.3">
        <name slugifiedName="name-parameters">Parameters</name>
        <dl newline="false" spacing="normal" pn="section-a.3-1">
          <dt pn="section-a.3-1.1">obj (object|array):</dt>
          <dd pn="section-a.3-1.2">
  Object representing the JSON data item.</dd>
          <dt pn="section-a.3-1.3">expr (string):</dt>
          <dd pn="section-a.3-1.4">
  JSONPath expression string.</dd>
          <dt pn="section-a.3-1.5">args (object|undefined):</dt>
          <dd pn="section-a.3-1.6">
  Object controlling path evaluation and output.
Currently only one member is supported.</dd>
          <dt pn="section-a.3-1.7">args.resultType ("VALUE"|"PATH"):</dt>
          <dd pn="section-a.3-1.8">
  causes the result to be either matching values (default) or
normalized path expressions.</dd>
        </dl>
      </section>
      <section anchor="return-value" numbered="true" toc="include" removeInRFC="false" pn="section-a.4">
        <name slugifiedName="name-return-value">Return value</name>
        <dl newline="false" spacing="normal" pn="section-a.4-1">
          <dt pn="section-a.4-1.1">(array|false):</dt>
          <dd pn="section-a.4-1.2">
  Array holding either values or normalized path expressions matching the input path expression, which can be used for lazy evaluation. <tt>false</tt> in case of no match.</dd>
        </dl>
      </section>
      <section anchor="javascript-example" numbered="true" toc="include" removeInRFC="false" pn="section-a.5">
        <name slugifiedName="name-javascript-example">JavaScript Example</name>
        <artwork type="js" name="" align="left" alt="" pn="section-a.5-1"><![CDATA[
var o = { /*...*/ },  // the 'store' JSON object from above
    res1 = jsonPath(o, "$..author").toJSONString(),
    res2 = jsonPath(o, "$..author",
                    {resultType:"PATH"}).toJSONString();
]]></artwork>
      </section>
      <section anchor="php-example" numbered="true" toc="include" removeInRFC="false" pn="section-a.6">
        <name slugifiedName="name-php-example">PHP example</name>
        <t pn="section-a.6-1">We need here to convert the JSON string to a PHP array first. I am
using Michal Migurski's JSON parser <xref target="JSON-PHP" format="default" sectionFormat="of" derivedContent="JSON-PHP"/> for that.</t>
        <artwork type="php" name="" align="left" alt="" pn="section-a.6-2"><![CDATA[
require_once('json.php');      // JSON parser
require_once('jsonpath.php');  // JSONPath evaluator

$json = '{ ... }';  // JSON data item from above

$parser = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
$o = $parser->decode($json);
$match1 = jsonPath($o, "$..author");
$match2 = jsonPath($o, "$..author",
                   array("resultType" => "PATH"));
$res1 = $parser->encode($match1);
$res2 = $parser->encode($match2);
]]></artwork>
      </section>
      <section anchor="results" numbered="true" toc="include" removeInRFC="false" pn="section-a.7">
        <name slugifiedName="name-results">Results</name>
        <t pn="section-a.7-1">Both JavaScript and PHP example result in the following JSON arrays (as strings):</t>
        <artwork type="js" name="" align="left" alt="" pn="section-a.7-2"><![CDATA[
res1:
[ "Nigel Rees",
  "Evelyn Waugh",
  "Herman Melville",
  "J. R. R. Tolkien"
]
res2:
[ "$['store']['book'][0]['author']",
  "$['store']['book'][1]['author']",
  "$['store']['book'][2]['author']",
  "$['store']['book'][3]['author']"
]
]]></artwork>
        <t pn="section-a.7-3">Please note that the return value of jsonPath is an array, which is also a valid JSON data item. So you might want to apply jsonPath to the resulting data item again or use one of your favorite array methods as sort with it.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements" toc="include" removeInRFC="false" pn="section-appendix.b">
      <name slugifiedName="name-acknowledgements">Acknowledgements</name>
      <t pn="section-appendix.b-1">This specification is based on <contact fullname="Stefan Gössner"/>'s
original online article defining JSONPath <xref target="JSONPath-orig" format="default" sectionFormat="of" derivedContent="JSONPath-orig"/>.</t>
      <t pn="section-appendix.b-2">The books example was taken from
http://coli.lili.uni-bielefeld.de/~andreas/Seminare/sommer02/books.xml
-- a dead link now.</t>
      <!--  LocalWords:  JSONPath XPath
 -->

</section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.c">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author initials="S." surname="Gössner" fullname="Stefan Gössner">
        <organization showOnFrontPage="true">Fachhochschule Dortmund</organization>
        <address>
          <postal>
            <street>Sonnenstraße 96</street>
            <city>Dortmund</city>
            <code>D-44139</code>
            <country>Germany</country>
          </postal>
          <email>stefan.goessner@fh-dortmund.de</email>
        </address>
      </author>
      <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
        <organization ascii="Universitaet Bremen TZI" showOnFrontPage="true">Universität Bremen TZI</organization>
        <address>
          <postal>
            <street>Postfach 330440</street>
            <city>Bremen</city>
            <code>D-28359</code>
            <country>Germany</country>
          </postal>
          <phone>+49-421-218-63921</phone>
          <email>cabo@tzi.org</email>
        </address>
      </author>
    </section>
  </back>
  <!-- ##markdown-source:
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
RomtJbpIFASSfqiQiovW/LQ8Jy1WyRSxqJwNyvfEXObEYC4TKfUKWzBs+cT5
614WjmPOYEJluaQ4hJCybBwprOg/qsldZhU9KLJzZ+WEz8mvC4o6bCCaVfpn
Ta5EFjWSEULk7tTQplVWhDSWfi660uEpkcH7jlI95hwINKnVQ7ImqxeqAPco
y/Oe4oeKFtkScMsAiB3dJCW3yUppU+kgsKl4m4P/c+HYoqxSPZGkKUTKbIE5
EyNRFYMpYy3cYOzIuyo5iIAoQiyH8clchk27AsxSaghAc58agrIRqS3t5fMZ
ly8os2TXojI9NqGsG6dfKQLkWFA1udKioyxh3h2G/py6jDZsZMvdTJ9Ugwc3
BuoTt3E0aD5+nSnb1YERrhMPjxucPSK+a7TKto+GNOnQ69fh2ETqrTFZ/T1L
Hb0+0aS1ynz3PqAusG5tKMetGPqos/vQPr1trQcFokDkWA/IISXxY/VeF+PJ
elCoYE2AvEjipEjXwdDrd3Z3/xogXnDzg3ploqsQLsZaOF4l4NWD0L+svw2z
YUwvt9oPH263+73tXq+9fQea/ioIv+2ot/y/0yS6DE28FkTi3JcWW0S2t0TD
9eBu7z5s93bpv4/WgduvY5T/nrcs2wl3lnyIR3DLBEi4YuViFXF2HYfQQrfe
reQ3oPFH4bhthaMtVTxR+laal6SMFPyCaHJpl4yGfXJ7S2okK6iaFK+xvS5b
5VlxY08sGVIp3BlsKVsT+sR3JrcuFk+qpaj7lZWnpIo8kWaf62eayuY2zSdF
byhBKtDRBKzKpe0qRcOChRmeTQxyCdImZjQn1XPNmXOXjFn5rM3O3PG5gZyT
5v/TI9dP9+5Mofw5uZW/Mg8jYWZVauqKbFwoyaHU02qb553q5QouOGXKr5kK
1AXCqrgsJbBOvhsXFOyuW56huHvjpbG0rYPiz/7UcbEUx9ZwsRrhroWCK7l8
ep7WsmV0znKS2RTkSMaRy9uiADoLUHRZ2i+qlUsoOotv1kEhDkAokmTgTM2l
ulwnyJ0us6UIE357MXATivCb/kocuhYK7AvtSTP+BOp+DIpIZ3lzo9ywBsVC
Vvri8TB9Wr5q9wYctREUtIAA4RrNPjNgqEPhGjeaG4+3eeVyq61Wb2nzwSJ6
BIpRmAKM/DqxHPAX4YIMTm3tGhSU+6a3G3dR5sYFgZWESuIak5yi/lxcEHM9
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
HlT/CoW9Maja7afe/wGVmlHZ2UcAAA==

-->

</rfc>
