<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-vasters-json-structure-core-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title>JSON Structure: Core</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-core-04"/>
    <author fullname="Clemens Vasters">
      <organization>Microsoft Corporation</organization>
      <address>
        <email>clemensv@microsoft.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="08"/>
    <area>Web and Internet Transport</area>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 71?>

<t>This document specifies JSON Structure, a data structure definition language
that enforces strict typing, modularity, and determinism. JSON Structure
describes JSON-encoded data such that mapping to and from programming languages
and databases and other data formats is straightforward.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://json-structure.github.io/core/draft-vasters-json-structure-core.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vasters-json-structure-core/"/>.
      </t>
      <t>
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/json-structure/core"/>.</t>
    </note>
  </front>
  <middle>
    <?line 78?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies <em>JSON Structure</em>, a data structure definition language
that enforces strict typing, modularity, and determinism. <em>JSON Structure</em>
documents (schemas) describe JSON-encoded data such that mapping JSON encoded
data to and from programming languages and databases and other data formats
becomes straightforward.</t>
      <t><em>JSON Structure</em> is extensible, allowing additional features to be layered on
top. The core language is a data-definition language.</t>
      <t>The "Validation" and "Conditional Composition" extension specifications add
rules that allow for complex pattern matching of <em>JSON Structure</em> documents
against JSON data for document validation purposes.</t>
      <t>Complementing <em>JSON Structure</em> are a set of extension specifications that extend
the core schema language with additional, <bcp14>OPTIONAL</bcp14> features:</t>
      <ul spacing="normal">
        <li>
          <t><em>JSON Structure: Import</em> <xref target="JSTRUCT-IMPORT"/>: Defines a mechanism for importing
external schemas and definitions into a schema document.</t>
        </li>
        <li>
          <t><em>JSON Structure: Alternate Names and Descriptions</em> <xref target="JSTRUCT-ALTNAMES"/>:
Provides a mechanism for declaring multilingual descriptions, and alternate
names and symbols for types and properties.</t>
        </li>
        <li>
          <t><em>JSON Structure: Symbols, Scientific Units, and Currencies</em> <xref target="JSTRUCT-UNITS"/>:
Defines annotation keywords for specifying symbols, scientific units, and
currency codes complementing type information.</t>
        </li>
        <li>
          <t><em>JSON Structure: Validation</em> <xref target="JSTRUCT-VALIDATION"/>: Specifies extensions to
the core schema language for declaring validation rules for JSON data that
have no structural impact on the schema.</t>
        </li>
        <li>
          <t><em>JSON Structure: Composition</em> <xref target="JSTRUCT-COMPOSITION"/>: Defines a set of
conditional composition rules for evaluating schemas.</t>
        </li>
        <li>
          <t><em>JSON Structure: Relations</em> <xref target="JSTRUCT-RELATIONS"/>: Declares identity
constraints and inter-type relationships for objects and tuples.</t>
        </li>
      </ul>
      <t>These extension specifications are enabled by the extensibility
(<xref target="extensions-and-add-ins"/>) features and can be applied to meta-schemas,
schemas, and JSON document instances.</t>
    </section>
    <section anchor="conventions">
      <name>Conventions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="json-structure-core-specification">
      <name>JSON Structure Core Specification</name>
      <section anchor="schema-elements">
        <name>Schema Elements</name>
        <section anchor="schema">
          <name>Schema</name>
          <t>A "schema" is a JSON object that describes, constrains, and interprets a JSON
node.</t>
          <t>This schema constrains a JSON node to be of type <tt>string</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "string"
}
]]></sourcecode>
          <t>In the case of a schema that references a compound type (<tt>object</tt>, <tt>set</tt>,
<tt>array</tt>, <tt>map</tt>, <tt>tuple</tt>, <tt>choice</tt>), the schema further describes the structure
of the compound type. Schemas can be placed into a namespace (<xref target="namespaces"/>)
for reuse in other schemas.</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  }
}
]]></sourcecode>
          <t>All schemas have an associated name that serves as an identifier. In the example
above where the schema is a root object, the name is the value of the <tt>name</tt>
property.</t>
          <t>When the schema is placed into a namespace (<xref target="namespaces"/>) or embedded into a
properties (<xref target="properties-keyword"/>) section of an <tt>object</tt> type, the name is the
key under which the schema is stored.</t>
          <t>Further rules for schemas are defined in <xref target="type-system-rules"/>.</t>
          <t>A "schema document" is a schema that represents the root of a schema hierarchy
and is the container format in which schemas are stored on disk or exchanged. A
schema document <bcp14>MAY</bcp14> contain multiple type declarations and namespaces. The
structure of schema documents is defined in <xref target="document-structure"/>.</t>
          <t>JSON Structure is extensible. All keywords that are not explicitly defined in
this document <bcp14>MAY</bcp14> be used for custom annotations and extensions. This also
applies to keywords that begin with the <tt>$</tt> character. A complete list of
reserved keywords is provided in <xref target="reserved-keywords"/>.</t>
          <t>The semantics of keywords defined in this document <bcp14>MAY</bcp14> be expanded by extension
specifications, but the core semantics of the keywords defined in this document
<bcp14>MUST NOT</bcp14> be altered.</t>
          <t>Be mindful that the use of custom keywords and annotations might conflict with
future versions of this specification or other extensions and that the authors
of this specification will not go out of their way to avoid such conflicts.</t>
          <t><xref target="extensions-and-add-ins"/> details the extensibility features.</t>
          <t>Formally, a schema is a constrained non-schema (<xref target="non-schema"/>) that requires a
type (<xref target="type-keyword"/>) keyword or a <tt>$ref</tt> (<xref target="ref-keyword"/>) keyword to be a
schema.</t>
        </section>
        <section anchor="non-schema">
          <name>Non-Schema</name>
          <t>Non-schemas are objects that do not declare or refer to a type. The root of a
schema document (<xref target="document-structure"/>) is a non-schema unless it contains a
<tt>type</tt> keyword.</t>
          <t>A namespace is a non-schema that contains type declarations and other
namespaces.</t>
        </section>
        <section anchor="meta-schemas">
          <name>Meta-Schemas</name>
          <t>A meta-schema is a schema document that defines the structure and constraints of
another schema document. Meta-schemas are used to validate schema documents and
to ensure that schemas are well-formed and conform to the JSON Structure
specification.</t>
          <t>The meta-schemas for JSON Structure and the extension specifications are
enumerated in the Appendix: Metaschemas (<xref target="schema"/>).</t>
          <t>Meta-schemas can extend existing meta-schemas by adding new keywords or
constraints. The <tt>$schema</tt> keyword is used to reference the meta-schema that a
schema document conforms to, the <tt>$id</tt> keyword is used to define the identifier
of the new meta-schema, and the <tt>$import</tt> keyword defined in the
<xref target="JSTRUCT-IMPORT"/> extension specification is used to import all definitions
from the foundational meta-schema.</t>
        </section>
      </section>
      <section anchor="data-types">
        <name>Data Types</name>
        <t>The data types that can be used with the <tt>type</tt> keyword are categorized into
JSON primitive types, extended types, compound types, and reusable types
<xref target="reusable-types"/>.</t>
        <t>While JSON Structure builds on the JSON data type model, it introduces a rich
set of types to represent structured data more accurately and to allow more
precise integration with common data types used in programming languages and
data formats. All these extended types have a well-defined representation in
JSON primitive types.</t>
        <section anchor="json-primitive-types">
          <name>JSON Primitive Types</name>
          <t>These types map directly to the underlying JSON representation:</t>
          <section anchor="string">
            <name><tt>string</tt></name>
            <t>A sequence of Unicode characters enclosed in double quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt> <xref section="7" sectionFormat="of" target="RFC8259"/></t>
              </li>
              <li>
                <t>Annotations: The <tt>maxLength</tt> keyword can be used on a schema with the <tt>string</tt>
type to specify the maximum length of the string. By default, the maximum
length is unlimited. The purpose of the keyword is to inform consumers of the
maximum space required to store the string.</t>
              </li>
            </ul>
          </section>
          <section anchor="number">
            <name><tt>number</tt></name>
            <t>A numeric literal without quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt> <xref section="6" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
            <t>Note that the <tt>number</tt> representation in JSON is a textual representation of a
