<?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.4 (Ruby 3.2.2) -->
<?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-03" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.0 -->
  <front>
    <title>REST API Linked Data Keywords</title>
    <seriesInfo name="Internet-Draft" value="draft-polli-restapi-ld-keywords-03"/>
    <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="January" day="08"/>
    <area>General</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 92?>

<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 99?>

<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"/>, <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"/>, <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>
      <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="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 526?>

<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+0923Ibx5Xv8xW9YKps1uIiSnZiQbYjmpRsJpSokLSdlEol
DmaaQFuDGWQuJGGW8i37Ifu0+2N7bt3TPRiIVOwkW1vLclnATF9On/s5fbox
Go2i2tSZnqrTZ2fnav/VkTo2+TudqsO4jtUf9fq6KNMqimezUl9No7RI8ngJ
zdMyvqxHqyLLzKjUVR2vzChLR++kw+jBoyiJaz0vyvVUmfyyiCKzKqeqLpuq
fvjgweMHD6O41PFUfatzXcZZBP3ezcuiWU0jGWWqjvJal7muR4c4XRTBPHn6
Ns6KHEBY6ypamal6XRfJUMH/TJ7qvB6qqijrUl9W8Gm9lA91aRJ4lRTLVSwf
ltAYXpk8M7keKljaMl6tTD5/E0VXOm/0NFJqUeBqF3W9qqaTydzUi2Y2hs4T
U8znMKqOl5M7cAGjlHpV/MJRJqaqGljxjlrGJpuqspgZavx0jg9wtAhe8tgj
ajzK4pmGpjo1dVEawHEUN/WiKGFhI4BKwdoroPxYvcKB6AlT97SY6bIuvOdF
OZ+qQwPDx5k6L+O8uizKZVybIleHehWX9ZJwfwTvTZyrb4sroBw+o+56O9D4
OimavEZOwe7rKMp57CsiwV/2XxxPqZmwKj5Q+yb/pFYv4vJds1LHcT5v4rlW
P+iyQpD2xg+pRwo8OFUPHzzcG+09GD3Yo4cOCfA3YhyclDpX3+h89Efzzvgv
DjKYQT27ggX7j4/y+Ro4plYvde0/Pzd5rF78939mmS79569i4OTMVGo/r4vc
FI3/8plewju1XxbBUMB6caXOlkBRXn1cznXdstE6XmZjoMukWulkAiseP5xA
w5P9swBbJyudo1yfQStzaRKm2aPxg/GDAEV7vxs9+N3o4W+3oegwLkudqRem
u7Y/6FIv1+rHBcxXJO/8V0CeaqG+jcsURCzo9MK80+o0zlaLqsj9F6cA3Glc
F1fVu7X//PvSqLO4NCk8/MPZycvR8eFoby9YqTwG4u/1Iuz6+np8/YhQdn46
+QkmBgHb25t4K66CJX9b6vkclGCWgZgG5DQakDFCYsLC1MEiXoLiCLF1pdVx
kc8zvRaIzw6+e/ZifwNidZYsQDx6ISYYK3rvKO1oOF7Uy0zGBrw9P/ji4eeP
4ft35+ev6PvjvT0k8fenR/T10eMvkLinh88DGOC7OijyRK/qSoF6Vfsz0Eig
JNXZOq/jm3ugskwvGY0w1tnG4Ly+e1IFhpIFT8Bi5Je+IjgaHY6Nri9HiJZV
XC9Gs7iiN0T5VydHL8+fndJaf/uYZB2fE5+MQAKmH8MUI1C/ky3MpV6VRaKr
CkyF2s/AxIGELgV3r44sOEzuUYvu7ROD8D2eXBe1T++NyS0eTY5Yhbdn3+0f
hIrxbBGvdIXURAqavG4V46fUevceKKgWcZJN+lQDMtPJj+GU8F09VD/qmToB
YQA5WbdzHhZJgxZAnYAtuDL6+h6zF9fZw1Eh7RGKP4cM9WdQ/R8QmACpD/Ym
0Fxaj0YjFQtnR9H5AnRxauFL9SWIcaXq68L6HvClUKuyuDKpVhUMkNcmUY4h
QUmBvPerVuQDn2B2mmoY4auqWa3AQQGblxMwo0tTVnU7RyW9dGXm+TgiwJcm
TTON9h08orJImwRniiKcXIAsK9VUTZxla8VaYr0NbFXrmxoMuiqaelRcghAB
VA7IJ1Fcqxn4H+BSIZKCvhWClZRmBg4iDARTVxo+AKqsZoJJCbZKFZf4RpeX
caIZw4YGcTOpTyut1e0tjhKbZGTBrd6/3x0LieC/mU7iBqYJ15oWKgfzG2fX
8bpSV3HWaHCMkgXQEbynOI1nWUs3wDws1w5UL/RaLVA/54V6lwPH6RS4FeB1
CKt1ssiRmw1wBbjIC8AJeKtqpctEgzZKFVjmJs81qgEwSoB09CwzfQOA76vL
JsvcchQ4lWUBoKlP9Xg+VtegLlBzoGoE1QGY0KQ3ql0AqqJVAaTgdqprWGq1
wtVEAntUk+cFxgdHQLqtWlUE62pXrADTGsRorZYI4lxHyE7EpHkN4Jo8gYEr
WF6Kjr4dl8bEpTQ1k7zUf20M2HckGKztRVFqlM5gMpVBryoB3WPJYgUHZlgr
ohBgl3kAAJ0g77OGgq8RDUWmBluB71jMfgImmkZ1UWSVytBTeE3q6w2B9xp0
zhuFLjL69MRrSBscE3lDp5G3ABII5EN4CRRnoUaMuZUC0fAxYveyLJbqGnQZ
vluCr5oh517prADCV+Ou2pBVwlCqMjgQ4DpZxLmplgC7iusaqd4rhfDaBlwV
sxf4VmskWmougQ6klcBjBzwQ7l63DsSbIXRoKqtHiBE2lElHhzwH9tc3McI4
JNL1ai6RyNfgQb7ZjQBzxTUCakXeg5gEO7bIR0TGqxjQBZytUQ8xUBvyyOuP
0GqnuFZa1RtURa/Rp38zjmBqdE1J7m2rQJdSkPRZdL1A2nDrPcQdzot4hbVl
YLUABxvdAA87OxCYxBnDfEjYAeetMMAQXeKiLOJolwXiARc0x55TUMgtRkAH
Iu3Ry1OBb9aOM4sTDKdn64CGYLxYGwC7W1rYLmikZ0W9UJ5gkOFoZfuSV8eC
Aoyp1HlXV4Ocgx5RGnwTjbrPciv6zxgQWo3RAopKEaYBalyZGP1hiD9QN5EY
PoFlkzTDDCDieave9A0Ih7iO1zAbUAPsk3bCZeo1drZmD/tbKk8CIlGM/9mT
SIhrauQC1CYkvilBQujH7/MSYPMxxDY8Febzcf2EuqBy6xXFa8CPP5vFE3YD
sQJlVwfDeQYMpbh1cFl40AV+s4tYbF0V0hxNNewwFIunSpgB2STNNASiyzjV
tNJAy6KMk+UGJenTH7CeZUhhZ5uBxB4aOFJi3WkAauvh4AJhsUi9NcX9rEcz
AxEnIRsgi1HK0d6SjhKeaio2/1dg+VCuIyXdmaX1TZI1KU5/Mb2gWS/GF8jU
qBOvCpOyX4ATs84ABU25DWafpEj1aE5JIVGVwn6r0lwBY4CpRs0GIyzBflSI
mZkG3Bn0aNA0CedaVwzZEBwMnumJsI/MnmmeE/HsdHfHyTljh0b9FhSN1cSC
UlgTsjNxyRoXvEErdNat1mT984q9HU+ab3c2PaAoCliOdHHFyhjZnBmjLsEP
bEpyXfABIB5WMAewyaYzCzjHzJJ9HL1iooPK/MQDwyqMG/A4qsp38FAd4PgX
jJcVouPCjger+tvf/qYwGRG9Ak4pcvTXvZZTta/4Beqper0CL54ZF76uHCjs
5c/BSOcvMQdFXzsDnQMQ1IL4jQWhHZriARoePYOcA/bLeAne2QdH5CY05BDl
tmpK+Xzn+GJTu7CrPxSLvDs9hEMaURXdTjmY+WrwjLs7fS6KZAkSkLHEORfD
cRaRZDxQO/rG8cuIHlqmsfJuo5oYPTDkHWJ8oG7d0R9g6aTfNGI+YrAqG3Bi
2hWc+E+lmzMZwOWkR+EjyrbQhrvtRlaRUsgBw8YzEE81YIQO7OjCdk6nsxGJ
elV1nKbWbF08RVKIenkq4nbh8ZPwJUbUUXQLxBjYVoOpuiXiDJ5eFUk8g+8D
Fz9y7JhXkxWBuTOAlu+H1B0nxLayAHroaI4vkOr8uCU7PgfCD6L322kfb2C6
tglWxl7ssg9MMSG/JCved12XaoHKAv4XCdHZWFKcFveGplHgm3ZUPfmyaSpo
d6hmzBMVohbtyAhE7KoqEkP0DJMXvEJRhi8L66Vj0gJQSR4lrkejflEciQ9e
fH92Phjyv+rlCX0+ffan749Onx3iZwgOjo/dh0hanH138v3xYfup7Xlw8uLF
s5eH3BmequBRNHix/xd4gwscnLw6Pzp5uX88YC720YzGElYrzEuCRYFhFJiP
bw5e/dd/7H0Gce6/nT4/eLi39/j9e/nyxd7vPoMv4IDkPFuRgx7irxikRhA5
6rgkDgALDz42Zt/BjQCBRRrnCl2XMWILtDTjagmiDm0K1fYNoTZ5BLYEzGQC
/jWOtMogDlPPwIc11YJHGWKmBBsDFAbdPUnCgY2MMWQD6n35e9w1UaMvfv91
xPRCg1wB7xOD5DWiVj6qXM+L2hCl8THYl6KBQHrACZEBMBlY7Tl2iu6NZVzZ
a0x1vhn78w8uy3iOHQdMP/tVGdwbAkOoy4+d5PvTo84cOShoXAhudaDTKN9y
8ORKmRctCIzAj+6aEOZL2/kkFPInZP0gQ3eUxUeO7gchEk3RsAszB24Kp/WM
BC4wUP74YKmXM8Cn+0Q29O+A583YzaoG1iUdqBHJAsQTmPBgj7RjgaKqgQg7
rnpU6Cgy9HgNwcp6iWo2AJJZr96YlVNJA7WtM78O0eQMy9BaCfxgUvpHxiPK
Pc0kNTrYznFW07s8pEWSmPVhRAGLRKcMvJ0foe4dtDUgB9w0suGS2OYK/SmL
VVjdmUEc2k6MDI1biOZnNhJsLsj9hYhnGAWhJBoPzLTZ/rh4DJQIKvZRwfde
R0ReUzOFnenwTL8sgqckS2l1h1DAty0OY97abm/t0/fvI84SZZhUAWUmLh8K
lJ3QtkX67vSPfbvjBsRMX+WHfp5o7SqwIZFkG72Qr2/MYXQ/oKI7MtIREgMN
RakzMrzVps1lpyFLR+TIRlPOG8gUEshgKE/kwjZtVPuGNg9wjtoivjuBFzjN
1qEbgH1lI0sd1ZxJ7qESwfX+vQ+pMPd2YB2bSct/BpgyFUFKUIXZHyC+C5Ql
abEqVk1mcxbWe3VaB0saJIPb0WOS4+FsBEayGskzcO+d7CN3hHNYV62Ns2Ai
MuqqLIraho2dGUWy5Cm5XDMOMZEdBmIOxhv5+TD2KDRnUyRepRjkLgZ2yT7S
mZxzIKHFgcKE1waI6MW5tJxjiYgzEgD8BfhDmZBnkqX/jsx1Af5MirEtLGw3
4kD+EhrVFadU4tJUEAaKjcG0FHwwrHiTAkwSxE6eQwwDWH9YdjYqnYzcmLyr
8Q0m9u7SWoH1jJZgmXm7CB018EZYX2oW6fMFskT7pEUHZYTci9TlRRLMiQ+j
ilR8zdkvJJYC01RinYLmEID2SVaFkeguqZs4A99RcsXjYC8A9z+aLG3hUE0O
q2/QbFuVXQk1GrdbQWEXRF0DWhWRU4tTh7i6vdU34B+7GBjzTUVT2fjUbTFh
eIPx+Lb9rh49CLEHclCgDvvI4ul7Vk3MeWE/YtfIgdnhaFyo06Yicq2+6YEN
9E4bsHgYBbFHPUyVWTjYm08/sBuPfEdb+pMd2ZEb2X7V7tAKbdSbZLUYjyS1
6i0IejY1xykO20Xei1KbArsDq1aTdhBre3dwi8jz8SvbU2mY3vgwij0vK4oT
EGROKojzEehx9L06+T9Py23Bf1tYsuNAghk4XI8rG7bvEqnt3qXVszF+N+mG
v4YaJXKwPB7vff7RwAhKR+1ebLUbIRQ/ohtmEc5GhrdqRY3BKkZBFhVUGbGN
RkeefT/bXTjX22+wLiYSbSN3/QSDhUuqyDMsGhscYMgf+f70WNJuQzQjkh/W
whChLWT1hT0QQnGJo1AXtlunOkxhZnFC+bxOonLTHdmSQVqux9JkYnXlmLsO
evKdrvDt1s8sgjC0qdSNmVXPVJytkonuTrPOTFkvVnap+PcbQA6sYmdCCBh0
klUHzBQgJohVmbSy0ld5dkZU+1JSVE2ZWbjRYd7Z4ZJOEYlNz+w2EBmb2RIN
5gw8cYTNzGDK4t1l1ma7bIqz60m1Yg8E3xsrnVeYPLe2TpFQxNlGP+fLiAlG
jMX5ut/0O0+LMsa473rZlLQF56utXvfgCQLVk2hzvpvbqmCVAbLU5Q2alFBm
94T8hW06jVN6T+q8yAUVtido93mG22ABVB2/9QMgYUvqbGoWVaxIwA1xB4Ub
hbb4g0AJXGaupeOsDXvpVTOT4ig/vSiK2w7G/MyeBnoe2RUyGrJ3xdVPvCm0
0Mk76acrMq9+/Ue7RUZQ2GgiWNtwO1asLcFCXFnstpGEEkM/T1tXXQ+mT8vx
YiiEJgfMOspxhvvta1lYLRNbIpBraUsgTM5ZQFg62HBEJnQoOXl+7hlDGFOq
3CjG9HyulvZVHz9GAgR5YY56VD9Q9KtuMTlt1L4bsQGgAgv0h2V/XddYQCwl
UeFu4oFUgkhRA+kUUCVn2opDp30Strc0aoODigu3wloJDO6QbHazk/N2Q8lo
DbmMYtjZx8PyFc9oY7VQnlMSnComhLtJqjaYMRL9Y/MIfpZIXOtWaww7OyQ2
83SxG2GKeIG18iWxmsXCHYkjF450nXi7HqqMtGQM4m9x/shUQnxarnudlb4i
yJ22HjOpb3Z3n0TEv7I5sQS1NicdAFOC88oQxbWDoqXamguN4J1/vMHFXig7
BOoxyUkW7B7d9m0dbVrlW2+L6Cm+HNC+kd+WrXJPQ9xkkh0iF1ezi4PlSyTV
KLQzkICh4sAt5gYmiXqLExBHXEpG1TGYbvNpG3mZRluuI3UsbkF1J8C3ecKI
MCX50HeYgkF6UPVCW7xkdwpAUFdMmohjIVMGTBH6mq9xDgCboiiaMPQX/J7e
CoDz7s9Smz45v/Bc89HeaG/XeR1u07+t6KXwFJyZMwmQKqylJAuSgGJhjTPi
6GlUFNX73iSRsRkSrAJhQ2aL2ro1cV5aBHdjsKmtp4mlSAWPPUQzXV9jAUmA
JxCCtgy2o18l3ybLOZbSD6kBMFeoF3gx/iNYzksyNBkFti6+3ywhEBq1JTNR
zOpOtnm37CdOWcw30GVLUyRrB7xTGVt1FiGZ/oGx2gnzY0G+HBZKWUEkUG2N
J0QZmUadBI+yZVExlsQ/cYWahQfcEEWRsn8eQ+sr8FtgTUbcsYTyLNaTRGFE
uy1R96GpfqIsDWHUDsFkywvRPfdmQcDASGDFlBh7gRtWwBoc2RqOQRfz2qzV
cXs1fq/dYeTSBx4Li1fAulsqSF0ub2NmtJltLq+yVS++VWyhxAAQpwKWhB4G
K19dkrS/hIA3hhDFsTh0niMgSTPfhnh0pQKrYM8ichGSpR05npTloXAXp/EX
00Y4UrZb9RS0UcEkexfk+dkoN7J+HQZgzA0tDeRdUdL6Up1kaPR4u0ByKG2U
GNltIVYhI/bQ5aEtD5lp8NU3y3+wimQjALVzTNXrLftlbSXFMKifUG964lfP
IAeFOW4+/NN5s7SvR/cu9mgrPbaVFHVH5mX3ly/dox4paEIeAMj0gZ9uEVkO
UzBRZLV18NzqYCy91VSoDuy1tr6aZZC2UpC2NYKY+/042reZ4s7Yoi5gBitP
VBTLWc2ucrE165SlBT+zLQcdq5PcpUKp9I+z6jHbPXEdWsPnObqUDQIfI2Ez
ELFDYZ2IsQoKnZ01oaI/GAx36oVHKHqjwOKiTC+nognKxMZuaNggxlnh0btP
Tc01FQvyiC/1tZgBTZBQ4XGrBoaKNCPYKJ2D20Woh9FH5BqkLnmya4GSyFmg
EhRKqjOVlK1F1orOfsAoGfupPIaXfxtK6XpJgW1iKk1+H0xDO8Vt6g9d03au
1zRJUugygXf3MJa0Itt+F9MOR6LXSZ1hLacEpm1mwO1X83YyMTwHmpW2FaDC
vXWcvMs4dXjZUImjeDhVP6/5RxOG6lpn2cjZNGtdxLDYQzLor0aEKGC8XD1C
pfqZDYMzLPqvZI8L+ZHZc8irkryn1AyzF5JpKpMCr2eJVaVUzbOqQUJ/psT9
feLc2BpiBf14CBQfQ9svgEWIwH/ezBxYj07fjLDwOk9jUhWyPYmO3QmHC34+
VcBMh47XqWKUsR/Z5GrqRXlxe84tKG96HRyxe0P5AWsg6kVZNHM0QpmZlRD3
ibFYresFblfjaYvVOksxtkc/QLKX4/E44o9vCeCv5MUYlA4g5VMm6FuL0qFd
2a5oT6zYbcreRAC49P9rEwGSG50T5HSWsIHJMQPAJgCzhcY2wOIDLoaMN4uO
e+pk4oyquI3bbyAHFhVDN7My4oANY7jreD2MkCcyHUt4AryqS1HOoDmy1AqJ
tSzYnI6nsJbuur54DIgPkeMOEguoVImNxfDZLVhecZsfJZcJ8777Z341G2Jd
tOWdBSACDB0h813CqiaP3WWC262t3h1yNijtNHF7mI81xxN+7wprSCj8w1jY
gLxFl1i+0msYCWM7l3SjXpgwlU7oNMreMHr/w21nv9rhSPHb81+8jUxhemUF
BEnvqdD93PdGlT2X5M7WbJh4HvNaCoBlr7/C6wDQwfbg4zsOWKQ2IsK0tbbV
EBGVs55tn1KCxhYghXVSXlwQGH9QmyF0ZWy4dkKXJXjBNAOaf78wgKsCbEBr
E/541A9PuZDT4TvJdJcEsbVUOHvIw8ODSUR+c3+gwbnL/Zf7PfnKOI8pyM41
n//EQ0TY/Jnd+b7d0Te8n3LWlzL0q4Iok9tWILnibioSjsVpDzIG28dye3oS
gYf74Li+zR0JUvkyq7etFWbFfLfcO+8updZRT8LN+uc9fr03AHv0Kmkq8Gjf
Gog/8gZCHrVDCeRk4fLhnLgnk4QL40Gls+zRib/OpX1T9B8xy3HAb9uXrsZv
Cg7gByKhCGMHChjeYskXfeXowH7vRj3+YYLbIG4YQpx+c6zzeb2Yqoeff47p
xM6RhHv2cBuS6oM9HsE3k7tvtnOL5ntNFxyf8FfHJfOdFXB9fQjl4Pnp/qA7
92Dv4aPPPu/uYe6Hle/o7/BBi5Dd/dwxrkA2MvE0otQoWAmS0xO+PxWmzNvj
FSx+YVb5vkcSfG6WhLJb64D5efOMwnZZ2nI+4UOnGQTbA0E3P/NAsPh2CWx7
1sMV5rFXX2rZDmJEXdDONXj3QJ6LTSyRc/sUelyaG4UxmvpSyoW8qGTv8ePH
kwcPJw8fjujmCE655tXO164ro0B6d3DydRS9nc4eKBsC2saiFOHvCQu2PBdM
sKQjLroNWsQqxmu3gUMxjkAoVmMX9ffqX2TEdusk2Bm8DQ4BQcNR2/D9XYq/
exDn/57Wl0uHSF//8+2A2+Jxs/flrfgpahe7FljKqpm1bpluAKoY/plYv2TC
d9WAAzcRmGDFd1kaQsbH2xzB4f2Mx/8bKGugLOv9VORP00KPZaB/lfXi3Fut
RwKHKAdgqCZzl1GQqw3mrEf9flCHggKz7dzKvvy7ORmHi75E9NXFtIO+r6M+
RSt61v49iXqUrajavkah/LolAGlEM3tE8GKS+yEejRIqE1Jj7LAfrJOsveaF
VHhCj2QfckNx24OSNhiBjzyEq2e7xxncM76gQnoKPsd+eRlLg0tmbyl4I8YO
1Nr9E+vJwmSA69zqPtaGMV4NRiNWuh7cXbvWq5GsfHdm4CZxWcZWMZtaL6tW
+XLZ2yc7YnM+6cq8lWPhx/hpKMjBdKNu6xSzX2GPjTYwadvCuU/bTuBafHXO
1HKziMXZbZ2Hp078WHnzbKwj68ZC2duThUKL17SOW0vCbsdwzUNH6c7hWXou
9RFbx/Jxc8dI8P8320/pbrrZARsP78/H1gFv8XH7YWZm2Fxxx76/G2MLF8OM
anc7JvoJbAPIetKUFZ8QSoqVG2OjkCzqLavi6nzvhomCzkLZK4uCqATzr/9C
pA2dcG6C0GWUFhDb497gSIceoO6gJ/+9j8JPPpVvp6296KGEK+Jy+Xrf2xa7
sZHK97YFTd1DYTIk9qnX66irDOzdQKILmGEGB6Y2P+s2GvAOlND7b7BimGuD
7QEpz+i0b4OKZVa/LSVMSrQwdEfoBEAsJgfHP0ye6xj3eLYbnT6qbhkr9LAc
m3GcuoitmR9sqBPPTe/z0n8VHx0HomAqbwuvPdheyatfCFwfftBhnLRHoEEY
ZK5q5D+90guTZMg+qZ702GI/pEBjZkeRr4mLgbpGu7vqjUs4bAO5jocy9RyE
X8eVmhXl9is+OsTeGNrgafhstYhHj+hyGZvVt8H8x84YOAhuYer0RejcH53v
RyJVPULxj/OzfoH79IFjAZ78f5yP5MVHcqvwRjDV3jK8CUCL3+NzeRRgeCNM
8rMZkoCzW+7ik/NT/1jCP8XlOu+3y+LU+2kdyj7gDWBRq5bp/HighLvlwRvJ
xTt8uiDZJ6Tpyw4SdfhFS57WKbAEolFeOFvfpgyBSs5Z6CZ97jIJd9y+8qu7
KD0L3OaGfJRR8nwa3M21tgg/+q8c0gJvZ9N4hS6PbyTCN/3u069ozPjP84W8
1XiMsWU5zt79uuv5Ne1fzxIj/99+t09ZSHkL1W1Sbwh5Wy8tVSpevob8vOB4
ZHstT7gV2k2k/yr5cy+roxsv87MhO35LWH/QdIs8BDkep5Ywu+MS8TCnJOEx
VQPfWtFUlLKXx34eiDWVfeNl2p16i8adfD8CLLqG+uH3VtB+QRoLtB6u0o1o
eX07dv4eFj198XU0Dpmv3X3RtAS571fYYwt7jfgtBhlqP3F34vIGPXJe/o6O
UX5rAGATq+MiNUP1Iq5rXWDNHUSqhkzUGUSYpSnUqwa482dD+/0zbYNVexCN
qiXMrKmLsi3owmiYSxzwmi97Syq7ZQVaZlrVsHO1THFNN5xlRW1b01kQuuw1
NVXSVBWfocIddqo1KJoaP7sInH5zYtzJuQUQUti80BmW75klkkX3FENgOSK4
WhTZrRqpq9UV/sQE/vwD39Q6a+Z0f9M7isSWcVkraoSMNeT7eKieoIQ+eAM2
Yc7V9Wms3eGzQjiTFM1No6j/PnouZf4hi1OzNKXax+pLfUV1B8/3/4ReU97g
IQ6dfgU2PwMNCrMuYXUmLy+TrwZ12egB8MSfpurHxTpE/O+jKZ40hM6fVCpp
SlRidFRF0W90xGVqb52zNz5svZ0ZFWnnvBuVTKlJWPXMB5ToTg2/4gaL5cYE
5GFB0WpwFZqUmDNj8NUzXvF9e3ZB1hPclIU7kkkjt9DG7TmtoF4dK1PoljRY
hQfWxCvlw18kkcZegUhCZbQCkvwuCQ4S3uwJeqWpO+drczmDZ3NE2Au5vsR7
1NrTGFi8A8qI0QNNfqRrVddF4+7n8eqh0v4bObyj1ha2dme7GnrXpvJYZol7
lNuLgsmtby/H9K72k9OLrs6GqR0e2nYLwlGo7tFVMnVK90xuYaVDn/aup+AK
3fa6TFdrbyoHAHZjGBJ7WTXFAE53eLQcOxlJC/xVEsQtyFpVb1TuuxI1Lgyy
VDsskupCEQ/+qN0JTjyKmfKNC6whsbqAruHAmrW/giaQY4O2ONrWvCLsqHlf
LxpYr3IS52ql2gpf77doTvaPJnIX8Si4F3oyy4rZBMx1PrFluJNH473xg/Ey
3fGW0LgiwhPij90WL1xIenEzcveGssTZu4/xNmBLQqQeX4LQ5KWeAxpRRbWo
k2MiiGjQNaWce8Gxh5bW15rLvmKQvKxpi9lMJdcr2KuSsJjQlRZ//RX9LIoD
msuFGcX9V7q3WsNd8i5XtYa31be3gS91HfON6wWfhkOQQztihX4JRvbSJnpB
fzPp0fe7ovuCcy5P5SHCIk57Nom3FcNzjsAhRcmb+Rb7eMUuHtbDgYgxvwV5
p2vb+QJd4HjRAgVdg+7hx13qHrcX6HrL3aJUcCK8RFrUnFWofKaINzopL1Ht
Mjxcbh+u0VPZxpMLOSaJpxfG4KcU7/jKI+OujbFljSCktGA6wX0e3xzAMi9s
+O/ft43KpHXUgxtGN6SerqlH842/ixFcUY+hP5bRhne9ishvuXHeiUR4h2aF
N3EbXcq19VzATjNTxqothN8Ago78zJC5vJ9GEJmxGrjvPKJqzyN2Vy12ju9B
9g+L0E30tL7gGjl75X74UzZtKhmjKqHGB07g/CajI1h4AstPg0po+cH449UP
k5rHbwO8AZ5LwK7BmwOx5XYG3hjBv25SDf80rKtY6/ItjPE28cDHvx31DQhU
qf/Nrm3srWBMpyK++kp9ItN/4vV0GTjCbo7aW3bfq8l5dx0Cg94Cw3eY6ATd
iKRGAWBnwh7Ic4XOw6CTIgNEVbmuoBkBHn8skLQBhq2fk+IyeH9IXKGy2jhl
5N1BTocuWU1QbTW5rwfsNR0X8/t7seffHEb/A+fWbxHwbgAA

-->

</rfc>
