<?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.18 (Ruby 3.3.3) -->
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-polli-restapi-ld-keywords-04" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title>REST API Linked Data Keywords</title>
    <seriesInfo name="Internet-Draft" value="draft-polli-restapi-ld-keywords-04"/>
    <author initials="R." surname="Polli" fullname="Roberto Polli">
      <organization>Digital Transformation Department, Italian Government</organization>
      <address>
        <postal>
          <country>Italy</country>
        </postal>
        <email>robipolli@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="22"/>
    <area>General</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 95?>

<t>This document defines two
keywords to provide semantic information in
OpenAPI Specification and JSON Schema documents,
and support contract-first semantic schema design.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-polli-restapi-ld-keywords/"/>.
      </t>
      <t>
         information can be found at <eref target="https://github.com/ioggstream/draft-polli-restapi-ld-keywords"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ioggstream/draft-polli-restapi-ld-keywords/issues"/>.</t>
    </note>
  </front>
  <middle>
    <?line 102?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>API providers usually specify semantic information in text or out-of-band documents;
at best, this information is described in prose into specific sections of interface definition documents (see <xref target="prosaic-semantics"/>).</t>
      <t>This is because API providers do not always value machine-readable semantics,
or because they have no knowledge of semantic technologies -
that are perceived as unnecessarily complex.</t>
      <t>A full-semantic approach (e.g. writing RDF oriented APIs) has not become widespread
because
transferring and processing the semantics on every message
significantly increases data transfer and computation requirements.</t>
      <t>Moreover the semantic landscape do not provide easy ways of defining / constraining
the syntax of an object:
tools like <xref target="SHACL"/> and <xref target="OWL"/> restrictions are considered
computationally intensive to process and complex to use
from web and mobile developers.</t>
      <t>This document provides a simple mechanism
to attach semantic information to REST APIs
that rely on different dialects of <xref target="JSONSCHEMA"/>,
thus supporting a contract-first schema design.</t>
      <t>For example, the OpenAPI Specifications (see <xref target="OAS"/>)
allow to describe REST APIs
interactions and capabilities using a machine-readable format
based on <xref target="JSON"/> or <xref target="YAML"/>.
OAS 3.0 is based on JSON Schema draft-4
while OAS 3.1 relies on the latest JSON Schema draft.</t>
      <section anchor="goals-and-design-choices">
        <name>Goals and Design Choices</name>
        <t>This document has the following goals:</t>
        <ul spacing="normal">
          <li>
            <t>describe in a single specification document backed by <xref target="JSONSCHEMA"/>
(e.g. an OpenAPI document)
both the syntax and semantics of JSON objects.
This information can be either be provided
editing the document by hand or via automated tools;</t>
          </li>
          <li>
            <t>easy for non-semantic experts and with reduced complexity;</t>
          </li>
          <li>
            <t>support for OAS 3.0 / JSON Schema Draft4;</t>
          </li>
        </ul>
        <t>while it is not intended to:</t>
        <ul spacing="normal">
          <li>
            <t>integrate the syntax defined using <xref target="JSONSCHEMA"/>;</t>
          </li>
          <li>
            <t>infer semantic information where it is not provided;</t>
          </li>
          <li>
            <t>convert <xref target="JSONSCHEMA"/> documents to RDF Schema (see <xref target="RDFS"/>) or XML Schema.</t>
          </li>
        </ul>
        <t>Thus, the following design choices have been made:</t>
        <ul spacing="normal">
          <li>
            <t>the semantic context of a JSON object will be described
using <xref target="JSON-LD-11"/> and its keywords;</t>
          </li>
          <li>
            <t>property names are limited to characters that can be used in variable
names (e.g. excluding <tt>:</tt> and <tt>.</tt>)
to avoid interoperability issues with code-generation tools;</t>
          </li>
          <li>
            <t>privilege a deterministic behavior over automation and composability;</t>
          </li>
          <li>
            <t>interoperable with the mechanisms described in Section 6.1 of <xref target="JSON-LD-11"/>
for conveying semantic context in REST APIs.</t>
          </li>
        </ul>
      </section>
      <section anchor="prosaic-semantics">
        <name>Prosaic semantics</name>
        <t><xref target="JSONSCHEMA"/> allows to define the structure of the exchanged data using specific keywords.
Properties' semantics can be expressed in prose via the <tt>description</tt> keyword.</t>
        <figure anchor="ex-semantic-prose">
          <name>Example of JSON Schema model that provides semantic prose.</name>
          <sourcecode type="yaml"><![CDATA[
Person:
  description: A Person.
  type: object
  properties:
    givenName:
      description: The given name of a Person.
      type: string
    familyName:
      description: The family name, or surname, of a Person.
      type: string
  example:
    givenName: John
    familyName: Doe
]]></sourcecode>
        </figure>
        <t><xref target="JSON-LD-11"/> defines a way to interpret a JSON object as JSON-LD:
the example schema instance (a JSON document conformant to a given schema)
provided in the above "Person" schema can be integrated with
semantic information adding the <tt>@type</tt> and <tt>@context</tt> properties.</t>
        <figure anchor="ex-json-ld">
          <name>Example of a schema instance transformed in a JSON-LD object.</name>
          <sourcecode type="json"><![CDATA[
{
  "@context": {
    "@vocab": "https://w3.org/ns/person#"
  },
  "@type": "Person",
  "givenName": "John",
  "familyName": "Doe"
}
]]></sourcecode>
        </figure>
        <t>This document shows how
to integrate into a JSON Schema document
information that can be used
to add the <tt>@context</tt> and <tt>@type</tt>
properties to the associated JSON Schema instances.</t>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>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"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
These words may also appear in this document in
lower case as plain English words, absent their normative meanings.
<?line -8?>
        </t>
        <t>The terms  "content", "content negotiation", "resource",
and "user agent"
in this document are to be interpreted as in <xref target="HTTP"/>.</t>
        <t>The terms "fragment" and "fragment identifier"
in this document are to be interpreted as in <xref target="URI"/>.</t>
        <t>The terms "node", "alias node", "anchor" and "named anchor"
in this document are to be intepreded as in <xref target="YAML"/>.</t>
        <t>The terms "schema" and "schema instance"
in this document are to be intepreded as in <xref target="JSONSCHEMA"/>
draft-4 and higher.</t>
        <t>The terms "JSON object", "JSON document", "member", "member name"
in this document are to be intepreded as in <xref target="JSON"/>.
The term "property" - when referred to a JSON document
such as a schema instance -
is a synonym of "member name",
and the term "property value" is a synonym of "member value".</t>
        <t>The terms "@context", "@type", "@id", "@value" and "@language" are to be interpreted as JSON-LD keywords in <xref target="JSON-LD-11"/>,
whereas the term "context" is to be interpreted as a JSON-LD Context
defined in the same document.</t>
        <t>Since JSON-LD is a serialization format for RDF,
the document can use JSON-LD and RDF interchangeably
when it refers to the semantic interpretation of a resource.</t>
        <t>The JSON Schema keywords defined in <xref target="keywords"/>
are collectively named "semantic keywords".</t>
      </section>
    </section>
    <section anchor="keywords">
      <name>JSON Schema keywords</name>
      <t>A schema (see <xref target="JSONSCHEMA"/>) MAY
use the following JSON Schema keywords,
collectively named "semantic keywords"
to provide semantic information
for all related schema instances.</t>
      <dl>
        <dt>x-jsonld-type:</dt>
        <dd>
          <t>This keyword conveys an RDF type (see <xref target="RDF"/>)
 for the JSON schema instances described by the associate
 schema. It is defined in <xref target="keywords-type"/>.</t>
        </dd>
        <dt>x-jsonld-context:</dt>
        <dd>
          <t>This keyword conveys a JSON-LD context
 for the JSON schema instances described by the associate
 schema. It is defined in <xref target="keywords-context"/>.</t>
        </dd>
      </dl>
      <t>This specification MAY be used to:</t>
      <ul spacing="normal">
        <li>
          <t>populate the <tt>@type</tt> property along the schema instance objects;</t>
        </li>
        <li>
          <t>compose an "instance context" to populate the <tt>@context</tt>