decimal number (base-10) and therefore cannot accurately represent all possible
values of IEE754 floating-point numbers (base-2), in spite of JSON <tt>number</tt>
leaning on the IEEE754 standard as a reference for the value space.</t>
          </section>
          <section anchor="integer">
            <name><tt>integer</tt></name>
            <t>An alias for <tt>int32</tt> (<xref target="int32"/>), provided for compatibility with JSON Schema.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2³¹ to 2³¹–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="boolean">
            <name><tt>boolean</tt></name>
            <t>A literal <tt>true</tt> or <tt>false</tt> (without quotes).</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>boolean</tt> <xref section="3" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
          </section>
          <section anchor="null">
            <name><tt>null</tt></name>
            <t>A literal <tt>null</tt> (without quotes).</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>null</tt> <xref section="3" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="extended-primitive-types">
          <name>Extended Primitive Types</name>
          <t>Extended types impose additional semantic constraints on the underlying JSON
types. These types are used to represent binary data, high-precision numeric
values, date and time information, and structured data.</t>
          <t>Large integer and decimal types are used to represent high-precision numeric
values that exceed the range of IEEE 754 double-precision format, which is the
foundation for the <tt>number</tt> type in JSON. Per <xref section="6" sectionFormat="of" target="RFC8259"/>,
interoperable JSON numbers have a range of -2⁵³ to 2⁵³–1, which is less than the
range of 64-bit and 128-bit values. Therefore, the <tt>int64</tt>, <tt>uint64</tt>, <tt>int128</tt>,
<tt>uint128</tt>, and <tt>decimal</tt> types are represented as strings to preserve precision.</t>
          <t>The syntax for strings representing large integer and decimal types is based on
the <xref section="6" sectionFormat="of" target="RFC8259"/> syntax for integers and decimals:</t>
          <ul spacing="normal">
            <li>
              <t>integer = <tt>[minus] int</tt></t>
            </li>
            <li>
              <t>decimal = <tt>[minus] int frac</tt></t>
            </li>
          </ul>
          <section anchor="binary">
            <name><tt>binary</tt></name>
            <t>A binary value. The default encoding is Base64 <xref target="RFC4648"/>. The type annotation
keywords <tt>contentEncoding</tt>, <tt>contentCompression</tt>, and <tt>contentMediaType</tt> can be
used to specify the encoding, compression, and media type of the binary data.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> be an encoded binary value, with the encoding
specified in the <tt>contentEncoding</tt> keyword.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int8">
            <name><tt>int8</tt></name>
            <t>An 8-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2⁷ to 2⁷–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint8">
            <name><tt>uint8</tt></name>
            <t>An 8-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2⁸–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int16">
            <name><tt>int16</tt></name>
            <t>A 16-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2¹⁵ to 2¹⁵–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint16">
            <name><tt>uint16</tt></name>
            <t>A 16-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2¹⁶–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int32">
            <name><tt>int32</tt></name>
            <t>A 32-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2³¹ to 2³¹–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint32">
            <name><tt>uint32</tt></name>
            <t>A 32-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2³²–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int64">
            <name><tt>int64</tt></name>
            <t>A 64-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>[minus] int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 64-bit integer in the range -2⁶³ to 2⁶³–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint64">
            <name><tt>uint64</tt></name>
            <t>A 64-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 64-bit integer in the range 0 to 2⁶⁴–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int128">
            <name><tt>int128</tt></name>
            <t>A 128-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>[minus] int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 128-bit integer in the range -2¹²⁷ to
2¹²⁷–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint128">
            <name><tt>uint128</tt></name>
            <t>A 128-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 128-bit integer in the range 0 to 2¹²⁸–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="float8">
            <name><tt>float8</tt></name>
            <t>An 8-bit floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 single-precision value range limits (8 bits), which are
3 bits of significand and 4 bits of exponent, with a range of approximately
±3.4×10³.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="float">
            <name><tt>float</tt></name>
            <t>A single-precision floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 single-precision value range limits (32 bits), which
are 24 bits of significand and 8 bits of exponent, with a range of
approximately ±3.4×10³⁸.</t>
                  </li>
                </ul>
              </li>
            </ul>
            <t>IEEE754 binary32 are base-2 encoded and therefore cannot represent all decimal
numbers accurately, and vice versa. In cases where you need to encode IEEE754
values precisely, store the IEE754 binary32 value as an <tt>int32</tt> or <tt>uint32</tt>
number.</t>
          </section>
          <section anchor="double">
            <name><tt>double</tt></name>
            <t>A double-precision floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 double-precision value range limits (64 bits), which
are 53 bits of significand and 11 bits of exponent, with a range of
approximately ±1.7×10³⁰⁸.</t>
                  </li>
                </ul>
              </li>
            </ul>
            <t>IEEE754 binary64 are base-2 encoded and therefore cannot represent all decimal
numbers accurately, and vice versa. In cases where you need to encode IEEE754
values precisely, store the IEE754 binary64 value as an <tt>int64</tt> or <tt>uint64</tt>
number.</t>
          </section>
          <section anchor="decimal">
            <name><tt>decimal</tt></name>
            <t>A decimal number supporting high-precision values.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition
for the <tt>[minus] int frac</tt> syntax.</t>
                  </li>
                  <li>
                    <t>Defaults: 34 significant digits and 7 fractional digits, which is the
maximum precision supported by the IEEE 754 decimal128 format.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Annotations:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The <tt>precision</tt> keyword <bcp14>MAY</bcp14> be used to specify the total number of
significant digits.</t>
                  </li>
                  <li>
                    <t>The <tt>scale</tt> keyword <bcp14>MAY</bcp14> be used to specify the number of fractional digits.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="date">
            <name><tt>date</tt></name>
            <t>A date in YYYY-MM-DD form.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>full-date</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="datetime">
            <name><tt>datetime</tt></name>
            <t>A date and time value with time zone offset.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>date-time</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="time">
            <name><tt>time</tt></name>
            <t>A time-of-day value.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>full-time</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="duration">
            <name><tt>duration</tt></name>
            <t>A time duration.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>duration</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uuid">
            <name><tt>uuid</tt></name>
            <t>A universally unique identifier.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC9562"/> <tt>UUID</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uri">
            <name><tt>uri</tt></name>
            <t>A URI reference, relative or absolute.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3986"/> <tt>uri-reference</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="jsonpointer">
            <name><tt>jsonpointer</tt></name>
            <t>A JSON Pointer reference.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC6901"/> JSON Pointer format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="compound-types">
          <name>Compound Types</name>
          <t>Compound types are used to structure related data elements. JSON Structure
supports the following compound types:</t>
          <section anchor="object">
            <name><tt>object</tt></name>
            <t>The <tt>object</tt> type is used to define structured data with named properties. It's
represented as a JSON object, which is an unordered collection of key–value
pairs.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>properties</tt> attribute that defines the
properties of the object. The <tt>properties</tt> attribute <bcp14>MUST</bcp14> be a JSON object where
each key is a property name and each value is a schema definition for the
property. The object <bcp14>MUST</bcp14> contain at least one property definition.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include a <tt>required</tt> attribute that defines the required
properties of the object.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include an <tt>additionalProperties</tt> attribute that defines
whether additional properties are allowed and/or what their schema is.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "name": "Person",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"],
  "additionalProperties": false
}
]]></sourcecode>
          </section>
          <section anchor="array">
            <name><tt>array</tt></name>
            <t>An <tt>array</tt> type is used to define an ordered collection of elements. It's
represented as a JSON array, which is an ordered list of values.</t>
            <t>The <tt>items</tt> attribute of an array <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t><strong>Examples:</strong></t>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/definitions/Namespace/TypeName" } }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="set">
            <name><tt>set</tt></name>
            <t>The <tt>set</tt> type is used to define an unordered collection of unique elements.
It's represented as a JSON array where all elements are unique.</t>
            <t>The <tt>items</tt> attribute of a <tt>set</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "type": { "$ref": "#/definitions/Namespace/TypeName" } }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="map">
            <name><tt>map</tt></name>
            <t>The <tt>map</tt> type is used to define dynamic key–value pairs. It's represented as a
JSON object where the keys are strings and the values are of a specific type.</t>
            <t>Map keys <bcp14>MAY</bcp14> be any valid JSON string.</t>
            <t>The <tt>values</tt> attribute of a <tt>map</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "type": { "$ref": "#/definitions/StringType" } }
}
]]></sourcecode>
          </section>
          <section anchor="tuple">
            <name><tt>tuple</tt></name>
            <t>The <tt>tuple</tt> type is used to define an ordered collection of elements with a
specific length. It's represented as a JSON array where each element is of a
specific type.</t>
            <t>The elements are defined using a <tt>properties</tt> map as with the <tt>object</tt>
(<xref target="object"/>) type and each element is named. This permits straightforward
mapping into application constructs. All declared properties of a <tt>tuple</tt> are
implicitly <bcp14>REQUIRED</bcp14>.</t>
            <t>The order of the elements in a tuple is declared using the <tt>tuple</tt> keyword
<xref target="tuple-keyword"/>, which is <bcp14>REQUIRED</bcp14>. The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> be a JSON array
of strings, where each declared property name <bcp14>MUST</bcp14> be an element of the array.
The order of the elements in the array defines the order of the properties in
the tuple.</t>
            <t>A <tt>tuple</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "tuple",
  "name": "Person",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "tuple": ["name", "age"]
}
]]></sourcecode>
            <t>The following JSON node is a valid instance of the <tt>tuple</tt> type defined above:</t>
            <sourcecode type="json"><![CDATA[
["Alice", 42]
]]></sourcecode>
          </section>
          <section anchor="any">
            <name><tt>any</tt></name>
            <t>The <tt>any</tt> type is used to define a type that can be any JSON value, including
primitive types, compound types, and extended types.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "any"
}
]]></sourcecode>
          </section>
          <section anchor="choice">
            <name><tt>choice</tt></name>
            <t>The <tt>choice</tt> type is used to define a "discriminated union" of types. A
choice is a set of types where only one type can be selected at a time and
where the selected type is determined by the value of a selector.</t>
            <t>The <tt>choice</tt> type can declare two variants of discriminated unions that
are represented differently in JSON:</t>
            <ul spacing="normal">
              <li>
                <t><em>Tagged unions</em>: The <tt>choice</tt> type is represented as a JSON object with a
single property whose name is the selector of the type as declared in the
<tt>choices</tt> (<xref target="choices-keyword"/>) map and whose value is of the selected type.</t>
              </li>
              <li>
                <t><em>Inline unions</em>: The <tt>choice</tt> type is represented as a JSON object of the
selected type with the selector as a property of the object.</t>
              </li>
            </ul>
            <section anchor="tagged-unions">
              <name>Tagged Unions</name>
              <t>A tagged union is declared as follows:</t>
              <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
              <t>The JSON node described by the schema above is a tagged union. For the
example, the following JSON node is a valid instance of the <tt>MyChoice</tt> type:</t>
              <sourcecode type="json"><![CDATA[
{
  "string": "Hello, world!"
}
]]></sourcecode>
              <t>or:</t>
              <sourcecode type="json"><![CDATA[
{
  "int32": 42
}
]]></sourcecode>
            </section>
            <section anchor="inline-unions">
              <name>Inline Unions</name>
              <t>Inline unions require all type choices to extend a common base type.</t>
              <t>This is expressed by using the <tt>$extends</tt> (<xref target="extends-keyword"/>) keyword in the
<tt>choice</tt> declaration. The <tt>$extends</tt> keyword <bcp14>MUST</bcp14> refer to a schema that defines
the base type and the base type <bcp14>MUST</bcp14> be abstract.</t>
              <t>If <tt>$extends</tt> is present, the <tt>selector</tt> property declares the name of the
injected property that acts as the selector for the inline union. The
type of the selector property is <tt>string</tt>. The selector property <bcp14>MAY</bcp14>
shadow a property of the base type; in this case, the base type property
<bcp14>MUST</bcp14> be of type <tt>string</tt>.</t>
              <t>The selector is defined as a property of the base type and the value of the
selector property <bcp14>MUST</bcp14> be a string that matches the name of one of the
options in the <tt>choices</tt> map.</t>
              <t>Example:</t>
              <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "type": "choice",
  "$extends": "#/definitions/Address",
  "selector": "addressType",
  "choices": {
    "StreetAddress": { "type": { "$ref": "#/definitions/StreetAddress" } },
    "PostOfficeBoxAddress": { "type": { "$ref": "#/definitions/PostOfficeBoxAddress" } }
  },
  "definitions" : {
    "Address": {
      "abstract": true,
      "type": "object",
      "properties": {
          "city": { "type": "string" },
          "state": { "type": "string" },
          "zip": { "type": "string" }
      }
    },
    "StreetAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "street": { "type": "string" }
      }
    },
    "PostOfficeBoxAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "poBox": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
              <t>The JSON node described by the schema above is an inline union. This
example shows a JSON node that is a street address:</t>
              <sourcecode type="json"><![CDATA[
{
  "addressType": "StreetAddress",
  "street": "123 Main St",
  "city": "Seattle",
  "state": "WA",
  "zip": "98101"
}
]]></sourcecode>
              <t>This example shows a JSON node that is a post office box address:</t>
              <sourcecode type="json"><![CDATA[
{
  "addressType": "PostOfficeBoxAddress",
  "poBox": "1234",
  "city": "Seattle",
  "state": "WA",
  "zip": "98101"
}
]]></sourcecode>
            </section>
          </section>
        </section>
      </section>
      <section anchor="document-structure">
        <name>Document Structure</name>
        <t>A JSON Structure document is a JSON object that contains schemas (<xref target="schema"/>)</t>
        <t>The root of a JSON Structure document <bcp14>MUST</bcp14> be a JSON object.</t>
        <t>The root object <bcp14>MUST</bcp14> contain the following <bcp14>REQUIRED</bcp14> keywords:</t>
        <ul spacing="normal">
          <li>
            <t><tt>$id</tt>: A URI that is the unique identifier for this schema document.</t>
          </li>
          <li>
            <t><tt>$schema</tt>: A URI that identifies the version and meta-schema of the JSON
Structure specification used.</t>
          </li>
          <li>
            <t><tt>name</tt>: A string that provides a name for the document. If the root object
 defines a type, the <tt>name</tt> attribute is also the name of the type.</t>
          </li>
        </ul>
        <t>The presence of both keywords identifies the document as a JSON Structure
document.</t>
        <t>The root object <bcp14>MAY</bcp14> contain the following <bcp14>OPTIONAL</bcp14> keywords:</t>
        <ul spacing="normal">
          <li>
            <t><tt>$root</tt>: A JSON Pointer that designates a reusable type as the root type for
instances.</t>
          </li>
          <li>
            <t><tt>definitions</tt>: The root of the type declaration namespace hierarchy.</t>
          </li>
          <li>
            <t><tt>type</tt>: A type declaration for the root type of the document. Mutually
exclusive with <tt>$root</tt>.</t>
          </li>
          <li>
            <t>if <tt>type</tt> is present, all annotations and constraints applicable to this
declared root type are also permitted at the root level.</t>
          </li>
        </ul>
        <section anchor="namespaces">
          <name>Namespaces</name>
          <t>A namespace is a JSON object that provides a scope for type declarations or
other namespaces. Namespaces <bcp14>MAY</bcp14> be nested within other namespaces.</t>
          <t>The <tt>definitions</tt> keyword forms the root of the namespace hierarchy for reusable
type definitions. All type declarations immediately under the <tt>definitions</tt>
keyword are in the root namespace.</t>
          <t>A <tt>type</tt> definition at the root is placed into the root namespace as if it were
a type declaration under <tt>definitions</tt>.</t>
          <t>Any object in the <tt>definitions</tt> map that is not a type declaration is a
namespace.</t>
          <t>Example with inline <tt>type</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
          <t>Example with <tt>$root</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "$root": "#/definitions/TypeName",
    "definitions": {
        "TypeName": {
            "type": "object",
            "properties": {
                "name": { "type": "string" }
            }
        }
    }
}
]]></sourcecode>
          <t>Example with the root type in a namespace:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "$root": "#/definitions/Namespace/TypeName",
    "definitions": {
        "Namespace": {
            "TypeName": {
                "name": "TypeName",
                "type": "object",
                "properties": {
                    "name": { "type": "string" }
                }
            }
        }
    }
}
]]></sourcecode>
        </section>
        <section anchor="schema-keyword">
          <name><tt>$schema</tt> Keyword</name>
          <t>The value of the <bcp14>REQUIRED</bcp14> <tt>$schema</tt> keyword <bcp14>MUST</bcp14> be an absolute URI. The keyword