property at the root of the schema instance.</t>
        </li>
      </ul>
      <t>The schema MUST be of type "object".
This is because <xref target="JSON-LD-11"/> does not define a way
to provide semantic information on JSON values that
are not JSON objects.</t>
      <t>The schema MUST NOT describe a JSON-LD
(e.g. of <tt>application/ld+json</tt> media type)
or conflicts will arise, such as
which is the correct <tt>@context</tt> or <tt>@type</tt>
(see <xref target="sec-conflicts"/>).</t>
      <t>Both JSON Schema keywords defined in this document
might contain URI references.
Those references MUST NOT be dereferenced automatically,
since there is no guarantee that they point to actual
locations.
Moreover they could reference unsecured resources
(e.g. using the "http://" URI scheme <xref target="HTTP"/>).</t>
      <t><xref target="ex"/> provides various examples of integrating
semantic information in schema instances.</t>
      <section anchor="keywords-type">
        <name>The x-jsonld-type JSON Schema keyword</name>
        <t>The x-jsonld-type value
provides information on the RDF type of the associate
schema instances.</t>
        <t>It SHOULD NOT reference an <eref target="https://www.w3.org/TR/rdf11-concepts/#section-Datatypes">RDF Datatype</eref>, because
it is not intended to provide
syntax information, but only semantic ones.</t>
      </section>
      <section anchor="keywords-context">
        <name>The x-jsonld-context JSON Schema keyword</name>
        <t>The x-jsonld-context value
provides the information required to interpret the associate
schema instances as JSON-LD
according to the specification in <eref target="https://www.w3.org/TR/json-ld11/#interpreting-json-as-json-ld">Section 6.1 of JSON-LD-11</eref>.</t>
        <t>Its value MUST be a valid JSON-LD Context
(see
<eref target="https://www.w3.org/TR/json-ld11/#context-definitions">Section 9.15 of JSON-LD-11</eref>
).</t>
        <t>When context composition (see <xref target="int-composability"/>) is needed,