has different functions in JSON Structure documents and JSON documents.</t>
          <ul spacing="normal">
            <li>
              <t>In JSON Structure schema documents, the <tt>$schema</tt> keyword references a
meta-schema that this document conforms to.</t>
            </li>
            <li>
              <t>In JSON documents, the <tt>$schema</tt> keyword references a JSON Structure schema
document that defines the structure of the JSON document.</t>
            </li>
          </ul>
          <t>The value of <tt>$schema</tt> <bcp14>MUST</bcp14> correspond to the <tt>$id</tt> of the referenced
meta-schema or schema document.</t>
          <t>The <tt>$schema</tt> keyword <bcp14>MUST</bcp14> be used at the root level of the document.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
          <t>Use of the keyword <tt>$schema</tt> does NOT import the referenced schema document such
that its types become available for use in the current document.</t>
        </section>
        <section anchor="id-keyword">
          <name><tt>$id</tt> Keyword</name>
          <t>The <bcp14>REQUIRED</bcp14> <tt>$id</tt> keyword is used to assign a unique identifier to a JSON
Structure schema document. The value of <tt>$id</tt> <bcp14>MUST</bcp14> be an absolute URI. It <bcp14>SHOULD</bcp14>
be a resolvable URI (a URL).</t>
          <t>The <tt>$id</tt> keyword is used to identify a schema document in references like
<tt>$schema</tt>.</t>
          <t>The <tt>$id</tt> keyword <bcp14>MUST</bcp14> only be used once in a document, at the root level.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
        </section>
        <section anchor="root-keyword">
          <name><tt>$root</tt> Keyword</name>
          <t>The <bcp14>OPTIONAL</bcp14> <tt>$root</tt> keyword is used to designate any reusable type defined in
the document as the root type of this schema document. The value of <tt>$root</tt> <bcp14>MUST</bcp14>
be a valid JSON Pointer that resolves to an existing type definition inside the
<tt>definitions</tt> object.</t>
          <t>The <tt>$root</tt> keyword <bcp14>MUST</bcp14> only be used once in a document, at the root level. Its
use is mutually exclusive with the <tt>type</tt> keyword.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "$root": "#/definitions/Namespace/TypeName",
  "definitions": {
      "Namespace": {
          "TypeName": {
            "name": "TypeName",
            "type": "object",
            "properties": {
                "name": { "type": "string" }
            }
          }
      }
  }
}
]]></sourcecode>
        </section>
        <section anchor="definitions-keyword">
          <name><tt>definitions</tt> Keyword</name>
          <t>The <tt>definitions</tt> keyword defines a namespace hierarchy for reusable type
declarations. The keyword <bcp14>MUST</bcp14> be used at the root level of the document.</t>
          <t>The value of the <tt>definitions</tt> keyword <bcp14>MUST</bcp14> be a map of types and namespaces.
The namespace at the root level of the <tt>definitions</tt> keyword is the root
namespace.</t>
          <t>A namespace is a JSON object that provides a scope for type declarations or
other namespaces. Any JSON object under the <tt>definitions</tt> keyword that is not a
type definition (containing the <tt>type</tt> attribute) is considered a namespace.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "definitions": {
        "Namespace": {
            "TypeName": {
                "name": "TypeName",
                "type": "object",
                "properties": {
                    "name": { "type": "string" }
                }
            }
        }
    }
}
]]></sourcecode>
        </section>
        <section anchor="ref-keyword">
          <name><tt>$ref</tt> Keyword</name>
          <t>References to type declarations within the same document <bcp14>MUST</bcp14> use a schema
containing a single property with the name <tt>$ref</tt> as the value of <tt>type</tt>. The
value of <tt>$ref</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer Fragment Identifier
(see <xref section="6" sectionFormat="of" target="RFC6901"/>) that resolves to an existing type definition.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "properties": {
      "name1": { "type": { "$ref": "#/definitions/Namespace/TypeName" }},
      "name2": { "type": { "$ref": "#/definitions/Namespace2/TypeName2" }}
  },
  "definitions": {
      "Namespace": {
          "TypeName": {
              "name": "TypeName",
              "type": "object",
              "properties": {
                  "name": { "type": "string" }
              }
          }
      },
      "Namespace2": {
          "TypeName2": {
              "name": "TypeName2",
              "type": "object",
              "properties": {
                  "name": { "type": { "$ref": "#/definitions/Namespace/TypeName" }}
              }
          }
      }
  }
}
]]></sourcecode>
          <t>The <tt>$ref</tt> keyword is only permitted inside the <tt>type</tt> attribute value of a
schema definition, including in type unions.</t>
          <t><tt>$ref</tt> is NOT permitted in other attributes and <bcp14>MUST NOT</bcp14> be used inside the
<tt>type</tt> of the root object.</t>
        </section>
        <section anchor="cross-references">
          <name>Cross-references</name>
          <t>In JSON Structure documents, the <tt>$schema</tt> keyword references the meta-schema of
this specification. In JSON documents, the <tt>$schema</tt> keyword references the
schema document that defines the structure of the JSON document. The value of
<tt>$schema</tt> is a URI. Ideally, the URI <bcp14>SHOULD</bcp14> be a resolvable URL to a schema
document, but it's primarily an identifier. As an identifier, it can be used as
a lookup key in a cache or schema-registry.</t>
          <t>The <bcp14>OPTIONAL</bcp14> <xref target="JSTRUCT-IMPORT"/> extension specification is the exception and
provides a mechanism for importing definitions from external schemas.</t>
        </section>
      </section>
      <section anchor="type-system-rules">
        <name>Type System Rules</name>
        <section anchor="schema-declarations">
          <name>Schema Declarations</name>
          <ul spacing="normal">
            <li>
              <t>Every schema element <bcp14>MUST</bcp14> declare a <tt>type</tt> referring to a primitive, compound,
or reusable type.</t>
            </li>
            <li>
              <t>To reference a reusable type, the <tt>type</tt> attribute <bcp14>MUST</bcp14> be a schema with a
single <tt>$ref</tt> property resolving to an existing type declaration.</t>
            </li>
            <li>
              <t>Compound types <bcp14>SHOULD</bcp14> be declared in the <tt>definitions</tt> section as reusable
types. Inline compound types in arrays, maps, unions, or property definitions
<bcp14>MUST NOT</bcp14> be referenced externally.</t>
            </li>
            <li>
              <t>Primitive and compound type declarations are confined to this specification.</t>
            </li>
            <li>
              <t>Defined types:
              </t>
              <ul spacing="normal">
                <li>
                  <t><strong>JSON Primitives:</strong> <tt>string</tt>, <tt>number</tt>, <tt>integer</tt>, <tt>boolean</tt>, <tt>null</tt>.</t>
                </li>
                <li>
                  <t><strong>Extended Primitives:</strong> <tt>int32</tt>, <tt>uint32</tt>, <tt>int64</tt>, <tt>uint64</tt>, <tt>int128</tt>,
<tt>uint128</tt>, <tt>float</tt>, <tt>double</tt>, <tt>decimal</tt>, <tt>date</tt>, <tt>datetime</tt>, <tt>time</tt>,
<tt>duration</tt>, <tt>uuid</tt>, <tt>uri</tt>, <tt>binary</tt>, <tt>jsonpointer</tt>.</t>
                </li>
                <li>
                  <t><strong>JSON Compounds:</strong> <tt>object</tt>, <tt>array</tt>.</t>
                </li>
                <li>
                  <t><strong>Extended Compounds:</strong> <tt>map</tt>, <tt>set</tt>, <tt>tuple</tt>, <tt>any</tt>, <tt>choice</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="reusable-types">
          <name>Reusable Types</name>
          <ul spacing="normal">
            <li>
              <t>Reusable types <bcp14>MUST</bcp14> be defined in the <tt>definitions</tt> section.</t>
            </li>
            <li>
              <t>Each declaration in <tt>definitions</tt> <bcp14>MUST</bcp14> have a unique, case-sensitive name
within its namespace. The same name <bcp14>MAY</bcp14> appear in different namespaces.</t>
            </li>
          </ul>
        </section>
        <section anchor="type-references">
          <name>Type References</name>
          <ul spacing="normal">
            <li>
              <t>Use <tt>$ref</tt> to reference types declared in the same document.</t>
            </li>
            <li>
              <t><tt>$ref</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer to an existing type declaration.</t>
            </li>
            <li>
              <t><tt>$ref</tt> <bcp14>MAY</bcp14> include a <tt>description</tt> attribute for additional context.</t>
            </li>
          </ul>
        </section>
        <section anchor="dynamic-structures">
          <name>Dynamic Structures</name>
          <ul spacing="normal">
            <li>
              <t>Use the <tt>map</tt> type for dynamic key–value pairs. The <tt>object</tt> type requires at
least one property and cannot model fully dynamic properties with
<tt>additionalProperties</tt>.</t>
            </li>
            <li>
              <t>The <tt>values</tt> attribute of a <tt>map</tt> and the <tt>items</tt> attribute of an <tt>array</tt> or
<tt>set</tt> <bcp14>MUST</bcp14> reference a reusable type, a primitive type, or a locally declared
compound type.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="composition-rules">
        <name>Composition Rules</name>
        <t>This section defines the rules for composing schemas. Further, <bcp14>OPTIONAL</bcp14>
composition rules are defined in the <xref target="JSTRUCT-COMPOSITION"/> extension
specification.</t>
        <section anchor="unions">
          <name>Unions</name>
          <ul spacing="normal">
            <li>
              <t>Non-discriminated type unions are formed as sets of primitive types and type
references. It is NOT permitted to define a compound type inline inside a
non-discriminated type union. Discriminated unions are formed as a
<tt>choice</tt> (<xref target="choice"/>) type to which the rules of this section do not apply.</t>
            </li>
            <li>
              <t>A type union is a composite type reference and not a standalone compound type
and is therefore not named.</t>
            </li>
            <li>
              <t>The JSON node described by a schema with a type union <bcp14>MUST</bcp14> conform to at least
one of the types in the union.</t>
            </li>
            <li>
              <t>If the JSON node described by a schema with a type union conforms to more than
one type in the union, the JSON node <bcp14>MUST</bcp14> be considered to be of the first
matching type in the union.</t>
            </li>
          </ul>
          <t><strong>Examples:</strong></t>
          <t>Union of a string and a compound type:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "$ref": "#/definitions/Namespace/TypeName" } ]
}
]]></sourcecode>
          <t>Union of a string and an <tt>int32</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", "int32"]
}
]]></sourcecode>
          <t>A valid union of a string and a <tt>map</tt> of strings:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "map", "values": { "type": "string" } } ]
}
]]></sourcecode>
          <t>An inline definition of a compound type in a union is NOT permitted:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "object", "properties": { "name": { "type": "string" } } } ]
}
]]></sourcecode>
        </section>
        <section anchor="prohibition-of-top-level-unions">
          <name>Prohibition of Top-Level Unions</name>
          <ul spacing="normal">
            <li>
              <t>The root of a JSON Structure document <bcp14>MUST NOT</bcp14> be an array.</t>
            </li>
            <li>
              <t>If a type union is desired as the type of the root of a document instance, the
<tt>$root</tt> keyword <bcp14>MUST</bcp14> be used to designate a type union as the root type.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="identifier-rules">
        <name>Identifier Rules</name>
        <t>All property names and type names <bcp14>MUST</bcp14> conform to the regular expression
<tt>[A-Za-z_][A-Za-z0-9_]*</tt>. They <bcp14>MUST</bcp14> begin with a letter or underscore and <bcp14>MAY</bcp14>
contain letters, digits, and underscores. Keys and type names are
case-sensitive.</t>
        <t>If names need to contain characters outside of this range, consider using the
<xref target="JSTRUCT-ALTNAMES"/> extension specification to define those.</t>
      </section>
      <section anchor="structural-keywords">
        <name>Structural Keywords</name>
        <section anchor="type-keyword">
          <name>The <tt>type</tt> Keyword</name>
          <t>Declares the type of a schema element as a primitive or compound type. The
<tt>type</tt> keyword <bcp14>MUST</bcp14> be present in every schema element. For unions, the value of
<tt>type</tt> <bcp14>MUST</bcp14> be an array of type references or primitive type names.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string"
}
]]></sourcecode>
        </section>
        <section anchor="properties-keyword">
          <name>The <tt>properties</tt> Keyword</name>
          <t><tt>properties</tt> defines the properties of an <tt>object</tt> type.</t>
          <t>The <tt>properties</tt> keyword <bcp14>MUST</bcp14> contain a map of property names mapped to schema
definitions.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="required-keyword">
          <name>The <tt>required</tt> Keyword</name>
          <t><tt>required</tt> defines the required properties of an <tt>object</tt> type. The <tt>required</tt>
keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt>.</t>
          <t>The value of the <tt>required</tt> keyword is a simple array of property names or an
array of arrays of property names.</t>
          <t>An array of arrays is used to define alternative sets of required properties.
When alternative sets are used, exactly one of the sets <bcp14>MUST</bcp14> match the
properties of the object, meaning they are mutually exclusive.</t>
          <t>Property names in the <tt>required</tt> array <bcp14>MUST</bcp14> be present in <tt>properties</tt>.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"]
}
]]></sourcecode>
          <t>Example with alternative sets:</t>
          <t>Because the <tt>name</tt> property is required in both sets, the <tt>name</tt> property is
required in all objects. The <tt>fins</tt> property is required in the first set, and
the <tt>legs</tt> property is required in the second set. That means that an object
<bcp14>MUST</bcp14> have either <tt>fins</tt> or <tt>legs</tt> but not both.</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "fins": { "type": "int32" },
    "legs": { "type": "int32" },
    "wings": { "type": "int32" }
  },
  "required": [["name", "fins"], ["name", "legs"]]
}
]]></sourcecode>
        </section>
        <section anchor="items-keyword">
          <name>The <tt>items</tt> Keyword</name>
          <t>Defines the schema for elements in an <tt>array</tt> or <tt>set</tt> type. The value is a type
reference or a primitive type name or a locally declared compound type.</t>
          <t>Examples:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/definitions/Namespace/TypeName" }}
}
]]></sourcecode>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="values-keyword">
          <name>The <tt>values</tt> Keyword</name>
          <t>Defines the schema for values in a <tt>map</tt> type.</t>
          <t>The <tt>values</tt> keyword <bcp14>MUST</bcp14> reference a reusable type or a primitive type or a
locally declared compound type.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="const-keyword">
          <name>The <tt>const</tt> Keyword</name>
          <t>Constrains the values of the JSON node described by the schema to a single,
specific value. The <tt>const</tt> keyword <bcp14>MUST</bcp14> appear only in schemas with a primitive
<tt>type</tt>, and the instance value <bcp14>MUST</bcp14> match the provided constant exactly.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "const": "example"
}
]]></sourcecode>
        </section>
        <section anchor="enum-keyword">
          <name>The <tt>enum</tt> Keyword</name>
          <t>Constrains a schema to match one of a specific set of values. The <tt>enum</tt> keyword
<bcp14>MUST</bcp14> appear only in schemas with a primitive <tt>type</tt>, and all values in the enum
array <bcp14>MUST</bcp14> match that type. Values <bcp14>MUST</bcp14> be unique.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "enum": ["value1", "value2", "value3"]
}
]]></sourcecode>
          <t>It is NOT permitted to use <tt>enum</tt> in conjunction with a type union in <tt>type</tt>.</t>
        </section>
        <section anchor="additionalproperties-keyword">
          <name>The <tt>additionalProperties</tt> Keyword</name>
          <t><tt>additionalProperties</tt> defines whether additional properties are allowed in an
<tt>object</tt> type and, optionally, what their schema is. The value <bcp14>MUST</bcp14> be a boolean
or a schema. If set to <tt>false</tt>, no additional properties are allowed. If
provided with a schema, each additional property <bcp14>MUST</bcp14> conform to it.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  },
  "additionalProperties": false
}
]]></sourcecode>
        </section>
        <section anchor="choices-keyword">
          <name>The <tt>choices</tt> Keyword</name>
          <t><tt>choices</tt> defines the choices of a <tt>choice</tt> type. The value <bcp14>MUST</bcp14> be a map of
type names to schemas. Each type name <bcp14>MUST</bcp14> be unique within the <tt>choices</tt> map.</t>
          <t>The value of each type name <bcp14>MUST</bcp14> be a schema. Inline compound types are permitted.</t>
          <t>The <tt>choices</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t><strong>*Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="selector-keyword">
          <name>The <tt>selector</tt> Keyword</name>
          <t>The <tt>selector</tt> keyword defines the name of the property that acts as the selector