the context SHOULD be provided in the form of a JSON object;
in fact, if the x-jsonld-context is an URL string,
to generate the instance context that URL needs to be
dereferenced and processed.</t>
        <figure anchor="ex-url-contexts">
          <name>Composing URL contexts requires dereferencing them.</name>
          <sourcecode type="yaml"><![CDATA[
Place:
  type: object
  x-jsonld-context:
    "@vocab": "https://my.context/location.jsonld"
  properties:
    country: {type: string}

Person:
  x-jsonld-context: https://my.context/person.jsonld
  type: object
  properties:
    birthplace:
      $ref: "#/Place"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="interpreting">
        <name>Interpreting schema instances</name>
        <t>This section describes an OPTIONAL workflow
to interpret a schema instance as JSON-LD.</t>
        <ol spacing="normal" type="1"><li>
            <t>ensure that the initial schema instance does not contain
any <tt>@context</tt> or <tt>@type</tt> property.
For further information see <xref target="sec-conflicts"/>;</t>
          </li>
          <li>
            <t>add the <tt>@context</tt> property with the value of x-jsonld-context.
This will be the initial "instance context": the only one that will be mangled;</t>
          </li>
          <li>
            <t>add the <tt>@type</tt> property with the value of x-jsonld-type;</t>
          </li>
          <li>
            <t>iterate on each instance property like the following:  </t>
            <ul spacing="normal">
              <li>
                <t>identify the sub-schema associated to the property
(e.g. resolving $refs)
and check the presence of semantic keywords;</t>
              </li>
              <li>
                <t>for the x-jsonld-type, add the <tt>@type</tt> property to the sub-instance;</t>
              </li>
              <li>
                <t>for the x-jsonld-context, integrate its information in the instance context
when they are not already present;</t>
              </li>
              <li>
                <t>iterate this process in case of nested entries.</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>The specific algorithm
for integrating the values of x-jsonld-context
present in sub-schemas
into the instance context (see <xref target="keywords"/>)
is an implementation detail.</t>
      </section>
    </section>
    <section anchor="int">
      <name>Interoperability Considerations</name>
      <t>See the interoperability considerations for the media types
and specifications used, including <xref target="YAML-IANA"/>, <xref target="JSON"/>, <xref target="OAS"/>,
<xref target="JSONSCHEMA"/> and <xref target="JSON-LD-11"/>.</t>
      <t>Annotating a schema with semantic keywords
containing JSON-LD keywords
(e.g. <tt>@context</tt>, <tt>@type</tt> and <tt>@language</tt>)
may hinder its ability to be interpreted as a JSON-LD document
(e.g. using the <eref target="https://www.w3.org/2019/wot/json-schema#json-ld11-ctx">JSON-LD 1.1 context for the JSON Schema vocabulary</eref>);
this can be mitigated extending that context and specifying
that Linked Data keywords are JSON Literals.</t>
      <sourcecode type="json"><![CDATA[
{ "@context": {
    "x-jsonld-context: { "@type": "@json"},
    "x-jsonld-type: { "@type": "@json"}
  }
}
]]></sourcecode>
      <t>This is generally not a problem, since a generic
<xref target="JSONSCHEMA"/> document cannot be reliably interpreted
as JSON-LD using a single context: this is because the same
JSON member keys can have different meanings depending
on their JSON Schema position (see <eref target="https://www.w3.org/2019/wot/json-schema#interpreting-json-schema-as-json-ld-1-1">the notes in the  Interpreting JSON Schema as JSON-LD 1.1</eref> section of <xref target="JSON-SCHEMA-RDF"/>).</t>
      <section anchor="int-syntax-oos">
        <name>Syntax is out of scope</name>
        <t>This specification is not designed to restrict
the syntax of a JSON value nor to support a conversion
between JSON Schema and XMLSchema
(see <xref target="keywords-type"/>).</t>
      </section>
      <section anchor="int-expressivity">
        <name>Limited expressivity</name>
        <t>Not all RDF resources can be expressed as JSON documents
annotated with <tt>@context</tt> and <tt>@type</tt>:
this specification is limited by the possibilities
of <eref target="https://www.w3.org/TR/json-ld11/#interpreting-json-as-json-ld">Section 6.1 of JSON-LD-11</eref>.
On the other hand, since this approach
delegates almost all the processing to of JSON-LD,
as long as JSON-LD evolves
it will cover further use cases.</t>
      </section>
      <section anchor="int-no-jsonld">
        <name>Disjoint with JSON-LD</name>
        <t>This specification is not designed to pre-process
or mangle JSON-LD documents
(e.g. to add a missing <tt>@type</tt> to a JSON-LD document),
but only to support schemas that do not describe JSON-LD documents.</t>
        <t>Applications exchanging JSON-LD documents
need to explicitly populate <tt>@type</tt> and <tt>@context</tt>,
and use a proper media type
since Linked Data processing and interpretation
requires further checks.</t>
        <t>If these applications describes messages using <xref target="JSONSCHEMA"/> or <xref target="OAS"/>,
they needs to
process them with a JSON-LD processor
and declare all required properties
in the schema - like in the example below.</t>
        <sourcecode type="yaml"><![CDATA[
PersonLD:
  type: object
  required: [ "@context", "@type", "givenName", "familyName" ]
  properties:
    "@context":
      type: object
      enum:
      - "@vocab": "https://w3.org/ns/person#"
    "@type":
      type: string
      enum:
      - Person
    givenName:
      type: string
    familyName:
      type: string
]]></sourcecode>
      </section>
      <section anchor="int-composability">
        <name>Composability</name>
        <t>Limited composability can be achieved applying the process described
in <xref target="interpreting"/>.
Automatic composability is not an explicit goal of this specification
because of its complexity. One of the issue is that
the meaning of a JSON-LD keyword is affected by
their position. For example, <tt>@type</tt>:</t>
        <ul spacing="normal">
          <li>
            <t>in a node object, adds an <tt>rdf:type</tt> arc to the RDF graph
(it also has a few other effects on processing, e.g. by enabling type-scoped contexts)</t>
          </li>
          <li>
            <t>in a value object, specifies the datatype of the produced literal</t>
          </li>
          <li>
            <t>in the context, and more precisely in a term definition,
specifies <eref target="https://www.w3.org/TR/json-ld11/#type-coercion">type coercion</eref>.
It only applies when the value of the term is a string.</t>
          </li>
        </ul>
        <t>These issues can be tackled in future versions of this specifications.</t>
        <t>Moreover, well-designed schemas do not usually have
more than 3 or 4 nested levels.
This means that, when needed, it is possible
to assemble and optimize an instance context (see <xref target="keywords"/>)
at design time and use it to valorize x-jsonld-context
(see <xref target="ex-redundant-context"/>).</t>
        <t>Once a context is assembled, the RDF data can be
generated using the algorithms described in <xref target="JSONLD-11-API"/>
for example through a library.</t>
        <sourcecode type="python"><![CDATA[
from pyld import jsonld
...
jsonld_text = jsonld.expand(schema_instance, context)
]]></sourcecode>
      </section>
    </section>
    <section anchor="sec">
      <name>Security Considerations</name>
      <t>See the interoperability considerations for the media types
and specifications used, including <xref target="YAML-IANA"/>, <xref target="JSON"/>, <xref target="OAS"/>,
<xref target="JSONSCHEMA"/> and <xref target="JSON-LD-11"/>.</t>
      <section anchor="sec-integrity">
        <name>Integrity and Authenticity</name>
        <t>Adding a semantic context to a JSON document
alters its value and, in an implementation-dependent way,
can lead to reordering of fields.
This process can thus affect the processing of digitally signed content.</t>
      </section>
      <section anchor="sec-conflicts">
        <name>Conflicts</name>
        <t>If an OAS document includes the keywords defined in <xref target="keywords"/>
the provider explicitly states that the semantic of the schema instance:</t>
        <ul spacing="normal">
          <li>
            <t>is defined at contract level;</t>
          </li>
          <li>
            <t>is the same for every message;</t>
          </li>
          <li>
            <t>and is not conveyed nor specific for each message.</t>
          </li>
        </ul>
        <t>In this case, processing the semantic conveyed in a message
might have security implications.</t>
        <t>An application that relies on this specification
might want to define separate processing streams for JSON documents
and RDF graphs, even when RDF graphs are serialized as JSON-LD documents.
For example, it might want to raise an error
when an <tt>application/json</tt> resource contains unexpected properties
impacting on the application logic
like <tt>@type</tt> and <tt>@context</tt>.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>None</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="YAML" target="https://yaml.org/spec/1.2.2/">
          <front>
            <title>YAML Ain't Markup Language Version 1.2</title>
            <author initials="" surname="Oren Ben-Kiki">
              <organization/>
            </author>
            <author initials="" surname="Clark Evans">
              <organization/>
            </author>
            <author initials="" surname="Ingy dot Net">
              <organization/>
            </author>
            <author initials="" surname="Tina Müller">
              <organization/>
            </author>
            <author initials="" surname="Pantelis Antoniou">
              <organization/>
            </author>
            <author initials="" surname="Eemeli Aro">
              <organization/>
            </author>
            <author initials="" surname="Thomas Smith">
              <organization/>
            </author>
            <date year="2021" month="October" day="01"/>
          </front>
        </reference>
        <reference anchor="OAS">
          <front>
            <title>OpenAPI Specification 3.0.0</title>
            <author initials="" surname="Darrel Miller">
              <organization/>
            </author>
            <author initials="" surname="Jeremy Whitlock">
              <organization/>
            </author>
            <author initials="" surname="Marsh Gardiner">
              <organization/>
            </author>
            <author initials="" surname="Mike Ralphson">
              <organization/>
            </author>
            <author initials="" surname="Ron Ratovsky">
              <organization/>
            </author>
            <author initials="" surname="Uri Sarid">
              <organization/>
            </author>
            <date year="2017" month="July" day="26"/>
          </front>
        </reference>
        <reference anchor="JSON-LD-11" target="https://www.w3.org/TR/json-ld11/">
          <front>
            <title>JSON-LD 1.1</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSONSCHEMA" target="https://json-schema.org/specification.html">
          <front>
            <title>JSON Schema</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSON">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RDF" target="https://www.w3.org/TR/rdf11/">
          <front>
            <title>RDF Concepts and Abstract Syntax</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RDFS" target="https://www.w3.org/TR/rdf-schema/">
          <front>
            <title>RDF Schema 1.1</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="YAML-IANA" target="https://www.iana.org/assignments/media-types/application/yaml">
          <front>
            <title>The application/yaml Media Type</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </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="I-D.ietf-jsonpath-base">
          <front>
            <title>JSONPath: Query expressions for JSON</title>
            <author fullname="Stefan Gössner" initials="S." surname="Gössner">
              <organization>Fachhochschule Dortmund</organization>
            </author>
            <author fullname="Glyn Normington" initials="G." surname="Normington">
         </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="24" month="September" year="2023"/>
            <abstract>
              <t>   JSONPath defines a string syntax for selecting and extracting JSON
   (RFC 8259) values from a JSON value.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-base-21"/>
        </reference>
        <reference anchor="JSON-POINTER">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="JSONLD-11-API" target="https://www.w3.org/TR/json-ld11-api/">
          <front>
            <title>JSON-LD 1.1 Processing Algorithms and API</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSON-SCHEMA-RDF" target="https://www.w3.org/2019/wot/json-schema/">
          <front>
            <title>JSON Schema in RDF</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SHACL" target="https://www.w3.org/TR/shacl/">
          <front>
            <title>Shapes Constraint Language (SHACL)</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="July" day="20"/>
          </front>
        </reference>
        <reference anchor="OWL" target="https://www.w3.org/TR/owl2-overview/">
          <front>
            <title>OWL 2 Web Ontology Language Document Overview</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="XS" target="https://www.w3.org/2001/XMLSchema">
          <front>
            <title>XML Schema</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 529?>

<section anchor="ex">
      <name>Examples</name>
      <section anchor="schema-with-semantic-information">
        <name>Schema with semantic information</name>
        <t>The following example shows a
Person JSON Schema with semantic information
provided by the x-jsonld-type and x-jsonld-context.</t>
        <figure anchor="ex-base">
          <name>A JSON Schema data model with semantic context and type.</name>
          <sourcecode type="example"><![CDATA[
Person:
  "x-jsonld-type": "https://schema.org/Person"
  "x-jsonld-context":
     "@vocab": "https://schema.org/"
     custom_id: null  # detach this property from the @vocab
     country:
       "@id": addressCountry
       "@language": en
  type: object
  required:
  - given_name
  - family_name
  properties:
    familyName: { type: string, maxLength: 255  }
    givenName:  { type: string, maxLength: 255  }
    country:    { type: string, maxLength: 3, minLength: 3 }
    custom_id:  { type: string, maxLength: 255  }
  example:
    familyName: "Doe"
    givenName: "John"
    country: "FRA"
    custom_id: "12345"
]]></sourcecode>
        </figure>
        <t>The example object is assembled as a JSON-LD object as follows.</t>
        <sourcecode type="json"><![CDATA[
{
  "@context": {
    "@vocab": "https://schema.org/",
    "custom_id": null
  },
  "@type": "https://schema.org/Person",
  "familyName": "Doe",
  "givenName": "John",
  "country": "FRA",
  "custom_id": "12345"
}
]]></sourcecode>
        <t>The above JSON-LD can be represented as <tt>text/turtle</tt> as follows.</t>
        <sourcecode type="text"><![CDATA[
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
@prefix schema: <https://schema.org/>

_:b0 rdf:type schema:Person    ;
     schema:country     "FRA"  ;
     schema:familyName  "Doe"  ;
     schema:givenName   "John" .
]]></sourcecode>
      </section>
      <section anchor="ex-semantic-and-vocabulary">
        <name>Schema with semantic and vocabulary information</name>
        <t>The following example shows a
"Person" schema with semantic information
provided by the x-jsonld-type and x-jsonld-context.</t>
        <figure anchor="ex-complete-example">
          <name>A JSON Schema data model with semantic context and type.</name>
          <sourcecode type="example"><![CDATA[
Person:
  "x-jsonld-type": "https://schema.org/Person"
  "x-jsonld-context":
     "@vocab": "https://schema.org/"
     email: "@id"
     custom_id: null  # detach this property from the @vocab
     country:
       "@id": addressCountry
       "@type": "@id"
       "@context":
          "@base": "http://publications.europa.eu/resource/authority/country/"

  type: object
  required:
  - email
  - given_name
  - family_name
  properties:
    email: { type: string, maxLength: 255  }
    familyName: { type: string, maxLength: 255  }
    givenName:  { type: string, maxLength: 255  }
    country:    { type: string, maxLength: 3, minLength: 3 }
    custom_id:  { type: string, maxLength: 255  }
  example:
    familyName: "Doe"
    givenName: "John"
    email: "jon@doe.example"
    country: "FRA"
    custom_id: "12345"
]]></sourcecode>
        </figure>
        <t>The resulting RDF graph is</t>
        <figure anchor="ex-rdf-from-json">
          <name>An RDF graph with semantic context and type.</name>
          <sourcecode type="text"><![CDATA[
@prefix schema: <https://schema.org/> .
@prefix country: <http://publications.europa.eu/resource/authority/country/> .

<mailto:jon@doe.example>
  schema:familyName "Doe"          ;
  schema:givenName "John"          ;
  schema:addressCountry country:FRA .
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ex-cyclic-schema">
        <name>Cyclic schema</name>
        <t>The following schema contains a cyclic reference.</t>
        <sourcecode type="yaml"><![CDATA[
Person:
  description: Simple cyclic example.
  x-jsonld-type: Person
  x-jsonld-context:
    "email": "@id"
    "@vocab": "https://w3.org/ns/person#"
    children:
      "@container": "@set"
  type: object
  properties:
    email: { type: string }
    children:
      type: array
      items:
        $ref: '#/Person'
  example:
    email: "mailto:a@example"
    children:
    - email: "mailto:dough@example"
    - email: "mailto:son@example"
]]></sourcecode>
        <t>The example schema instance contained in the above schema
results in the following JSON-LD document.</t>
        <sourcecode type="json"><![CDATA[
{
  "email": "mailto:a@example",
  "children": [
    {
      "email": "mailto:dough@example",
      "@type": "Person"
    },
    {
      "email": "mailto:son@example",
      "@type": "Person"
    }
  ],
  "@type": "Person",
  "@context": {
    "email": "@id",
    "@vocab": "https://w3.org/ns/person#",
    "children": {
      "@container": "@set"
    }
  }
}
]]></sourcecode>
        <t>Applying the workflow described in <xref target="interpreting"/>
just recursively copying the x-jsonld-context,
the instance context could have been more complex.</t>
        <figure anchor="ex-redundant-context">
          <name>An instance context containing redundant information</name>
          <sourcecode type="json"><![CDATA[
{
  ...
  "@context": {
    "email": "@id",
    "@vocab": "https://w3.org/ns/person#",
    "children": {
      "@container": "@set",
        "@context": {
          "email": "@id",
          "@vocab": "https://w3.org/ns/person#",
          "children": {
            "@container": "@set"
          }
        }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ex-instance-context">
        <name>Composite instance context</name>
        <t>In the following schema document,
the "Citizen" schema references the "BirthPlace" schema.</t>
        <figure anchor="ex-object-contexts">
          <name>A schema with object contexts.</name>
          <sourcecode type="yaml"><![CDATA[
BirthPlace:
  x-jsonld-type: https://w3id.org/italia/onto/CLV/Feature
  x-jsonld-context:
    "@vocab": "https://w3id.org/italia/onto/CLV/"
    country:
      "@id": "hasCountry"
      "@type": "@id"
      "@context":
        "@base": "http://publications.europa.eu/resource/authority/country/"
    province:
      "@id": "hasProvince"
      "@type": "@id"
      "@context":
        "@base": "https://w3id.org/italia/data/identifiers/provinces-identifiers/vehicle-code/"
  type: object
  required:
    - province
    - country
  properties:
    province:
      description: The province where the person was born.
      type: string
    country:
      description: The iso alpha-3 code of the country where the person was born.
      type: string
  example:
    province: RM
    country: ITA
Citizen:
  x-jsonld-type: Person
  x-jsonld-context:
    "email": "@id"
    "@vocab": "https://w3.org/ns/person#"
  type: object
  properties:
    email: { type: string }
    birthplace:
      $ref: "#/BirthPlace"
  example:
    email: "mailto:a@example"
    givenName: Roberto
    familyName: Polli
    birthplace:
      province: LT
      country: ITA

]]></sourcecode>
        </figure>
        <t>The example schema instance contained in the above schema
results in the following JSON-LD document.
The instance context contains information from both
"Citizen" and "BirthPlace" semantic keywords.</t>
        <figure anchor="ex-composite-context">
          <name>A @context that includes information from different schemas.</name>
          <sourcecode type="json"><![CDATA[
{
  "email": "mailto:a@example",
  "givenName": "Roberto",
  "familyName": "Polli",
  "birthplace": {
    "province": "RM",
    "country": "ITA",
    "@type": "https://w3id.org/italia/onto/CLV/Feature"
  },
  "@type": "Person",
  "@context": {
    "email": "@id",
    "@vocab": "https://w3.org/ns/person#",
    "birthplace": {
      "@context": {
        "@vocab": "https://w3id.org/italia/onto/CLV/",
        "city": "hasCity",
        "country": {
          "@id": "hasCountry",
          "@type": "@id",
          "@context": {
            "@base": "http://publications.europa.eu/resource/authority/country/"
          }
        },
        "province": {
          "@id": "hasProvince",
          "@type": "@id",
          "@context": {
            "@base": "https://w3id.org/italia/data/identifiers/provinces-identifiers/vehicle-code/"
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>That can be serialized as <tt>text/turtle</tt> as</t>
        <figure anchor="ex-composite-context-turtle">
          <name>The above entry in text/turtle</name>
          <sourcecode type="text"><![CDATA[
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix eu: <https://w3.org/ns/person#> .
@prefix itl: <https://w3id.org/italia/onto/CLV/> .

<mailto:a@example>
  rdf:type eu:Person ;
  eu:birthplace _:b0 ;
  eu:familyName "Polli" ;
  eu:givenName  "Roberto"
.
_:b0 rdf:type itl:Feature ;
  itl:hasCountry <http://publications.europa.eu/resource/authority/country/ITA> .
  itl:hasProvince <https://w3id.org/italia/data/identifiers/provinces-identifiers/vehicle-code/RM>
.
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Thanks to Giorgia Lodi, Matteo Fortini and Saverio Pulizzi for being the initial contributors of this work.</t>
      <t>In addition to the people above, this document owes a lot to the extensive discussion inside
and outside the workgroup.
The following contributors have helped improve this specification by
opening pull requests, reporting bugs, asking smart questions,
drafting or reviewing text, and evaluating open issues:</t>
      <t>Pierre-Antoine Champin,
and Vladimir Alexiev.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="faq">
      <name>FAQ</name>
      <dl>
        <dt>Q: Why this document?</dt>
        <dd>
          <t>There's currently no standard way to provide machine-readable semantic
information in <xref target="OAS"/> / <xref target="JSONSCHEMA"/> to be used at contract time.</t>
        </dd>
        <dt>Q: Does this document support the exchange of JSON-LD resources?</dt>
        <dd>
          <t>This document is focused on annotating schemas that are used
at contract/design time, so that application can exchange compact
JSON object without dereferencing nor interpreting
external resources at runtime.
</t>
          <t>While you can use the provided semantic information to generate
JSON-LD objects, it is not the primary goal of this specification:
context information are not expected to be dereferenced at runtime
(see security considerations in JSON-LD)
and the semantics of exchanged messages is expected
to be constrained inside the application.</t>
        </dd>
        <dt>Q: Why don't use existing <xref target="JSONSCHEMA"/> keywords like <tt>externalDocs</tt> ?</dt>
        <dd>
          <t>We already tried, but this was actually squatting a keyword designed
for <eref target="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#externalDocumentationObject">human readable documents</eref>.</t>
        </dd>
        <dt>Q: Why using <tt>x-</tt> keywords?</dt>
        <dd>
          <t>OpenAPI 3.0 considers invalid unregistered keywords that don't start with <tt>x-</tt>,
and we want a solution that is valid for all OAS versions &gt;= 3.0.</t>
        </dd>
        <dt>Q: Why not using a full-semantic approach?</dt>
        <dd>
          <t>This approach allows API providers to attach metadata to their
specification without modifying their actual services nor their
implementation, since custom keywords are ignored by OpenAPI toolings
like Gateways and code generators.</t>
        </dd>
        <dt>Q: Why not defining a mechanism to attach semantic information to</dt>
        <dd>
          <t/>
        </dd>
        <dt>   non-object schemas (e.g. JSON Strings) like other implementations?</dt>
        <dd>
          <t>This is actually problematic. Look at this example that reuses
the <tt>TaxCode</tt> schema and semantic in different properties.</t>
        </dd>
        <dt>Q: Why don't use SHACL or OWL restrictions instead of JSON Schema?</dt>
        <dd>
          <t>Web and mobile developers consider JSON Schema is easier to use than SHACL.
Moreover, OWL restrictions are about semantics,
and are not designed to restrict the syntax.</t>
        </dd>
        <dt>Q: Why don't design for composability first?</dt>
        <dd>
          <t>JSON-LD is a complex specification.
~~~ yaml
 TaxCode:
   type: string
   $linkedData:
     "@id": "https://w3id.org/italia/onto/CPV/taxCode"
     "term": "taxCode"
 Contract:
   ...
   properties:
     employer_tax_code:
       # Beware! TaxCode.$linkedData.term == 'taxCode'
       $ref: "#/components/schemas/TaxCode"
     employee_tax_code:
       # Here we are reusing not only the schema,
       #   but even the same term.
       $ref: "#/components/schemas/TaxCode"
~~~
</t>
          <t>For this reason, composability is limited to the object level.</t>
        </dd>
      </dl>
    </section>
    <section numbered="false" removeInRFC="true" anchor="change-log">
      <name>Change Log</name>
      <t>TBD</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+0923Ibx5Xv8xW94FbZrMUAomwnERQ7oknZZkKJCknH2VKp
zMFME2hrMIPMhRTMUr5lP2Sfdn9sz617ugcDkUq82a2tZbksYKYvp8/9nD7d
iOM4akyT65k6f35xqQ5fnahTU7zVmTpOmkT9QW9uyyqro2Q+r/TNLMrKtEhW
0DyrkusmXpd5buJK102yNnGexW+lQ/zo8yhNGr0oq81MmeK6jCKzrmaqqdq6
efzo0ZNHj6Ok0slMfasLXSV5BP3eLqqyXc8iGWWmTopGV4Vu4mOcLopgniL7
McnLAkDY6Dpam5l63ZTpWMH/TJHpohmruqyaSl/X8Gmzkg9NZVJ4lZardSIf
VtAYXpkiN4UeK1jaKlmvTbF4E0U3umj1LFJqWeJql02zrmfT6cI0y3Y+gc5T
Uy4WMKpOVtN7cAGjVHpd/p2jTE1dt7DiPbVKTD5TVTk31PjZAh/gaBG85LFj
ahznyVxDU52ZpqwM4DhK2mZZVrCwGKBSsPYaKD9Rr3AgesLUPS/numpK73lZ
LWbq2MDwSa4uq6Sor8tqlTSmLNSxXidVsyLcn8B7kxTq2/IGKIfPqLveDTS+
Tsu2aJBTsPsmigoe+4ZI8K+HL05n1ExYFR+oQ1N80qgXSfW2XavTpFi0yUKr
P+mqRpAOJo+pRwY8OFOPHz0+iA8exY8O6KFDAvzFjIOzShfqa13EfzBvjf/i
KIcZ1PMbWLD/+KRYbIBjGvVSN/7zS1Mk6sV//nue68p//ioBTs5NrQ6LpixM
2fovn+sVvFOHVRkMBayX1OpiBRTl1SfVQjcdG22SVT4BukzrtU6nsOLJ4yk0
PDu8CLB1ttYFyvUFtDLXJmWafTZ5NHkUoOjg1/GjX8ePf7ULRcdJVelcvTD9
tf1eV3q1UT8sYb4yfeu/AvLUS/VtUmUgYkGnF+atVudJvl7WZeG/OAfgzpOm
vKnfbvzn31dGXSSVyeDh7y/OXsanx/HBQbBSeQzEPxhE2O3t7eT2M0LZ5fn0
J5gYBOzgYOqtuA6W/G2lFwtQgnkOYhqQ02hARozEhIWpo2WyAsURYutGq9Oy
WOR6IxBfHH33/MXhFsTqIl2CeAxCTDDW9N5R2tFwsmxWuYwNePvm6DePv3gC
37+7vHxF358cHCCJvz8/oa+fPfkNEvf8+JsABviujsoi1eumVqBe1eEcNBIo
SXWxKZrk3QNQWWXXjEYY62JrcF7fA6kCQ8mCpyL68cnhyxBrl0utQFPnggcS
BPUCtFyiLjdrvXMW0EuMxqSuzYKUUz1dYb+4gX71tD8o2Kzi2ldFJ/HxxOjm
OkbCrJNmGc+Tmt4Q7706O3l5+fycsP2rJ6Rt8DlxagwyOPsYtozBAEx3sLd6
VZWphlUUC3WYg5EFHbES6r06seAww8UdwXdPDOL/ZHpbNj7HbU1uKWkKpCu8
vfju8ChUzRfLBBCJ/IQ8ZIqmU82fUuv9B6CgXiZpPh1STsjOZz+EU8J39Vj9
oOfqDMQRJHXTzXlcpi2SWZ2BNbox+vYBs5e3+eO4lPYIxZ9Dlv4zGJ8PiGyA
1EcHU2gureM4VonIVhRdLsEaZBa+TF+DIqlVc1ta7we+lGpdlTcm06qGAYrG
pMoxJKhJ0DjDyh35wCeYnaYeR/iqbtdrcJHA6hYETHxtqrrp5qill0YpmUQE
+MpkWa7RwwCfrCqzNsWZoggnFyCrWrV1m+T5RrGe2uwCWzX6XQMuhSrbJi6v
QYgAKgfk0yhp1Bw8IHDqEElB3xrBSiszBxcVBoKpaw0fAFVWN8KkBFutymt8
o6vrJNWMYUODuJnUp7XW6u4OR0lMGltw6/fv9ydCIvhvrtOkhWnCtWalKsAB
SPLbZFOrmyRvNbhm6RLoCP5bkiXzvKMbYB6WawdqlnqjlmghilK9LYDjdAbc
CvA6hDU6XRbIzQa4Apz0JeAE/GW11lWqQRtlCnyDtig0qgEwi4B09G1z/Q4A
P1TXbZ675aCyrEoATX2qJ4uJugV1gZoDlTOoDsCEJr1R7wNQNa0KIAXHV93C
Uus1riYS2KOGfD8wfzgC0m3dqSJYV7diBZjWIEYbtUIQFzpCdiImLRoA1xQp
DFzD8jIMNey4NCYupW2Y5JX+S2vAw0CCwdpelJVG6QwmUzn0qlPQPZYsVnBg
ho0iCgF2mQcA0CnyPmso+BrRUGTssBV4r+X8J2CiWdSUZV6rHH2V16S+3hB4
r0HnvFHopGNUQbyGtMExkTd0FnkLIIFAPoSXQHEWasSYWykQDR8jdq+rcqVu
QZfhuxV4yzly7o3OSyB8PemrDVklDKVqgwMBrtNlUph6BbCrpGmQ6oNSCK9t
yFcze4F3t0GiZeYa6EBaCWIGwAPh7nXnwrwZQ4e2tnqEGGFLmfR0yDfA/vpd
gjCOiXSDmksk8jX4sG/2I8BceYuAWpH3ICbBTizyEZHJOgF0AWdr1EMM1JY8
8vojtNoZrpVW9QZV0Wv0Nd5MIpganWOSe9sq0KUUpn0e3S6RNtz6AHGH8yJe
YW05WC3AwVY3wMPeHoRGSc4wHxN2wH0sDTBEn7goizjadYl4wAUtsOcMFHKH
EdCBSHv0M1XgHXbjzJMUA/r5JqAhGC/WBsDulha2CxrpedkslScYZDg62b7m
1bGgAGMqddnX1SDnoEeUBt9Eo+6z3IoePIakVmN0gKJShGmAGjfgy4FHDhEQ
6iYSw6ewbJJmmAFEvOjUm34HwiHO6y3MBtQA+6SdcJlmg52t2cP+lsrTgEiU
Zfj8aSTENQ1yAWoTEt+MICH04/dFBbD5GGIbngnz+bh+Sl1QuQ2K4i3gx5/N
4gm7gViBsmuC4TwDhlLcudgsPOiEv9lHLHauCmmOth73GIrFU6XMgGyS5hpC
4VWSaVppoGVRxslyg5L06Q9Yz3OksLPNQGIPDRyrse40ALX1cHCBsFik3oYy
D6xHcwMxLyEbIEtQytHeko4SnmprNv83YPlQriMl3Zml9bs0bzOc/mp2RbNe
Ta6QqVEn3pQmY78AJ2adAQqasivMPmmZ6XhBaSlRlcJ+68rcAGOAqUbNBiOs
wH7UiJm5BtwZ9GjQNAnnWlcM2RAcDJ7pqbCPzJ5rnhPx7HR3z8m5YIdG/QoU
jdXEglJYE7IzcckGF7xFK3TWrdZk/fOKvR1Pmu/2tj2gKApYjnRxzcoY2ZwZ
o6nAD2wrcl3wASAeVrAAsMmmMws4x8ySfRK9YqKDyvzEA8MqjHfgcdS17+Ch
OsDxrxgva0THlR0PVvXXv/5VUcD2CjilLNBf91rO1KHiF6inMNSbCePC17UD
hb38BRjp4iVmwehrbyAMPakF8RsLQjc0xQM0PHoGBacMrpMVeGcfHJGb0JBj
lNu6reTzveOLTe3Drn5fLov+9BAOaURVdDfjYObL0XPu7vS5KJIVSEDOEudc
DMdZRJLJSO3pd45fYnpomcbKu41qEvTAkHeI8YG6TU9/gKWTfrOI+YjBqm3A
iYlfcOI/lW7OZACXkx6FjyjbQhvuth9ZRUohByYN5iCeasQIHdnRhe2cTmcj
Eg2q6iTLrNm6eoakEPXyTMTtyuMn4UuMqKPoDogxsq1GM3VHxBk9uynTZA7f
Ry5+5NixqKdrAnNvBC3fj6k7TohtZQH00NEcXyDV+XFHdnwOhB9F73fTPtnC
dGNTvIy9xGUfmGJCfklWvO+7LvUSlQX8LxKis7GkOC0ZDE2jwDftqXryZbNM
0O5QzZgnKkQd2pERiNh1XaaG6BkmL3iFogxfltZLx6QFoJI8SlyPRv2iOBIf
vfj+4nI05n/VyzP6fP78j9+fnD8/xs8QHJyeug+RtLj47uz70+PuU9fz6OzF
i+cvj7kzPFXBo2j04vBf4Q0ucHT26vLk7OXh6Yi52EczGktYrTAvCRYFhlFg
Pr4+evUf/3bwOcS5/3T+zdHjg4Mn79/Ll98c/Ppz+AIOSMGzlQXoIf6KQWoE
kaNOKuIAsPDgY2P+H9wIEFikcaHQdZkgtkBLM65WIOrQplRd3xBqU0RgS8BM
puBf40jrHOIw9Rx8WFMveZQxZkqwMUBh0N2TJBzYyARDNqDeb3+H+zYq/s3v
voqYXmiQa+B9YpCiQdTKR1XoRdkYojQ+BvtSthBIjzghMgImA6u9wE7Rg7GM
K3uNydY3E3/+0XWVLLDjiOlnvyqDu1NgCHX1sZN8f37Sm6MABY0Lwc0WdBrl
WwGeXCXzogWBEfjRfRPCfFk3n4RC/oSsH2TonrL4yNH9IESiKRp2aRbATeG0
npHABQbKHx+s9GoO+HSfyIb+DfC8mbhZ1ci6pCMVkyxAPIEJD/ZIexYoqluI
sJN6QIXGkaHHGwhWNitUswGQzHrN1qycShqpXZ35dYgmZ1jG1krgB5PRPzIe
Ue5ZLqnR0W6Os5re5SEtksSsjyMKWCQ6ZeDt/Aj14KCdATnippENl8Q21+hP
WazC6i4M4tB2YmRo3MQ0P7ORYHNB7i9EPOMoCCXReGCmzfbHxWOgRFCxjwq+
9yYi8pqGKexMh2f6ZRE8JVlKqzuEAr5tcRjz1nZ3Z5++fx9xlijHpAooM3H5
UKDshLYt0ndveOy7PTcgZvpqP/TzRGtfgQ2JJNvohXxDY46jhwEV3ZORjpAY
aCgqnZPhrbdtLjsNeUZbLrNoxnkDmUICGQzliVzYpotq39DmAc7RWMT3J/AC
p/kmdAOwr2ylqZOGM8kDVCK43r/3IRXm3g2sYzNp+Y8AU6YiSAmqMPsDxHeB
siQt1uW6zW3OwnqvTutgUYVkcHt6THI8nI3ASFYjeUbuvZN95I5wDuuqdXEW
TERGXVVl2diwsTejSJY8JZdrziEmssNIzMFkKz8fxh6l5myKxKsUg9zHwC7Z
RzqTcw4ktDhQmPDaAhG9OJeWcywRcUYCgL/ydxfz7F+Qua4UbT/SwvYjDuSv
oVFTc0olqUwNYaDYGExLwQfDijctwSRB7OQ5xDCA9YdlZ6PWaezG5F2NrzGx
d5/WCqxntALLzNtF6KiBN8L6UrNIXy6RJbonHTooI+ReZC4vkmJOfBzVpOIb
zn4hsRSYpgorJTSHALRPsi6NRHdp0yY5+I6SK54EewG4/9HmWQeHagtYfYtm
26rsWqjRut0KCrsg6hrRqoicWpw6xNXdnX4H/rGLgTHfVLa1jU/dFhOGNxiP
79rvGtCDEHsgBwXqcIgsnr5n1cScF/Yjdo0cmD2OxoU6bSoi1+mbAdhA73QB
i4dREHvUw1QbhoO9+fQD9QDId1RUMN2THbnY9qv3x1Zoo8Ekq8V4JKlVb0HQ
s204TnHYLotBlNoU2D1YtZq0h1jbu4dbRJ6PX9meysL0xodR7HlZUZKCIHNS
QZyPQI+j79XL/3labgf+u9KWPQcSzMDhelLbsH2fSG33Lq2eTfC7ybb8NdQo
kYPlyeTgi48GRlAad3ux9X6EUPyAbphFOBsZ3qoVNQariIMsKqgyYhuNjjz7
fra7cK6332BdTCTaVu76KQYL11QTaFg0tjjAkD/y/fmppN3GaEYkP6yFIUJb
yOoLeyCE4hJHoS7stk51mMLMk5Tyeb1E5bY7siODtNpMpMnU6soJdx0N5Dtd
6d2dn1kEYehSqVszq4GpOFslE92fZp2bqlmu7VLx758BObCKvSkhYNRLVh0x
U4CYIFZl0tpKX+3ZGVHtK0lRtVVu4UaHeW+Pi0pFJLY9s7tAZGxmSzSYM/DE
ETYzgymLt9d5l+2yKc6+J9WJPRD8YKJ0UWPy3No6RUKR5Fv9nC8jJhgxlhSb
YdPvPC3KGOO+63Vb0Racr7YG3YOnCNRAos35bm6rglUGyFKfN2hSQpndE/IX
tu00zug9qfOyEFTYnqDdFzlugwVQ9fzWD4CELamzaVhUsSIBN8QdFG4U2uIP
AiVwmbmaj7M27KXX7VyKo/z0oihuOxjzM3sa6HnkN8hoyN41Vz/xptBSp2+l
n67JvPr1H90WGUFho4lgbePdWLG2BEuBZbG7RhJKjP08bVP3PZghLceLoRCa
HDDrKCc57rdvZGGNTGyJQK6lLYEwBWcBYelgwxGZ0KHi5PmlZwxhTKlyoxjT
87k62tdD/BgJEOSFOepR/UA5rLrF5HRR+37EBoAKLNAflv113WAJs5REhbuJ
R1IJIkUNpFNAlVxoKw699mnY3tKoCw5qLtwKayUwuEOy2c3O165c8s1Y0lpj
rqUY9zbzsIbFs9xYMlQUlAmnsglhcRKtLY6MRAnZZIKfKhL/ulMd4942iU0/
Xe1HmCdeYsl+RfxmUXFP9sjFJH1P3q6HyiMtLYMgXDxAspcQpFabQY9lqBJy
ryvKTJt3+/tPI2Ji2aFYgW5bkCKAKcGDZYiSxkHRkW7D1Ubwzj9l4QIwFCAC
9ZSEJQ+2kO6G9o+2TfOdt0/0DF+OaPPIb8umeaAh7jTJNpELrtnPwRomEm2U
3DmIwVhx9JZwA5NGgxUKiCOuJ6MSGcy5+bSNvHSjrdmRYha3oKYX5dtkYUSY
kqToW8zDID2ohKGrYLLbBSCtayZNxAGRqQKmCB3O1zgHgE2hFE0YOg1+T28F
wHkPZ6ltx5xfeP55fBAf7DvXw+38d2W9FKOCR3MhUVKNBZVkRlLQLqx2Yg6h
4rKs3w9mioxNk2ApCFszW9nWL4zzciO4JYNNbVFNIpUqePoimuvmFqtIAjyB
EHS1sD0lK0k3Wc6p1H9IIYC5Qb3Ai/EfwXJekrXJKbp1Qf52HYHQqKubiRJW
d7LXu2NTccZivoUuW58iqTvgndrY0rMIyfTfGLCdMT+W5NBhtZQVRALVFnpC
qJFr1EnwKF+VNWNJnBRXrVl6wI1RFCkF6DG0vgHnBdZkxCdLKdli3UkURjTe
Enofm/onStUQRu0QTLaiFN3zYBYEDMQCK+bF2BXcsgLW4Mj+cAK6mNdmrY7b
sPF77Y8jl0PwWFhcA9bdUkbqEnpbM6PN7BJ6tS198a1iByVGgTgVsCT0MFj+
6jKlw3UEvDuEKE7Eq/O8Acmc+TbEoytVWQUbF5ELkyztyPukVA/FvHVwoKL2
whyp3a0HqtqoapK9C3L/bKgbWecOozDmho4G8q6saH2ZTnM0erxnIImULlSM
7N4Qq5CY3XR5aGtE5hoc9u0aICwl2YpC7Rwz9XrHpllXTjEOiijUm4Eg1jPI
QXWOmw//dNGu7Ov4wRUfXbnHrrqi/si87OEapgcUJQVNyAMAmT7ycy4iy2Ee
Joqstg6eWx2M9beaqtWBvTbWV7MM0pUL0t5GEHi/n0SHNl3cG1vUBcxg5Ykq
Yzm12VcutnCdUrXgZ3Y1oRN1Vrh8KNX/cWo9YbsnrkNn+DxHl1JC4GOkbAYi
diisEzFRQbWzsyZU+QeD4Xa98AiFcBRdXFXZ9Uw0QZXaAA4NGwQ6azwB+Klp
uLBiSR7xtb4VM6AJEqo+7tTAWJFmBBulC3C7CPUwekyuQeYyKPsWKAmfBSpB
oeQ7M8nbWmSt6QAIjJKzn8pjeEm4sdSvVxTdpqbW5PfBNLRd3OX/0DXt5npN
k6SlrlJ49wBjSSuy7fcx93Aiep3UGRZ0SnTapQfcpjXvKRPDc7RZa1sGKtzb
JOnbnPOH1y3VOYqHUw/zmn8+YaxudZ7HzqZZ6yKGxZ6UQX81IkQB4xXqM1Sq
n9tYOMfK/1o2upAfmT3HvCpJfkrhMHshuaZaKfB6VlhaSiU96wYk9GfK3j8k
2E2sIVbQj4dA8TG0BwNYhDD85+30gfXo9LsYq6+LLCFVIXuU6NidcbjgJ1UF
zGzseJ3KRhn7kc2wZl6Ul3SH3YIap9fBObs3lCSwBqJZVmW7QCOUm3kFcZ8Y
i/WmWeKeNR65WG/yDAN89AMkhTmZTCL++CMB/KW8mIDSAaR8ygT90aJ0bFe2
L9oTy3bbajAbAC79/+5sgGRJFwQ+nSpsAQJMA7AdwLyhsQ2wDIHLIpPt8uOB
ipkkp3pu43YeyItF7dDPscQctWEgd5tsxhEyRq4TiVGAYXUlGhrUR55ZSbHm
BZvTQRVW1X3/Fw8E8YF23EtiKZV6sYlYP7sZyyvuMqXkN2EG+PDCr2tD1IvK
vLcURIChw2S+X1g35La7nHC3yTW4V85WpZsm6Y71sfp4yu9diQ1Jhn8sCxuQ
y+hSzDd6AyNhgOfSb9QLU6fSCT1H2SXGEGC86xRYNxxpf3sSjDeUKVavrZQg
6T09elj4LqmyJ5TcKZstO89j3kopsOz613g1AXrZHnx83wLL1VZYmHUmtx4j
ogpWtt1TytLYUqSwYsoLDgIPAHRnCF2VGK6i0FUFrjDNgD6AXyLA9QE2qrWp
fzz0h+ddyPPwPWW614LYWmqdPeThMcI0Iud5ONrgLCaoioHMZVIkFGkXmk+C
4nEibP7c7oHf7el3vLNyMZQ39OuDKKfb1SK5Mm8qF07Ecw/SBrvHcrt7EoaH
O+K4vu29CdL7Mqu3wRWmxnzf3Dt7L0XX0UDWzTrpA869NwC79Spta3BrfzQQ
hBQtxD1qj1LJ6dJlxjmFT3YJF8aDSmfZrROnnYv8ZuhEYqrjiN92L1213wy8
wA+EQxEGEBQ1/IjFX/SVQwT7vR/6+McK7oLgYQzB+rtTXSya5Uw9/uILzCn2
Dic8sIfbmlQf7PEZfDOF+2Y7d2h+0HTBQQp/dVw831sBV9qHUI6+OT8c9ece
HTz+7PMv+ruZh2ENPDo9fOQiZHc/gYwrkC1NPJco1QpWguQche9UhXnz7qAF
i1+YWn7o4QSfmyWr7NY6Yn7ePq2wW5Z2nFT40LkGwfZI0M3PPBAsvl0W2576
cCV67NpXWjaGGFFXtIcNLj6Q52obS+ThPoMe1+adwkBN/VYKh7zQ5ODJkyfT
R4+njx/HdIsF512Leu8r15VRIL17OPkqin6czR8pGwfaxqIU4e8pC7Y8F0yw
pCMu+g06xCrGa7+BQzGOQChWExf6D+pfZMRu/yTYI7wLjgNBw7hr+P4+xd8/
kvN/T+vLBUikr//xdsDt87jZh5JX/BS1i10LLGXdzju3TLcAVQL/TK1fMuV7
c8CBmwpMsOL7LA0h4+NtjuDwYcbj/w2UNVCW9X4qi2dZqScy0P+U9eIEXKNj
gUOUAzBUm7trKcjVBnM2oH4/qENBgdl2bmW//Zs5GYeLfovoa8pZD31fRUOK
VvSs/XsaDShbUbVDjUL5dUsA0ohm9ojgxSQPQzwaJVQmpMbYYT/apHl34Qup
8JQeyWbkluK2RyZtMAIfeQhX2faA07gXfFWF9BR8TvxCM5YGl9HeUfpGjB2o
tYdn19OlyQHXhdV9rA0TvKaMRqx1M7q/im1QI1n57s3ATZKqSqxiNo1e1Z3y
5QK4T/bE5nzSl3krx8KPybNQkIPp4n7rDFNgYY+tNjBp18K5T7vO4lp89U7X
crOIxdntn4fnT/xYefuUrCPr1kLZ25OFQovXtI47S8J+x3DNY0fp3jFaei5F
EjvH8nFzz0jw/ze7z+tuu9kBG48fzsfWAe/wcfdhZmbYXIXHob8lY0sYw7Rq
f08m+glsA8h62lY1nxVKy7UbY6ukLBossOI6fe+uiZJORdnLi4KoBJOw/4NI
Gzvh3AahzygdILbHg8GRDgNA3UNP/nsfhZ98Kt/NOnsxQAlXyeWS9r63LXZj
K5/v7Q2aZoDCZEjsU6/XSV8Z2FuCRBcww4yOTGN+1l004B0tofdfY+0wVwnb
o1Ke0eneBrXLrH47SpiMaGHovtIpgFhOj07/NP1GJ7jRs9voDFF1x1ihh+XY
jOPUZWLN/GhLnXhu+pCX/ov46DgQBVNFV4LtwfZKXv2dwA3hBx3GaXcYGoRB
5qpj/+mNXpo0R/bJ9HTAFvshBRozO4p8TV0M1Dfa/VVvXcdhG8jFPJSp5yD8
NqnVvKx2X/bRI/bW0AbPxefrZRJ/RtfM2Ky+DeY/dsbAQXALU+cvQuf+5PIw
EqkaEIr/Pj/r73CfPnBAwJP/j/ORvPhIbjjeCqa6G4+3Aejwe3opjwIMb4VJ
fjZDEnB23118cn7qH1D4h7hcl8N2WZx6P61D2Qe8Cyzq1DKdJA+UcL9GeCu5
eI9PFyT7hDRD2UGiDr/oyNM5BZZANMoLZ+u7lCFQyTkL/aTPfSbhnntYfnEX
ZWCBu9yQjzJKnk+Du7nWFuFH/5VDWuDtbBuv0OXxjUT4Zth9+gWNGf95vpC3
Go8xdizH2btfdj2/pP0bWGLk/zvs9ikLKW+huk3qLSHviqalVMXL15CfFxyU
7C7oCbdC+4n0XyR/7mV1dOtlfrZkx28J6w+a7pCHIMfj1BJmd1wiHuaUJDym
auBbJ5qKUvby2M8Dsaayb7xMu1Nv0aSX70eARddQP/zeCdrfkcYCrYerdCNa
Xt+Nnb+FRc9ffBVNQubrdl80LUFu/hX22MFeMb/FIEMdpu52XN6gR84r3tKB
ym8NAGwSdVpmZqxeJE2jSyy8g0jVkIm6gAizMqV61QJ3/mxov3+ubbBqj6RR
tYSZt01ZdVVdGA1ziQNe+GXvS2W3rETLTKsa9y6ZKW/prrO8bGxrOhBC175m
pk7buubTVLjDTrUGZdvgZxeB0+9fTHo5twBCCpuXOscaPrNCsuiBYgisSQRX
iyK7dSvFtbrGn7vAn6LgO1vn7YJucnpLkdgqqRpFjZCxxnwzD9UTVNAH78Im
zLniPo21O3xgCGeSyrlZFA3fjc/1zH/Kk8ysTKUOsQRT31DdwTeHf0SvqWjx
JIfOvgSbn4MGhVlXsDpTVNfpl6OmavUIeOKPM/XDchMi/nfRDM8cQudPapW2
FSoxOq+i6PdCkiqz98/Zux923tOMirR38o1KptQ0LH3mU0p0u4ZfcYMVcxMC
8rikaDW4FE3qzJkx+BIarwK/O8Ag6wnuzMIdybSV+2iT7rBWULSOlSl0Xxqs
wgNr6tXz4a+jSGOvQCSlWloBSX4jBQcJ7/gEvdI2vZO2hZzGszki7IVcX+GN
at2RDCzeAWXE6IEmP9AFq5uydTf1ePVQ2fDdHN6hawtbt7Ndj70LVHkss8I9
yt2VweTWd9dkepf8yTlGV2fD1A6Pb7sF4ShU/OgqmXr1e6awsNLxT3vrU3CZ
bndxpiu4N7UDALsxDKm9tppiAKc7PFpOnIxkJf5CCuIWZK1utsr3XYkaFwZZ
qh2XaX2liAd/0O4sJx7KzPjuBdaQWF1AF3JgzdpfQBPI2UFbIW0LXxF21Lyv
ly2sVzmJc7VSXZmv97s4Z4cnU7mVOA5uiJ7O83I+BXNdTG0t7vSzycHk0WSV
7XlLaF0R4Rnxx36HF64mvXoXuxtEWeLsLch4L7AlIVKPr0Noi0ovAI2oojrU
yVkRRDTomkoOv+DYY0vrW81lXwlIXt52xWymlosW7KVJWEzo6ou/+pJ+osUB
zTXDjOLhy907reGue5dLW8N767t7wVe6Sfju9ZKPxCHIoR2xQr8CI3ttE72g
v5n06Pvd0M3BBdeo8hBhEac9oMTbiuFhR+CQsuLNfIt9vGwXT+zhQMSY34K8
0wXufJUucLxogZIuRPfw4653T7qrdL3l7lAqOBFeJy1qzipUPljEG52Ul6j3
GR6uuQ/X6Kls48mFnJXEIwwT8FPKt3z5kXEXyNiyRhBSWjCd5b5M3h3BMq9s
+O/fvI3KpHPUg7tGt6SeLqxH842/kBFcVo+hP5bRhre+isjvuHveiUR4m2aN
d3IbXckF9lzFTjNTxqqrht8Cgs79zJG5vB9JEJmxGnjoUKLqDiX2Vy12jm9E
9k+M0J30tL7gQjl7+X74szpdKhmjKqHGB47h/HNO57DwGJafBpXQ8oPxx6s/
TRsevwvwRng4AbsGb47EltsZeGME//pJNfzTsK5yo6sfYYwfUw98/NtTX4NA
Vfqf7Nom3gomdDTiyy/VJzL9J15Pl4Ej7Bb0+zkiL9PL/joEBr0Dhu8w0Qm6
EUmNAsDOhD2V5wqdx0EnRQaIqnJdQTMCPPlYIGkDDFt/Q4rL4E0iSY3Kauuo
kXcbOZ28ZDVBtdXkvh6x13RaLh7uxV5+fRz9F9jxu6F8bwAA

-->

</rfc>