for the type in a <tt>choice</tt> type. The value of <tt>selector</tt> <bcp14>MUST</bcp14> be a string.</t>
          <t>The <tt>selector</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t>See <tt>choice</tt> (<xref target="choice"/>) for an example.</t>
        </section>
        <section anchor="tuple-keyword">
          <name>The <tt>tuple</tt> Keyword</name>
          <t>The <tt>tuple</tt> keyword defines the order of properties in a <tt>tuple</tt> type. The
value of <tt>tuple</tt> <bcp14>MUST</bcp14> be an array of strings, where each string is the name of a
property defined in the <tt>properties</tt> map. The order of the strings in the array
defines the order of the properties in the tuple.</t>
          <t>The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>tuple</tt> (<xref target="tuple"/>).</t>
          <t>See <tt>tuple</tt> (<xref target="tuple"/>) for an example.</t>
        </section>
      </section>
      <section anchor="type-annotation-keywords">
        <name>Type Annotation Keywords</name>
        <t>Type annotation keywords provide additional metadata about the underlying type.
These keywords are used for documentation and validation of additional
constraints on types.</t>
        <section anchor="maxlength-keyword">
          <name>The <tt>maxLength</tt> Keyword</name>
          <t>Specifies the maximum allowed length for a string. The <tt>maxLength</tt> keyword <bcp14>MUST</bcp14>
be used only with <tt>string</tt> types, and the string’s length <bcp14>MUST</bcp14> not exceed this
value.</t>
          <t>The purpose of <tt>maxLength</tt> is to provide a known storage constraint on the
maximum length of a string. The value <bcp14>MAY</bcp14> be used for validation.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "maxLength": 255
}
]]></sourcecode>
        </section>
        <section anchor="precision-keyword">
          <name>The <tt>precision</tt> Keyword</name>
          <t>Specifies the total number of significant digits for numeric values. The
<tt>precision</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt> types.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "precision": 10
}
]]></sourcecode>
        </section>
        <section anchor="scale-keyword">
          <name>The <tt>scale</tt> Keyword</name>
          <t>Specifies the number of digits to the right of the decimal point for numeric
values. The <tt>scale</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt>
types to constrain the fractional part.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "scale": 2
}
]]></sourcecode>
        </section>
        <section anchor="contentencoding-keyword">
          <name>The <tt>contentEncoding</tt> Keyword</name>
          <t>Specifies the encoding of a binary value. The <tt>contentEncoding</tt> keyword is used
as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentEncoding</tt> are defined in <xref target="RFC4648"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>base64</tt>: The binary value is encoded as a base64 string.</t>
            </li>
            <li>
              <t><tt>base64url</tt>: The binary value is encoded as a base64url string.</t>
            </li>
            <li>
              <t><tt>base16</tt>: The binary value is encoded as a base16 string.</t>
            </li>
            <li>
              <t><tt>base32</tt>: The binary value is encoded as a base32 string.</t>
            </li>
            <li>
              <t><tt>base32hex</tt>: The binary value is encoded as a base32hex string.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64"
}
]]></sourcecode>
        </section>
        <section anchor="contentcompression-keyword">
          <name>The <tt>contentCompression</tt> Keyword</name>
          <t>Specifies the compression algorithm used for a binary value before encoding. The
<tt>contentCompression</tt> keyword is used as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentCompression</tt> are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>gzip</tt>: The binary value is compressed using the gzip algorithm. See
<xref target="RFC1952"/>.</t>
            </li>
            <li>
              <t><tt>deflate</tt>: The binary value is compressed using the deflate algorithm. See
<xref target="RFC1951"/>.</t>
            </li>
            <li>
              <t><tt>zlib</tt>: The binary value is compressed using the zlib algorithm. See
<xref target="RFC1950"/>.</t>
            </li>
            <li>
              <t><tt>brotli</tt>: The binary value is compressed using the brotli algorithm. See
<xref target="RFC7932"/>.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "compression": "gzip"
}
]]></sourcecode>
        </section>
        <section anchor="contentmediatype-keyword">
          <name>The <tt>contentMediaType</tt> Keyword</name>
          <t>Specifies the media type of a binary value. The <tt>contentMediaType</tt> keyword is
used as an annotation for <tt>binary</tt> types.</t>
          <t>The value of <tt>contentMediaType</tt> <bcp14>MUST</bcp14> be a valid media type as defined in
<xref target="RFC6838"/>.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "mediaType": "image/png"
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="documentation-keywords">
        <name>Documentation Keywords</name>
        <t>Documentation keywords provide descriptive information for schema elements. They
are <bcp14>OPTIONAL</bcp14> but <bcp14>RECOMMENDED</bcp14> for clarity.</t>
        <section anchor="description-keyword">
          <name>The <tt>description</tt> Keyword</name>
          <t>Provides a human-readable description of a schema element. The <tt>description</tt>
keyword <bcp14>SHOULD</bcp14> be used to document any schema element.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "description": "A person's name"
}
]]></sourcecode>
          <t>For multi-lingual descriptions, the <xref target="JSTRUCT-ALTNAMES"/> companion provides an
extension to define several concurrent descriptions in multiple languages.</t>
        </section>
        <section anchor="examples-keyword">
          <name>The <tt>examples</tt> Keyword</name>
          <t>Provides example instance values that conform to the schema. The <tt>examples</tt>
keyword <bcp14>SHOULD</bcp14> be used to document potential instance values.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "examples": ["example1", "example2"]
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="extensions-and-add-ins">
        <name>Extensions and Add-Ins</name>
        <t>The <tt>abstract</tt> and <tt>$extends</tt> keywords enable controlled type extension,
supporting basic object-oriented-programming-style inheritance while not
permitting subtype polymorphism where a sub-type value can be assigned a
base-typed property. This approach avoids validation complexities and mapping
issues between JSON schemas, programming types, and databases.</t>
        <t>An <em>extensible type</em> is declared as <tt>abstract</tt> and serves as a base for
extensions. For example, a base type <em>Address</em> <bcp14>MAY</bcp14> be extended by
<em>StreetAddress</em> and <em>PostOfficeBoxAddress</em> via <tt>$extends</tt>, but <em>Address</em> cannot
be used directly.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "definitions" : {
    "Address": {
      "abstract": true,
      "type": "object",
      "properties": {
          "city": { "type": "string" },
          "state": { "type": "string" },
          "zip": { "type": "string" }
      }
    },
    "StreetAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "street": { "type": "string" }
      }
    },
    "PostOfficeBoxAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "poBox": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
        <t>A <em>add-in type</em> is declared as <tt>abstract</tt> and <tt>$extends</tt> a specific type that
does not need to be abstract. For example, an add-in type <em>DeliveryInstructions</em>
might be applied to any <em>StreetAddress</em> types in a document:</t>
        <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/Addresses",
    "$root": "#/definitions/StreetAddress",
    "$offers": {
        "DeliveryInstructions": "#/definitions/DeliveryInstructions"
    },
    "definitions" : {
      "StreetAddress": {
        "type": "object",
        "properties": {
            "street": { "type": "string" },
            "city": { "type": "string" },
            "state": { "type": "string" },
            "zip": { "type": "string" }
        }
      },
      "DeliveryInstructions": {
        "abstract": true,
        "type": "object",
        "$extends": "#/definitions/StreetAddress",
        "properties": {
            "instructions": { "type": "string" }
        }
      }
    }
}
]]></sourcecode>
        <t>Add-in types are options that a document author can enable for a schema. The
definitions of add-in types are not part of the main schema by default, but are
injected into the designated schema type when the document author chooses to use
them.</t>
        <t>Add-in types are advertised in the schema document through the <tt>$offers</tt>
keyword, which is a map that defines add-in names for add-in schema definitions
that exist in the document.</t>
        <t>Add-ins are applied to a schema by referencing the add-in name in the <tt>$uses</tt>
keyword that is available only in instance documents. The <tt>$uses</tt> keyword is a
set of add-in names that are applied to the schema for the document.</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://schemas.vasters.com/Addresses",
  "$uses": ["DeliveryInstructions"],
  "street": "123 Main St",
  "city": "Anytown",
  "state": "QA",
  "zip": "00001",
  "instructions": "Leave at the back door"
}
]]></sourcecode>
        <section anchor="abstract-keyword">
          <name>The <tt>abstract</tt> Keyword</name>
          <t>The <tt>abstract</tt> keyword declares a type as abstract. This prohibits its direct
use in any type declaration or as the type of a schema element. Abstract types
are used as base types for extension via <tt>$extends</tt> or as add-in types via
<tt>$addins</tt>.</t>
          <t>Abstract types implicitly permit additional properties (<tt>additionalProperties</tt>
is always <tt>true</tt>).</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A boolean (<tt>true</tt> or <tt>false</tt>).</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>abstract</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt> and
<tt>tuple</tt>.</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MUST NOT</bcp14> be used as the type of a schema element or
referenced via <tt>$ref</tt>.</t>
                </li>
                <li>
                  <t>The <tt>additionalProperties</tt> keyword <bcp14>MUST NOT</bcp14> be used on abstract types (its
value is implicitly <tt>true</tt>).</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MAY</bcp14> extend other abstract types via <tt>$extends</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="extends-keyword">
          <name>The <tt>$extends</tt> Keyword</name>
          <t>The <tt>$extends</tt> keyword merges all properties from one or more abstract base
types into the extending type.</t>
          <t>If the type using <tt>$extends</tt> is marked as <tt>abstract</tt> and referenced via
<tt>$addins</tt>, the composite type <em>replaces</em> the base type in the type model of the
document.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A JSON Pointer to an abstract type, or an array of JSON Pointers to
abstract types.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$extends</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt> and
<tt>tuple</tt>.</t>
                </li>
                <li>
                  <t>The value of <tt>$extends</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer or an array of valid
JSON Pointers that point to abstract types within the same document.</t>
                </li>
                <li>
                  <t>The extending type <bcp14>MUST</bcp14> merge the abstract type's properties and constraints
and <bcp14>MUST NOT</bcp14> redefine any inherited property.</t>
                </li>
                <li>
                  <t>When multiple base types are specified, properties are merged in array
order. If multiple base types define a property with the same name, the
property from the first base type in the array takes precedence.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="offers-keyword">
          <name>The <tt>$offers</tt> Keyword</name>
          <t>The <tt>$offers</tt> keyword is used to advertise add-in types that are available for
use in a schema document. The <tt>$offers</tt> keyword is a map of add-in names to
add-in schema definitions.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A map of add-in names to add-in schema definitions.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$offers</tt> keyword <bcp14>MUST</bcp14> only be used in the root object of a schema
document.</t>
                </li>
                <li>
                  <t>The value of <tt>$offers</tt> <bcp14>MUST</bcp14> be a map where each key is a string and each
value is a JSON Pointer to an add-in schema definition in the same document
or a set of JSON Pointers to add-in schema definitions in the same document.
If the value is a set, the add-in name selects all add-in schema definitions
at the same time.</t>
                </li>
                <li>
                  <t>The keys in the <tt>$offers</tt> map <bcp14>MUST</bcp14> be unique.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="uses-keyword">
          <name>The <tt>$uses</tt> Keyword</name>
          <t>The <tt>$uses</tt> keyword is used to apply add-in types to a schema <em>in an instance
document</em> that references the schema. The keyword <bcp14>MAY</bcp14> be used in a meta-schema
that references a parent schema.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A set of add-in names or JSON Pointers to add-in schema definitions
in the same meta-schema document.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$uses</tt> keyword <bcp14>MUST</bcp14> only be used in instance documents.</t>
                </li>
                <li>
                  <t>The value of <tt>$uses</tt> <bcp14>MUST</bcp14> be a set of strings that are either:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>add-in names advertised in the <tt>$offers</tt> keyword of the schema document
referenced by the <tt>$schema</tt> keyword of the instance document or</t>
                    </li>
                    <li>
                      <t>JSON Pointers to add-in schema definitions in the same meta-schema
document.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="reserved-keywords">
      <name>Reserved Keywords</name>
      <t>The following keywords are reserved in JSON Structure and <bcp14>MUST NOT</bcp14> be used as
custom annotations or extension keywords:</t>
      <ul spacing="normal">
        <li>
          <t><tt>definitions</tt></t>
        </li>
        <li>
          <t><tt>$extends</tt></t>
        </li>
        <li>
          <t><tt>$id</tt></t>
        </li>
        <li>
          <t><tt>$ref</tt></t>
        </li>
        <li>
          <t><tt>$root</tt></t>
        </li>
        <li>
          <t><tt>$schema</tt></t>
        </li>
        <li>
          <t><tt>$uses</tt></t>
        </li>
        <li>
          <t><tt>$offers</tt></t>
        </li>
        <li>
          <t><tt>abstract</tt></t>
        </li>
        <li>
          <t><tt>additionalProperties</tt></t>
        </li>
        <li>
          <t><tt>choices</tt></t>
        </li>
        <li>
          <t><tt>const</tt></t>
        </li>
        <li>
          <t><tt>default</tt></t>
        </li>
        <li>
          <t><tt>description</tt></t>
        </li>
        <li>
          <t><tt>enum</tt></t>
        </li>
        <li>
          <t><tt>examples</tt></t>
        </li>
        <li>
          <t><tt>format</tt></t>
        </li>
        <li>
          <t><tt>items</tt></t>
        </li>
        <li>
          <t><tt>maxLength</tt></t>
        </li>
        <li>
          <t><tt>name</tt></t>
        </li>
        <li>
          <t><tt>precision</tt></t>
        </li>
        <li>
          <t><tt>properties</tt></t>
        </li>
        <li>
          <t><tt>required</tt></t>
        </li>
        <li>
          <t><tt>scale</tt></t>
        </li>
        <li>
          <t><tt>selector</tt></t>
        </li>
        <li>
          <t><tt>type</tt></t>
        </li>
        <li>
          <t><tt>values</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="cbor-type-system-mapping">
      <name>CBOR Type System Mapping</name>
      <t>CBOR <xref target="RFC8949"/> is a binary encoding of JSON-like data structures. The CBOR
type system is a superset of the JSON type system and adds "binary strings" as
its most substantial type system extension. Otherwise, CBOR is structurally
compatible with JSON.</t>
      <t>JSON Structure <bcp14>MAY</bcp14> be used to describe CBOR-encoded data structures. For
encoding CBOR data structures, the data structure is first mapped to a JSON type
model as described in this specification, with the exception that the <xref target="binary"/>
primitive type is preserved as a byte array. The resulting mapping is converted
into CBOR per the rules spelled out in <xref section="6.2" sectionFormat="of" target="RFC8949"/>.</t>
      <t>The decoding process is the reverse of the encoding process. The CBOR-encoded
data structure is first decoded into a JSON type model, and then the JSON type
model is validated against the JSON Structure schema, with <tt>binary</tt> types
validated as byte arrays.</t>
    </section>
    <section anchor="media-type">
      <name>Media Type</name>
      <t>The media type for JSON Structure documents is <tt>application/json-structure</tt>.</t>
      <t>It is <bcp14>RECOMMENDED</bcp14> to append the structured syntax suffix <tt>+json</tt> to indicate
unambiguously that the content is a JSON document, if the document is a JSON
document. In spite of this specification being focused on JSON, the JSON
Structure documents <bcp14>MAY</bcp14> be encoded using other serialization formats that can
represent the same data structure, such as CBOR <xref target="RFC8949"/>.</t>
      <ul spacing="normal">
        <li>
          <t>Type name: application</t>
        </li>
        <li>
          <t>Subtype name: json-structure</t>
        </li>
        <li>
          <t>Required parameters: none</t>
        </li>
        <li>
          <t>Optional parameters: none</t>
        </li>
        <li>
          <t>Encoding considerations: binary</t>
        </li>
        <li>
          <t>Security considerations: see <xref target="security-considerations"/></t>
        </li>
        <li>
          <t>Interoperability considerations: none</t>
        </li>
        <li>
          <t>Published specification: this document</t>
        </li>
        <li>
          <t>Applications that use this media type: none</t>
        </li>
        <li>
          <t>Fragment identifier considerations: none</t>
        </li>
        <li>
          <t>Additional information: none</t>
        </li>
      </ul>
    </section>
    <section anchor="media-type-parameters">
      <name>Media Type Parameters</name>
      <t>While the media type <tt>application/json-structure</tt> does not have any parameters,
this specification defines a parameter applicable to all JSON documents.</t>
      <section anchor="schema-parameter">
        <name><tt>schema</tt> Parameter</name>
        <t>The <tt>schema</tt> parameter is used to reference a JSON Structure document that
defines the structure of the JSON document. The value of the <tt>schema</tt> parameter
<bcp14>MUST</bcp14> be a URI that references and ideally resolves to a JSON Structure document.</t>
        <t>The <tt>schema</tt> parameter <bcp14>MAY</bcp14> be used in conjunction with the <tt>application/json</tt>
media type or the <tt>+json</tt> structured syntax suffix or any other media type that
is known to be encoded as JSON.</t>
        <t>Example using the HTTP <tt>Content-Type</tt> header:</t>
        <sourcecode type="http"><![CDATA[
Content-Type: application/json; schema="https://schemas.vasters.com/TypeName"
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>JSON Structure documents are self-contained and <bcp14>MUST NOT</bcp14> allow external
references except for the <tt>$schema</tt> and <tt>$addins</tt> keywords. Implementations <bcp14>MUST</bcp14>
ensure that all <tt>$ref</tt> pointers resolve within the same document to eliminate
security vulnerabilities related to external schema inclusion.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA shall be requested to register the media type <tt>application/json-structure</tt>
as defined in this specification in the "Media Types" registry.</t>
      <t>IANA shall be requested to register the parameter <tt>schema</tt> for the
<tt>application/json</tt> media type in the "Media Type Structured Syntax Suffixes"
registry.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC3986">
          <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="RFC9562">
          <front>
            <title>Universally Unique IDentifiers (UUIDs)</title>
            <author fullname="K. Davis" initials="K." surname="Davis"/>
            <author fullname="B. Peabody" initials="B." surname="Peabody"/>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <date month="May" year="2024"/>
            <abstract>
              <t>This specification defines UUIDs (Universally Unique IDentifiers) --
also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform
Resource Name namespace for UUIDs. A UUID is 128 bits long and is
intended to guarantee uniqueness across space and time. UUIDs were
originally used in the Apollo Network Computing System (NCS), later
in the Open Software Foundation's (OSF's) Distributed Computing
Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the OSF DCE specification with the
kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have
been incorporated into this document. This document obsoletes RFC
4122.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9562"/>
          <seriesInfo name="DOI" value="10.17487/RFC9562"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC6901">
          <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="RFC8259">
          <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="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </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="RFC1950">
          <front>
            <title>ZLIB Compressed Data Format Specification version 3.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <author fullname="J-L. Gailly" surname="J-L. Gailly"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1950"/>
          <seriesInfo name="DOI" value="10.17487/RFC1950"/>
        </reference>
        <reference anchor="RFC1951">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
        <reference anchor="RFC1952">
          <front>
            <title>GZIP file format specification version 4.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1952"/>
          <seriesInfo name="DOI" value="10.17487/RFC1952"/>
        </reference>
        <reference anchor="RFC7932">
          <front>
            <title>Brotli Compressed Data Format</title>
            <author fullname="J. Alakuijala" initials="J." surname="Alakuijala"/>
            <author fullname="Z. Szabadka" initials="Z." surname="Szabadka"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7932"/>
          <seriesInfo name="DOI" value="10.17487/RFC7932"/>
        </reference>
        <reference anchor="JSTRUCT-ALTNAMES" target="https://json-structure.github.io/alternate-names">
          <front>
            <title>JSON Structure Alternate Names</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-COMPOSITION" target="https://json-structure.github.io/conditional-composition">
          <front>
            <title>JSON Structure Conditional Composition</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-IMPORT" target="https://json-structure.github.io/import">
          <front>
            <title>JSON Structure Import</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-UNITS" target="https://json-structure.github.io/units">
          <front>
            <title>JSON Structure Units</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-VALIDATION" target="https://json-structure.github.io/validation">
          <front>
            <title>JSON Structure Validation</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-RELATIONS" target="https://json-structure.github.io/relations">
          <front>
            <title>JSON Structure Relations</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 1864?>

<section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-02">
      <name>Changes from draft-vasters-json-structure-core-02</name>
      <ul spacing="normal">
        <li>
          <t>Fixed grammar error ("an valid" → "a valid") in tuple example.</t>
        </li>
        <li>
          <t>Fixed awkward phrasing ("require for all" → "require all") in inline unions.</t>
        </li>
        <li>
          <t>Corrected RFC 3339 production name from <tt>time</tt> to <tt>full-time</tt>.</t>
        </li>
        <li>
          <t>Added JSON Structure Relations to companion specification references.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-01">
      <name>Changes from draft-vasters-json-structure-core-01</name>
      <ul spacing="normal">
        <li>
          <t>Fixed <tt>$ref</tt> paths in examples to correctly include <tt>#/definitions/</tt> prefix
for types defined in the definitions section.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-00">
      <name>Changes from draft-vasters-json-structure-core-00</name>
      <ul spacing="normal">
        <li>
          <t>Added <tt>integer</tt> as an alias for <tt>int32</tt> to improve compatibility with
simple JSON Schema definitions and user habits.</t>
        </li>
        <li>
          <t>Updated the <tt>$extends</tt> keyword to accept either a single JSON Pointer
or an array of JSON Pointers, enabling multiple inheritance for object
and tuple types.</t>
        </li>
        <li>
          <t>Fixed inconsistent <tt>$ref</tt> usage in examples throughout the document.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
gLh7PuVDc+93JJeBjpySgmZ7+9Lw1r2g2OnAleSD1y86PnPJLybrZUw37IWZ
bEY1p/H15jWcI2e+tRIRmXzkd4yMikoHSh2F3uYIhrubxOqIIk9qQb4EuM3o
UV8CXggx9eJSaFwim8uVBmj8na2McncuoQTlmwQx6I136D0DhF6eyHRLdHk5
pkTfJ4Uu8T01WdFWJRA+fwer1E3MJcJq6pbPQOR1S5OygLWrPGnhG1Lo8iBe
0yWAMF7pnN1YC9ca1hzY82VgeF+GjqmhLm6sUWsUlcvG7+mvosbgThBoNAPK
bHHSuQV+T8ES4n3J+OQY2VhTuDwtluXxfa0eh9F1a1sEickDcLhapSuCILlu
Qdd7spc1A1NlSesT3FefrTo1qJJDbxkH745pT3jP5QEY3zcB1178rHPwkgpE
xvUBVe9L292y1JHUhR2FJuxlZ+mxA/uwmI+f0CmFk6Zz3wILDNbQgs4xxoGY
vUZsu15zm7sqArQe45bYwVNYyUN1gcWBx+MkCg7eOUh5xI6DqP9w09S3NIe8
duD2Ma7ult7Z6zZLb86bvRIjWoMiCn73kD/7ytOBYd/Abq1JlbTJHX29N/5P
8fjb19/Iw53xg9fffMY+a5cR525Rhp0/qVG9w/ANPLqp6DJi8iVhHqDGkHMr
vFJJSppiC/8B7Gq/pLouIdBU8CJUlTc5qQIox020bq0OZK7qK5qa9jzdeqg2
78hJQZ8+au/G3Hty+Gzv6eODJa4Me0lnUTlaKeOBLvpLDcinuwXlrb8e2qnn
3pz3BxikodsTjEc241P5MW67IiTjUTUIVY6c+sVHDuFRuONOLSQM+Et6/Byc
qKy2eB06t7hHG/1CtTc0XdP41siItyoOkzDcWj77bHl1JJYrbXlCmLSVXTw+
e66iJ8+obW21y1bxldY99T6KwX4f4NPVxNMD29bCxHowUrdRfXomOP06yPgE
BeF6Ee3r9NlzN34XItm37CvhdxWuW6P56PtuyAhecSj5Ty5RWPoaOGz3oBm3
PB7rUTCxY+IW8dDYybEShfzM7qpuQwnFj9oNe2p6ZOSookWhlkAPgjbx+tkk
7zbXQqB4021MF6EaPZRaELZItWNhN1Q3cRTN5DbIGkU9dtwNq6GJvQiRoj4S
U7/RF88LxYtdNitXUfkxCx8ORpq3CUEz+DKZxI26Eji5y6bOO7oCJihzCz8c
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

-->

</rfc>
