From b0942e9530136bdebacdc5aaeafeac8e0e59dfc1 Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Thu, 20 Jul 2023 08:11:31 +0200 Subject: [PATCH 01/33] Reduce diff to final OASIS output --- .../odata-data-aggregation-ext.html | 2 +- .../odata-data-aggregation-ext.md | 2 +- .../odata-data-aggregation-ext.pdf | Bin 1485601 -> 1485605 bytes odata-data-aggregation-ext/0 frontmatter.md | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html index c29a4bcf8..9fb1ff230 100644 --- a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html +++ b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html @@ -157,7 +157,7 @@

Key words:

Citation format:

When referencing this specification the following citation format should be used:

[OData-Data-Agg-v4.0]

-

OData Extension for Data Aggregation Version 4.0. Edited by Ralf Handl, Hubert Heijkers, Gerald Krause, Michael Pizzo, Heiko Theißen, and Martin Zurmuehl. 05 July 2023. Committee Specification Draft 04. https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/csd04/odata-data-aggregation-ext-v4.0-csd04.html. Latest stage: https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/odata-data-aggregation-ext-v4.0.html.

+

OData Extension for Data Aggregation Version 4.0. Edited by Ralf Handl, Hubert Heijkers, Gerald Krause, Michael Pizzo, Heiko Theißen, and Martin Zurmuehl. 05 July 2023. OASIS Committee Specification Draft 04. https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/csd04/odata-data-aggregation-ext-v4.0-csd04.html. Latest stage: https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/odata-data-aggregation-ext-v4.0.html.

Notices

Copyright © OASIS Open 2023. All Rights Reserved.

Distributed under the terms of the OASIS IPR Policy.

diff --git a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md index 2ae70b55a..91bd0608f 100644 --- a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md +++ b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md @@ -82,7 +82,7 @@ When referencing this specification the following citation format should be used **[OData-Data-Agg-v4.0]** _OData Extension for Data Aggregation Version 4.0_. -Edited by Ralf Handl, Hubert Heijkers, Gerald Krause, Michael Pizzo, Heiko Theißen, and Martin Zurmuehl. 05 July 2023. Committee Specification Draft 04. +Edited by Ralf Handl, Hubert Heijkers, Gerald Krause, Michael Pizzo, Heiko Theißen, and Martin Zurmuehl. 05 July 2023. OASIS Committee Specification Draft 04. https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/csd04/odata-data-aggregation-ext-v4.0-csd04.html. Latest stage: https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/odata-data-aggregation-ext-v4.0.html. diff --git a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.pdf b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.pdf index 5eaaad7b4f3ad370bf71ede41ab020d532e98dcb..96ff64072e1cc2ff3f674b1bfc0ef6cb8782be90 100644 GIT binary patch delta 18696 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 diff --git a/odata-data-aggregation-ext/0 frontmatter.md b/odata-data-aggregation-ext/0 frontmatter.md index b93a857cd..d7d7328c7 100644 --- a/odata-data-aggregation-ext/0 frontmatter.md +++ b/odata-data-aggregation-ext/0 frontmatter.md @@ -82,7 +82,7 @@ When referencing this specification the following citation format should be used **[OData-Data-Agg-v4.0]** _$$$pagetitle$$$_. -Edited by Ralf Handl, Hubert Heijkers, Gerald Krause, Michael Pizzo, Heiko Theißen, and Martin Zurmuehl. $$$pubdate$$$. $$$subtitle$$$. +Edited by Ralf Handl, Hubert Heijkers, Gerald Krause, Michael Pizzo, Heiko Theißen, and Martin Zurmuehl. $$$pubdate$$$. OASIS $$$subtitle$$$. https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/csd04/$$$filename$$$.html. Latest stage: https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/odata-data-aggregation-ext-v4.0.html. From ce1ee902f014cbebffa85847f445362552aadae8 Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Thu, 20 Jul 2023 13:58:13 +0200 Subject: [PATCH 02/33] JSON Format starter template --- docs/odata-json-format/odata-json-format.html | 0 docs/odata-json-format/odata-json-format.md | 468 ++++++++++++++++++ .../styles/markdown-styles-v1.7.3b.css | 91 ++++ docs/odata-json-format/styles/odata.css | 188 +++++++ odata-json-format/0 frontmatter.md | 89 ++++ odata-json-format/1 Introduction.md | 214 ++++++++ odata-json-format/Appendix.md | 126 +++++ odata-json-format/meta.yaml | 6 + 8 files changed, 1182 insertions(+) create mode 100644 docs/odata-json-format/odata-json-format.html create mode 100644 docs/odata-json-format/odata-json-format.md create mode 100644 docs/odata-json-format/styles/markdown-styles-v1.7.3b.css create mode 100644 docs/odata-json-format/styles/odata.css create mode 100644 odata-json-format/0 frontmatter.md create mode 100644 odata-json-format/1 Introduction.md create mode 100644 odata-json-format/Appendix.md create mode 100644 odata-json-format/meta.yaml diff --git a/docs/odata-json-format/odata-json-format.html b/docs/odata-json-format/odata-json-format.html new file mode 100644 index 000000000..e69de29bb diff --git a/docs/odata-json-format/odata-json-format.md b/docs/odata-json-format/odata-json-format.md new file mode 100644 index 000000000..e3a2b3fe6 --- /dev/null +++ b/docs/odata-json-format/odata-json-format.md @@ -0,0 +1,468 @@ + +![OASIS Logo](https://docs.oasis-open.org/templates/OASISLogo-v3.0.png) + +------- + +# OData JSON Format Version 4.02 + +## Committee Specification Draft 01 + +## 14 July 2023 + +  + +#### This stage: +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.md (Authoritative) \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.html \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.pdf + +#### Previous stage: +N/A + +#### Latest stage: +https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.md (Authoritative) \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.pdf + +#### Technical Committee: +[OASIS Open Data Protocol (OData) TC](https://www.oasis-open.org/committees/odata/) + +#### Chairs: + +Ralf Handl (ralf.handl@sap.com), [SAP SE](http://www.sap.com/) \ +Michael Pizzo (mikep@microsoft.com), [Microsoft](http://www.microsoft.com/) + +#### Editors: + +Ralf Handl (ralf.handl@sap.com), [SAP SE](http://www.sap.com/) \ +Michael Pizzo (mikep@microsoft.com), [Microsoft](http://www.microsoft.com/) \ +Heiko Theißen (heiko.theissen@sap.com), [SAP SE](http://www.sap.com/) + +#### Related work: +This specification replaces or supersedes: +* OData JSON Format Version 4.01. Edited by Michael Pizzo, Ralf Handl, and Mark Biamonte. OASIS Standard. Latest stage: https://docs.oasis-open.org/odata/odata-json-format/v4.01/odata-json-format-v4.01.html. +* OData JSON Format Version 4.0. Edited by Ralf Handl, Michael Pizzo, and Mark Biamonte. OASIS Standard. Latest stage: http://docs.oasis-open.org/odata/odata-json-format/v4.0/odata-json-format-v4.0.html. + +This specification is related to: +* _OData Version 4.02_. Edited by Michael Pizzo, Ralf Handl, and Heiko Theißen. A multi-part Work Product that includes: + * _OData Version 4.02 Part 1: Protocol_. Latest stage. https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html + * _OData Version 4.02 Part 2: URL Conventions_. Latest stage. https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html + * _ABNF components: OData ABNF Construction Rules Version 4.02 and OData ABNF Test Cases_. https://docs.oasis-open.org/odata/odata/v4.02/csd01/abnf/ +* _OData Vocabularies Version 4.0_. Edited by Michael Pizzo, Ralf Handl, and Ram Jeyaraman. Latest stage: https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/odata-vocabularies-v4.0.html +* _OData Common Schema Definition Language (CSDL) JSON Representation Version 4.02_. Edited by Michael Pizzo, Ralf Handl, and Heiko Theißen. Latest stage: https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html +* _OData Common Schema Definition Language (CSDL) XML Representation Version 4.02_. Edited by Michael Pizzo, Ralf Handl, and Heiko Theißen. Latest stage: https://docs.oasis-open.org/odata/odata-csdl-xml/v4.02/odata-csdl-xml-v4.02.html + +#### Abstract: +The Open Data Protocol (OData) for representing and interacting with structured content is comprised of a set of specifications. The core specification for the protocol is in OData Version 4.02 Part 1: Protocol. This document extends the core specification by defining representations for OData requests and responses using a JSON format. + +#### Status: +This document was last revised or approved by the OASIS Open Data Protocol (OData) TC on the above date. The level of approval is also listed above. Check the "Latest stage" location noted above for possible later revisions of this document. Any other numbered Versions and other technical work produced by the Technical Committee (TC) are listed at https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=odata#technical. + +TC members should send comments on this specification to the TC's email list. Others should send comments to the TC's public comment list, after subscribing to it by following the instructions at the "[Send A Comment](https://www.oasis-open.org/committees/comments/index.php?wg_abbrev=odata)" button on the TC's web page at https://www.oasis-open.org/committees/odata/. + +This specification is provided under the [RF on RAND Terms Mode](https://www.oasis-open.org/policies-guidelines/ipr/#RF-on-RAND-Mode) of the [OASIS IPR Policy](https://www.oasis-open.org/policies-guidelines/ipr/), the mode chosen when the Technical Committee was established. For information on whether any patents have been disclosed that may be essential to implementing this specification, and any offers of patent licensing terms, please refer to the Intellectual Property Rights section of the TC's web page (https://www.oasis-open.org/committees/odata/ipr.php). + +Note that any machine-readable content ([Computer Language Definitions](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsCompLang)) declared Normative for this Work Product is provided in separate plain text files. In the event of a discrepancy between any such plain text file and display content in the Work Product's prose narrative document(s), the content in the separate plain text file prevails. + +#### Key words: +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [[RFC2119](#rfc2119)] and [[RFC8174](#rfc8174)] when, and only when, they appear in all capitals, as shown here. + +#### Citation format: +When referencing this specification the following citation format should be used: + +**[OData-JSON-Format-v4.02]** + +_OData JSON Format Version 4.02_. +Edited by Ralf Handl, Michael Pizzo, and Heiko Theißen. 14 July 2023. OASIS Committee Specification Draft 01. +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.html. +Latest stage: https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html. + +#### Notices +Copyright © OASIS Open 2023. All Rights Reserved. + +Distributed under the terms of the OASIS [IPR Policy](https://www.oasis-open.org/policies-guidelines/ipr/). + +The name "OASIS" is a trademark of [OASIS](https://www.oasis-open.org/), the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. + +For complete copyright information please see the full Notices section in an Appendix [below](#Notices). + +------- + +# Table of Contents + +::: toc +- [1 Introduction](#Introduction) + - [1.1 Changes from earlier Versions](#ChangesfromearlierVersions) + - [1.2 Glossary](#Glossary) + - [1.2.1 Definitions of terms](#Definitionsofterms) + - [1.2.2 Acronyms and abbreviations](#Acronymsandabbreviations) + - [1.2.3 Document conventions](#Documentconventions) + - [1.3 Some markdown usage examples](#Somemarkdownusageexamples) + - [1.3.1 Figures and Captions](#FiguresandCaptions) + - [1.3.2 Tables](#Tables) + - [1.3.2.1 Basic Table](#BasicTable) + - [1.3.2.2 Table with Three Columns and Some Bold Text](#TablewithThreeColumnsandSomeBoldText) + - [1.3.2.3 Table with a caption which can be referenced](#Tablewithacaptionwhichcanbereferenced) + - [1.3.3 Lists](#Lists) + - [1.3.4 Reference Label Construction](#ReferenceLabelConstruction) + - [1.3.5 Code Blocks](#CodeBlocks) + - [1.3.6 Blockquotes](#Blockquotes) + - [1.4 Page Breaks](#PageBreaks) +- [2 Section Heading](#SectionHeading) + - [2.1 Level 2 Heading](#LevelHeading) + - [2.1.1 Level 3 Heading](#LevelHeading) + - [2.1.1.1 Level 4 Heading](#LevelHeading) + - [2.1.1.1.1 Level 5 Heading](#LevelHeading) + - [2.2 Next Heading](#NextHeading) +- [3 Conformance](#Conformance) +- [A References](#References) + - [A.1 Normative References](#NormativeReferences) + - [A.2 Informative References](#InformativeReferences) +- [B Safety, Security and Privacy Considerations](#SafetySecurityandPrivacyConsiderations) +- [C Acknowledgments](#Acknowledgments) + - [C.1 Special Thanks](#SpecialThanks) + - [C.2 Participants](#Participants) +- [D Revision History](#RevisionHistory) +- [E Example Appendix with subsections](#ExampleAppendixwithsubsections) + - [E.1 Subsection title](#Subsectiontitle) + - [E.1.1 Sub-subsection](#Subsubsection) +::: + +------- + +# 1 Introduction + + +*The content in this section is non-normative, except where it is marked +normative.* + +Here is a customized command line which will generate HTML from this markdown file (named odata-json-format-v4.02-csd01.md): + +pandoc -f gfm -t html odata-json-format-v4.02-csd01.md -c styles/markdown-styles-v1.7.3b.css --toc --toc-depth=5 -s -o odata-json-format-v4.02-csd01.html --metadata title="OData JSON Format Version 4.02" + +OASIS staff are currently using pandoc 3.0 from https://github.com/jgm/pandoc/releases/tag/3.0. + +Generating HTML in OASIS style requires a reference to a .css file containing the HTML styles. The .css file may be either included with the markdown file (like styles/markdown-styles-v1.7.3b.css) or a reference to one of the online stylesheets: +- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3.css +- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css (this one produces HTML that resembles the github display more closely, especially for blocks of code) + +Note this command generates a Table of Contents (TOC) in HTML which is located at the top of the HTML document, and which requires additional editing in order to be published in the expected OASIS style. This editing can be handled by OASIS staff during publication. +A TC may use other ways to generate HTML from markdown, which may generate a TOC in a different way. + +## 1.1 Changes from earlier Versions + + + +## 1.2 Glossary + + + +### 1.2.1 Definitions of terms + +### 1.2.2 Acronyms and abbreviations + +### 1.2.3 Document conventions + +- Naming conventions +- Font colors and styles +- Typographic conventions + +## 1.3 Some markdown usage examples + +**Text.** + +Note that text paragraphs in markdown should be separated by a blank line between them - + +Otherwise the separate paragraphs will be joined together when the HTML is generated. +Even if the text appears to be separate lines in the markdown source. + +To avoid having the usual vertical space between paragraphs, +append two or more space characters (or space-backslash) to the end of the lines +which will generate an HTML break tag instead of a new paragraph tag \ +(as demonstrated here). + +### 1.3.1 Figures and Captions + +FIGURE EXAMPLE: + + +###### Figure 1 -- Title of Figure +![image-label should be meaningful](images/image_0.png) (this image is missing) + +###### Figure 2 -- OpenC2 Message Exchange +![message exchange](images/image_1.png) + + +### 1.3.2 Tables + +#### 1.3.2.1 Basic Table +**Table 1-1. Table Label** + +| Item | Description | +| :--- | :--- | +| Item 1 | Something
(second line) | +| Item 2 | Something | +| Item 3 | Something
(second line) | +| Item 4 | text | + +#### 1.3.2.2 Table with Three Columns and Some Bold Text +text. + +| Title 1 | Title 2 | title 3 | +| :--- | :--- | :--- | +| something | something | something else that is a long string of text that **might** need to wrap around inside the table box and will just continue until the column divider is reached | +| something | something | something | + +#### 1.3.2.3 Table with a caption which can be referenced + +###### Table 1-5. See reference label construction + + +| Name | Description | +| :--- | :--- | +| **content** | Message body as specified by content_type and msg_type. | + +Here is a reference to the table caption: +Please see [Table 1-5 or other meaningful label](#table-1-5-see-reference-label-construction) + +### 1.3.3 Lists + +Bulleted list: +* bullet item 1. +* **Bold** bullet item 2. +* bullet item 3. +* bullet item 4. + +Indented or multi-level bullet list - add two spaces per level before bullet character (* or -): +* main bullet type + * Example second bullet + * See third level + * fourth level + +Numbered list: +1. item 1 +2. item 2 +3. item 3 + +Left-justified list without bullets or numbers: +To list multiple items without full paragraph breaks between items, add space-backslash after each item except the last. + +### 1.3.4 Reference Label Construction + +REFERENCES and ANCHORS +- in markdown source, format the Reference tags as level 6 headings like: `###### [RFC2119]` +###### [RFC2119] +Bradner, S., "Key words ..." + +- reference text has to be on a separate line below the tag + +- format cross-references (citations of the references) like: `see [[RFC2119](#rfc2119)]` +"see [[RFC2119](#rfc2119)]" +(note the outer square brackets in markdown will appear in the visible HTML text) + +- The text in the Reference tag (following ###### ) will become an HTML anchor using the following conversion rules: + - punctuation marks will be dropped (including "[" ) + - leading white spaces will be dropped + - upper case will be converted to lower + - spaces between letters will be converted to a single hyphen + +- The same HTML anchor construction rules apply to cross-references and to section headings. + - Thus, a section heading like "## 1.2 Glossary" + - becomes an anchor in HTML like `` + - referenced in the markdown like: see [Section 1.2](#12-glossary) + - in markdown: `"see [Section 1.2](#12-glossary)"` + - similar HTML anchors are also used in constructing the TOC + +### 1.3.5 Code Blocks + +Text to appear as an indented code block with grey background and monospace font - use three back-ticks before and after the code block. + +Note the actual backticks will not appear in the HTML format. If it's necessary to display visible backticks, place a back-slash before them like: \``` . + +``` +{ + "target": { + "x_kmip_2.0": { + {"kmip_type": "json"}, + {"operation": "RekeyKeyPair"}, + {"name": "publicWebKey11DEC2017"} + } + } +} +``` + +Text to be highlighted as code can also be surrounded by a single "backtick" character: `code text` + +### 1.3.6 Blockquotes + +To create a blockquote, start a line with greater than (>) followed by an optional space. + +Blockquotes can be nested, and can also contain other formatting. + +The stylesheet https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css results in an indented block with a left-side bar. + +## 1.4 Page Breaks +Add horizontal rule lines where page breaks are desired in the PDF - before each major section +- insert the line rules in markdown by inserting 3 or more hyphens on a line by themselves: --- +- place these before each main section in markdown (usually "#" - which generates the HTML `

` tag) + +------- + +# 2 Section Heading +text. + +## 2.1 Level 2 Heading +text. + +### 2.1.1 Level 3 Heading +text. + +#### 2.1.1.1 Level 4 Heading +text. + +##### 2.1.1.1.1 Level 5 Heading +This is the deepest level, because six # gets transformed into a Reference tag. + + +## 2.2 Next Heading +text. + +------- + +# 3 Conformance + + +`(Note: The [OASIS TC Process](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsConfClause) requires that a specification approved by the TC at the Committee Specification Public Review Draft, Committee Specification or OASIS Standard level must include a separate section, listing a set of numbered conformance clauses, to which any implementation of the specification must adhere in order to claim conformance to the specification (or any optional portion thereof). This is done by listing the conformance clauses here.` +`For the definition of "conformance clause," see [OASIS Defined Terms](https://www.oasis-open.org/policies-guidelines/oasis-defined-terms-2018-05-22/#dConformanceClause).` + +`See "Guidelines to Writing Conformance Clauses": +https://docs.oasis-open.org/templates/TCHandbook/ConformanceGuidelines.html.` + +`Remove this note before submitting for publication.)` + + +------- + +# Appendix A. References + + + +This appendix contains the normative and informative references that are used in this document. + +While any hyperlinks included in this appendix were valid at the time of publication, OASIS cannot guarantee their long-term validity. + +## A.1 Normative References + +The following documents are referenced in such a way that some or all of their content constitutes requirements of this document. + +`(Reference sources: +For references to IETF RFCs, use the approved citation formats at: +https://docs.oasis-open.org/templates/ietf-rfc-list/ietf-rfc-list.html. +For references to W3C Recommendations, use the approved citation formats at: +https://docs.oasis-open.org/templates/w3c-recommendations-list/w3c-recommendations-list.html. +Remove this note before submitting for publication.)` + +###### [OpenC2-HTTPS-v1.0] +_Specification for Transfer of OpenC2 Messages via HTTPS Version 1.0_. Edited by David Lemire. Latest stage: https://docs.oasis-open.org/openc2/open-impl-https/v1.0/open-impl-https-v1.0.html +###### [OpenC2-SLPF-v1.0] +_Open Command and Control (OpenC2) Profile for Stateless Packet Filtering Version 1.0_. Edited by Joe Brule, Duncan Sparrell, and Alex Everett. Latest stage: https://docs.oasis-open.org/openc2/oc2slpf/v1.0/oc2slpf-v1.0.html +###### [RFC2119] +Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, http://www.rfc-editor.org/info/rfc2119. +###### [RFC8174] +Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, http://www.rfc-editor.org/info/rfc8174. + +## A.2 Informative References + +###### [RFC3552] +Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552. + +------- + +# Appendix B. Safety, Security and Privacy Considerations + + + +`(Note: OASIS strongly recommends that Technical Committees consider issues that might affect safety, security, privacy, and/or data protection in implementations of their specification and document them for implementers and adopters. For some purposes, you may find it required, e.g. if you apply for IANA registration.` + +`While it may not be immediately obvious how your specification might make systems vulnerable to attack, most specifications, because they involve communications between systems, message formats, or system settings, open potential channels for exploit. For example, IETF [[RFC3552](#rfc3552)] lists “eavesdropping, replay, message insertion, deletion, modification, and man-in-the-middle” as well as potential denial of service attacks as threats that must be considered and, if appropriate, addressed in IETF RFCs.` + +`In addition to considering and describing foreseeable risks, this section should include guidance on how implementers and adopters can protect against these risks.` + +`We encourage editors and TC members concerned with this subject to read _Guidelines for Writing RFC Text on Security Considerations_, IETF [[RFC3552](#rfc3552)], for more information.` + +`Remove this note before submitting for publication.)` + +------- + +# Appendix C. Acknowledgments + + + +`Note: A Work Product approved by the TC must include a list of people who participated in the development of the Work Product. This is generally done by collecting the list of names in this appendix. This list shall be initially compiled by the Chair, and any Member of the TC may add or remove their names from the list by request. Remove this note before submitting for publication.` + +## C.1 Special Thanks + + + +Substantial contributions to this document from the following individuals are gratefully acknowledged: + +Participant Name, Affiliation or "Individual Member" + +## C.2 Participants + + + +The following individuals have participated in the creation of this specification and are gratefully acknowledged: + +**OpenC2 TC Members:** + +| First Name | Last Name | Company | +| :--- | :--- | :--- | +Philippe | Alman | Something Networks +Alex | Amirnovman | Company B +Kris | Anderman | Mini Micro +Darren | Anstman | Big Networks + +------- + +# Appendix D. Revision History + + + +| Revision | Date | Editor | Changes Made | +| :--- | :--- | :--- | :--- | +| specname-v1.0-wd01 | yyyy-mm-dd | Editor Name | Initial working draft | + +------- + +# Appendix E. Example Appendix with subsections + +## E.1 Subsection title + +### E.1.1 Sub-subsection + +------- + +# Appendix F. Notices + + + +Copyright © OASIS Open 2023. All Rights Reserved. + +All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full [Policy](https://www.oasis-open.org/policies-guidelines/ipr/) may be found at the OASIS website. + +This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to OASIS, except as needed for the purpose of developing any document or deliverable produced by an OASIS Technical Committee (in which case the rules applicable to copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it into languages other than English. + +The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns. + +This document and the information contained herein is provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +As stated in the OASIS IPR Policy, the following three paragraphs in brackets apply to OASIS Standards Final Deliverable documents (Committee Specification, Candidate OASIS Standard, OASIS Standard, or Approved Errata). + +\[OASIS requests that any OASIS Party or any other party that believes it has patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable, to notify OASIS TC Administrator and provide an indication of its willingness to grant patent licenses to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this deliverable.\] + +\[OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of any patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable by a patent holder that is not willing to provide a license to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this OASIS Standards Final Deliverable. OASIS may include such claims on its website, but disclaims any obligation to do so.\] + +\[OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this OASIS Standards Final Deliverable or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to rights in any document or deliverable produced by an OASIS Technical Committee can be found on the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this OASIS Standards Final Deliverable, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any information or list of intellectual property rights will at any time be complete, or that any claims in such list are, in fact, Essential Claims.\] + +The name "OASIS" is a trademark of [OASIS](https://www.oasis-open.org/), the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and implementation and use of, specifications, while reserving the right to enforce its marks against misleading uses. Please see https://www.oasis-open.org/policies-guidelines/trademark/ for above guidance. diff --git a/docs/odata-json-format/styles/markdown-styles-v1.7.3b.css b/docs/odata-json-format/styles/markdown-styles-v1.7.3b.css new file mode 100644 index 000000000..f102f0ace --- /dev/null +++ b/docs/odata-json-format/styles/markdown-styles-v1.7.3b.css @@ -0,0 +1,91 @@ +/* OASIS specification styles for HTML generated from Markdown or similar sources */ +/* usually used after basic w3.css */ +/* Paul Knight 2018-09-27 */ +/* pk 2018-10-01 - v1.2 reduced section header and title (h*) font sizes */ +/* pk 2018-10-02 - v1.3 added right margin; allowed text wrapping in code blocks and scrolling for overflowing text */ +/* pk 2018-10-19 - v1.4 added display:inline to avoid page-wide background coloring */ +/* pk 2018-10-25 - v1.5 added use of

as citation tag for References section or elsewhere */ +/* pk 2018-10-26 - v1.5.1 (experimental) and v1.6 added use of
as a page break when generating PDF from the HTML */ +/* pk 2018-11-14 - v1.6.1 - lighter gray background color for code blocks */ +/* pk 2019-02-18 - v1.7 - Use Liberation Sans and Liberation Mono fonts if possible */ +/* pk 2019-02-18 - v1.7.1 (experimental) changed px to pt (and reduced numbers) for fonts and tables; added bigtitle style */ +/* pk 2019-05-23 - v1.7.2 (based on 1.7.1) changed monospace "code" font to Courier New */ +/* pk 2019-08-01 - v1.7.3 substitute PostScript name for fonts (LiberationSans for "Liberation Sans" and CourierNew for "Courier New") to address a flaw in "wkhtmltopdf" which rendered all text as bold. Changed "bigtitle" to "h1big"*/ +/* dk 2020-10-21 - v1.7.3a (unofficial for jadn, based on 1.7.3) update block quotes and code blocks */ +/* Heiko Theißen 2023-06-02 - v1.7.3b (unofficial for odata-data-aggregation-ext, based on v1.7.3a) include local font names "Liberation Sans" and "Courier New" */ + +body { + margin-left: 3pc; + margin-right: 3pc; + font-family: LiberationSans, "Liberation Sans", Arial, Helvetica, sans-serif; + font-size:12pt; + line-height:1.2; + } + +html{overflow-x:auto} + + /* styles for section headings - levels 1-5 (maybe include heading1, etc. later) */ +h1{font-size:18pt}h2{font-size:14pt}h3{font-size:13pt}h4{font-size:12pt}h5{font-size:11pt} +h1big{font-size: 24pt} +h1,h2,h3,h4,h5,h1big{font-family: LiberationSans, "Liberation Sans", Arial, Helvetica, sans-serif;font-weight: bold;margin:8pt 0;color: #446CAA} + /* style for h6, for use as Reference tag */ +h6{font-size:12pt; line-height:1.0} +h6{font-family: LiberationSans, "Liberation Sans", Arial, Helvetica, sans-serif;font-weight: bold;margin:0pt;} + /* not needed - can just use brackets in the label itself */ + /* h6::before {content: "["} */ + /* h6::after {content: "]"} */ + + /* style for hr to insert a page break before each ruled line (generated in markdown by 3 or more hyphens alone on a line) */ +hr{page-break-before: always;} + + +/* Table styles - bordered with option for striped */ +table { + border-collapse: collapse; +} + +table { + border-collapse:collapse; + border-spacing:0; + width:100%; + display:table; + font-size:12pt; + margin-top: 6pt; + } + +table, th, td { + border: 1pt solid black; + padding:6pt 6pt; + text-align:left; + vertical-align:top; +} +th { + color:#ffffff; + background-color: #446CAA; + } + /* "table-striped" tag is not generated by pandoc - add manually in HTML if wanted */ +.table-striped tbody tr:nth-child(even){background-color:#d6f3ff} + +/* style for code blocks */ +pre { + background-color:#f0f0f0; + padding: 6px; +} + +code,kbd,samp{ + font-family:CourierNew, "Courier New", monospace; + white-space: pre-wrap; + font-size: 10pt; +} + +/* offset block quote */ +blockquote { + background-color:#f0f0f0; + padding-left: 10px; + border-left: solid lightgray 6px; +} + +/* space bullets a bit */ +li { + margin: 3px 0; +} diff --git a/docs/odata-json-format/styles/odata.css b/docs/odata-json-format/styles/odata.css new file mode 100644 index 000000000..4efa4b885 --- /dev/null +++ b/docs/odata-json-format/styles/odata.css @@ -0,0 +1,188 @@ +a:target { + background-color: yellow; +} + +a[href^="#OData"], +a[href^="#RFC"], +a[href^="#SQL"] { + font-weight: bold; +} + +a[href^="#OData"]::before, +a[href^="#RFC"]::before, +a[href^="#SQL"]::before { + content: "["; + font-weight: bold; +} + +a[href^="#OData"]::after, +a[href^="#RFC"]::after, +a[href^="#SQL"]::after { + content: "]"; + font-weight: bold; +} + +.toc li { + list-style-type: none; +} + +.example, +.example table { + font-size: smaller; +} + +.example p, +.example li { + font-style: italic; +} + +table { + width: auto; +} + +.example table, +.example th, +.example td { + padding: 2pt 6pt; + white-space: nowrap; +} + +.example td[rowspan] { + text-align: right; + vertical-align: middle; + border-style: dotted; +} + +.example th[colspan] { + text-align: center; +} + +.example-data { + position: relative; +} + +.example-data div { + position: absolute; +} + +.example-data p { + font-style: unset !important; +} + +.example-data svg { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.cross tbody tr:first-of-type, +.cross tbody tr:nth-of-type(2), +.cross td:first-of-type, +.cross td:nth-of-type(2) { + font-weight: bold; + color: white; + background-color: #446CAA +} + +.cross tbody tr:first-of-type td:first-of-type, +.cross tbody tr:nth-of-type(2) td:first-of-type, +.cross tbody tr:first-of-type td:nth-of-type(2), +.cross tbody tr:nth-of-type(2) td:nth-of-type(2) { + border: none; + background-color: white; +} + +.example-data th:first-of-type:not(:last-of-type), +.legend tbody tr:first-of-type { + background-color: green; +} + +.nav th:nth-of-type(2), +.nav-2 th:nth-of-type(3), +.nav-2 th:nth-of-type(4), +.nav-2 th:nth-of-type(5), +.legend tbody tr:last-of-type { + background-color: rgb(255, 128, 0); +} + +.legend td { + font-weight: bold; + color: white; +} + +.example-data svg>path { + fill: none; + stroke: black; + stroke-width: 2; +} + +p code, +li code, +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-family: MJXZERO, MJXTEX-T; + font-size: 1em; + line-height: 0; +} + +.example p code, +.example li code { + font-style: initial; +} + +.example pre { + margin-left: 40px; +} + +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: unset; +} + +mjx-container { + font-size: unset !important; +} + +mjx-container[display=true] { + text-align: left !important; + margin-left: 40px !important; +} + +/* The following rule enables typewriter single quotes in maths, like $\hbox{\tt{'$Q$'}}$ */ +mjx-c.mjx-c2019::before { + content: "\27" !important; + padding-right: 0.525em !important; + font-family: MJXZERO, MJXTEX-T; +} + +code .er { + color: unset !important; + font-weight: unset !important; +} + +hr:first-of-type { + page-break-before: avoid; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + page-break-after: avoid; +} + +h2[id="22-example-data"] { + page-break-before: always; +} \ No newline at end of file diff --git a/odata-json-format/0 frontmatter.md b/odata-json-format/0 frontmatter.md new file mode 100644 index 000000000..2e0f21059 --- /dev/null +++ b/odata-json-format/0 frontmatter.md @@ -0,0 +1,89 @@ + +![OASIS Logo](https://docs.oasis-open.org/templates/OASISLogo-v3.0.png) + +------- + +# $$$pagetitle$$$ + +## $$$subtitle$$$ + +## $$$pubdate$$$ + +  + +#### This stage: +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.md (Authoritative) \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.html \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.pdf + +#### Previous stage: +N/A + +#### Latest stage: +https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.md (Authoritative) \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html \ +https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.pdf + +#### Technical Committee: +[OASIS Open Data Protocol (OData) TC](https://www.oasis-open.org/committees/odata/) + +#### Chairs: + +Ralf Handl (ralf.handl@sap.com), [SAP SE](http://www.sap.com/) \ +Michael Pizzo (mikep@microsoft.com), [Microsoft](http://www.microsoft.com/) + +#### Editors: + +Ralf Handl (ralf.handl@sap.com), [SAP SE](http://www.sap.com/) \ +Michael Pizzo (mikep@microsoft.com), [Microsoft](http://www.microsoft.com/) \ +Heiko Theißen (heiko.theissen@sap.com), [SAP SE](http://www.sap.com/) + +#### Related work: +This specification replaces or supersedes: +* OData JSON Format Version 4.01. Edited by Michael Pizzo, Ralf Handl, and Mark Biamonte. OASIS Standard. Latest stage: https://docs.oasis-open.org/odata/odata-json-format/v4.01/odata-json-format-v4.01.html. +* OData JSON Format Version 4.0. Edited by Ralf Handl, Michael Pizzo, and Mark Biamonte. OASIS Standard. Latest stage: http://docs.oasis-open.org/odata/odata-json-format/v4.0/odata-json-format-v4.0.html. + +This specification is related to: +* _OData Version 4.02_. Edited by Michael Pizzo, Ralf Handl, and Heiko Theißen. A multi-part Work Product that includes: + * _OData Version 4.02 Part 1: Protocol_. Latest stage. https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html + * _OData Version 4.02 Part 2: URL Conventions_. Latest stage. https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html + * _ABNF components: OData ABNF Construction Rules Version 4.02 and OData ABNF Test Cases_. https://docs.oasis-open.org/odata/odata/v4.02/csd01/abnf/ +* _OData Vocabularies Version 4.0_. Edited by Michael Pizzo, Ralf Handl, and Ram Jeyaraman. Latest stage: https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/odata-vocabularies-v4.0.html +* _OData Common Schema Definition Language (CSDL) JSON Representation Version 4.02_. Edited by Michael Pizzo, Ralf Handl, and Heiko Theißen. Latest stage: https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html +* _OData Common Schema Definition Language (CSDL) XML Representation Version 4.02_. Edited by Michael Pizzo, Ralf Handl, and Heiko Theißen. Latest stage: https://docs.oasis-open.org/odata/odata-csdl-xml/v4.02/odata-csdl-xml-v4.02.html + +#### Abstract: +The Open Data Protocol (OData) for representing and interacting with structured content is comprised of a set of specifications. The core specification for the protocol is in OData Version 4.02 Part 1: Protocol. This document extends the core specification by defining representations for OData requests and responses using a JSON format. + +#### Status: +This document was last revised or approved by the OASIS Open Data Protocol (OData) TC on the above date. The level of approval is also listed above. Check the "Latest stage" location noted above for possible later revisions of this document. Any other numbered Versions and other technical work produced by the Technical Committee (TC) are listed at https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=odata#technical. + +TC members should send comments on this specification to the TC's email list. Others should send comments to the TC's public comment list, after subscribing to it by following the instructions at the "[Send A Comment](https://www.oasis-open.org/committees/comments/index.php?wg_abbrev=odata)" button on the TC's web page at https://www.oasis-open.org/committees/odata/. + +This specification is provided under the [RF on RAND Terms Mode](https://www.oasis-open.org/policies-guidelines/ipr/#RF-on-RAND-Mode) of the [OASIS IPR Policy](https://www.oasis-open.org/policies-guidelines/ipr/), the mode chosen when the Technical Committee was established. For information on whether any patents have been disclosed that may be essential to implementing this specification, and any offers of patent licensing terms, please refer to the Intellectual Property Rights section of the TC's web page (https://www.oasis-open.org/committees/odata/ipr.php). + +Note that any machine-readable content ([Computer Language Definitions](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsCompLang)) declared Normative for this Work Product is provided in separate plain text files. In the event of a discrepancy between any such plain text file and display content in the Work Product's prose narrative document(s), the content in the separate plain text file prevails. + +#### Key words: +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [[RFC2119](#rfc2119)] and [[RFC8174](#rfc8174)] when, and only when, they appear in all capitals, as shown here. + +#### Citation format: +When referencing this specification the following citation format should be used: + +**[OData-JSON-Format-v4.02]** + +_$$$pagetitle$$$_. +Edited by Ralf Handl, Michael Pizzo, and Heiko Theißen. $$$pubdate$$$. OASIS $$$subtitle$$$. +https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/$$$filename$$$.html. +Latest stage: https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html. + +#### Notices +Copyright $$$copyright$$$. All Rights Reserved. + +Distributed under the terms of the OASIS [IPR Policy](https://www.oasis-open.org/policies-guidelines/ipr/). + +The name "OASIS" is a trademark of [OASIS](https://www.oasis-open.org/), the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. + +For complete copyright information please see the full Notices section in an Appendix [below](#Notices). + +------- diff --git a/odata-json-format/1 Introduction.md b/odata-json-format/1 Introduction.md new file mode 100644 index 000000000..28a5a524a --- /dev/null +++ b/odata-json-format/1 Introduction.md @@ -0,0 +1,214 @@ +------- + +# ##sec Introduction + + +*The content in this section is non-normative, except where it is marked +normative.* + +Here is a customized command line which will generate HTML from this markdown file (named odata-json-format-v4.02-csd01.md): + +pandoc -f gfm -t html odata-json-format-v4.02-csd01.md -c styles/markdown-styles-v1.7.3b.css --toc --toc-depth=5 -s -o odata-json-format-v4.02-csd01.html --metadata title="OData JSON Format Version 4.02" + +OASIS staff are currently using pandoc 3.0 from https://github.com/jgm/pandoc/releases/tag/3.0. + +Generating HTML in OASIS style requires a reference to a .css file containing the HTML styles. The .css file may be either included with the markdown file (like styles/markdown-styles-v1.7.3b.css) or a reference to one of the online stylesheets: +- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3.css +- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css (this one produces HTML that resembles the github display more closely, especially for blocks of code) + +Note this command generates a Table of Contents (TOC) in HTML which is located at the top of the HTML document, and which requires additional editing in order to be published in the expected OASIS style. This editing can be handled by OASIS staff during publication. +A TC may use other ways to generate HTML from markdown, which may generate a TOC in a different way. + +## ##subsec Changes from earlier Versions + + + +## ##subsec Glossary + + + +### ##subsubsec Definitions of terms + +### ##subsubsec Acronyms and abbreviations + +### ##subsubsec Document conventions + +- Naming conventions +- Font colors and styles +- Typographic conventions + +## ##subsec Some markdown usage examples + +**Text.** + +Note that text paragraphs in markdown should be separated by a blank line between them - + +Otherwise the separate paragraphs will be joined together when the HTML is generated. +Even if the text appears to be separate lines in the markdown source. + +To avoid having the usual vertical space between paragraphs, +append two or more space characters (or space-backslash) to the end of the lines +which will generate an HTML break tag instead of a new paragraph tag \ +(as demonstrated here). + +### ##subsubsec Figures and Captions + +FIGURE EXAMPLE: + + +###### Figure 1 -- Title of Figure +![image-label should be meaningful](images/image_0.png) (this image is missing) + +###### Figure 2 -- OpenC2 Message Exchange +![message exchange](images/image_1.png) + + +### ##subsubsec Tables + +#### ##subsubsubsec Basic Table +**Table 1-1. Table Label** + +| Item | Description | +| :--- | :--- | +| Item 1 | Something
(second line) | +| Item 2 | Something | +| Item 3 | Something
(second line) | +| Item 4 | text | + +#### ##subsubsubsec Table with Three Columns and Some Bold Text +text. + +| Title 1 | Title 2 | title 3 | +| :--- | :--- | :--- | +| something | something | something else that is a long string of text that **might** need to wrap around inside the table box and will just continue until the column divider is reached | +| something | something | something | + +#### ##subsubsubsec Table with a caption which can be referenced + +###### Table 1-5. See reference label construction + +
+ +| Name | Description | +| :--- | :--- | +| **content** | Message body as specified by content_type and msg_type. | + +Here is a reference to the table caption: +Please see [Table 1-5 or other meaningful label](#table-1-5-see-reference-label-construction) + + +### ##subsubsec Lists + +Bulleted list: +* bullet item 1. +* **Bold** bullet item 2. +* bullet item 3. +* bullet item 4. + +Indented or multi-level bullet list - add two spaces per level before bullet character (* or -): +* main bullet type + * Example second bullet + * See third level + * fourth level + +Numbered list: +1. item 1 +2. item 2 +3. item 3 + +Left-justified list without bullets or numbers: +To list multiple items without full paragraph breaks between items, add space-backslash after each item except the last. + +### ##subsubsec Reference Label Construction + +REFERENCES and ANCHORS +- in markdown source, format the Reference tags as level 6 headings like: `###### [RFC2119]` +###### [RFC2119] +Bradner, S., "Key words ..." + +- reference text has to be on a separate line below the tag + +- format cross-references (citations of the references) like: `see [[RFC2119](#rfc2119)]` +"see [[RFC2119](#rfc2119)]" +(note the outer square brackets in markdown will appear in the visible HTML text) + +- The text in the Reference tag (following ###### ) will become an HTML anchor using the following conversion rules: + - punctuation marks will be dropped (including "[" ) + - leading white spaces will be dropped + - upper case will be converted to lower + - spaces between letters will be converted to a single hyphen + +- The same HTML anchor construction rules apply to cross-references and to section headings. + - Thus, a section heading like "## 1.2 Glossary" + - becomes an anchor in HTML like `` + - referenced in the markdown like: see [Section 1.2](#12-glossary) + - in markdown: `"see [Section 1.2](#12-glossary)"` + - similar HTML anchors are also used in constructing the TOC + +### ##subsubsec Code Blocks + +Text to appear as an indented code block with grey background and monospace font - use three back-ticks before and after the code block. + +Note the actual backticks will not appear in the HTML format. If it's necessary to display visible backticks, place a back-slash before them like: \``` . + +``` +{ + "target": { + "x_kmip_2.0": { + {"kmip_type": "json"}, + {"operation": "RekeyKeyPair"}, + {"name": "publicWebKey11DEC2017"} + } + } +} +``` + +Text to be highlighted as code can also be surrounded by a single "backtick" character: +`code text` + +### ##subsubsec Blockquotes + +To create a blockquote, start a line with greater than (>) followed by an optional space. + +Blockquotes can be nested, and can also contain other formatting. + +The stylesheet https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css results in an indented block with a left-side bar. + +## ##subsec Page Breaks +Add horizontal rule lines where page breaks are desired in the PDF - before each major section +- insert the line rules in markdown by inserting 3 or more hyphens on a line by themselves: --- +- place these before each main section in markdown (usually "#" - which generates the HTML `

` tag) + +------- + +# ##sec Section Heading +text. + +## ##subsec Level 2 Heading +text. + +### ##subsubsec Level 3 Heading +text. + +#### ##subsubsubsec Level 4 Heading +text. + +##### ##subsubsubsubsec Level 5 Heading +This is the deepest level, because six # gets transformed into a Reference tag. + + +## ##subsec Next Heading +text. + +------- + +# ##sec Conformance + + +`(Note: The [OASIS TC Process](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsConfClause) requires that a specification approved by the TC at the Committee Specification Public Review Draft, Committee Specification or OASIS Standard level must include a separate section, listing a set of numbered conformance clauses, to which any implementation of the specification must adhere in order to claim conformance to the specification (or any optional portion thereof). This is done by listing the conformance clauses here.` +`For the definition of "conformance clause," see [OASIS Defined Terms](https://www.oasis-open.org/policies-guidelines/oasis-defined-terms-2018-05-22/#dConformanceClause).` + +`See "Guidelines to Writing Conformance Clauses": +https://docs.oasis-open.org/templates/TCHandbook/ConformanceGuidelines.html.` + +`Remove this note before submitting for publication.)` diff --git a/odata-json-format/Appendix.md b/odata-json-format/Appendix.md new file mode 100644 index 000000000..0db187892 --- /dev/null +++ b/odata-json-format/Appendix.md @@ -0,0 +1,126 @@ + +------- + +# Appendix ##asec References + + + +This appendix contains the normative and informative references that are used in this document. + +While any hyperlinks included in this appendix were valid at the time of publication, OASIS cannot guarantee their long-term validity. + +## ##subasec Normative References + +The following documents are referenced in such a way that some or all of their content constitutes requirements of this document. + +`(Reference sources: +For references to IETF RFCs, use the approved citation formats at: +https://docs.oasis-open.org/templates/ietf-rfc-list/ietf-rfc-list.html. +For references to W3C Recommendations, use the approved citation formats at: +https://docs.oasis-open.org/templates/w3c-recommendations-list/w3c-recommendations-list.html. +Remove this note before submitting for publication.)` + +###### [OpenC2-HTTPS-v1.0] +_Specification for Transfer of OpenC2 Messages via HTTPS Version 1.0_. Edited by David Lemire. Latest stage: https://docs.oasis-open.org/openc2/open-impl-https/v1.0/open-impl-https-v1.0.html +###### [OpenC2-SLPF-v1.0] +_Open Command and Control (OpenC2) Profile for Stateless Packet Filtering Version 1.0_. Edited by Joe Brule, Duncan Sparrell, and Alex Everett. Latest stage: https://docs.oasis-open.org/openc2/oc2slpf/v1.0/oc2slpf-v1.0.html +###### [RFC2119] +Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, http://www.rfc-editor.org/info/rfc2119. +###### [RFC8174] +Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, http://www.rfc-editor.org/info/rfc8174. + +## ##subasec Informative References + +###### [RFC3552] +Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552. + +------- + +# Appendix ##asec Safety, Security and Privacy Considerations + + + +`(Note: OASIS strongly recommends that Technical Committees consider issues that might affect safety, security, privacy, and/or data protection in implementations of their specification and document them for implementers and adopters. For some purposes, you may find it required, e.g. if you apply for IANA registration.` + +`While it may not be immediately obvious how your specification might make systems vulnerable to attack, most specifications, because they involve communications between systems, message formats, or system settings, open potential channels for exploit. For example, IETF [[RFC3552](#rfc3552)] lists “eavesdropping, replay, message insertion, deletion, modification, and man-in-the-middle” as well as potential denial of service attacks as threats that must be considered and, if appropriate, addressed in IETF RFCs.` + +`In addition to considering and describing foreseeable risks, this section should include guidance on how implementers and adopters can protect against these risks.` + +`We encourage editors and TC members concerned with this subject to read _Guidelines for Writing RFC Text on Security Considerations_, IETF [[RFC3552](#rfc3552)], for more information.` + +`Remove this note before submitting for publication.)` + +------- + +# Appendix ##asec Acknowledgments + + + +`Note: A Work Product approved by the TC must include a list of people who participated in the development of the Work Product. This is generally done by collecting the list of names in this appendix. This list shall be initially compiled by the Chair, and any Member of the TC may add or remove their names from the list by request. Remove this note before submitting for publication.` + +## ##subasec Special Thanks + + + +Substantial contributions to this document from the following individuals are gratefully acknowledged: + +Participant Name, Affiliation or "Individual Member" + +## ##subasec Participants + + + +The following individuals have participated in the creation of this specification and are gratefully acknowledged: + +**OpenC2 TC Members:** + +| First Name | Last Name | Company | +| :--- | :--- | :--- | +Philippe | Alman | Something Networks +Alex | Amirnovman | Company B +Kris | Anderman | Mini Micro +Darren | Anstman | Big Networks + +------- + +# Appendix ##asec Revision History + + + +| Revision | Date | Editor | Changes Made | +| :--- | :--- | :--- | :--- | +| specname-v1.0-wd01 | yyyy-mm-dd | Editor Name | Initial working draft | + +------- + +# Appendix ##asec Example Appendix with subsections + +## ##subasec Subsection title + +### ##subsubasec Sub-subsection + +------- + +# Appendix F. Notices + + + +Copyright © OASIS Open 2023. All Rights Reserved. + +All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full [Policy](https://www.oasis-open.org/policies-guidelines/ipr/) may be found at the OASIS website. + +This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to OASIS, except as needed for the purpose of developing any document or deliverable produced by an OASIS Technical Committee (in which case the rules applicable to copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it into languages other than English. + +The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns. + +This document and the information contained herein is provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +As stated in the OASIS IPR Policy, the following three paragraphs in brackets apply to OASIS Standards Final Deliverable documents (Committee Specification, Candidate OASIS Standard, OASIS Standard, or Approved Errata). + +\[OASIS requests that any OASIS Party or any other party that believes it has patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable, to notify OASIS TC Administrator and provide an indication of its willingness to grant patent licenses to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this deliverable.\] + +\[OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of any patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable by a patent holder that is not willing to provide a license to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this OASIS Standards Final Deliverable. OASIS may include such claims on its website, but disclaims any obligation to do so.\] + +\[OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this OASIS Standards Final Deliverable or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to rights in any document or deliverable produced by an OASIS Technical Committee can be found on the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this OASIS Standards Final Deliverable, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any information or list of intellectual property rights will at any time be complete, or that any claims in such list are, in fact, Essential Claims.\] + +The name "OASIS" is a trademark of [OASIS](https://www.oasis-open.org/), the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and implementation and use of, specifications, while reserving the right to enforce its marks against misleading uses. Please see https://www.oasis-open.org/policies-guidelines/trademark/ for above guidance. diff --git a/odata-json-format/meta.yaml b/odata-json-format/meta.yaml new file mode 100644 index 000000000..710841d22 --- /dev/null +++ b/odata-json-format/meta.yaml @@ -0,0 +1,6 @@ +pagetitle: OData JSON Format Version 4.02 +subtitle: Committee Specification Draft 01 +filename: odata-json-format-v4.02-csd01 +pubdate: 14 July 2023 +pubdateISO: '2023-07-14' +copyright: © OASIS Open 2023 From 5c676d93ebdd182aa0073a8ee61ff3498f873485 Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Thu, 20 Jul 2023 14:50:49 +0200 Subject: [PATCH 03/33] Continue build even if error are found --- docs/index.md | 3 +- docs/odata-json-format/odata-json-format.html | 325 ++++++++++++++++++ docs/odata-json-format/odata-json-format.md | 215 +++--------- lib/build.js | 10 +- odata-json-format/1 Introduction.md | 143 +------- odata-json-format/Appendix.md | 60 ++-- 6 files changed, 420 insertions(+), 336 deletions(-) diff --git a/docs/index.md b/docs/index.md index 1bf2ffd61..4859de140 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,4 +2,5 @@ This repository contains working drafts for OData specifications: -* [OData Extension for Data Aggregation Working Draft for CS03](odata-data-aggregation-ext/odata-data-aggregation-ext.html) +* [OData Extension for Data Aggregation Version 4.0 Working Draft for CS03](odata-data-aggregation-ext/odata-data-aggregation-ext.html) +* [OData JSON Format Version 4.02 Working Draft for CS01](odata-json-format/odata-json-format.html) diff --git a/docs/odata-json-format/odata-json-format.html b/docs/odata-json-format/odata-json-format.html index e69de29bb..e16cfdb0b 100644 --- a/docs/odata-json-format/odata-json-format.html +++ b/docs/odata-json-format/odata-json-format.html @@ -0,0 +1,325 @@ + + + + + + + OData JSON Format Version 4.02 + + + + + + +

OASIS Logo

+
+

OData JSON Format Version 4.02

+

Committee Specification Draft 01

+

14 July 2023

+

 

+

This stage:

+

https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.md (Authoritative)
+https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.html
+https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.pdf

+

Previous stage:

+

N/A

+

Latest stage:

+

https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.md (Authoritative)
+https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html
+https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.pdf

+

Technical Committee:

+

OASIS Open Data Protocol (OData) TC

+

Chairs:

+

Ralf Handl (ralf.handl@sap.com), SAP SE
+Michael Pizzo (mikep@microsoft.com), Microsoft

+

Editors:

+

Ralf Handl (ralf.handl@sap.com), SAP SE
+Michael Pizzo (mikep@microsoft.com), Microsoft
+Heiko Theißen (heiko.theissen@sap.com), SAP SE

+ +

This specification replaces or supersedes:

+ +

This specification is related to:

+ +

Abstract:

+

The Open Data Protocol (OData) for representing and interacting with structured content is comprised of a set of specifications. The core specification for the protocol is in OData Version 4.02 Part 1: Protocol. This document extends the core specification by defining representations for OData requests and responses using a JSON format.

+

Status:

+

This document was last revised or approved by the OASIS Open Data Protocol (OData) TC on the above date. The level of approval is also listed above. Check the "Latest stage" location noted above for possible later revisions of this document. Any other numbered Versions and other technical work produced by the Technical Committee (TC) are listed at https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=odata#technical.

+

TC members should send comments on this specification to the TC's email list. Others should send comments to the TC's public comment list, after subscribing to it by following the instructions at the "Send A Comment" button on the TC's web page at https://www.oasis-open.org/committees/odata/.

+

This specification is provided under the RF on RAND Terms Mode of the OASIS IPR Policy, the mode chosen when the Technical Committee was established. For information on whether any patents have been disclosed that may be essential to implementing this specification, and any offers of patent licensing terms, please refer to the Intellectual Property Rights section of the TC's web page (https://www.oasis-open.org/committees/odata/ipr.php).

+

Note that any machine-readable content (Computer Language Definitions) declared Normative for this Work Product is provided in separate plain text files. In the event of a discrepancy between any such plain text file and display content in the Work Product's prose narrative document(s), the content in the separate plain text file prevails.

+

Key words:

+

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] and [RFC8174] when, and only when, they appear in all capitals, as shown here.

+

Citation format:

+

When referencing this specification the following citation format should be used:

+

[OData-JSON-Format-v4.02]

+

OData JSON Format Version 4.02. Edited by Ralf Handl, Michael Pizzo, and Heiko Theißen. 14 July 2023. OASIS Committee Specification Draft 01. https://docs.oasis-open.org/odata/odata-json-format/v4.02/csd01/odata-json-format-v4.02-csd01.html. Latest stage: https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html.

+

Notices

+

Copyright © OASIS Open 2023. All Rights Reserved.

+

Distributed under the terms of the OASIS IPR Policy.

+

The name "OASIS" is a trademark of OASIS, the owner and developer of this specification, and should be used only to refer to the organization and its official outputs.

+

For complete copyright information please see the full Notices section in an Appendix below.

+
+

Table of Contents

+ +
+

1 Introduction

+ + +

The content in this section is non-normative, except where it is marked normative.

+

Here is a customized command line which will generate HTML from this markdown file (named odata-json-format-v4.02-csd01.md):

+

pandoc -f gfm -t html odata-json-format-v4.02-csd01.md -c styles/markdown-styles-v1.7.3b.css --toc --toc-depth=5 -s -o odata-json-format-v4.02-csd01.html --metadata title="OData JSON Format Version 4.02"

+

OASIS staff are currently using pandoc 3.0 from https://github.com/jgm/pandoc/releases/tag/3.0.

+

Generating HTML in OASIS style requires a reference to a .css file containing the HTML styles. The .css file may be either included with the markdown file (like styles/markdown-styles-v1.7.3b.css) or a reference to one of the online stylesheets:

+ +

Note this command generates a Table of Contents (TOC) in HTML which is located at the top of the HTML document, and which requires additional editing in order to be published in the expected OASIS style. This editing can be handled by OASIS staff during publication. A TC may use other ways to generate HTML from markdown, which may generate a TOC in a different way.

+

1.1 Changes from earlier Versions

+ + + + +

1.2 Glossary

+ + +

1.2.1 Definitions of terms

+

1.2.2 Acronyms and abbreviations

+

1.2.3 Document conventions

+
    +
  • Naming conventions
  • +
  • Font colors and styles
  • +
  • Typographic conventions
  • +
+
+

2 Section Heading

+

text.

+

2.1 Level 2 Heading

+

text.

+

2.1.1 Level 3 Heading

+

text.

+

2.1.1.1 Level 4 Heading

+

text.

+
2.1.1.1.1 Level 5 Heading
+

This is the deepest level, because six # gets transformed into a Reference tag.

+

2.2 Next Heading

+

text.

+
+

3 Conformance

+ + +

(Note: The [OASIS TC Process](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsConfClause) requires that a specification approved by the TC at the Committee Specification Public Review Draft, Committee Specification or OASIS Standard level must include a separate section, listing a set of numbered conformance clauses, to which any implementation of the specification must adhere in order to claim conformance to the specification (or any optional portion thereof). This is done by listing the conformance clauses here. For the definition of "conformance clause," see [OASIS Defined Terms](https://www.oasis-open.org/policies-guidelines/oasis-defined-terms-2018-05-22/#dConformanceClause).

+

See "Guidelines to Writing Conformance Clauses": https://docs.oasis-open.org/templates/TCHandbook/ConformanceGuidelines.html.

+

Remove this note before submitting for publication.)

+
+

Appendix A. References

+ + +

This appendix contains the normative and informative references that are used in this document.

+

While any hyperlinks included in this appendix were valid at the time of publication, OASIS cannot guarantee their long-term validity.

+

A.1 Normative References

+

The following documents are referenced in such a way that some or all of their content constitutes requirements of this document.

+
[OData-ABNF]
+

ABNF components: OData ABNF Construction Rules Version 4.01 and OData ABNF Test Cases.
+See link in "Related work" section on cover page.

+
[OData-CSDL]
+

OData Common Schema Definition Language (CSDL) JSON Representation Version 4.01.
+See link in "Related work" section on cover page.

+

OData Common Schema Definition Language (CSDL) XML Representation Version 4.01.
+See link in "Related work" section on cover page.

+
[OData-JSON]
+

OData JSON Format Version 4.01.
+See link in "Related work" section on cover page.

+
[OData-Protocol]
+

OData Version 4.01. Part 1: Protocol.
+See link in "Related work" section on cover page.

+
[OData-URL]
+

OData Version 4.01. Part 2: URL Conventions.
+See link in "Related work" section on cover page.

+
[OData-VocCore]
+

OData Core Vocabulary.
+See link in "Related work" section on cover page.

+
[RFC2119]
+

Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997
+https://www.rfc-editor.org/info/rfc2119.

+
[RFC8174]
+

Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017
+https://www.rfc-editor.org/info/rfc8174.

+

A.2 Informative References

+ + +
[RFC3552]
+

Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552.

+
+

Appendix B. Safety, Security and Privacy Considerations

+ + +

(Note: OASIS strongly recommends that Technical Committees consider issues that might affect safety, security, privacy, and/or data protection in implementations of their specification and document them for implementers and adopters. For some purposes, you may find it required, e.g. if you apply for IANA registration.

+

While it may not be immediately obvious how your specification might make systems vulnerable to attack, most specifications, because they involve communications between systems, message formats, or system settings, open potential channels for exploit. For example, IETF [[RFC3552](#rfc3552)] lists “eavesdropping, replay, message insertion, deletion, modification, and man-in-the-middle” as well as potential denial of service attacks as threats that must be considered and, if appropriate, addressed in IETF RFCs.

+

In addition to considering and describing foreseeable risks, this section should include guidance on how implementers and adopters can protect against these risks.

+

We encourage editors and TC members concerned with this subject to read _Guidelines for Writing RFC Text on Security Considerations_, IETF [[RFC3552](#rfc3552)], for more information.

+

Remove this note before submitting for publication.)

+
+

Appendix C. Acknowledgments

+ + +

Note: A Work Product approved by the TC must include a list of people who participated in the development of the Work Product. This is generally done by collecting the list of names in this appendix. This list shall be initially compiled by the Chair, and any Member of the TC may add or remove their names from the list by request. Remove this note before submitting for publication.

+

C.1 Special Thanks

+ + +

Substantial contributions to this document from the following individuals are gratefully acknowledged:

+

Participant Name, Affiliation or "Individual Member"

+

C.2 Participants

+ + +

The following individuals have participated in the creation of this specification and are gratefully acknowledged:

+

OpenC2 TC Members:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
First NameLast NameCompany
PhilippeAlmanSomething Networks
AlexAmirnovmanCompany B
KrisAndermanMini Micro
DarrenAnstmanBig Networks
+
+

Appendix D. Revision History

+ + + + + + + + + + + + + + + + + + + +
RevisionDateEditorChanges Made
specname-v1.0-wd01yyyy-mm-ddEditor NameInitial working draft
+
+

Appendix E. Example Appendix with subsections

+

E.1 Subsection title

+

E.1.1 Sub-subsection

+
+

Appendix F. Notices

+ + +

Copyright © OASIS Open 2023. All Rights Reserved.

+

All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full Policy may be found at the OASIS website.

+

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to OASIS, except as needed for the purpose of developing any document or deliverable produced by an OASIS Technical Committee (in which case the rules applicable to copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it into languages other than English.

+

The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns.

+

This document and the information contained herein is provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

+

As stated in the OASIS IPR Policy, the following three paragraphs in brackets apply to OASIS Standards Final Deliverable documents (Committee Specification, Candidate OASIS Standard, OASIS Standard, or Approved Errata).

+

[OASIS requests that any OASIS Party or any other party that believes it has patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable, to notify OASIS TC Administrator and provide an indication of its willingness to grant patent licenses to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this deliverable.]

+

[OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of any patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable by a patent holder that is not willing to provide a license to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this OASIS Standards Final Deliverable. OASIS may include such claims on its website, but disclaims any obligation to do so.]

+

[OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this OASIS Standards Final Deliverable or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to rights in any document or deliverable produced by an OASIS Technical Committee can be found on the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this OASIS Standards Final Deliverable, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any information or list of intellectual property rights will at any time be complete, or that any claims in such list are, in fact, Essential Claims.]

+

The name "OASIS" is a trademark of OASIS, the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and implementation and use of, specifications, while reserving the right to enforce its marks against misleading uses. Please see https://www.oasis-open.org/policies-guidelines/trademark/ for above guidance.

+ + diff --git a/docs/odata-json-format/odata-json-format.md b/docs/odata-json-format/odata-json-format.md index e3a2b3fe6..e4aa0b9bc 100644 --- a/docs/odata-json-format/odata-json-format.md +++ b/docs/odata-json-format/odata-json-format.md @@ -97,17 +97,6 @@ For complete copyright information please see the full Notices section in an App - [1.2.1 Definitions of terms](#Definitionsofterms) - [1.2.2 Acronyms and abbreviations](#Acronymsandabbreviations) - [1.2.3 Document conventions](#Documentconventions) - - [1.3 Some markdown usage examples](#Somemarkdownusageexamples) - - [1.3.1 Figures and Captions](#FiguresandCaptions) - - [1.3.2 Tables](#Tables) - - [1.3.2.1 Basic Table](#BasicTable) - - [1.3.2.2 Table with Three Columns and Some Bold Text](#TablewithThreeColumnsandSomeBoldText) - - [1.3.2.3 Table with a caption which can be referenced](#Tablewithacaptionwhichcanbereferenced) - - [1.3.3 Lists](#Lists) - - [1.3.4 Reference Label Construction](#ReferenceLabelConstruction) - - [1.3.5 Code Blocks](#CodeBlocks) - - [1.3.6 Blockquotes](#Blockquotes) - - [1.4 Page Breaks](#PageBreaks) - [2 Section Heading](#SectionHeading) - [2.1 Level 2 Heading](#LevelHeading) - [2.1.1 Level 3 Heading](#LevelHeading) @@ -117,7 +106,7 @@ For complete copyright information please see the full Notices section in an App - [3 Conformance](#Conformance) - [A References](#References) - [A.1 Normative References](#NormativeReferences) - - [A.2 Informative References](#InformativeReferences) + - [A.2 Informative References ](#InformativeReferences) - [B Safety, Security and Privacy Considerations](#SafetySecurityandPrivacyConsiderations) - [C Acknowledgments](#Acknowledgments) - [C.1 Special Thanks](#SpecialThanks) @@ -126,6 +115,7 @@ For complete copyright information please see the full Notices section in an App - [E Example Appendix with subsections](#ExampleAppendixwithsubsections) - [E.1 Subsection title](#Subsectiontitle) - [E.1.1 Sub-subsection](#Subsubsection) +- [F Notices](#Notices) ::: ------- @@ -153,6 +143,7 @@ A TC may use other ways to generate HTML from markdown, which may generate a TOC + ## 1.2 Glossary @@ -167,145 +158,6 @@ A TC may use other ways to generate HTML from markdown, which may generate a TOC - Font colors and styles - Typographic conventions -## 1.3 Some markdown usage examples - -**Text.** - -Note that text paragraphs in markdown should be separated by a blank line between them - - -Otherwise the separate paragraphs will be joined together when the HTML is generated. -Even if the text appears to be separate lines in the markdown source. - -To avoid having the usual vertical space between paragraphs, -append two or more space characters (or space-backslash) to the end of the lines -which will generate an HTML break tag instead of a new paragraph tag \ -(as demonstrated here). - -### 1.3.1 Figures and Captions - -FIGURE EXAMPLE: - - -###### Figure 1 -- Title of Figure -![image-label should be meaningful](images/image_0.png) (this image is missing) - -###### Figure 2 -- OpenC2 Message Exchange -![message exchange](images/image_1.png) - - -### 1.3.2 Tables - -#### 1.3.2.1 Basic Table -**Table 1-1. Table Label** - -| Item | Description | -| :--- | :--- | -| Item 1 | Something
(second line) | -| Item 2 | Something | -| Item 3 | Something
(second line) | -| Item 4 | text | - -#### 1.3.2.2 Table with Three Columns and Some Bold Text -text. - -| Title 1 | Title 2 | title 3 | -| :--- | :--- | :--- | -| something | something | something else that is a long string of text that **might** need to wrap around inside the table box and will just continue until the column divider is reached | -| something | something | something | - -#### 1.3.2.3 Table with a caption which can be referenced - -###### Table 1-5. See reference label construction - - -| Name | Description | -| :--- | :--- | -| **content** | Message body as specified by content_type and msg_type. | - -Here is a reference to the table caption: -Please see [Table 1-5 or other meaningful label](#table-1-5-see-reference-label-construction) - -### 1.3.3 Lists - -Bulleted list: -* bullet item 1. -* **Bold** bullet item 2. -* bullet item 3. -* bullet item 4. - -Indented or multi-level bullet list - add two spaces per level before bullet character (* or -): -* main bullet type - * Example second bullet - * See third level - * fourth level - -Numbered list: -1. item 1 -2. item 2 -3. item 3 - -Left-justified list without bullets or numbers: -To list multiple items without full paragraph breaks between items, add space-backslash after each item except the last. - -### 1.3.4 Reference Label Construction - -REFERENCES and ANCHORS -- in markdown source, format the Reference tags as level 6 headings like: `###### [RFC2119]` -###### [RFC2119] -Bradner, S., "Key words ..." - -- reference text has to be on a separate line below the tag - -- format cross-references (citations of the references) like: `see [[RFC2119](#rfc2119)]` -"see [[RFC2119](#rfc2119)]" -(note the outer square brackets in markdown will appear in the visible HTML text) - -- The text in the Reference tag (following ###### ) will become an HTML anchor using the following conversion rules: - - punctuation marks will be dropped (including "[" ) - - leading white spaces will be dropped - - upper case will be converted to lower - - spaces between letters will be converted to a single hyphen - -- The same HTML anchor construction rules apply to cross-references and to section headings. - - Thus, a section heading like "## 1.2 Glossary" - - becomes an anchor in HTML like `` - - referenced in the markdown like: see [Section 1.2](#12-glossary) - - in markdown: `"see [Section 1.2](#12-glossary)"` - - similar HTML anchors are also used in constructing the TOC - -### 1.3.5 Code Blocks - -Text to appear as an indented code block with grey background and monospace font - use three back-ticks before and after the code block. - -Note the actual backticks will not appear in the HTML format. If it's necessary to display visible backticks, place a back-slash before them like: \``` . - -``` -{ - "target": { - "x_kmip_2.0": { - {"kmip_type": "json"}, - {"operation": "RekeyKeyPair"}, - {"name": "publicWebKey11DEC2017"} - } - } -} -``` - -Text to be highlighted as code can also be surrounded by a single "backtick" character: `code text` - -### 1.3.6 Blockquotes - -To create a blockquote, start a line with greater than (>) followed by an optional space. - -Blockquotes can be nested, and can also contain other formatting. - -The stylesheet https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css results in an indented block with a left-side bar. - -## 1.4 Page Breaks -Add horizontal rule lines where page breaks are desired in the PDF - before each major section -- insert the line rules in markdown by inserting 3 or more hyphens on a line by themselves: --- -- place these before each main section in markdown (usually "#" - which generates the HTML `

` tag) - ------- # 2 Section Heading @@ -355,25 +207,45 @@ While any hyperlinks included in this appendix were valid at the time of publica The following documents are referenced in such a way that some or all of their content constitutes requirements of this document. -`(Reference sources: -For references to IETF RFCs, use the approved citation formats at: -https://docs.oasis-open.org/templates/ietf-rfc-list/ietf-rfc-list.html. -For references to W3C Recommendations, use the approved citation formats at: -https://docs.oasis-open.org/templates/w3c-recommendations-list/w3c-recommendations-list.html. -Remove this note before submitting for publication.)` - -###### [OpenC2-HTTPS-v1.0] -_Specification for Transfer of OpenC2 Messages via HTTPS Version 1.0_. Edited by David Lemire. Latest stage: https://docs.oasis-open.org/openc2/open-impl-https/v1.0/open-impl-https-v1.0.html -###### [OpenC2-SLPF-v1.0] -_Open Command and Control (OpenC2) Profile for Stateless Packet Filtering Version 1.0_. Edited by Joe Brule, Duncan Sparrell, and Alex Everett. Latest stage: https://docs.oasis-open.org/openc2/oc2slpf/v1.0/oc2slpf-v1.0.html -###### [RFC2119] -Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, http://www.rfc-editor.org/info/rfc2119. -###### [RFC8174] -Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, http://www.rfc-editor.org/info/rfc8174. - -## A.2 Informative References - -###### [RFC3552] +###### [OData-ABNF] +_ABNF components: OData ABNF Construction Rules Version 4.01 and OData ABNF Test Cases._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-CSDL] +_OData Common Schema Definition Language (CSDL) JSON Representation Version 4.01._ +See link in "[Related work](#RelatedWork)" section on cover page. + +_OData Common Schema Definition Language (CSDL) XML Representation Version 4.01._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-JSON] +_OData JSON Format Version 4.01._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-Protocol] +_OData Version 4.01. Part 1: Protocol._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-URL] +_OData Version 4.01. Part 2: URL Conventions._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-VocCore] +_OData Core Vocabulary._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [RFC2119] +_Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997_ +https://www.rfc-editor.org/info/rfc2119. + +###### [RFC8174] +_Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017_ +https://www.rfc-editor.org/info/rfc8174. + +## A.2 Informative References + + +###### [RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552. ------- @@ -443,7 +315,7 @@ Darren | Anstman | Big Networks ------- -# Appendix F. Notices +# Appendix F. Notices @@ -466,3 +338,4 @@ As stated in the OASIS IPR Policy, the following three paragraphs in brackets ap \[OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this OASIS Standards Final Deliverable or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to rights in any document or deliverable produced by an OASIS Technical Committee can be found on the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this OASIS Standards Final Deliverable, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any information or list of intellectual property rights will at any time be complete, or that any claims in such list are, in fact, Essential Claims.\] The name "OASIS" is a trademark of [OASIS](https://www.oasis-open.org/), the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and implementation and use of, specifications, while reserving the right to enforce its marks against misleading uses. Please see https://www.oasis-open.org/policies-guidelines/trademark/ for above guidance. + diff --git a/lib/build.js b/lib/build.js index 4c2f36ec0..74d6f799a 100644 --- a/lib/build.js +++ b/lib/build.js @@ -3,6 +3,8 @@ const pandoc = require("./pandoc"); const fs = require("fs"); const { PassThrough } = require("stream"); +let errors = false; + fs.readdirSync(__dirname + "/..", { withFileTypes: true }).forEach(function ( doc ) { @@ -19,7 +21,7 @@ fs.readdirSync(__dirname + "/..", { withFileTypes: true }).forEach(function ( __dirname + "/../docs/" + doc.name + "/" + doc.name + ".html" ) ); - md.write(Buffer.of(0xEF, 0xBB, 0xBF)); + md.write(Buffer.of(0xef, 0xbb, 0xbf)); new Number(doc.name) .build( new PassThrough() @@ -34,7 +36,11 @@ fs.readdirSync(__dirname + "/..", { withFileTypes: true }).forEach(function ( ) .catch(function (err) { console.error(err); - process.exit(1); + errors = true; }); } }); + +if (errors) { + process.exit(1); +} diff --git a/odata-json-format/1 Introduction.md b/odata-json-format/1 Introduction.md index 28a5a524a..ebc1de8b1 100644 --- a/odata-json-format/1 Introduction.md +++ b/odata-json-format/1 Introduction.md @@ -23,6 +23,7 @@ A TC may use other ways to generate HTML from markdown, which may generate a TOC + ## ##subsec Glossary @@ -37,148 +38,6 @@ A TC may use other ways to generate HTML from markdown, which may generate a TOC - Font colors and styles - Typographic conventions -## ##subsec Some markdown usage examples - -**Text.** - -Note that text paragraphs in markdown should be separated by a blank line between them - - -Otherwise the separate paragraphs will be joined together when the HTML is generated. -Even if the text appears to be separate lines in the markdown source. - -To avoid having the usual vertical space between paragraphs, -append two or more space characters (or space-backslash) to the end of the lines -which will generate an HTML break tag instead of a new paragraph tag \ -(as demonstrated here). - -### ##subsubsec Figures and Captions - -FIGURE EXAMPLE: - - -###### Figure 1 -- Title of Figure -![image-label should be meaningful](images/image_0.png) (this image is missing) - -###### Figure 2 -- OpenC2 Message Exchange -![message exchange](images/image_1.png) - - -### ##subsubsec Tables - -#### ##subsubsubsec Basic Table -**Table 1-1. Table Label** - -| Item | Description | -| :--- | :--- | -| Item 1 | Something
(second line) | -| Item 2 | Something | -| Item 3 | Something
(second line) | -| Item 4 | text | - -#### ##subsubsubsec Table with Three Columns and Some Bold Text -text. - -| Title 1 | Title 2 | title 3 | -| :--- | :--- | :--- | -| something | something | something else that is a long string of text that **might** need to wrap around inside the table box and will just continue until the column divider is reached | -| something | something | something | - -#### ##subsubsubsec Table with a caption which can be referenced - -###### Table 1-5. See reference label construction - -

- -| Name | Description | -| :--- | :--- | -| **content** | Message body as specified by content_type and msg_type. | - -Here is a reference to the table caption: -Please see [Table 1-5 or other meaningful label](#table-1-5-see-reference-label-construction) - - -### ##subsubsec Lists - -Bulleted list: -* bullet item 1. -* **Bold** bullet item 2. -* bullet item 3. -* bullet item 4. - -Indented or multi-level bullet list - add two spaces per level before bullet character (* or -): -* main bullet type - * Example second bullet - * See third level - * fourth level - -Numbered list: -1. item 1 -2. item 2 -3. item 3 - -Left-justified list without bullets or numbers: -To list multiple items without full paragraph breaks between items, add space-backslash after each item except the last. - -### ##subsubsec Reference Label Construction - -REFERENCES and ANCHORS -- in markdown source, format the Reference tags as level 6 headings like: `###### [RFC2119]` -###### [RFC2119] -Bradner, S., "Key words ..." - -- reference text has to be on a separate line below the tag - -- format cross-references (citations of the references) like: `see [[RFC2119](#rfc2119)]` -"see [[RFC2119](#rfc2119)]" -(note the outer square brackets in markdown will appear in the visible HTML text) - -- The text in the Reference tag (following ###### ) will become an HTML anchor using the following conversion rules: - - punctuation marks will be dropped (including "[" ) - - leading white spaces will be dropped - - upper case will be converted to lower - - spaces between letters will be converted to a single hyphen - -- The same HTML anchor construction rules apply to cross-references and to section headings. - - Thus, a section heading like "## 1.2 Glossary" - - becomes an anchor in HTML like `` - - referenced in the markdown like: see [Section 1.2](#12-glossary) - - in markdown: `"see [Section 1.2](#12-glossary)"` - - similar HTML anchors are also used in constructing the TOC - -### ##subsubsec Code Blocks - -Text to appear as an indented code block with grey background and monospace font - use three back-ticks before and after the code block. - -Note the actual backticks will not appear in the HTML format. If it's necessary to display visible backticks, place a back-slash before them like: \``` . - -``` -{ - "target": { - "x_kmip_2.0": { - {"kmip_type": "json"}, - {"operation": "RekeyKeyPair"}, - {"name": "publicWebKey11DEC2017"} - } - } -} -``` - -Text to be highlighted as code can also be surrounded by a single "backtick" character: -`code text` - -### ##subsubsec Blockquotes - -To create a blockquote, start a line with greater than (>) followed by an optional space. - -Blockquotes can be nested, and can also contain other formatting. - -The stylesheet https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css results in an indented block with a left-side bar. - -## ##subsec Page Breaks -Add horizontal rule lines where page breaks are desired in the PDF - before each major section -- insert the line rules in markdown by inserting 3 or more hyphens on a line by themselves: --- -- place these before each main section in markdown (usually "#" - which generates the HTML `

` tag) - ------- # ##sec Section Heading diff --git a/odata-json-format/Appendix.md b/odata-json-format/Appendix.md index 0db187892..edddb1bde 100644 --- a/odata-json-format/Appendix.md +++ b/odata-json-format/Appendix.md @@ -13,25 +13,45 @@ While any hyperlinks included in this appendix were valid at the time of publica The following documents are referenced in such a way that some or all of their content constitutes requirements of this document. -`(Reference sources: -For references to IETF RFCs, use the approved citation formats at: -https://docs.oasis-open.org/templates/ietf-rfc-list/ietf-rfc-list.html. -For references to W3C Recommendations, use the approved citation formats at: -https://docs.oasis-open.org/templates/w3c-recommendations-list/w3c-recommendations-list.html. -Remove this note before submitting for publication.)` - -###### [OpenC2-HTTPS-v1.0] -_Specification for Transfer of OpenC2 Messages via HTTPS Version 1.0_. Edited by David Lemire. Latest stage: https://docs.oasis-open.org/openc2/open-impl-https/v1.0/open-impl-https-v1.0.html -###### [OpenC2-SLPF-v1.0] -_Open Command and Control (OpenC2) Profile for Stateless Packet Filtering Version 1.0_. Edited by Joe Brule, Duncan Sparrell, and Alex Everett. Latest stage: https://docs.oasis-open.org/openc2/oc2slpf/v1.0/oc2slpf-v1.0.html -###### [RFC2119] -Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, http://www.rfc-editor.org/info/rfc2119. -###### [RFC8174] -Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, http://www.rfc-editor.org/info/rfc8174. - -## ##subasec Informative References - -###### [RFC3552] +###### [OData-ABNF] +_ABNF components: OData ABNF Construction Rules Version 4.01 and OData ABNF Test Cases._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-CSDL] +_OData Common Schema Definition Language (CSDL) JSON Representation Version 4.01._ +See link in "[Related work](#RelatedWork)" section on cover page. + +_OData Common Schema Definition Language (CSDL) XML Representation Version 4.01._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-JSON] +_OData JSON Format Version 4.01._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-Protocol] +_OData Version 4.01. Part 1: Protocol._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-URL] +_OData Version 4.01. Part 2: URL Conventions._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-VocCore] +_OData Core Vocabulary._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [RFC2119] +_Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997_ +https://www.rfc-editor.org/info/rfc2119. + +###### [RFC8174] +_Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017_ +https://www.rfc-editor.org/info/rfc8174. + +## ##subasec Informative References + + +###### [RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552. ------- @@ -101,7 +121,7 @@ Darren | Anstman | Big Networks ------- -# Appendix F. Notices +# Appendix ##asec Notices From fb1448b9aa8907e70df8f4caab3a1b0cd5e25bb2 Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Thu, 20 Jul 2023 15:36:23 +0200 Subject: [PATCH 04/33] Build PDF --- docs/odata-json-format/odata-json-format.pdf | Bin 0 -> 183473 bytes lib/build-pdf.js | 46 +++++++++++++++---- 2 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 docs/odata-json-format/odata-json-format.pdf diff --git a/docs/odata-json-format/odata-json-format.pdf b/docs/odata-json-format/odata-json-format.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1a8efa109c9bbcd0ef5a9df66690dd9aa3366f67 GIT binary patch literal 183473 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
&As+h7>H!n_ zlnEC8iP6O9Kb3s?}ov2F(B>IeT|k5>%% zEu;9s=@)+JK{6f6!iyCjl!yw(O(9W$4jdc(rLq!5^lgpp&|O??!C~QK_=JW)ms^~_ zyy{seILrsE=5-CE`j_q;OPBTn&RN$$e7;k8tE%q=;H^39&80jxxg_!HqkwM#@_~+- z0ku$vK>K#rr#Wrou42>!MP?s;rLsOy1GfTl+Ykst%`-!{?H#^5`Kr-;oz1|Jk7ejP ztF>vXD)I8TP@Mb((R7=~;_)cbN3yv+6F)HwsylRaj9HEV2QIADV|E3=GllG%etp_;i86vmE~rUS&j8S*}*d?Xw#J- zA1gfynk1Gh+%{KSZxNWYAhzEntj}KSjCY?(ftj^9N}!drpr@G6IKff0^co(Cdoezq z608ZOE8=3E^VAw6y!PXmhS`Dx9hB~NwRkpeFhIlk z7LOy|@I!q3jLruv20nnJJz*FYqm&AigLNL)0e6fapb_}q42%uM1@0%l?@=5dxbY7k z-^LjjvTJ+}D@H`m(`TEHgF2H!nskO9sL97vDaT0T<$lJ**T=EEP|rn2zG>1h#aXg5 z*Z~`_i9ZSq**xhTFP(&$#=5xMAj4Hz9LR;C!)Lgt#RRsz;eU_vXB)@mXYVXd#mGps zR}kQ;I@HK&YPi0~MLfcHfz-YecGNOI2)%2{>JL8{}7ut&%>*JD z3SrT+ZbY%1iBI8*O+t<`5?0{NbIcRAoJxEmHQYNt7G4ta=BA5UD-jIK{S{SSC;$PZ)23>~V@^qSVl0OSj;Wd}N9rYax$lZV4bbXnh|Jv7n zrB3F2a$9|5YB{wSjb*G|_SUM0Z|H@U;uJ-{Z>cpb(kch^Cu?DAp=jYxTT5)GNn^GY zPmte99(P6ROkMJr?4QHWS8QM99ZF&fwF@$3X0)4s&U(7JxpFt|f(WATvEIA_7~Wn< zYTYah_P-%6+zO91)Z>Gs@>&aZ)kt#EXCgzG@iD2bf) zOE>=zibg?yy}^KF?BMCs3*5%^Z0OF!LoUwaH$NQm$TP#C96u!fo*mcam_z)%v_J#L zxCy3_o~nbhgFg$q72LbON0YeUfRJ*;pu0+YgUigR)d)&GYaUl7@QBy)EBbhSb~jMR zS*}FxI1}eJaZygkeVVKBFb-#-tWn`)HRo?)TF!)>Dg{1f5$%}>Y~#2>4fV6rJS z3q7Kx2U6J~q5C(ba##6i{gDUZt_) zI*X~#xz%Jz`0xtFg?q#6&;fR!EzJ%Wa4_2jMI+{q;%{P2)n2;*snhGYjl{b{vfOS_ z?%4B(U%)2^CWC=q#slOx!Vtz>3q#bL`k84&O-=knKcF&_h{S6nJtc*0Qs4j$Vhgrc zKH%Hh?;0jZ)t-axa6$~o0B%T(-wu3`@+9CJIDsua_dVx=RY4#ipc(;J5mNyUKOwyX z7)W57SRf}Lg{?JnunVqt7$Epf`Vhd6lL;#zg#rZyOZoiiAafu@556E)dvmxHZi%e+a9VTzVWF0W~iJF0xV4}B-oq?l!36!{+jU%*x zm}D+&g`E{jd}PDI5hBwNltGdqh~6BRc`f9 z=U-gB?@BlL8Q&eE$4-l|GjiD_rob7%sdl$80#^;B9gJg11npz7J4(}T+cgI?S;u12 zQ_?vm`%G6{I_A(A5JSs#9RS43;W{{Bx?IUV)|pKw8Ma%I2M79VAuNADAbulT`BGMG z^NCw}ih2h14Ck@&hZt&S6BnELM^Kqaq2t3SjnR-hp;7ULY#&gH>r#=A7;^LjP*|36 zgSvDlIwV3uk z?Vct{%R^-_yid%jYAC5`ondRIngeGUUPU(;iemwE5K-$hBDB$-6lAeF>0i%Qz}*+! z44wH?YPWM|JojrebO{Y4SXuAvB^8@Iau^m=3KrODIEd*6Zjnisl_M|^SS*)=^89G- zlDyO4G3gKBeo>|W+fbhl_V6Wq703n9ZZfR!* zAaU4d%O!Cy>W#V9FWd07lw)W3>Vw;snBAnNB4Hem=^PW65c=m&vjEKz)e*z8N=92fLNO;^<%djVkJGR@^bRu8ww%ULpwkKL9=}Nm(u< zG_`&gm)?fTK#Ra7pTixINb@CU%VU!l#rVWf3>(Zbv^MYc_X}COP2i8>S{iynVbX2z zVzYZTuB<^+o_3rr{GJNzs0%Tm6E8CcG80!-x1RIb)J3E(f;{?ZW2d9H?b&bci_omV z(N+mt^vBy4{#IWtSg7=Rx6i*g>I2k&DJJCQIZQPXlV$lF2ZPHS0@Al~AhOdo#lL0z2RpprX?r2w@0`tU>Tjd>;f^Fx`1%){cpCQcgg6Z;#y3-nQqKH|P(`57SMBLXNHxzhM}=z|vXoMdK~=H&MO4+*8>X zqW4Ir5K0XTmMrN<1pv2iT4xwQk%rcGw=_WsW+Uj@pOexKspWl_=-N3B<(_AP;Iqv# zs9CQ7k648%6gRHZRWR_ezmC{fGmvf1qnTTGf;#G7f zFPqIQ8#hJZ{=6hY^_`VhcFW}O9?KEvtd!~<# z$kpxU9mCdbU7hpcA&agP#RzS7nhDXycnxtzetX$LC!hoQP69FZTPUSc#s+?k_*wl{ z=M;WJPVKFmcWuWI02c<=6w|k%KE|%V`xwM4GP{^$-XtHt!bt_SM+^vREdO^I$%N;Y zynHC+uH-ipKfY&)7053HF=5z}Zv^TX-hNLx3eYQyOv$8Q5sPlxE5@dwIA)mP|D$g0vD%Tx-~I#>NM0*P1p+m6RDyZ9SqE5^ka9#v}m9thJF z%Uj)88MZpNC+bDUp$vG}sz*=I^{kuupKGx&dRj7UI;fvP0^8IshXIZ@rmg9mvx3p@ zXiSrQ-zC_EZk&p>-^qdsO7n>rK296qx#KCQI&zK|J%@l@Cl;W|9rnt+WF` zi0gjc=v<8&t3Ifp$urZ^d%!?77~7y6HphDSD8iVAd2D~Bjx-;rHZM!^$X{y{eFqat zQC@67YLwOIx7K;z&d>65+*jX!rn#95S`Lw1EhD(21NiKN8;A4vWh78NgMCY-CR*{5wfi)+(gp{dddrYz{Inq;+`sS!3isFOCbSGRVXdMq2T zUyY$NToe}ezz7WwRSpkjQ6}Lkg%`V+U+g99v9hN;ru?>{htBCG4CrXh zNZ9JXNDmC*HwQ=uFI^DBtJe(B5;_YVS}9^+sjHx0Rbu<@5Z3xVuh^Yslni;v{hl#^ z9Ux%;s{nNBSDCz|)x22_-_6#PHKrVbVRg$!A;i1t3(3~6vvI#{UJl`?P~twhxov=V z9U#1~*w#Lc=E>o8K8#x0nv3&|?TGO| ztq}0Nj)$fj!*5(!-${lY9!{o!p`tTu+pt+$-*zi*V6Qe8Ux>hU*WLvdaI(m(a<4L){57bvHT zUGD}VJXKUCY61JlHSc*%roQa=)yp#%G-s{mhBoSx72cX|@s6F4Tsc8V-ec0oJ50t- zeQvzf6(zC{0Rn>3f(3u74eb46fvL2dW_x?X*;r<6>tbievDsDH1a-BmB6$(}n;#_r zW%9J`2y0{%$RU|24)`NiYrRcmyDdkPks=I;v5;zMnjBT<4Ihfo*#evoV*%T$;i8(Y z`q`Cc;Cq($W}9(urf+dm`qwL0+R{pCye1nrGIz#0H^rxDZiU}(&8de9Qg+O*luW>D ziUh8AAg7ALow;UZ#wci+iyYYC8bX;&A0D8} z4>~a#%6iqty{EGTEhQygBOGbT78I(|@_8E6W~sjIvY|%P1qDSwW#>qV9g1bpRJb^A z{Ra&~r>na-x0;XNuMR^4?PYA6>Kl;h_}@*mz7B$f&3Cmpb{?%72Jqj;6YZOU%Vj>5 z9X0K~LTY~chTggWo7SJUK?fNwx?=C6jge56SjNdy_HB>qr*^)#oynfkx@fsR#*^oG zDIebF{yk9Z1S#vhByBaf7tavcj|~X9uPCaQc{zq&gORMVvBO&aScRA5ttA`^%c{ zF3(<05uU=!`p@ICFpZPr5${;M8k!{?s~E4SvyLR-c0Iv>%Fmt29V{2X`OQIZ-h=<( zP7b8~fSLz|YP7W3?0{-_LNoNkrgnrHyih7Wi$E8M98Ndki6f==FBy*TX_5f(z*}OQ z*&NCoWY3<#HVJOK&gQvAA!3jK)@m&@lNQwnH|)8-tg~b4g4;d{dA+?SD2y!$2Ya|l zYoe_gCuYboe^6>7b*w1x% zppo`A(v!9Lnb%IG^i*iz+E`(>Y_Ip(-qb;e>9mo0(sT)%7T^B(=bfDpLe41ByEwhY- zlj76a^3>35tty_XcG+h6PwfG9)t>CKlybg`-JfOOX#A=FWK;71gz8UJ7SgEg?9uL2 zY|HYN3vhggz=;F>A|q@bmE0e>6H3%VNF=YsYr9@fKRi$95x;nkwkT! zbj*Os7t4=jeM}8QW6G~QFH>DWkoAqex_)w|N|EJF@P{kdy)K$%>tNGB?tF66eILYb z<{kzS#rwDxFO)Ue4$B7&;ACnesf{7!;k3!(B1mV)haNaqY9b+Lp>b2vKwgZag{2;k z^3#?6PS*N;iPpgSut?9eNF6<*om#WotQn|wO_D#W z94peq*#y-14uVnG>$)4cix2&#uzNmso-yutbSbr3;*HF%tX+AN>x46ocAE7~G$CbF#gL*=b;%TqJ-XY%SyJ~1d$O`(MrV-{WZw$=9JEI#oM2>CjoBy~hcNp^~i zRQUGspk-q)7YPLkW+39XRSU4j9$~CM>%1{q=suZBw$sfKX_)kVFss4cX)6a z+qfw_mS*pUTO(6B+MM^-JI=-GgM#^8f7rkjFMtJf(CFnJ)^2A7-Uu>)@2ohtHcd!|YTJ{+=m=i)-arinx(Ru8KSR zn_)N>0%NtD-yc*)A$Wn!{pAS|1nwc(nRnca99)RnDZxJ;7X+VYvK{VI<3I}7&!Lj? ze7KZo6OPlW$#T#A`**FazO1`%Gx}BJZ}-jE+`5HiAl@O3p8i7ESvgMqz!31iF}EnR*l7mj0R|dlCuQlIZS!lnxbrknU@FccG9h4&DzCvUx(IBNhMiG)% ziC;TpQ=e9`SS|}5HR;#H^{;yUT{bAE0;MqGYqWa()xZi)dfnK-P;imI(&_!VYy90c zLOI}-w63Z&Gf}g0$EhxQ*m2-Ce^qeT0b|aA-K8Aq?qK|$v^a6&`Fuu^M)qP8 zW-d+JQtTR9kyQ9X$lYfvA?22WyTbh#=#wD`ElqRFuSxn}2+-Rj zpv$`7v|;`zLuhC@G;d>k*TL1Itsaw>x=&f$((I}aw_KhM zla<$s(fG7sORtb!er0@kU$H{0>{8!ZqQ+I-kwj}OjVZZ9M^h_t$XYF&rAC8Rl~C`g z=runPO(MRESitGhGG7@`(#!B!1}L0Gz*^KVy`w^FEcaGvl?$T3 z_ex?fXB0D?&J+#$RNbkjCOp!nZm;NNq4r7f?+XUsEv4=ct0}Qd(lavY_B%!;VKv(9 z6S!17hE~N9yn|e?n60I5c1;>!}~x&3s%vn?&Z1vk#zT__T$n@4th;mA2eqV0 zRYU0Cl}eUH&<4hPfD&6(e&rT0n}>61TSXFTI@v2*o>@<=!(O5+Q=Ek?YTW{5jq>Ur z=G^6v1j;)gu3b`bWqj;lPAIRF&vdwgKVoi7yw|_B$N0Dh$qnZ38e6`3>-GFXRT2@vHaK@z7 z&|@sMb^I(d^K878$wheg7&P01d>iU@h#~E+$sSf58Hw6-3Ry^9Z;Z)_yl%jt2QU8c z>WWTjCiMH{a0b^m7<1$>i`vVt;55jlKbhBvc8K6*{MExYI}c8YZLzTC@wsH4_RQb& z(}11{2Eg5r0tHhqLbiUnR?9Oi>rlL2rtHv^0x5B;;m-RfM>oYeM--aWXkf0W-%d~O zX8%Nwx@8I+{BqTt}{IBQ+!4Tlr#9XEQ#d{7vmyB$t7@n#QH+CQ#^7#USjj zT5cVhg$kiOm3qmaX4Dsi?|ce;sz=h$JSA@exz$=DmR-Q4>(!L9r7Y z4V%$OqiIzMl;zb>?GUkJ83hnfhoE_-fO1eVN`r{{1%%Cj$G_ErzQ{m@Zb0jnz*2gI zst}gUQ_Yv|9hH1kbyMv}3i%av1NIS(zpqzy{{iKNo~L3#)f)8xi3e>D$PEPTQv4{G z79O>Re$NKgPJ}=$bFLITRy`6wCOo9%li$V2-LOHePp zX%2ia%jt5vRIQNbK-gK2=ava7EOFSn=Du?fUuAnmd#S_k$Y0doolps(r&&h7)5+!z zX-q`-X(s_p6O0&tGD*oBYFTe(I1vUFnIKY83?$D}HvgKGa1+5V>^7Wz*|EMsY8>SX9* zX>X@&Xy;5PWN%~gb=3a{Q_S(DTRE6GIoST)6ti=3&~tHeGJiqi|Gg<@;$)>~VFMkXeXFG9@tMM}S_nOOd-EN1%;R z|9R8@48oTd{EuP!FS7XmG#LL9jQ{^AV_ia)uPgqC6aU{cW9Bb9`!A3D)eSr07pDD} zH6~>Ja>f5>;(y%mKi2r4WB)r8{7>yaZU2RT|Lr{g^!Lx%82_#QpVEK&`M19Rr+5Am z%*=%BUwHa|`r`kWX#S`1Ka}{tEBm+h|Dw|W9QV(S{=1I;r<9YE>x*hLGJS#S|J2R@ zH2ojC`F~dbn|l85PWaCy{xdrNl>O`1f9IXq|C!_eC&|jf^o7;`%{wcN+5KijY=5Qk zkwHL86_1yKq#}#z&qYXj0PEIMk{-|)&3t9Y28JgjF!#H0=psDD9?;Cirw=vEk&gOR2oySq! zZRxy|QC$Yr+@kdg28KChtd^`JNRX+g^|}h*O_FG9jrOuSwf3ilh0h#@N062>3KvbL zF=<=N8APq$FsYq0M3tHGM4z8bb!qH!k%$}aj8kscN${8@?+r>39pz{4Tp8CJ*E+w4 zSUTdKO0HULHRpD6{8#Aowa5T3dO{>36tke96E&YwK;R7`OS!`u5{ouTf{*x!bNpfd zI>jl1!roU-`tgPsef4CJB@hXingU`C)}(D9-d2))h~cr4{rtZ!u>YI&;Xm!*&6pK0+g@65%{^cDH=f0`xCjBG6b#l?@e`}(L1 zEO7FfA8h(gm|b3&CD?4brA)lWZ%8Kxw%3e&k2f_22PKUK7wWZ!Bm_rR5Fn!@1ZSO5 zLd^}hFWki`&oindv-Pc4E3IF}Ah6A?d?;0gKF8)aSL`wq`f+APLDZ6KT~tJIZrNl6eKbW6GC0PaL3K1{1g<#;b@)ycQ*m zVKBUU2S1?oFZu5m(lC+K>fL_hlOH@hOIo_$tT~#i0EV76g?8Cbv=&D6wRT@Jz7zJ! zbl6?PZRC~k{;o;6a;eny*|=FRI1z_5^y|6Va<4u;j=G?LV9e?nYvZ83+`O3+%|SA< z5X0^2lUM27K?Lz205=ZAKdAXyO?8BYn#sVAQH-Hp{64fPVa+~e%p>3&%)JCb3R z~KoFh%o5mvO~ji6sFsXjUf@_{rq5w5|w#cXc@5;h$rEBv&cp42o~IE%yW- z8X$TXqFkbZg%b0+nRgM=l&DfD<%|7!LqvR7td*5ZWp>9_42{^J?L^Ch1F=QpiQ40H zdf*6zMB8d82k>^iA=$g`b(*t!iL`P$7gbPGHa<%(sYIaIRKzF@eigGReN6&>^4)BoUm{X9AJ zQ!LCyH^t$iySnydvDmfzQpgO~tfI14IoGTtG!phabO!Fi*Yy&!v0JtEKa>M?q+5rP z|7O|I# zU|K*L;)0q}M)aZ*su;N0w>q7hZ#q(|R(E(+S!R23Hsl-XL>}{+FW&b!bmb_edsZOn zBI*>h>z%Qs$XGa44N>sVfAta)Yu3Yej+*?`kLvuqN1C(U1NRKW6{ll-SeCULJO!%n zXA$!g#gvu`?>+eae)xW4!PAg~OWO1<-K<&yWlw=%^r{{WKfV#^b?)dC?}KoE#0hCo zUJfk0j9==+LVE+zBXN%tN4%lG;n73L?Om7p6uiiD9@cunY0O#|df4X1_orw6Giia) z3;Gw**?5R}Z@jgd@SNiJ9#LX+CynOrL)<5Mk@Qwy_N5>XMC{b*(7XpY-yz3Ae<#0W zw(4zT47ydH4VrKC?2i3TUlt{Sd;Gw!I+l(s*%?G9FVyJdq026!+aP>bK<7<%Q(V%W z;$OI_K&C5-Yfq3({XN%OIk4=I>$84m@@&A@8#0Y{_nnmhb8*~{g0ConQPYZc#Y57^ zh}+O#ha|h@CS=($SM^sEH=#wDE;r^CkH~VS^lV)aw*;z&p3g?v#hb?Wt2NmObB~5v z)g4(!*B5Niv%9ZC3XQIQ5!^!M6hiIxp(865jT$RJi0P_q0fr+fS zKU>F;SmuE~m!IfD#MeL2chedC!70Jy+o%$?!5Nl|4#Cn=2PrMao&c~3i0yeX!{#1Tqf3^x`&2K?WUM>=qS#Z zvp~EiIfsV_6>jeGaVdi$09+i1d`a*0=OD-xK3w?R_X#X@-7B9nxVVkmXdMX&II_Dc&yzEJ0%*+aq(>@GwiuR^gp zHuisiwMbI4b0`wZ3UnW{s%NZCtc?e(oN-JsSF<3bPNj>FuUd__8JL|y-jV%=q%gcH z9cIRi zei>$#q2!qffug!CHDPWjY$|roPa!~*j@7GfDh?_B#qVisY6acSs}X6y+rj%Z-4=J} z;q8@M3{gC(H-70antE}(v%>p}?dt4$aGK4 zX+WJY3A4Zn3z>Augt^6{y?hZEo>_I>EGKk&W+tC6IaAb~A=k zw>=rfRtNv7(-1dZl=R+!#};}?m2a4CzUm}A<8hPN6DmnkMEsn6QB2qcJr6!nUFi{y zoE64_W60GIks^w1#<8?m(6&J*3Opqa%f@a9l~Gm{W1S<`LMtqfaL+n(us)85i*x7Tp>q8o1j)Yi8AwEK6XP(7@OziV&G4{+$?V_lY(MtN{8zHp_im3GaN ziuB`-08c&>w@*DL{d`;}cRixX#a|MyOdv^^qA<*7}e_(WdJIEJ!yO(b9DM6SKHiR*u-z(yr6XLv|%S&ZzT;NkC? zy{{j9gvKg2jVnj6ZnkmGHi7S3qL~MYhm!)5FCOl+>8hOkBA`!u^%m$(okaU}NMRPS zwL!>&)Q?lTjql*`n*N{Hf>Y34yn!^Xhdp9vpaU6%241_ds z4;9aq{}Nc!UI?JOE|i=_Jn?SCkxtEzz3pw3ou{u=sD-IVkjh5HMi*XdA^F+D*{`Us zef`UJ3Ocl(w($lE6`AR6l}GcQ_AO09%Zk(ChBdK#ef8tOl!kaR`p%SdR;@XGZUd?C zJJ$NHrQT-mcQ`5)2lx!SoatvD2U19B)cgqEUnkJu}s#)On+b(Bs3JYd!A#QCN^~iekv@Oj=)jo|)c~c3WqR z)Vn5?`I~Y`9{Z7y&pdSl9gx&UX^&5i4uLBuT9Lmo#p{1&zvd{R@+GU^7_MEGYA;@< zt?_6EiNQH3zo2g>C(R4{0_XFtOU8@%_Wd{Na+C}n*B1{krYBv_?Q8()pjnGd4f~}w zwAO&0Am^ZTX;1p8Jp}rXZl;MIh%D%wj{qTw94+b+tdrZ>1c7;;4Ga9(LJCV-dF+Y& zREqu^RJIs`;llYO3FG;#hAPucevZb9vrCH|X1Vw{;wK2CD-|MF9#wge1yT{%?0sbt zu_={o{fXOh<7e#bYSEEjCY0D+h5BXpKIzyj^(}rx==s$np~-txREZX(QPO>^#D>Vu zOoJli28Q>RpO#lmS%Y0re3&laX&{96fU-bBz&%@Vy*(tka17Il<#+SF`0;Z9O=P^50b zY2aiGUFHZ?I;tXxg{v4*4|rIbWyEfGBeh7RvZv zSdC~6jRw=?pmbXDh}6XRQ5%_j4#v1AWzYpG5Nj^0#m0NvQ#vY;V;3pMw;vw@+l@p# z-*Swh0%OQ_v7TmaQxFX7+A=(C-tH2?uUytZBXdB;-Pbg>WDxTRSgW%z-raz!gG(Qb zx5ygWi|l)y6a25I}(xU2BVes8v1)ov{rPBKq+O<(T zG=-VmnOwzd&9ORWp+u7qv>WKQMUP?jh^*jAd22Eb8Tjc5f6@ZT*k+K?pG9XS;)@W{ zY~LURyQYH9C60-S78XM9-f(P92T)A*IPn|9R9%z^<5m*>T7(Y`Nj0K1UTDAVS;1A`KElQ}Iuyu9iOpl!zC+$}~nq2qs`mn7Ho& z!XX8|eeJ@RzT@0?GnXDA{|^90K)Ju7dwKl%Wb_NzPTob|edY^97&-U6(GoV?O%7=J zkVw{B!rH!s!33%#G$ce4*kHoZ1e(B$5_1c}35rPyCukobhm6EO{66^AF%j?%pU2MS z*kc`o5>E+i*C%BrZ7rJ6{O%(q^XsR&rtFyVE^mDSoT0O5x60Kdf-0z+GD^scN8nAM zegGgSpXULk6i0rE+r9ukfip*W%=bmCelzx)5uf5>2M8I&>ZE~0$T@P6h=b%P4nE#L z0*46kBM#m->{y^AV1Mx^@4n09#v>ooa^wah0VQoS*+VF#nk?Z0)WZ^?T)O&DM-b%1 z2@Y*jsb6-wt!#qa=54b>0N~Jl(XJ%%+!rpceHunS7Chns1k5AdN<&LdR}Kxi=ebw7 z*}U`>>9i%KD}@SH*ksvdp_@&6Ow^bFMjdR{?$OdsY!}1U(Aiz93?>~-qDcjPS!=5e zU~u%9wVoc)L8{MJpXcJ3CcW2|hOe@yZOj2lG!Z=Gd_YSkTB{&XoCQ`b%7kZJBIU9g zD6XP{XU5JGD>|RPwZ4AGiB-#=+Hvjk`7_stukD?cUodM!-SiE!y!1z}M?ZS(nrj{f z`y0Q4l!vEHdpP>xuO2zOb5hyPv)}vf?{BNDyzTc$jl-zd%s3tmWRc=>>HG9luh*@m zg8~SC7yt?&Xc#9V)l!kma+;JJt`Qr>Wg53KHbaQ);!Q}>n|ubY=j&u-iJ%$+yhxO?8@1y#arbYsQN3c4|{Ge9@`clzl@(@qoJ zlGC3<7g$zXXj%c-b+E~|%SW|7sLO-gwWW>;?T&R0n&-%K7;LV!6DFW+I&FU25gQw{ zfi2i)TzkO)Tt-VBy=iIE?YXcpcTMh%xy+E8mP>OzJ>#`f&vqlsH7+&w7+I1LMAT$l zlsU!P&W}>ge;$d4BV8pN(#?O~5}Taxb{;i)oQ6atBqt@;dMNBPZ&DT#v6R!)3ng5} zOD5)e#%ab7mul@92-`9DsS#!b#j0>-u*>v-q0@%6uo~}t#R`02^lr5Z^y=%wJ_7dx1`=mv6>u=q%F0rkD zK~d%M-7~7z%&U?FePweu*8zT%#!2e9NFf`QhI`F$Py@R)uv7ZBL^ny0nhcwgcO@T4 zX33(GU=NE6466-W4a}f}btxJrg>HI|Qa*5Gv{TMeQAdf;qf1T(qecTLZq+z#`vd2T z`9MKsi>cx^zc;|=y*Ozs9*esK0+xUs5}B5tZnpl>;gxjfORq!+sgz{bMei1ENl6;` z2UJIY1l9Z4bC<5YgIzCXX6Gaff2>POPvbGSIVeY&_%7qgvr5K1(+blr6KkT&DQ#t| z7;W+{_tK`q<%Kl&&*^qYL zQtq7~x36zszkzTW@v4FXUlS588u5{bwhCG%s*7mRVD-n>Aj_$VsA~ z9gI%NDN#0lmyf_MRVQsHiKIp;+G6ZC(k>MJwHgg+NB}9pg_EeUozE#QqL2>KN6^$r z=rw6X&S1{lw)Ln3*Yg+VY(=V4yJun=o#ZZY3kj>9?wkIDhTSKY4;$G7!iDcfe--^j z^hYO-K`oSn?^_4?s%#7LE)8`+0SS`X_Zsw`lvd^orhSs$E`7o9dU>)7B}grqGFN?S*Td=4|IIWTVsW zG$3cqRn98vtnybKsbYgwP&KzN%-L$lHc#7FUOvOWF-<#TV|)fvM>`Jp_-I!dh(jG; zwp=$!-jjs|ky6`@Bc(boebhfWfd}-wypS$tKXRj~!&sttu*;ef? z?|%5Yo@47u-PLWu;L2;q|31BHS>5y{)fveZD;kLttKf`_u1DXIs&k>oKBJ|(a>JRni9PM9>r!cIs#w@FPMg@1 za(SpBi!9}6Wfb%242Rlz={>G#&IeShM;%&mwy4)pyMvE1;Iy8U$VOQeDE_($Vx7L@ zrA@PMSrJZtJmdNWb(@=HYOiZsGpXayn#$@Mj<5UZA1~+Btqx6D8P4;BR@N4G&Ml$8 z`$6=BA1rc*x@V;?XsYc$v(JA`Aieg+Is%A*-VQjqA(~>MQ9Mt2^R%S9~G#;Ekr>)ERe%sM(G^269atewxOlSRBQ1k zKVhrieDl(`-+Yr>1>9mr%n9fxw5T?-VnCx=;#RZie=?h`m(6C=;Y2f<&WBagncH=7 z<2f+QDSegsY{5=kF`<9*=HXEr`b~NmyM%pO2F=2B_Obf5A!UMAK@S%v5f|FiXV9n= z&Jy5mlJJC6^o#A{I`OP1isXp~I0MuiGqc;y|GtfD*EX(r0x@$N@Lb0JbSabli8b%v zA0_+u^VS-XlzAwca*@q+qCk797aUwWWtLNQeumVjJW_YU8v?$sHfI+1%}h0RuJU9nQTr9nw?V-2&lO zf`9mxHj8RuA(OZYK?Ql98wPR9iVGszQJyMoOv_)k0MIJ13wb$Jv*ygI&V%DLuWDw) zjLA7T4yWyVF!7{u+U94rYitd_AHT0(14`3eqQ zxsIZbVAQ4SsLqvO2`4XHv2fQy)=<$=LB$GtMM*_%g|Md_+RDLDo>orvTDWQA?GveS zV*NyFNKQ*GOlB+JPR%KJ%g{Y;M;O9}2@R=$f2oF4!yNKUrG3J>33On>kqLA{Z(s12 zWR5h)HHXa^|0_{k{cGFOUuR}#a?LW!#$1_lrjp5QnYPRsrN3?=-<}TBr~Y~dx>tcV zuGqQ7)@BKCH6HL^c2&@zixq7^Yp$)h7!CU|YF^dv-cdzAMzLJU8atPlOe~$`8LMH? z3lB^RutcyYC6Afpg;9kwDTPC4=c;ZI%?=a`$yV{QQc|l-ssioWX`3EeTsEsXnSv&@ zwr%6|#+zp6Pv7yvhRGdurB+Se;a;27n_IPdR?*!1|8{uSpHA*wB+q;3zwhgM?w%XQ zPb$9c;g{F_F#68xUDcZ&{S6rzd=0WsEgb&txayX&dAH0jYF}D=Lr2J}Po)1nc;WGm zbia~o_9hgy)OssAZ=ZX^?~biVm#5_)jcOWim>~OR-!as^{rBHpsPx`H^ls1Xe|xOM zEtjWuXH`#h_xv0(j_n2V-if}@rk_Utd8oK?vb(AOiTO9|u3E8UdUgYsPQH{p2dxh+ zNdl|#^A&Ux-9_07+a}vC8|#A2um@OI(&nT+Nvub6tA;Muz>VTQk**S93+d-8-z{jt zu#Iddqor&fTftbX0AT@|v@l%@Hp(E0*flwt5)Ha=@Mq0u8k!~+iWMT$i}0cNxkxpl z$t0waLV_AtPvArHIo}P*An&+Ics*>T|%DyoL$NHUd^JCX;J zhmtQQi~eK)+MZ;yZ8Cw0hXbvo8hypKmK5 zV-GiTGY@h1GvBGNWR_k6Xvu2oDQxuaWoRU&NS{3Iw|2TSl9E_9uG74IGI8@Ov zt;U+)zAXbXG78e$wXC3BV;!}l)^oRM5l+>Yhne4tlQ+KOWydpaJGm|HQFAGa0lG*$ zBW@?flEPmb@A$#W;g>1dc(QMrd)o48O}94tqJKNQKY9wLH1>vFvnMRv-Vi+uJ#|}K zisAOvcejrhx92r(Z>?O}6f_$uTCb;5H!O)xbqD7S|8Ux($r({0b@DPEyBqmf+>G-@ z9(h8UwK;K5V$Ap4nzJ{DuF8cQv-f4wRoSpAg9}(IgTl;JnRHhQ6sD|7K?lgLqaw9a zDlTY9>qw)=(@v#PR~nepAZ?t)Cyqj`DJ)3^t^%0l0gs2YI|X8v%v3fj=5BMJdB}Xm ztTCGn?RFcVOHfqQE1;@E&k0o)x)gCSxytT@F?P#XHB!p8NQ&0SSn3Tg+@#cQe{tiS z+pe4EKAhWq_o+>fMMs{Px8OLC2mb)R>CYzBtk@%b(Xju_wry|S)99VKddkdMyO)(; z_Y+7s@(>taTpoF1a`A#tA&w7}DRDW5z0qXly7eNu#o&N=X|^$@;YOV+KUbcH{gr4h+_YZWX7{v99YD_xs#(c;@oc%^{qUzst~3nE)(e5w}~K%dZ8VdzMYH_ zX=qbLn)61THYUhC_T!G9j|fGV?qbE4e$MU|w;zs9zBg(=Jlgi1*tVW@y+G*5&~v8L zFr^wD??Ht&A*|D(19pWvvJrjk)QhIOzFj=*tv6V8H82TDp-7(gUQKhetFF+Qpm zwSA>ye)Ks(?Gt+2cIaf*OMg4XJ`_F}{^Y*l|G=*C$P~)`QIz{4@`7^9E-$R|!ql8O zIaExwr#7Xsc_}c@2BOt&ZL+d03H=GQC7~;Uu41r?LS0S^+5nlb)wI_{6?CNx*$bVD z+fBAP2b|RD?{oP({C$3AUvQk9B0LCg#unY}7g2kR6VuuYY*M=@8xF8%qwa`~pvG>i}I-_)A(`0vS zXdGKn=S+f0 zm9#{(yICs{Bta3FR-o+-T8L=RX{lKYI;~cJWdbQjR;rO@&QUbHxdJWbV*_OjIf@d8 zr?7ZfbLtfR;uO7oxJTSR{5Wm=VjK4ACG6Ub>RQAWCB#~h@Vv7@9yB~dSO@9mJEOU% z^Ki7NCC5b|C%fBS~tMOa`j;1p! zn~(Wmq7Pg?Nb&*k!6!aAbDb`G^ftP(k2QO~)(HQzpjxmN` zY=~j3@v$Ud48sl|$NPy-$7_D#V|zISuifhtCMk2@S6`0Th+z@&B{?{K(FeRTt>+!U zIr2*%JQ#b2J|9rU*Wl~+v1(2Pmyc$pFC-aC2GwS0>~^k`BrDS1p2_O7fta#c2J$xr zouxp)YYD`p4rQyIn;`tyfCpdISs%Z*jTVd+ZWvQ=xo}Y|!Q(WTC_W!Eg82fWdbIJg z&22%?sdSP?n+RI)aN9RGFF7R(>|CB9i=|YtNf5Az^C+b((QI;>qx*M72Q((LS!&8LFHlj9(dahv@(aX(l9!j@4VM~121;C*Dj?;gjxeK?=?)vY$R030Y@`K7 z0508_30zuBuz)KC%5nj03rUUCDD9WnIqW8pWJ!^_r6K8zq>&UmDE1-y8T&cA5Mu`_ zLW6c8(MdW*$Fw?7Gc&zm3+S0q!Gw|MxLOE!`FVMM@FS1b2h@N=dmAUG7gZio)(ux^ zDCha0gijk4!-*6Ot2^9BrvpQ&5l0B0r;1sZH+TZr)hU4`IBZPwI^*$ z63t0(CXFO9ZIXgoD=A59Yu7XF)utMcU#hcu+WGkE(WoEfQ9U7T+yyEX{uPo?0 z+*C}p#b7cei|L%HIgnG)=U;F<{Zu-2rGq)$nNHJP6@3-7u-zq0Y!{PlhIR|_pRW$6 zbFj+X7;i1*<;DI{2FKqu?!v_UJ)Dmx+2cW4AN{vHpK<3~yX+-3a|0PlO74OQ^ZFKt z((k))q~YI6z_eakSy{`rRtao`jhTW zdNhgc&jfXW;z@$@Jlsh35qb@2C94QyM*%j#EpQhwx)eYGz5t&Cz|aZoR_0skx}`p8 zP-2bJGKo$_UEq-d5(Pf!Fy`mOrC`p5Jy>Oazdsn<5@G1sfFJK5<>zFTY(*vEQZ`V^<4`w}dzNtT}rxBj!xdVFPq8^UukL!89(5;7dJt%r`^1o^X zSf@XN1sC*MqK8Qr^w6iY=?C>^^lY6T8uZ}T0~Vao!*M+f>S3LJo1RK~mtN5~=!FqI zoYTW8j<7?|O?IJL4=%ME=z0r@&`K4mP3+bl)kb*Kuun_XqMa9Fj)@533q06FgHA?zW`kC}|=|Vbxv1~L>bgi@01sXOW9ueuA+;ikEBh!jD4KuY9b#7NJN4_Q( z_gwiR>gY5l^2j(^A#s(iCKD-rxA)9<7M?0!v3KsAyVh3!up zw=yVUO>8;a$b??9gHSzzeE?elGyrK(2o=CkIzNQZf!aw9DIrWl;LqeULa_}!O*0po zE6|?Qnc*+yf10UzA{uhkg{oVUK$bdCn-57BB~kiXu$Z3WJO7ZdRJL{?VTX{kqTdQ; z$~NQB;zGf#>?;vs^rqU^^AK_SRWahL>>{@ZXOt{RNlq!9R0U`av&2`1fAkvcGG`?u zni3KdGA*#maMKUw$ZuMNvAvKJ3F21jv`o4w7O_(5!)`oGO1UhO%i}B=E$LAhKXAV zY$Q-a8p$%kN|D5guq6@d6Bi_|PGpIaJ|UczSeRIm$n=TuVdCeg4^26y5);#y;LoPd zOf=DyoR(FXRguN?S@2=j=Qt@jbDSkkrg6fbou4_WGfVqFaVu|Y9`q*fNT$i!ygY3( zGp7|57F84>?~33rMgJ_KMem|h=mYeYj{D${4+ea&)d%Z*u)qhi&{3M@8}J?XF`wed z2)lf;kD7g;_lXjGAbl#)=cHGpUrXp&=*(s28_c`S_n1$bH3?=#8FA!>&DYC!%fFFX zsT`8$$t*?Alc`3ANph!rz5G4-dHGfOzvTZT>vCn#$|*8^?Nx;SFPYsS-y=UFpOl3z z8S>>a8QJCFAn+F%-jU%E`KK~HC_}#t&GJf_)^U`elT&5-Uo!kuhVR9m^5w9+TNV$# z8iU)dVioH+PSDE^nf_M(i%ega;a>Ss`TH{4D}y|Al0vT$14<8Qzltd+~!&cyhZ8+hn*-hIScd$l#Z&Wtu62Sq5z3g4)8H zG9dorGJHpd0SEshO#eZI4{GyGMtv-MH!xu;gAf7eyfVUUS1&6 za8XtG9<>lvo;Ig!Q2L@2XS1tuOEACxcazio8%aWy8WBMuZHIU z-pf#n#?~J*SMVq9c?9^B!gaH^ZA_P9S|-|rR4nsnMDZ!X({OtYc;#Y?)PNT_amb8gxv*y$1 zKh>DciCW1FQfj98^H%zI#3W!fN=&keYIFuI2!dY3A0tL-$av96jcR-&Eh~K72!lr0W&|D)#mr}o=CF}6 zZqXO;k1gmqc9BshJI+qAH<`dTXknt34@1TSraWBA;-T{twBUJcVSO2z@2ae}mBl_K zKoKtvs8-d#2vm)Yajoaq_1`?|t^li>oZH*Jez^7E(eo%Q55zV{TcQnb(bTBrE!Yh= zy%o)(M!ItN9{L`AX!tj@V0g)JCQ5A)N-ek6babwgl%<6PEof5{%wdZNOazHX;s2tH zU7~mEI^crBEVTFNC+;Z2IzX<@QHz*F(}Vr z>n98^8(5!V&_J;R4TcT_tucU$qf0VSZ2erk^$2fonW5LP-|(P8lnsj7F5#t!Y%o?K z+fZX@M3@~0ZTUIg(+9CC>*j^LagIP#8y_;j2?NAy@q!%&@omHV2Ku5(5v)OF-WRjM zZ=i%#vU;|aF$Ovz<^`Y>qIQM2z+4?r{i?3NB5v(t#O*7yLCj&eobaodhRc7B_hK)g zqw#0{8AiLR@6~;`sz5UR4~PHwOLzhv`y~wzpQK?{KD?M7;d=9~=zLlrzCpBPf|8|` zDV#$$M)-R*zyO>A>H+}aQ#AQMCFz%Ac9EMGA(_kyAJp?YiX_ z{ted1$3l-VlN6IF{-l8< znv`U2NRxbl29m6POrS3ETlh9Hd|fqsdpXunT+E{l>Rv`K;qFo{k0w;Z)!Xuu?H0Z_ z=t|tolgRRLehq?_fBKUQ_dW37>{}n1|KAxE^D8GdR^@7bU?}T6wDygk7gn0H630!; z4b=HknI^M#;YQEA?M;RMG4=Y^lJ=y>53JrZGm8q9(-u{voAagxEXwMc-WQ*W`Wj{n ztXro`pESF4Vq>N2w(2FlB`pG2id*ZNJ9xBshq@d44dNsLa+jj-ny`5S-RuD;_YzXI zhVZVe1L$C+x1`fLp+%s(-~doHT3(HXWV&+H1+J35LeUl?R>>-(!zAdekrJpbf$oyQ z66!30krEgxIafj*ISrYTl_c0je*=wCRQ0j>DA=$ewpKR!5lVatXamVTE;r9J`ZW@F zJ2hI3Ho$jTTfe$LSICTR*!n<#^3nSwPzoo2i+=G#TTcJzrHrbM+UeKT<>uC{2~F)# zoOImq&svtImC54-y?1grPdFcK$(m$$B(H3ZejNQ{_t8$-x8mU&dhc86^{sdSg&!r5 z{R|~Ak8D(CZCWiR=|moS?oc0xFhi@;i4BR#&H`u~-9r-K>!Cc-Yzf@tU!QtD;E#vdL4C{8*p?A> zpPCSlRskmh*wU4*86Dfr&*>+3?q9s^>2<}~Q<^(BR4lloQ!%}exS?xCr;<*`wH;nx zwQ^0uv>O+d&%68d4cC3|rlvqj@%&9SiLI*work$h%)>Xm5SNLq%KWBr%g52y;#I}8 z9O{6o^MGD(2%CjHf}qhRYd2|kX$4zIDI^2d3s!0^>2pnYYC!Wf0kB(%(chqxNKONb z4=I!ZRRH3<`ihIM#2ngk_$Z+k$z7bB5}4?NiSY=8`hgsbh9crZz)Dm;!yQ{6ET(|0 zNB%#KqCkiL^D^tNS*^1E$(5~;1gW&Nb&0|2FVw>WU)u7*lf8OFj$D!k-74=pAHJdI z$P$(JG3}Fzyw5-fcD3Sb^{n#H)~r=ol!qy(u1>E{pRPDFVK5Ui^ZIg73M^oe^M>-y z7faK*tj7r(rAM`YRV=hykaZyvm@XlY}G0RN|HptF2YxTt7BogcCw?Vh)G zR5l;_<(Aa`$G($!&9)^d*_p`n$>PsYk>9TvnZafV7^WEnlYtNORl0<5npuKG$ss{V zM5o28YHBc0Si~k>Ih~^GaL%K&HE< z4^EFv7aGn^hoR{(YdZ8zKRTV7r~9YVGt)2f6zB@f<0dsYCG(U9d$PWvL<6}vjQ9jw ztbVGZju%)IQ<$pxFgD)3K0bKH*t{@i2YnE(+TqHFRQ#J$)Tv+nw1H-~4X#iUpS5mX z7F-s}rAd`d-Qmt}p$ED6(7K*uJ{(vAeTv*RZ;be7gGo#J#VOKM6x=M+ch=T2WT zIjw&7xcVFBJy}p+;i>IEecLT(?wrxJ*ikhppP|03%e(X+fBJyEvi|-RvfO!p_r@bj z3VqA&<97a2_Hi%N}lR$MN#CmlBcKwF!-t3-QmZwEo+r#(qs9%I?NsnS;+7RK(L$bhhg1Xbto*EVeojw-2KC6d_ zen?M`=%Jf`0qInu-51pYJqNdp%L&g?qvfJmu#>q!xF$h0%0mjHMy4gUXnEz61ALP` zCr+FYU5`Kh#W|tk%U5vFkNh01yjagtAfVihev1^==Ie}MCWPz>I5h2&-DOwog4S+N zbqqS7I!0Uiu0#3dufk`L#B_kKsx~;N+2K^zxken~pyQ}Yd|?&`hojYw@RizpLj8E^_)X=Iw09BHR#hv>2|(a)i+4H z4I8}b(D7ce&DUSvH=!1Bq9RQLeuW zJ0ZgmBYJDqs+mQCxR(k^-f2GJAuj9vCmwLI;fnIr|vDdiY$oS=i@onS##!rlVGh)n9??Ow> zsAZv;%w0rD6P%`M6Xln7(}+nhn_|grCb8V4%$*nRF!h;^s+-`%vplpAdlraEGRY<- zUU<%Q(WKW>&>94tStKZlT!U9vr<9|HLdx+a^O#lV=S!LB*sJ@X+BaBYYn=Ru?ZO|s z{fWuZyLOy70q?#Qt%IM#->!>p6W_SBn3|&g;k#oLgDO>G*C`WOXo$cW{>7U_WO9)R zI&x0DDAKbc@SSkB}Iz z7JMi8VUWETgo8oY8-%Xl<{(`Vgt{PjgOx%0c@RDd!aG5DJqRyd0RjXm2$lzFdJyzM z_}NFnFN3rTou-4q7lN+^MJ%3i1tNxoH$^WubW;$ph5F!v;Od~@41&O$_$Ww^2Tuhl zmTwDQRcs8xy(1irG6H9VfM||$G>3w88}H2OAe|M2${=K`pxD}FphFzjK#(pALVXab zIa)9Wok1D{+8W#&d@T54P*|tdk2SUG#USqtQ`-Qw1wj1xDqr$S7x;U;&ie|>g8TU^ z@~$#`g->{e$Aa$$8CF^ygo$b;a}dg3#LO>)>}U{rd6n3^u~>7wEi8MG1M}>yK>-n+ z2?Fg14hD|~hk^pOE(gIM1ftl2pc_}xkS{qjIG5YZeiN6f;^OMq1P+Vh0fM%xg1uuR zR2#lA_Zz|pqs3RpoWB-nR*%@6=U;R=H}=V-s>a-7XS~t>_z+M%)|9|EOpA;p`LCT+ zzHo}?8EyjbEmM@Gmens-whm;l)X5FYlsVU5oBi}C6n%2mswwG3O*hRRzMah-S3gbG zisQ>GvA862$!dNbzwpjwd;;Zg-o~5f4&NRdW9)A@#&WnNFb>BSw*+#~5+HDdjNrtY z*GE(v`&^zdln3TK=*xq=QA+^F(-2o)TxW4zh2tsCkQhH=>$~4%3H)nva5}K^l!;B% zss(W6<tO~W>(wO(}UN!cTaSuz##5YSM<4CVkx!JYHMSC-LWKjMUH{ERAW2FZY z9!{V_LQ(=X>eKbqD5i^4-D{ymuY1r8=IlN>8?x1~209mKv%xXlsRLb7gF(uQxmU6O z>wxpw*Z;KxNU`spq}aBlulmtn{B8ZyTc^MWH$T6z?4`W=H8r*CW)_T}(N$I3J+qKz zMclT z-MvrxL>^F3+5RLjG=Uw;oaNQs2ix*rO08US&E!?Hd_25RzqB%yj@x?XKvVNF>XIun zqb;H)FI-uuXW4;@w25_od&8Zlw=X-qrfgitvD>(tS+VvAiF+j%Q7*=jQu2^;eUpE= zpSF5ed1<+;&P7Z0AwAWDL;coD(1^+6CUKW2=#xW=$G9!!Yzj>&>noaWW?*2hGNp{Z zSq7xcRW?`_DMP=b42H^JRvGk_9WA5gGJhF8Q+AQ3K$o0uk&O8b8Y#2*apaZK0Qx7i2mY;`i^ltN)T*e8PeVUjT` zJ&R`7c|0Vn@b9kapzWwFVq>=QK4YChab$%JhVfzUhg1F$c1QV8IqfTla@C{AD-2hc zgH#T-@nS)Pi)6!K_C*|d*)A!uLF_Pg8)+Zk#LmY{{QHgA&01a#e2A=%{YM1v`Kv+_ zZCAdGz4BiW;L08Z9UlMGW=>h>$VFNxjz{s`s?5(%gsw#XQ5efNL6?dDTO77m z0KugPLcHP6C1RDY5TcylsGLWqsRvHD*=9Lllz&_JG|J5BSo;f~KFU7^Jxi-4$-;NDL`{=7+;{RMwdEzawo z<9kYUfig*rDINqUB_Tq0kpqNQn6EL@d(F^g-fZ4uR=-@P-)6u%+4bx;#uEA02LfMW ztipu4ZU2ll6)j zI|elN%;mN$5Hn@5h_4g>-@dLtrmf?Szwh@w-n0GkjLi=N4qz@g2J9n1Z44$Qb{%l+ zhBiP`(xwTdgi@vZ5ki=oq?4K^gf&U4CIslxDH~KQf2``%Wr#NGwq_|we{9m$h$3~> z)M}zkou(<87*e%B_wH;bq#>0pp5MFAeeb^a?)&cD-RJuy<(k0u-MAg@+($T_fqNii zdhv;mm!7`#ZzVI!D$AK!*@lI8^xhh>1sj6d*}-tohL`o8`Sl`;Sg-d?xA?1&^NSp) zE4#l850#xLd!7y+>HUAC5v-t4Q@+1 z@AAgYNv8CxbdD}iah$>kg@Y8jDQuUK zw1MK96!z=_h0F9B#R&@MDfCl_vl@0$3^OR$sEeXR;qUZ66sIX%rJ(CF$dTPNPBEp8 zlVL$(I)y$?YIT8wS^Y++*g&^Z^ry<*v%qA+bV@m~kM^_Vh^~(4WDpz0d8Wb~#UVOQ zQP*J)SD=BV`YGO2^Smwrk8>4a7psF)FG{Q(r&DyA&Qs|yZ`REeDwECnKb~!rH_bDN z7U`nmY6{nRt`G7_!%4Ba`e&dpZYUI#hFla2w?!>MZ-A*9yGuac~Hi<3@-}j1Ux7}jp=C<=9}P< z1ep?uxo`lUhaZEKqx?vDSrKJ}2^2{(8ZA85-TD*po&u}Fps85 zRqR(mR$XdD?N$d=cI~Q;Fd8^FC)bhU=BP#yjAB4Ulc+zK4u|?a`!X8mbfGp*X7Y1N zk&TmvIM?%<2Krq30;5a~Y2%uBH}HE48q8`i!)Zv9oM$BKkH0o;KpWA{Yge@yZB8?e z=s%GA*1rAbrD#7B)UCxeQ5WXY{2Jbo#q-*vj%JlG&T+<8oE6G=O5*Z@?<_aY z%M`m3OKL7&i?k;sj$@ozg}%u`k6kOHi?jG~ij+WaLIiIm^nTHETT@L(7Uuk`xfpAg2qM zo$@2Kf|nVnXPKpS=%%sa;CbgI&q~CpTPTlicD;;r)t;oSCuvu;wVZgBcqzP%E47>? zC6cATEq!_!o?ANo9++X(2TP}60DimFfE3M3kHOCu=NGRrt4Pylwl{REaNwUq>(7XA z2H~s)Mg(}#a?XO>APyCrD0rnn+*1JO3Zc-VS)zlPFpvqonb4Nmor!}PAZD=c>(rAh zLassoSPLDNvkn+=z@rX`I3UjfvI7i`3@Zm(WdbsB5kHBLZW1R0h0U3M)kht)11TU7|D;8PpaF125k zIJhX*8ZA;Gi&H&=iIj0wl2j*$anP^58=@SX;V6lIuIhJHEmE7+9#vBKWzCWmmBnT$ z9h7Fa;F4Gl_wZ+%C-J!Q+c=+!r{d;V(sEn`1Wzp zb@KR)zn&CCwhoYXC2d5=)7$Sc;lH81CtAQ1v&Y;q(bQ;fbT^7k_d=i|R)PM~NGbZA z5hn%;Vg-0&`zzbAx}~uN>+0c{Z`g66pg2~Hfx=iJ-ZRxw-?3@$CfroN zsopHSE7&deN_)sIS?opnL9{bX8`5*4cGtUm&CiEdb53s8>nfx3nw1_M>ALyLMk3J=X5? zwfB#`)inajm3=$PTl-!Z+jeC3wcWd4n?15^?1jG8@*Bs=#;%Q3n`=wV`)zftdpAEZ z+*w)q_+aPep5~g2-c_!eXhq}hP$9nCb#d${lgDIty*1X~?(3ae`f8+Y?BxE|awhQT z7q4}ex9opm?9u3fw#wDzH3h|o9&F#B1Rp`%(KDySSs|yCpv?Ve4#lHpJaykY!DS zDC#cTt}d&~wr$(CZL`a^ZQJUyZQHg^eKT>te&@`@Jtyv;`!DxexzamV?AV!4vR(vO zZmHw0_Ep((j(Y{wa;Kd|vxnLD?))&QvMv&yAruryT$H1TQs1h{YrLu9AaJG35|1{$ zzGvjGv6CQ_=GYDcBEh~cMd5Df6QW?PFq=Fi?~S*T{@%-jw%aqIk)SSW6iaOnn9-RH zE=NYRfouax-rg#$1yJhS@Sdbhvz6U~Q6C5LE50Ckw25nLlT$Ik?dO$`?M0NdkAz5g zw&H>k0^&N3>9cf&A%W|5^48VoNS66-ogDa4ge3ptI;dPZ_-lU1pgt^nR5 z#@*m4xfkEmD$K#-E*LDAy+FdB=QFNPr-`jK+3wETwmkZ+Ms9fb78UrwFCc-wBH#b6 zB+@al{>2FYI;?*M*8db)|C6B=_#YWsc_R}iOFjGVi2olXT1F;nRyI~fhHrFMK+jgx z$jrpl@f!>MzmRCZky&awdZz#C&@$0d)3edDvEZ?Nd!ckp%=AqE8$pLktde(nr@U7Z1{IeJg^mrOftPI};`R?)W ztpAOte!IbROw@D?%-@9YKaAP`$CLesK>I&vvv_}9*S|vR-+2EnA087e?LSigoB98( zg!@0G{*Tgr4>?wb@2dTyw14liF)~oIGO~PY$$zi?4gIr`{t^Cmbid=X{iB^&z9Ha$ zRpW2r|AziiQKoO;nTei(@gMQNspfAD_g~%oH}tQR{(ky*GyJEQ`_G5}!^{0Q=KCLy zv9NsC_FoY6-va#W`oG&<>-#&1$M${u`{FkcjiI-Oa_+PC2=YJN_a_? zMBF|mS6TMgjI6BypLq(mTura8cp_Qqcqu)h2HS{(y$Z6*(GBTbI2Apj3G&wMhmjh`(aNX~U~C{MVrOL_4B{nhXfy!h{n0g~q56Wf0SbpH=C;{Uaw`>!ea ze=~IdV?6wG-e#uzJ3#(z=zgo?^xsprnWdwV{kJD>spn`UXk=hxXaq^~pK-ni9t%Cw zKSxZWCzS5@@k`e)lbtS?9Y>Rd@nXhtsU!Pz(SZ;QMEHS*)RKrKz{3H+h#9s9Ao zfMKQ(kiYprkmbTq%yqcUv5_gvRZJ}!tJ-uMs~a_zE7z>PMt8T$+AE1(x*bda`Rv-i z#@9WjxQ;lguRM=DGHLL6!Rg}k`eHYWf_8?Z{6wtrfpG@cHxqv*!`Ys-7GHmK-+aU- zt_5?BeLD5ZfXm@SQ)zP581HSjcM;*g)(8IXOFIYv`oqTv{)VqTn+CI{^5y)th{a#Q zLtOCr*;tVuEJ#dv(JF4yPab~bzI z1LBQ6;(%wl4C^LjM3rLm8&y zMe)I&fBqNzV1OHz9Fq7r@Zb>L#Nj4LWkKXQKH#AQkz^9yzUK`}VFIDyy8-_oY%R0R zb?>YG#4;eFN;bBai)E*K%6)9a8D0{Zmv2*>i|NxL&fK`nZ;eXi_x6*xi!(K9wNS5s>0r&Av_nWrc9{9Cj3$?^TT2sS5>D^J-9g%jF@Q zR2>{m=z01uoZ-jZ-aE;x^%#BB!5D>TX;o$t27SV=b#U3OzrkS5`UGx8eFcXZ=>z8D z+-D`(huP~gGw@^xAAieV{u)r#<}=oF12Q8X8+lcHdA{n}Z@2d>oL&2RWbl}M;=2`j z41y*NaI1m%6g`^Onbons7=0q$qJYo6ZoAqm6JB`JC-m+v^W0LHQuvZ2H2o^$sG^y_ zn!93HhW;{b!0<6o)8DiyeeZihI?He3T;sslz&JXmF`S%yS3g|Bii{FiiDvhj+^gEm z=*S3YO>8aRcw6^*j5_jKTFOadbW~6E{*3GJ%rBk!B}U_A-(ipF32<21Z^BTC)g6LM zl-xK32rUJUj;VK3@h8|ypMY& zeux52`E%a6q62< zly?Vq7|}5v(PFZhctiFHd@3vPVz+|rm6HbFb&3?}a$2Eb&VpwYLzET&1g^jn?}}#l zx%6Q?GQKd}zI)Jd9Whig*#I+ixK#0?82R;|EatrqjWAPAR^xpciQw%JFW}`nz1*B% zI#iO9*m zx!zLh-_Wv!-9H=IvcwAPdn~`nYnJ2Bf^`RLrMO^vc*R8Ykl&J(;KSwZBieW3#@pkh#$ort6*oeGzh zufkXUH=FX-N2s30ui&39>E5tK+0kDaQD0b5-C$RrmPK#l(c2*tL6@5AR_R)r_98k zqStN1pb?LAu9l)9I=-1{>UG?-O%YjL+D70?(LUAybOujZ=b?#bq%beqvqD9 zUAppwcZYq#<#u`Q)7x}h_HsSi0SXy{gMwSoO0?2eO2=6``TK1@Q^i^ zlT?ffde)vSxIT7T+?Gs0pR_%PS=#{B(%~6sadp)5XMokc04c80H z{fqsTzh}p&_NWxC$Le6?|Mod`(O0~jLR>@+V z@wT1Q^^0)6!805BAStOL?>T@ukhvDI2)#`sq$L^MWmv!*Yu7p}J<@qsbu1ez$*>8D z_!=6unwX7)Bx13JE+R9Xx`sWX9yj1_h470bf{x%({3wh`tXjH7QNHI%bx<{5cId_I$a=Q(iF=ckbO!~d9^2Y>VVhD13K_SrG)8Z>T*NB9;dso~cR3aKsmushLzrvBK z#+ev@buqPCx7CHHmJL;ti+pk9+irOS@xXq8a)=mqQJnWykJ$B+Z(Po28^*7hY1$g= zcul^I+b%-~2@$Qzxw8vOGHX#xuSRi%Pzos$rJI5h#uK%nVChE>Y1C}&)}sbN<@?}! zudc3xG4{B1`wEV}g~*8YM8=Rf039oO+cPlOjF&RQ+Uh214E;*xChd#j8};NEWJscH zlYJyZv(7FFT|j!#img_lZm-+6f(HNqB_c zuzyOI#z?xp8YGpsCG1-Y2_G);DKe%I*|1I}XSJ2>o%4wDGZUd@5;Q9}&-xcEHJ9n) z_MtFeJ)M5ETQ^aIh>r3p!#|_G4YH$4>I4^~EA+N!~QWDr=mystGY|yP7L5Y!9 zO+*lLqw`L4*RO9$MYJ|1yQIOA&43wAH3VzQ;MY_Gc$6Uyy zgfWOb=xh-@GfzB_2=)RJOSgGkcrffQ(`c>{D2=O1Y8Z$wa4~9Arq@&%bAOzVyk9H| z?peKUbnFn#+e4F)zGKY}&zoFV8}q%eD=6=4i;e195Ob-nhjUpqmkF6mPvEfgPg#!I^|x9sP0cS2Nk0(rIz(zFNr@B zX;18r|jZie1x_9)Am*m}}jRTO`C|hO3^60LT^NUsBq?<_# z>(uAC37lIyk@6A`BSZC=#WsLp5-``#`%S?s?dyh|E?0+6jU92wh25ppCB3CCBX51F z>tJv!SCb(e?0oY_EqgJEXlR<;S~WF*RckH>$NJ!mi*hgsr})R7ghq zn6=F2x-QBB1k5$#WMo2ybgx;kH+AXJ8k?QCC^TYz&bL+etU}(s&Uy}+Lj$#;a2$R^ z;^aEbq!De-^PtB0FdB1^&6m6g<^uUq3XIXW(K+4(&Idu9n8ac;a+$Q@{FI^MTSMY# zFWW>c3xuKJ?lVp=OE2p)O^(^M5z~xi1j6S4qGxk>j;^$LUZvN9#b$G7`J?oSTLVg- zq*0YxPXsccb6I)Mv)_tGZ-3lZHqN0u<7{Fqxvx#i~$&T5n6SA z#7`4tAhe`@^s)H`(}{ts{1gSR<3h6mCBp|dR25=F3^(q^_M;WwuAsKTFO%bvi;Db0FF+u{BDXOX%E!S#aBb4AbzfMS9_shDIxNeRj&_zmflN})tX z50LH{)sY)D=q=UByI`qFJJ_ddqq=9Tm+v7RIp43Bm%QKKm!AeFBR`B7^y_ucZKi)S zXJ;XgIAb5=&dB6t6m=)+QFKp{eh{el}@AA zzEf3ITDS;V-7*P-+rIN2`h7xpM?DiOb=0yEHW$BPBsbp=s!3X9h@Fmn6uDZq`@QM6 z<+W$7J=|Fyf+jZk`w!5btP+2|{Lnw}0Uy8l&R4SdH}9|SOAECK1oeJrxj8m0l4!pF zyi<0L@)@p%kBY%UBp%yW6PVeMb60^lzrK3q&1g(tyMTkoC;9VVLqH0VH zdBWQS=K$ZG?d2v+j)~uIT-Y}@5H8u59d+U(- zr}ZXnEPRxrrI>Xzw$}6EvJZB7s@vF;i>pEX5$e{{twK&?c}OglYc%W}adNM?3C>4KTStfb~x zDn6NAGF}k>Z27DjgJApes(U5B5MRPwm{DuZ;rp@x_wwgOw4U9iocCyu!q;c&9_g9^ zE>d6fUf9bBgZ*GSK}V@S3y5och{gkDm9g7_q9yWyPKx2ap{5X06&qSga5s1&d{t) zE^4^hG(P_hyxq3Fi2g8V8}nYqCajZ{@mSYOT%mmK4^3~x(^G!srA7>%t}x76%T?sl zF@;beCQZd$@O<(6Fn5uGu6_}?^-ZlTl?|MYXVu>Ls6~yguC}}3!PBy?jVGS(HD^2@ zMw63OZ#Lih}O!3eA?IS=6UB&Uc1ZfM=`97bX>W@d>sdb{jALJ2$X;F#`Qy_y6djDih&lbi1!jmWMxH!%|4N- zFQDMJV%*DqLq=`Boev>4Ked>PF7U(M9z0p^%*&oOneO?GEGP5wN(Il^4!KR8@qPj-w zrwG38?0HyY!$fIXVg~7wSuCSGmVu1%L}MenHp;|VVzP>mzI@>kP-whM@gHP{{Q%OTCi9<`573!-j zZ%qn~;Vc96SL&f2sdhvF7zQAxbo8*PFcR1!r8gDjA6NzUus-It4(nAkRHi_02~ z?;2}oh;fA2S)iKqv}b?70bs-D)X=D`kx;PsIU{E&ciQ$hw15I zYbIc}BJ+FZjCez&1PlAxtuAK`Tyw{jy|H-Mx0jEzb+%e5sN=rpeY!iM_{B~5m2;o{Ghoxob34UDRH@Y&uNsR4nS$B@IgW-tv&E&O6Y@3f0Pp(T;@4z^e1h=^%zSy)p&Zc5Veh1VZzB?My#>$d=}d^5mTNMrAT0o>o&w~7jo|WS zvHoavP{HAJiJG=cIC#gk4GH@rEIqo03BFzl*f^SdTh6X%q12p%X;_%?qcX!!V-SiN zhX!vrJ0{&JoIIVhj4_x};Kvi44ed3DAb6iWw{~*C?eM6)vzzy#&T;23}u((hm+lHJ3BIx z@Awpf6j}%rfA@@`F-Bd!9&;|eTMXl_l`@+N<)pq0MAh=_6}cH!$SglJXLc~x=qmp{ z3O8YT8G8RcfR67U$Xb(Mghs>@C$M&J8;`q6HEpeJR0N}zsdiS^66`5^GhJ{pb8pc? zzTZn8Z5K)qx9T(~sF$nN$ao&XmY%VW@e9i_%T~TP0z}%x&Ukvy*(2wBjpr|B4tzvy zXEg)yWv1S&`qb%!R)%=(;lOdp-IH34b*{j*n%LSiZQD`~}Z$5w7-=j=;B|=@PBEYG)Ze#azX=P_R z4g+PLfu+FKyS)qSn6#7&?4Q+rQRAMo0Mb8SV6FeT_f`7j@@`uNHR^5C^@u4){wbK& zIzBnA5}wy%4M!D@z}gQ83YvfiBEPGJxahCk#D=J@65UEx|0~|uIPGON2Fn~4CS)>r zGDI;~Rxest$^eRtq;Up8jVuUm21)6D{vK9F%QD;H#A~wND~n9J*M(4XZNAUHwAuS2 zQY+-^;8W0TtM|yqZmbG7vO!HI)ja7+&GQQ^x=C8&Zec+pYQ3utULEsNRlD{4`TM_i z=bQ0b7$v37=7}nBnkuM@uaMfA{EcYXQ3Z`fDUr1`JPO;i%(rNBQ`<6)VQ&2;l%Z z`t3}FxZV|meMv6RF{QRvaT@t!=M$x#i+$a&7=8jISJ7}JVO+De6n+8TFWcw2cnWJP6FrqV!mpd_tSzFeb8v`uZU;xtv)NdUuI57jN}hBb ztfON5pIP~eg~k#Zg*5z?!eAY~LDS@p<$?v`a(xm5gO$4;ebYc6J${yxVn4tOMD`W= z-Em3)XiqQO91Tu~==Xt2vgk>+QFgwn4mB?+a4p$^j4x?g-@Bu|-;a-F0=2?|BRS&_ z$(ZkUkK+5(7(-Iux@l8%Wmc}PiS+?R0Z*lePun1t!GEZW$I!cx+71`V2k=V=^@nO= z!;(T0myMZ@HTWKkFZqb8XcR`mqW7Ba6LkWp!)(N@ zkcb&Sn#KLFG7QB@&WfEB)huPio2dbgOBkUsC@NMXaG#kbw9|)+eKA&iaEmMY04ID? z6%R_OaZZW*X_VHrF~wfvBR9vQk%KtmzY?$2$AqBb=bn|!U~l_&!%~Mkg>{_1f&hiy z#r#OqdR@)aFnQuL|2QjlwYV0R&az}r9IZ)q{&py9=?~Zyb+-`j;~r}&H?kI5R3{KiqNSTu1qE#Z{0arv~(s2(@@4b!AaF<)~E=kE=_at zpe|;IX4)u;fQ3Zv{&{LH)F;R2OK&sI+g>EnKbN`~ zv?e%l3nDTK+$Q0r?4>N{oeFyh5*vz9%=$-z_#8qu_u%|BIzpXB&S~p*_S<`=AF4-;)2nGgEX~_4R{=-{&pS4=@v~eOZZNyKC3eH+rf?gvK+M6z_c=S<3NlKv=4c( zO88E~?9`=xiZV3kqO18V2da;P7+h^^4VDI-X9eTit)ND({xnLz9M+A8cu)Wmiu^|c zYJf=TAO({Gb`d6aim84YeFpOQg0r+&E*UW1K+Po~$gxtPuKkDNgdyEDlK8@=z9}`R z+KEn|Ab|2<+Yt&nrYnmB)f2B2g?9?g3Rbz9)U~n2?|( zT@7CSsB?nitOb$2%k5)UyT$S=-UCQTEUf+$`KdM0lO#lN3=_&L^gSQ(W8d}-NrzA- z-@Er*NpVYz46;IDRi*LDjE!n-90T00`;m@Ht8k-iBmdyEF+3(Q3x|is0@+5pT)Ef? z?3f*o*-(s~p&@O>!*9U6UbO;s#JrJN%~zEO%4^VmkROb)fBY!U&(#bC!!S$TK*53$ zQQN#}W*(KnbRr|T{uCTx0jUoQjkYi81{9i_xU7nLr4a?vNlOcL{&D9N(AVF?0=eZ$ zgr-z5QS5_L|CP&psG-2?v)v&1CAla8v@NWv0k1j(g&d|L%zlekQ+}4`GdC`>^yo}7XB8>8EyI4Friha2)&juc!Xt&d9& z6E^vPicYQXH&ju+dYC)(;yF&AOo`6-2086Jj$O)#1ewwtR;09SwjE2!v+Qvowjg^M zocD_vl4(MJLj&sCl+wnCTFSefjTm(z8RPdnCz7SoTVrDUefx50~E;-D1D>}m0z z$d!!YmN9$H#u0|o18R7bT&7%lg?bdKmC{IY&Ph0G?#;cX0*QBNtEFdjBbX|EhO;KQ zfacRW)y*5KR%hZnhJDF92BYapwK7FD$xXRvS0y&?+Z!7O*pkCZ{h1~@WMCGokrzcSn9~h3YMvXz#&Ohd8 zB}*J)t>b5m=`lhg!6JV}XlC0Di>9M!jT33q*)~nZJCyb4EE(+O$cp=qjjmK(o{>rLgs7#12Ok#0Yx3Ci@OZPRXLnj%H-iZZgv9HQY>gM@+0l zEa!MxbhqbUs$BVdTW-J1!QtRo=m`B3)`52x^0?Bz57^p|@J`qEJiheP5dKO(F<_V` zh>x8uAC}o~Uz+lL56gvQmxWc5Q&k7_xXYojA&q`)4c2TJ1yI7EH4IWWNRM4CTbp;} zaA6Tya*(Z|XVmb$GeGBtW+l%R(IfE#ts(JGX?Lb zLSz(&PZF(J(vsaibSkMSOH)!Tu(}+29fh{Xh zAU!Qv59BE~g=E<&71OW{14tgJ(9Wvr+#7mRFNhC5*&y7Yz*%7>tiI?8jxrEve0wgR0$TV#ha8cdBV(sbs(?hcV%#NY!OE z(gxNhFd&s~EF^K1*y>q3FmuZm>)TJ4@9;G0^GenKU{=s;6ozZmsVSit7pAS)i-7`N zE?r`(x)9)Swe#k-`bUSiQ)@t>536}&ymQJ9QF|w03zaOauhA;uc2?RrDGVD;`42XO zcZ$p+g}nr~_rV^W3UxQyMAlTsdpA#CLw|nD=hb#fhoK~Q!)WJ1=g@?cai2aKFlh;; zGt@$heJ)co$C%mJsQvDgSX}|7dg}NqX?R=xw&r3GrFdOhJ*;u&u(&Y+f=ifUg41H)u|50uF%zu>GiNOk zSrFw1al282I^v|3n~3t~iJaZihyxuos}yDo%CYw)#07qt^2&=az6cx}W)3qI1Do2>3zt7wl@+d@n}`{M?A%(HeD`ZobA%_f|mqw!U}zkCcRa9!&C3|FZ*2hv3H!RK@=RFASaA3}PhUSD0 zp<)^7vw-|8%$Z|l!k=)5sh*K-cu7e#$(8&$1vy8uD)2@oLmVHPk9Ef?2Lk|wl$)N4 z9?Ac@Z})2Wwakh0);4L+M{r7*oJtt z4JeUn6>9Y(vIg1thYAEdplvW8o3#+$V}cW=!!F+~)h(x9NQI9pH3Lg;)-CI*7>8569u65G=15RZNcnUuob>)3KIjmjZ}di=f{GZiK^-f}y55i> zz0k&D8z1I;p$BV1A4Uq89q``thc!e`+K*?TIUq)cA8;HvE;+q%Cn;A)hsnM`-&4yaU58IT1FB3}~eaxw4*LE^FkjQfkV0Ah#a9?+24^QuEGOpB9jkSK6(r8RgFaU!ZHr55> z8{P{KmRu^AMNBcsqLEoHE>Del@r{w`lw(6X2(YqB-i17lp)7%!tPexs$c_rhxIF9g zqC?s`OyTX2KoQhMmRw=(VpSd3JoT_p^ZHb%#{r`DeDk9!B5I5(&icG~%n%ia0Uhk` zC(kLdv3zo4Z=nJ4id!h5y6!-m=hW4eW0@49lw{TvU5(J_%d~2-V=?AVci9#gDCk=w zRd8x#s>>!rmzF9wxFZ!hth$A%J%QPhVKwWd@As351R>ZUXuASvdQ!?E80u7^1^Mjy zsz8~>(j!mW-BjUn3Nd39${opbFtZe(1gG`G!cq=nrgZu8c`f~U=cmJ7?pPZm_vYEf zbSDI7d}krp`6vLV95748>JK+o1jc#*3>%pPkg{NxQg(8r|z^lZ?6tO*z|F^w?og_$d8`+62Qg$V4}j* zVm>uc?n}6VdqMODh#ld#7ropqUM)J5IdDwPsb{6ahidkojADB`vgLq$LX-FL!qat_ zkQX{jWN5*708^r^(l-$%SMun`O0Sp@T{doJ&4gl9kOcAuf9t(^Vv>p7KLwe{7>Uw{ zUBDSg-!f`atTULkIK?09EI5WX`~L0o1bE;Zr6%8H;r)T$i8^5SV5>t+e!GPenV^yb zL87Sy;_4#3KDRI#FuK&@sC(&OIq_*bHi+GB-~$hGQ*>E+aZ_?%;q(}6@RMDnt@w1_ z0Yph|dY?H;%Wb3ERBzAGM);;;cff^`VlHQs+b3(pgwmqiUIf*;#Bya(IjJ0sn#Ur{ z>O@~bjx$Z6-qtibW~<0E!6 z-3JNxC;pR2!9FcU5|;~F?Uhzr-nJIdr(0SzK7}J3Xcn>6B$ad{R5@=3o@;y zp|mXJt+ZYpaXciKf3}Q{ypFZkpM_bUtz9NKD!6b=53RRRr=Mf&SEtlS()Lxy>!nWV zs7r>X4Hni9la|@cjW>r)acQ3+$_384Vuhof=I*}N4ib?2HHhb zG&D#)sYRSF+N{+)SCUyVL$rz6sqw>O;Yt$-s(2yWlM}XvaUC^(V$CK%N46x-S@5WX zQ)N$6@&>cX4h|O9N%2m~D6(SHY5i!{=O4#S)8=E2<)L#(rSwY;+=ZQ;Ss7E8quhYY z7V+SC9zs`hlzLs9)bYD(t>_Dts?AF$$ImBq1C{MH(xw{}@)Q`aBd02aLR0Z0D-BkO z=+hhZ5mV{Ty@%286H#JFSBN=6o;Nr*=$yV3+Xx$Y1Os46hXIvfkAFHs+a3I-&YV>6 zq5e?_U<#Q5r3r3J^uv!=EulR5Le~Vm@ywBY7Avx>h>?R>seUD^kBFY%F!py1RWbn? zPAjpL38agp2-EL~BPkLV2^h^tTT*eibYw>W1lHwxm)E*M@iS3n{g2p2uW0KEOP}Kl z4Q8&U+z16T#UZkZ>`qJf6RELuhMjKB#44_*1If%pT#6IP1Vw94$Ax^}?r!_RRe^AZ zm=WX1WzWNvF@sh%2bU_{w`$mx)i1ubF?^RAhCH1ShZ*GI-JXNIsg%i-lF*Y$l3#w7 zvUZH=7$cF24RUe`vhd;WLJ6DDKNZK7jTp}$cGNS-k%A(St%Opqbyf8M6(DS0Jw1`` z`bfb-w21zUo9GBJN{O9Bn)sK1Pj$JT4usU>PR^rEVyNziniyHo*JG#kl`IuCb)`>q z+7|kG>`ZEuD^Ed{D!M3)`f;ghHM~m?*1yyayxV(or}C+fTN7fxl9eF`NoIqu6#$F>~qh%U5CSowi$ApFcRNT!7@1nVaw38%gjG_*OT!GmP zxtWwhQBq--D2)MdeT`{WA@?iT%|b_CK_Qjs7=+7dK%Ipst!oxx@q{q>tJK~}BGC_$ zBtMHg2zs^P(|vGVBO9Z=&f3ZCYm}s2J(H)LP`$p)tw^gFS3{Gw-NM~gTcWok9nE-Z zyy|8ueWzU2Tjg#(k`CV2C24|UqOA1Vfs`3Dtm@tH18L2?W&MJq_@0X${`~%r%H$)m zBX>)yIZ*yGC;u~afhz7xQH4r77IhdiPFk*b$F+VWS*}6V%%DZpObtL9G#K;{44SH_ zBp>R?2uZjD9tW7Z1E!XA`q+V^m~;mN{`t6FEM@-W5LB?`ui~j1CMXpnTVqAFJTZ}% zFt|X)O=8Jsc@~}c2{Riu(mxd??A&KeD57lLhWPXxcZlIj18_X1vR9s;6y{bM(H(9p zlxAxV+iVLZ^cal^YbaSNhiyJYK4Lq^cpD1yaclDk7j5-M_jEgzwbiaBD$ha%_B45i zNW_aOM1)gt7Lyhw!l6MBB8XC$x@nho6AWn#X?Brei$LJy&g#>y6Va<<{j@$=#hm?s z)rgV=*?g#gy(2yae&Lv`)qeGuqUPIypz?<@qXx(ltzq0Q{=R>H>ci5Zo(AszSa&PF z9YlRUpKtd+YTx=;6Y~B(d$4fH9wAB{u9XH61`{->H!!#|pKvIiwS+BK%)Dg)8MS=d zd&8j3#0l&6=xz!n80nmhCxX|XTA*2J2%=5tJa-n=e8p|l{6f1@9C>Fo)tRDBT&^C^ zDXKEVmZc8Kx&eW;QrrH_FVkFST6;0dqP6C+4@IBM_opEs4ZOrP-peIChk|T(V-lAo}#II30x>j_J+X;+|i^U=%exiry4DB?sdh)<-MfLBno<{;b*6?G-TPOW^cUTau6xMuBp&OQ!2@&fhNlbSRoqL59{}d`1*c_xv6F|K2q0B$1`~x2{N6ieP_%3#Kp> zzq&EFoy4F*a*`pDK25%~Dqd)5`*>%~HIj5(L$S5UsmN~4VG9+89U)86jFB^$V(P4H z)jNAeq1`soa|s_=VM-fJ(xx#nDOfU6YNm>dDt~Jq^^j>$LMXSTZgg;eaUz}2if$|L zKFv3ha&3eD^#Q`nT4YjI5VlkFHipm<&tjO~FUsY%p$1$%oWw4O){n$KLsNI>x1VJv zAH=dbW16LKyjb7ZuyeH>Tu_mv-|q<=vVLQF^zf=%D%6Ft?RSUguGn*9J>jL1v#A~V zUIH(VxM6N446CJrS0{qEyJIoJ;FD5Qh&zNoz#L##iF=c@&>${grBrav`{z@+9YB4k z$fnx}zT;#Q!A0i|D`<6WaWE?@Mx91LMh&J>ek(noE)Kzp>lIBh8J;?;8P1EE9B;u5 z9zPoS6%iCJ(Qnc|Sx(l|qmLt7&)`Vj+;LB;K_j_M9=LujZQMUZ&gqP%H&)bHe%u-t z^QoZgsB3pswU3z1&lDF`mal%y%Bn3K+Els&@(+`bgxI$06QlXLiNu^Pnu*an&XBTB?Y}|s`;So1RL`V^!k zHvGPqD#>3B>_4>-&1Vol3+k)xs=}$Owwwlq(zW272Q=po!UmRGmBfe;B-ltaLm{dI z$4`N`ozySIr1KZ9JKEiy z4MM5cPT*UAfjq2JxhzF=4J!7qjdi@Uxx8PRRW%bV&dZGZaL;gchc@Ye-{Q$FR1_@dK6t zHnX|bzs|=)gH}Gne3g?c*0YjaD>!JV8%dfr77UC_@|3yOjR6gKiJK=lb_8_L4=KFQ z&Me48NT-o{r&1^0C4NBTF5Np}43Yfcno0&^?J4*HX6W>cwv^m(sllc31@l&EG1_(t6y!8!qHKMU1+j3!u?CoRTBtPlQ5(Z$ zAWm>v4UMA8K=8n2f2P}aR;I0;yr4*PFa-`w?yp^5=r~DE!qh&7L7n<(-(>ZR&LLAoc0H|suNQ8&l7zG0Y&FqL19 z7qq-~7lH#N$Lag`JQ~w-t6iEDo(GTTnP=7zUyN_X&3C7|X3k=;)pV8CcZ`NJKrWvz zQ!Y`LH50U8#lO$95vVY`|4bd2#1N1sT#VT>?@y<#gS0YQhNY%Sa!7$m`roRgz@3dl z5b$zm3R|4OZ%74IaFWi~+Y(Vrz!ktx@DB5*`tw*a;ex}hv?U1TFyw60Zco9_^@3pk zag+)>-gc@RiJLwF6r=;a3%7iE5qhS;oB~tm;^4`cIv8v166~_9{dIdMwUQAsN2l~B zD^`yYJ?ytxoZIkjKZSw@!+hfH?em9_ym!|ZXzos_YvBZvE@*-f3urrc4^;sx)-QN& z1Vj8+)%&1bG;t~ztgp8)XdVN{Atj|?XC1d!&@$*wG&(k4_64?ucDscImUn!6pA^@c>s@mBlbJFE8E z6K*s|0a)B2vAZ-GAfdNd%NDHq&rN>m#>WiM7%k$E+r5CK18k8!@x0}_WYfI(fnjA~ zQ7CrQaOOM<)Yt9HYL*sJEX8ub>s{OYjVg?cD_YF$8$rLRZc!)hkkYqgBBse#3I`Qc zH}r2fcA*GZHqx)1U7y@=pCIQhAUs06vNM~*wX02!B)!EBn%~e~RNh|fznH(YzYut? zp1`uf`(p7FL4W#Z_FnL9;skbs?x6Kc5@6Tf}O>7(_dCh*b-gB^Xxo)C z^^W49NLlU-N?G(Ux~@_=tCvTythwBl36 z4t&Lvgz78ibEN~9A;m7ZT}#Nj#WVH4ejMU^_JY@j0bKlg6#Q`FQ!P+z0^uwCp^GGv zND}Nn%`yWFhz#0W#TYpEW&pnl*JptwRXFH(0qm~}0f-xD(5;N=E^bDl6k*i}3b2ot z0E(}3a$S#?A%AF}@<4JW`4kewx(Jt0s}D8gUoqPdD!%;M#sji5f!Dz)7vWTvpkLvj zZH6?YUCtXH+O(N&YV8B>OqzcK>?aN>crbvM0oC^~cy*MIUe)Ybjr#EZ@gszWDLXM5 zQES{ESGFa%ZN*x0fLHR$*seb}6crhOlMHe93Yhnv)aP|QG0I2uYsYn%gAJV%<*mo4 zAitubl{R)ie2eVIx}9#VDEHp-*-!y zFjDYca5!kMu5NoZrjlhJlLKRXJWLaCv7Ck5_6jL*JmNsi4xO*z4}IU!XlUD+A4f2@ zi$BDGGH81m4>~Z6#%g-!ocoCt|BhH zvAMC{u6&;H9lz#O!Rxlc3>q6!Fo%-*nuU3AJ}}2OTVxs#;Wo9j?Rax1Q)w#ahNp5OnW8pDU?piWpD>KiLxtMXQe}hA( z0={}J7x^jX@?8?^#e5+1A%G;+BMg<6$jYN6s*}0fYchQVtaL`Mr{dP@puCh9B3W#K z0<8-2kL}~~LFY7)%WR?dQJn#%BGx_joOd*+x}{&w(f1&1rOip`p|{EJiZ zH<06RsKtL$G5(?FZxG1e68}J7{KJF)gk1bX`fr*40tx~|esKQ(kNf}vL;eqPJ5KS6c>I;jjrPfCP9=MF-Oy2QSK) z7-ZuEGj`odg!Nyo@K_N?k4%HgBEOxABfyAnNIJ%KfKCD&Ve$+HsW36`85ks&+;6&^ z#%Dlz;uqTmn~740rQIW$gDCk3QFQL~a32Ev6K*JejF53%OgsitYMsk83MgO6s=2F* zA%#iDga(_YDb?)-4#Z9|SGE!H1Izy|#Do2>f$e{Vc>L8D z{%!PQ``fwy3GrZOWM*Xq4uJm+#Dj&Mi;MZ6z2&?I+E-PqljBV_*TvgF-lOc%)mz3R zZDzqVM34|q5{R8JlbM5qenlZQQo+UA3%1lX#9f&W;zY3DS(W;NCLRU8RJ58y{Z zLsP{a9nf32R9TuPW^w6z^?wBT1^mABmOnM{$*uIxds$JT$VEWv{kk$chythaUk`}!P=Kn9diaNJA(U(2m%mA$U^~spCy=l3j{wr!Y&+~4sZR} zH!_*5&14W(Cs(;!o%FVlZ*Qx4@qA|f8>e1M4mZewrSgFWz3qlGNirwD8J_w2Eq(Kz z*T7wLj^0e1?zC6gMYO-2ZZ8Vzp`W-c4A()J%@ zfoQK5Z)iwJg5cPUK`FAq$g7*Yavp+c-Cv~(2u0v(K@#H)wV(l@S2QOUb{{dYXEg6% zZj5^2mm0pWjc+X5dzmYXykZq^?}_gKZVT+HUR5qNUO*dx=g06{pZm!Z)CgG>7 z8^8EcnKn|Wb0e}(VUj;x>Rz!hmBDei*DqO8X|!NcX;maA>M#}pF0(yKg7~4MTS*SM zSn?8S0WVqz(kK#$U34qZY^-`>Wl12KfpimN7vydzgCQ7{3Cc?mM#PZvS3jp^AQdAX zeW-Z`bX6e^{)3lhwkG|T4#h7A-J6sdP#8JXD?caA_J#zW6fV~$*52Db7th~ct3H0c zGkd-6%MCT>{+@*mX4Gs~g^PTY+=_-oMWkG*FfT{2`r2KV?`7j*<#A%a%)qW|be_^B zcbQcuxs`TQQ*__fI%b!^1Htv!#oowsyL|Vqcj%Fa-d%UEd)71isNRq9CU-o5Yqrhy z{U+E4_IETo+)t{WK3}nsKSUzbD{wslo)3{+OS4PW*!TO#3rrgypRNgb{H?p6yC0fL z6D!1h$5Kl*VQ!Kfg-v1N1i@6t(KD0*OrsRVpEBCepvzbZe=s{iU6Zx2?koyzL^(jV z4!ZTphCg$SC1-c2%|BQ%6Lt%pK=xxM2NHH0Xya#Tfa^9Fz(7ti_akTtCczinLNNaf zcaq4bb|G(C#2o}R8|0r_+&K82a}09A1tfe}o;%RJe5;=#g+r7m8|&4W|G94qm(9ql zs{~CBcQ&_V)Z?IqM_Y%%%LsYP!YHq$b)Jv!$3gRIpiLy8_ql=b(;C&~bBldWWe{$( zvIu(wBamXj2vlo4qJj||Y%>P|b}n)=6DGzY<$He+b|wr>yS;o+SpC<-L1#|HYZTM< z5=@7%nD4n1B)9TGRvEo;w;0C2g~!t&PCa5uM-(?t%9=r&Tk&S$dGl!uTUnQ}51O9z zQxU0i;n!xEvm@;2gSK!CBiu4Z_^qiP>J^{e(~wN+!97MZ5oQ>M(7y%lry^L|Q8%oQ zR-;cU8c>bo;rYwr+B%T(JHOnfmHBk$B>151;p!_Vyz;u3Fqxqr{&-=I64*8NeVDM2 z>!+w5eb6x0;kWgnYMm565otr6tRC&8$Uop=17$Df?^P)^4srT4dAA%vUvH>J%%2pW zTF-!wSu`6nu?5NBXn5-8@zBqtP@C2&xm2p9kK91 zkTB?!pqPB|d~vR2fNfx)k+<5PaH@YpTa5_=E{B-`O-3IstYL+nwXuOhK^_q0qL8~KA3Rr%0cL& z8!~2}5D(EWTPjzR4kLw05fsvMbd6!aw~vb1-C1o2qs6x!30-DE(ca^i#eN4cI~l+- z9KJeDV5a4Gs848Cnx3ml5x-UzRMz)vVBC!ul*7NEn2tWjVfHq#ukObX9PCE%c7Kn! z$9#Bg2(FuHC|JgzpzG~?I#z@2Jk_>t=)kWrS9ScQD`y09XW5MT%b3z0vGoz@6>1Rd zmp(^xM6h&1Zgf|0i<^^0ecC-Cedww7(J;=8Lv@wg>$_YSxD&IryQ4a8FbQB3iUG9v z$z(5D$%!l=)`18IUib2hYIV^~L^xcF4tXnQCucbZ8z5}+%_p2Hc(x{PgMnwC6K`a6 zx)^&UKl2Q|^As1>k9K{jWgFv?zwdfVS74}=+?GUMq*$j@91!BrPgR|NK4dZPCKu<_ zh(K^`0x&d@j~%ox=qzgi^KPta zYoK&_eJT&`xYN)rpXJcygR`u@K!Uxbv}Mdt7Si>F1tu!V%7Ae}Qk8_feQrgOc61Z=+*4{1p>s2>uRgW_}cDO{842N5V=y*5x%QJ z$b0I-?aIc%7MWUC-e6XZ^eiqdm_#GSy>arNOI#DUDXfqg zMvO4l8AE^Ce* zL<;-PC**wb%*W(>v5ytkHHZ7C$5Yafj>27OW~!pVe#rLchG^+l^{28Ham@+kBEV%nAC@ z^wlU94bU=-Rv6ConNfIK{1;p3wy#cVkYkT?x5S$io0r%G)!89r8AEtQxIPDu(^keM z!LmFVp`Ug{&f-L)KHb;!UaJ$BQe%w40(#fa0`c^mXn51O_T_~|zd(ij4m(d07@Ws8 zvWUx~n@4#po;wwzBADgyf6^ov)q-O@WOyE(tGA9i&Cenj4|>X8vCTNYX4ea~*10y= z`McAoe;X>xL+#_dDJEBXoTp$=E3o$lj}v-rQLrM*DddD5AAip|8qZ}-YST# z46qWc6|QTsVO|DD6;0-;6&=l5;pP}m^T>f_XM3fx$0mrFh;wrEa0Bn!``U$x9T(Q{ z?5K;3KgRoJmGD*Ph?&I{ze)J8)LrtNJ|Ay6tBd~FVUU=0_y~mpfz28{WKC~s+{!*` zM>eB#O0V}P{jYO#-4tWbhh}u$e*QI%^)a!n(@{+MK~8j=!Ej~pB_egCv)g<}U#TBu zT3FnB}3&F&;U+TxW|tsBT)zD{`O{upRTA3OWJTl>rL?apImB zAK~#ZmoSjmIU_dr2k5D|Rr4mG$o?SW!u_yYg9b$L@xrp6RSZ13jn7iMUQ+?`t1*YH zRjq9r4%7n>`N;U-EC>!|^(47X#j}RgL0Jc$!esT3*IzpQUB~94>Q&nbmWwt5{~)^( zVK$?!yk#;-lu|iQ0&)u8sJ@ z19sAuo)5zG`7Hjf zrXM(EuJH2j*f||+oGvzk!_|`tX&t<3rHbvile+O{^kdBFfNIgOgQxC;b2W^j*qI3V zelLUg+nEJGq|Y4Q&WQ$zz39rc@gNyzg4b%*S*Tb~hrVj#vtMdM(&<>J7v~a_k$(Q7 zO5?7pY>iQLWG~SLj@DWSuZMlU_L%a~LkBMvfec+O6I9dg(J`edp?NWlh(?S&s`;Zi zhK~pA(EtkCFx+;FYfZhnE=|%}p9(Kn}N7N#wVH@Gd?ob=4qiu{HZpU6NatSu0@$6^MfsmOy^&6&swaalHFYQn}G z2v@q}^~H{86)uXi`kOILgihQkHp5B~iM0gJ*s!^{u?&0@@7R-uUm!1F4~pVBJ}&B#?T>?f)vs33GhQ4Q0bOw?UuJo-sMe_QHp4@O>%v1sSWa@vuDkkrg#= z!ZL3sPGPvQ!5DzUkPE{%xCn@R=k-(W^yN@^B+jcQx#EuHG5;|iQ;WSN3yc`)Dub-V zcJ9o fh%#3K~9Qby3Ds}Z*!=B1r$wj$CZVx#wfxrjAKwyJZStQ(~&pI0CN54R4W zInBglj#>9<-Te`D{bDnE=E5lGQV79fzk8fuWplS-bC+y==f&o2JB{E!r$QqEE^4G^@ct6;bRY0|764fBc)A~Yuhu80hvl2zDL0d}2XN+@aF*Vmex5HWJf1@O z+_QN%M(r#bk&e;E+lTMRT#RayloOB`2-3BRdRN_aw->u4kor_v&*2=`V25l+ZCA=2 z`>p8Q(_8}fbp}0PZ`2$fh#cZlaVY?z=${hnpFCKQI`abIAHH{&A=D_spB_DG8ud4i z#_t9uZ*5454L6U1V0CSov4E34sgtIuSa zJYIKpT1ZlLEE=T-r3FQw1M6g5@w%2?4x z0d%9jfhooDDV0b#G5j20tJP~qs6tz+|#gEM@orQd%fdE+; zi;>$IQ8WN^YvBtLtendq=TwKfKUV0TdsEd}dxEm93i8s7H5X!cpvg9GFfPZe7>%`H zF9kE+kHd27$C)$@^A;weRYo!v^M;717gVrhoZa^3=E0P9D}xq(<04uZ&KDU!VeY74 zE{8i|Rt+;F{xr~ck@#>xCHJejoXVWmKWh1Uc35N+Wzc6G6oPl}%jdE!)prEjHkH*A z`0TmrMZwv|&QGCvc4n3P&d_MlbiQn8hd5Q6y|Bu{!`{}~# zhVbXDt_iRcTC8Nbf$vBl5?h1oDgu+~3{idMnyb?zMvH(R z5$zJw7P(!(u|IupkF0T1Wu)&V{fTpM2(rPWTbXX}-`2+aVHPQd^B^OH*TN7s$ zX%*L#w7?JxgY8eOnjOL$9bvVo94XCJW!1r!UKIaF{c&`vE#YK?#~R(KyIYxd;u61` zDxL~Qc}dBjwowS7XP9xJb_VGbDk*ERcdCfYd`z4=9Nkv=#qwy2Pcvk*vTlQfli++E zXKA8ubUAUUrD8MXI$CaYT(o_dcd>DCQmf@gORl!i@=LQ4aE(VnYPU2fXY0Z7DsGML zN&JMgSdB(i#XU^(a+Ug$_u3tsn7X()+wxaK_Vux^cF)4~1+YalVjNhxUq6GMU^)@! z-obLAG>AT6wt9|VG@}(MQJ1;Umm9e(qZ!HFpve5@Z<2_h?{tnz-X>U-{kOcR`YKC@ zgZv%bDoRHqOSyx#B4-PIV7DladqpUq$%LUDe9f%k+36wM%InNg)0ucn#xVcFz_9g|Q0@yur>uWv z$iB}pLLmfUx5KC^pz_+833tQIJsIMM_*^bDxA&7+p3hVb*^h_o^ZgcSzQ$P2ShrQd` zJ78t33{l_k-ILjwv7(uH)6jQxLk&fo5m$+Tdv4yq$G$`GldetRW5yIF^oJfrwp_{Z zdNTwcB?%ZRG#R09D$r9%%vst7osBRz&~#vi4pqGVJObQ}`r7 zCKC*Ovm~7wNvjRDX&CFNk3fem{$c;&Gra4F-)#J6c2~}rC?r&qnSzVii=uQJ(O?eh zy{TZ>U(^tHDimiIKPPTw2Wg#CTRFaTL%rL8IA6x$%PZ=%bUPe(!_lMBmR)@e9C1iF z9=t&`$y7*1MjJ@$&h6{YmkJ6wQ^e=uda-B(RSK4*<^8b<(tQz<2S=7SY4N&fB2d4su@iIWM)Bm!dtRZCR(pj#sd z+AuXo=r{C|7Ya|95Bc6QYuXM2U+qp=?zC>KBX&5FhRfvoJ5$?N?-XSQ(kp*>2`gfL z+z}*a{EomW3Y>8}QlV{92W9Yk!18Al62=4cWh7cs3T`yr+Uf~Gizzp)AoLrk#j82) zCD;|~Ihi^Nc^GHWO8tk1D`w5etA1yGFHQ9~_DBKA6}US@U+ycvM%a{cGZROA^+6F% z*Z>mta}j(k(X?d5`XihZ_W{CjVMR&|>rg7;WXBrEn5*imqITI$>Rz(AWbKlgpUXip zkowZg6m^H@>7cKvVBm@nAxZ&=Jgf%NUr_Xp<3;v)PY3WNGjuy1Jm zBG6y1P4Y4J7SjusYe+bD{V3MNKP2#f4ndFG zZnu*FMnF+UreX3aq6j6nx_G}j$)g0>w)2i;y(j;~!i!jU+v_hx`CSo!M;f`V7^qxD zZZhYJEkT}idz}~k=*kRssm>fj+wVhnLaLEeHNLbj?o88n+23GCgqW1;DIo0*c*k%~ z^cCeNGEh`CrY>NQutcCMP32rra)rwkW$5?e*NgVx(G%Aw4Eqz=A$M7Xtohk)gBD++8ayyz?bVamSG!JS5 zB?67VB6SM9Wtc&&uUe*RSYl1yfYasEyo6{p+UtZfl}L9A{;=CF(t63gDfLW7usrg5 zXm)6NiPwI{4vE8edZWU6POmz~EPoPOvc=JvuntGXe@&hYa>1y~Je4YJQKA|-PB1 zPw(&CtM7>QB43}E+r3mW_b!-C2N4gvo`Q2F}5T@ zc*n}4;cMU`{k-P&_@W;^87Wv)q2PUO^M!sC%@KB5NWMyh-77355X@epSAhSD)5P`! z{>1xNlTRpU`ZpCmuV3S@loI-0n>L~a-iN1mZ} z;HC%l?vQAMW}UW2VSEZ)cX-#6ap{@?2yRF-3fuX2DDbqBtwgu{2s$Y!&I%N!QaXwr zbr?tUln)$;wm&dc7?Rjw>tF*gHa>asOI}X??bGMFcGX(kb0A1F8fUS}+st`$Z8~`V zYTRu1bM65%mZD9%*&w_ymj$;b?|z!!xVqc=}{D*(eQ$}0xB zixeLw5QHEpiYmr36@}e2=N*xB?OY`i~ca-6H*g$pSa9a0%rIZV}vo?ae4nRWmuv^5lkjfu1N62>^GE> zj0nxI&ygdz#Yj^45kiWAnxJ8kCAgCXoX?1q5tPQ@V*`v(PEaYNeS#U{Td^JJB;mkucNzUK3GUVMejaMnaccPY+^oLnAB;Iq4 zk7I;xfW}6$C`f&U)*ZhlZf+3}lFN;KV#x?Tip^w1YXC1LY8`YP){2ZUVrM0u3BrnW z*%co4iXuuONyAwy`ud7gn-~_E-oLjG=}0xUG#BoPMJx2irJLhRFslH!BFMAHPypscx98Jd zlt!cvGKpLliWaFc@Y7U4H|{9XUlTH&P#-LvxK@HU@~Ctva%Er^xr|$H0B0#}K^cAqOtUKwM<@F8Q$iaN92aYUGp76WLymBg@_;((hopE1Kcg9rWSX zYt(ym-oPhvUZ^$_{;wW{_F+6semG+hyY#Zpe4BAkP-C2L5Dk#*WWNLTS7TQpw<0%o z@rUuQHulfP*&d1ce=>peiEM&Dk{JxSkPnUR_z#cmf(#4vhjj+)$3HibNB4-EPhkJ1IL+~cjzt6f8^CKn@_kMvM#xT;j zA>$3Z6zA=~CiA47c=~g_53=7)fn;zH*(2x+|3Lak^6dlp8b01(Fo3WZT!G9$)ZO$6 zfj90+q_DSmAW$nZbTb$-~JO? zcgPc4ceXG3>|j)C2*Dn40FAU0Goiy6J1^+auyMtw|a^a3vj==UpE*(K06@zEUy z&^FM0F`y98RFKOHEKmp-2i~JQznsNKC;8uFTz&-qD72i{|W{*y1~ zJeGM&)=TFXvBLosRE-HSF~J4>u$({oo<+f>Q3BA{0L+JW2y-k`V(fVp7tDs`)7Tl_m&G&X9~;-EG{rW%v<;n70WX5OjM zph6ec_@)iDKwDlLT+ZYo7=|53Yur_@mb8SSepRL7Q724=1h9i*(;Fl;PK0XD_%Wwe zUR1-Rdtcnsl^>n_RjT-zW zupAxUI!?S;(TK#m(%xf&BqPDJ2|y40vK2kZl{bW_jlb#?E&BW{d*0YQo7qWSo?p;{b z=Bg5ij^rZS%;TOmvEnV->Kk#I$X4r?%{XyK=D6ZRYtTE7oll&y7V$%&zz`-3A+Sq? zuk9KFt~hbc>oaT46F!vz{UWRc5wulHCs(}u9}@GK{r!_>QLW){Vy5U%b9f6Em{{18Pn*wLMBXI z)1@vf2#agCCc$sG0@(sF1yX;#nuoo3X6ZI;V6WYUt8?UXTVzXB)r-Il$=e6&zkpSxJzVGQ^{j_rcg z2`nBwvUnXnztdlJD#jwKgFEo(@Uh3tn=hW&b_PzHw@sM$Y#laj%uI7uV_8rLN+}_1 z)Usek>?QTrOF20HhdWRowskx_*(Xv$?(XDIEKW}K44uIKrETG|n!{eaSh&dLMieo5 z!m7oXc2WNy_g1}}a@yjj5x@XQr(kBwfEVWgMyRJ?FfkV}`*Xqw5P7(7D%1+O^xe-W z56gjrbJH_h&%SuxY{~>}TD^E972rO^)o~u*^v&>iN4ON%eYCK>naP&vCw_OJh&QfR zVlu(q;Sp00?d0sEP&@+^V}{zm1{gi!_TiLlwRNniu~>}W%+%EERH%z{hn@vRe>t+5 zEZ626EaX~#eU>e`%om0oL-|yi@Igy`cc+vSGc{K1;6X+DD+aP*x6tlXv~d_u+mFBz z6vlM$x1hjjGw7$7_g>&VQ&?VuRuu52%>Gr)7_%4rC1%kW9srJ8UEzG7sH~J?pg*8K zUmhI|m9k%qDPb}d=7ITU)QwkIzl7bW-WV;Pz=lhWXqKPt^z;sNYF~=YHuLMPR?11x zl3mLYP|pIa8zx*WHC<(;u{U#XWhEvAMj<9e1GVRo2ql4ohkoAHcZ<52q3BG0AN}pQ z?oAh#`17VdV-_6xEdDeqiHv}WQVgl_KMh^cSD*-1Vz|&l5(rdyTuC)Wu;THwVY?-% zUlz5{x?>3Ipd1{GzEA2MV^33iH|dFmk;K5vPIKPe%*Y3FvCNumxYOdSrfE(uGR6?g*~8S z!NE-^Fl)bOjSWg8x)6z^BUrHU7Y zWP6tLSAhyLjlK#|SiKdI4Za+p_+wA#2p zm+I8Vs4b2%G357rV3sJ!k8^9-ek;2^-Z_T`db*OPnBvg7w1)dJ_z6}S0 zBK+*$qfdg(h}6`f>z-^L^+fPMW=LG>_Ge1xEr#Ajl-PhRAGknvLRTvXw47f_Z5jfd z2ygmC0ABBK8zejfCEHasy;GlZpaGePLRVj1N!z%|oD#gxQ9N{%+SXN4>BoXH7o$ym zO?SOvd6h6!()p6S#r<4iNa+l|XZF6nIuZ`It>TOvm_y?l6d5A41HiU@Ex)H}EmH4C zQi^$mDMyTXh@KHMwOI(C%%x(6tMppoqxB|CvN}~4TM{-Zc`9~FqsnE0dQ74b$LcwR z^*t08LQjnLR+em=_&8xfsk+j5KTE?#E|RmcXOfV%2F|%V`Vcz{E&}VCt$f*}7?fF* zJJFEwwI?%+n3AWe6?1k|W4FGPa(%aONi3v&u6mU+6&gg2Ij`yl9>QicTjNB^ccU8i z>NbIDgWr3W9*PpdrzY;x-fiAJ*?t2d%7sX=DRVKtaeXG0OG;{F8WUp)_(_OCi2D?B5b!@WD$YuZ#<8C(?!^!ev1U6V#H57HJTN7O-F5Z0YW96&;O@?W?NV*i=+fMAE6nHX!j1R1z?L#YPpK z&ty8VuqDq<$SdDd@o0WIE}&#>YCwTa^H9}bX=w>}8En=KA5aeq)@C`^O40X!-Hh`{ zPO9_oJ>l)MdCLkaDTKcDm+I6fLnHNa^1rYEYvX%gC((QS%zD?;M1HWwzFhL$t~%#s zGGJ3jspla-PXmWivZLgD~?F3+w2nEsI3o zV)7W;0(i@I?2> zCF@q;l53v$NRdsMvbFpIcFVn)pjbMKW%Z>2Db^`A8XbJ$dZWZJlUU< zH|pFDf18#BkwDC(iJGvjGxa0G`y=60>1N&}KdB0uTG*cA(NzS>gM$E(5^cDH3PMSr z_q$M?x`oJPw4m@FjpWDyb5$E@bzl%TO*`w)#6ix-6mlw=sTY_|M z9v7Monefx&4V0kSf}r-e_<|e)61Y@iBi|SwXbu#k45mBM@eKQEa zV41IPNgz|2qPNWbVfwI77N1yVSHZItXEZ+znkh^@vcg1Ua;f3;Ceyl6>pe27a^(b* zW-mz>J*qxaF#Hl6oPd)ZdyhmmE=|y>y0p9;2yeoTi8irS6}~~j3&JMuxBb9nlYH&I zrBP(Uv^lOw6rw_aeMJn6Dp5aDzIBu9ivlz7BQ^dA&4T zY{iD(!p$CJ3fTm zGW*FKxeaE3R>vYpC8Ylm8{&EM;K*S2&v#$w1B#6eQYi;H%7nYtlY7n^Nj40}OfSaD zoGtU81(ZoSSB7i$G;|f1x<bQ1Ruv> z0%O9i$U>2-Sx^FTPp)ftYR_0RWE_<}Py%QJ#7)|iSh+8{tk}6y@;)S&M6o;~scR9* zTLo!$CyNCV8Ay<4T=Ay=T!<=HvO({@Z?m_=%c(*ir7KoYfhk<72RuV*&yYtA2f#rM0;fSoiZT=*BuG4sm|-E%K3Lp=U8wGmA`f6V4jiGY%Y z!kT6t=7@AIV<>ruQQB-e1+5a?GGE1t$Y**~i*owrSw~v+8payN-!<=XyYh?d7wkj& zR(0=MW7!WJc<;RqBMukpG}n>x6LxMunm~d`MXL>-wnC;$>@D{zME=6=k6(YBPjg^; zc77xc8d;Esi~XV)56;lWo19bgsEpz!N*Q%+++W`z&CX5WtZ->lj8^eBAt>yu{@TG* z3OVwcOv^$iLuW%*L?)EN1pE3^8so{hS3ZAk@9aS-|CZ^7u2zRHYJ}N*p~RJLOECY( z>xs|{M`e-xrM>gwNsD7SbqjVD#U4uP8Zn=DQ3se@Sv)@YEC09zNBKnZ>AN+|G@jgd zkyzP|DMy|X=gRR1wi%q<>4Y422Zuis3nE?+M5S1XQZA54*Tik1 z8@(bZ(5dKeNyp3iwer(nF}1!}cFiLiuS29@ZjFPf;f z`HjgQXy*ieeP=9 ztlJwAz}7+iE(ZUsu`{xA%6uG2m|hjO$*Wt(v+hV7YAI~CwjHjrBSqPFZkK#twjUc$ zw+}PpL8*g-Q7_PQw!T)yW!mdJ8^8a#J_CP zwSq52;PRnh5~t&W_xF!!lRC=|n;_1QP8|%nET_p*A)WyIzP+GzT!kR%N_9()7P(4- zy@{HMg}3ulsoRz9h!;lKd!rUskT+9eix8#0Z&4joHb%?ZRyD>oN5Gen35_{vuVpYQ zev9uhEE-Z(EGvuj8XAW^gJ7qB3G6WeN*B*2UIl-T-IhmIbAfJ}PQ}ZcaU`=mqa5IpHW4OCr%dj>!5hZ`Mp4Un&|9nYq!PRF&WyMAFsB)}^n8 z`rQ!#jxI&Fk>QV}C7%9VORBLz;|HVLXS=pniRY$dBHN{@Yn_+8MBn1`Z-3rCe3^b{CZU)I ziM2k_D#=VW&M(+0Y3F#A$;A-No%5!&(mf4|Fpo%C@pr;e5kTbE(QTni*(dSUFw@uK*;9WW z6G9*0Y;52rAy3C4dT+$O5Xg*LBc)Ji0pZT2%r5R?R7#pG@)M918toUSua|l`J=f_g z0s@~mM|BQ-@Mr#-}}AQaL+>k*o5}P-ww8sg?*=*K}&x3Lw|&d3UI)L$e|{Nem?z%!%sruNb zXbUhSOAAXdz}dDVhfetIpY4kIz{oB~;e!jikd(db=ff~}ZtMns*5wo~hJ_W#%JqpF zuoVx{vJ~$h(7Ts;NcrvDIzzXLHdX-(s}r*zdAqXO z#if&8=3iKUsQu;|M%)6*723A$EuR{4%GeZa3|2N$3W#9%+$vmby}M|BAYz?P!0%JP za}R|WVnT>W@%>76>R_1&i#sRP*Ey8MY4r@uESXr zp)pryAEqMF3%#dITrSp9s);Pe@YZEaMfGDgDB z`VQF#`#&3+;9=MHel;jsHI>cCzl|uB6ZcrIqBK%wq;L0+yFIcBeC}N4*==CggDogV;LsheN-W@xN+;avhHSx+|>Y7oUr3^t9wwjufkt((W`lP51`Ts=|!AH?(voe%HD za3G!SI@Xsm$ zqi4tEwo!+D2fp9tXytMD_NQWbgHoUh>guKI1x{6VneJ_JVyX72ODVgp`dMZve$MLV z=KZ7=8S8SP@98Ka!GGd1Ez$8Oo4WJpzEniXB;qmUO0&bLXUml+S22Iv@5)$@bUQ{D znMx^`@0HRbr4bT{!SZDi3E9mMV%)sc*&MkaKH;AC{k3acIx@fLa2?Ol)aH5yPZeYA z*Hk!;td-y%Fbr~|M11*dq03O`RVl3%Ca^io`EKSnnU%enV2;Iy-!dQLvofDiJAI~x z175->vIE)Q%bu-0qOUD_PA2<;{7rz45&WL!xoBvS5I+?%SviRt`zD=Bo0`{ij{pNa zd>T80dr6Bs_>E0+yWBRWt|{Y`Y)h`k5C=0%&niM&SVtV6t4?IVV^CP~ArI{mVK(`xH%`^-yColEu*P9d$J zIqAOErpdBade;riepkP3o1pnMcUw0^NFld_9jBbRiaZlK!>nl*mu+k+iR-(s2Sv8e zZ95?#40-9mvh6ka2jBP%gz%h$h9<3RrJe;Vv#HpHCEl@Vro7sfXjlvxH9NTWVq=VG zC3)UXq|WcgaSh#!%{+@4RjmpA?*-?~dRpRDxIdvRuvp5F)6oV@ZsbYqV_epy8klbD z!7wxXn~igz4=j$6KYGDet%pvh3a_LmGd-Us z(Rt&a{fgG80YP+-C8PZA!4ge|C(X7x<}<^}Su#bYPXul6PKE~?Hf4C^WMB;V*$up` zt9`nbI%hOcZt%RvTy18kRW69n3NL%oAO`gB(xuDI8dQebDjHp&Xbx%fB0XiGh$NJ|x#vVMGj&(~YeSWKq}AGe9ipT< z=Lc$iO@c9eca56Z1`P4`pmFv3;riha-eG}`qk=u9gG918C1hrd_MviWNBMyuWp)gA zHih~B06##$zjIM%Zz}8GMb`68n2DLo8rN#`(c{gBPN2A(k5=(_F!E=}u;>kNs>Rh* zb)t&BbCHjJ2J)8?lJ?VY%y3;Ai;5x&MMSNRxLlqHF(Q}lXd}cE0SxuFMe@1KBh-_@ zW;X2~si5{*a zo=rvnLPRtv5ZOaV|OifAxs%CNI@W2x1Dnk7zZ z1Ll)^zn(ft9}1D2y4tVx8ec(l(23pADPf0R<3+_4{;m(Y>gFy&75KD%=|K6U@u7if z^Zib+aYx*#Ei7K8U9S}!6-BOwiuQ^d#D~TH3Q;Fqquo;>j8&nO9sdZJ znGOWY`2O6-_h-@vAk@c34f=I~-Qfr*atj1QZa_^U-YgxHV-^=#mV${4&myJ<^F}i@ znkShl+auPRlV;H@GTEAOqd2skZxjjoO-!q)Y6uf!*c+zdMDkcnX3d0UmLDEhKBp@! zc_e=1gW?DmJlBCk++b%imrw5G>D{2r7g5TpP;O3MPJWJ{(1o)@M!#to@p)yFGNLI2 zeGozR;ki(qqbMZWkfAXB9)VeO{FfAbi;plaA0Xv;Kw}Z_Nc%?>x_wvAqAfflHphbK1P#TlbA$y>y7h z;ug>zn9_az$`>B~+n)yZ+!_v%Yv)z_!{M^fl7ZF{Lx1?g*L}bHkA>46dDdVl>JPIG zeuL~$M|Ph+k32di#-<)ZiR4#1m|R0;iR2G4GYgjS^;pIQU1q@oF$+t!kO0?!0AIs_ zMDlQqFX8|%7;x3dc#iR)D?nF_t_XC9YIN1;s&F>7!y!AnXgDp()KI7{=I5Fh@Hq3? zXByLo-u-N3>i}w3Y0gLwUp7aO`}`iaYQD{$Ct5> zk;om(I6b=6p;GN^^Ar>dZWrgAY{o?~eH->pGlFVp zp~|g-YP`5&q4keH-0D9~GF+2TmCj}%|G(#@bQQ9Nu0leJM5DBp?@7o=1<~k<$D@IEr=vdcAdez^5CU6J1m%szv>7N1cJb*~hFUdq0o z7(U|Mwbak87C%=$e=N7$>2Ed7sZe>{)E{to-DZEl>2(u-Q0;Y_{6Vt`w;z?mNtxa` zRZP#EBCF~QsM}SYs(zJ_RFSBvLDixXW~%n64yXi`$cm}B4yzK$Z??0#7#N6oxWUxw zYxj5h`~5=H-{5cY3w!(r{FI6HJd`Ehe2{!PmZf(fzU`#s$k5%JVUqc-VWM6ta0$|r zy9Sd}=-m@Zu)NQnJ9Yq(B@5s(SmjvlToLVp>m2K%cf#$_2jRYGcS*eD zdHY_+o|1R$Z#oW?9JPPq_{7;?@)dk%|2i5POUBtp7tbI~_G!h7?3X(K?07o*n&Y+T zhmH@U2BX)l_6K}kx62g$>#dm?#YhrQAs&8STMT9CUY(hO+6>WHIQP&;iD&!3s8 z{l-ZZp}dnX0dh~j1c)$7;BV#pgelXHmpR*E2suO7&d4Uh=o81?p@!%{ZWPZf8HW1F zq?3F`4w25{>3D_-H58xN6P+Hko%m8*`NOI;-uzIg%(qNfH6z!P6Z-ybkw<^%I+fA& z{q;bSA0|IRyJQ07kgvH`)_0kSc>^IdHmQ6AC1wvLIkeC+#B!HPCjtJ=(#s1#~ zO+L_f4jfT|Wov4nn%t{vQO?&SD)!3T=wsF<@vp%j zPRlO5cw4bMFJD-$zj&M1iR{R0N z<^1zpuARsxAVdaJV)a8zF8Y_GNt7c$8etXznW0yJ0An9~(x2$V)Cknqv#2N7V_f?I z%UD|U_5NPN(hr`Sr?!L3at?UkH{jq~F%Fg}KlO7$apec?kF(ztz9}1SLASAc(0#07 z31?1Gj4Ng0m0oy@0ZlP710gyZV`NqZfhv5Bni|xCbkNodZ$6-{e3+;CRe`1<2}}>` zFOAter$l)A%O7}<=@U3{DyH+gRq}=GgF>q&Ur0|6Rdz*4R_Dt%Z{r?ZAE?#0cA3K z(SNlq4X%T?KqQ#_+kVo_4CtyQ37>^vfjVfEO?y);?FlIHR3hz3R8TB{S4nTCg5rLR ztk2t7Am_?VvA;h& z>~fN+=Aw-pPo^68AvKgJpZ|s5!<=h(H{BCSchiXpAp__efyBD%?6Z|kai>4Iu7ZAl z?B^5z{9<`*aqW`eH4m=5dqbt4zGLpD@o+94?+V|@3`1|t;oBcQWmzEzUmM@@;2Hfwa-5UQC+M|9c|0H@cemwE*{JEIRq~47_9lJaEaO@HE4f@g8!Tj_2 zS4zLjpUa!=lpFbIdkWJUQOIy~Ab?z9zctcE#Z!I?!$wOa>IN+!s?oW4 zEY?ONCx(o%zok{0&7>b8W-$+(E-SPB>=4ULkZ=Ra|F?na6#A@YZBGS*0orP@AVhI? z;_%p_J3N;4)u_n92;GNa1sypmcOVVx(Wg3?jw(lJkt6qkBecl1xm|=7U1ZQjXwmi6 z+DD#7Ug|Hb8uB3M4O#LwlA=zB#U>p#;m6F3j0tgYteAzUV6RV}*<;b8fswuL!*or& z3t19%R4yq%srhm!8jk0q#R@8i@T$<3t5DHcNo}tnsujS3wcRn@qD|yXoCE?PEc*^S z>nSWwk2#6pz}+)P<$6iBVo`x~34s9%z~5NTFvY%&VM;D%4ImERMD~Nj!+~~UVGa0+ zb`zjel2s<8Y}HA*omf_NRT%(G1QD|R|08P_+#0BT-aF44ubKPeT&<#-LvkRownhlt z1@>3;+gDER`}&he8T!=D4;DEB{P%va|E}&U=-X+8=5GElnK!<9)2^w++#UCBk?7B( z$3MAyzXRjz@pJ!bFk;ElML$I7+-v_r4q1^E0yV9M6qPn+`%oXv+q$RFa_v+{SBH=B z8@4Okz1w};{U)Q?XrVIG-G&>*8_hRbZnlnuM#3Y-k$1Aek zTrpS8wO}P!4c5S=k~gR!HJnc8D;J;(=!T)>Erm+qQe;teQEjDpWoCo8$-G(Kl-`sL zhEbUISHd-a#|CACcY|-B{nE;%)k|xac5LmmFrt`ti2ig`RJ(i9rS38Nm}773OYE15 z50xG-PN%+`c_BO9eWu%a5!dCXcGCWX=p{s>-Kgo2(ag1n%K?9IXV@PKJrjhHs`p`M z22-nKaY~XUD`hN(1Wy`M6wP9dBvodjDe%-FE!0*;D4alvDHPS@qV0Jb{kjdQwu83U zZH#S--g7+sx1p>Ik$!lC@csgNzVN%kIn36z6*aB!68^wY1+`GZ%-&G=Hd;>A(Q>3T zUE+h;Q7nqb&O(6R*z6c4B3&*Mp4|*E0k50|@HsVaB_h2+B#+|09{v?8v5r(i%<&Z} zZ3Twzz$>?+_&ZE@UG8xb|>e)@xa%-NKY#JVuk*%6sEGdlbDtf$du#huxzP7-{Pc#;{X@+gE`oLP0*ovU0kS|LGIzSS zqOJ7S;MUOf=z9A4;PoM{7->ZMB408-=zrY!sGp@#FoapQ9BJc$lSf%4N`-0J%0;H= zY0bf-ETwrY4Z9VCm450V1i8>D&ByVC=kkQT@`UH|Z60?x8v+wA|Y?Jj1i4G_i)4 z)>m&5pa7;FB>xD!iA0AxMu$Q&7gna&vqy)+v{|+h&L_{~W&9v3^M=8MZarSW^@wGL zjXDfpvnE7G`05SMV{lxY{VpKouWwIPSF;J(xOVP)8)Ds^@1Jdaz)!$` z?qAtm_zBdROU~Q(j`64~op8drfLcH&=>T8y8$>%TaugWeJoQFHo;`*Crcn`M2fVz= z%t{=oH&HUxS-VAX)Fr(5K@H*fDsIQ24d7OL3wJvBT5&Z$VA#Sx#+wqRESD2gQp%C? zrTv*yvfN>+`>LfCrlsr}aixEQX$!lB8xXcgTYOte8_L(3cCf?ZHNI>7*H>;f+-$m; zy;-bDs*_SG=#ZxBNNwA@Kpn1Ik0bFZn;8`a<#ZrN_A^ z_$S0Ce2@FT8F(W2Sn&vZggY)w`6f$0Ed7c5llVdKPwMJxidUAdDevVCUH;+F&hW?b zhAY`Cxodc44Zk+LGPR~?81Qc{UR+}O*?w-T$QW2kz^pXjE@lGhaG9-(d^0dANZEV3 z{UttN5N-OM_1igCL?TyD+G(&IG{9x`1Ndt)rFz}3<@i8=<9Q)~d21-dQ6}W496qPt zkt(MBDZ7M^k_;vM$$GiVU!OWRa>OqR>eRWNnzO{Qsw9eSe!R8c7YKxSK_Kd@KY#}U z#URJEfn}srESp#sz6q4d_+!~&Po`2B#8R{xvnEB2RBApFKYwWJtg&}8l?%otu&Q8YW zKAM-D%X-jzO06r0#D7hx7$Z8oUPqdiV_nreG9Wq^bSD-W*Txgo=-ux>%UtonUmLFa zxF->h$4hO|kI%C7p0RE135VIvneb4$vU@g6zjJ5FgVn7#@Z!hkuA_%Aj$tW12T#!; zd5C8W#sovltSLbuJMZ!M7$5_!#^}_*zt8~K%n7{Euzi8Q&OX0b%n4uTb0Ebu8-p6Uo0Cp3kx=a8bhB|*S4tyasysW`jvJzj(uZ-9K zajws_17FLz-_0#I*ykRm7^oJRp(}yz05(Xom#})zaYX)Z4j$^LjyVK^0S3FCyJo0!DyV4 zDq!Oh?RI)&#SNR_&%c@k0f{?jH5bU$3fZ<&XGzQEi88M8c$Y$j3K`P5QdQD;d{9XX z24QW(UrAHvexZe6BS|vsR**tQ6|#jQ$3tvy&OjA0Uc>WzkT^B6*^|XtAd+8XPog6J zKtR>>^lRDd3HcW%!PM^8c8Y;dRcQPA4rEuu_3_5z{4s&CXYISFU6p&O`^Ecfrl8&3 zEjPv+20pOXxYo2xUDmd?TWjnMa)O0bskT*Ujj&2wRa?`!q9l>a&^bjJD^{zXfjiihLl@rk%Wi=TMGW4$5}>Z(HR!?vxr@C!IF>Z;CXaxEDJHES$P(mst|k8N;G|M5L4XQ z+0%pa%xGg~45RC;t*+1LqAvChGZLZ(2WE6%yB>qOqSh0L8XcWo9bL4E=LC*6McULh z+Ef$kDrE~g0+iih4Vwd~E!tzO2dFNts-jv|vvb5n8DO|x*;7#H_lYmfRh;)EcNU*&bwwENu zLm6n^0Z`NC)Ofs^(?$8?ycijvS)!>mUd!sL8ky;@WvAsA@U#bBr=zO`J_Lggf%k)b zVBe6@n21vlJ8eE?X3dy?9Ph1}hvMH` z(~M9AucDskJv%t2>#$=Do2O2)0LkP^c~wSa6Dku@kxx(plvfd@0Ea(?4G|T2MSp+_ zn*3@rAEFt?@QF|0DMO+d#s&ubM_d#gnc_T?!!*nLNu&$kqE`?n=My0?{pmKtWV~Xt zxzF2LOsMCchyUv5e{=tn{f}(2s!AYZL5_UoqxEfn{ntBcwG{o{)4%`wvtJnR?q-gD zWu;G!j?AWJ|E0b1;`4`|^E(p!%1(%ogW_qxfLukSdd^LksWNDm?6Y;65^hpvXe-}8#4JS6@@44 zF>f}~0mlZzdgFT226l^oOMt!Fc(ZYw8jno+f1sXH-=O~8$akU@Xp^!rusu4Y3M>3DeF{WIRGs5jmm~C-X>TVu5e+OvD_yD)_n;S%2t`^K1~@G|oCS zT9>_!FH(&BG%TS$X`e((MVTs58Z|_XP!rT4YMOe3;$eWMp18qxmyhoEq5VGOn?jOi zKVw3aNjB-p>qgU(wk1!~pVf^h5EVN(Haa^xczTqOUN+m9nHePl;FVl2T_iaQ!ea=+o}^?2biy;o9Cf2CgZXe8b7ahar=ODRO{d4e0A!t8 zt$ZZH@NSX<%(F~ziVGYbX2icte>7oQq-#~G(%#B2Xr})X&WM>MvpW9DU0-<%p~*de zSI+f>Y+^Ke!Hz{2e{JvO7j;(ArANPyOs~I!Ec@0aiV4@v;n3>KzxIvymlSRTJND9Z zrwvBT^TJe~9$SEy5=9b=kTxlV1Ua1?329Pl&`nsNTU3G3*?{^~68)l*t?}p|HA29u z0(+=|XCU|mzypM}h3&u$WrxOF=#3616~~V`mtzPD0$y0e3u>aC*D&UpCZr7EF3l%# zi5>4nsUpL`u7Qyt(t<-lIv5u5VMI6Kif#k2KzxQyXjOyNiq|xJqpHP1nruTZ&a}~F zDi#QzJek$mB?Q@IfdRcXIC!!#1J;1ofFD0i6|u6vVnwwG6Y9cjp*mE&({QKpQ-<;4 z!Qyn0)r#Xqnku?8uIxtRMs7p)i!8g6MQX8ASRrf@zGQeTbD+ph7tdsARi)I(Gk9)@ zSTZl`Rr}P-)T@MH^>%eXwO@ULeVTnCBPKXUQd(>eIhMMDN%!JFD7Z9?cM}ac7rATU z9LnXwj2NcGh@=AOvAc%cxHa6i!n7<0c&e*f9dAooBZ?4)7SGH5=IVnzT;;aLM@U zFTU}|@88yk*{&~ZMz*{);`ZmoxibY*?-j)@%eEaF-gfo!MeqOM2WZ8*Z~ismzVE;G zwG{zdbo58)m8B!~zH46m@jn6OLl)Y4<`Ctig3ROs%1?1_ENLYxCRNHpnr2+4tE5p# zr68glD>pQSZz$ow(9vw*Yo{pDAGfg(DNKWNWfJyg3D3scv4*L0FOxlR=f}rk))>m7 zNZ1Xae-g)s+rdFX{ul@pPfnkQ0YTR|bpSItMkPFt(N9AEMLohf2Ba>tDtm}!D0Ya2 zDh1yxqb)#AqDh9Qe39QrVL$eug}_+jwG z;9$0$oGU)llf*b?->wXLho~Xv%Z$;h1~9}7)ZJR39)`0LmaMLFVGulFLW-#>8D5_$ zRQ)C|zr}Hxd%I_=vdzaLhBvW1CmCIi7lyOY5uhS^7U1 zhkb}0;zsb*?d8AAzGyweV)@CM@1_|Z=93A}r_~+&a(V^d7v4Z`;4i1g=)I1;-iI9D z;J+bEaYy+>!Vl?R({D&;1t)ikMHG9ArAMKKdj~GCL#&D2WpGj@w+l|yVXxb_yLP+w zyIyx0TrU4V7?1(N2Ap*Rz-tFIuV^dnb-2fu`Vl-4_NSaX<*!@aXs3I(d!L(epLIIN zAslOhqf6XA?sbllIgP_t!X4t?;7r^T7MFqA3v|WgG<(Scc{dCc@l-9$84I$&neg~t zT9$;CG%*uaU)Ifz0$>^)#LW!WQAi5c7?4zU3=0s@6Lz|=o&f4Qcne0yi1C5y>VhcX zC0iy<6r$Pk#No<|je_BLx~F#x=RWks8dnqvR`=&;Kr+WaJo#KwvSl2s|5my0cx z!eR0>Ge>j@X$J`zk0f-%|Ep-njy+rN$%kD({?a4w{QlU(FU;;ij~iw06&>sEqI-UN zfHOU2>tRM#Qx-o?k%w{?Gs>K>7yv-cH^h1EWLOESBU3{Jj`n#*7C%b;Ljr2 zVnUoHjX2_Qx8rB@8_fs6aKHMH>!Ad*lvygR^xnhVBN-nypkjV^WWqGT z?&tRNUzNXVJCx^T6XtK*GuyLtfU``7xX-nr$q+lma9TJT+8=s8M2Bp#xCdqXvBF=< zr0q5n#|ko@7*ptyBm1zDKSjTH7-h0kNY>1$G_qT5^5?8p6aykZGBi{rZFjfcHX3>x zE0b1p2O`x83xcV!-7;dCww$t5K)?UwDKufj;GlO|kE4{BS5_^FVo3OrXbx(>Bw5 zWP+eOH7Z#>DeW&}6Cf=jTB~4fw^`=^Bp-otSjlx&T=U2?x_Xms{%+u36ui1RQ=JK>20UBy|L}gHos4GRpgqp zBfQP{7`M8k;iue8M`X31@-DGM+M!tz1)g^}oIE!kNA@__((G97#o;kJr3SQ`Xcrs% z;|Jr<$C>yP`s&dw*>S8^;!QO(Y-`^iIT(39!bF<;kQVO}!P{!e#A>t}>Z7dI@X+cU zOu5zlPUM_IoaWfcq1_zr*zjSvn(3h>Xvq{))+Fz0q3A{Z-f=JOeUAP)Wx|tk9o37! z5=^Z3VsvpXXI=LlriA5d2(RnZI;NzB`&)qN?{ml{b;r%t5|DGO|wYQ^Z`&Tln4 zFq+g&>bBB0ZQB8S&yCw)*MKNhw^{amaXDH}EMCjYsvB9|Bkq^5aG5&y2hB$Oc@h8- zH#tZ56#bm$c&LFI(J;WD)?;;y#aJl@!|lrK7FxDE%Pi1=(*x8Pj_>5 zK7tMYG9-x{m>)j7)VT{6YKestLDU2W<_pJe-@o<34?a=Z5--Ir*uApqb{jB^fmeVq|ABSc4*IzTk~`R?0eg@I zn?S_0pv2&_LLA=;Sj}MODPSQb`mJJtsh}i4mWN>=5vkUac@!~761_1(juFW#aE$!a zxj#?BDDJ#ROn~{;OvaseH7kJ($VsdopID$7Z>id0;@8L;|6;O=4+@90B?STw z1Of;I0vd#-<&X?DZHY=(CyJ2a2pNu$;RwE(GlZw%&L1Y>3*7nOIDD7ScXc)~1%VXJ z{z-t6_$qX3Bk>Y}-=f&1Wokm#5Y`5)acg3{Yog0=sB60GR2P#qq5iI+t`Qj0x{%5# z>5y%Tv1+!qd^(g|-6o_%^6F?L9ZF0w7OfDiB@2tIq1sZUCOar{l^FTiY_i~0V*G@F z4hhIAj0pRMmjr_VtT3LZBC$d^-=81KkK_&G`H4JzD32idb2@)2Z^#dIKDwKvxa)~4 zfU6fKu*@`iZS{JyDp?acIDG*lXNvn10i!p7SkA`=0X#GX< z5n}a;kZ{O|Lt%I<)rfrIAt;>$r+_9*VpXQj{p=WQ&6|~$6vCZ zLOHVed1F?|jERsn9A|RPnr3J5V!fkzJ3CDqH83I`FwyX%6s1PmSO;9*ds+bYtb#i9#ljIL+nbARn*ufb(=XIvg1jV^e$FIk)@JX za!lY$sZ&&(N41dsSSaeXf#9&pXts4>?|lG$sHDO$F!5WinXcXdKR{R)EmuM^4v z<&0uf4o44volG85T$0pp#jOsxF&cn8<@thsy4b`MLpRDlO_{jzaSfjYYjZfslyEe` zbi+6Emvu+xslTIRzTO|E{&c3NCzI*z`M9^dcy7s(f}dwYzCg-?oW{?<7rmKG&s=0y z-Bicq?(5x%KJtZ}>b1s3DEizLbIZ{_<33E=X>?|R>=089qV_q$@RZL^0@Ej*CK12U zBH~vxhfc-%3=m-09G*HiM|Q!TcgZfe^DktVFzmv^E@8@)P6Aa+DGkh{skGbwGnp#R zoCG_l{PM{r@n*9v^3A@0wY6hk@gb8JW#M@=I&0?aVa!ssY=3ql`?%%t;DM}3#UIAA zjEqN4Wf>orN~(*Kq0~|@T#{*{!^da5el;zz?kQx^;9VmUi+|a=-+>%pO6<+(#GtLH zF@>zh5`t!j8Np_Yt5B5^mn~ z@_>6&4<=Z57SjlZiC}JR=(F*V>7;*>Q02_n02Dc>+Xx7>XPYG<3FDOmA&WH_4_Lzi z6tegMpP`n%}@+0F6IpQS(jU^YUi z4N*3VGDw({b~1ljKxt^@sf1UObiXI_Z^wAaOr`?!Z%+v(QeH6I1TnMO>FMe74$dY{cmeZa2yQBu zbW;%Fa!*_9;W}+M$q4^{fd7IpAx=nNwmxk8vi;%k{`wI?sC()fi4Vn)u+&{M!v1T|NHA?9@WHO#M zPOO!MQ&_*mOHjjvm$E_{*z{qsE<$6gTlI$58wh!M%2sbi{5L&$Bxp`VvdSd!eUk)U zPg4|3ai5z>rby(RHz~}gDYnmt&e=fQf@ru}#APzEtb=G{l~%1H)GBJ*-gzGR0SoGT zd$q(x66iCRe01?U?_Aziig_=XTaxgn=6>xhteYz=kGe#wMfJHdHY6KA^TFsZmf9uB z8KhN}F7*6z?w{_66fHt5hFlI$1zkONYM@I&v6xNtL@s77+`qzaivo{YgwdWA^C%bk z+l5%qgP{(=dQQoN*rwf+a2rIp4U#}XXhuc+hUi983(iRZ`bbd3)VW_BC219e_!a$NeFdr9pgsz>SVic&0sPJdB4JA(vO7)w=6FRpdEr-qF$TL7J!EGvpcZ zOn4694OuB2Vpq4JbjXy9wn8T0#cC#jLNT+{Jd7SXRqLrvNT^>zL(+&eAsvv;NJiS2YnfRq5vUA7JVQ54hV~Y+tq#*nqlX!$u9ZDQ-l4 z8+UHpy^-0t$+V)Z#B(Csn=|UsKShv|gM%2@%}&E#OGwTmz7KVqlK?DHC*&+?Um&{7 zyqiGl#fQg77g-~_VdExNDX*}RxnNU?OI*zo#Xd{MvYm^`r^V#c;NXP6`2+d3vvbQ@zzs0Cwl%kK=a1yuwQC2qG^dnpel6oOCkws=id^%_Mgtf< zrt3rIH5;}(Pc1+97PSm7MZA>Gy>-;5cojwI(*H1<4OH1v1HW@KO#l}}`+6)gSo|6O-UVqE3SY9qE9$^5ZU)dImlvFgL9)i-$sHRyv z(}irTtJH}`IuCWyoiOHJw|Q}F?b`6V{&n>Dx`}l(wN73~ufsF`nA2TdH?(D7ir$Ll z;BI9K?YM_P;`z9zvtVmDtv9``pkerHkpJt5P;5odQ}b4cmK~xkCRxq#Xd)&>0?1-* zv&0wLA;zddc;yM^8=A0*UDjUox{WJe=O$j*@!NCFsB1^ z%>N{cV*W4Ye-*~CkpI;P|0@w>Ue=RpIjcJgjHCdcqQO|2BaEzBUxRQF&P@!B%?uk7 zALDK@HFqn#*bNr{1Z?i6f@J3)IZ%)sBA6z2#x#NO=@wK^>tK;|bk>*#jwrw$X(~X+ zN(6h@jSD+ ztmr1*5aMqrlRi0tvVMGPj3d&RBm9LUyoPg=FdR1-a&s``cGs#@kZc(w13~g-kX$H< z)M+u9G_WApBAu>P|F>pGjFP)+TBgR;fNPX${k5UmNNu8K%o~tK`s4W1p_=JX?Np6E zR6|2}V7kTxId?i_)lHD;bSSpEjZ23ttE0hmD5{$v%gM~*QmDK%Kt_MuyLjec@2IOq=Ixw&Eo+VIFqADNjn77VAEr}50RQb9Vu zU~UF55Y+>1382*VQ5iz}C7%Ii8+-{J%>jc3vYEjX=R`S9=@M8EmDH^(=fiDy_#U?N z!Oni5LZ87&Xw)gm1VhRMKpF_%fUdz1k|aHBhKM{MM=bNGmV;@o{EY@B6 zF!37DDOmR#h72Qy3Bw_S$?z_e`E6*@eypC&M~Xm{I~cXIYYwH>uQ}9z@z$rL(5k1x zhEppa#pgnF$(D6V* zh?^2Nt5cdk(X#B0qyyF43b>UL#&L_5Ic#iEGEyiRlzA*`nEQqHi+Y zF5GUp-F~b4Cgr98H#pENK+gwcTiuTr7r4?y-IWHuc}gZ>loZQ(Na+YpJfBLVJKI~e znL9k-Z+F_8-Yl9r_3`U(erfkhw_m;Mr|WCiU%3C1ANlyTE0}{{-E;7c55^z4|63pb z(=Ce|U%m6ixnCXl{@G6tQS`Y#&8=ph!L*p9>h$^rw3zN8*(L2l1{!d+fVauvrBo*E zAY9#{lH?K<{6;O@NI1DVA2F^nsjS^#G5Ma+3m|JEhCzk6rDMRv5<4MJ5x!0#Oud+A zV+1)vSonuR$fxBOFsm+pC~op;s{PytM}bh=1)y0H{3r-L-T3SXT{{TZb*Q>jAy&NK zYJLJ5RlHToWJyxUYr!WY!r8zHka%)g=e1})UhGseU@Qw%|8b!QsJSk$lDElwZH9Yu zs3+IxS(DqAyUuo9?gs8Q+ikhKxkuQyxj*sdQqPvkKy|ok(0WjjV^V3m1H(J-y=@K* z@{&<18R<)gsHL<$n_>(FxdXwO&@7yjSFyC0!@`6>4+-PKL4gt8QE6hz^s8z=ginu0 z5QH7;p~l9@P&Wjh6LpKcVN8!Z2L=oFYR|mAnz6`$!}J2V#Tsko;?;zdD8*}RyNZft zysGdWDk_Tw^)CwK5>GI&-6M!Kb&$Ao6Kg3yVbGfZNQh30^1Lg6}*P5U#zlKmN= zTYm;<)@SvFHpvXi6IDS~lKpvF%a7;3kvfn!lzgQ~Bh!`blQo|f>C3FlZn5_J215Oj zt(ooFo$}?r%Og88cgmx_-J#LQ?(99jzsi2a`bFPYLSKx0Df89rm8_#v!p|8vS}0WE7nk$iTctAE-M-jDlBWV z`2AEkYymPYQeiZK=pi(Y4k89|#DeioqAa`mUG(#=mt4PdF)kAO;aZYwMe#!R|7><} zOfULbBqoEI#w^gUy;T`liKQH#m?xo9DFpEY>kxAMX3ZPu@mxRSm>u zi|Fq#V))K?pPsJh-hTQxro! zvV^1ohM`!j`EEBM&4f&aa0X>4TPz$7t7u%EP-#k)u_ipNo>GnKQ2NpNd^%m19XmZb z)+`(}HZy2zW_(i%9DrjOkz%%Z*sXX8nJGd_n&KQsu4huZ3aVEOM6Qlj-a|{9^vwId zKV%nOd&6y=E32{SW|!TSFFDK?UNDzk-sTmI=BO{66p)KK__Loa$t63MIn$TTty-JJ z5Hsc`dg2ua76o+A%#L%X>3_sDRW@9=fTofaLQ@qD5G0L=cN-D!HnRGCTvCGZWW?HH zX;u*C?eM*|%yLO<#9+@F(QQUFY(&O*5h0Xey|;wW6(JOgt3EX38}ZRTJgpih1_v=t zE8-S6gOGRtWQ4Kl$zPn5f1ykBc?xQeSd*L~;||#iMmkew^}~4WYmDf6;~hrY7|*av zLug0n#tqK5=5OA)g?5 zj?K)mG@tY4XuG|jiS=ActSim|X=~!k^59IY#Alwea;{9g?&i&srb&pm)_^x@MW9b9*deq zgEdJSV+j3_Dikwiih`T!`?%MuKr)llja>;iRPEcZBx`n2S%zfGGIP$%nHi*HUqaUG zS%#z#lU>S^EG-m~t&)(eC3~wSQIb$-vCF=Mr1Cw}|9#)y=KR0!`sQ-E=G=4N&vW0u zdwq_%4!g+h`fG2_UliWZbCPK;Hr|w1`_AEKN=_LiP?yY`>w%Y4y~J9@6e{+_oJri# zJSUMYsjsWF!ful9cT=_e7UA@@WVQn)X_%b zl!3d#-p9LkN+T5ZYsn?+&hdGv&OvAT+f|<>i6TIh4N1p z@Dsc{x5qIHzSrIE7l6qCv5wTqcMl|Oa2;_YTv z`l6r-eyCAq=|yuty9a0g%MI_|$vS2W6uZajT-Ik>ue*6z7c?iQ^&CW7)vh#JpE zF}-@homE25#xQnF+zIC`*fX;ExAvb>)|qtSNNBNoZ^#f?WBM$TGBlZgsUekj|L3pP zySf)uEEj^lyfrWLlOJ1sEU^ESUBMuui>~dS9pXHNCx@!LVl2qqE9A|**q`7#(eWCE zIG(483C}FE)rmQ&&r*4s#}BXA37b1vpVaS1*S6JU`Wpp)oG)9AI9$xRs2e&m_1bSCOjhgCfJq|jpr4GrXvCr6 zFQR+n3*M;M+|uZHCeiun=6l5|d#S@Sdbw-4mzh7jO^xSLc&7-dpO#v_fBEW&%_XL0eWCu%@@CFU_of{h95S>HVof(njnn=^ z%bmSezmw>8gC;neZ@U9!E!*NS5*i|tY?c{)Txr}1!0NM>w@ z&6ZbL%DQsJwx&s3on{@Yuj^foJAfo+rG>P^fT?;@7CvfT4 zbPL?=T@~i#2ofshAPfF@AE0#FY2F~jYdN}9y!PO|m7j-yBuU<+%B8QUSVww`hCMpM zb})3k-u;!~L#MX^DYgU_~*!~?h zarl_Gn?3}LuzJ)B8(NQ?OnbQUk}{#?d-`S4;kms#R@(`Sg{`A*YsdHKN`C+FHHsli zM4MCIb2`ZY7q2Z{=>sxZ?=?PnP@cxc3S3>O$dzVJ zP7Pdsuf?r@Yanpd*@`=0Pt(FN?%J#|iCZUfpStX*E_~s6qnUX`Q1)}4clxDw3u}vy zRt7wzD2X+<=av?qY@wuG0e|wWC`T@y5k20SZlA08yn=;0?Z^e0+m?$b7EWC6zlwnW0Id96l=r+$Q(fEF z%ta&c7>fDK+06L|iVw52k4Y#U&(rHUYUQQwUT0Uj&+C$I-8rqrF4rA}w*nc=J$f_v zY7>0w19HEy4DP-kdMt!!$$wk#{aU!Y(tPZNI-|D*lXFnUQWEQwak?1Ou%-HCyOOBc zqg9qIbE?I+1L}6#d(YQ?T3&Hdi4GR>fVQy{E1@e#`1YJL zuaWuk9apvaT*YU91~0}bTtW7>^%he}cdhc0I71qU1+||WeAUSlX{Y@R+8r(ywy}Kb z4yGRTf1vax%v4BEaSh+IPtqmUgNX;!{yFMBuI@9g<&?`8qVTw2V?Sm@+GHu;N|^O^dLlx_ zUNorrIY;4?x^I5q{&@VRk<9&VyQd7Jj!m_W4zdueufpvkMc1M#V&^I!Z?XRQ*lVk^ z_JI-d?90@)48(9CFsTDhySgCD&GJr;%3+YbCDuqfU5uYI?T%y$*Ey}yv3$ilLtRjm zWXX`dp13!I28*~yl%ORkv``{|AxWI+p?tK@oBhZ61ibXFU(OTVeWgWPJSv2@DWQUg z9l`Xad`}U%raAp^O-5OUpYQOSKHWP=?|^Q3Nu9U+9+Lp&pMK*P=Jwo@c>Ad&TkC#s zyJ(RXYt)zX=dX2dU(y~9SJT`MMt8{m7B}4t3#`o>ps-AuMRBlY-G#a{k<-8H%ntH=QW!lo1>dl zf@gP}YhtV)SlJPLRLts});`&!mr>FMhghthelV7f&;7{Ftel}#q2F;iz+m{`c{k_J zm*EUU$HcQz`a&~9B#|9Eig$sh4~BDHXmr}yFk!~$rNq4`E3&@LZ2g{SxAvNV>Zn&W z+E1Pxi7bW}!1a;d(i*0>;^EH#29m)Ow7s({FwC!yV5t z!;si<#9Cie&nVX@=iL|MlOm-r_NtufCc?qn3f!~zE1ZfB30N0an7-sF$fQ5f5Uje} zg5#52fp@}(tagHWo}%_wMvb=P@{Nz>g;pH8uSAUd1i6Rd^J;kSrj)L;)ZObIW}JgL z(6(M^Cv(z|(d|-rH;&-(F^UC(br#L zk)bn%yV`X+3v#B-owEAeY(%V+4yIX~c2*Mui4ChYUQYgTHN)@kzn^}esaUc){NsMp zWj9{2xOQ2aV_mifIeMQ|-MhHNSHoBpyyIbc_QM+f7u%kWhS~^>hqF~xosEssFz04B zTVEt*#=L1FYM*~y!@4-lAHwXB42BaPmA8x}W^I=$-!~sAmpq$j_W02mN?pv6LhJm7 zsntHs?PZ- zEaH?s$}5KqCH486t@3rge%@6(lrJ%8Us{l2yix0RS@}9_r%;yL2iTs0{Z!ww zs=mK5f2^jZXc2#6N|w-d*}QqVA9lA5PjpP2*D##!WK+wGB8@$s9BX~or4KXRm4D2^ zPjcCCn(6Mkp0n0na=rRT_E}$T5KC|>o{^QEd7jJEUz8usn# zo#vNk=-TLz(#(9&g-2EnQE`p<@u`k|oeoFuV&ko+ybr4s2Dcx28mE1?oAS=OqJL*@ z)h7zaBg?)ZXDLNj#^AQCFZyr$dlv=W9=ek|=QP;I)fUG&Qj|;BZg0EjcW_oQ_*3_s zlLOb-s>9mP*Q}AMUl_5Ft}&0f`sw7-X@JulfJelQe zJ!8cu-iee842>nSE7!Zz{5G`CXGeV2F{3Kl-z}3rt@ONfzR@n1c;`;r;%FVm)CZ>I zkpbzy70lVMyF957Iiq$S>T z#%03+EmfRnl*JT|c#?g$EL8ag4Q^14K0rmD8dpdjfX))OI|)QjW;i3Sqvord4!_R1 z-fLJrWh$Q|rF!0c(e{ZuwW3KZ@WmN}KugOJh|z*Ns(MRliDb2396d3cS9TZS6fXR@oA8 zA!Z~nJ7d8|RdwRa&aWxENAz84jHByD92_5>d8k#{6`VA~x<;t7sp^gFt*!X#`Q_u) z-d&T6Cu6?xtX-Rld*_yK+8IXF#ECz5^-YaGbylmNks#6i!AzYeeSC36Z|mb2;xo!! zjrGm0vkF^9y|^lcJnIBUz1wfeCQ6vYv+pG1+JjzMF9w9zKa%|!x*^Dp#K1Al-S59) z$K;XO(C>bk{r<-<*7LSLI2z@W{zJBKx;In3!FGrCXl>FsQEccU--3{he~|Z=FO%=o z@))6BcG#8}tkfH_+p@rkRI!e@mlArmd@W3!0nd6=GmFtm^=y`1u)cFj{Wf(hxgkF~ zIwEKj$E&afJDIh*`Mvj;I>JMQj9)7!*jrfaGpe3nc{U++Os+dwGc`c3zs`5rU#Pay z?U3RjP$f;b;u|yUM&r}t|51hQ`N66RNpr>wm0bU zqm$osD!GzeSO(4|V=du{bKRz%vPM%b;}@#)1# z`tG{JCq@(dgU60p9=RbML-r49uP$OMuIUa4tuD!yI&%M@z_4D6XJ6%@O^n8Jj=)B_ zEmcxB_T>9>Jzg2g-PP)6uNxX)?w{a$AYd$!dW$Q=@%2G}A&KSV(;M$*1|`fJH@KGf zXgbV=<;=bqFq>-_=+*3)N={SBD(f4>Nq^XzxNnn3WQ)%8()caB`Obd(d0Nix^$!!V zTIl~CklB1GEqI-8#LV{U!lDw7zJ|)#x7-C4X7&L#-7h#^))JYyg=b^yJHCeP(#Q!U zUOzl_JSvtl=@)}BP|?#%Q2w%!eZcc*f=J))!8Pp3r%9XD@NAwH${jUD3r{ANukAvL zc{essF1?)lhA9Lr)YUNa($>}3@92$D)O7)XxKjgvkxc`A0UWxXu3i}60uzdxJMd5-Mp_N{ zha$tOXyoHU@p1Qb!$|)v28gC7yuFW7j?r+%0)rGSF*aC?4UtGxAi)q82I^ul5P|j^ zk0mJp3J%5)uvj|`4u`=(7#M~XumB%$LBQD17=Ke}SJ2-J0Rb|&qRC<)GGP7v0gQkR zA>b{9NT%V4Acz8)3<3V%R0M|w3ekK*ARr1j0tDm#_33ZE-@DUP#$re$GFTUjL;frG z@3sED>u>7sU1@8P@vs6355Bl$he03=g8!GPz^^tm%K%D$GySskf4lmvCQa%WCV%7c z8!|fjKR&U;0Jv#L08tV^{r6(2 zNx-JRk{Sd*mEr@^`lut7qCs)?a-py)8c;mlsD}X*h^i{)uZj?mZkO2R8G&VQoKev{ z-+Nu0>##D57=N{%(2}-u@Vcuh9PW|QH<>=1jCo=0p0M}ZyPvae>6M=6&xr`deVmf8 z@xCK^uMBHsx$AUBKQtz-o4W0$4a-NLNdvy%<29`ujatj5W_WuH6_szS6|Kw zHh5W_7XA{oJEXI4bm>SdXZ$tc!2?zhW8Kw@=MBJxjDd^io2=S`(){lu1eC4$_4()%uo6$(8+1lz-_ijdAj89p} zF169{+C*iwY*!Z(WB<|}#cy_J$M`0CxzEN@&7b9{*#3$&RI#O{^It`SRxLoS`~MUgO;6xTT3z_3oXG3^ zU2R<)J*l+fwBzbTTXUpBDxp5MTnv z74r`b6pLS+dkLLkrnq=BkW09(>tf6L;qI07Ej)jwzuOd^5e^=}$@ z50S|z8UY4rOUFk9U4WiOCZlLL2*T0x;qU}B4FO3;w;ql}gYM6LAuNQZ0Y(%bj7Rek zKtZNo4(rjZCJe~_`XzW%3vWQd58CF2Pw{KyD` zvIDd^dYy3qeR^3C^(b9%2%bcbDM(zemR9xYRcs#w%IFK^* zKEi>q0L@26@e%L<1Umg7ECHd{8NwoDG#?3!4}aPQVNo>#3xQFP9vA4p#27hnm56>lpbVN1Le&xof>AjQfkBHt)*uLhQTRbbGzJhE zZ3m3Sqhw*=VS1fmm^L8(i4}}T#V!QWmp-0>8EBnh5=6fqXdI|I4k0)&&(ZCRKzRDt zg%CWdo?V;3Uga44LK5Pk2#LPQvhWpwKi38)+-5Qwxk{>Q!m zW;{IxFlYhv{(y00R7}FOfTmxM791!VOr(!fP}xy2Ng&YX?LYJb6C(-L7hsr-%5xZx z1&69XWI;wlsJMa&1Qez)0i46=WI+g_@(3KrB(EAq#^^|^J0zyE=0ZhiC>J<#mIw*gDafl9ka25q!lul=GfJNy74r-|02rNV8 zIq0CM`2`Q-aP)q|!w@Q`@i2_42Y47=hX_PGD$nr*1e_fIj14@Ek&Z?nBB;KPM@T3; z@SrWAbS7d^`GE&VAbP(Mh-6eP0UZ=oC-EdOt^hg#X%u>f;FRF!|7Kp_#e|(au-k tCYOnq7Zrn}r6BFr(XabEV3}X1E?=sn5B1lX3!LMDx~w~QY8q*={tw^_{(Arb literal 0 HcmV?d00001 diff --git a/lib/build-pdf.js b/lib/build-pdf.js index 599d513d6..edd9c65c4 100644 --- a/lib/build-pdf.js +++ b/lib/build-pdf.js @@ -1,11 +1,39 @@ const pdf = require("./pdf.js"); +const fs = require("fs"); -pdf("odata-data-aggregation-ext") - .then(() => { - console.log("PDF generated"); - process.exit(0); - }) - .catch((error) => { - console.error(error); - process.exit(3); - }); +let errors = false; + +fs.readdirSync(__dirname + "/..", { withFileTypes: true }).forEach(function ( + doc +) { + if (doc.isDirectory() && doc.name.startsWith("odata-")) { + const htmlFile = `${__dirname}/../docs/${doc.name}/${doc.name}.html`; + const pdfFile = `${__dirname}/../docs/${doc.name}/${doc.name}.pdf`; + + const htmlStat = fs.statSync(htmlFile, { throwIfNoEntry: false }); + const pdfStat = fs.statSync(pdfFile, { throwIfNoEntry: false }); + + if (pdfStat === undefined || htmlStat?.mtime > pdfStat?.mtime) { + console.log(doc.name); + + pdf(doc.name).catch((error) => { + console.error(error); + errors = true; + }); + } + } +}); + +// pdf("odata-data-aggregation-ext") +// .then(() => { +// console.log("PDF generated"); +// process.exit(0); +// }) +// .catch((error) => { +// console.error(error); +// process.exit(3); +// }); + +if (errors) { + process.exit(1); +} From 7d389435067ab9ef656e89d6fbb519924106d8d3 Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Thu, 20 Jul 2023 15:40:14 +0200 Subject: [PATCH 05/33] Update build-pdf.js --- lib/build-pdf.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib/build-pdf.js b/lib/build-pdf.js index edd9c65c4..dfb55c506 100644 --- a/lib/build-pdf.js +++ b/lib/build-pdf.js @@ -24,16 +24,6 @@ fs.readdirSync(__dirname + "/..", { withFileTypes: true }).forEach(function ( } }); -// pdf("odata-data-aggregation-ext") -// .then(() => { -// console.log("PDF generated"); -// process.exit(0); -// }) -// .catch((error) => { -// console.error(error); -// process.exit(3); -// }); - if (errors) { process.exit(1); } From a644ea03c4aeaf993de7b4f06a230c6ecf3940a0 Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Thu, 20 Jul 2023 17:41:11 +0200 Subject: [PATCH 06/33] Appendix, Chapter 1 from V4.01 --- .vscode/settings.json | 6 + docs/odata-json-format/odata-json-format.html | 204 +++++++++++------- docs/odata-json-format/odata-json-format.md | 188 +++++++++------- odata-json-format/1 Introduction.md | 73 +++++-- odata-json-format/Appendix.md | 109 +++++----- 5 files changed, 354 insertions(+), 226 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..a8b76a979 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "cSpell.words": [ + "subsec", + "subsubsec" + ] +} diff --git a/docs/odata-json-format/odata-json-format.html b/docs/odata-json-format/odata-json-format.html index e16cfdb0b..5dfa5f7e4 100644 --- a/docs/odata-json-format/odata-json-format.html +++ b/docs/odata-json-format/odata-json-format.html @@ -127,47 +127,65 @@

Table of Contents

  • D Revision History
  • -
  • E Example Appendix with subsections -
  • -
  • F Notices
  • +
  • E Notices

  • 1 Introduction

    - +

    The OData protocol is comprised of a set of specifications for representing and interacting with structured content. The core specification for the protocol is in OData-Protocol; this document is an extension of the core protocol. This document defines representations for the OData requests and responses using the JavaScript Object Notation (JSON), see [RFC8259].

    +

    An OData JSON payload may represent:

    + -

    The content in this section is non-normative, except where it is marked normative.

    -

    Here is a customized command line which will generate HTML from this markdown file (named odata-json-format-v4.02-csd01.md):

    -

    pandoc -f gfm -t html odata-json-format-v4.02-csd01.md -c styles/markdown-styles-v1.7.3b.css --toc --toc-depth=5 -s -o odata-json-format-v4.02-csd01.html --metadata title="OData JSON Format Version 4.02"

    -

    OASIS staff are currently using pandoc 3.0 from https://github.com/jgm/pandoc/releases/tag/3.0.

    -

    Generating HTML in OASIS style requires a reference to a .css file containing the HTML styles. The .css file may be either included with the markdown file (like styles/markdown-styles-v1.7.3b.css) or a reference to one of the online stylesheets:

    -

    Note this command generates a Table of Contents (TOC) in HTML which is located at the top of the HTML document, and which requires additional editing in order to be published in the expected OASIS style. This editing can be handled by OASIS staff during publication. A TC may use other ways to generate HTML from markdown, which may generate a TOC in a different way.

    1.1 Changes from earlier Versions

    - +

    1.2 Glossary

    - -

    1.2.1 Definitions of terms

    + +

    1.2.2 Acronyms and abbreviations

    + +

    1.2.3 Document conventions

    -
      -
    • Naming conventions
    • -
    • Font colors and styles
    • -
    • Typographic conventions
    • -
    +

    Keywords defined by this specification use this monospaced font.

    +

    Some sections of this specification are illustrated with non-normative examples.

    +
    +

    Example 1: text describing an example uses this paragraph style

    +
    Non-normative examples use this paragraph style.
    +
    +

    All examples in this document are non-normative and informative only. Examples labeled with ⚠ contain advanced concepts or make use of keywords that are defined only later in the text, they can be skipped at first reading.

    +

    All other text is normative unless otherwise labeled.

    +
    +

    Here is a customized command line which will generate HTML from this markdown file (named odata-json-format-v4.02-csd01.md). Line breaks are added for readability only:

    +
    pandoc -f gfm+tex_math_dollars+fenced_divs
    +       -t html
    +       -o odata-json-format-v4.02-csd01.html
    +       -c styles/markdown-styles-v1.7.3b.css
    +       -c styles/odata.css
    +       -s
    +       --mathjax
    +       --eol=lf
    +       --wrap=none
    +       --metadata pagetitle="OData JSON Format Version 4.02"
    +       odata-json-format-v4.02-csd01.md
    +

    This uses pandoc 3.1.2 from https://github.com/jgm/pandoc/releases/tag/3.1.2.

    +

    + +

    2 Section Heading

    text.

    2.1 Level 2 Heading

    @@ -189,67 +207,64 @@

    3 ConformanceRemove this note before submitting for publication.)


    Appendix A. References

    - -

    This appendix contains the normative and informative references that are used in this document.

    While any hyperlinks included in this appendix were valid at the time of publication, OASIS cannot guarantee their long-term validity.

    A.1 Normative References

    The following documents are referenced in such a way that some or all of their content constitutes requirements of this document.

    [OData-ABNF]
    -

    ABNF components: OData ABNF Construction Rules Version 4.01 and OData ABNF Test Cases.
    +

    ABNF components: OData ABNF Construction Rules Version 4.02 and OData ABNF Test Cases.
    See link in "Related work" section on cover page.

    [OData-CSDL]
    -

    OData Common Schema Definition Language (CSDL) JSON Representation Version 4.01.
    +

    OData Common Schema Definition Language (CSDL) JSON Representation Version 4.02.
    See link in "Related work" section on cover page.

    -

    OData Common Schema Definition Language (CSDL) XML Representation Version 4.01.
    -See link in "Related work" section on cover page.

    -
    [OData-JSON]
    -

    OData JSON Format Version 4.01.
    +

    OData Common Schema Definition Language (CSDL) XML Representation Version 4.02.
    See link in "Related work" section on cover page.

    [OData-Protocol]
    -

    OData Version 4.01. Part 1: Protocol.
    +

    OData Version 4.02. Part 1: Protocol.
    See link in "Related work" section on cover page.

    [OData-URL]
    -

    OData Version 4.01. Part 2: URL Conventions.
    +

    OData Version 4.02. Part 2: URL Conventions.
    +See link in "Related work" section on cover page.

    +
    [OData-VocCap]
    +

    OData Vocabularies Version 4.0: Capabilities Vocabulary.
    See link in "Related work" section on cover page.

    [OData-VocCore]
    -

    OData Core Vocabulary.
    +

    OData Vocabularies Version 4.0: Core Vocabulary.
    See link in "Related work" section on cover page.

    [RFC2119]

    Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997
    https://www.rfc-editor.org/info/rfc2119.

    +
    [RFC3986]
    +

    Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", IETF RFC3986, January 2005 https://tools.ietf.org/html/rfc3986.

    +
    [RFC3987]
    +

    Duerst, M. and, M. Suignard, "Internationalized Resource Identifiers (IRIs)", RFC 3987, January 2005 https://tools.ietf.org/html/rfc3987.

    +
    [RFC4648]
    +

    Josefsson, S,, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006 _https://tools.ietf.org/html/rfc4648.

    +
    [RFC5646]
    +

    Phillips, A., Ed., and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, September 2009 http://tools.ietf.org/html/rfc5646.

    +
    <a name="rfc74932>[RFC7493]
    +

    Bray, T., Ed., "The I-JSON Message Format", RFC7493, March 2015 https://tools.ietf.org/html/rfc7493.

    +
    [RFC7946]
    +

    Howard Butler, Martin Daly, Alan Doyle, Sean Gillies, Stefan Hagen and Tim Schaub, "The GeoJSON Format", RFC 7946, August 2016. http://tools.ietf.org/html/rfc7946.

    [RFC8174]

    Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017
    https://www.rfc-editor.org/info/rfc8174.

    +
    [RFC8259]
    +

    Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259, December 2017 _http://tools.ietf.org/html/rfc8259.

    A.2 Informative References

    - - -
    [RFC3552]
    -

    Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552.

    +
    [ECMAScript]
    +

    ECMAScript 2023 Language Specification, 14th Edition, June 2023. Standard ECMA-262. https://www.ecma-international.org/publications-and-standards/standards/ecma-262/.


    Appendix B. Safety, Security and Privacy Considerations

    - - -

    (Note: OASIS strongly recommends that Technical Committees consider issues that might affect safety, security, privacy, and/or data protection in implementations of their specification and document them for implementers and adopters. For some purposes, you may find it required, e.g. if you apply for IANA registration.

    -

    While it may not be immediately obvious how your specification might make systems vulnerable to attack, most specifications, because they involve communications between systems, message formats, or system settings, open potential channels for exploit. For example, IETF [[RFC3552](#rfc3552)] lists “eavesdropping, replay, message insertion, deletion, modification, and man-in-the-middle” as well as potential denial of service attacks as threats that must be considered and, if appropriate, addressed in IETF RFCs.

    -

    In addition to considering and describing foreseeable risks, this section should include guidance on how implementers and adopters can protect against these risks.

    -

    We encourage editors and TC members concerned with this subject to read _Guidelines for Writing RFC Text on Security Considerations_, IETF [[RFC3552](#rfc3552)], for more information.

    -

    Remove this note before submitting for publication.)

    +

    This specification raises no security issues.

    +

    This section is provided as a service to the application developers, information providers, and users of OData version 4.0 giving some references to starting points for securing OData services as specified. OData is a REST-full multi-format service that depends on other services and thus inherits both sides of the coin, security enhancements and concerns alike from the latter.

    +

    For JSON-relevant security implications please cf. at least the relevant subsections of RFC8259 as starting point.


    Appendix C. Acknowledgments

    - - -

    Note: A Work Product approved by the TC must include a list of people who participated in the development of the Work Product. This is generally done by collecting the list of names in this appendix. This list shall be initially compiled by the Chair, and any Member of the TC may add or remove their names from the list by request. Remove this note before submitting for publication.

    C.1 Special Thanks

    - - -

    Substantial contributions to this document from the following individuals are gratefully acknowledged:

    -

    Participant Name, Affiliation or "Individual Member"

    +

    The contributions of the OASIS OData Technical Committee members, enumerated in OData-Protocol are gratefully acknowledged.

    C.2 Participants

    - - -

    The following individuals have participated in the creation of this specification and are gratefully acknowledged:

    -

    OpenC2 TC Members:

    +

    OData TC Members:

  • C.2 Participants
  • @@ -260,24 +275,59 @@

    C.2 Partici

    - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + + + + +
    PhilippeAlmanSomething NetworksGeorgeEricsonDell
    HubertHeijkersIBM
    LingJinIBM
    StefanHagenIndividual
    MichaelPizzoMicrosoft
    ChristofSprengerMicrosoft
    RalfHandlSAP SE
    AlexAmirnovmanCompany BGeraldKrauseSAP SE
    KrisAndermanMini MicroHeikoTheißenSAP SE
    DarrenAnstmanBig NetworksMarkBiamonteProgress Software
    MartinZurmühlSAP SE
    @@ -296,19 +346,15 @@

    -specname-v1.0-wd01 -yyyy-mm-dd -Editor Name -Initial working draft +Working Draft 01 +2023-07-20 +Ralf Handl +Import material from OData JSON Format Version 4.01
    -

    Appendix E. Example Appendix with subsections

    -

    E.1 Subsection title

    -

    E.1.1 Sub-subsection

    -
    -

    Appendix F. Notices

    +

    Appendix E. Notices

    Copyright © OASIS Open 2023. All Rights Reserved.

    diff --git a/docs/odata-json-format/odata-json-format.md b/docs/odata-json-format/odata-json-format.md index e4aa0b9bc..6addc7fea 100644 --- a/docs/odata-json-format/odata-json-format.md +++ b/docs/odata-json-format/odata-json-format.md @@ -112,54 +112,84 @@ For complete copyright information please see the full Notices section in an App - [C.1 Special Thanks](#SpecialThanks) - [C.2 Participants](#Participants) - [D Revision History](#RevisionHistory) -- [E Example Appendix with subsections](#ExampleAppendixwithsubsections) - - [E.1 Subsection title](#Subsectiontitle) - - [E.1.1 Sub-subsection](#Subsubsection) -- [F Notices](#Notices) +- [E Notices](#Notices) ::: ------- # 1 Introduction - -*The content in this section is non-normative, except where it is marked -normative.* +The OData protocol is comprised of a set of specifications for representing and interacting with structured content. The core specification for the protocol is in [OData-Protocol](#ODataProtocol); this document is an extension of the core protocol. This document defines representations for the OData requests and responses using the JavaScript Object Notation (JSON), see [RFC8259]. -Here is a customized command line which will generate HTML from this markdown file (named odata-json-format-v4.02-csd01.md): +An OData JSON payload may represent: -pandoc -f gfm -t html odata-json-format-v4.02-csd01.md -c styles/markdown-styles-v1.7.3b.css --toc --toc-depth=5 -s -o odata-json-format-v4.02-csd01.html --metadata title="OData JSON Format Version 4.02" - -OASIS staff are currently using pandoc 3.0 from https://github.com/jgm/pandoc/releases/tag/3.0. - -Generating HTML in OASIS style requires a reference to a .css file containing the HTML styles. The .css file may be either included with the markdown file (like styles/markdown-styles-v1.7.3b.css) or a reference to one of the online stylesheets: -- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3.css -- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css (this one produces HTML that resembles the github display more closely, especially for blocks of code) - -Note this command generates a Table of Contents (TOC) in HTML which is located at the top of the HTML document, and which requires additional editing in order to be published in the expected OASIS style. This editing can be handled by OASIS staff during publication. -A TC may use other ways to generate HTML from markdown, which may generate a TOC in a different way. + +- a single primitive value +- a collection of primitive values +- a single complex type value +- a collection of complex type values +- a single entity or entity reference +- a collection of entities or entity references +- a collection of changes +- a service document describing the top-level resources exposed by the service +- an error. ## 1.1 Changes from earlier Versions - + ## 1.2 Glossary - - ### 1.2.1 Definitions of terms + + ### 1.2.2 Acronyms and abbreviations + + ### 1.2.3 Document conventions -- Naming conventions -- Font colors and styles -- Typographic conventions +Keywords defined by this specification use `this monospaced font`. + +Some sections of this specification are illustrated with non-normative examples. + +::: example +Example 1: text describing an example uses this paragraph style +``` +Non-normative examples use this paragraph style. +``` +::: + +All examples in this document are non-normative and informative only. Examples labeled with ⚠ contain advanced concepts or make use of keywords that are defined only later in the text, they can be skipped at first reading. + +All other text is normative unless otherwise labeled. + +::: example +Here is a customized command line which will generate HTML from this markdown file (named `odata-json-format-v4.02-csd01.md`). Line breaks are added for readability only: + +``` +pandoc -f gfm+tex_math_dollars+fenced_divs + -t html + -o odata-json-format-v4.02-csd01.html + -c styles/markdown-styles-v1.7.3b.css + -c styles/odata.css + -s + --mathjax + --eol=lf + --wrap=none + --metadata pagetitle="OData JSON Format Version 4.02" + odata-json-format-v4.02-csd01.md +``` + +This uses pandoc 3.1.2 from https://github.com/jgm/pandoc/releases/tag/3.1.2. +::: ------- + + # 2 Section Heading text. @@ -197,8 +227,6 @@ https://docs.oasis-open.org/templates/TCHandbook/ConformanceGuidelines.html.` # Appendix A. References - - This appendix contains the normative and informative references that are used in this document. While any hyperlinks included in this appendix were valid at the time of publication, OASIS cannot guarantee their long-term validity. @@ -208,92 +236,108 @@ While any hyperlinks included in this appendix were valid at the time of publica The following documents are referenced in such a way that some or all of their content constitutes requirements of this document. ###### [OData-ABNF] -_ABNF components: OData ABNF Construction Rules Version 4.01 and OData ABNF Test Cases._ +_ABNF components: OData ABNF Construction Rules Version 4.02 and OData ABNF Test Cases._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-CSDL] -_OData Common Schema Definition Language (CSDL) JSON Representation Version 4.01._ -See link in "[Related work](#RelatedWork)" section on cover page. - -_OData Common Schema Definition Language (CSDL) XML Representation Version 4.01._ +_OData Common Schema Definition Language (CSDL) JSON Representation Version 4.02._ See link in "[Related work](#RelatedWork)" section on cover page. -###### [OData-JSON] -_OData JSON Format Version 4.01._ +_OData Common Schema Definition Language (CSDL) XML Representation Version 4.02._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-Protocol] -_OData Version 4.01. Part 1: Protocol._ +_OData Version 4.02. Part 1: Protocol._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-URL] -_OData Version 4.01. Part 2: URL Conventions._ +_OData Version 4.02. Part 2: URL Conventions._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-VocCap] +_OData Vocabularies Version 4.0: Capabilities Vocabulary._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-VocCore] -_OData Core Vocabulary._ +_OData Vocabularies Version 4.0: Core Vocabulary._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [RFC2119] _Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997_ https://www.rfc-editor.org/info/rfc2119. +###### [RFC3986] +_Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", IETF RFC3986, January 2005_ +https://tools.ietf.org/html/rfc3986. + +###### [RFC3987] +_Duerst, M. and, M. Suignard, "Internationalized Resource Identifiers (IRIs)", RFC 3987, January 2005_ +https://tools.ietf.org/html/rfc3987. + +###### [RFC4648] +_Josefsson, S,, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006_ +_https://tools.ietf.org/html/rfc4648. + +###### [RFC5646] +_Phillips, A., Ed., and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, September 2009_ +http://tools.ietf.org/html/rfc5646. + +###### [RFC7946] +_Howard Butler, Martin Daly, Alan Doyle, Sean Gillies, Stefan Hagen and Tim Schaub, "The GeoJSON Format", RFC 7946, August 2016._ +http://tools.ietf.org/html/rfc7946. + ###### [RFC8174] _Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017_ https://www.rfc-editor.org/info/rfc8174. +###### [RFC8259] +_Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259, December 2017_ +_http://tools.ietf.org/html/rfc8259. + ## A.2 Informative References - -###### [RFC3552] -Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552. +###### [ECMAScript] +_ECMAScript 2023 Language Specification, 14th Edition_, June 2023. Standard ECMA-262. https://www.ecma-international.org/publications-and-standards/standards/ecma-262/. ------- # Appendix B. Safety, Security and Privacy Considerations - - -`(Note: OASIS strongly recommends that Technical Committees consider issues that might affect safety, security, privacy, and/or data protection in implementations of their specification and document them for implementers and adopters. For some purposes, you may find it required, e.g. if you apply for IANA registration.` - -`While it may not be immediately obvious how your specification might make systems vulnerable to attack, most specifications, because they involve communications between systems, message formats, or system settings, open potential channels for exploit. For example, IETF [[RFC3552](#rfc3552)] lists “eavesdropping, replay, message insertion, deletion, modification, and man-in-the-middle” as well as potential denial of service attacks as threats that must be considered and, if appropriate, addressed in IETF RFCs.` +This specification raises no security issues. -`In addition to considering and describing foreseeable risks, this section should include guidance on how implementers and adopters can protect against these risks.` +This section is provided as a service to the application developers, information providers, and users of OData version 4.0 giving some references to starting points for securing OData services as specified. OData is a REST-full multi-format service that depends on other services and thus inherits both sides of the coin, security enhancements and concerns alike from the latter. -`We encourage editors and TC members concerned with this subject to read _Guidelines for Writing RFC Text on Security Considerations_, IETF [[RFC3552](#rfc3552)], for more information.` - -`Remove this note before submitting for publication.)` +For JSON-relevant security implications please cf. at least the relevant subsections of [RFC8259](#rfc8259) as starting point. ------- # Appendix C. Acknowledgments - - -`Note: A Work Product approved by the TC must include a list of people who participated in the development of the Work Product. This is generally done by collecting the list of names in this appendix. This list shall be initially compiled by the Chair, and any Member of the TC may add or remove their names from the list by request. Remove this note before submitting for publication.` - ## C.1 Special Thanks - - -Substantial contributions to this document from the following individuals are gratefully acknowledged: - -Participant Name, Affiliation or "Individual Member" +The contributions of the OASIS OData Technical Committee members, enumerated in [OData-Protocol](#ODataProtocol) are gratefully acknowledged. ## C.2 Participants - - -The following individuals have participated in the creation of this specification and are gratefully acknowledged: - -**OpenC2 TC Members:** +**OData TC Members:** | First Name | Last Name | Company | | :--- | :--- | :--- | -Philippe | Alman | Something Networks -Alex | Amirnovman | Company B -Kris | Anderman | Mini Micro -Darren | Anstman | Big Networks +| George | Ericson | Dell | +| Hubert | Heijkers | IBM | +| Ling | Jin | IBM | +| Stefan | Hagen | Individual | +| Michael | Pizzo | Microsoft | +| Christof | Sprenger | Microsoft | +| Ralf | Handl | SAP SE | +| Gerald | Krause | SAP SE | +| Heiko | Theißen | SAP SE | +| Mark | Biamonte | Progress Software | +| Martin | Zurmühl | SAP SE | ------- @@ -303,19 +347,11 @@ Darren | Anstman | Big Networks | Revision | Date | Editor | Changes Made | | :--- | :--- | :--- | :--- | -| specname-v1.0-wd01 | yyyy-mm-dd | Editor Name | Initial working draft | - -------- - -# Appendix E. Example Appendix with subsections - -## E.1 Subsection title - -### E.1.1 Sub-subsection +| Working Draft 01 | 2023-07-20 | Ralf Handl | Import material from OData JSON Format Version 4.01 | ------- -# Appendix F. Notices +# Appendix E. Notices diff --git a/odata-json-format/1 Introduction.md b/odata-json-format/1 Introduction.md index ebc1de8b1..3a479a8e7 100644 --- a/odata-json-format/1 Introduction.md +++ b/odata-json-format/1 Introduction.md @@ -2,44 +2,77 @@ # ##sec Introduction - -*The content in this section is non-normative, except where it is marked -normative.* +The OData protocol is comprised of a set of specifications for representing and interacting with structured content. The core specification for the protocol is in [OData-Protocol](#ODataProtocol); this document is an extension of the core protocol. This document defines representations for the OData requests and responses using the JavaScript Object Notation (JSON), see [RFC8259]. -Here is a customized command line which will generate HTML from this markdown file (named odata-json-format-v4.02-csd01.md): +An OData JSON payload may represent: -pandoc -f gfm -t html odata-json-format-v4.02-csd01.md -c styles/markdown-styles-v1.7.3b.css --toc --toc-depth=5 -s -o odata-json-format-v4.02-csd01.html --metadata title="OData JSON Format Version 4.02" - -OASIS staff are currently using pandoc 3.0 from https://github.com/jgm/pandoc/releases/tag/3.0. - -Generating HTML in OASIS style requires a reference to a .css file containing the HTML styles. The .css file may be either included with the markdown file (like styles/markdown-styles-v1.7.3b.css) or a reference to one of the online stylesheets: -- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3.css -- https://docs.oasis-open.org/templates/css/markdown-styles-v1.7.3a.css (this one produces HTML that resembles the github display more closely, especially for blocks of code) - -Note this command generates a Table of Contents (TOC) in HTML which is located at the top of the HTML document, and which requires additional editing in order to be published in the expected OASIS style. This editing can be handled by OASIS staff during publication. -A TC may use other ways to generate HTML from markdown, which may generate a TOC in a different way. + +- a single primitive value +- a collection of primitive values +- a single complex type value +- a collection of complex type values +- a single entity or entity reference +- a collection of entities or entity references +- a collection of changes +- a service document describing the top-level resources exposed by the service +- an error. ## ##subsec Changes from earlier Versions - + ## ##subsec Glossary - - ### ##subsubsec Definitions of terms + + ### ##subsubsec Acronyms and abbreviations + + ### ##subsubsec Document conventions -- Naming conventions -- Font colors and styles -- Typographic conventions +Keywords defined by this specification use `this monospaced font`. + +Some sections of this specification are illustrated with non-normative examples. + +::: example +Example ##ex: text describing an example uses this paragraph style +``` +Non-normative examples use this paragraph style. +``` +::: + +All examples in this document are non-normative and informative only. Examples labeled with ⚠ contain advanced concepts or make use of keywords that are defined only later in the text, they can be skipped at first reading. + +All other text is normative unless otherwise labeled. + +::: example +Here is a customized command line which will generate HTML from this markdown file (named `$$$filename$$$.md`). Line breaks are added for readability only: + +``` +pandoc -f gfm+tex_math_dollars+fenced_divs + -t html + -o $$$filename$$$.html + -c styles/markdown-styles-v1.7.3b.css + -c styles/odata.css + -s + --mathjax + --eol=lf + --wrap=none + --metadata pagetitle="$$$pagetitle$$$" + $$$filename$$$.md +``` + +This uses pandoc 3.1.2 from https://github.com/jgm/pandoc/releases/tag/3.1.2. +::: ------- + + # ##sec Section Heading text. diff --git a/odata-json-format/Appendix.md b/odata-json-format/Appendix.md index edddb1bde..82f9e1e3a 100644 --- a/odata-json-format/Appendix.md +++ b/odata-json-format/Appendix.md @@ -3,8 +3,6 @@ # Appendix ##asec References - - This appendix contains the normative and informative references that are used in this document. While any hyperlinks included in this appendix were valid at the time of publication, OASIS cannot guarantee their long-term validity. @@ -14,92 +12,109 @@ While any hyperlinks included in this appendix were valid at the time of publica The following documents are referenced in such a way that some or all of their content constitutes requirements of this document. ###### [OData-ABNF] -_ABNF components: OData ABNF Construction Rules Version 4.01 and OData ABNF Test Cases._ +_ABNF components: OData ABNF Construction Rules Version 4.02 and OData ABNF Test Cases._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-CSDL] -_OData Common Schema Definition Language (CSDL) JSON Representation Version 4.01._ -See link in "[Related work](#RelatedWork)" section on cover page. - -_OData Common Schema Definition Language (CSDL) XML Representation Version 4.01._ +_OData Common Schema Definition Language (CSDL) JSON Representation Version 4.02._ See link in "[Related work](#RelatedWork)" section on cover page. -###### [OData-JSON] -_OData JSON Format Version 4.01._ +_OData Common Schema Definition Language (CSDL) XML Representation Version 4.02._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-Protocol] -_OData Version 4.01. Part 1: Protocol._ +_OData Version 4.02. Part 1: Protocol._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-URL] -_OData Version 4.01. Part 2: URL Conventions._ +_OData Version 4.02. Part 2: URL Conventions._ +See link in "[Related work](#RelatedWork)" section on cover page. + +###### [OData-VocCap] +_OData Vocabularies Version 4.0: Capabilities Vocabulary._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [OData-VocCore] -_OData Core Vocabulary._ +_OData Vocabularies Version 4.0: Core Vocabulary._ See link in "[Related work](#RelatedWork)" section on cover page. ###### [RFC2119] _Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997_ https://www.rfc-editor.org/info/rfc2119. +###### [RFC3986] +_Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", IETF RFC3986, January 2005_ +https://tools.ietf.org/html/rfc3986. + +###### [RFC3987] +_Duerst, M. and, M. Suignard, "Internationalized Resource Identifiers (IRIs)", RFC 3987, January 2005_ +https://tools.ietf.org/html/rfc3987. + +###### [RFC4648] +_Josefsson, S,, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006_ +_https://tools.ietf.org/html/rfc4648. + +###### [RFC5646] +_Phillips, A., Ed., and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, September 2009_ +http://tools.ietf.org/html/rfc5646. + +###### [RFC7946] +_Howard Butler, Martin Daly, Alan Doyle, Sean Gillies, Stefan Hagen and Tim Schaub, "The GeoJSON Format", RFC 7946, August 2016._ +http://tools.ietf.org/html/rfc7946. + ###### [RFC8174] _Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017_ https://www.rfc-editor.org/info/rfc8174. +###### [RFC8259] +_Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259, December 2017_ +_http://tools.ietf.org/html/rfc8259. + ## ##subasec Informative References - -###### [RFC3552] -Rescorla, E. and B. Korver, "Guidelines for Writing RFC Text on Security Considerations", BCP 72, RFC 3552, DOI 10.17487/RFC3552, July 2003, https://www.rfc-editor.org/info/rfc3552. +###### [ECMAScript] +_ECMAScript 2023 Language Specification, 14th Edition_, June 2023. Standard ECMA-262. +https://www.ecma-international.org/publications-and-standards/standards/ecma-262/. ------- # Appendix ##asec Safety, Security and Privacy Considerations - - -`(Note: OASIS strongly recommends that Technical Committees consider issues that might affect safety, security, privacy, and/or data protection in implementations of their specification and document them for implementers and adopters. For some purposes, you may find it required, e.g. if you apply for IANA registration.` +This specification raises no security issues. -`While it may not be immediately obvious how your specification might make systems vulnerable to attack, most specifications, because they involve communications between systems, message formats, or system settings, open potential channels for exploit. For example, IETF [[RFC3552](#rfc3552)] lists “eavesdropping, replay, message insertion, deletion, modification, and man-in-the-middle” as well as potential denial of service attacks as threats that must be considered and, if appropriate, addressed in IETF RFCs.` +This section is provided as a service to the application developers, information providers, and users of OData version 4.0 giving some references to starting points for securing OData services as specified. OData is a REST-full multi-format service that depends on other services and thus inherits both sides of the coin, security enhancements and concerns alike from the latter. -`In addition to considering and describing foreseeable risks, this section should include guidance on how implementers and adopters can protect against these risks.` - -`We encourage editors and TC members concerned with this subject to read _Guidelines for Writing RFC Text on Security Considerations_, IETF [[RFC3552](#rfc3552)], for more information.` - -`Remove this note before submitting for publication.)` +For JSON-relevant security implications please cf. at least the relevant subsections of [RFC8259](#rfc8259) as starting point. ------- # Appendix ##asec Acknowledgments - - -`Note: A Work Product approved by the TC must include a list of people who participated in the development of the Work Product. This is generally done by collecting the list of names in this appendix. This list shall be initially compiled by the Chair, and any Member of the TC may add or remove their names from the list by request. Remove this note before submitting for publication.` - ## ##subasec Special Thanks - - -Substantial contributions to this document from the following individuals are gratefully acknowledged: - -Participant Name, Affiliation or "Individual Member" +The contributions of the OASIS OData Technical Committee members, enumerated in [OData-Protocol](#ODataProtocol) are gratefully acknowledged. ## ##subasec Participants - - -The following individuals have participated in the creation of this specification and are gratefully acknowledged: - -**OpenC2 TC Members:** +**OData TC Members:** | First Name | Last Name | Company | | :--- | :--- | :--- | -Philippe | Alman | Something Networks -Alex | Amirnovman | Company B -Kris | Anderman | Mini Micro -Darren | Anstman | Big Networks +| George | Ericson | Dell | +| Hubert | Heijkers | IBM | +| Ling | Jin | IBM | +| Stefan | Hagen | Individual | +| Michael | Pizzo | Microsoft | +| Christof | Sprenger | Microsoft | +| Ralf | Handl | SAP SE | +| Gerald | Krause | SAP SE | +| Heiko | Theißen | SAP SE | +| Mark | Biamonte | Progress Software | +| Martin | Zurmühl | SAP SE | ------- @@ -109,15 +124,7 @@ Darren | Anstman | Big Networks | Revision | Date | Editor | Changes Made | | :--- | :--- | :--- | :--- | -| specname-v1.0-wd01 | yyyy-mm-dd | Editor Name | Initial working draft | - -------- - -# Appendix ##asec Example Appendix with subsections - -## ##subasec Subsection title - -### ##subsubasec Sub-subsection +| Working Draft 01 | 2023-07-20 | Ralf Handl | Import material from OData JSON Format Version 4.01 | ------- From b37f42f1952c5f9192dbf66d2262554fb225948b Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Thu, 20 Jul 2023 19:05:06 +0200 Subject: [PATCH 07/33] Conformance section --- docs/odata-json-format/odata-json-format.html | 94 +++++++++++- docs/odata-json-format/odata-json-format.md | 137 +++++++++++++++++- odata-json-format/1 Introduction.md | 133 ++++++++++++++++- odata-json-format/Appendix.md | 4 +- 4 files changed, 346 insertions(+), 22 deletions(-) diff --git a/docs/odata-json-format/odata-json-format.html b/docs/odata-json-format/odata-json-format.html index 5dfa5f7e4..99e3bed7d 100644 --- a/docs/odata-json-format/odata-json-format.html +++ b/docs/odata-json-format/odata-json-format.html @@ -200,11 +200,93 @@

    2.2 Next Head

    text.


    3 Conformance

    - +

    Conforming clients MUST be prepared to consume a service that uses any or all of the constructs defined in this specification. The exception to this are the constructs defined in Delta Response, which are only required for clients that request changes.

    + -

    (Note: The [OASIS TC Process](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsConfClause) requires that a specification approved by the TC at the Committee Specification Public Review Draft, Committee Specification or OASIS Standard level must include a separate section, listing a set of numbered conformance clauses, to which any implementation of the specification must adhere in order to claim conformance to the specification (or any optional portion thereof). This is done by listing the conformance clauses here. For the definition of "conformance clause," see [OASIS Defined Terms](https://www.oasis-open.org/policies-guidelines/oasis-defined-terms-2018-05-22/#dConformanceClause).

    -

    See "Guidelines to Writing Conformance Clauses": https://docs.oasis-open.org/templates/TCHandbook/ConformanceGuidelines.html.

    -

    Remove this note before submitting for publication.)

    +

    In order to be a conforming consumer of the OData JSON format, a client or service:

    +
      +
    1. MUST either:

      +
        +
      1. understand metadata=minimal (section 3.1.1) or
      2. +
      3. explicitly specify metadata=none (section 3.1.3) or metadata=full (section 3.1.2) in the request (client)
      4. +
    2. +
    3. MUST be prepared to consume a response with full metadata

    4. +
    5. MUST be prepared to receive all data types (section 7.1)

      +
        +
      1. defined in this specification (client)
      2. +
      3. exposed by the service (service)
      4. +
    6. +
    7. MUST interpret all odata control information defined according to the OData-Version header of the payload (section 4.5)

    8. +
    9. MUST be prepared to receive any annotations and control information not defined in the OData-Version header of the payload (section 21.2)

    10. +
    11. MUST NOT require streaming=true in the Content-Type header (section 4.4)

    12. +
    13. MUST be a conforming consumer of the OData 4.0 JSON format, for payloads with an OData-Version header value of 4.0.

      +
        +
      1. MUST accept the odata. prefix, where defined, on format parameters and control information

      2. +
      3. MUST accept the # prefix in @odata.type values

      4. +
      5. MUST be prepared to handle binding through the use of the @odata.bind property in payloads to a PATCH, PUT, or POST request

      6. +
      7. MUST accept TargetId within in a deleted link for a relationship with a maximum cardinality of one

      8. +
      9. MUST accept the string values -INF, INF, and NaN for single and double values

      10. +
      11. MUST support property annotations that appear immediately before or after the property they annotate

      12. +
    14. +
    15. MAY be a conforming consumer of the OData 4.01 JSON format, for payloads with an OData-Version header value of 4.01.

      +
        +
      1. MUST be prepared to interpret control information with or without the odata. prefix

      2. +
      3. MUST be prepared for @odata.type primitive values with or without the # prefix

      4. +
      5. MUST be prepared to handle binding through inclusion of an entity reference within a collection-valued navigation property in the body of a PATCH, PUT, or POST request

      6. +
      7. MUST be prepared for TargetId to be included or omitted in a deleted link for a relationship with a maximum cardinality of one

      8. +
      9. MUST accept the string values -INF, INF, and NaN for decimal values with floating scale

      10. +
      11. MUST be prepared to handle related entities inline within a delta payload as well as a nested delta representation for the collection

      12. +
      13. MUST be prepared to handle decimal values written in exponential notation

      14. +
    16. +
    +

    In order to be a conforming producer of the OData JSON format, a client or service:

    +
      +
    1. MUST support generating OData 4.0 JSON compliant payloads with an OData-Version header value of 4.0.

      +
        +
      1. MUST NOT omit the odata. prefix from format parameters or control information

      2. +
      3. MUST NOT omit the # prefix from @odata.type values

      4. +
      5. MUST NOT include entity values or entity references within a collection-valued navigation property in the body of a PATCH, PUT, or POST request

      6. +
      7. MUST NOT return decimal values written in exponential notation unless the ExponentialDecimals format parameter is specified.

      8. +
      9. MUST NOT advertise available actions or functions using name/value pairs prefixed with a property name

      10. +
      11. MUST NOT return a null value for name/value pairs representing actions or functions that are not available

      12. +
      13. MUST NOT represent numeric value exceptions for values other than single and double values using the string values -INF, INF, and NaN

      14. +
    2. +
    3. MAY support generating OData 4.01 JSON compliant payloads for requests with an OData-Version header value of 4.01.

      +
        +
      1. MUST return property annotations immediately before the property they annotate

      2. +
      3. SHOULD omit the odata. prefix from format parameters and control information

      4. +
      5. SHOULD omit the # prefix from @type primitive values

      6. +
      7. MAY include inline related entities or nested delta collections within a delta payload

      8. +
      9. MAY include TargetId within a deleted link for a relationship with a maximum cardinality of 1

      10. +
      11. MAY return decimal values written in exponential notation

      12. +
      13. MAY represent numeric value exceptions for decimal values with floating scale using the string values -INF, INF, and NaN

      14. +
    4. +
    +

    In addition, in order to conform to the OData JSON format, a service:

    +
      +
    1. MUST comply with one of the conformance levels defined in OData-Protocol

    2. +
    3. MUST support the application/json media type in the Accept header (section 3)

    4. +
    5. MUST return well-formed JSON payloads

    6. +
    7. MUST support odata.metadata=full (section 3.1.2)

    8. +
    9. MUST include the odata.nextLink control information in partial results for entity collections (section 4.5.5)

    10. +
    11. MUST support entity instances with external metadata (section 4.5.1)

    12. +
    13. MUST support properties with externally defined data types (section 4.5.3)

    14. +
    15. MUST NOT violate any other aspects of this OData JSON specification

    16. +
    17. SHOULD support the $format system query option (section 3)

    18. +
    19. MAY support the odata.streaming=true parameter in the Accept header (section 4.4)

    20. +
    21. MAY return full metadata regardless of odata.metadata (section 3.1.2)

    22. +
    23. MUST NOT omit null or default values unless the omit-values preference is specified in the Prefer request header and the omit-values preference is included in the Preference-Applied response header

    24. +
    25. MUST return OData JSON 4.0-compliant responses for requests with an OData-MaxVersion header value of 4.0

    26. +
    27. MUST support OData JSON 4.0-compliant payloads in requests with an OData-Version header value of 4.0

    28. +
    29. MUST support returning, in the final response to an asynchronous request, the application/json payload that would have been returned had the operation completed synchronously, wrapped in an application/http message

    30. +
    +

    In addition, in order to comply with the OData 4.01 JSON format, a service:

    +
      +
    1. SHOULD return the OData JSON 4.01 format for requests with an OData-MaxVersion header value of 4.01

    2. +
    3. MUST support the OData JSON 4.01 format in request payloads for requests with an OData-Version header value of 4.01

    4. +
    5. MUST honor the odata.etag control information within PUT, PATCH or DELETE payloads, if specified

    6. +
    7. MUST support returning, in the final response to an asynchronous request, the application/json payload that would have been returned had the operation completed synchronously

    8. +

    Appendix A. References

    This appendix contains the normative and informative references that are used in this document.

    @@ -239,7 +321,7 @@
    [RFC3986]
    [RFC3987]

    Duerst, M. and, M. Suignard, "Internationalized Resource Identifiers (IRIs)", RFC 3987, January 2005 https://tools.ietf.org/html/rfc3987.

    [RFC4648]
    -

    Josefsson, S,, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006 _https://tools.ietf.org/html/rfc4648.

    +

    Josefsson, S,, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006 https://tools.ietf.org/html/rfc4648.

    [RFC5646]

    Phillips, A., Ed., and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, September 2009 http://tools.ietf.org/html/rfc5646.

    <a name="rfc74932>[RFC7493]
    @@ -250,7 +332,7 @@
    [RFC8174]

    Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017
    https://www.rfc-editor.org/info/rfc8174.

    [RFC8259]
    -

    Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259, December 2017 _http://tools.ietf.org/html/rfc8259.

    +

    Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259, December 2017 http://tools.ietf.org/html/rfc8259.

    A.2 Informative References

    [ECMAScript]

    ECMAScript 2023 Language Specification, 14th Edition, June 2023. Standard ECMA-262. https://www.ecma-international.org/publications-and-standards/standards/ecma-262/.

    diff --git a/docs/odata-json-format/odata-json-format.md b/docs/odata-json-format/odata-json-format.md index 6addc7fea..118ebf9a6 100644 --- a/docs/odata-json-format/odata-json-format.md +++ b/docs/odata-json-format/odata-json-format.md @@ -212,15 +212,136 @@ text. ------- # 3 Conformance - -`(Note: The [OASIS TC Process](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsConfClause) requires that a specification approved by the TC at the Committee Specification Public Review Draft, Committee Specification or OASIS Standard level must include a separate section, listing a set of numbered conformance clauses, to which any implementation of the specification must adhere in order to claim conformance to the specification (or any optional portion thereof). This is done by listing the conformance clauses here.` -`For the definition of "conformance clause," see [OASIS Defined Terms](https://www.oasis-open.org/policies-guidelines/oasis-defined-terms-2018-05-22/#dConformanceClause).` +Conforming clients MUST be prepared to consume a service that uses any or all of the constructs defined in this specification. The exception to this are the constructs defined in Delta Response, which are only required for clients that request changes. -`See "Guidelines to Writing Conformance Clauses": -https://docs.oasis-open.org/templates/TCHandbook/ConformanceGuidelines.html.` + + +In order to be a conforming consumer of the OData JSON format, a client or service: -`Remove this note before submitting for publication.)` +1. MUST either: + 1. understand `metadata=minimal` (section 3.1.1) or + 2. explicitly specify `metadata=none` (section 3.1.3) or `metadata=full` (section 3.1.2) in the request (client) + +2. MUST be prepared to consume a response with full metadata +3. MUST be prepared to receive all data types (section 7.1) + + 1. defined in this specification (client) + 2. exposed by the service (service) + +4. MUST interpret all `odata` control information defined according to the `OData-Version` header of the payload (section 4.5) + +5. MUST be prepared to receive any annotations and control information not defined in the `OData-Version` header of the payload (section 21.2) + +6. MUST NOT require `streaming=true` in the `Content-Type` header (section 4.4) + +7. MUST be a conforming consumer of the OData 4.0 JSON format, for payloads with an `OData-Version` header value of `4.0`. + + 1. MUST accept the `odata.` prefix, where defined, on format parameters and control information + + 2. MUST accept the `#` prefix in `@odata.type` values + + 3. MUST be prepared to handle binding through the use of the `@odata.bind` property in payloads to a `PATCH`, `PUT`, or `POST` request + + 4. MUST accept `TargetId` within in a deleted link for a relationship with a maximum cardinality of one + + 5. MUST accept the string values `-INF`, `INF`, and `NaN` for single and double values + + 6. MUST support property annotations that appear immediately before or after the property they annotate + +8. MAY be a conforming consumer of the OData 4.01 JSON format, for payloads with an `OData-Version` header value of `4.01`. + + 1. MUST be prepared to interpret control information with or without the `odata.` prefix + + 2. MUST be prepared for `@odata.type` primitive values with or without the `#` prefix + + 3. MUST be prepared to handle binding through inclusion of an entity reference within a collection-valued navigation property in the body of a `PATCH`, `PUT`, or `POST` request + + 4. MUST be prepared for `TargetId` to be included or omitted in a deleted link for a relationship with a maximum cardinality of one + + 5. MUST accept the string values `-INF`, `INF`, and `NaN` for decimal values with floating scale + + 6. MUST be prepared to handle related entities inline within a delta payload as well as a nested delta representation for the collection + + 7. MUST be prepared to handle decimal values written in exponential notation + + +In order to be a conforming producer of the OData JSON format, a client or service: + +9. MUST support generating OData 4.0 JSON compliant payloads with an `OData-Version` header value of `4.0`. + + 1. MUST NOT omit the `odata.` prefix from format parameters or control information + + 2. MUST NOT omit the `#` prefix from `@odata.type` values + + 3. MUST NOT include entity values or entity references within a collection-valued navigation property in the body of a `PATCH`, `PUT`, or `POST` request + + 4. MUST NOT return decimal values written in exponential notation unless the ExponentialDecimals format parameter is specified. + + 5. MUST NOT advertise available actions or functions using name/value pairs prefixed with a property name + + 6. MUST NOT return a null value for name/value pairs representing actions or functions that are not available + + 7. MUST NOT represent numeric value exceptions for values other than single and double values using the string values `-INF`, `INF`, and `NaN` + +10. MAY support generating OData 4.01 JSON compliant payloads for requests with an `OData-Version` header value of `4.01`. + + 1. MUST return property annotations immediately before the property they annotate + + 2. SHOULD omit the `odata.` prefix from format parameters and control information + + 3. SHOULD omit the `#` prefix from `@type` primitive values + + 4. MAY include inline related entities or nested delta collections within a delta payload + + 5. MAY include `TargetId` within a deleted link for a relationship with a maximum cardinality of 1 + + 6. MAY return decimal values written in exponential notation + + 7. MAY represent numeric value exceptions for decimal values with floating scale using the string values `-INF`, `INF`, and `NaN` + +In addition, in order to conform to the OData JSON format, a service: + +11. MUST comply with one of the conformance levels defined in [OData-Protocol](#ODataProtocol) + +12. MUST support the `application/json` media type in the `Accept` header (section 3) + +13. MUST return well-formed JSON payloads + +14. MUST support `odata.metadata=full` (section 3.1.2) + +15. MUST include the `odata.nextLink` control information in partial results for entity collections (section 4.5.5) + +16. MUST support entity instances with external metadata (section 4.5.1) + +17. MUST support properties with externally defined data types (section 4.5.3) + +18. MUST NOT violate any other aspects of this OData JSON specification + +19. SHOULD support the `$format` system query option (section 3) + +20. MAY support the `odata.streaming=true` parameter in the `Accept` header (section 4.4) + +21. MAY return full metadata regardless of `odata.metadata` (section 3.1.2) + +22. MUST NOT omit null or default values unless the `omit-values` preference is specified in the `Prefer` request header and the `omit-values` preference is included in the `Preference-Applied` response header + +23. MUST return OData JSON 4.0-compliant responses for requests with an `OData-MaxVersion` header value of `4.0` + +24. MUST support OData JSON 4.0-compliant payloads in requests with an `OData-Version` header value of `4.0` + +25. MUST support returning, in the final response to an asynchronous request, the `application/json` payload that would have been returned had the operation completed synchronously, wrapped in an `application/http` message + + +In addition, in order to comply with the OData 4.01 JSON format, a service: + +26. SHOULD return the OData JSON 4.01 format for requests with an `OData-MaxVersion` header value of `4.01` + +27. MUST support the OData JSON 4.01 format in request payloads for requests with an `OData-Version` header value of `4.01` + +28. MUST honor the `odata.etag` control information within `PUT`, `PATCH` or `DELETE` payloads, if specified + +29. MUST support returning, in the final response to an asynchronous request, the `application/json` payload that would have been returned had the operation completed synchronously ------- @@ -276,7 +397,7 @@ https://tools.ietf.org/html/rfc3987. ###### [RFC4648] _Josefsson, S,, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006_ -_https://tools.ietf.org/html/rfc4648. +https://tools.ietf.org/html/rfc4648. ###### [RFC5646] _Phillips, A., Ed., and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, September 2009_ @@ -296,7 +417,7 @@ https://www.rfc-editor.org/info/rfc8174. ###### [RFC8259] _Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259, December 2017_ -_http://tools.ietf.org/html/rfc8259. +http://tools.ietf.org/html/rfc8259. ## A.2 Informative References diff --git a/odata-json-format/1 Introduction.md b/odata-json-format/1 Introduction.md index 3a479a8e7..b270174e1 100644 --- a/odata-json-format/1 Introduction.md +++ b/odata-json-format/1 Introduction.md @@ -95,12 +95,133 @@ text. ------- # ##sec Conformance - -`(Note: The [OASIS TC Process](https://www.oasis-open.org/policies-guidelines/tc-process-2017-05-26/#wpComponentsConfClause) requires that a specification approved by the TC at the Committee Specification Public Review Draft, Committee Specification or OASIS Standard level must include a separate section, listing a set of numbered conformance clauses, to which any implementation of the specification must adhere in order to claim conformance to the specification (or any optional portion thereof). This is done by listing the conformance clauses here.` -`For the definition of "conformance clause," see [OASIS Defined Terms](https://www.oasis-open.org/policies-guidelines/oasis-defined-terms-2018-05-22/#dConformanceClause).` +Conforming clients MUST be prepared to consume a service that uses any or all of the constructs defined in this specification. The exception to this are the constructs defined in Delta Response, which are only required for clients that request changes. -`See "Guidelines to Writing Conformance Clauses": -https://docs.oasis-open.org/templates/TCHandbook/ConformanceGuidelines.html.` + + +In order to be a conforming consumer of the OData JSON format, a client or service: -`Remove this note before submitting for publication.)` +1. MUST either: + 1. understand `metadata=minimal` (section 3.1.1) or + 2. explicitly specify `metadata=none` (section 3.1.3) or `metadata=full` (section 3.1.2) in the request (client) + +2. MUST be prepared to consume a response with full metadata +3. MUST be prepared to receive all data types (section 7.1) + + 1. defined in this specification (client) + 2. exposed by the service (service) + +4. MUST interpret all `odata` control information defined according to the `OData-Version` header of the payload (section 4.5) + +5. MUST be prepared to receive any annotations and control information not defined in the `OData-Version` header of the payload (section 21.2) + +6. MUST NOT require `streaming=true` in the `Content-Type` header (section 4.4) + +7. MUST be a conforming consumer of the OData 4.0 JSON format, for payloads with an `OData-Version` header value of `4.0`. + + 1. MUST accept the `odata.` prefix, where defined, on format parameters and control information + + 2. MUST accept the `#` prefix in `@odata.type` values + + 3. MUST be prepared to handle binding through the use of the `@odata.bind` property in payloads to a `PATCH`, `PUT`, or `POST` request + + 4. MUST accept `TargetId` within in a deleted link for a relationship with a maximum cardinality of one + + 5. MUST accept the string values `-INF`, `INF`, and `NaN` for single and double values + + 6. MUST support property annotations that appear immediately before or after the property they annotate + +8. MAY be a conforming consumer of the OData 4.01 JSON format, for payloads with an `OData-Version` header value of `4.01`. + + 1. MUST be prepared to interpret control information with or without the `odata.` prefix + + 2. MUST be prepared for `@odata.type` primitive values with or without the `#` prefix + + 3. MUST be prepared to handle binding through inclusion of an entity reference within a collection-valued navigation property in the body of a `PATCH`, `PUT`, or `POST` request + + 4. MUST be prepared for `TargetId` to be included or omitted in a deleted link for a relationship with a maximum cardinality of one + + 5. MUST accept the string values `-INF`, `INF`, and `NaN` for decimal values with floating scale + + 6. MUST be prepared to handle related entities inline within a delta payload as well as a nested delta representation for the collection + + 7. MUST be prepared to handle decimal values written in exponential notation + + +In order to be a conforming producer of the OData JSON format, a client or service: + +9. MUST support generating OData 4.0 JSON compliant payloads with an `OData-Version` header value of `4.0`. + + 1. MUST NOT omit the `odata.` prefix from format parameters or control information + + 2. MUST NOT omit the `#` prefix from `@odata.type` values + + 3. MUST NOT include entity values or entity references within a collection-valued navigation property in the body of a `PATCH`, `PUT`, or `POST` request + + 4. MUST NOT return decimal values written in exponential notation unless the ExponentialDecimals format parameter is specified. + + 5. MUST NOT advertise available actions or functions using name/value pairs prefixed with a property name + + 6. MUST NOT return a null value for name/value pairs representing actions or functions that are not available + + 7. MUST NOT represent numeric value exceptions for values other than single and double values using the string values `-INF`, `INF`, and `NaN` + +10. MAY support generating OData 4.01 JSON compliant payloads for requests with an `OData-Version` header value of `4.01`. + + 1. MUST return property annotations immediately before the property they annotate + + 2. SHOULD omit the `odata.` prefix from format parameters and control information + + 3. SHOULD omit the `#` prefix from `@type` primitive values + + 4. MAY include inline related entities or nested delta collections within a delta payload + + 5. MAY include `TargetId` within a deleted link for a relationship with a maximum cardinality of 1 + + 6. MAY return decimal values written in exponential notation + + 7. MAY represent numeric value exceptions for decimal values with floating scale using the string values `-INF`, `INF`, and `NaN` + +In addition, in order to conform to the OData JSON format, a service: + +11. MUST comply with one of the conformance levels defined in [OData-Protocol](#ODataProtocol) + +12. MUST support the `application/json` media type in the `Accept` header (section 3) + +13. MUST return well-formed JSON payloads + +14. MUST support `odata.metadata=full` (section 3.1.2) + +15. MUST include the `odata.nextLink` control information in partial results for entity collections (section 4.5.5) + +16. MUST support entity instances with external metadata (section 4.5.1) + +17. MUST support properties with externally defined data types (section 4.5.3) + +18. MUST NOT violate any other aspects of this OData JSON specification + +19. SHOULD support the `$format` system query option (section 3) + +20. MAY support the `odata.streaming=true` parameter in the `Accept` header (section 4.4) + +21. MAY return full metadata regardless of `odata.metadata` (section 3.1.2) + +22. MUST NOT omit null or default values unless the `omit-values` preference is specified in the `Prefer` request header and the `omit-values` preference is included in the `Preference-Applied` response header + +23. MUST return OData JSON 4.0-compliant responses for requests with an `OData-MaxVersion` header value of `4.0` + +24. MUST support OData JSON 4.0-compliant payloads in requests with an `OData-Version` header value of `4.0` + +25. MUST support returning, in the final response to an asynchronous request, the `application/json` payload that would have been returned had the operation completed synchronously, wrapped in an `application/http` message + + +In addition, in order to comply with the OData 4.01 JSON format, a service: + +26. SHOULD return the OData JSON 4.01 format for requests with an `OData-MaxVersion` header value of `4.01` + +27. MUST support the OData JSON 4.01 format in request payloads for requests with an `OData-Version` header value of `4.01` + +28. MUST honor the `odata.etag` control information within `PUT`, `PATCH` or `DELETE` payloads, if specified + +29. MUST support returning, in the final response to an asynchronous request, the `application/json` payload that would have been returned had the operation completed synchronously diff --git a/odata-json-format/Appendix.md b/odata-json-format/Appendix.md index 82f9e1e3a..aac5e15f5 100644 --- a/odata-json-format/Appendix.md +++ b/odata-json-format/Appendix.md @@ -52,7 +52,7 @@ https://tools.ietf.org/html/rfc3987. ###### [RFC4648] _Josefsson, S,, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006_ -_https://tools.ietf.org/html/rfc4648. +https://tools.ietf.org/html/rfc4648. ###### [RFC5646] _Phillips, A., Ed., and M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, September 2009_ @@ -72,7 +72,7 @@ https://www.rfc-editor.org/info/rfc8174. ###### [RFC8259] _Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259, December 2017_ -_http://tools.ietf.org/html/rfc8259. +http://tools.ietf.org/html/rfc8259. ## ##subasec Informative References From 0fe77e83757223485a43f0b562abc466601e84f5 Mon Sep 17 00:00:00 2001 From: Ralf Handl Date: Fri, 21 Jul 2023 12:15:35 +0200 Subject: [PATCH 08/33] Outline --- .../odata-json-format-v4.01-os.html | 9951 +++++++++++++++++ .../odata-json-format-v4.01-os.md | 5914 ++++++++++ docs/odata-json-format/odata-json-format.html | 237 +- docs/odata-json-format/odata-json-format.md | 343 +- odata-json-format/1 Introduction.md | 256 +- 5 files changed, 16622 insertions(+), 79 deletions(-) create mode 100644 docs/odata-json-format/odata-json-format-v4.01-os.html create mode 100644 docs/odata-json-format/odata-json-format-v4.01-os.md diff --git a/docs/odata-json-format/odata-json-format-v4.01-os.html b/docs/odata-json-format/odata-json-format-v4.01-os.html new file mode 100644 index 000000000..e3bc11d1d --- /dev/null +++ b/docs/odata-json-format/odata-json-format-v4.01-os.html @@ -0,0 +1,9951 @@ + + + + + + +OData JSON Format Version 4.01 + + + + + + +
    + +

    +OASIS logo

    + +
    + +

    OData JSON Format Version 4.01

    + +

    OASIS Standard

    + +

    11 May 2020

    + +
    + +

    This stage:

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/os/odata-json-format-v4.01-os.docx +(Authoritative)

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/os/odata-json-format-v4.01-os.html

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/os/odata-json-format-v4.01-os.pdf

    + +

    Previous stage:

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/cos01/odata-json-format-v4.01-cos01.docx +(Authoritative)

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/cos01/odata-json-format-v4.01-cos01.html

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/cos01/odata-json-format-v4.01-cos01.pdf

    + +

    Latest stage:

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/odata-json-format-v4.01.docx +(Authoritative)

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/odata-json-format-v4.01.html

    + +

    https://docs.oasis-open.org/odata/odata-json-format/v4.01/odata-json-format-v4.01.pdf

    + +

    Technical Committee:

    + +

    OASIS +Open Data Protocol (OData) TC

    + +

    Chairs:

    + +

    Ralf Handl (ralf.handl@sap.com), SAP SE

    + +

    Michael Pizzo (mikep@microsoft.com), +Microsoft

    + +

    Editors:

    + +

    Michael Pizzo (mikep@microsoft.com), Microsoft

    + +

    Ralf Handl (ralf.handl@sap.com), +SAP SE

    + +

    Mark Biamonte (mark.biamonte@progress.com), Progress +Software

    + +

    Related work:

    + +

    This specification replaces or supersedes:

    + +

             +OData JSON Format Version 4.0. Edited by Ralf Handl, +Michael Pizzo, and Mark Biamonte. OASIS Standard. Latest stage: http://docs.oasis-open.org/odata/odata-json-format/v4.0/odata-json-format-v4.0.html.

    + +

    This specification is related to:

    + +

             +OData Version 4.01. Edited by Michael Pizzo, Ralf Handl, +and Martin Zurmuehl. A multi-part Work Product which includes:

    + +

    o    OData +Version 4.01. Part 1: Protocol. Latest stage: https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html.

    + +

    o    OData +Version 4.01. Part 2: URL Conventions. Latest stage: https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html.

    + +

    o    ABNF +components: OData ABNF Construction Rules Version 4.01 and OData ABNF Test +Cases. https://docs.oasis-open.org/odata/odata/v4.01/os/abnf/.

    + +

             +OData Vocabularies Version 4.0. Edited by Michael +Pizzo, Ralf Handl, and Ram Jeyaraman. Latest stage: http://docs.oasis-open.org/odata/odata-vocabularies/v4.0/odata-vocabularies-v4.0.html.

    + +

             +OData Common Schema Definition Language (CSDL) JSON +Representation Version 4.01. Edited by Michael Pizzo, Ralf Handl, and +Martin Zurmuehl. Latest stage: https://docs.oasis-open.org/odata/odata-csdl-json/v4.01/odata-csdl-json-v4.01.html.

    + +

             +OData Common Schema Definition Language (CSDL) XML +Representation Version 4.01. Edited by Michael Pizzo, Ralf Handl, and +Martin Zurmuehl. Latest stage: https://docs.oasis-open.org/odata/odata-csdl-xml/v4.01/odata-csdl-xml-v4.01.html.

    + +

    Abstract:

    + +

    The Open Data Protocol (OData) for representing and +interacting with structured content is comprised of a set of specifications. +The core specification for the protocol is in OData Version 4.01 Part 1: +Protocol. This document extends the core specification by defining +representations for OData requests and responses using a JSON format.

    + +

    Status:

    + +

    This document was last revised or approved by the membership +of OASIS on the above date. The level of approval is also listed above. Check +the Latest stage location noted above for possible later revisions of this +document. Any other numbered Versions and other technical work produced by the +Technical Committee (TC) are listed at https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=odata#technical.

    + +

    TC members should send comments on this specification to the +TCs email list. Others should send comments to the TCs public comment list, +after subscribing to it by following the instructions at the Send +A Comment button on the TCs web page at https://www.oasis-open.org/committees/odata/.

    + +

    This specification is provided under the +RF +on RAND Terms Mode of the OASIS IPR Policy, +the mode chosen when the Technical Committee was established. For information +on whether any patents have been disclosed that may be essential to +implementing this specification, and any offers of patent licensing terms, +please refer to the Intellectual Property Rights section of the TCs web page (https://www.oasis-open.org/committees/odata/ipr.php).

    + +

    Note that any machine-readable content (Computer +Language Definitions) declared Normative for this Work Product is provided +in separate plain text files. In the event of a discrepancy between any such +plain text file and display content in the Work Product's prose narrative +document(s), the content in the separate plain text file prevails.

    + +

    Citation format:

    + +

    When referencing this specification, the following citation +format should be used:

    + +

    [OData-JSON-Format-v4.01]

    + +

    OData JSON Format Version 4.01. Edited by Michael +Pizzo, Ralf Handl, and Mark Biamonte. 11 May 2020. OASIS Standard. https://docs.oasis-open.org/odata/odata-json-format/v4.01/os/odata-json-format-v4.01-os.html. Latest stage: https://docs.oasis-open.org/odata/odata-json-format/v4.01/odata-json-format-v4.01.html.

    + +
    + +

    Notices

    + +
    + +

    Copyright OASIS Open 2020. All Rights Reserved.

    + +

    All capitalized terms in the following text have the +meanings assigned to them in the OASIS Intellectual Property Rights Policy (the +"OASIS IPR Policy"). The full Policy may be +found at the OASIS website.

    + +

    This document and translations of it may be copied and +furnished to others, and derivative works that comment on or otherwise explain +it or assist in its implementation may be prepared, copied, published, and +distributed, in whole or in part, without restriction of any kind, provided +that the above copyright notice and this section are included on all such +copies and derivative works. However, this document itself may not be modified +in any way, including by removing the copyright notice or references to OASIS, +except as needed for the purpose of developing any document or deliverable +produced by an OASIS Technical Committee (in which case the rules applicable to +copyrights, as set forth in the OASIS IPR Policy, must be followed) or as +required to translate it into languages other than English.

    + +

    The limited permissions granted above are perpetual and will +not be revoked by OASIS or its successors or assigns.

    + +

    This document and the information contained herein is +provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF +THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED +WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

    + +

    OASIS requests that any OASIS Party or any other party that +believes it has patent claims that would necessarily be infringed by +implementations of this OASIS Committee Specification or OASIS Standard, to +notify OASIS TC Administrator and provide an indication of its willingness to +grant patent licenses to such patent claims in a manner consistent with the IPR +Mode of the OASIS Technical Committee that produced this specification.

    + +

    OASIS invites any party to contact the OASIS TC +Administrator if it is aware of a claim of ownership of any patent claims that +would necessarily be infringed by implementations of this specification by a +patent holder that is not willing to provide a license to such patent claims in +a manner consistent with the IPR Mode of the OASIS Technical Committee that +produced this specification. OASIS may include such claims on its website, but +disclaims any obligation to do so.

    + +

    OASIS takes no position regarding the validity or scope of +any intellectual property or other rights that might be claimed to pertain to +the implementation or use of the technology described in this document or the +extent to which any license under such rights might or might not be available; +neither does it represent that it has made any effort to identify any such +rights. Information on OASIS' procedures with respect to rights in any document +or deliverable produced by an OASIS Technical Committee can be found on the +OASIS website. Copies of claims of rights made available for publication and +any assurances of licenses to be made available, or the result of an attempt +made to obtain a general license or permission for the use of such proprietary +rights by implementers or users of this OASIS Committee Specification or OASIS +Standard, can be obtained from the OASIS TC Administrator. OASIS makes no +representation that any information or list of intellectual property rights +will at any time be complete, or that any claims in such list are, in fact, +Essential Claims.

    + +

    The name "OASIS" is a trademark of OASIS, the owner and developer of this +specification, and should be used only to refer to the organization and its +official outputs. OASIS welcomes reference to, and implementation and use of, +specifications, while reserving the right to enforce its marks against +misleading uses. Please see https://www.oasis-open.org/policies-guidelines/trademark +for above guidance.

    + +
    + +

    Table of Contents

    + +
    + +

    1 Introduction. 7

    + +

    1.0 IPR Policy. 7

    + +

    1.1 Terminology. 7

    + +

    1.2 Normative References. 7

    + +

    1.3 Non-Normative References. 8

    + +

    1.4 Typographical Conventions. 8

    + +

    2 JSON Format +Design. 9

    + +

    3 Requesting +the JSON Format 10

    + +

    3.1 Controlling the Amount of Control +Information in Responses. 10

    + +

    3.1.1 +metadata=minimal (odata.metadata=minimal) 10

    + +

    3.1.2 +metadata=full (odata.metadata=full) 11

    + +

    3.1.3 +metadata=none (odata.metadata=none) 11

    + +

    3.2 Controlling the Representation of +Numbers. 11

    + +

    4 Common +Characteristics. 13

    + +

    4.1 Header Content-Type. 13

    + +

    4.2 Message Body. 13

    + +

    4.3 Relative URLs. 13

    + +

    4.4 Payload Ordering Constraints. 14

    + +

    4.5 Control Information. 15

    + +

    4.5.1 Control Information: context (odata.context) 15

    + +

    4.5.2 Control Information: metadataEtag (odata.metadataEtag) 15

    + +

    4.5.3 Control Information: type (odata.type) 15

    + +

    4.5.4 Control Information: count (odata.count) 17

    + +

    4.5.5 Control Information: nextLink (odata.nextLink) 17

    + +

    4.5.6 Control Information: delta (odata.delta) 17

    + +

    4.5.7 Control Information: deltaLink (odata.deltaLink) 17

    + +

    4.5.8 Control Information: id (odata.id) 17

    + +

    4.5.9 Control Information: editLink and readLink (odata.editLink +and odata.readLink) 17

    + +

    4.5.10 Control Information: etag (odata.etag) 18

    + +

    4.5.11 Control Information: navigationLink and associationLink (odata.navigationLink and odata.associationLink) 18

    + +

    4.5.12 Control Information: media* (odata.media*) 19

    + +

    4.5.13 Control Information: removed (odata.removed) 19

    + +

    4.5.14 Control Information: collectionAnnotations (odata.collectionAnnotations) 19

    + +

    5 Service +Document 21

    + +

    6 Entity. 23

    + +

    7 Structural +Property. 24

    + +

    7.1 Primitive Value. 24

    + +

    7.2 Complex Value. 25

    + +

    7.3 Collection of Primitive Values. 25

    + +

    7.4 Collection of Complex Values. 25

    + +

    7.5 Untyped Value. 26

    + +

    8 Navigation +Property. 27

    + +

    8.1 Navigation Link. 27

    + +

    8.2 Association Link. 27

    + +

    8.3 Expanded Navigation Property. 27

    + +

    8.4 Deep Insert 28

    + +

    8.5 Bind Operation. 28

    + +

    8.6 Collection ETag. 29

    + +

    9 Stream +Property. 31

    + +

    10 Media Entity. 32

    + +

    11 Individual +Property or Operation Response. 33

    + +

    12 Collection of +Operation Responses. 34

    + +

    13 Collection of +Entities. 35

    + +

    14 Entity +Reference. 36

    + +

    15 Delta Payload. 37

    + +

    15.1 Delta Responses. 37

    + +

    15.2 Added/Changed Entity. 38

    + +

    15.3 Deleted Entity. 40

    + +

    15.4 Added Link. 41

    + +

    15.5 Deleted Link. 41

    + +

    15.6 Update a Collection of Entities. 41

    + +

    16 Bound Function. 44

    + +

    17 Bound Action. 46

    + +

    18 Action +Invocation. 48

    + +

    19 Batch Requests +and Responses. 49

    + +

    19.1 Batch Request 49

    + +

    19.2 Referencing New Entities. 51

    + +

    19.3 Referencing an ETag. 51

    + +

    19.4 Processing a Batch Request 52

    + +

    19.5 Batch Response. 52

    + +

    19.6 Asynchronous Batch Requests. 53

    + +

    20 Instance +Annotations. 56

    + +

    20.1 Annotate a JSON Object 56

    + +

    20.2 Annotate a JSON Array or +Primitive. 56

    + +

    20.3 Annotate a Primitive Value within +a JSON Array. 57

    + +

    21 Error Handling. 58

    + +

    21.1 Error Response. 58

    + +

    21.2 In-Stream Error 58

    + +

    21.3 Error Information in a Success +Payload. 59

    + +

    21.3.1 Primitive Value Errors. 59

    + +

    21.3.2 Structured Type Errors. 59

    + +

    21.3.3 Collection Errors. 59

    + +

    22 Extensibility. 60

    + +

    23 Security Considerations. 61

    + +

    24 Conformance. 62

    + +

    Appendix A. Acknowledgments. 64

    + +

    Appendix B. Revision +History. 65

    + +

     

    + + + +

    The OData protocol is comprised of a set of specifications +for representing and interacting with structured content. The core +specification for the protocol is in [OData-Protocol]; +this document is an extension of the core protocol. This document defines +representations for the OData requests and responses using the JavaScript +Object Notation (JSON), see [RFC8259].

    + +

    An OData JSON payload may represent:

    + +

             +a single primitive value

    + +

             +a collection of +primitive values

    + +

             +a single complex type value

    + +

             +a collection of complex +type values

    + +

             +a single entity or entity reference

    + +

             +a collection of entities or +entity references

    + +

             +a collection of changes

    + +

             +a service document describing +the top-level resources exposed by the service

    + +

             +an error.

    + +

    1.0 +IPR Policy

    + +

    This specification is provided under the RF on +RAND Terms Mode of the OASIS IPR Policy, +the mode chosen when the Technical Committee was established. For information +on whether any patents have been disclosed that may be essential to +implementing this specification, and any offers of patent licensing terms, +please refer to the Intellectual Property Rights section of the TCs web page (https://www.oasis-open.org/committees/odata/ipr.php).

    + +

    1.1 Terminology

    + +

    The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL +NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL in this +document are to be interpreted as described in [RFC2119].

    + +

    1.2 Normative References

    + +

    [ECMAScript] ECMAScript +2016 Language Specification, 7th Edition, June 2016. Standard +ECMA-262. http://www.ecma-international.org/publications/standards/Ecma-262.htm. +

    + +

    [OData-ABNF] OData +ABNF Construction Rules Version 4.01.
    +See link in Related work section on cover page.

    + +

    [OData-CSDLJSON] OData Common Schema Definition +Language (CSDL) JSON Representation Version 4.01. See link in Related +work section on cover page.

    + +

    [OData-CSDLXML] OData Common Schema +Definition Language (CSDL) XML Representation Version 4.01. See link in +"Related work" section on cover page.

    + +

    [OData-Protocol] OData +Version 4.01 Part 1: Protocol.
    +See link in Related work section on cover page.

    + +

    [OData-URL] OData +Version 4.01 Part 2: URL Conventions.
    +See link in "Related work" section on cover page.

    + +

    [OData-VocCap] OData Vocabularies +Version 4.0: Capabilities Vocabulary.
    +See link in "Related work" section on cover page.

    + +

    [OData-VocCore] OData Vocabularies +Version 4.0: Core Vocabulary.
    +See link in "Related work" section on cover page

    + +

    [RFC2119] Bradner, +S., Key words for use in RFCs to Indicate Requirement Levels, BCP 14, RFC +2119, March 1997. https://tools.ietf.org/html/rfc2119. +

    + +

    [RFC3986] Berners-Lee, +T., Fielding, R., and L. Masinter, Uniform Resource Identifier (URI): Generic +Syntax, IETF RFC3986, January 2005. https://tools.ietf.org/html/rfc3986. +

    + +

    [RFC3987] Duerst, +M. and, M. Suignard, Internationalized Resource Identifiers (IRIs), RFC 3987, +January 2005. https://tools.ietf.org/html/rfc3987. +

    + +

    [RFC4648] Josefsson, S,, +The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006. https://tools.ietf.org/html/rfc4648.

    + +

    [RFC5646] Phillips, +A., Ed., and M. Davis, Ed., Tags for Identifying Languages, BCP 47, RFC 5646, +September 2009. http://tools.ietf.org/html/rfc5646. +

    + +

    [RFC7493] Bray, T., Ed., "The I-JSON +Message Format", RFC7493, March 2015. https://tools.ietf.org/html/rfc7493.

    + +

    [RFC7946] Howard +Butler, Martin Daly, Alan Doyle, Sean Gillies, Stefan +Hagen and Tim Schaub, "The GeoJSON Format", RFC 7946, August 2016.
    +
    http://tools.ietf.org/html/rfc7946.

    + +

    [RFC8259] Bray, +T., Ed., The JavaScript Object Notation (JSON) Data Interchange Format, RFC 8259, +December 2017. http://tools.ietf.org/html/rfc8259. +

    + +

    1.3 +Non-Normative References

    + +

    [GeoJSON-2008] Butler, H., Daly, M., Doyle, A., +Gillies, S., Schaub, T., and C. Schmidt, "The GeoJSON Format +Specification", June 2008. http://geojson.org/geojson-spec.html.

    + +

    1.4 Typographical +Conventions

    + +

    Keywords defined by this specification use this monospaced font.

    + +

    Normative source code uses this paragraph style.

    + +

    Some sections of this specification are illustrated with +non-normative examples.

    + +

    Example 1: text describing an example uses this paragraph +style

    + +
    + +

    Non-normative examples use this paragraph style.

    + +
    + +

    All examples in this document are non-normative and +informative only.

    + +

    All other text is normative unless otherwise labeled.

    + + + +

    JSON, as described in [RFC8259], defines a text format for serializing structured data. +Objects are serialized as an unordered collection of name/value pairs.

    + +

    JSON does not define any semantics around the name/value +pairs that make up an object, nor does it define an extensibility mechanism for +adding control information to a payload.

    + +

    ODatas JSON format extends JSON by defining general +conventions for name/value pairs that annotate a JSON object, property or +array. OData defines a set of canonical name/value pairs for control +information such as ids, types, and links, and instance annotations MAY be used to add +domain-specific information to the payload.

    + +

    A key feature of ODatas JSON format is to allow omitting +predictable parts of the wire format from the actual payload. To reconstitute +this data on the receiving end, expressions are used to compute missing links, +type information, and other control data. These expressions (together with the +data on the wire) can be used by the client to compute predictable payload +pieces as if they had been included on the wire directly.

    + +

    Control information is used in JSON to capture instance +metadata that cannot be predicted (e.g. the next link of a collection) as well +as a mechanism to provide values where a computed value would be wrong (e.g. if +the media read link of one particular entity does not follow the standard URL +conventions). Computing values from metadata expressions is compute intensive +and some clients might opt for a larger payload size to avoid computational +complexity; to accommodate for this the Accept +header allows the client to control the amount of control information added to +the response.

    + +

    To optimize streaming scenarios, there are a few +restrictions that MAY be imposed on the sequence in which name/value pairs +appear within JSON objects. For details on the ordering requirements see Payload Ordering Constraints.

    + +
    + +

    3     +Requesting the JSON Format

    + +
    + +

    The OData JSON format can be requested using the $format query option in the request URL with the media type +application/json, optionally followed by format +parameters, or the case-insensitive abbreviation json +which MUST NOT be followed by format parameters.

    + +

    Alternatively, this format can be requested using the Accept header with the media type application/json, +optionally followed by format parameters.

    + +

    If specified, $format overrides +any value specified in the Accept header.

    + +

    Possible format parameters are:

    + +

             +ExponentialDecimals

    + +

             +IEEE754Compatible

    + +

             +metadata (odata.metadata)

    + +

             +streaming (odata.streaming)

    + +

    The names and values of these format parameters are +case-insensitive.

    + +

    Services SHOULD advertise the supported media types by +annotating the entity container with the term Capabilities.SupportedFormats defined in [OData-VocCap], listing all available +formats and combinations of supported format parameters.

    + +

    3.1 Controlling the Amount of +Control Information in Responses

    + +

    The amount of control +information needed (or desired) in the payload depends on the client +application and device. The metadata parameter can +be applied to the Accept header of an OData request +to influence how much control information will be included in the response.

    + +

    Other Accept header parameters +(e.g., streaming) are orthogonal to the metadata parameter and are therefore not mentioned in +this section.

    + +

    If a client prefers a very small wire size and is +intelligent enough to compute data using metadata expressions, the Accept header should include metadata=minimal. +If computation is more critical than wire size or the client is incapable of +computing control information, metadata=full directs the service +to inline the control information that normally would be computed from metadata +expressions in the payload. metadata=none is an option for +clients that have out-of-band knowledge or don't require control information.

    + +

    In addition, the client may use the include-annotations +preference in the Prefer header to request +additional control information. Services supporting this MUST NOT omit control +information required by the chosen metadata +parameter, and services MUST NOT exclude the nextLink, +deltaLink, and count +if they are required by the response type.

    + +

    If the client includes the OData-MaxVersion +header in a request and does not specify the metadata +format parameter in either the Accept header or $format query option, the service MUST return at least +the minimal control +information.

    + +

    Note that in OData 4.0 the metadata +format parameter was prefixed with odata.. +Payloads with an OData-Version header equal to 4.0 MUST +include the odata. prefix. Payloads with an OData-Version header equal to 4.01 or greater SHOULD NOT +include the odata. prefix.

    + +

    3.1.1 metadata=minimal +(odata.metadata=minimal)

    + +

    The metadata=minimal format +parameter indicates that the service SHOULD remove computable control +information from the payload wherever possible. The response payload MUST +contain at least the following control +information:

    + +

             +context: the root context URL of +the payload and the context URL for any deleted entries or added or deleted +links in a delta response, or for entities or entity collections whose set +cannot be determined from the root context URL

    + +

             +etag: the ETag of the entity or +collection, as appropriate

    + +

             +count: the total count of a +collection of entities or collection of entity references, if requested

    + +

             +nextLink: the next link of a +collection with partial results

    + +

             +deltaLink: the delta link for +obtaining changes to the result, if requested

    + +

    In addition, control information MUST appear in the payload +for cases where actual values are not the same as the computed values and MAY +appear otherwise. When control information appears in the payload, it is +treated as exceptions to the computed values.

    + +

    Media entities and stream properties MAY in addition contain +the following control information:

    + +

             +mediaEtag: the ETag of the stream, +as appropriate

    + +

             +mediaContentType: the media type +of the stream

    + +

    3.1.2 metadata=full +(odata.metadata=full)

    + +

    The metadata=full format +parameter indicates that the service MUST include all control information +explicitly in the payload.

    + +

    The full list of control +information that may appear in a metadata=full +response is as follows:

    + +

             +context: the context URL for a +collection, entity, primitive value, or service document.

    + +

             +count: the total count of a +collection of entities or collection of entity references, if requested.

    + +

             +nextLink: the next link of a +collection with partial results

    + +

             +deltaLink: the delta link for +obtaining changes to the result, if requested

    + +

             +id: the ID of the entity

    + +

             +etag: the ETag of the entity or +collection, as appropriate

    + +

             +readLink: the link used to read +the entity, if the edit link cannot be used to read the entity

    + +

             +editLink: the link used to +edit/update the entity, if the entity is updatable and the id +does not represent a URL that can be used to edit the entity

    + +

             +navigationLink: +the link used to retrieve the values of a navigation property

    + +

             +associationLink: +the link used to describe the relationship between this entity and related +entities

    + +

             +type: the type of the containing +object or targeted property if the type of the object or targeted property +cannot be heuristically determined from the data value, see section Control Information: type +(odata.type).

    + +

    Media entities and stream properties may in addition contain +the following control information:

    + +

             +mediaReadLink: the link used to +read the stream

    + +

             +mediaEditLink: the link used to +edit/update the stream

    + +

             +mediaEtag: the ETag of the stream, +as appropriate

    + +

             +mediaContentType: the media type +of the stream

    + +

    3.1.3 metadata=none +(odata.metadata=none)

    + +

    The metadata=none format +parameter indicates that the service SHOULD omit control information other than +nextLink and count. +This control information MUST continue to be included, as applicable, even in +the metadata=none case.

    + +

    It is not valid to specify metadata=none +on a delta request.

    + +

    3.2 Controlling the Representation +of Numbers

    + +

    The IEEE754Compatible=true +format parameter indicates that the service MUST serialize Edm.Int64 and Edm.Decimal +numbers (including the count, if requested) as strings. +This is in conformance with [RFC7493].

    + +

    If not specified, or specified as IEEE754Compatible=false, +all numbers MUST be serialized as JSON numbers.

    + +

    This enables support for JavaScript numbers that are defined +to be 64-bit binary format IEEE 754 values [ECMAScript] +(see section +4.3.1.9) resulting in integers losing precision past 15 digits, and +decimals losing precision due to the conversion from base 10 to base 2.

    + +

    OData JSON request and response payloads that format Edm.Int64 and Edm.Decimal +values as strings MUST specify this format parameter in the media type sent in +the Content-Type +header.

    + +

    Services producing responses without format parameter IEEE754Compatible=true which are unable to produce exact +JSON numbers MAY serialize Edm.Int64 and Edm.Decimal numbers with a rounded/inexact value as a +JSON number and annotate that value with an instance annotation with term Core.ValueException defined in [OData-VocCore] +containing the exact value as a string. This situation can for example happen +if the client only accepts application/json without +any format parameters and the service is written in JavaScript.

    + +

    For payloads with an OData-Version header +equal to 4.0 +the ExponentialDecimals=true format parameter indicates +that the service MAY serialize Edm.Decimal numbers in +exponential notation (e.g. 1e-6 instead of 0.000001).

    + +

    The sender of a request MUST specify ExponentialDecimals=true +in the Content-Type header if the request body +contains Edm.Decimal values in exponential +notation.

    + +

    If not specified, or specified as ExponentialDecimals=false, +all Edm.Decimal values MUST be serialized in long +notation, using only an optional sign, digits, and an optional decimal point +followed by digits.

    + +

    Payloads with an OData-Version header +equal to 4.01 +or greater always allow exponential notation for numbers and the ExponentialDecimals format parameter is not needed or +used.

    + + + +

    This section describes common characteristics of the +representation for OData values in JSON. A request or response body consists of +several parts. It contains OData values as part of a larger document. Requests +and responses are structured almost identical; the few existing differences +will be explicitly called out in the respective subsections.

    + +

    4.1 Header Content-Type

    + +

    Requests and responses with a JSON message body MUST have a Content-Type header value of application/json. +

    + +

    Requests MAY add the charset +parameter to the content type. Allowed values are UTF-8, UTF-16, and UTF-32. If no charset parameter is present, UTF-8 +MUST be assumed.

    + +

    Responses MUST include the metadata +parameter to specify the amount of metadata included in the response.

    + +

    Requests and responses MUST include the IEEE754Compatible +parameter if Edm.Int64 and Edm.Decimal +numbers are represented as strings.

    + +

    Requests and responses MAY add the streaming +parameter with a value of true or false, see section Payload Ordering Constraints.

    + +

    4.2 Message Body

    + +

    Each message body is represented as a single JSON object. +This object is either the representation of an entity, an entity reference +or a complex type instance, or it contains a +name/value pair whose name MUST be value and whose +value is the correct representation for a primitive +value, a collection of primitive +values, a collection of complex +values, a collection of entities, +or a collection of objects that represent changes +to a previous result.

    + +

    Client +libraries MUST retain the order of objects within an array in JSON responses.

    + +

    4.3 Relative URLs

    + +

    URLs present in a payload (whether request or response) MAY +be represented as relative URLs.

    + +

    Relative URLs, other than those in type, +are relative to their base URL, which is

    + +

             +the context +URL of the same JSON object, if one exists, otherwise

    + +

             +the context URL of the enclosing object, if one exists, otherwise

    + +

             +the context URL of the next enclosing object, if one exists, etc. +until the document root, otherwise

    + +

             +the request URL.

    + +

    For context URLs, these rules apply starting with the second +bullet point.

    + +

    Within the type control information, relative +URLs are relative to the base type URL, which is

    + +

             +the type of the enclosing object, if +one exists, otherwise

    + +

             +the type of the next enclosing +object, if one exists, etc. until the document root, otherwise

    + +

             +the context URL of the document root, if one exists, otherwise

    + +

             +the request URL.

    + +

    Processors expanding the URLs MUST use normal URL expansion +rules as defined in RFC3986. This means that if the +base URL is a context URL, the part starting with $metadata# +is ignored when resolving the relative URL.

    + +

    Clients that receive relative URLs in response payloads +SHOULD use the same relative URLs, where appropriate, in request payloads (such +as bind operations and batch requests) and in +system query options (such as $id).

    + +

    URLs represented as a string within a JSON payload, +including batch requests, must follow standard +OData encoding rules. For relative URLs this means that colons in the path part, +especially within key values, MUST be percent-encoded to avoid confusion with +the scheme separator. Colons within the query part, i.e. after the question +mark character (?), need not be percent-encoded.

    + +

    Example 2:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    ...

    + +

    "@editLink": "Customers('ALFKI')",

    + +

    ...

    + +

    "Orders@navigationLink": "Customers('ALFKI')/Orders",

    + +

    ...

    + +

    }

    + +
    + +

    The resulting absolute URLs are http://host/service/Customers('ALFKI') +and http://host/service/Customers('ALFKI')/Orders.

    + +

    4.4 Payload Ordering Constraints

    + +

    Ordering constraints MAY be imposed on the JSON payload in +order to support streaming scenarios. These ordering constraints MUST only be +assumed if explicitly specified as some clients (and services) might not be +able to control, or might not care about, the order of the JSON properties in +the payload.

    + +

    Clients can request that a JSON response conform to these +ordering constraints by specifying a media type of application/json with the streaming=true +parameter in the Accept header +or $format query option. +Services MUST return 406 Not Acceptable +if the client only requests streaming and the service does not support it.

    + +

    Clients may specify the streaming=true +parameter in the Content-Type +header of requests to indicate that the request body follows the payload ordering +constraints. In the absence of this parameter, the service must assume that the +JSON properties in the request are unordered.

    + +

    Processors MUST only assume streaming support if it is +explicitly indicated in the Content-Type header via +the streaming=true parameter.

    + +

    Example 3: a payload with

    + +
    + +

    Content-Type: application/json;metadata=minimal;streaming=true +

    + +
    + +

    can be assumed to support streaming, whereas a payload with +

    + +
    + +

    Content-Type: application/json;metadata=minimal

    + +
    + +

    cannot be assumed to support streaming.

    + +

    JSON producers are encouraged to follow the payload ordering +constraints whenever possible (and include the streaming=true +content-type parameter) to support the maximum set of client scenarios.

    + +

    To support streaming scenarios the following payload +ordering constraints have to be met:

    + +

             +If present, the context control +information MUST be the first property in the JSON object.

    + +

             +The type control information, if +present, MUST appear next in the JSON object.

    + +

             +The id and etag +control information MUST appear before any property, property annotation, or +property control information.

    + +

             +All annotations or control information for a structural or +navigation property MUST appear as a group immediately before the property itself. +The one exception is the nextLink of a collection which MAY +appear after the collection it annotates.

    + +

             +All other control +information can appear anywhere in the payload as long as it does +not violate any of the above rules.

    + +

             +For 4.0 payloads, annotations and control information for +navigation properties MUST appear after all structural properties. 4.01 clients +MUST NOT assume this ordering.

    + +

    Note that, in OData 4.0, the streaming format parameter was prefixed with odata.. Payloads with an OData-Version header +equal to 4.0 +MUST include the odata. prefix. Payloads with an OData-Version header equal to 4.01 or greater SHOULD NOT +include the odata. prefix.

    + +

    4.5 Control +Information

    + +

    In addition to the pure data a message body MAY contain annotations and control information that is +represented as name/value pairs whose names start with @.

    + +

    In requests and responses with an OData-Version header with a value of 4.0 +control information names are prefixed with @odata., +e.g. @odata.context. In requests and responses +without such a header the odata. +infix SHOULD be omitted, e.g @context.

    + +

    In some cases, control information is required in request +payloads; this is called out in the following subsections.

    + +

    Receivers that +encounter unknown annotations in any +namespace or unknown control information MUST NOT stop processing and MUST NOT +signal an error.

    + +

    4.5.1 Control Information: context (odata.context)

    + +

    The context +control information returns the context URL (see [OData-Protocol]) +for the payload. This URL can be absolute or relative.

    + +

    The context +control information is not returned if metadata=none is requested. Otherwise it +MUST be the first property of any JSON response.

    + +

    The context +control information MUST also be included in requests and responses for +entities whose entity set cannot be determined from the context URL of the collection.

    + +

    For more information on the format of the context URL, see [OData-Protocol].

    + +

    Request payloads MAY include a context URL as a base URL for +relative URLs in the request payload.

    + +

    Example 4:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    "@metadataEtag": "W/\"A1FF3E230954908F\"",

    + +

    ...

    + +

    }

    + +
    + +

    4.5.2 Control Information: metadataEtag (odata.metadataEtag)

    + +

    The metadataEtag control +information MAY appear in a response in order to specify the entity tag (ETag) that +can be used to determine the version of the metadata of the response. If an +ETag is returned when requesting the metadata document, then the service SHOULD +set the metadataEtag control information to the +metadata document's ETag in all responses when using metadata=minimal +or metadata=full. +If no ETag is returned when requesting the metadata document, then the service +SHOULD NOT set the metadataEtag control information +in any responses.

    + +

    For details on how ETags are used, see [OData-Protocol].

    + +

    4.5.3 Control Information: type (odata.type)

    + +

    The type control information +specifies the type of a JSON object or name/value pair. Its value is a URI that +identifies the type of the property or object. For built-in primitive types the +value is the unqualified name of the primitive type. For payloads described by +an OData-Version header with a +value of 4.0, this name MUST be prefixed with the +hash symbol (#); for non-OData +4.0 payloads, built-in primitive type values SHOULD be represented without the +hash symbol, but consumers of 4.01 or greater payloads MUST support values with +or without the hash symbol. For all other types, the URI may be absolute or +relative to the type of the containing object. The +root type may be absolute or relative to the root context URL.

    + +

    If the URI +references a metadata document (that is, its not just a fragment), it MAY +refer to a specific version of that metadata document using the $schemaversion system query +option defined in [OData-Protocol].

    + +

    For non-built in primitive types, the URI contains the +namespace-qualified or alias-qualified type, specified as a URI fragment. For +properties that represent a collection of values, the fragment is the +namespace-qualified or alias-qualified element type enclosed in parentheses and +prefixed with Collection. The namespace or alias +MUST be defined or the namespace referenced in the metadata document of the +service, see [OData-CSDLJSON] or [OData-CSDLXML].

    + +

    The type control information +MUST appear in requests and in responses with minimal or full metadata, if the type cannot +be heuristically determined, as described below, and one of the following is +true:

    + +

             +The type is derived from the type specified for the (collection +of) entities or (collection of) complex type instances, or

    + +

             +The type is for a property whose type is not declared in $metadata.

    + +

    The following heuristics are used to determine the primitive +type of a dynamic property in the absence of the type +control information:

    + +

             +Boolean values have a first-class representation in JSON and do +not need any additional control information.

    + +

             +Numeric values have a first-class representation in JSON but are +not further distinguished, so they include a type control information unless +their type is Double.

    + +

             +The special floating-point values -INF, +INF, and NaN are +serialized as strings and MUST have a type control information to specify +the numeric type of the property.

    + +

             +String values do have a first class representation in JSON, but +there is an obvious collision: OData also encodes a number of other primitive +types as strings, e.g. DateTimeOffset, Int64 in the presence of the IEEE754Compatible +format parameter etc. If a property appears in JSON string format, it should be +treated as a string value unless the property is known (from the metadata +document) to have a different type.

    + +

    For more information on namespace- and alias-qualified +names, see [OData-CSDLJSON] or [OData-CSDLXML].

    + +

    Example 5: entity of type Model.VipCustomer +defined in the metadata document of the same service with a dynamic property of +type Edm.Date

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    "@type": "#Model.VipCustomer",

    + +

    "ID": 2,

    + +

    "DynamicValue@type": "Date",

    + +

    "DynamicValue": "2016-09-22",

    + +

    ...

    + +

    }

    + +
    + +

    Example 6: entity of type Model.VipCustomer +defined in the metadata document +of a different service

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    "@type": "http://host/alternate/$metadata#Model.VipCustomer",

    + +

    "ID": 2,

    + +

    ...

    + +

    }

    + +
    + +

    4.5.4 Control Information: count (odata.count)

    + +

    The count control information +occurs only in responses and can annotate any collection, see [OData-Protocol] +section 11.2.5.5 System Query Option $count. +Its value is an Edm.Int64 value +corresponding to the total count of members in the collection represented by +the request.

    + +

    4.5.5 Control Information: nextLink (odata.nextLink)

    + +

    The nextLink control information +indicates that a response is only a subset of the requested collection. It +contains a URL that allows retrieving the next subset of the requested +collection.

    + +

    This control information can also be applied to expanded to-many navigation properties.

    + +

    4.5.6 Control Information: delta (odata.delta)

    + +

    The delta control information is +applied to a collection-valued navigation property within an added/changed entity in a delta payload to +represent changes in membership or value of nested entities.

    + +

    4.5.7 Control Information: deltaLink (odata.deltaLink)

    + +

    The deltaLink control +information contains a URL that can be used to retrieve changes to the current +set of results. The deltaLink control information +MUST only appear on the last page of results. A page of results MUST NOT have +both a deltaLink control information and a nextLink +control information.

    + +

    4.5.8 Control Information: id (odata.id)

    + +

    The id control information +contains the entity-id, see [OData-Protocol]. By +convention the entity-id is identical to the canonical URL of the entity, as +defined in [OData-URL].

    + +

    The id control information MUST +appear in responses if metadata=full is requested, or if metadata=minimal +is requested and any of a non-transient entity's key fields are omitted from +the response or the entity-id is not identical to the canonical URL of +the entity after

    + +

             +IRI-to-URI conversion as defined in [RFC3987], +

    + +

             +relative resolution as defined in section 5.2 of [RFC3986], and

    + +

             +percent-encoding normalization as defined in section 6 of [RFC3986].

    + +

    Note that the entity-id MUST be invariant across languages, +so if key values are language dependent then the id +MUST be included if it does not match convention for the localized key values. +If the id is represented, it MAY be a relative URL.

    + +

    If the entity is transient (i.e. cannot be read or updated), +the id control information MUST appear in OData 4.0 +payloads and have the null value. In 4.01 payloads +transient entities need not have the id control +information, and 4.01 clients MUST treat entities with neither id control information nor a full set of key properties +as transient entities.

    + +

    The id control information MUST +NOT appear for a collection. Its meaning in this context is reserved for future +versions of this specification.

    + +

    Entities with id equal to null cannot be compared to other entities, reread, or +updated. If metadata=minimal is specified and +the id is not present in the entity, then the +canonical URL MUST be used as the entity-id.

    + +

    4.5.9 Control Information: editLink and readLink (odata.editLink +and odata.readLink)

    + +

    The editLink +control information contains the edit URL of the entity; see [OData-Protocol]. +

    + +

    The readLink control information +contains the read URL of the entity or collection; see [OData-Protocol].

    + +

    The editLink and readLink control information is ignored in request +payloads and not written in responses if metadata=none +is requested.

    + +

    The default value of both the edit URL and read URL is the +entity's entity-id appended with +a cast segment to the type of the entity if its type is derived from the +declared type of the entity set. If neither the editLink +nor the readLink control information is present in +an entity, the client uses this default value for the edit URL.

    + +

    For updatable entities:

    + +

             +The editLink control information is +written if metadata=full is requested or if metadata=minimal +is requested and the edit URL differs from the default value of the edit URL.

    + +

             +The readLink control information is +written if the read URL is different from the edit URL. If no readLink control information is present, the read URL is +identical to the edit URL.

    + +

    For read-only entities:

    + +

             +The readLink control information is +written if metadata=full is requested or if metadata=minimal +is requested and its value differs from the default value of the read URL.

    + +

             +The readLink control information may +also be written if metadata=minimal is specified in +order to signal that an individual entity is read-only.

    + +

    For collections:

    + +

             +The readLink control information, if +written, MUST be the request URL that produced the collection.

    + +

             +The editLink control information MUST +NOT be written as its meaning in this context is reserved for future versions +of this specification.

    + +

    4.5.10 Control Information: etag (odata.etag)

    + +

    The etag control information MAY +be applied to an entity or +collection in a response. The value of the control information is an entity tag +(ETag) which is an opaque string value that can be used in a subsequent request +to determine if the value of the entity or collection has changed.

    + +

    For details on how ETags are used, see [OData-Protocol].

    + +

    The etag +control information is ignored in request payloads for single entities and not +written in responses if metadata=none is requested.

    + +

    4.5.11 +Control Information: navigationLink and associationLink (odata.navigationLink and odata.associationLink)

    + +

    The navigationLink control information in a response +contains a navigation URL that can be used to retrieve an entity or +collection of entities related to the current entity via a navigation property.

    + +

    The default computed value of a navigation URL is the +value of the read URL +appended with a segment containing the name of the navigation property. The +service MAY omit the navigationLink control +information if metadata=minimal has been +specified on the request and the navigation link matches this computed value.

    + +

    The +associationLink +control information in a response contains an association URL that can +be used to retrieve a reference to an entity or a collection of references to +entities related to the current entity via a navigation property.

    + +

    The default computed value of an association URL is +the value of the navigation URL appended with /$ref. +The service MAY omit the associationLink control +information if the association link matches this computed value.

    + +

    The navigationLink +and associationLink control information is ignored +in request payloads and not written in responses if metadata=none +is requested.

    + +

    4.5.12 Control Information: media* (odata.media*)

    + +

    For media entities and stream properties at least one of the control +information mediaEditLink and mediaReadLink +MUST be included in responses if they don't follow standard URL conventions as +defined in [OData-URL] or if metadata=full +is requested.

    + +

    The mediaEditLink control +information contains a URL that can be used to update the binary stream +associated with the media entity or stream property. It MUST be included for +updatable streams if it differs from standard URL conventions relative to the +edit link of the entity.

    + +

    The mediaReadLink control +information contains a URL that can be used to read the binary stream +associated with the media entity or stream property. It MUST be included if its +value differs from the value of the associated mediaEditLink, +if present, or if it doesnt follow standard URL conventions relative to the +read link of the entity and the associated mediaEditLink +is not present.

    + +

    The mediaContentType control +information MAY be included; its value SHOULD match the media type of the +binary stream represented by the mediaReadLink URL. +This is only a hint; the actual media type will be included in the Content-Type header when the resource is requested.

    + +

    The mediaEtag control information +MAY be included; its value is the ETag of the binary stream represented by this +media entity or stream property.

    + +

    The media* control information +is not written in responses if metadata=none is requested.

    + +

    If a stream property is provided inline in a request, the mediaContentType control information may be specified.

    + +

    If a stream property is annotated with Capabilities.MediaLocationUpdateSupported +(see [OData-VocCap]) and a value of true, clients MAY specify the mediaEditLink +and/or mediaReadLink control information for that +stream property in order to change the association between the stream property +and a media stream.

    + +

    In all other cases media* +control information is ignored in request payloads.

    + +

    Example 7:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees/$entity",

    + +

    "@mediaReadLink": "Employees(1)/$value",

    + +

    "@mediaContentType": "image/jpeg",

    + +

    "ID": 1,

    + +

    ...

    + +

    }

    + +
    + +

    4.5.13 Control Information: removed (odata.removed)

    + +

    The removed control information +is used in delta payloads and indicates that +the represented entity is (to be) deleted.

    + +

    4.5.14 +Control Information: collectionAnnotations (odata.collectionAnnotations)

    + +

    The collectionAnnotations +control information can be applied to a collection containing primitive members +in order to annotate such primitive members. The value of the collectionAnnotations control information is an array of +JSON objects containing an integer property index, +specifying the zero-based ordinal index of the primitive item within the +collection, along with any annotations that are to be applied to that primitive +collection member.

    + +

    Example 8: Annotating primitive values within a collection

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees/$entity",

    + +

    "ID": 1,

    + +

    "EmailAddresses@collectionAnnotations" : [

    + +

    {

    + +

    "index":0,

    + +

    "@emailType":"Personal"

    + +

    },

    + +

    {

    + +

    "index":2,

    + +

    "@emailType":"Work"

    + +

    }

    + +

    ],

    + +

    "EmailAddresses": [

    + +

    "Julie@Swansworth.com",

    + +

    "JulieSwa@live.com",

    + +

    "Julie.Swansworth@work.com"

    + +

    ],

    + +

    ...

    + +

    }

    + +
    + +

     

    + + + +

    A service document in JSON is represented as a single JSON +object with at least the context control information and a +property value.

    + +

    The value of the context +control information MUST be the URL of the metadata document, without any +fragment part.

    + +

    The value of the value property +MUST be a JSON array containing one element for each entity set and function +import with an explicit or default value of true +for the attribute IncludeInServiceDocument and each +singleton exposed by the service, see [OData-CSDLJSON] +or [OData-CSDLXML].

    + +

    Each element MUST be a JSON object with at least two +name/value pairs, one with name name containing the +name of the entity set, function import, or singleton, and one with name url containing the URL of the entity set, which may be an +absolute or a relative URL. It MAY contain a +name/value pair with name title containing a +human-readable, language-dependent title for the object.

    + +

    JSON objects representing an entity set MAY contain an +additional name/value pair with name kind and a +value of EntitySet. If the kind +name/value pair is not present, the object MUST represent an entity set.

    + +

    JSON objects representing a function import MUST contain the +kind name/value pair with a value of FunctionImport.

    + +

    JSON objects representing a singleton MUST contain the kind name/value pair with a value of Singleton.

    + +

    JSON objects representing a related service document MUST +contain the kind name/value pair with a value of ServiceDocument.

    + +

    Clients that +encounter unknown values of the kind name/value +pair not defined in this version of the specification MUST NOT stop processing and MUST NOT signal an error.

    + +

    Service documents MAY contain annotations in any of its JSON objects. +Services MUST NOT produce name/value pairs other than the ones explicitly +defined in this section, and clients MUST ignore unknown name/value pairs.

    + +

    Example 9:

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata",

    + +

    "value": [

    + +

    {

    + +

    "name": "Orders",

    + +

    "kind": "EntitySet",

    + +

    "url": "Orders"

    + +

    },

    + +

    {

    + +

    "name": "OrderItems",

    + +

    "title": "Order Details",

    + +

    "url": "OrderItems"

    + +

    },

    + +

    {

    + +

    "name": "TopProducts",

    + +

    "title": "Best-Selling Products",

    + +

    "kind": "FunctionImport",

    + +

    "url": "TopProducts"

    + +

    },

    + +

    {

    + +

    "name": "MainSupplier",

    + +

    "title": "Main Supplier",

    + +

    "kind": "Singleton",

    + +

    "url": "MainSupplier"

    + +

    },

    + +

    {

    + +

    "name": "Human Resources",

    + +

    "kind": "ServiceDocument",

    + +

    "url": "http://host/HR/"

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +
    + +

    6     +Entity

    + +
    + +

    An entity is serialized as a JSON object. It MAY contain context, +type, +or deltaLink +control information.

    + +

    Each property to be +transmitted is represented as a name/value pair within the object. The order +properties appear within the object is considered insignificant.

    + +

    An entity in a payload may be a complete entity, a projected +entity (see System Query Option $select [OData-Protocol]), or a partial entity update (see Update +an Entity in [OData-Protocol]).

    + +

    An entity representation can be (modified and) round-tripped +to the service directly. The context +URL is used in requests only as a base for relative +URLs.

    + +

    Example 10: entity with metadata=minimal

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    "ID": "ALFKI",

    + +

    "CompanyName": "Alfreds Futterkiste",

    + +

    "ContactName": "Maria Anders",

    + +

    "ContactTitle": "Sales +Representative",

    + +

    "Phone": "030-0074321",

    + +

    "Fax": "030-0076545",

    + +

    "Address": {

    + +

    "Street": "Obere Str. 57",

    + +

    "City": "Berlin",

    + +

    "Region": null,

    + +

    "PostalCode": "D-12209"

    + +

    }

    + +

    }

    + +
    + +

    Example 11: entity with metadata=full

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    "@id": "Customers('ALFKI')",

    + +

    "@etag": "W/\"MjAxMy0wNS0yN1QxMTo1OFo=\"",

    + +

    "@editLink": "Customers('ALFKI')",

    + +

    "ID": "ALFKI",

    + +

    "CompanyName": "Alfreds Futterkiste",

    + +

    "ContactName": "Maria Anders",

    + +

    "ContactTitle": "Sales +Representative",

    + +

    "Phone": "030-0074321",

    + +

    "Fax": "030-0076545",

    + +

    "Address": {

    + +

    "Street": "Obere Str. 57",

    + +

    "City": "Berlin",

    + +

    "Region": +null,

    + +

    "PostalCode": "D-12209",

    + +

    "Country@associationLink":"Customers('ALFKI')/Address/Country/$ref",

    + +

    "Country@navigationLink": +"Customers('ALFKI')/Address/Country"

    + +

    },

    + +

    "Orders@associationLink": "Customers('ALFKI')/Orders/$ref",

    + +

    "Orders@navigationLink": "Customers('ALFKI')/Orders"

    + +

    }

    + +
    + +
    + +

    7     Structural Property

    + +
    + +

    A property within an entity or complex type instance is +represented as a name/value pair. The name MUST be the name of the property; +the value is represented depending on its type as a primitive value, a complex +value, a collection of primitive +values, or a collection of complex values.

    + +

    7.1 +Primitive Value

    + +

    Primitive values are represented following the rules of [RFC8259].

    + +

    Null values are represented as the JSON literal null.

    + +

    Values of type Edm.Boolean are +represented as the JSON literals true and false

    + +

    Values of types Edm.Byte, Edm.SByte, Edm.Int16, Edm.Int32, Edm.Int64, Edm.Single, Edm.Double, and Edm.Decimal are represented as JSON numbers, except for -INF, INF, and NaN which are represented as strings.

    + +

    Values of type Edm.String are +represented as JSON strings, using the JSON string escaping rules.

    + +

    Values of type Edm.Binary, Edm.Date, Edm.DateTimeOffset, Edm.Duration, Edm.Guid, and Edm.TimeOfDay are represented as JSON strings whose +content satisfies the rules binaryValue, dateValue, dateTimeOffsetValue, +durationValue, guidValue, +and timeOfDayValue respectively, in [OData-ABNF].

    + +

    Primitive values that cannot be represented, for example due +to server conversion issues or IEEE754 limitations on the size of an Edm.Int64 or Edm.Decimal value, +are annotated with the Core.ValueException term. In +this case, the payload MAY include an approximation of the value and MAY +specify a string representation of the exact value in the value +property of the annotation.

    + +

    Enumeration values are represented as JSON strings whose +content satisfies the rule enumValue in [OData-ABNF]. The preferred representation is the enumerationMember. If no enumerationMember +(or combination of named +enumeration members) is available, the enumMemberValue +representation may be used.

    + +

    Geography and geometry values are represented as geometry +types as defined in [RFC7946], with the following +modifications:

    + +

             +Keys SHOULD be ordered with type first, then coordinates, then +any other keys

    + +

             +If the optional CRS object is +present, it MUST be of type name, where the value +of the name member of the contained properties object is an EPSG SRID legacy identifier, see [GeoJSON-2008].

    + +

    Geography and geometry types have the same +representation in a JSON payload. Whether the value represents a geography type +or geometry type is inferred from its usage or specified using the type +control information.

    + +

    Example 12:

    + +
    + +

    {

    + +

    "NullValue": null,

    + +

    "TrueValue": true,

    + +

    "FalseValue": false,

    + +

    "BinaryValue": "T0RhdGE",

    + +

    "IntegerValue": -128,

    + +

    "DoubleValue": 3.1415926535897931,

    + +

    "SingleValue": +"INF",

    + +

    "DecimalValue": 34.95,

    + +

    "StringValue": "Say \"Hello\",\nthen go",

    + +

    "DateValue": "2012-12-03",

    + +

    "DateTimeOffsetValue": "2012-12-03T07:16:23Z",

    + +

    "DurationValue": "P12DT23H59M59.999999999999S",

    + +

    "TimeOfDayValue": "07:59:59.999",

    + +

    "GuidValue": "01234567-89ab-cdef-0123-456789abcdef",

    + +

    "Int64Value": 0,

    + +

    "ColorEnumValue": "Yellow",

    + +

    "GeographyPoint": +{"type": "Point","coordinates":[142.1,64.1]}

    + +

    }

    + +
    + +

    7.2 Complex Value

    + +

    A complex value is represented as a single JSON object containing +one name/value pair for each property that makes up the complex type. Each +property value is formatted as appropriate for the type of the property.

    + +

    It MAY have name/value pairs for instance annotations and control +information.

    + +

    Example 13:

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Customers/$entity",

    + +

    ...

    + +

    "Address": {

    + +

    "Street": "Obere Str. 57",

    + +

    "City": "Berlin",

    + +

    "Region": null,

    + +

    "PostalCode": "D-12209"

    + +

    }

    + +

    }

    + +
    + +

    A +complex value with no selected properties, or no defined properties (such as an +empty open complex type or complex type with no structural properties) is +represented as an empty JSON object.

    + +

    7.3 Collection +of Primitive Values

    + +

    A collection of primitive values is represented as a JSON +array; each element in the array is the representation of a primitive value. A JSON literal null represents a null value within the collection. An +empty collection is represented as an empty array.

    + +

    Example 14: partial collection of strings with next link

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Customers/$entity",

    + +

    ...

    + +

    "EmailAddresses": [

    + +

    "Julie@Swansworth.com",

    + +

    "Julie.Swansworth@work.com"

    + +

    ],

    + +

    "EmailAddresses@nextLink": "..."

    + +

    }

    + +
    + +

    7.4 Collection of Complex Values

    + +

    A collection of complex values is represented as a JSON +array; each element in the array is the representation of a complex value. A JSON literal null represents a null value within the collection. An +empty collection is represented as an empty array.

    + +

    Example 15: partial collection of complex values with next +link

    + +
    + +

    {

    + +

    "PhoneNumbers": [

    + +

    {

    + +

    "Number": "425-555-1212",

    + +

    "Type": "Home"

    + +

    },

    + +

    {

    + +

    "@type": +"#Model.CellPhoneNumber",

    + +

    "Number": "425-555-0178",

    + +

    "Type": "Cell",

    + +

    "Carrier": "Sprint"

    + +

    }

    + +

    ],

    + +

    "PhoneNumbers@nextLink": "..."

    + +

    }

    + +
    + +

    7.5 Untyped Value

    + +

    OData 4.01 adds the built-in abstract types Edm.Untyped and Collection(Edm.Untyped)that +services can use to advertise in metadata that there is a property of a +particular name present, but there is no type to describe the structure of the +propertys values.

    + +

    The value of an Edm.Untyped +property MAY be a primitive value, a structural value, or a collection. If a +collection, it may contain any combination of primitive values, structural +values, and collections.

    + +

    The value of a property of type Collection(Edm.Untyped)MUST +be a collection, and it MAY contain any combination of primitive values, +structural values, and collections.

    + +

    Untyped values are the only place where a collection can +directly contain a collection, or a collection can contain a mix of primitive +values, structural values, and collections.

    + +

    All children of an untyped property are assumed to be +untyped unless they are annotated with the type +control information, in which case they MUST conform to the type described by +the control information.

    + + + +

    A navigation property is a reference from a source entity to +zero or more related entities.

    + +

    8.1 Navigation Link

    + +

    The navigation link for a navigation property is represented +as a navigationLink control information +on the navigation property. Its value is an absolute or relative URL that allows retrieving the related +entity or collection of entities.

    + +

    The navigation link for a navigation property is only +represented if the client requests metadata=full or +the navigation link cannot be computed, e.g. if it is within a collection of +complex type instances. If it is represented it MUST immediately precede the +expanded navigation property if the latter is represented.

    + +

    Example 16:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    ...

    + +

    "Orders@navigationLink": "Customers('ALFKI')/Orders",

    + +

    ...

    + +

    }

    + +
    + +

    8.2 Association Link

    + +

    The association link for a navigation property is +represented as an associationLink control +information on the navigation property. Its value is an absolute or relative URL that can be used to retrieve the +reference or collection of references to the related entity or entities.

    + +

    The association link for a navigation property is only +represented if the client requests metadata=full or +the association link cannot be computed by appending /$ref +to the navigation link. If it is represented, it MUST immediately precede the +navigation link if the latter is represented, otherwise it MUST immediately +precede the expanded navigation property if it is represented.

    + +

    Example 17:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    ...

    + +

    "Orders@associationLink": "Customers('ALFKI')/Orders/$ref",

    + +

    ...

    + +

    }

    + +
    + +

    8.3 Expanded Navigation Property

    + +

    An expanded navigation property is represented as a +name/value pair where the name is the name of the navigation property, and the +value is the representation of the related entity or collection of entities.

    + +

    If at most one entity can be related, the value is the +representation of the related entity, or null if no +entity is currently related.

    + +

    If a collection of entities can be related, it is +represented as a JSON array. Each element is the representation +of an entity or the representation of an +entity reference. An empty collection of entities (one that contains no +entities) is represented as an empty JSON array. The navigation property MAY be +include context, type, +count, or nextLink control information. If a navigation property is +expanded with the suffix /$count, only the count control information is represented.

    + +

    Example 18:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Customers/$entity",

    + +

    ...

    + +

    "Orders@count": 42,

    + +

    "Orders": [ ... ],

    + +

    "Orders@nextLink": "...",

    + +

    ...

    + +

    }

    + +
    + +

    8.4 Deep Insert

    + +

    When inserting a new entity with a POST +request, related new entities MAY be specified using the same representation as +for an expanded navigation property. +

    + +

    Deep inserts are not allowed in update operations using PUT or PATCH requests.

    + +

    Example 19: inserting a new order for a new customer with +order items related to existing products:

    + +
    + +

    {

    + +

    "ID": 11643,

    + +

    "Amount": 100,

    + +

    ...,

    + +

    "Customer": {

    + +

    "ID": "ANEWONE",

    + +

    ...

    + +

    },

    + +

    "Items": [

    + +

    {

    + +

    "Product": { "@id": "Products(28)" +},

    + +

    "Quantity": 1,

    + +

    ...

    + +

    },

    + +

    {

    + +

    "Product": { "@id": "Products(39)" +},

    + +

    "Quantity": 5,

    + +

    ...

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    8.5 Bind Operation

    + +

    When inserting or updating an entity, relationships of +navigation properties MAY be inserted or updated via bind operations.

    + +

    For requests containing an OData-Version +header with a value of 4.0, a bind operation is +encoded as a property control information odata.bind +on the navigation property it belongs to and has a single value for single-valued +navigation properties or an array of values for collection navigation +properties. For nullable single-valued navigation properties the value null may be used to remove the relationship.

    + +

    Example 20: assign an existing product to an existing +category with a partial update request against the product

    + +
    + +

    PATCH http://host/service/Products(42) HTTP/1.1

    + +

     

    + +

    {

    + +

    "Category@odata.bind": "Categories(6)"

    + +

    }

    + +
    + +

    The values are the ids +of the related entities. They MAY be absolute or relative +URLs.

    + +

    For requests containing an OData-Version +header with a value of 4.01, a relationship is +bound to an existing entity using the same representation as for an expanded entity reference.

    + +

    Example 20: assign an existing product to an existing +category with a partial update request against the product

    + +
    + +

    PATCH http://host/service/Products(42) HTTP/1.1

    + +

     

    + +

    {

    + +

    "Category": {"@id": "Categories(6)"}

    + +

    }

    + +
    + +

     

    + +

    Example 21: submit a partial update request to:

    + +

             +modify the name of an existing category

    + +

             +assign an existing product with the id 42 to the category

    + +

             +assign an existing product 57 to the category and update its name

    + +

             +create a new product named Wedges and assign it to the category

    + +

    at the end of the request, the updated category +contains exactly the three specified products.

    + +
    + +

    PATCH http://host/service/Categories(6) HTTP/1.1

    + +

     

    + +

    {

    + +

    "Name": "UpdatedCategory",

    + +

    "Products": [

    + +

    {

    + +

    "@id": "Products(42)"

    + +

    },

    + +

    {

    + +

    "@id": "Products(57)",

    + +

    "Name": "Widgets"

    + +

    },

    + +

    {

    + +

    "Name": "Wedges"

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    OData 4.01 services MUST support both the OData 4.0 +representation, for requests containing an OData-Version +header with a value of 4.0, and the OData 4.01 +representation, for requests containing an OData-Version +header with a value of 4.01. Clients MUST NOT use @odata.bind in requests with an OData-Version +header with a value of 4.01.

    + +

    For insert operations collection navigation property bind +operations and deep insert operations can be combined. For OData 4.0 requests, +the bind operations MUST appear before the deep insert operations in the +payload.

    + +

    For update operations a bind operation on a collection +navigation property adds additional relationships, it does not replace existing +relationships, while bind operations on an entity navigation property update +the relationship.

    + +

    8.6 Collection ETag

    + +

    The ETag for a collection of related entities is represented +as etag control information on the navigation property. +Its value is an opaque string that can be used in a subsequent request to +determine if the collection has changed.

    + +

    Services MAY include this control information as +appropriate.

    + +

    Example 21: ETag for a collection of related entities

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Orders/$entity",

    + +

    "@id": "Orders(1234)",

    + +

    "@etag": +"W/\"MjAxMy0wNS0yN1QxMTo1OFo=\"",

    + +

    "ID": 1234,

    + +

    "Items@etag": +"W/\"MjAxOS0wMy0xMlQxMDoyMlo=\""

    + +

    + +

    }

    + +
    + +

    Note: the collection ETag for a navigation property may or +may not be identical to the ETag of the containing entity, the example shows a +different ETag for the Items collection.

    + +
    + +

    9     +Stream Property

    + +
    + +

    An entity or +complex type instance can have one or more stream properties.

    + +

    The actual stream +data is not usually contained in the representation. Instead stream property +data is generally read and edited via URLs.

    + +

    Depending on the metadata +level, the stream +property MAY be annotated to provide the read link, edit link, media type, and +ETag of the media stream through a set of media* +control information.

    + +

    If the actual +stream data is included inline, the control information mediaContentType MUST be present to indicate how the +included stream property value is represented. Stream property values of media +type application/json or one of its subtypes, optionally with format +parameters, are represented as native JSON. Values of top-level type text, for example text/plain, +are represented as a string, with JSON string escaping rules applied. Included stream data of other media types +is represented as a base64url-encoded string value, see [RFC4648], section 5.

    + +

    If the included stream property has no value, the +non-existing stream data is represented as null and +the control information mediaContentType is not necessary.

    + +

    Example 21:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Products/$entity",

    + +

    ...

    + +

    "Thumbnail@mediaReadLink": "http://server/Thumbnail546.jpg",

    + +

    "Thumbnail@mediaEditLink": "http://server/uploads/Thumbnail546.jpg",

    + +

    "Thumbnail@mediaContentType": +"image/jpeg",

    + +

    "Thumbnail@mediaEtag": +"W/\"####\"",

    + +

    "Thumbnail": +"...base64url encoded value...",

    + +

    ...

    + +

    }

    + +
    + +
    + +

    10 Media +Entity

    + +
    + +

    Media entities are entities that describe a media resource, +for example a photo. They are represented as entities that contain additional media* control information.

    + +

    If the actual +stream data for the media entity is included, it is represented as property +named $value whose string value is the base64url-encoded value of the +media stream, see [RFC4648], section 5.

    + +

    Example 22:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees/$entity",

    + +

    "@mediaReadLink": "Employees(1)/$value",

    + +

    "@mediaContentType": "image/jpeg",

    + +

    "$value": "...base64url encoded value...",

    + +

    "ID": 1,

    + +

    ...

    + +

    }

    + +
    + + + +

    An individual property or operation response is represented +as a JSON object.

    + +

    A single-valued property or operation response that has the null value does not have a representation; see [OData-Protocol].

    + +

    A property or operation response that is of a primitive type +is represented as an object with a single name/value pair, whose name is value and whose value is a primitive +value.

    + +

    A property or operation response that is of complex type is +represented as a complex value.

    + +

    A property or operation response that is of a collection +type is represented as an object with a single name/value pair whose name is value. Its value is the JSON representation of a collection of complex type values or collection of primitive values.

    + +

    Example 23: primitive value

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Edm.String",

    + +

    "value": "Pilar Ackerman"

    + +

    }

    + +
    + +

    Example 24: collection of primitive values

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Collection(Edm.String)",

    + +

    "value": ["small", +"medium", "extra large"]

    + +

    }

    + +
    + +

    Example 25: empty collection of primitive values

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Collection(Edm.String)",

    + +

    "value": []

    + +

    }

    + +
    + +

    Example 26: complex value

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Model.Address",

    + +

    "Street": "12345 Grant Street",

    + +

    "City": "Taft",

    + +

    "Region": "Ohio",

    + +

    "PostalCode": "OH 98052",

    + +

    "Country@navigationLink": +"Countries('US')"

    + +

    }

    + +
    + +

    Example 27: empty collection of complex values

    + +
    + +

    {
    + +"@context":"http://host/service/$metadata#Collection(Model.Address)",
    + "value": []

    + +

    }

    + +
    + +

    Note: the context URL is optional in requests.

    + + + +

    Invoking a bound action or function with /$each on each member of a collection in one request +results in a collection of operation results, which is represented as a JSON +object containing a name/value pair named value. It +MAY contain context, type, +count, +or nextLink control information.

    + +

    If present, the context control +information MUST be the first name/value pair in the response.

    + +

    The count name/value pair +represents the number of operation responses in the collection. If present and the +streaming=true media type parameter is set, it MUST +come before the value name/value pair. If the +response represents a partial result, the count +name/value pair MUST appear in the first partial response, and it MAY appear in +subsequent partial responses (in +which case it may vary from response to response).

    + +

    The value of the value +name/value pair is an array of objects, each object representing a single operation response. Note: +if the operation response is a collection, each single operation response +object itself contains a name/value pair named value.

    + + + +

    A collection of entities is represented as a JSON object +containing a name/value pair named value. It MAY +contain context, type, +count, +nextLink, or deltaLink +control information.

    + +

    If present, the context control +information MUST be the first name/value pair in the response.

    + +

    The count name/value pair +represents the number of entities in the collection. If present and the streaming=true content-type parameter is set, it MUST +come before the value name/value pair. If the +response represents a partial result, the count +name/value pair MUST appear in the first partial response, and it MAY appear in +subsequent partial responses (in +which case it may vary from response to response).

    + +

    The value of the value name/value +pair is a JSON array where each element is representation of an entity or +a representation of an entity reference. An empty +collection is represented as an empty JSON array.

    + +

    Functions or actions that are bound to this collection of +entities are advertised in the wrapper object in the same way as functions or actions +are advertised in the object representing a single entity.

    + +

    The nextLink control information MUST +be included in a response that represents a partial result.

    + +

    Example 28: +

    + +
    + +

    {

    + +

    "@context": "...",

    + +

    "@count": 37,

    + +

    "value": [

    + +

    { ... },

    + +

    { ... },

    + +

    { ... }

    + +

    ],

    + +

    "@nextLink": "...?$skiptoken=342r89"

    + +

    }

    + +
    + + + +

    An entity reference (see [OData-Protocol]) +MAY take the place of an entity in a JSON payload, based on the client request. +It is serialized as a JSON object that MUST +contain the id of the referenced entity and MAY contain the type +control information and instance annotations, +but no additional properties or control information.

    + +

    A collection of entity references is represented as a collection of entities, with entity reference +representations instead of entity representations as items in the array value +of the value name/value pair.

    + +

    The outermost JSON object in a response MUST contain a context +control information and MAY contain count, +nextLink, or deltaLink +control information.

    + +

    Example 29: entity reference to order 10643

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#$ref",

    + +

    "@id": "Orders(10643)"

    + +

    }

    + +
    + +

    Example 30: collection of entity references

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Collection($ref)",

    + +

    "value": [

    + +

    { "@id": "Orders(10643)" },

    + +

    { "@id": "Orders(10759)" }

    + +

    ]

    + +

    }

    + +
    + +
    + +

    15 Delta Payload

    + +
    + +

    The non-format specific aspects of the delta handling are +described in the section Requesting Changes in [OData-Protocol].

    + +

    15.1 Delta Responses

    + +

    Responses from a delta request are returned as a JSON +object.

    + +

    The JSON object for a delta response to a single entity is +either an added, changed, or deleted +entity.

    + +

    The JSON object for a delta response to a collection of +entities MUST contain an array-valued property named value +containing all added, changed, or deleted +entities, as well as added links or deleted links between entities, and MAY contain +additional, unchanged entities.

    + +

    If the delta response contains a partial list of changes, it +MUST include a next link +for the client to retrieve the next set of changes.

    + +

    The last page of a delta response SHOULD contain a delta link in place of the +next link for +retrieving subsequent changes once the current set of changes has been applied +to the initial set.

    + +

    If an OData 4.01 delta response includes an expanded collection-valued +navigation property inline (see next section), +the expanded collection can be a partial list, in which case the expanded +navigation property MUST have the nextLink +control information applied to it. Following this chain of next links does not +result in a delta link on the last page of the expanded collection.

    + +

    If the response from the delta link contains a count control information, +the returned number MUST include all added, changed, or deleted entities to be +returned, as well as added or deleted links.

    + +

    Example 31: a 4.01 delta response with five changes, in +order of occurrence

    + +

    1.     ContactName for customer 'BOTTM' +was changed to "Susan Halvenstern"

    + +

    2.     Order 10643 was removed +from customer 'ALFKI'

    + +

    3.     Order 10645 was added to +customer 'BOTTM'

    + +

    4.     The shipping information +for order 10643 was updated

    + +

    5.     Customer 'ANTON' was +deleted

    + +
    + +

    {

    + +

    "@context":"http://host/service/$metadata#Customers/$delta",

    + +

    "@count":5,

    + +

    "value":

    + +

    [

    + +

    {

    + +

    "@id":"Customers('BOTTM')",

    + +

    "ContactName":"Susan +Halvenstern"

    + +

    },

    + +

    {

    + +

    +"@context":"#Customers/$deletedLink",

    + +

    "source":"Customers('ALFKI')",

    + +

    "relationship":"Orders",

    + +

    +"target":"Orders(10643)"

    + +

    },

    + +

    {

    + +

    "@context":"#Customers/$link",

    + +

    +"source":"Customers('BOTTM')",

    + +

    +"relationship":"Orders",

    + +

    +"target":"Orders(10645)"

    + +

    },

    + +

    {

    + +

    "@context":"#Orders/$entity",

    + +

    "@id":"Orders(10643)",

    + +

    "ShippingAddress":{

    + +

    "Street":"23 +Tsawassen Blvd.",

    + +

    +"City":"Tsawassen",

    + +

    "Region":"BC",

    + +

    +"PostalCode":"T2F 8M4"

    + +

    },

    + +

    },

    + +

    {

    + +

    "@context":"#Customers/$deletedEntity",

    + +

    "@removed": +{

    + +

    "reason":"deleted"

    + +

    },

    + +

    "@id":"Customers('ANTON')"

    + +

    }

    + +

    ],

    + +

    "@deltaLink": +"Customers?$expand=Orders&$deltatoken=8015"

    + +

    }

    + +
    + +

    15.2 Added/Changed +Entity

    + +

    Added or changed entities within a delta response are +represented as entities.

    + +

    Added entities MUST include all available selected +properties and MAY include additional, unselected properties. Collection-valued +properties are treated as atomic values; any collection-valued properties +returned from a delta request MUST contain all current values for that +collection.

    + +

    Changed entities MUST include all available selected +properties that have changed, and MAY include additional properties.

    + +

    If a property of an entity is dependent upon the property of +another entity within the expanded set of entities being tracked, then both the +change to the dependent property as well as the change to the principle +property or added/deleted +link corresponding to the change to the dependent property are returned in +the delta response.

    + +

    Entities that are not part of the entity set specified by +the context URL MUST include the context +control information to specify the entity set of the entity, regardless of the +specified metadata value.

    + +

    Entities include control information for selected navigation +links based on metadata. +

    + +

    OData 4.0 payloads MUST NOT include expanded navigation +properties inline; all changes MUST be represented as a flat array of added, +deleted, or changed entities, along with added or deleted links.

    + +

    OData 4.01 delta payloads MAY include expanded navigation +properties inline. Related single entities are represented as either an added/changed entity, an entity reference, a deleted +entity, or a null value (if no entity is related as the outcome of the +change). Collection-valued navigation properties are represented either as a delta +representation or as a full representation of the collection.

    + +

    If the expanded navigation property represents a delta, it +MUST be represented as an array-valued control information delta +on the navigation property. Added/changed +entities or entity references are added to the collection. Deleted entities MAY be specified in a nested +delta representation to represent entities no longer part of the collection. If +the deleted entity specifies a reason as deleted, then the entity is both removed from the +collection and deleted, otherwise it is removed from the collection and only +deleted if the navigation property is a containment navigation property. The +array MUST NOT contain added or deleted links.

    + +

    Example 32: 4.01 delta response customers with expanded +orders represented inline as a delta

    + +

    1.     Customer 'BOTTM':

    + +

    a.     ContactName was changed to +"Susan Halvenstern"

    + +

    b.     Order 10645 was added

    + +

    2.     Customer 'ALFKI':

    + +

    a.     Order 10643 was removed

    + +

    3.     Customer 'ANTON' was +deleted

    + +
    + +

    {

    + +

    "@context":"http://host/service/$metadata#Customers/$delta",

    + +

    "@count":3,

    + +

    "value":

    + +

    [

    + +

    {

    + +

    "@id":"Customers('BOTTM')",

    + +

    "ContactName":"Susan +Halvenstern",

    + +

    +"Orders@delta":[

    + +

    {

    + +

    "@id":"Orders(10645)"

    + +

    }

    + +

    ]

    + +

    },

    + +

    {

    + +

    "@id":"Customers('ALFKI')",

    + +

    "Orders@delta":[

    + +

    {

    + +

    "@context":"#Orders/$deletedEntity",

    + +

    "@removed": +{

    + +

    +"reason": "changed"

    + +

    },

    + +

    "@id":"Orders(10643)"

    + +

    }

    + +

    ]

    + +

    },

    + +

    {

    + +

    "@context":"#Customers/$deletedEntity",

    + +

    +"@removed": {

    + +

    +"reason": "deleted"

    + +

    },

    + +

    "@id":"Customers('ANTON')"

    + +

    }

    + +

    ],

    + +

    "@deltaLink": +"Customers?$expand=Orders&$deltatoken=8015"

    + +

    }

    + +
    + +

    If the expanded navigation property is a full representation +of the collection, it MUST be represented as an expanded navigation property, +and its array value represents the full set of entities related according to +that relationship and satisfying any specified expand options. Members of the +array MUST be represented as added/changed +entities or entity references and MUST NOT +include added links, deleted links, or deleted entities. Any entity not +represented in the collection has either been removed, deleted, or changed such +that it no longer satisfies the expand options in the defining query. In any +case, clients SHOULD NOT receive additional notifications for such removed +entities.

    + +

    Example 33: 4.01 delta response for a single entity +with an expanded navigation property containing only a partial list of related +entities (as indicated with a next link)

    + +
    + +

    {

    + +

    "@context":"http://host/service/$metadata#Customers/$entity/$delta",

    + +

    + +

      +"Orders@count": 42,

    + +

      +"Orders": [ ],

    + +

      +"Orders@nextLink": "",

    + +

    + +

    "@deltaLink": +"Customers('ALFKI')?$expand=Orders&$deltatoken=9711"

    + +

    }

    + +
    + +

    15.3 Deleted Entity

    + +

    Deleted entities in JSON are returned as deleted-entity +objects. Delta responses MUST contain a deleted-entity object for each deleted +entity, including deleted expanded entities that are not related through a +containment navigation property. The service MAY additionally include expanded +entities related through a containment navigation property in which case it +MUST include those in any returned count of enumerated changes.

    + +

    The representation of deleted-entity objects differs between +OData 4.0 and OData 4.01.

    + +

    In OData 4.0 payloads the deleted-entity object MUST include +the following properties, regardless of the specified metadata value:

    + +

             +Control information context + the context URL fragment MUST be #{entity-set}/$deletedEntity, +where {entity-set} is the entity set of the deleted +entity

    + +

             +id The id of the deleted entity (same as the +id +returned or computed when calling GET on resource), which may be absolute or relative

    + +

    In OData 4.0 payloads the deleted-entity object MAY include +the following optional property, regardless of the specified metadata value, and MAY include annotations:

    + +

             +reason either deleted, +if the entity was deleted (destroyed), or changed +if the entity was removed from membership in the result (i.e., due to a data +change).

    + +

    Example 34: +deleted entity in OData 4.0 response note that id +is a property, not control information

    + +
    + +

    {

    + +

    "@context":"#Customers/$deletedEntity",

    + +

    "reason":"deleted",

    + +

    "id":"Customers('ANTON')"

    + +

    }

    + +
    + +

    In OData 4.01 payloads the deleted-entity object MUST +include the following properties, regardless of the specified metadata value:

    + +

             +Control information removed, +whose value is an object that MAY contain a property named reason. If present, the value of reason +MUST be either deleted if the entity was deleted +(destroyed), or changed if the entity was removed +from membership in the result either due to change in value such that the +entity no longer matches the defining query or because the entity was removed +from the collection. The object MAY include annotations, +and clients SHOULD NOT error due to the presence of additional properties that +MAY be defined by future versions of this specification. For ordered payloads, the control +information removed MUST immediately follow +the context control information, if present, otherwise it +MUST be the first property in the deleted entity.

    + +

             +Control information id or all of the entitys key +fields. The id control information MUST +appear if any of the entity's key fields are omitted from the response or +the entity-id is not identical to the canonical URL of the entity. For ordered payloads, the control +information id, if present, MUST immediately follow +the control information removed.

    + +

    For full metadata the context +control information MUST be included. It also MUST be included if the entity +set of the deleted entity cannot be determined from the surrounding context.

    + +

    The deleted-entity object MAY include additional properties +of the entity, as well as annotations, +and MAY include related entities, related deleted entities, or a delta or full +representation of a related collection of entities, to represent related +entities that have been modified or deleted.

    + +

    Example 35: deleted entity in OData 4.01 response with id control information (prefixed with an @)

    + +
    + +

    {

    + +

    "@context":"#Customers/$deletedEntity",

    + +

    +"@removed":{

    + +

    +"reason":"deleted",

    + +

    "@myannoation.deletedBy":"Mario" +

    + +

    },

    + +

    +"@id":"Customers('ANTON')"

    + +

    }

    + +
    + +

    Example 36: entity removed OData 4.01 response without id control information and instead all key fields (ID is the single key field of Customer)

    + +
    + +

    {

    + +

    +"@removed":{},

    + +

    +"ID":"ANTON"

    + +

    }

    + +
    + +

    15.4 Added Link

    + +

    Links within a delta response are represented as link +objects.

    + +

    Delta responses MUST contain a link object for each added +link that corresponds to a $expand +path in the initial request.

    + +
    The link object MUST include the following properties, regardless of the specified metadata value, and MAY include annotations:
    + +

             +context the context URL fragment +MUST be #{entity-set}/$link, where {entity-set} is the entity set containing the source +entity

    + +

             +source The id of the entity from which the +relationship is defined, which may be absolute or relative

    + +

             +relationship The path from the +source object to the navigation property which MAY traverse one or more complex +properties, type cast segments, or members of ordered collections

    + +

             +target The id of the related entity, which may +be absolute or relative

    + +

    15.5 Deleted Link

    + +

    Deleted links within a delta response are represented as +deleted-link objects.

    + +

    Delta responses MUST contain a deleted-link object for each +deleted link that corresponds to a $expand +path in the initial request, unless either of the following is true:

    + +

             +The source or target entity has been deleted

    + +

             +The maximum cardinality of the related entity is one and there is +a subsequent link object that specifies the same source and relationship.

    + +
    The deleted-link object MUST include the following properties, regardless of the specified metadata value, and MAY include annotations:
    + +

             +context the context URL fragment +MUST be #{entity-set}/$deletedLink, where {entity-set} is the entity set containing the source +entity

    + +

             +source The id of the entity from which the +relationship is defined, which may be absolute or relative

    + +

             +relationship The path from the +source object to the navigation property which MAY traverse one or more complex +properties, type cast segments, or members of ordered collections

    + +

             +target The id of the related entity for multi-valued +navigation properties, which may be absolute or relative. For +delta payloads that do not specify an OData-Version header value of 4.0, the target MAY be omitted +for single-valued navigation properties.

    + +

    15.6 +Update a +Collection of Entities

    + +

    The body of a PATCH request to a URL identifying a +collection of entities is a JSON object. It MUST contain the context +control information with a string value of #$delta, +and it MUST contain an array-valued property named value +containing all added, changed, or deleted +entities, as well as added or deleted links between entities.

    + +

    Example 37: +4.01 delta response customers with expanded orders represented inline as a +delta

    + +

    1.     Add customer 'EASTC':

    + +

    2.     Change ContactName of customer 'AROUT'

    + +

    3.     Delete customer 'ANTON'

    + +

    4.     Change customer 'ALFKI': +

    + +

    a.     Create order 11011

    + +

    b.     Add link to existing +order 10692

    + +

    c.     Change ShippedDate of related order 10835

    + +

    d.     Delete link to order +10643

    + +

    5.     Add link between customer +'ANATR' and order 10643

    + +

    6.     Delete link between +customer 'DUMON' and order 10311

    + +
    + +

    {

    + +

    "@context":"#$delta",

    + +

    "value": [

    + +

    {

    + +

    "CustomerID": "EASTC",

    + +

    "CompanyName": "Eastern +Connection",

    + +

    "ContactName": "Ann Devon",

    + +

    "ContactTitle": "Sales Agent"

    + +

    },

    + +

    {

    + +

    "CustomerID": "AROUT",

    + +

    "ContactName": "Thomas Hardy",

    + +

    },

    + +

    {

    + +

    "@removed": {},

    + +

    "CustomerID":"ANTON"

    + +

    },

    + +

    {

    + +

    "CustomerID": "ALFKI",

    + +

    "Orders@delta": [

    + +

    {

    + +

    "OrderID": 11011,

    + +

    "CustomerID": "ALFKI",

    + +

    "EmployeeID": 3,

    + +

    "OrderDate": +"1998-04-09T00:00:00Z",

    + +

    "RequiredDate": "1998-05-07T00:00:00Z",

    + +

    "ShippedDate": +"1998-04-13T00:00:00Z"

    + +

    },

    + +

    {

    + +

    "@id":"Orders(10692)"

    + +

    },

    + +

    {

    + +

    "@id":"Orders(10835)"

    + +

    ShippedDate: "1998-01-23T00:00:00Z",

    + +

    },

    + +

    {

    + +

    "@removed": {

    + +

    "reason": "changed"

    + +

    },

    + +

    "OrderID": 10643

    + +

    }

    + +

    ]

    + +

    },

    + +

    {

    + +

    "@context":"#Customers/$link",

    + +

    "source":"Customers('ANATR')",

    + +

    "relationship":"Orders",

    + +

    "target":"Orders(10643)"

    + +

    },

    + +

    {

    + +

    +"@context":"#Customers/$deletedLink",

    + +

    "source":"Customers('DUMON')",

    + +

    "relationship":"Orders",

    + +

    "target":"Orders(10311)"

    + +

    }

    + +

    ]

    + +

    }

    + +
    + + + +

    A bound function is advertised via a name/value pair where +the name is a hash (#) character followed by the +namespace- or alias-qualified name of the function. The namespace or alias MUST +be defined or the namespace referenced in the metadata document of the service, +see [OData-CSDLJSON] or [OData-CSDLXML]. +A specific function overload can be advertised by appending the +parentheses-enclosed, comma-separated list of non-binding parameter names to +the qualified function name, see rule qualifiedFunctionName +in [OData-ABNF].

    + +

    A function that is bound to a single structured type MAY be +advertised within the JSON object representing that structured type.

    + +

    Functions that are bound to a collection MAY be advertised +within the JSON object containing the collection. If the collection is the +top-level response, the function advertisement name/value pair is placed next +to the value name/value pair representing the collection. +If the collection is nested within an instance of a structured type, then in +4.01 payloads the name of the function advertisement is prepended with the name +of the collection-valued property and is placed next to the collection-valued +property, expanded navigation +property, or navigationLink +control information, if present. 4.0 payloads MUST NOT advertise functions +prefixed with property names.

    + +

    If the function is available, the value of the advertisement +is an object. OData 4.01 services MAY advertise the non-availability of the +function with the value null.

    + +

    If metadata=full is requested, each +value object MUST have at least the two name/value pairs title +and target. It MAY contain annotations. The order of the name/value +pairs MUST be considered insignificant.

    + +

    The target name/value pair +contains a URL. Clients MUST be able to invoke the function or the specific +function overload by passing the parameter values via query options for parameter +aliases that are identical to the parameter name preceded by an at +(@) sign. Clients MUST +check if the obtained URL already contains a query part and appropriately +precede the parameters either with an ampersand (&) or a question mark (?).

    + +

    The title name/value pair +contains the function or action title as a string.

    + +

    If metadata=minimal is requested, the +target name/value pair MUST be included if its +value differs from the canonical function or action URL.

    + +

    Example 38: minimal representation of a function where all +overloads are applicable

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees/$entity",

    + +

    "#Model.RemainingVacation": {},

    + +

    ...

    + +

    }

    + +
    + +

    Example 39: full representation of a specific overload with +parameter alias for the Year +parameter

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees/$entity",

    + +

    "#Model.RemainingVacation(Year)": {

    + +

    "title": "Remaining vacation from year.",

    + +

    "target": "Employees(2)/RemainingVacation(Year=@Year)"

    + +

    },

    + +

    ...

    + +

    }

    + +
    + +

    Example 40: full representation in a collection

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees",

    + +

    "#Model.RemainingVacation": {

    + +

    "title": "Remaining Vacation",

    + +

    "target": "Managers(22)/Employees/RemainingVacation"

    + +

    },

    + +

    "value": [ ... ]

    + +

    }

    + +
    + +

    Example 41: +full representation in a nested collection

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees/$entity",

    + +

    "@type": "Model.Manager",

    + +

    "ID":22,

    + +

    ...

    + +

    "Employees#RemainingVacation": {

    + +

    "title": "RemainingVacation",

    + +

    "target": "Managers(22)/Employees/RemainingVacation"

    + +

    }

    + +

    }

    + +
    + + + +

    A bound action is advertised via a name/value pair where the +name is a hash (#) character followed by the +namespace- or alias-qualified name of the action. The namespace or alias MUST +be defined or the namespace referenced in the metadata document of the service, +see [OData-CSDLJSON] or [OData-CSDLXML].

    + +

    An action that is bound to a single structured type is +advertised within the JSON object representing that structured type.

    + +

    Actions that are bound to a collection MAY be advertised +within the JSON object containing the collection. If the collection is the +top-level response, the action advertisement name/value pair is placed next to +the value name/value pair representing the collection. +If the collection is nested within an instance of a structured type, then in +4.01 payloads the name of the action advertisement is prepended with the name +of the collection-valued property and is placed next to the name/value pair +representing the collection-valued property, expanded navigation property, or navigationLink +control information, if present. 4.0 payloads MUST NOT advertise actions +prefixed with property names.

    + +

    If the action is available, the value of the advertisement +is an object. OData 4.01 services MAY advertise the non-availability of the +action with the value null.

    + +

    If metadata=full is requested, each +value object MUST have at least the two name/value pairs title +and target. It MAY contain annotations. The order of these name/value +pairs MUST be considered insignificant.

    + +

    The target name/value pair +contains a bound function or action URL.

    + +

    The title name/value pair +contains the function or action title as a string.

    + +

    If metadata=minimal is requested, the +target name/value pair MUST be included if its +value differs from the canonical function or action URL.

    + +

    Example 42: minimal representation in an entity

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#LeaveRequests/$entity",

    + +

    "#Model.Approve": {},

    + +

    ...

    + +

    }

    + +
    + +

    Example 43: full representation in an entity:

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#LeaveRequests/$entity",

    + +

    "#Model.Approve": {

    + +

    "title": "Approve Leave Request",

    + +

    "target": "LeaveRequests(2)/Approve"

    + +

    },

    + +

    ...

    + +

    }

    + +
    + +

    Example 44: full representation in a collection

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#LeaveRequests",

    + +

    "#Model.Approve": {

    + +

    "title": "Approve All Leave Requests",

    + +

    "target": "Employees(22)/Model.Manager/LeaveRequests/Approve"

    + +

    },

    + +

    "value": [ ... ]

    + +

    }

    + +
    + +

    Example 45: full representation in a nested collection

    + +
    + +

    {

    + +

    "@context": "http://host/service/$metadata#Employees/$entity",

    + +

    "@type": "Model.Manager",

    + +

    "ID":22,

    + +

    ...

    + +

    "LeaveRequests#Model.Approve": {

    + +

    "title": "Approve All Leave Requests",

    + +

    "target": "Employees(22)/Model.Manager/LeaveRequests/Approve"

    + +

    }

    + +

    }

    + +
    + + + +

    Action parameter values are encoded in a single JSON object +in the request body.

    + +

    Each non-binding parameter value is encoded as a separate +name/value pair in this JSON object. The name is the name of the parameter. The +value is the parameter value in the JSON representation appropriate for its +type. Entity typed parameter values MAY include a subset of the properties, or +just the entity reference, as appropriate to +the action.

    + +

    Non-binding parameters that are nullable or annotated with +the term Core.OptionalParameter defined +in [OData-VocCore] MAY be omitted from the +request body. If an omitted parameter is not annotated (and thus nullable), it +MUST be interpreted as having the null value. If it +is annotated and the annotation specifies a DefaultValue, +the omitted parameter is interpreted as having that default value. If omitted +and the annotation does not specify a default value, the service is free on how +to interpret the omitted parameter. Note: a nullable non-binding parameter is +equivalent to being annotated as optional with a default value of null.Example 46:

    + +
    + +

    {

    + +

    "param1": 42,

    + +

    "param2": {

    + +

    "Street": "One Microsoft Way",

    + +

    "Zip": 98052

    + +

    },

    + +

    "param3": [ 1, 42, 99 ],

    + +

    "param4": null

    + +

    }

    + +
    + +

     

    + +

    In order to invoke an action with no non-binding parameters, +the client passes an empty JSON object in the body of the request. 4.01 +Services MUST also support clients passing an empty request body for this case.

    + + + +

    19.1 Batch Request

    + +

    A JSON batch request body consists of a single JSON object +that MUST contain the name/value pair requests and +MAY contain annotations. It does not +contain the context control information.

    + +

    The value of requests is an +array of request objects, each representing an individual request. Note: an +individual request MUST NOT itself be a batch request.

    + +

    A request object MUST contain the name/value pairs id, method and url, and it MAY contain the name/value pairs atomicityGroup, dependsOn, if, +headers, and body.

    + +

    The value of id is a string +containing the request identifier of the individual request, see [OData-Protocol]. It MUST NOT be identical to the +value of any other request identifier nor any atomicityGroup +within the batch request.

    + +

    Note: the id name/value pair +corresponds to the Content-ID header in the +multipart batch format specified in [OData-Protocol].

    + +

    The value of method is a string +that MUST contain one of the literals delete, get, patch, post, or put. These literals +are case-insensitive.

    + +

    The value of url is a string +containing the individual request URL. The URL MAY be an absolute path +(starting with a forward slash /) which is appended +to scheme, host, and port of the batch request URL, or a relative path (not +starting with a forward slash /).

    + +

    If the first segment of a relative path starts with a $ character and is not identical to the name of a +top-level system resource ($batch, $crossjoin, $all, $entity, $root, $id, $metadata, or other +system resources defined according to the OData-Version +of the protocol specified in the request), then this first segment is replaced +with the URL of the entity created by or returned from a preceding request +whose id value is identical to the value of the +first segment with the leading $ character removed. +The id of this request MUST be specified in the dependsOn name/value pair.

    + +

    Otherwise, the relative path is resolved relative to the +batch request URL (i.e. relative to the service root).

    + +

    The value of atomicityGroup is a +string whose content MUST NOT be identical to any value of id within the batch request, and which MUST satisfy the +rule request-id in [OData-ABNF]. +All request objects with the same value for atomicityGroup +MUST be adjacent in the requests array. These +requests are processed as an atomic operation and MUST either all succeed, or +all fail.

    + +

    Note: the atomicity group is a generalization of the change +set in the multipart batch format specified in [OData-Protocol]. +

    + +

    The value of dependsOn is an array +of strings whose values MUST be values of either id +or atomicityGroup of preceding request objects; +forward references are not allowed. If a request depends on another request +that is part of a different atomicity group, the atomicity group MUST be listed +in dependsOn. In the absence of the optional if member a request that depends on other requests or +atomicity groups is only executed if those requests were executed successfully, +i.e. with a 2xx response code. If one of the +requests it depends on has failed, the dependent request is not executed and a +response with status code of 424 Failed Dependency is returned for it +as part of the batch response.

    + +

    The if member can specify an +alternative condition for executing the dependent request. Its value MUST be +URL expression (see [OData-URL]) that +evaluates to a Boolean value. The URL expression syntax is extended and +additionally allows

    + +

             +$<content-id>/$succeeded to +check if the referenced request has succeeded

    + +

             +$<content-id> to reference the +response body of the referenced request

    + +

             +$<content-id>/<path> to +reference a part of the response body

    + +

    Services SHOULD advertise support of the if member by specifying the property RequestDependencyConditionsSupported in the Capabilities.BatchSupport term +applied to the entity container, see [OData-VocCap]. If a service does not +support request dependencies, the dependent request MUST fail with 424 Failed Dependency, and if the dependent request is part of an atomicity +group, all requests in that group fail with 424 +Failed Dependency +with no changes applied.

    + +

    The value of headers is an +object whose name/value pairs represent request headers. The name of each pair +MUST be the lower-case header name; the value is a string containing the +header-encoded value of the header. The headers +object MUST contain a name/value pair with the name content-type +whose value is the media type.

    + +

    The value of body can be null, which is equivalent to not specifying the body name/value pair.

    + +

    For media type application/json or one of its +subtypes, optionally with format parameters, the value of body +is JSON.

    + +

    For media types of top-level type text, +for example text/plain, the value of body is a string containing the value of the request +body.

    + +

    For all other media types the value of body +is a string containing the base64url-encoded value of the request body. In this +case the body content can be compressed or chunked if this is correctly +reflected in the Transfer-Encoding header.

    + +

    A body MUST NOT be specified if +the method is get or delete.

    + +

    Example 47: +a batch request that contains the following individual requests in the order +listed

    + +

    1.     A +query request

    + +

    2.     An +atomicity group that contains the following requests:

    + +

             +Insert entity

    + +

             +Update entity

    + +

    3.     A +second query request

    + +

    Note: For brevity, in the example, request bodies are +excluded in favor of English descriptions inside <> +brackets and OData-Version headers are omitted.

    + +
    + +

    POST /service/$batch HTTP/1.1
    +Host: host
    +OData-Version: 4.01
    +Content-Type: application/json
    +Content-Length: ###

    + +

     

    + +

    {

    + +

    "requests": [

    + +

    {

    + +

    "id": "0",

    + +

    "method": "get",

    + +

    "url": "/service/Customers('ALFKI')"

    + +

    },

    + +

    {

    + +

    "id": "1",

    + +

    "atomicityGroup": "group1",

    + +

    "dependsOn": [ "0" ],

    + +

    "method": "patch",

    + +

    "url": "/service/Customers('ALFKI')",

    + +

    "headers": {

    + +

    "Prefer": "return=minimal"

    + +

    },

    + +

    "body": <JSON representation of changes +to Customer ALFKI>

    + +

    },

    + +

    {

    + +

    "id": "2",

    + +

    "atomicityGroup": "group1",

    + +

    "method": "post",

    + +

    "url": "/service/Customers",

    + +

    "body": <JSON representation of a new +Customer entity>

    + +

    },

    + +

    {

    + +

    "id": "3",

    + +

    "dependsOn": [ "group1" ],

    + +

    "method": "get",

    + +

    "url": "/service/Products"

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    19.2 Referencing New Entities

    + +

    The entity returned by a +preceding request can be referenced in the request URL of subsequent requests.

    + +

    Example 48: a batch request that contains the following +operations in the order listed:

    + +

             +Insert a new entity (with id = 1)

    + +

             +Insert a second new entity (references request with id = 1)

    + +
    + +

    POST /service/$batch HTTP/1.1
    +Host: host
    +OData-Version: 4.01
    +Content-Type: application/json
    +Content-Length: ###
    +
    +{

    + +

    "requests": [

    + +

    {

    + +

    "id": "1",

    + +

    "method": "post",

    + +

    "url": "/service/Customers",

    + +

    "body": <JSON representation of a new +Customer entity>

    + +

    },

    + +

    {

    + +

    "id": "2",

    + +

    "dependsOn": [ "1" ]

    + +

    "method": "post",

    + +

    "url": "$1/Orders",

    + +

    "body": <JSON representation of a new +Order>

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    19.3 Referencing an ETag

    + +

    Example 49: a batch request that contains the following +operations in the order listed:

    + +

             +Get an Employee (with id = 1)

    + +

             +Update the salary only if the employee has not changed

    + +
    + +

    POST /service/$batch HTTP/1.1
    +Host: host
    +OData-Version: 4.01
    +Content-Type: application/json
    +Content-Length: ###
    +
    +

    + +

    {

    + +

    "requests": [

    + +

    {

    + +

    "id": "1",

    + +

    "method": "get",

    + +

    "url": "/service/Employees(0)",

    + +

    "headers": {

    + +

    "accept": "application/json"

    + +

    }

    + +

    },

    + +

    {

    + +

    "id": "2",

    + +

    "dependsOn": [ "1" ],

    + +

    "method": "patch",

    + +

    "url": "/service/Employees(0)",

    + +

    "headers": {

    + +

    "if-match": "$1"

    + +

    },

    + +

    "body": {

    + +

    "Salary": 75000

    + +

    }

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    19.4 Processing a Batch Request

    + +

    All requests in an atomicity group represent a single change +unit. A service MUST successfully process and apply all the requests in the atomicity +group or else apply none of them. It is up to the service implementation to +define rollback semantics to undo any requests within an atomicity group that +may have been applied before another request in that same atomicity group +failed.

    + +

    The service MAY process the individual requests and +atomicity groups within a batch request, or individual requests within an atomicity +group, in any order that is compatible with the dependencies expressed with the +dependsOn name/value pair. Individual requests and +atomicity groups that do not specify the dependsOn +name/value pair may be processed in parallel. Clients that are only interested +in completely successful batch responses MAY specify the preference continue-on-error=false +to indicate that the service need not spend cycles on further processing once +an error occurs in one of the dependency chains. In this case the response MAY +omit response objects for requests that have not been processed. If the +preference continue-on-error is not specified, or +specified with a value of true, all requests are +processed according to their dependencies.

    + +

    The service MUST include the id +name/value pair in each response object with the value of the request +identifier that the client specified in the corresponding request, so clients +can correlate requests and responses.

    + +

    19.5 Batch Response

    + +

    A JSON batch response body consists of a single JSON object +that MUST contain the name/value pair responses and +MAY contain annotations. It does not +contain the context control information.

    + +

    The value of responses is an +array of response objects, each representing an individual response.

    + +

    A JSON batch response MAY be a partial result containing the +nextLink control information. This allows services to +chunk results into manageable pieces, or to return results for already +processed requests and continue processing the remaining individual requests +while waiting for the client to fire a GET request +to the next link.

    + +

    In a response to a batch request using the multipart format +defined in [OData-Protocol] the +response objects MUST appear in the same order as required for multipart batch +responses because the Content-ID header is not required +outside of change sets. Response objects corresponding to requests that specify +a Content-ID header MUST contain the id +name/value pair, and the value of id MUST be the value of the Content-ID header of the corresponding request. This is +necessarily the case for requests contained within a change set. Responses to +requests within a change set MUST contain the atomicityGroup name/value pair with a value common within a change +set and unique across change sets.

    + +

    In a +response to a batch request using the JSON batch request format specified in +the preceding section the response objects MAY appear in any order, and each +response object MUST contain the id name/value pair with the +same value as in the corresponding request object. If the corresponding request +object contains the atomicityGroup name/value pair, it MUST +also be present in the response object with the same value.

    + +

    If any response within an atomicity group returns a failure +code, all requests within that atomicity group are considered failed, regardless +of their individual returned status code. The service MAY return 424 Failed Dependency for statements within an +atomicity group that fail or are not attempted due to other failures within the +same atomicity group.

    + +

    A response object MUST contain the name/value pair status whose value is a number representing the HTTP +status code of the response to the individual request.

    + +

    The response object MAY contain the name/value pair headers whose value is an object with name/value pairs +representing response headers. The name of each pair MUST be the lower-case +header name; the value is a string containing the header-encoded value of the +header.

    + +

    The response object MAY contain the name/value pair body which follows the same rules as within request objects.

    + +

    If the media type is not exactly equal to application/json (i.e. it is a subtype or has format +parameters), the headers object MUST contain a +name/value pair with the name content-type whose +value is the media type.

    + +

    Relative URLs in a response object follow the rules for relative URLs based on the request URL of the +corresponding request. Especially: URLs in responses MUST NOT contain $-prefixed request identifiers.

    + +

    Example 50: referencing the batch request example 47 above, assume all the requests except the final query request succeed. In this +case the response would be

    + +
    + +

    {

    + +

    "responses": [

    + +

    {

    + +

    "id": "0",

    + +

    "status": 200,

    + +

    "body": <JSON representation of the +Customer entity with key ALFKI>

    + +

    },

    + +

    {

    + +

    "id": "1",

    + +

    "status": 204

    + +

    },

    + +

    {

    + +

    "id": "2",

    + +

    "status": 201,

    + +

    "headers": {

    + +

    "location": "http://host/service.svc/Customer('POIUY')"

    + +

    },

    + +

    "body": <JSON representation of the new +Customer entity>

    + +

    },

    + +

    {

    + +

    "id": "3",

    + +

    "status": 404,

    + +

    "body": <Error message>

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    19.6 Asynchronous +Batch Requests

    + +

    A batch request that specifies the respond-async preference MAY be executed asynchronously. +This means that the outer batch request is executed asynchronously; this +preference does not automatically cascade down to the individual requests +within the batch. After successful execution of the batch request the response +to the batch request is returned in the body of a response to an interrogation +request against the status monitor resource URL, see section Asynchronous +Requests in [OData-Protocol].

    + +

    A service MAY return interim results to an asynchronously +executing batch. It does this by responding with 200 OK +to a GET request to the monitor resource and +including a nextLink control information in +the JSON batch response, thus signaling that the response is only a partial +result. A subsequent GET request to the next link +MAY result in a 202 Accepted +response with a location header pointing to a new +status monitor resource.

    + +

    Example 51: referencing the example 47 above again, assume that the request is sent with the respond-async +preference. This results in a 202 response pointing +to a status monitor resource:

    + +
    + +

    HTTP/1.1 202 Accepted
    +Location: http://service-root/async-monitor-0
    +Retry-After: ###
    +
    +

    + +
    + +

    When interrogating the monitor URL only the first request +in the batch has finished processing and all the remaining requests are still +being processed. The service signals that asynchronous processing is finished +and returns a partial result with the first response and a next link. The +client did not explicitly accept application/http, +so the response is unwrapped and only indicates with the AsyncResult header that it is a response to a status +monitor resource:

    + +
    + +

    HTTP/1.1 200 Ok
    +AsyncResult: 200
    +OData-Version: 4.01
    +Content-Length: ####
    +Content-Type: application/json
    +
    +

    + +

    {

    + +

    "responses": [

    + +

    {

    + +

    "id": "0",

    + +

    "status": 200,

    + +

    "body": <JSON representation of the +Customer entity with key ALFKI>

    + +

    ],

    + +

    "@nextLink": "...?$skiptoken=YmF0Y2gx"

    + +

    }

    + +
    + +

    Client makes a GET request to +the next link and receives a 202 response with the +location of a new monitor resource.

    + +
    + +

    HTTP/1.1 202 Accepted
    +Location: http://service-root/async-monitor-1
    +Retry-After: ###
    +
    +

    + +
    + +

    After some time a GET request +to the monitor resource returns the remainder of the result.

    + +
    + +

    HTTP/1.1 200 Ok
    +AsyncResult: 200
    +OData-Version: 4.01

    + +

    Content-Length: ####
    +Content-Type: application/json
    +
    +

    + +

    {

    + +

    "responses": [

    + +

    {

    + +

    "id": "1",

    + +

    "status": 204

    + +

    },

    + +

    {

    + +

    "id": "2",

    + +

    "status": 201,

    + +

    "headers": {

    + +

    "location": "http://host/service.svc/Customer('POIUY')"

    + +

    },

    + +

    "body": <JSON representation of the new +Customer entity>

    + +

    },

    + +

    {

    + +

    "id": "3",

    + +

    "status": 404,

    + +

    "body": <Error message>

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    In addition to the above interaction pattern individual +requests within a batch with no other requests depending on it and not part of +an atomicity group MAY be executed asynchronously if they specify the respond-async preference and if the +service responds with a JSON batch response. In this case the response array contains a response object for each +asynchronously executed individual request with a status of 202, a location header +pointing to an individual status monitor resource, and optionally a retry-after header.

    + +

    Example 52: the first individual request is processed +asynchronously, the second synchronously, the batch itself is processed +synchronously

    + +
    + +

    HTTP/1.1 200 OK
    +OData-Version: 4.01
    +Content-Length: ####
    +Content-Type: application/json
    +
    +

    + +

    {

    + +

    "responses": [

    + +

    {

    + +

    "id": "0",

    + +

    "status": 202,

    + +

    "headers": {

    + +

    "location": "http://service-root/async-monitor-0"

    + +

    }

    + +

    },

    + +

    {

    + +

    "id": "1",

    + +

    "status": 204

    + +

    }

    + +

    ]

    + +

    }

    + +
    + + + +

    Annotations are an +extensibility mechanism that allows services and clients to include information +other than the raw data in the request or response.

    + +

    Annotations are name/value pairs that have an at (@) and a dot (.) as part of the +name. The part after the "at" sign (@) is +the annotation identifier. It consists of the namespace or alias +of the schema that defines the term, followed by a dot (.), +followed by the name of the term, optionally +followed by a hash (#) and a qualifier. The namespace or alias MUST +be defined in the metadata document, see [OData-CSDLJSON] +or [OData-CSDLXML].

    + +

    The annotation identifier odata +is reserved for future extensions of the protocol and format. Instance +annotations MUST have a namespace or alias that is different from odata.

    + +

    Annotations can be applied to any name/value pair in a JSON +payload that represents a value of any type from the entity data model. Clients +should never error due to an unexpected annotation in a JSON payload.

    + +

    Annotations are always expressed as name/value pairs. For +entity data model constructs represented as JSON objects the annotation +name/value pairs are placed within the object; for constructs represented as +JSON arrays or primitives they are placed next to the annotated model +construct. When annotating a payload that represents +a single primitive +or collection value, the annotations for the +value appear next to the value property and are not prefixed with a property name.

    + +

    Example 53:

    + +
    + +

    {

    + +

    "@context": +"http://host/service/$metadata#Customers",

    + +

    "@com.example.customer.setkind": +"VIPs",

    + +

    "value": [

    + +

    {

    + +

    "@com.example.display.highlight": true,

    + +

    "ID": "ALFKI",

    + +

    "CompanyName@com.example.display.style": { +"title": true, "order": 1 },

    + +

    "CompanyName": "Alfreds +Futterkiste",

    + +

    "Orders@com.example.display.style#simple": +{ "order": 2 }

    + +

    }

    + +

    ]

    + +

    }

    + +
    + +

    20.1 Annotate a +JSON Object

    + +

    When annotating a name/value pair +for which the value is represented as a JSON object, each annotation is placed +within the object and represented as a single name/value pair.

    + +

    The name always starts with the "at" sign (@), followed by the annotation identifier.

    + +

    The value MUST be an appropriate value for the annotation.

    + +

    20.2 Annotate +a JSON Array or Primitive

    + +

    When annotating a name/value pair +for which the value is represented as a JSON array or primitive value, each +annotation that applies to this name/value pair MUST be represented as a single +name/value pair and placed immediately prior to the annotated name/value pair, +with the exception of the nextLink or collectionAnnotations control information, +which can appear immediately before or after the annotated collection.

    + +

    The name is the same as the name of the property or +name/value pair being annotated, followed by the at sign (@), followed by the annotation identifier.

    + +

    The value MUST be an appropriate value for the annotation.

    + +

    20.3 Annotate a Primitive Value +within a JSON Array

    + +

    Individual primitive elements within a JSON array can be annotated by applying the collectionAnnotations control information to the array containing the primitive +member.

    + +

    The control information must come with other annotations or +control information immediately before or after the collection valued property. +The name of the property representing the control information is the same as +the name of the collection-valued property, followed by the at sign (@), followed by the collectionAnnotations +identifier.

    + +
    + +

    21 +Error Handling

    + +
    + +

    OData requests may return a well formed error response, an in-stream +error, or error information within a success payload.

    + +

    21.1 Error Response

    + +

    The error response MUST be a single JSON object. This object +MUST have a single name/value pair named error. The +value must be an OData error object.

    + +

    The OData error object MUST contain name/value pairs with +the names code and message, +and it MAY contain name/value pairs with the names target, details, +and innererror.

    + +

    The value for the code name/value +pair is a non-empty language-independent string. Its value is a service-defined +error code. This code serves as a sub-status for the HTTP error code specified +in the response. It cannot be null.

    + +

    The value for the message +name/value pair is a non-empty, language-dependent, human-readable string +describing the error. The Content-Language header +MUST contain the language code from [RFC5646] +corresponding to the language in which the value for message is written. It +cannot be null.

    + +

    The value for the target +name/value pair is a potentially empty string indicating the target of the +error (for example, the name of the property in error). It can be null.

    + +

    The value for the details +name/value pair MUST be an array of JSON objects that MUST contain name/value +pairs for code and message, and MAY contain a name/value +pair for target, as described +above.

    + +

    The value for the innererror +name/value pair MUST be an object. The contents of this object are service-defined. +Usually this object contains information that will help debug the service.

    + +

    Service +implementations SHOULD carefully consider which information to include in +production environments to guard against potential security concerns around +information disclosure.

    + +

    Error responses MAY contain annotations in any of its JSON objects.

    + +

    Example 54:

    + +
    + +

    {

    + +

    "error": {

    + +

    "code": "err123",

    + +

    "message": "Unsupported +functionality",

    + +

    "target": "query",

    + +

    "details": [

    + +

    {

    + +

    "code": "forty-two",

    + +

    "target": "$search",

    + +

    "message": "$search query option not +supported"

    + +

    }

    + +

    ],

    + +

    "innererror": {

    + +

    "trace": [...],

    + +

    "context": {...}

    + +

    }

    + +

    }

    + +

    }

    + +
    + +

    21.2 +In-Stream Error

    + +

    In the case that a service +encounters an error after sending a success status to the client, the service +MUST leave the response malformed. This can be achieved by immediately stopping +response serialization and thus omitting (among others) the end-object character +of the top-level JSON object in the response.

    + +

    Services MAY include the +header OData-Error as a trailing header if +supported by the transport protocol (e.g. with HTTP/1.1 and chunked transfer +encoding, or with HTTP/2), see [OData-Protocol].

    + +

    The value of the OData-Error +trailing header is an OData error object as defined in the preceding chapter, +represented in a header-appropriate way:

    + +

             +All optional whitespace (indentation and line breaks) is removed, +especially (in hex notation) 09, 0A and 0D

    + +

             +Control characters (00 to 1F and 7F) and Unicode +characters beyond 00FF within JSON strings are +encoded as \uXXXX or \uXXXX\uXXXX +(see [RFC8259], section 7)

    + +

    Example 55: note that this is one HTTP header line without +any line breaks or optional whitespace

    + +
    + +

    OData-error: +{"code":"err123","message":"Unsupported +functionality","target":"query","details":[{"code":"forty-two","target":"$search","message":"$search +query option not supported"}]}

    + +
    + +

    21.3 Error +Information in a Success Payload

    + +

    Services may return error +information within a success payload; for example, if the client has specified +the continue-on-error +preference.

    + +

    21.3.1 Primitive +Value Errors

    + +

    Primitive values that are in error are annotated with the Core.ValueException term, see [OData-VocCore]. +In this case, the payload MAY include an approximation of the value and MAY +specify a string representation of the exact value in the value +property of the annotation.

    + +

    21.3.2 Structured +Type Errors

    + +

    Structured types that are in error can be represented within +a success payload only if the client has specified the continue-on-error preference. Such items are annotated +with the Core.ResourceException term, see [OData-VocCore]. The annotation MAY include a retryLink property that can be used by the client to +attempt to re-fetch the resource.

    + +

    21.3.3 Collection +Errors

    + +

    Collections within a success payload can contain primitive +values that are in error, or structured values that are in error, if the client +has specified the continue-on-error +preference. Such elements are annotated as described above. Primitive elements +within a collection are annotated using the collectionAnnotations +control information.

    + +

    Services can return partial collections within a success +payload, for example, if they encounter an error while retrieving the +collection and the client has specified the continue-on-error +preference. In this case, the service MUST include a nextLink. +The nextLink can be used to +attempt retrieving the remaining members of the collection and could return an +error indicating that the remaining members are not available.

    + + + +

    Implementations can add instance +annotations of the form @namespace.termname or property@namespace.termname to any JSON object, where property MAY or MAY NOT match the name of a name/value +pair within the JSON object. However, the namespace MUST NOT start with odata and SHOULD NOT be required to be understood by the receiving +party in order to correctly interpret the rest of the payload as the receiving +party MUST ignore unknown annotations not defined in this version of the OData +JSON Specification.

    + + + +

    This specification raises no security issues.

    + +

    This section is provided as a service to the application +developers, information providers, and users of OData version 4.0 giving some +references to starting points for securing OData services as specified. OData +is a REST-full multi-format service that depends on other services and thus +inherits both sides of the coin, security enhancements and concerns alike from +the latter.

    + +

    For JSON-relevant security implications please cf. at least +the relevant subsections of [RFC8259] as +starting point.

    + + + +

    Conforming clients MUST be prepared to consume a service +that uses any or all of the constructs defined in this specification. The +exception to this are the constructs defined in Delta +Response, which are only required for clients that request changes.

    + +

     

    + +

    In order to +be a conforming consumer of the OData JSON format, a client or service:

    + +

    1.     MUST +either:

    + +

    a.     +understand metadata=minimal (section 3.1.1) or

    + +

    b.     +explicitly specify metadata=none (section 3.1.3) or metadata=full (section 3.1.2) +in the request (client)

    + +

    2.     MUST be prepared +to consume a response with full metadata

    + +

    3.     MUST be +prepared to receive all data types (section 7.1)

    + +

    a.      defined +in this specification (client)

    + +

    b.      exposed +by the service (service)

    + +

    4.     MUST +interpret all odata control information defined +according to the OData-Version +header of the payload (section 4.5)

    + +

    5.     MUST be +prepared to receive any annotations and control +information not defined in the OData-Version +header of the payload (section 21.2)

    + +

    6.     MUST NOT +require streaming=true in the Content-Type header (section 4.4)

    + +

    7.     MUST be a +conforming consumer of the OData 4.0 JSON format, for payloads with an OData-Version header value of 4.0.

    + +

    a.      MUST +accept the odata. prefix, where +defined, on format +parameters and control information

    + +

    b.      MUST +accept the # prefix in @odata.type +values

    + +

    c.       MUST +be prepared to handle binding through the use of the @odata.bind +property in payloads to a PATCH, +PUT, or POST request

    + +

    d.      MUST +accept TargetId within in a deleted link for a relationship with a maximum +cardinality of one

    + +

    e.      MUST +accept the string values -INF, INF, and NaN for single and double values

    + +

    f.        +MUST support property annotations that appear immediately before or +after the property they annotate

    + +

    8.     MAY be a +conforming consumer of the OData 4.01 JSON format, for payloads with an OData-Version header value of 4.01.

    + +

    a.      MUST +be prepared to interpret control information +with or without the odata. +prefix

    + +

    b.      MUST +be prepared for @odata.type primitive values with +or without the # prefix

    + +

    c.       MUST +be prepared to handle binding through inclusion of an entity reference within a +collection-valued navigation property in the body of a PATCH, PUT, +or POST request

    + +

    d.      MUST +be prepared for TargetId to be +included or omitted in a deleted link for a +relationship with a maximum cardinality of one

    + +

    e.      MUST +accept the string values -INF, INF, and NaN for decimal values with floating scale

    + +

    f.        +MUST be prepared to handle related entities inline within +a delta payload as well as a nested delta +representation for the collection

    + +

    g.      MUST +be prepared to handle decimal values written in exponential notation

    + +

     

    + +

    In order to +be a conforming producer of the OData JSON format, a client or service:

    + +

    9.     MUST +support generating OData 4.0 JSON compliant payloads with an OData-Version header value of 4.0.

    + +

    a.      MUST +NOT omit the odata. prefix from format parameters or control information

    + +

    b.      MUST +NOT omit the # prefix from @odata.type values

    + +

    c.       MUST +NOT include entity values or entity references within a collection-valued +navigation property in the body of a PATCH, +PUT, or POST request

    + +

    d.      MUST +NOT return decimal values written in exponential notation unless the ExponentialDecimals +format parameter is specified.

    + +

    e.      MUST +NOT advertise available actions or functions using name/value pairs prefixed +with a property name

    + +

    f.        +MUST NOT return a null value for name/value pairs representing actions +or functions that are not available

    + +

    g.      MUST +NOT represent numeric value exceptions for values other than single and double +values using the string values -INF, +INF, and NaN

    + +

    10.  MAY support generating OData +4.01 JSON compliant payloads for requests with an OData-Version header value of 4.01.

    + +

    a.      MUST +return property annotations immediately before the property they annotate

    + +

    b.      SHOULD +omit the odata. prefix from format parameters and odata control information

    + +

    c.       SHOULD +omit the # prefix from @type +primitive values

    + +

    d.      MAY +include inline related entities or nested delta collections within a delta +payload

    + +

    e.      MAY +include TargetId within a deleted link for a relationship with a maximum +cardinality of 1

    + +

    f.        +MAY return decimal values written in exponential notation

    + +

    g.      MAY +represent numeric value exceptions for decimal values with floating scale using +the string values -INF, INF, and NaN

    + +

    In addition, in order to conform to the OData JSON format, a +service:

    + +

    11.  MUST comply with one of the +conformance levels defined in [OData-Protocol]

    + +

    12.  MUST support the application/json media type in the Accept header (section +3)

    + +

    13.  MUST return well-formed JSON +payloads

    + +

    14.  MUST support odata.metadata=full (section 3.1.2)

    + +

    15.  MUST include the odata.nextLink control information in partial results for +entity collections (section 4.5.5)

    + +

    16.  MUST support entity +instances with external metadata (section 4.5.1)

    + +

    17.  MUST support properties with +externally defined data types (section 4.5.3)

    + +

    18.  MUST NOT violate any other +aspects of this OData JSON specification

    + +

    19.  SHOULD support the $format system query option (section 3)

    + +

    20.  MAY support the odata.streaming=true parameter in the Accept header (section 4.4)

    + +

    21.  MAY return full metadata +regardless of odata.metadata (section 3.1.2)

    + +

    22.  MUST NOT omit null or +default values unless the omit-values preference is +specified in the Prefer request header and the omit-values +preference is included in the Preference-Applied +response header

    + +

    23.  MUST return OData JSON +4.0-compliant responses for requests with an OData-MaxVersion +header value of 4.0

    + +

    24.  MUST support OData JSON +4.0-compliant payloads in requests with an OData-Version +header value of 4.0

    + +

    25.  MUST support returning, in +the final response to an asynchronous request, the application/json +payload that would have been returned had the operation completed +synchronously, wrapped in an application/http message

    + +

     

    + +

    In addition, in order to comply with the OData 4.01 JSON +format, a service:

    + +

    26.  SHOULD return +the OData JSON 4.01 format for requests with an OData-MaxVersion +header value of 4.01

    + +

    27.  MUST support the OData JSON +4.01 format in request payloads for requests with an OData-Version +header value of 4.01

    + +

    28.  MUST honor the odata.etag control information +within PUT, PATCH or DELETE payloads, if specified

    + +

    29.  MUST support returning, in +the final response to an asynchronous request, the application/json +payload that would have been returned had the operation completed synchronously

    + +
    + +

    Appendix +A.  Acknowledgments

    + +
    + +

    The contributions of the OASIS OData Technical Committee members, +enumerated in [OData-Protocol], are gratefully +acknowledged.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Revision

    +
    +

    Date

    +
    +

    Editor

    +
    +

    Changes Made

    +
    +

    Working Draft 01

    +
    +

    2016-06-22

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Import material from OData 4.0 Errata 3 JSON document and + initial application of 4.01 features

    +
    +

    Committee Specification Draft 01

    +
    +

    2016-12-08

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Integrated 4.01 features

    +
    +

    Committee Specification Draft 02

    +
    +

    2017-06-08

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Integrated more 4.01 features, especially:

    +

             + Update of a collection of entities

    +

             + JSON Batch format

    +
    +

    Committee Specification Draft 03

    +
    +

    2017-09-22

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Incorporated review feedback

    +
    +

    Committee Specification Draft 04

    +
    +

    2017-11-10

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Incorporated review feedback

    +

    Changed default of continue-on-error

    +
    +

    Committee Specification 01

    +
    +

    2017-12-19

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Non-Material Changes

    +
    +

    Committee Specification Draft 05

    +
    +

    2019-06-21

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    In-stream errors

    +

    Conditional request dependencies in batch requests

    +

    Optional action parameters

    +

    Update of media links of stream properties

    +

    Representing error information in success responses with continue-on-error

    +
    +

    Committee Specification Draft 06

    +
    +

    2019-09-20

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    No dependencies to async requests within a batch request

    +
    +

    Committee Specification 02

    +
    +

    2019-11-05

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Non-material changes

    +
    +

    Candidate OASIS Standard 01

    +
    +

    2020-01-15

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Non-material changes

    +
    +

    Candidate OASIS Standard 02

    +
    +

    2020-04-09

    +
    +

    Michael Pizzo

    +

    Ralf Handl

    +
    +

    Non-material changes

    +
    + +

     

    + +
    + + + + diff --git a/docs/odata-json-format/odata-json-format-v4.01-os.md b/docs/odata-json-format/odata-json-format-v4.01-os.md new file mode 100644 index 000000000..160d4f237 --- /dev/null +++ b/docs/odata-json-format/odata-json-format-v4.01-os.md @@ -0,0 +1,5914 @@ +::: WordSection1 +[![OASIS +logo](https://docs.oasis-open.org/templates/OASISLogo-v2.0.jpg){border="0" +width="250" height="55"}](https://www.oasis-open.org) + +::: {style="border:none;border-top:solid gray 1.0pt;padding:1.0pt 0in 0in 0in"} +OData JSON Format Version 4.01 + +OASIS Standard + +11 May 2020 +::: + +This stage: + + +(Authoritative) + + + + + +Previous stage: + + +(Authoritative) + + + + + +Latest stage: + + +(Authoritative) + + + + + +Technical Committee: + +[OASIS Open Data Protocol (OData) +TC](https://www.oasis-open.org/committees/odata/) + +[Chairs:]{#AdditionalArtifacts} + +Ralf Handl (), [SAP SE](http://www.sap.com) + +Michael Pizzo (), +[Microsoft](http://www.microsoft.com) + +Editors: + +Michael Pizzo (), +[Microsoft](http://www.microsoft.com) + +Ralf Handl (), [SAP SE](http://www.sap.com) + +[Mark Biamonte +(]{lang="DE"}[[mark.biamonte@progress.com]{lang="DE"}](mailto:mark.biamonte@progress.com)[), +]{lang="DE"}[[Progress Software]{lang="DE"}](http://www.progress.com/) + +[Related work]{#RelatedWork}: + +This specification replaces or supersedes: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}*OData +JSON Format Version 4.0*. Edited by Ralf Handl, Michael Pizzo, and Mark +Biamonte. OASIS Standard. Latest stage: +. + +This specification is related to: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}*OData +Version 4.01*. Edited by Michael Pizzo, Ralf Handl, and Martin Zurmuehl. +A multi-part Work Product which includes: + +[o[    ]{style="font:7.0pt \"Times New Roman\""}]{style="font-family: +\"Courier New\""}*OData Version 4.01. Part 1: Protocol*. Latest stage: +. + +[o[    ]{style="font:7.0pt \"Times New Roman\""}]{style="font-family: +\"Courier New\""}*OData Version 4.01. Part 2: URL Conventions*. Latest +stage: +. + +[o[    ]{style="font:7.0pt \"Times New Roman\""}]{style="font-family: +\"Courier New\""}*ABNF components: OData ABNF Construction Rules Version +4.01 and OData ABNF Test Cases*. +. + +[[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family: +Symbol;color:windowtext"}]{.MsoHyperlink}*OData Vocabularies Version +4.0.* Edited by Michael Pizzo, Ralf Handl, and Ram Jeyaraman. [Latest +stage: +]{lang="DE"}[[http://docs.oasis-open.org/odata/odata-vocabularies/v4.0/odata-vocabularies-v4.0.html]{lang="DE"}](http://docs.oasis-open.org/odata/odata-vocabularies/v4.0/odata-vocabularies-v4.0.html)[[.]{lang="DE"}]{.MsoHyperlink} + +[[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family: +Symbol;color:windowtext"}]{.MsoHyperlink}*OData Common Schema Definition +Language (CSDL) JSON Representation Version 4.01.* Edited by Michael +Pizzo, Ralf Handl, and Martin Zurmuehl. Latest stage: +[.]{.MsoHyperlink} + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}*OData +Common Schema Definition Language (CSDL) XML Representation Version +4.01.* Edited by Michael Pizzo, Ralf Handl, and Martin Zurmuehl. Latest +stage: +. + +Abstract: + +The Open Data Protocol (OData) for representing and interacting with +structured content is comprised of a set of specifications. The core +specification for the protocol is in OData Version 4.01 Part 1: +Protocol. This document extends the core specification by defining +representations for OData requests and responses using a JSON format. + +Status: + +This document was last revised or approved by the membership of OASIS on +the above date. The level of approval is also listed above. Check the +"Latest stage" location noted above for possible later revisions of this +document. Any other numbered Versions and other technical work produced +by the Technical Committee (TC) are listed at +. + +TC members should send comments on this specification to the TC's email +list. Others should send comments to the TC's public comment list, after +subscribing to it by following the instructions at the "[Send A +Comment](https://www.oasis-open.org/committees/comments/index.php?wg_abbrev=odata)" +button on the TC's web page at +[[.]{style="color:black"}]{.MsoHyperlink} + +[This specification is provided under the]{#_Hlk14362034} [RF on RAND +Terms](https://www.oasis-open.org/policies-guidelines/ipr#RF-on-RAND-Mode) +Mode of the [OASIS IPR +Policy](https://www.oasis-open.org/policies-guidelines/ipr), the mode +chosen when the Technical Committee was established. For information on +whether any patents have been disclosed that may be essential to +implementing this specification, and any offers of patent licensing +terms, please refer to the Intellectual Property Rights section of the +TC's web page (). + +Note that any machine-readable content ([Computer Language +Definitions](https://www.oasis-open.org/policies-guidelines/tc-process#wpComponentsCompLang)) +declared Normative for this Work Product is provided in separate plain +text files. In the event of a discrepancy between any such plain text +file and display content in the Work Product\'s prose narrative +document(s), the content in the separate plain text file prevails. + +Citation format: + +When referencing this specification, the following citation format +should be used: + +[\[]{.Refterm}**OData-JSON-Format-v4.01\]** + +*OData JSON Format Version 4.01.* Edited by Michael Pizzo, Ralf Handl, +and Mark Biamonte. 11 May 2020. OASIS Standard. +[[. +Latest stage:]{style="color:#403152"} +]{.MsoHyperlink}[.]{.MsoHyperlink} + +::: {style="border:none;border-top:solid gray 1.0pt;padding:1.0pt 0in 0in 0in"} +Notices +::: + +Copyright © OASIS Open 2020. All Rights Reserved. + +All capitalized terms in the following text have the meanings assigned +to them in the OASIS Intellectual Property Rights Policy (the \"OASIS +IPR Policy\"). The full +[Policy](https://www.oasis-open.org/policies-guidelines/ipr) may be +found at the OASIS website. + +This document and translations of it may be copied and furnished to +others, and derivative works that comment on or otherwise explain it or +assist in its implementation may be prepared, copied, published, and +distributed, in whole or in part, without restriction of any kind, +provided that the above copyright notice and this section are included +on all such copies and derivative works. However, this document itself +may not be modified in any way, including by removing the copyright +notice or references to OASIS, except as needed for the purpose of +developing any document or deliverable produced by an OASIS Technical +Committee (in which case the rules applicable to copyrights, as set +forth in the OASIS IPR Policy, must be followed) or as required to +translate it into languages other than English. + +The limited permissions granted above are perpetual and will not be +revoked by OASIS or its successors or assigns. + +This document and the information contained herein is provided on an +\"AS IS\" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE +INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED +WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +OASIS requests that any OASIS Party or any other party that believes it +has patent claims that would necessarily be infringed by implementations +of this OASIS Committee Specification or OASIS Standard, to notify OASIS +TC Administrator and provide an indication of its willingness to grant +patent licenses to such patent claims in a manner consistent with the +IPR Mode of the OASIS Technical Committee that produced this +specification. + +OASIS invites any party to contact the OASIS TC Administrator if it is +aware of a claim of ownership of any patent claims that would +necessarily be infringed by implementations of this specification by a +patent holder that is not willing to provide a license to such patent +claims in a manner consistent with the IPR Mode of the OASIS Technical +Committee that produced this specification. OASIS may include such +claims on its website, but disclaims any obligation to do so. + +OASIS takes no position regarding the validity or scope of any +intellectual property or other rights that might be claimed to pertain +to the implementation or use of the technology described in this +document or the extent to which any license under such rights might or +might not be available; neither does it represent that it has made any +effort to identify any such rights. Information on OASIS\' procedures +with respect to rights in any document or deliverable produced by an +OASIS Technical Committee can be found on the OASIS website. Copies of +claims of rights made available for publication and any assurances of +licenses to be made available, or the result of an attempt made to +obtain a general license or permission for the use of such proprietary +rights by implementers or users of this OASIS Committee Specification or +OASIS Standard, can be obtained from the OASIS TC Administrator. OASIS +makes no representation that any information or list of intellectual +property rights will at any time be complete, or that any claims in such +list are, in fact, Essential Claims. + +The name \"OASIS\" is a trademark of +[OASIS](https://www.oasis-open.org/), the owner and developer of this +specification, and should be used only to refer to the organization and +its official outputs. OASIS welcomes reference to, and implementation +and use of, specifications, while reserving the right to enforce its +marks against misleading uses. Please see + for above +guidance. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:1.0pt 0in 0in 0in"} +Table of Contents +::: + +[1[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Introduction[. +]{style="color:windowtext;display:none"}[7]{style="color:windowtext;display:none"}](#_Toc38457717) + +[1.0 IPR Policy[. ]{style="color:windowtext; +display:none"}[7]{style="color:windowtext;display:none"}](#_Toc38457718) + +[1.1 Terminology[. ]{style="color: +windowtext;display:none"}[7]{style="color:windowtext;display:none"}](#_Toc38457719) + +[1.2 Normative References[. +]{style="color:windowtext;display:none"}[7]{style="color:windowtext;display:none"}](#_Toc38457720) + +[1.3 Non-Normative References[. +]{style="color:windowtext;display:none"}[8]{style="color:windowtext;display:none"}](#_Toc38457721) + +[1.4 Typographical Conventions[. +]{style="color:windowtext;display:none"}[8]{style="color:windowtext;display:none"}](#_Toc38457722) + +[2[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}JSON Format +Design[. +]{style="color:windowtext;display:none"}[9]{style="color:windowtext;display:none"}](#_Toc38457723) + +[3[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Requesting the JSON +Format[ +]{style="color:windowtext;display:none"}[10]{style="color:windowtext;display:none"}](#_Toc38457724) + +[3.1 Controlling the Amount of Control Information in Responses[. +]{style="color:windowtext;display:none"}[10]{style="color:windowtext;display:none"}](#_Toc38457725) + +[3.1.1[ metadata=minimal]{style="font-family:\"Courier New\""} +([odata.metadata=minimal]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[10]{style="color:windowtext;display:none"}](#_Toc38457726) + +[3.1.2[ metadata=full]{style="font-family:\"Courier New\""} +([odata.metadata=full]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[11]{style="color:windowtext;display:none"}](#_Toc38457727) + +[3.1.3[ metadata=none]{style="font-family:\"Courier New\""} +([odata.metadata=none]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[11]{style="color:windowtext;display:none"}](#_Toc38457728) + +[3.2 Controlling the Representation of Numbers[. +]{style="color:windowtext;display:none"}[11]{style="color:windowtext;display:none"}](#_Toc38457729) + +[4[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Common +Characteristics[. +]{style="color:windowtext;display:none"}[13]{style="color:windowtext;display:none"}](#_Toc38457730) + +[4.1 Header [Content-Type]{style="font-family: +\"Courier New\""}[. +]{style="color:windowtext;display:none"}[13]{style="color:windowtext;display:none"}](#_Toc38457731) + +[4.2 Message Body[. +]{style="color:windowtext;display:none"}[13]{style="color:windowtext;display:none"}](#_Toc38457732) + +[4.3 Relative URLs[. +]{style="color:windowtext;display:none"}[13]{style="color:windowtext;display:none"}](#_Toc38457733) + +[4.4 Payload Ordering Constraints[. +]{style="color:windowtext;display:none"}[14]{style="color:windowtext;display:none"}](#_Toc38457734) + +[4.5 Control Information[. +]{style="color:windowtext;display:none"}[15]{style="color:windowtext;display:none"}](#_Toc38457735) + +[4.5.1 Control Information: +[context]{style="font-family:\"Courier New\""} +([odata.context]{style="font-family: +\"Courier New\""})[ +]{style="color:windowtext;display:none"}[15]{style="color:windowtext;display:none"}](#_Toc38457736) + +[4.5.2 Control Information: +[metadataEtag]{style="font-family:\"Courier New\""} +([odata.metadataEtag]{style="font-family: +\"Courier New\""})[ ]{style="color:windowtext; +display:none"}[15]{style="color:windowtext;display:none"}](#_Toc38457737) + +[4.5.3 Control Information: [type]{style="font-family:\"Courier New\""} +([odata.]{style="font-family:\"Courier New\""}[type]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext; +display:none"}[15]{style="color:windowtext;display:none"}](#_Toc38457738) + +[4.5.4 Control Information: [count]{style="font-family:\"Courier New\""} +([odata.count]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[17]{style="color:windowtext;display:none"}](#_Toc38457739) + +[4.5.5 Control Information: +[nextLink]{style="font-family:\"Courier New\""} +([odata.nextLink]{style="font-family: +\"Courier New\""})[ ]{style="color:windowtext;display: +none"}[17]{style="color:windowtext;display:none"}](#_Toc38457740) + +[4.5.6 Control Information: [delta]{style="font-family:\"Courier New\""} +([odata.delta]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[17]{style="color:windowtext;display:none"}](#_Toc38457741) + +[4.5.7 Control Information: +[deltaLink]{style="font-family:\"Courier New\""} +([odata.deltaLink]{style="font-family: +\"Courier New\""})[ ]{style="color:windowtext;display: +none"}[17]{style="color:windowtext;display:none"}](#_Toc38457742) + +[4.5.8 Control Information: [id]{style="font-family:\"Courier New\""} +([odata.id]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[17]{style="color:windowtext;display:none"}](#_Toc38457743) + +[4.5.9 Control Information: +[editLink]{style="font-family:\"Courier New\""} and +[readLink]{style="font-family: +\"Courier New\""} ([odata.editLink]{style="font-family:\"Courier New\""} +and [odata.readLink]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[17]{style="color:windowtext;display:none"}](#_Toc38457744) + +[4.5.10 Control Information: [etag]{style="font-family:\"Courier New\""} +([odata.etag]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[18]{style="color:windowtext;display:none"}](#_Toc38457745) + +[4.5.11 Control Information: +[navigationLink]{style="font-family:\"Courier New\""} and +[associationLink]{style="font-family:\"Courier New\""} +([odata.navigationLink]{style="font-family:\"Courier New\""} and +[odata.associationLink]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[18]{style="color:windowtext;display:none"}](#_Toc38457746) + +[4.5.12 Control Information: +[media\*]{style="font-family:\"Courier New\""} +([odata.media\*]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[19]{style="color:windowtext;display:none"}](#_Toc38457747) + +[4.5.13 Control Information: +[removed]{style="font-family:\"Courier New\""} +([odata.removed]{style="font-family: +\"Courier New\""})[ +]{style="color:windowtext;display:none"}[19]{style="color:windowtext;display:none"}](#_Toc38457748) + +[4.5.14 Control Information: +[collectionAnnotations]{style="font-family:\"Courier New\""} +([odata.collectionAnnotations]{style="font-family:\"Courier New\""})[ +]{style="color:windowtext;display:none"}[19]{style="color:windowtext;display:none"}](#_Toc38457749) + +[5[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Service Document[ +]{style="color:windowtext;display:none"}[21]{style="color:windowtext;display:none"}](#_Toc38457750) + +[6[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Entity[. +]{style="color:windowtext;display:none"}[23]{style="color:windowtext;display:none"}](#_Toc38457751) + +[7[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Structural +Property[. +]{style="color:windowtext;display:none"}[24]{style="color:windowtext;display:none"}](#_Toc38457752) + +[7.1 Primitive Value[. +]{style="color:windowtext;display:none"}[24]{style="color:windowtext;display:none"}](#_Toc38457753) + +[7.2 Complex Value[. +]{style="color:windowtext;display:none"}[25]{style="color:windowtext;display:none"}](#_Toc38457754) + +[7.3 Collection of Primitive Values[. +]{style="color:windowtext;display:none"}[25]{style="color:windowtext;display:none"}](#_Toc38457755) + +[7.4 Collection of Complex Values[. +]{style="color:windowtext;display:none"}[25]{style="color:windowtext;display:none"}](#_Toc38457756) + +[7.5 Untyped Value[. +]{style="color:windowtext;display:none"}[26]{style="color:windowtext;display:none"}](#_Toc38457757) + +[8[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Navigation +Property[. +]{style="color:windowtext;display:none"}[27]{style="color:windowtext;display:none"}](#_Toc38457758) + +[8.1 Navigation Link[. +]{style="color:windowtext;display:none"}[27]{style="color:windowtext;display:none"}](#_Toc38457759) + +[8.2 Association Link[. +]{style="color:windowtext;display:none"}[27]{style="color:windowtext;display:none"}](#_Toc38457760) + +[8.3 Expanded Navigation Property[. +]{style="color:windowtext;display:none"}[27]{style="color:windowtext;display:none"}](#_Toc38457761) + +[8.4 Deep Insert[ ]{style="color: +windowtext;display:none"}[28]{style="color:windowtext;display:none"}](#_Toc38457762) + +[8.5 Bind Operation[. +]{style="color:windowtext;display:none"}[28]{style="color:windowtext;display:none"}](#_Toc38457763) + +[8.6 Collection ETag[. +]{style="color:windowtext;display:none"}[29]{style="color:windowtext;display:none"}](#_Toc38457764) + +[9[        ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Stream Property[. +]{style="color:windowtext;display:none"}[31]{style="color:windowtext;display:none"}](#_Toc38457765) + +[10[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Media Entity[. +]{style="color:windowtext;display:none"}[32]{style="color:windowtext;display:none"}](#_Toc38457766) + +[11[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Individual Property +or Operation Response[. +]{style="color:windowtext;display:none"}[33]{style="color:windowtext;display:none"}](#_Toc38457767) + +[12[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Collection of +Operation Responses[. +]{style="color:windowtext;display:none"}[34]{style="color:windowtext;display:none"}](#_Toc38457768) + +[13[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Collection of +Entities[. +]{style="color:windowtext;display:none"}[35]{style="color:windowtext;display:none"}](#_Toc38457769) + +[14[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Entity Reference[. +]{style="color:windowtext;display:none"}[36]{style="color:windowtext;display:none"}](#_Toc38457770) + +[15[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Delta Payload[. +]{style="color:windowtext;display:none"}[37]{style="color:windowtext;display:none"}](#_Toc38457771) + +[15.1 Delta Responses[. +]{style="color:windowtext;display:none"}[37]{style="color:windowtext;display:none"}](#_Toc38457772) + +[15.2 Added/Changed Entity[. +]{style="color:windowtext;display:none"}[38]{style="color:windowtext;display:none"}](#_Toc38457773) + +[15.3 Deleted Entity[. +]{style="color:windowtext;display:none"}[40]{style="color:windowtext;display:none"}](#_Toc38457774) + +[15.4 Added Link[. ]{style="color: +windowtext;display:none"}[41]{style="color:windowtext;display:none"}](#_Toc38457775) + +[15.5 Deleted Link[. +]{style="color:windowtext;display:none"}[41]{style="color:windowtext;display:none"}](#_Toc38457776) + +[15.6 Update a Collection of Entities[. +]{style="color:windowtext;display:none"}[41]{style="color:windowtext;display:none"}](#_Toc38457777) + +[16[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Bound Function[. +]{style="color:windowtext;display:none"}[44]{style="color:windowtext;display:none"}](#_Toc38457778) + +[17[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Bound Action[. +]{style="color:windowtext;display:none"}[46]{style="color:windowtext;display:none"}](#_Toc38457779) + +[18[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Action Invocation[. +]{style="color:windowtext;display:none"}[48]{style="color:windowtext;display:none"}](#_Toc38457780) + +[19[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Batch Requests and +Responses[. +]{style="color:windowtext;display:none"}[49]{style="color:windowtext;display:none"}](#_Toc38457781) + +[19.1 Batch Request[ +]{style="color:windowtext;display:none"}[49]{style="color:windowtext;display:none"}](#_Toc38457782) + +[19.2 Referencing New Entities[. +]{style="color:windowtext;display:none"}[51]{style="color:windowtext;display:none"}](#_Toc38457783) + +[19.3 Referencing an ETag[. +]{style="color:windowtext;display:none"}[51]{style="color:windowtext;display:none"}](#_Toc38457784) + +[19.4 Processing a Batch Request[ +]{style="color:windowtext;display:none"}[52]{style="color:windowtext;display:none"}](#_Toc38457785) + +[19.5 Batch Response[. +]{style="color:windowtext;display:none"}[52]{style="color:windowtext;display:none"}](#_Toc38457786) + +[19.6 Asynchronous Batch Requests[. +]{style="color:windowtext;display:none"}[53]{style="color:windowtext;display:none"}](#_Toc38457787) + +[20[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Instance +Annotations[. +]{style="color:windowtext;display:none"}[56]{style="color:windowtext;display:none"}](#_Toc38457788) + +[20.1 Annotate a JSON Object[ +]{style="color:windowtext;display:none"}[56]{style="color:windowtext;display:none"}](#_Toc38457789) + +[20.2 Annotate a JSON Array or Primitive[. +]{style="color:windowtext;display:none"}[56]{style="color:windowtext;display:none"}](#_Toc38457790) + +[20.3 Annotate a Primitive Value within a JSON Array[. +]{style="color:windowtext;display:none"}[57]{style="color:windowtext;display:none"}](#_Toc38457791) + +[21[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Error Handling[. +]{style="color:windowtext;display:none"}[58]{style="color:windowtext;display:none"}](#_Toc38457792) + +[21.1 Error Response[. +]{style="color:windowtext;display:none"}[58]{style="color:windowtext;display:none"}](#_Toc38457793) + +[21.2 In-Stream Error[ +]{style="color:windowtext;display:none"}[58]{style="color:windowtext;display:none"}](#_Toc38457794) + +[21.3 Error Information in a Success Payload[. +]{style="color:windowtext;display:none"}[59]{style="color:windowtext;display:none"}](#_Toc38457795) + +[21.3.1 Primitive Value Errors[. +]{style="color:windowtext;display:none"}[59]{style="color:windowtext;display:none"}](#_Toc38457796) + +[21.3.2 Structured Type Errors[. +]{style="color:windowtext;display:none"}[59]{style="color:windowtext;display:none"}](#_Toc38457797) + +[21.3.3 Collection Errors[. +]{style="color:windowtext;display:none"}[59]{style="color:windowtext;display:none"}](#_Toc38457798) + +[22[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Extensibility[. +]{style="color:windowtext;display:none"}[60]{style="color:windowtext;display:none"}](#_Toc38457799) + +[23[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Security +Considerations[. +]{style="color:windowtext;display:none"}[61]{style="color:windowtext;display:none"}](#_Toc38457800) + +[24[      ]{style="font-size:11.0pt; +font-family:\"Calibri\",sans-serif;color:windowtext"}Conformance[. +]{style="color:windowtext;display:none"}[62]{style="color:windowtext;display:none"}](#_Toc38457801) + +[Appendix A.[        ]{style="font-size: +11.0pt;font-family:\"Calibri\",sans-serif;color:windowtext"}Acknowledgments[. +]{style="color:windowtext;display:none"}[64]{style="color:windowtext;display:none"}](#_Toc38457802) + +[Appendix B.[        ]{style="font-size: +11.0pt;font-family:\"Calibri\",sans-serif;color:windowtext"}Revision +History[. +]{style="color:windowtext;display:none"}[65]{style="color:windowtext;display:none"}](#_Toc38457803) + +  + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_Introduction}[]{#_Toc19867059}[]{#_Toc12019412}[]{#_Toc418513387}[]{#_Toc402353019}[1[     ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc368563066}[Introduction](#sec_Introduction)[]{#_Toc38457717}[]{#_Toc23836891}[]{#_Toc37318986} {#introduction style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +The OData protocol is comprised of a set of specifications for +representing and interacting with structured content. The core +specification for the protocol is in [**\[OData-Protocol\]**](#odata); +this document is an extension of the core protocol. This document +defines representations for the OData requests and responses using the +JavaScript Object Notation (JSON), see [**\[RFC8259\]**](#RFC_JSON). + +An OData JSON payload may represent: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[single primitive value](#sec_PrimitiveValue) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[collection of primitive values](#sec_CollectionofPrimitiveValues) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[single complex type value](#sec_ComplexValue) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[collection of complex type values](#sec_CollectionofComplexValues) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[single entity](#sec_Entity) or [entity reference](#sec_EntityReference) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[collection of entities](#sec_CollectionofEntities) or [entity +references](#sec_EntityReference) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[collection of changes](#sec_DeltaPayload) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}a +[service document](#sec_ServiceDocument) describing the top-level +resources exposed by the service + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}an +[error](#sec_ErrorResponse). + +## []{#_Toc418513388}[]{#_Toc402353020}[]{#_Toc368563067}[]{#sec_IPRPolicy}[1.0]{#_Toc19867060} [IPR Policy](#sec_IPRPolicy)[]{#_Toc37318987}[]{#_Toc23836892}[]{#_Toc38457718} + +This specification is provided under the [RF on RAND +Terms](https://www.oasis-open.org/policies-guidelines/ipr#RF-on-RAND-Mode) +Mode of the [OASIS IPR +Policy](https://www.oasis-open.org/policies-guidelines/ipr), the mode +chosen when the Technical Committee was established. For information on +whether any patents have been disclosed that may be essential to +implementing this specification, and any offers of patent licensing +terms, please refer to the Intellectual Property Rights section of the +TC's web page (). + +## []{#sec_Terminology}[]{#_Toc19867061}[1.1]{#_Toc12019413} [Terminology](#sec_Terminology)[]{#_Toc38457719}[]{#_Toc23836893}[]{#_Toc37318988} + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", +"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this +document are to be interpreted as described in +[**\[RFC2119\]**](#rfc2119). + +## []{#sec_NormativeReferences}[]{#_Toc19867062}[]{#_Toc12019414}[]{#_Toc418513389}[]{#_Toc402353021}[]{#_Toc368563068}[1.2]{#_Ref7502892} [Normative References](#sec_NormativeReferences)[]{#_Toc38457720}[]{#_Toc23836894}[]{#_Toc37318989} + +[\[[ECMAScript]{#ECMAScript}\]         ]{.Refterm}*ECMAScript 2016 +Language Specification, 7^th^ Edition,* June 2016. Standard ECMA-262. +. + +[\[[OData-ABNF]{#abnf}\]]{.Refterm}         *OData ABNF Construction +Rules Version 4.01*.\ +See link in "Related work" section on cover +page[.]{style="color:#222222"} + +**[\[[OData-CSDLJSON]{#ODataCSDLJSON}\]]{style="color:windowtext"}**[            +]{style="color:windowtext"}*OData Common Schema Definition Language +(CSDL) JSON Representation Version 4.01*. See link in "Related work" +section on cover page. + +**\[[OData-CSDLXML]{#ODataCSDLXML}\]        ** *OData Common Schema +Definition Language (CSDL) XML Representation Version 4.01.* See link in +\"Related work\" section on cover page. + +[\[[OData-Protocol]{#odata}\]]{.Refterm}     *OData Version 4.01 Part 1: +Protocol*.\ +See link in "Related work" section on cover +page[.]{style="color:#222222"} + +**[\[[OData-URL]{#ODataURLRef}\]]{style="color:windowtext"}**           +*OData Version 4.01 Part 2: URL Conventions*.\ +See link in \"Related work\" section on cover page. + +**\[[OData-VocCap]{#VocCapabilities}\]**      *OData Vocabularies +Version 4.0: Capabilities Vocabulary.*\ +See link in \"Related work\" section on cover page. + +[**\[OData-VocCore\]**]{#VocCore}     *OData Vocabularies Version 4.0: +Core Vocabulary.*\ +See link in \"Related work\" section on cover page + +[\[[RFC2119]{#rfc2119}\]]{.Refterm}               Bradner, S., "Key +words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, +March 1997. . + +[\[[RFC3986]{#RFC3986}\]]{.Refterm}               Berners-Lee, T., +Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): +Generic Syntax", IETF RFC3986, January 2005. +. + +[\[[RFC3987]{#RFC3987}\]]{.Refterm}               Duerst, M. and, M. +Suignard, "Internationalized Resource Identifiers (IRIs)", RFC 3987, +January 2005. . + +**\[[RFC4648]{#RFC4648}\]**               Josefsson, S,, "The Base16, +Base32, and Base64 Data Encodings\", RFC 4648, October 2006. +. + +[\[[RFC5646]{#rfc5646}\]]{.Refterm}               Phillips, A., Ed., and +M. Davis, Ed., "Tags for Identifying Languages", BCP 47, RFC 5646, +September 2009. . + +[]{#_Toc418513390}[]{#_Toc402353022}[[\[]{.Refterm}]{#_Toc368563069}[[RFC7493]{.Refterm}]{#RFC7493}[\]               +]{.Refterm}[[Bray, T., Ed., \"The I-JSON Message Format\", RFC7493, +March 2015. +]{style="font-weight:normal"}]{.Refterm}. + +[\[[RFC7946]{#RFC7946}\]]{.Refterm}               Howard Butler, Martin +Daly, Alan Doyle, Sean Gillies, [Stefan Hagen and +]{style="color:#333333"}Tim Schaub, \"The GeoJSON Format\", [RFC 7946, +August 2016.\ +]{style="color:#333333"}[.]{style="color:#222222"} + +[\[[]{#RFC_JSON}[RFC8259]{#rfc7159}\]]{.Refterm}               Bray, T., +Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", +RFC 8259, December 2017. . + +## []{#sec_NonNormativeReferences}[]{#_Toc19867063}[]{#_Toc12019415}[]{#_Toc528330154}[1.3]{#_Toc475623912} [Non-Normative References](#sec_NonNormativeReferences)[]{#_Toc37318990}[]{#_Toc23836895}[]{#_Toc38457721} + +[\[[GeoJSON-2008]{#GeoJSON2008}\]     ]{.Refterm}[[Butler, H., Daly, M., +Doyle, A., Gillies, S., Schaub, T., and C. Schmidt, \"The GeoJSON Format +Specification\", June +2008]{style="font-weight:normal"}]{.Refterm}**[.]{style="background:white"}**[ +]{style="background:white"}[[http://geojson.org/geojson-spec.html]{style="background:white"}](http://geojson.org/geojson-spec.html)[.]{style="background:white"} + +## []{#sec_TypographicalConventions}[]{#_Toc19867064}[1.4]{#_Toc12019416} [Typographical Conventions](#sec_TypographicalConventions)[]{#_Toc38457722}[]{#_Toc23836896}[]{#_Toc37318991} + +Keywords defined by this specification use this [monospaced]{.Datatype} +font. + +Normative source code uses this paragraph style. + +Some sections of this specification are illustrated with non-normative +examples. + +Example 1: text describing an example uses this paragraph style + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[Non-normative examples use this paragraph style.]{style="color:black"} +::: + +All examples in this document are non-normative and informative only. + +All other text is normative unless otherwise labeled. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_JSONFormatDesign}[]{#_Toc19867065}[]{#_Toc12019417}[]{#_Toc418513391}[]{#_Toc402353023}[2[     ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc368563070}[JSON Format Design](#sec_JSONFormatDesign)[]{#_Toc38457723}[]{#_Toc23836897}[]{#_Toc37318992} {#json-format-design style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +JSON, as described in [**\[RFC8259\]**](#RFC_JSON)[, ]{.Refterm}defines +a text format for serializing structured data. Objects are serialized as +an unordered collection of name/value pairs. + +JSON does not define any semantics around the name/value pairs that make +up an object, nor does it define an extensibility mechanism for adding +control information to a payload. + +OData's JSON format extends JSON by defining general conventions for +name/value pairs that annotate a JSON object, property or array. OData +defines a set of canonical name/value pairs for control information such +as ids, types, and links, and [instance +annotations](#sec_InstanceAnnotations) MAY be used to add +domain-specific information to the payload. + +A key feature of OData's JSON format is to allow omitting predictable +parts of the wire format from the actual payload. To reconstitute this +data on the receiving end, expressions are used to compute missing +links, type information, and other control data. These expressions +(together with the data on the wire) can be used by the client to +compute predictable payload pieces as if they had been included on the +wire directly. + +Control information is used in JSON to capture instance metadata that +cannot be predicted (e.g. the next link of a collection) as well as a +mechanism to provide values where a computed value would be wrong (e.g. +if the media read link of one particular entity does not follow the +standard URL conventions). Computing values from metadata expressions is +compute intensive and some clients might opt for a larger payload size +to avoid computational complexity; to accommodate for this the +[Accept]{.Datatype} header allows the client to control the amount of +control information added to the response. + +To optimize streaming scenarios, there are a few restrictions that MAY +be imposed on the sequence in which name/value pairs appear within JSON +objects. For details on the ordering requirements see [Payload Ordering +Constraints](#sec_PayloadOrderingConstraints). + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_RequestingtheJSONFormat}[]{#_Toc19867066}[]{#_Toc12019418}[]{#_Toc418513392}[]{#_Toc402353024}[]{#_Toc368563071}[]{#_Ref356829731}[]{#_Ref356829677}[]{#_Requesting_the_JSON}3[     ]{style="font:7.0pt \"Times New Roman\""}[Requesting the JSON Format](#sec_RequestingtheJSONFormat)[]{#_Toc38457724}[]{#_Toc23836898}[]{#_Toc37318993} {#requesting-the-json-format style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +The OData JSON format can be requested using the [\$format]{.Datatype} +query option in the request URL with the media type +[application/json]{.Datatype}, optionally followed by format parameters, +or the case-insensitive abbreviation [json]{.Datatype} which MUST NOT be +followed by format parameters. + +Alternatively, this format can be requested using the +[Accept]{.Datatype} header with the media type +[application/json]{.Datatype}, optionally followed by format parameters. + +If specified, [\$format]{.Datatype} overrides any value specified in the +[Accept]{.Datatype} header. + +Possible format parameters are: + +[[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;color:windowtext"}]{.MsoHyperlink}[[ExponentialDecimals]{style="font-family:\"Courier New\""}](#sec_ControllingtheRepresentationofNumber) + +[[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;color:windowtext"}]{.MsoHyperlink}[[IEEE754Compatible]{style="font-family:\"Courier New\""}](#sec_ControllingtheRepresentationofNumber) + +[[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}]{.Datatype}[[metadata]{style="font-family:\"Courier New\""}](#sec_ControllingtheAmountofControlInforma)[[ +(odata.metadata)]{style="font-family:\"Courier New\""}]{.MsoHyperlink} + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[streaming]{style="font-family: +\"Courier New\""}](#sec_PayloadOrderingConstraints)[[ +(odata.streaming)]{style="font-family:\"Courier New\""}]{.MsoHyperlink} + +The names and values of these format parameters are case-insensitive. + +Services SHOULD advertise the supported media types by annotating the +entity container with the term +[[Capabilities]{style="font-family:\"Courier New\""}[.SupportedFormats]{style="font-family: +\"Courier New\""}](https://github.com/oasis-tcs/odata-vocabularies/blob/master/vocabularies/Org.OData.Capabilities.V1.md#SupportedFormats) +defined in [**\[OData-VocCap\]**](#VocCapabilities), listing all +available formats and combinations of supported format parameters. + +## []{#sec_ControllingtheAmountofControlInforma}[]{#_Toc19867067}[]{#_Toc12019419}[]{#_Toc418513393}[]{#_Toc402353025}[]{#_Toc368563072}[]{#_Controlling_the_Amount}3.1 [Controlling the Amount of Control Information in Responses](#sec_ControllingtheAmountofControlInforma)[]{#_Toc38457725}[]{#_Toc23836899}[]{#_Toc37318994} + +The amount of [control information](#sec_ControlInformation) needed (or +desired) in the payload depends on the client application and device. +The [metadata]{.Datatype} parameter can be applied to the +[Accept]{.Datatype} header of an OData request to influence how much +control information will be included in the response. + +Other [Accept]{.Datatype} header parameters (e.g., +[streaming]{.Datatype}) are orthogonal to the [metadata]{.Datatype} +parameter and are therefore not mentioned in this section. + +If a client prefers a very small wire size and is intelligent enough to +compute data using metadata expressions, the [Accept]{.Datatype} header +should include +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal). +If computation is more critical than wire size or the client is +incapable of computing control information, +[[metadata=full]{style="font-family:\"Courier New\""}](#sec_metadatafullodatametadatafull) +directs the service to inline the control information that normally +would be computed from metadata expressions in the payload. +[[metadata=none]{style="font-family:\"Courier New\""}](#sec_metadatanoneodatametadatanone) +is an option for clients that have out-of-band knowledge or don\'t +require control information. + +In addition, the client may use the [include-annotations]{.Datatype} +preference in the [Prefer]{.Datatype} header to request additional +control information. Services supporting this MUST NOT omit control +information required by the chosen [metadata]{.Datatype} parameter, and +services MUST NOT exclude the +[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL), +[[deltaLink]{style="font-family: +\"Courier New\""}](#sec_ControlInformationdeltaLinkodatadelt), and +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount) +if they are required by the response type. + +If the client includes the +[OData-MaxVersion]{style="font-family:\"Courier New\""} header in a +request and does not specify the +[metadata]{style="font-family:\"Courier New\""} format parameter in +either the [Accept]{.Datatype} header or [\$format]{.Datatype} query +option, the service MUST return at least the [minimal control +information](#sec_metadataminimalodatametadataminimal). + +Note that in OData 4.0 the [metadata]{.Datatype} format parameter was +prefixed with "[odata]{.Datatype}.". Payloads with an [OData-Version +]{.Datatype}header equal to +[4.0]{style="font-family:\"Courier New\";color:black;background:white"} +MUST include the "[odata]{.Datatype}." prefix. Payloads with an +[OData-Version ]{.Datatype}header equal to [4.01]{style="font-family: +\"Courier New\";color:black;background:white"} or greater SHOULD NOT +include the "[odata]{.Datatype}." prefix.  + +### []{#sec_metadataminimalodatametadataminimal}[]{#_Toc19867068}[]{#_Toc12019420}[]{#_Toc418513394}[]{#_Toc402353026}[]{#_Toc368563073}[]{#_Ref359603569}[]{#_odata=minimalmetadata}[]{#_odata.metadata=minimal}3.1.1 [[metadata=minimal]{style="font-family:\"Courier New\""} ([odata.metadata=minimal]{style="font-family:\"Courier New\""})](#sec_metadataminimalodatametadataminimal)[]{#_Toc38457726}[]{#_Toc23836900}[]{#_Toc37318995} + +The [metadata=minimal]{.Datatype} format parameter indicates that the +service SHOULD remove computable control information from the payload +wherever possible. The response payload MUST contain at least the +following [control +information](#sec_ControlInformation)[:]{.MsoHyperlink} + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex): +the root context URL of the payload and the context URL for any deleted +entries or added or deleted links in a delta response, or for entities +or entity collections whose set cannot be determined from the root +context URL + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[etag]{style="font-family:\"Courier New\""}](#sec_ControlInformationetagodataetag): +the ETag of the entity or collection, as appropriate + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount): +the total count of a collection of entities or collection of entity +references, if requested + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL): +the next link of a collection with partial results + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[deltaLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationdeltaLinkodatadelt): +the delta link for obtaining changes to the result, if requested + +In addition, control information MUST appear in the payload for cases +where actual values are not the same as the computed values and MAY +appear otherwise. When control information appears in the payload, it is +treated as exceptions to the computed values. + +Media entities and stream properties MAY in addition contain the +following control information: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[mediaEtag]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia): +the ETag of the stream, as appropriate + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[mediaContentType]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia): +the media type of the stream + +### []{#sec_metadatafullodatametadatafull}[]{#_Toc19867069}[]{#_Toc12019421}[]{#_Toc418513395}[]{#_Toc402353027}[]{#_Toc368563074}[]{#_Ref356829837}[]{#_Ref356829810}[]{#_Ref356829691}[]{#_odata.metadata=full}3.1.2 [[metadata=full]{style="font-family:\"Courier New\""} ([odata.metadata=full]{style="font-family:\"Courier New\""})](#sec_metadatafullodatametadatafull)[]{#_Toc38457727}[]{#_Toc23836901}[]{#_Toc37318996} + +The [metadata=full]{.Datatype} format parameter indicates that the +service MUST include all control information explicitly in the payload. + +The full list of control information that may appear in a +[metadata=full]{.Datatype} response is as follows: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex): +the context URL for a collection, entity, primitive value, or service +document. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount): +the total count of a collection of entities or collection of entity +references, if requested. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL): +the next link of a collection with partial results + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[deltaLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationdeltaLinkodatadelt): +the delta link for obtaining changes to the result, if requested + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[id]{style="font-family:\"Courier New\""}](#sec_ControlInformationidodataid): +the ID of the entity + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[etag]{style="font-family:\"Courier New\""}](#sec_ControlInformationetagodataetag): +the ETag of the entity or collection, as appropriate + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[readLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationeditLinkandreadLin): +the link used to read the entity, if the edit link cannot be used to +read the entity + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[editLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationeditLinkandreadLin): +the link used to edit/update the entity, if the entity is updatable and +the [id]{.Keyword} does not represent a URL that can be used to edit the +entity + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[navigationLink]{style="font-family:\"Courier New\""}](#sec_NavigationLink): +the link used to retrieve the values of a navigation property + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[associationLink]{style="font-family:\"Courier New\""}](#sec_AssociationLink): +the link used to describe the relationship between this entity and +related entities + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype): +the type of the containing object or targeted property if the type of +the object or targeted property cannot be heuristically determined from +the data value, see section [Control Information: type +(odata.type)](#sec_ControlInformationtypeodatatype). + +Media entities and stream properties may in addition contain the +following control information: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[mediaReadLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia): +the link used to read the stream + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[mediaEditLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia): +the link used to edit/update the stream + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[mediaEtag]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia): +the ETag of the stream, as appropriate + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[mediaContentType]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia): +the media type of the stream + +### []{#sec_metadatanoneodatametadatanone}[]{#_Toc19867070}[]{#_Toc12019422}[]{#_Toc418513396}[]{#_Toc402353028}[]{#_Toc368563075}[]{#_Ref356829825}[]{#_odata=nometadata}[]{#_odata=nometadata_1}[]{#_odata.metadata=none}3.1.3 [[metadata=none]{style="font-family:\"Courier New\""} ([odata.metadata=none]{style="font-family:\"Courier New\""})](#sec_metadatanoneodatametadatanone)[]{#_Toc38457728}[]{#_Toc23836902}[]{#_Toc37318997} + +The [metadata=none]{.Datatype} format parameter indicates that the +service SHOULD omit control information other than +[[nextLink]{style="font-family: +\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) and +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount). +This control information MUST continue to be included, as applicable, +even in the [metadata=none]{.Datatype} case. + +It is not valid to specify [metadata=none]{.Datatype} on a [delta +request](#sec_DeltaPayload). + +## []{#sec_ControllingtheRepresentationofNumber}[]{#_Toc19867071}[]{#_Toc12019423}[]{#_Toc418513397}[]{#_Toc402353029}[]{#_Toc368563076}[]{#_Controlling_the_Representation}3.2 [Controlling the Representation of Numbers](#sec_ControllingtheRepresentationofNumber)[]{#_Toc38457729}[]{#_Toc23836903}[]{#_Toc37318998} + +The [IEEE754Compatible=true]{.Datatype} format parameter indicates that +the service MUST serialize [Edm.Int64]{.Datatype} and +[Edm.Decimal]{.Datatype} numbers (including the +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount), +if requested) as strings. This is in conformance with +[**\[**[[RFC7493]{style="color:windowtext"}]{.Refterm}**\]**](#RFC7493). + +If not specified, or specified as [IEEE754Compatible=false]{.Datatype}, +all numbers MUST be serialized as JSON numbers. + +This enables support for JavaScript numbers that are defined to be +64-bit binary format IEEE 754 values [**\[ECMAScript\]**](#ECMAScript) +(see [section +4.3.1.9](http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.19)) +resulting in integers losing precision past 15 digits, and decimals +losing precision due to the conversion from base 10 to base 2. + +OData JSON request and response payloads that format +[Edm.Int64]{.Datatype} and [Edm.Decimal]{.Datatype} values as strings +MUST specify this format parameter in the media type sent in the +[[Content-Type]{style="font-family:\"Courier New\""}](#sec_HeaderContentType) +header. + +Services producing responses without format parameter +[IEEE754Compatible=true]{.Datatype} which are unable to produce exact +JSON numbers MAY serialize [Edm.Int64]{.Datatype} and +[Edm.Decimal]{.Datatype} numbers with a rounded/inexact value as a JSON +number and annotate that value with an instance annotation with term +[Core.ValueException]{.Datatype} defined in +[**\[OData-VocCore\]**](#VocCore) containing the exact value as a +string. This situation can for example happen if the client only accepts +[application/json]{.Datatype} without any format parameters and the +service is written in JavaScript. + +For payloads with an [OData-Version]{.Datatype}[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}header equal to +[4.0]{style="font-family:\"Courier New\";color:black;background:white"} +the [ExponentialDecimals=true]{.Datatype} format parameter indicates +that the service MAY serialize [Edm.Decimal]{.Datatype} numbers in +exponential notation (e.g. [1e-6]{.Datatype} instead of +[0.000001]{.Datatype}). + +The sender of a request MUST specify +[ExponentialDecimals=true]{.Datatype} in the [Content-Type]{.Datatype} +header if the request body contains [Edm.Decimal]{.Datatype} values in +exponential notation. + +If not specified, or specified as +[ExponentialDecimals=false]{.Datatype}, all [Edm.Decimal]{.Datatype} +values MUST be serialized in long notation, using only an optional sign, +digits, and an optional decimal point followed by digits. + +Payloads with an [OData-Version]{.Datatype}[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}header equal to +[4.01]{style="font-family:\"Courier New\";color:black;background:white"} +or greater always allow exponential notation for numbers and the +[ExponentialDecimals]{.Keyword} format parameter is not needed or used. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_CommonCharacteristics}[]{#_Toc19867072}[]{#_Toc12019424}[]{#_Toc418513398}[]{#_Toc402353030}[4[     ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc368563077}[Common Characteristics](#sec_CommonCharacteristics)[]{#_Toc38457730}[]{#_Toc23836904}[]{#_Toc37318999} {#common-characteristics style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +This section describes common characteristics of the representation for +OData values in JSON. A request or response body consists of several +parts. It contains OData values as part of a larger document. Requests +and responses are structured almost identical; the few existing +differences will be explicitly called out in the respective subsections. + +## []{#sec_HeaderContentType}[]{#_Toc19867073}[]{#_Toc12019425}[]{#_Toc418513399}[]{#_Toc402353031}[]{#_Toc368563078}[]{#_Header_Content-Type}4.1 [Header [Content-Type]{style="font-family:\"Courier New\""}](#sec_HeaderContentType)[]{#_Toc38457731}[]{#_Toc23836905}[]{#_Toc37319000} + +Requests and responses with a JSON message body MUST have a +[Content-Type]{.Keyword} header value of [application/json]{.Keyword}. + +Requests MAY add the [charset]{.Datatype} parameter to the content type. +Allowed values are [UTF-8]{.Datatype},[ UTF-16]{.Datatype}, and +[UTF-32]{.Datatype}. If no [charset]{.Datatype} parameter is present, +[UTF-8]{.Datatype} MUST be assumed. + +Responses MUST include the +[[metadata]{style="font-family:\"Courier New\""}](#sec_ControllingtheAmountofControlInforma) +parameter to specify the amount of metadata included in the response. + +Requests and responses MUST include the +[[IEEE754Compatible]{style="font-family:\"Courier New\""}](#sec_ControllingtheRepresentationofNumber) +parameter if [Edm.Int64]{.Datatype} and [Edm.Decimal]{.Datatype} numbers +are represented as strings. + +Requests and responses MAY add the [streaming]{.Datatype} parameter with +a value of [true]{.Datatype} or [false]{.Datatype}, see section [Payload +Ordering Constraints](#sec_PayloadOrderingConstraints). + +## []{#sec_MessageBody}[]{#_Toc19867074}[]{#_Toc12019426}[]{#_Toc418513400}[]{#_Toc402353032}[4.2]{#_Toc368563079} [Message Body](#sec_MessageBody)[]{#_Toc38457732}[]{#_Toc23836906}[]{#_Toc37319001} + +Each message body is represented as a single JSON object. This object is +either the representation of an [entity](#sec_Entity)[, +]{.MsoHyperlink}an [entity reference](#sec_EntityReference) or a +[complex type instance](#sec_ComplexValue), or it contains a name/value +pair whose name MUST be [value]{.Keyword} and whose value is the correct +representation for a [primitive value](#sec_PrimitiveValue), a +[collection of primitive values](#sec_CollectionofPrimitiveValues), a +[collection of complex values](#sec_CollectionofComplexValues), a +[collection of entities](#sec_CollectionofEntities), or a collection of +objects that represent [changes to a previous +result](#sec_DeltaPayload). + +[]{#RelativeURLs}[]{#_Relative_URLs_1}Client libraries MUST retain the +order of objects within an array in JSON responses. + +## []{#sec_RelativeURLs}[]{#_Toc19867075}[]{#_Toc12019427}[]{#_Toc418513401}[]{#_Toc402353033}[]{#_Toc368563080}[]{#_Relative_URLs}4.3 [Relative URLs](#sec_RelativeURLs)[]{#_Toc38457733}[]{#_Toc23836907}[]{#_Toc37319002} + +URLs present in a payload (whether request or response) MAY be +represented as relative URLs. + +Relative URLs, other than those in +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype), +are relative to their base URL, which is + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +[context URL](#sec_ControlInformationcontextodatacontex) of the same +JSON object, if one exists, otherwise + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +context URL of the enclosing object, if one exists, otherwise + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +context URL of the next enclosing object, if one exists, etc. until the +document root, otherwise + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +request URL. + +For context URLs, these rules apply starting with the second bullet +point. + +Within the +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype) +control information, relative URLs are relative to the base type URL, +which is + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +[type]{.Datatype} of the enclosing object, if one exists, otherwise + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +[type]{.Datatype} of the next enclosing object, if one exists, etc. +until the document root, otherwise + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +context URL of the document root, if one exists, otherwise + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}the +request URL. + +Processors expanding the URLs MUST use normal URL expansion rules as +defined in [RFC3986]{.Refterm}. This means that if the base URL is a +context URL, the part starting with [\$metadata#]{.Datatype} is ignored +when resolving the relative URL. + +Clients that receive relative URLs in response payloads SHOULD use the +same relative URLs, where appropriate, in request payloads (such as +[bind operations](#sec_BindOperation) and batch requests) and in system +query options (such as [\$id]{.Datatype}). + +URLs represented as a string within a JSON payload, including [batch +requests](#sec_BatchRequest), must follow standard OData encoding rules. +For relative URLs this means that colons in the path part, especially +within key values, MUST be percent-encoded to avoid confusion with the +scheme separator. Colons within the query part, i.e. after the question +mark character ([?]{.Datatype}), need not be percent-encoded. + +Example 2: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"@editLink\": \"Customers(\'ALFKI\')\",]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"Orders@navigationLink\": +\"Customers(\'ALFKI\')/Orders\",]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +The resulting absolute URLs are +[http://host/service/Customers(\'ALFKI\')]{.Datatype} and +[http://host/service/Customers(\'ALFKI\')/Orders]{.Datatype}. + +## []{#sec_PayloadOrderingConstraints}[]{#_Toc19867076}[]{#_Toc12019428}[]{#_Toc418513402}[]{#_Toc402353034}[]{#_Toc368563081}[]{#_Ref354567725}[]{#_Payload_Ordering_Constraints_1}4.4 [Payload Ordering Constraints](#sec_PayloadOrderingConstraints)[]{#_Toc38457734}[]{#_Toc23836908}[]{#_Toc37319003} + +Ordering constraints MAY be imposed on the JSON payload in order to +support streaming scenarios. These ordering constraints MUST only be +assumed if explicitly specified as some clients (and services) might not +be able to control, or might not care about, the order of the JSON +properties in the payload. + +Clients can request that a JSON response conform to these ordering +constraints by specifying a media type of +[application/json]{style="font-family: +\"Courier New\""} with the [streaming=true]{.Datatype} parameter in the +[Accept]{style="font-family:\"Courier New\""} header or +[\$format]{style="font-family:\"Courier New\""} query option. Services +MUST return [406 Not Acceptable]{style="font-family:\"Courier New\""} if +the client only requests streaming and the service does not support it. + +Clients may specify the [streaming=true]{.Datatype} parameter in the +[Content-Type]{style="font-family:\"Courier New\""} header of requests +to indicate that the request body follows the payload ordering +constraints. In the absence of this parameter, the service must assume +that the JSON properties in the request are unordered. + +Processors MUST only assume streaming support if it is explicitly +indicated in the [Content-Type]{.Datatype} header via the +[streaming=true]{.Datatype} parameter. + +Example 3: a payload with + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[Content-Type: application/json;metadata=minimal;streaming=true +]{style="color:black"} +::: + +can be assumed to support streaming, whereas a payload with + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[Content-Type: application/json;metadata=minimal ]{style="color:black"} +::: + +cannot be assumed to support streaming. + +JSON producers are encouraged to follow the payload ordering constraints +whenever possible (and include the [streaming=true]{.Datatype} +content-type parameter) to support the maximum set of client scenarios. + +To support streaming scenarios the following payload ordering +constraints have to be met: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}If +present, the [context]{.Datatype} control information MUST be the first +property in the JSON object. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[type]{.Datatype} control information, if present, MUST appear next in +the JSON object. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[id]{.Datatype} and [etag]{.Datatype} control information MUST appear +before any property, property annotation, or property control +information. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}All +annotations or control information for a structural or navigation +property MUST appear as a group immediately before the property itself. +The one exception is the +[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) +of a collection which MAY appear after the collection it annotates. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}All +other [[control +information]{style="font-family:\"Arial\",sans-serif"}]{.Datatype} can +appear anywhere in the payload as long as it does not violate any of the +above rules. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}For +4.0 payloads, annotations and control information for navigation +properties MUST appear after all structural properties. 4.01 clients +MUST NOT assume this ordering. + +[]{#_Toc418513403}[]{#_Toc402353035}[]{#_Toc368563082}[]{#_Ref356829936}[]{#_Control_Information}Note +that, in OData 4.0, the [streaming]{.Datatype}[[ ]{style="font-family: +\"Arial\",sans-serif"}]{.Datatype}format parameter was prefixed with +"[odata]{.Datatype}.".  Payloads with an [OData-Version]{.Datatype}[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}header equal to +[4.0]{style="font-family:\"Courier New\";color:black;background:white"} +MUST include the "[odata]{.Datatype}." prefix. Payloads with an +[OData-Version ]{.Datatype}header equal to [4.01]{style="font-family: +\"Courier New\";color:black;background:white"} or greater SHOULD NOT +include the "[odata]{.Datatype}." prefix.  + +## []{#sec_ControlInformation}[]{#_Toc19867077}[]{#_Toc12019429}[]{#_Ref484691563}[]{#_Control_Information_1}4.5 [Control Information](#sec_ControlInformation)[]{#_Toc38457735}[]{#_Toc23836909}[]{#_Toc37319004} + +In addition to the "pure data" a message body MAY contain +[annotations](#sec_InstanceAnnotations) and control information that is +represented as name/value pairs whose names start with [@]{.Datatype}. + +In requests and responses with an [OData-Version]{style="font-family: +\"Courier New\""} header with a value of [4.0]{.Keyword} control +information names are prefixed with [\@odata.]{.Datatype}, e.g. +[\@odata.context]{.Datatype}. In requests and responses without such a +header the "[odata.]{style="font-family:\"Courier New\""}" infix SHOULD +be omitted, e.g [\@context]{.Datatype}. + +In some cases, control information is required in request payloads; this +is called out in the following subsections. + +Receivers[ ]{style="color:black;background:white"}that encounter unknown +annotations [in any namespace or unknown control information MUST NOT +stop processing and MUST NOT signal an +error[.]{.apple-converted-space}]{style="color:black;background:white"} + +### []{#sec_ControlInformationcontextodatacontex}[]{#_Toc19867078}[]{#_Toc12019430}[]{#_Toc418513404}[]{#_Toc402353036}[]{#_Toc368563083}[]{#_Ref356921125}[]{#_The_odata.metadata_Annotation_1}[]{#_Annotation_odata.metadata}[]{#_Annotation_odata.context}4.5.1 [Control Information: [context]{style="font-family:\"Courier New\""} ([odata.context]{style="font-family: +\"Courier New\""})](#sec_ControlInformationcontextodatacontex)[]{#_Toc38457736}[]{#_Toc23836910}[]{#_Toc37319005} + +The [context]{style="font-family:\"Courier New\""} control information +returns the context URL (see [**\[OData-Protocol\]**](#odata)) for the +payload. This URL can be absolute or [relative](#sec_RelativeURLs). + +The [context]{style="font-family:\"Courier New\""} control information +is not returned if +[[metadata=none]{style="font-family:\"Courier New\""}](#sec_metadatanoneodatametadatanone)[ +]{.MsoHyperlink}is requested. Otherwise[ ]{.MsoHyperlink}it MUST be the +first property of any JSON response[. ]{.MsoHyperlink} + +The [context]{style="font-family:\"Courier New\""} control information +MUST also be included in requests and responses for entities whose +entity set cannot be determined from the context URL[ ]{.MsoHyperlink}of +the collection. + +For more information on the format of the context URL, see +[**\[OData-Protocol\]**](#odata). + +Request payloads MAY include a context URL as a base URL for [relative +URLs](#sec_RelativeURLs) in the request payload. + +Example 4: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \"@metadataEtag\": +\"W/\\\"A1FF3E230954908F\\\"\",]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +### []{#sec_ControlInformationmetadataEtagodatam}[]{#_Toc19867079}[]{#_Toc12019431}[]{#_Toc418513405}[]{#_Toc402353037}[]{#_Toc368563084}[]{#_Annotation_odata.metadataEtag}4.5.2 [Control Information: [metadataEtag]{style="font-family:\"Courier New\""} ([odata.metadataEtag]{style="font-family: +\"Courier New\""})](#sec_ControlInformationmetadataEtagodatam)[]{#_Toc38457737}[]{#_Toc23836911}[]{#_Toc37319006} + +The [metadataEtag]{.Datatype} control information MAY appear in a +response in order to specify the entity tag (ETag) that can be used to +determine the version of the metadata of the response. If an ETag is +returned when requesting the metadata document, then the service SHOULD +set the [metadataEtag]{.Datatype} control information to the metadata +document\'s ETag in all responses when using +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +or +[[metadata=full]{style="font-family:\"Courier New\""}](#sec_metadatafullodatametadatafull). +If no ETag is returned when requesting the metadata document, then the +service SHOULD NOT set the [metadataEtag]{.Datatype} control information +in any responses. + +For details on how ETags are used, see [**\[OData-Protocol\]**](#odata). + +### []{#sec_ControlInformationtypeodatatype}[]{#_Toc19867080}[]{#_Toc12019432}[]{#_Toc418513406}[]{#_Toc402353038}[]{#_Toc368563085}[]{#odataType}[]{#_Annotation_odata.type}[]{#_Annotation_odata.type_(type)}4.5.3 [Control Information: [type]{style="font-family:\"Courier New\""} ([odata.]{style="font-family:\"Courier New\""}[type]{style="font-family:\"Courier New\""})](#sec_ControlInformationtypeodatatype)[]{#_Toc38457738}[]{#_Toc23836912}[]{#_Toc37319007} + +The [type]{.Datatype} control information specifies the type of a JSON +object or name/value pair. Its value is a URI that identifies the type +of the property or object. For built-in primitive types the value is the +unqualified name of the primitive type. For payloads described by an +[OData-Version]{style="font-family:\"Courier New\""} header with a value +of [4.0]{.Keyword}, this name MUST be prefixed with the hash symbol +([\#]{style="font-family:\"Courier New\""}); for non-OData 4.0 payloads, +built-in primitive type values SHOULD be represented without the hash +symbol, but consumers of 4.01 or greater payloads MUST support values +with or without the hash symbol. For all other types, the URI may be +absolute or relative to the [type]{.Datatype} of the containing object. +The root [type]{.Datatype} may be absolute or relative to the root +[context URL](#sec_ControlInformationcontextodatacontex). + +If the URI references a metadata document (that is, it's not just a +fragment), it MAY refer to a specific version of that metadata document +using the [\$s]{.Keyword}[chemaversion]{.Datatype} system query option +defined in [**\[OData-Protocol\]**](#odata)[.]{.MsoHyperlink} + +For non-built in primitive types, the URI contains the +namespace-qualified or alias-qualified type, specified as a URI +fragment. For properties that represent a collection of values, the +fragment is the namespace-qualified or alias-qualified element type +enclosed in parentheses and prefixed with [Collection]{.Datatype}. The +namespace or alias MUST be defined or the namespace referenced in the +metadata document of the service, see +[**\[OData-CSDLJSON\]**](#ODataCSDLJSON) or +[**\[OData-CSDLXML\]**](#ODataCSDLXML). + +The [type]{.Datatype} control information MUST appear in requests and in +responses with [minimal](#sec_metadataminimalodatametadataminimal) or +[full](#sec_metadatafullodatametadatafull) metadata, if the type cannot +be heuristically determined, as described below, and one of the +following is true: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +type is derived from the type specified for the (collection of) entities +or (collection of) complex type instances, or + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +type is for a property whose type is not declared in +[\$metadata]{.Datatype}. + +The following heuristics are used to determine the primitive type of a +dynamic property in the absence of the [type]{.Datatype} control +information: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}Boolean +values have a first-class representation in JSON and do not need any +additional control information. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}Numeric +values have a first-class representation in JSON but are not further +distinguished, so they include a +[[[type]{style="color:windowtext"}]{.Datatype}](#sec_ControlInformationtypeodatatype) +control information unless their type is [Double]{.Datatype}. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +special floating-point values [-INF]{.Datatype}, [INF]{.Datatype}, and +[NaN ]{.Datatype}are serialized as strings and MUST have a +[[[type]{style="color:windowtext"}]{.Datatype}](#sec_ControlInformationtypeodatatype) +control information to specify the numeric type of the property. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}String +values do have a first class representation in JSON, but there is an +obvious collision: OData also encodes a number of other primitive types +as strings, e.g. [DateTimeOffset]{.Datatype}, [Int64]{.Datatype} in the +presence of the +[[IEEE754Compatible]{style="font-family:\"Courier New\""}](#sec_ControllingtheRepresentationofNumber) +format parameter etc. If a property appears in JSON string format, it +should be treated as a string value unless the property is known (from +the metadata document) to have a different type. + +For more information on namespace- and alias-qualified names, see +[**\[OData-CSDLJSON\]**](#ODataCSDLJSON) or +[**\[OData-CSDLXML\]**](#ODataCSDLXML). + +Example 5: entity of type +[Model.VipCustomer]{style="font-family:\"Courier New\""} defined in the +metadata document of the same service with a dynamic property of type +[Edm.Date]{.Datatype} + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \"@type\": \"#Model.VipCustomer\",]{style="color:black"} + +[  \"ID\": 2,]{style="color:black"} + +[  \"DynamicValue@type\": \"Date\",]{style="color:black"} + +[  \"DynamicValue\": \"2016-09-22\",]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 6: entity of type +[Model.VipCustomer]{style="font-family:\"Courier New\""} defined in the +metadata[ ]{style="font-family:\"Courier New\""}document of a different +service + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \"@type\": +\"http://host/alternate/\$metadata#Model.VipCustomer\",]{style="color:black"} + +[  \"ID\": 2,]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +### []{#sec_ControlInformationcountodatacount}[]{#_Toc19867081}[]{#_Toc12019433}[]{#_Toc418513407}[]{#_Toc402353039}[]{#_Toc368563086}[]{#odataCount}[]{#_Annotation_odata.count}4.5.4 [Control Information: [count]{style="font-family:\"Courier New\""} ([odata.count]{style="font-family:\"Courier New\""})](#sec_ControlInformationcountodatacount)[]{#_Toc38457739}[]{#_Toc23836913}[]{#_Toc37319008} + +The [count]{.Datatype} control information occurs only in responses and +can annotate any collection, see [**\[OData-Protocol\]**](#odata) +section 11.2.5.5 System Query Option +[\$count]{style="font-family:\"Courier New\""}. Its value is an +[Edm.Int64]{style="font-family:\"Courier New\""} value corresponding to +the total count of members in the collection represented by the request. + +### []{#sec_ControlInformationnextLinkodatanextL}[]{#_Toc19867082}[]{#_Toc12019434}[]{#_Toc418513408}[]{#_Toc402353040}[]{#_Toc368563087}[]{#odataNext}[]{#_Annotation_odata.nextLink}[]{#_Annotation_nextLink_(odata.nextLink}4.5.5 [Control Information: [nextLink]{style="font-family:\"Courier New\""} ([odata.nextLink]{style="font-family: +\"Courier New\""})](#sec_ControlInformationnextLinkodatanextL)[]{#_Toc38457740}[]{#_Toc23836914}[]{#_Toc37319009} + +The [nextLink]{.Datatype} control information indicates that a response +is only a subset of the requested collection. It contains a URL that +allows retrieving the next subset of the requested collection. + +This control information can also be applied to [expanded to-many +navigation properties](#sec_ExpandedNavigationProperty). + +### []{#_Toc418513409}[]{#_Toc402353041}[]{#_Toc368563088}[]{#odataDelta}[]{#sec_ControlInformationdeltaodatadelta}[]{#_Toc19867083}[]{#_Toc12019435}[]{#_The_odata.deltaLink_Annotation}[]{#_Annotation_odata.deltaLink}[]{#_Annotation_delta}4.5.6 [Control Information: [delta]{style="font-family:\"Courier New\""} ([odata.delta]{style="font-family:\"Courier New\""})](#sec_ControlInformationdeltaodatadelta)[]{#_Toc37319010}[]{#_Toc23836915}[]{#_Toc38457741} + +The [delta]{.Datatype} control information is applied to a +collection-valued navigation property within an [added/changed +entity](#sec_AddedChangedEntity) in a delta payload to represent changes +in membership or value of nested entities. + +### []{#sec_ControlInformationdeltaLinkodatadelt}[]{#_Toc19867084}[4.5.7]{#_Toc12019436} [Control Information: [deltaLink]{style="font-family:\"Courier New\""} ([odata.deltaLink]{style="font-family: +\"Courier New\""})](#sec_ControlInformationdeltaLinkodatadelt)[]{#_Toc38457742}[]{#_Toc23836916}[]{#_Toc37319011} + +The [deltaLink]{.Datatype} control information contains a URL that can +be used to retrieve changes to the current set of results. The +[deltaLink]{.Datatype} control information MUST only appear on the last +page of results. A page of results MUST NOT have both a +[deltaLink]{.Datatype} control information and a +[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) +control information. + +### []{#sec_ControlInformationidodataid}[]{#_Toc19867085}[]{#_Toc12019437}[]{#_Toc418513410}[]{#_Toc402353042}[]{#_Toc368563089}[]{#_The_odata.id_Annotation_1}[]{#_Annotation_odata.id}[]{#_Annotation_id_(odata.id)}4.5.8 [Control Information: [id]{style="font-family:\"Courier New\""} ([odata.id]{style="font-family:\"Courier New\""})](#sec_ControlInformationidodataid)[]{#_Toc38457743}[]{#_Toc23836917}[]{#_Toc37319012} + +The [id]{.Datatype} control information contains the entity-id, see +[**\[OData-Protocol\]**](#odata). By convention the entity-id is +identical to the canonical URL of the entity, as defined in +[**\[OData-URL\]**](#ODataURLRef). + +The [id ]{.Datatype}control information MUST appear in responses if +[[metadata=full]{style="font-family:\"Courier New\""}](#sec_metadatafullodatametadatafull) +is requested, or if +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +is requested and any of a non-transient entity\'s key fields are omitted +from the response *or* the entity-id is not identical to the canonical +URL of the entity after + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}IRI-to-URI +conversion as defined in [**\[RFC3987\]**](#RFC3987), + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}relative +resolution as defined in section 5.2 of [**\[RFC3986\]**](#RFC3986), and + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}percent-encoding +normalization as defined in section 6 of [**\[RFC3986\]**](#RFC3986). + +Note that the entity-id MUST be invariant across languages, so if key +values are language dependent then the [id]{.Datatype} MUST be included +if it does not match convention for the localized key values. If the +[id]{.Datatype} is represented, it MAY be a [relative +URL](#sec_RelativeURLs). + +If the entity is transient (i.e. cannot be read or updated), the +[id]{.Datatype} control information MUST appear in OData 4.0 payloads +and have the [null]{.Datatype} value. In 4.01 payloads transient +entities need not have the [id]{.Datatype} control information, and 4.01 +clients MUST treat entities with neither [id]{.Datatype} control +information nor a full set of key properties as transient entities. + +The [id]{.Datatype} control information MUST NOT appear for a +collection. Its meaning in this context is reserved for future versions +of this specification. + +Entities with [id]{.Datatype} equal to [null]{.Datatype} cannot be +compared to other entities, reread, or updated. If +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +is specified and the [id]{.Datatype} is not present in the entity, then +the canonical URL MUST be used as the entity-id. + +### []{#sec_ControlInformationeditLinkandreadLin}[]{#_Toc19867086}[]{#_Toc12019438}[]{#_Toc418513411}[]{#_Toc402353043}[]{#_Toc368563090}[]{#_Annotation_odata.editLink_and}4.5.9 [Control Information: [editLink]{style="font-family:\"Courier New\""} and [readLink]{style="font-family: +\"Courier New\""} ([odata.editLink]{style="font-family:\"Courier New\""} and [odata.readLink]{style="font-family:\"Courier New\""})](#sec_ControlInformationeditLinkandreadLin)[]{#_Toc38457744}[]{#_Toc23836918}[]{#_Toc37319013} + +The [[editLink]{.Datatype}]{#odataEditLink} control information contains +the edit URL of the entity; see [**\[OData-Protocol\]**](#odata). + +The [readLink]{.Datatype} control information contains the read URL of +the entity or collection; see [**\[OData-Protocol\]**](#odata). + +The [editLink]{.Datatype} and [readLink]{.Datatype} control information +is ignored in request payloads and not written in responses if +[[metadata=none]{style="font-family:\"Courier New\""}](#sec_metadatanoneodatametadatanone) +is requested. + +The default value of both the edit URL and read URL is the entity\'s +[entity-id](#sec_ControlInformationidodataid) appended with a cast +segment to the type of the entity if its type is derived from the +declared type of the entity set. If neither the [editLink]{.Datatype} +nor the [readLink]{.Datatype} control information is present in an +entity, the client uses this default value for the edit URL. + +For updatable entities: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[editLink]{.Datatype} control information is written if +[[metadata=full]{style="font-family: +\"Courier New\""}](#sec_metadatafullodatametadatafull) is requested or +if +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +is requested and the edit URL differs from the default value of the edit +URL. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[readLink]{.Datatype} control information is written if the read URL is +different from the edit URL. If no [readLink]{.Datatype} control +information is present, the read URL is identical to the edit URL. + +For read-only entities: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[readLink]{.Datatype} control information is written if +[[metadata=full]{style="font-family: +\"Courier New\""}](#sec_metadatafullodatametadatafull) is requested or +if +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +is requested and its value differs from the default value of the read +URL. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[readLink]{.Datatype} control information may also be written if +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +is specified in order to signal that an individual entity is read-only. + +For collections: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[readLink]{.Datatype} control information, if written, MUST be the +request URL that produced the collection. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[editLink]{.Datatype} control information MUST NOT be written as its +meaning in this context is reserved for future versions of this +specification. + +### []{#sec_ControlInformationetagodataetag}[]{#_Toc19867087}[]{#_Toc12019439}[]{#_Toc418513412}[]{#_Toc402353044}[]{#_Toc368563091}[]{#odataEtag}[]{#_Annotation_odata.etag_(etag)}4.5.10 [Control Information: [etag]{style="font-family:\"Courier New\""} ([odata.etag]{style="font-family:\"Courier New\""})](#sec_ControlInformationetagodataetag)[]{#_Toc38457745}[]{#_Toc23836919}[]{#_Toc37319014} + +The [etag]{.Datatype} control information MAY be applied to an +[entity](#sec_Entity)[ ]{.MsoHyperlink}or collection in a response. The +value of the control information is an entity tag (ETag) which is an +opaque string value that can be used in a subsequent request to +determine if the value of the entity or collection has changed. + +For details on how ETags are used, see [**\[OData-Protocol\]**](#odata). + +[]{#_Toc368563092}[]{#_Annotation_odata.navigationLink_and}The +[etag]{.Datatype} control information is ignored in request payloads for +single entities and not written in responses if +[[metadata=none]{style="font-family:\"Courier New\""}](#sec_metadatanoneodatametadatanone) +is requested. + +### []{#sec_ControlInformationnavigationLinkanda}[]{#_Toc19867088}[]{#_Toc12019440}[]{#_Toc418513413}[]{#_Toc402353045}[]{#_Annotation_odata.navigationLink_and_1}4.5.11 [Control Information: [navigationLink]{style="font-family:\"Courier New\""} and [associationLink]{style="font-family:\"Courier New\""} ([odata.navigationLink]{style="font-family:\"Courier New\""} and [odata.associationLink]{style="font-family:\"Courier New\""})](#sec_ControlInformationnavigationLinkanda)[]{#_Toc38457746}[]{#_Toc23836920}[]{#_Toc37319015} + +The [[navigationLink]{style="font-family: +\"Courier New\""}]{#odataNavigationLink} control information in a +response contains a *navigation URL* that can be used to retrieve an +entity or collection of entities related to the current entity via a +[navigation property](#sec_NavigationProperty). + +The *default computed value of a navigation URL* is the value of the +[read URL](#sec_ControlInformationeditLinkandreadLin) appended with a +segment containing the name of the navigation property. The service MAY +omit the [navigationLink]{.Datatype} control information if +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +has been specified on the request and the navigation link matches this +computed value. + +[[The +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}[[associationLink]{style="font-family:\"Courier New\""}]{#odataAssocLink} +control information in a response contains an *association URL* that can +be used to retrieve a reference to an entity or a collection of +references to entities related to the current entity via a navigation +property. + +The *default computed value of an association URL* is the value of the +navigation URL appended with [/\$ref]{.Datatype}. The service MAY omit +the [associationLink]{.Datatype} control information if the association +link matches this computed value. + +[]{#_Toc368563093}[]{#_Annotation_odata.media*}The +[navigationLink]{.Datatype} and [associationLink]{.Datatype} control +information is ignored in request payloads and not written in responses +if +[[metadata=none]{style="font-family:\"Courier New\""}](#sec_metadatanoneodatametadatanone) +is requested. + +### []{#sec_ControlInformationmediaodatamedia}[]{#_Toc19867089}[]{#_Toc12019441}[]{#_Toc418513414}[]{#_Toc402353046}[]{#_Annotation_odata.media*_1}4.5.12 [Control Information: [media\*]{style="font-family:\"Courier New\""} ([odata.media\*]{style="font-family:\"Courier New\""})](#sec_ControlInformationmediaodatamedia)[]{#_Toc38457747}[]{#_Toc23836921}[]{#_Toc37319016} + +For [media entities](#sec_MediaEntity) and [stream +properties](#sec_StreamProperty) at least one of the control information +[mediaEditLink]{.Keyword} and [mediaReadLink]{.Keyword} MUST be included +in responses if they don\'t follow standard URL conventions as defined +in [**\[OData-URL\]**](#ODataURLRef) or if +[[metadata=full]{style="font-family:\"Courier New\""}](#sec_metadatafullodatametadatafull) +is requested. + +The [mediaEditLink]{.Datatype} control information contains a URL that +can be used to update the binary stream associated with the media entity +or stream property. It MUST be included for updatable streams if it +differs from standard URL conventions relative to the edit link of the +entity. + +The [mediaReadLink]{.Datatype} control information contains a URL that +can be used to read the binary stream associated with the media entity +or stream property. It MUST be included if its value differs from the +value of the associated [mediaEditLink]{.Datatype}, if present, or if it +doesn't follow standard URL conventions relative to the read link of the +entity and the associated +[mediaEditLink]{style="font-family:\"Courier New\""} is not present. + +The [mediaContentType ]{.Keyword}control information MAY be included; +its value SHOULD match the media type of the binary stream represented +by the [mediaReadLink]{.Keyword} URL. This is only a hint; the actual +media type will be included in the [Content-Type]{.Datatype} header when +the resource is requested. + +The [mediaEtag]{.Keyword} control information MAY be included; its value +is the ETag of the binary stream represented by this media entity or +stream property. + +The [media\*]{.Datatype} control information is not written in responses +if +[[metadata=none]{style="font-family:\"Courier New\""}](#sec_metadatanoneodatametadatanone) +is requested. + +If a stream property is provided inline in a request, the +[mediaContentType]{.Datatype} control information may be specified. + +If a stream property is annotated with +[Capabilities.MediaLocationUpdateSupported]{.Datatype} (see +[**\[OData-VocCap\]**](#VocCapabilities)) and a value of +[true]{.Datatype}, clients MAY specify the [mediaEditLink]{.Datatype} +and/or [mediaReadLink]{.Datatype} control information for that stream +property in order to change the association between the stream property +and a media stream. + +In all other cases [media\*]{.Datatype} control information is ignored +in request payloads. + +Example 7: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees/\$entity\",]{style="color:black"} + +[  \"@mediaReadLink\": \"Employees(1)/\$value\",]{style="color:black"} + +[  \"@mediaContentType\": \"image/jpeg\",]{style="color:black"} + +[  \"ID\": 1,]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +### []{#_Toc418513415}[]{#_Toc402353047}[]{#_Toc368563094}[]{#sec_ControlInformationremovedodataremove}[]{#_Toc19867090}[]{#_Toc12019442}[]{#_Representing_the_Service}4.5.13 [Control Information: [removed]{style="font-family:\"Courier New\""} ([odata.removed]{style="font-family: +\"Courier New\""})](#sec_ControlInformationremovedodataremove)[]{#_Toc37319017}[]{#_Toc23836922}[]{#_Toc38457748} + +The [removed]{.Datatype} control information is used in [delta +payloads](#sec_DeletedEntity) and indicates that the represented entity +is (to be) deleted. + +### []{#sec_ControlInformationcollectionAnnotati}[]{#_Toc19867091}[]{#_Toc12019443}[]{#_Hlt11961667}4.5.14 [Control Information: [collectionAnnotations]{style="font-family:\"Courier New\""} ([odata.collectionAnnotations]{style="font-family:\"Courier New\""})](#sec_ControlInformationcollectionAnnotati)[]{#_Toc37319018}[]{#_Toc23836923}[]{#_Toc38457749} + +The [collectionAnnotations]{.Datatype} control information can be +applied to a collection containing primitive members in order to +annotate such primitive members. The value of the +[collectionAnnotations]{.Datatype} control information is an array of +JSON objects containing an integer property [index]{.Datatype}, +specifying the zero-based ordinal index of the primitive item within the +collection, along with any annotations that are to be applied to that +primitive collection member. + +Example 8: Annotating primitive values within a collection + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees/\$entity\",]{style="color:black"} + +[  \"ID\": 1,]{style="color:black"} + +[  \"EmailAddresses@collectionAnnotations\" : \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"index\":0,]{style="color:black"} + +[      \"@emailType\":\"Personal\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"index\":2,]{style="color:black"} + +[      \"@emailType\":\"Work\"]{style="color:black"} + +[    }]{style="color:black"} + +[  \],]{style="color:black"} + +[  \"EmailAddresses\": \[ ]{style="color:black"} + +[    \"Julie@Swansworth.com\", ]{style="color:black"} + +[    \"JulieSwa@live.com\", ]{style="color:black"} + +[    \"Julie.Swansworth@work.com\" ]{style="color:black"} + +[  \],]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +  + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_ServiceDocument}[]{#_Toc19867092}[5[     ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019444}[Service Document](#sec_ServiceDocument)[]{#_Toc38457750}[]{#_Toc23836924}[]{#_Toc37319019} {#service-document style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +A service document in JSON is represented as a single JSON object with +at least the +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +control information and a property +[value]{style="font-family:\"Courier New\""}. + +The value of the +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +control information MUST be the URL of the metadata document, without +any fragment part. + +The value of the [value]{.Datatype} property MUST be a JSON array +containing one element for each entity set and function import with an +explicit or default value of [true]{.Datatype} for the attribute +[IncludeInServiceDocument]{.Datatype} and each singleton exposed by the +service, see [**\[OData-CSDLJSON\]**](#ODataCSDLJSON) or +[**\[OData-CSDLXML\]**](#ODataCSDLXML). + +Each element MUST be a JSON object with at least two name/value pairs, +one with name [name]{.Datatype} containing the name of the entity set, +function import, or singleton, and one with name [url]{.Datatype} +containing the URL of the entity set, which may be an absolute or a +[relative URL](#sec_RelativeURLs). It MAY contain a name/value pair with +name [title]{.Datatype} containing a human-readable, language-dependent +title for the object. + +JSON objects representing an entity set MAY contain an additional +name/value pair with name [kind]{.Datatype} and a value of +[EntitySet]{.Datatype}. If the [kind]{.Datatype} name/value pair is not +present, the object MUST represent an entity set. + +JSON objects representing a function import MUST contain the +[kind]{.Datatype} name/value pair with a value of +[FunctionImport]{.Datatype}. + +JSON objects representing a singleton MUST contain the [kind]{.Datatype} +name/value pair with a value of [Singleton]{.Datatype}. + +JSON objects representing a related service document MUST contain the +[kind]{.Datatype} name/value pair with a value of +[ServiceDocument]{style="font-family:\"Courier New\""}. + +C[lients ]{style="color:black;background:white"}that encounter unknown +values of the [kind]{.Datatype} name/value pair not defined in this +version of the specification [MUST NOT stop processing and MUST NOT +signal an error[.]{.apple-converted-space}]{style="color:black; +background:white"} + +Service documents MAY contain [annotations](#sec_InstanceAnnotations) in +any of its JSON objects. Services MUST NOT produce name/value pairs +other than the ones explicitly defined in this section, and clients MUST +ignore unknown name/value pairs. + +Example 9: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata\",]{style="color:black"} + +[  \"value\": \[]{style="color:black"} + +[    { ]{style="color:black"} + +[      \"name\": \"Orders\",]{style="color:black"} + +[      \"kind\": \"EntitySet\",]{style="color:black"} + +[      \"url\":  \"Orders\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"name\":  \"OrderItems\",]{style="color:black"} + +[      \"title\": \"Order Details\",]{style="color:black"} + +[      \"url\":   \"OrderItems\"]{style="color:black"} + +[    },]{style="color:black"} + +[    { ]{style="color:black"} + +[      \"name\":  \"TopProducts\",]{style="color:black"} + +[      \"title\": \"Best-Selling Products\",]{style="color:black"} + +[      \"kind\":  \"FunctionImport\",]{style="color:black"} + +[      \"url\":   \"TopProducts\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"name\":  \"MainSupplier\",]{style="color:black"} + +[      \"title\": \"Main Supplier\",]{style="color:black"} + +[      \"kind\":  \"Singleton\",]{style="color:black"} + +[      \"url\":   \"MainSupplier\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"name\": \"Human Resources\",]{style="color:black"} + +[      \"kind\": \"ServiceDocument\",]{style="color:black"} + +[      \"url\":  \"http://host/HR/\"]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_Entity}[]{#_Toc19867093}[]{#_Toc12019445}[]{#_Toc418513416}[]{#_Toc402353048}[]{#_Toc368563095}[]{#Entitiy}[]{#_Entity}6[     ]{style="font:7.0pt \"Times New Roman\""}[Entity](#sec_Entity)[]{#_Toc38457751}[]{#_Toc23836925}[]{#_Toc37319020} {#entity style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +An entity is serialized as a JSON object. It MAY contain +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex), +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype), +or[[ +]{style="font-family:\"Courier New\""}]{.MsoHyperlink}[[deltaLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationdeltaLinkodatadelt) +control information. + +Each [property](#sec_StructuralProperty) to be transmitted is +represented as a name/value pair within the object. The order properties +appear within the object is considered insignificant. + +An entity in a payload may be a complete entity, a projected entity (see +*System Query Option* [\$select]{.Datatype} +[**\[OData-Protocol\]**](#odata)), or a partial entity update (see +*Update an Entity* in [**\[OData-Protocol\]**](#odata)). + +An entity representation can be (modified and) round-tripped to the +service directly. The [context +URL](#sec_ControlInformationcontextodatacontex) is used in requests only +as a base for [relative URLs](#sec_RelativeURLs). + +Example 10: entity with [metadata=minimal]{.Datatype} + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \"ID\": \"ALFKI\",]{style="color:black"} + +[  \"CompanyName\": \"Alfreds Futterkiste\",]{style="color:black"} + +[  \"ContactName\": \"Maria Anders\",]{style="color:black"} + +[  \"ContactTitle\": \"Sales Representative\",]{style="color:black"} + +[  \"Phone\": \"030-0074321\",]{style="color:black"} + +[  \"Fax\": \"030-0076545\",]{style="color:black"} + +[  \"Address\": { ]{style="color:black"} + +[    \"Street\": \"Obere Str. 57\",]{style="color:black"} + +[    \"City\": \"Berlin\",]{style="color:black"} + +[    \"Region\": null,]{style="color:black"} + +[    \"PostalCode\": \"D-12209\"]{style="color:black"} + +[  }]{style="color:black"} + +[}]{style="color:black"} +::: + +[]{#_Properties}Example 11: entity with [metadata=full]{.Datatype} + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \"@id\": \"Customers(\'ALFKI\')\",]{style="color:black"} + +[  \"@etag\": +\"W/\\\"MjAxMy0wNS0yN1QxMTo1OFo=\\\"\",]{style="color:black"} + +[  \"@editLink\": \"Customers(\'ALFKI\')\",]{style="color:black"} + +[  \"ID\": \"ALFKI\",]{style="color:black"} + +[  \"CompanyName\": \"Alfreds Futterkiste\",]{style="color:black"} + +[  \"ContactName\": \"Maria Anders\",]{style="color:black"} + +[  \"ContactTitle\": \"Sales Representative\",]{style="color:black"} + +[  \"Phone\": \"030-0074321\",]{style="color:black"} + +[  \"Fax\": \"030-0076545\",]{style="color:black"} + +[  \"Address\": { ]{style="color:black"} + +[    \"Street\": \"Obere Str. 57\",]{style="color:black"} + +[    \"City\": \"Berlin\",]{style="color:black"} + +[    ]{style="color:black"}[\"Region\": null,]{lang="DE" +style="color:black"} + +[    \"PostalCode\": \"D-12209\",]{lang="DE" style="color:black"} + +[  +  \"Country@associationLink\":\"Customers(\'ALFKI\')/Address/Country/\$ref\",]{lang="DE" +style="color:black"} + +[    ]{lang="DE" style="color:black"}[\"Country@navigationLink\": +\"Customers(\'ALFKI\')/Address/Country\"]{style="color:black"} + +[  },]{style="color:black"} + +[  \"Orders@associationLink\": +\"Customers(\'ALFKI\')/Orders/\$ref\",]{style="color:black"} + +[  \"Orders@navigationLink\": +\"Customers(\'ALFKI\')/Orders\"]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_StructuralProperty}[]{#_Toc19867094}[]{#_Toc12019446}[]{#_Toc418513417}[]{#_Toc402353049}[]{#_Toc368563096}[]{#_Structural_Property}7[     ]{style="font:7.0pt \"Times New Roman\""}[Structural Property](#sec_StructuralProperty)[]{#_Toc38457752}[]{#_Toc23836926}[]{#_Toc37319021} {#structural-property style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +A property within an entity or complex type instance is represented as a +name/value pair. The name MUST be the name of the property; the value is +represented depending on its type as a [primitive +value](#sec_PrimitiveValue), a [complex value](#sec_ComplexValue), a +[collection of primitive values](#sec_CollectionofPrimitiveValues), or +a[ ]{.MsoHyperlink}[collection of complex +values](#sec_CollectionofComplexValues)[.]{.MsoHyperlink} + +## []{#sec_PrimitiveValue}[]{#_Toc19867095}[]{#_Toc12019447}[]{#_Toc418513418}[]{#_Toc402353050}[]{#_Toc368563097}[]{#_Ref356829873}[]{#_Primitive_Value}7.1 [Primitive Value](#sec_PrimitiveValue)[]{#_Toc38457753}[]{#_Toc23836927}[]{#_Toc37319022} + +Primitive values are represented following the rules of +[**\[RFC8259\]**](#RFC_JSON). + +Null values are represented as the JSON literal [null]{.Datatype}. + +Values of type [Edm.Boolean]{.Datatype} are represented as the JSON +literals [true]{.Datatype} and [false]{.Datatype} + +Values of types [Edm.Byte]{.Datatype}, [Edm.SByte]{.Datatype}, +[Edm.Int16]{.Datatype}, [Edm.Int32]{.Datatype}, [Edm.Int64]{.Datatype}, +[Edm.Single]{.Datatype}, [Edm.Double]{.Datatype}, and +[Edm.Decimal]{.Datatype} are represented as JSON numbers, except for +[-INF]{.Datatype}, [INF]{.Datatype}, and [NaN]{.Datatype} which are +represented as strings. + +Values of type [Edm.String]{.Datatype} are represented as JSON strings, +using the JSON string escaping rules. + +Values of type [Edm.Binary]{.Datatype}, [Edm.Date]{.Datatype}, +[Edm.DateTimeOffset]{.Datatype}[[, +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}[Edm.Duration]{.Datatype},  +[Edm.Guid]{.Datatype}, and [Edm.TimeOfDay]{.Datatype} are represented as +JSON strings whose content satisfies the rules [binaryValue]{.Datatype}, +[dateValue]{.Datatype}, [dateTimeOffsetValue]{.Datatype}, +[durationValue]{.Datatype}, [guidValue]{.Datatype}, and +[timeOfDayValue]{.Datatype} respectively, in +[**\[OData-ABNF\]**](#abnf). + +Primitive values that cannot be represented, for example due to server +conversion issues or IEEE754 limitations on the size of an [Edm.Int64 +]{.Datatype}or [Edm.Decimal]{.Datatype}[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}value, are +annotated with the [Core.ValueException]{.Datatype} term. In this case, +the payload MAY include an approximation of the value and MAY specify a +string representation of the exact value in the [value]{.Datatype} +property of the annotation. + +Enumeration values are represented as JSON strings whose content +satisfies the rule [enumValue]{.Datatype} in +[**\[OData-ABNF\]**](#abnf). The preferred representation is the +[enumerationMember]{.Datatype}. If no [enumerationMember]{.Datatype} (or +combination of [[named enumeration +members]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}) is +available, the [enumMemberValue]{.Datatype} representation may be used. + +Geography and geometry values are represented as geometry types as +defined in [**\[RFC7946\]**](#RFC7946), with the following +modifications: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}Keys +SHOULD be ordered with type first, then coordinates, then any other keys + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}If +the optional [CRS +object](http://geojson.org/geojson-spec.html#named-crs) is present, it +MUST be of type [name]{.Datatype}, where the value of the +[name]{.Datatype} member of the contained [properties]{.Datatype} object +is an EPSG SRID legacy identifier, see **\[GeoJSON-2008\]**. + +Geography and geometry types have the same representation in a JSON +payload. Whether the value represents a geography type or geometry type +is inferred from its usage or specified using the +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype) +control information. + +Example 12: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"NullValue\": null,]{style="color:black"} + +[  \"TrueValue\": true,]{style="color:black"} + +[  \"FalseValue\": false,]{style="color:black"} + +[  \"BinaryValue\": \"T0RhdGE\",]{style="color:black"} + +[  \"IntegerValue\": -128,]{style="color:black"} + +[  \"DoubleValue\": 3.1415926535897931,]{style="color:black"} + +[[  +\"SingleValue]{style="color:black"}]{.string}[\"]{style="color:black"}[[: +\"INF\",]{style="color:black"}]{.string} + +[[  \"DecimalValue\"]{style="color:black"}]{.string}[: +]{style="color:black"}[[34.95,]{style="color:black"}]{.string} + +[  \"StringValue\": ]{style="color:black"}[[\"Say \\\"Hello\\\",\\nthen +go\",]{style="color:black"}]{.string} + +[[  \"DateValue\"]{style="color:black"}]{.string}[: +]{style="color:black"}[[\"2012-12-03\",]{style="color:black"}]{.string} + +[[  \"DateTimeOffsetValue\"]{style="color:black"}]{.string}[: +]{style="color:black"}[[\"2012-12-03T07:16:23Z\",]{style="color:black"}]{.string} + +[[  \"DurationValue\"]{style="color:black"}]{.string}[: +]{style="color:black"}[[\"P12DT23H59M59.999999999999S\",]{style="color:black"}]{.string} + +[[  \"TimeOfDayValue\"]{style="color:black"}]{.string}[: +]{style="color:black"}[[\"07:59:59.999\",]{style="color:black"}]{.string} + +[[  \"GuidValue\"]{style="color:black"}]{.string}[: +]{style="color:black"}[[\"01234567-89ab-cdef-0123-456789abcdef\",]{style="color:black"}]{.string} + +[[  \"Int64Value\"]{style="color:black"}]{.string}[: +]{style="color:black"}[[0,]{style="color:black"}]{.string} + +[  \"ColorEnumValue\": \"Yellow\",]{style="color:black"} + +[[  \"GeographyPoint\": {\"type\": +\"Point\",\"coordinates\":\[142.1,64.1\]} +]{style="color:black"}]{.string} + +[}]{style="color:black"} +::: + +## []{#sec_ComplexValue}[]{#_Toc19867096}[]{#_Toc12019448}[]{#_Toc418513419}[]{#_Toc402353051}[]{#_Toc368563098}[]{#ComplexValue}[]{#_Ref332033656}[]{#_Ref332032621}[]{#_Representing_a_Complex}[]{#_Complex_Value}7.2 [Complex Value](#sec_ComplexValue)[]{#_Toc38457754}[]{#_Toc23836928}[]{#_Toc37319023} + +A complex value is represented as a single JSON object containing one +name/value pair for each property that makes up the complex type. Each +property value is formatted as appropriate for the type of the property. + +It MAY have name/value pairs for [instance +annotations](#sec_InstanceAnnotations) and control information. + +Example 13: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"Address\": { ]{style="color:black"} + +[    \"Street\": \"Obere Str. 57\",]{style="color:black"} + +[    \"City\": \"Berlin\",]{style="color:black"} + +[    \"Region\": null,]{style="color:black"} + +[    \"PostalCode\": \"D-12209\"]{style="color:black"} + +[  }]{style="color:black"} + +[}[]{#_Representing_an_Individual}]{style="color:black"} +::: + +[]{#_Toc368563099}[]{#_Representing_a_Collection}[]{#_Collection_of_Primitive}A +complex value with no selected properties, or no defined properties +(such as an empty open complex type or complex type with no structural +properties) is represented as an empty JSON object. + +## []{#sec_CollectionofPrimitiveValues}[]{#_Toc19867097}[]{#_Toc12019449}[]{#_Toc418513420}[]{#_Toc402353052}[7.3]{#CollectionOfPrimitive} [Collection of Primitive Values](#sec_CollectionofPrimitiveValues)[]{#_Toc38457755}[]{#_Toc23836929}[]{#_Toc37319024} + +A collection of primitive values is represented as a JSON array; each +element in the array is the representation of a [primitive +value](#sec_PrimitiveValue). A JSON literal [null]{.Datatype} represents +a null value within the collection. An empty collection is represented +as an empty array. + +Example 14: partial collection of strings with next link + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"EmailAddresses\": \[ ]{style="color:black"} + +[    \"Julie@Swansworth.com\", ]{style="color:black"} + +[    \"Julie.Swansworth@work.com\" ]{style="color:black"} + +[  \],]{style="color:black"} + +[  \"EmailAddresses@nextLink\": \"\...\"]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_CollectionofComplexValues}[]{#_Toc19867098}[]{#_Toc12019450}[]{#_Toc418513421}[]{#_Toc402353053}[]{#_Toc368563100}[]{#_Collection_of_Complex}7.4 [Collection of Complex Values](#sec_CollectionofComplexValues)[]{#_Toc38457756}[]{#_Toc23836930}[]{#_Toc37319025} + +A collection of complex values is represented as a JSON array; each +element in the array is the representation of a [complex +value](#sec_ComplexValue). A JSON literal [null]{.Datatype} represents a +null value within the collection. An empty collection is represented as +an empty array. + +Example 15: partial collection of complex values with next link + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"PhoneNumbers\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"Number\": \"425-555-1212\",  ]{style="color:black"} + +[      \"Type\": \"Home\"  ]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"@type\": \"#Model.CellPhoneNumber\",]{style="color:black"} + +[      \"Number\": \"425-555-0178\", ]{style="color:black"} + +[      \"Type\": \"Cell\",]{style="color:black"} + +[      \"Carrier\": \"Sprint\"]{style="color:black"} + +[    }  ]{style="color:black"} + +[  \],]{style="color:black"} + +[  \"PhoneNumbers@nextLink\": \"\...\"]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#_Toc418513422}[]{#_Toc402353054}[]{#_Toc368563101}[]{#sec_UntypedValue}[]{#_Toc19867099}[]{#_Toc12019451}[]{#_Navigation_Property}7.5 [Untyped Value](#sec_UntypedValue)[]{#_Toc37319026}[]{#_Toc23836931}[]{#_Toc38457757} + +OData 4.01 adds the built-in abstract types [Edm.Untyped]{.Datatype} and +[Collection(Edm.Untyped)]{.Datatype}that services can use to advertise +in metadata that there is a property of a particular name present, but +there is no type to describe the structure of the property's values. + +The value of an [Edm.Untyped]{.Datatype} property MAY be a primitive +value, a structural value, or a collection. If a collection, it may +contain any combination of primitive values, structural values, and +collections. + +The value of a property of type [Collection(Edm.Untyped)]{.Datatype}MUST +be a collection, and it MAY contain any combination of primitive values, +structural values, and collections. + +Untyped values are the only place where a collection can directly +contain a collection, or a collection can contain a mix of primitive +values, structural values, and collections. + +All children of an untyped property are assumed to be untyped unless +they are annotated with the +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype) +control information, in which case they MUST conform to the type +described by the control information. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_NavigationProperty}[]{#_Toc19867100}[8[     ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019452}[Navigation Property](#sec_NavigationProperty)[]{#_Toc38457758}[]{#_Toc23836932}[]{#_Toc37319027} {#navigation-property style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +A navigation property is a reference from a source entity to zero or +more related entities. + +## []{#sec_NavigationLink}[]{#_Toc19867101}[]{#_Toc12019453}[]{#_Toc418513423}[]{#_Toc402353055}[]{#_Toc368563102}[]{#_Representing_a_Deferred}8.1 [Navigation Link](#sec_NavigationLink)[]{#_Toc38457759}[]{#_Toc23836933}[]{#_Toc37319028} + +The navigation link for a navigation property is represented as a +[[navigationLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnavigationLinkanda) +control information on the navigation property. Its value is an absolute +or [relative URL](#sec_RelativeURLs) that allows retrieving the related +entity or collection of entities. + +The navigation link for a navigation property is only represented if the +client requests [metadata=full]{.Datatype} or the navigation link cannot +be computed, e.g. if it is within a collection of complex type +instances. If it is represented it MUST immediately precede the expanded +navigation property if the latter is represented. + +Example 16: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"Orders@navigationLink\": +\"Customers(\'ALFKI\')/Orders\",]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_AssociationLink}[]{#_Toc19867102}[]{#_Toc12019454}[]{#_Toc418513424}[]{#_Toc402353056}[8.2]{#_Toc368563103} [Association Link](#sec_AssociationLink)[]{#_Toc38457760}[]{#_Toc23836934}[]{#_Toc37319029} + +The association link for a navigation property is represented as an +[[associationLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnavigationLinkanda) +control information on the navigation property. Its value is an absolute +or [relative URL](#sec_RelativeURLs) that can be used to retrieve the +reference or collection of references to the related entity or entities. + +The association link for a navigation property is only represented if +the client requests [metadata=full]{.Datatype} or the association link +cannot be computed by appending [/\$ref]{.Datatype} to the navigation +link. If it is represented, it MUST immediately precede the navigation +link if the latter is represented, otherwise it MUST immediately precede +the expanded navigation property if it is represented. + +Example 17: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"Orders@associationLink\": +\"Customers(\'ALFKI\')/Orders/\$ref\",]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_ExpandedNavigationProperty}[]{#_Toc19867103}[]{#_Toc12019455}[]{#_Toc418513425}[]{#_Toc402353057}[]{#_Toc368563104}[]{#_Expanded_Navigation_Property}8.3 [Expanded Navigation Property](#sec_ExpandedNavigationProperty)[]{#_Toc38457761}[]{#_Toc23836935}[]{#_Toc37319030} + +An expanded navigation property is represented as a name/value pair +where the name is the name of the navigation property, and the value is +the representation of the related entity or collection of entities. + +If at most one entity can be related, the value is the representation of +the related entity, or [null]{.Datatype} if no entity is currently +related. + +If a collection of entities can be related, it is represented as a JSON +array. Each element is the [representation of an entity](#sec_Entity) or +the [representation of an entity reference](#sec_EntityReference). An +empty collection of entities (one that contains no entities) is +represented as an empty JSON array. The navigation property MAY be +include +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex), +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype), +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount),[ +]{.MsoHyperlink}or[ +]{.MsoHyperlink}[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL)[ +]{.MsoHyperlink}control information. If a navigation property is +expanded with the suffix [/\$count]{.Datatype}, only the +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount)[ +]{.MsoHyperlink}control information is represented. + +Example 18: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers/\$entity\",]{style="color:black"} + +[  ]{style="color:black"}[\...]{lang="NL" style="color:black"} + +[  \"Orders@count\": 42,]{lang="NL" style="color:black"} + +[  \"Orders\": \[ \... \],]{lang="NL" style="color:black"} + +[  \"Orders@nextLink\": \"\...\",]{lang="NL" style="color:black"} + +[  ]{lang="NL" style="color:black"}[\...]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_DeepInsert}[]{#_Toc19867104}[]{#_Toc12019456}[]{#_Toc418513426}[]{#_Toc402353058}[8.4]{#_Toc368563105} [Deep Insert](#sec_DeepInsert)[]{#_Toc38457762}[]{#_Toc23836936}[]{#_Toc37319031} + +When inserting a new entity with a [POST]{.Datatype} request, related +new entities MAY be specified using the same representation as for an +[expanded navigation property](#sec_ExpandedNavigationProperty). + +Deep inserts are not allowed in update operations using [PUT]{.Datatype} +or [PATCH]{.Datatype} requests. + +Example 19: inserting a new order for a new customer with order items +related to existing products: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"ID\": 11643,]{style="color:black"} + +[  \"Amount\": 100,]{style="color:black"} + +[  \...,]{style="color:black"} + +[  \"Customer\": {]{style="color:black"} + +[    \"ID\": \"ANEWONE\", ]{style="color:black"} + +[    \...]{style="color:black"} + +[  },]{style="color:black"} + +[  \"Items\": \[ ]{style="color:black"} + +[    {]{style="color:black"} + +[      \"Product\": { \"@id\": \"Products(28)\" },]{style="color:black"} + +[      \"Quantity\": 1,]{style="color:black"} + +[       \...]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"Product\": { \"@id\": \"Products(39)\" },]{style="color:black"} + +[      \"Quantity\": 5,]{style="color:black"} + +[      \...]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_BindOperation}[]{#_Toc19867105}[]{#_Toc12019457}[]{#_Toc418513427}[]{#_Toc402353059}[]{#_Toc368563106}[]{#_Bind_Operation}8.5 [Bind Operation](#sec_BindOperation)[]{#_Toc38457763}[]{#_Toc23836937}[]{#_Toc37319032} + +When inserting or updating an entity, relationships of navigation +properties MAY be inserted or updated via bind operations. + +For requests containing an [OData-Version]{.Keyword} header with a value +of [4.0]{.Datatype}[[, +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}a bind operation +is encoded as a property control information [odata.bind]{.Datatype} on +the navigation property it belongs to and has a single value for +single-valued navigation properties or an array of values for collection +navigation properties. For nullable single-valued navigation properties +the value [null]{.Datatype} may be used to remove the relationship. + +Example 20: assign an existing product to an existing category with a +partial update request against the product + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[PATCH http://host/service/Products(42) HTTP/1.1]{style="color:black"} + +  + +[{ ]{style="color:black"} + +[  \"Category@odata.bind\": \"Categories(6)\"]{style="color:black"} + +[}]{style="color:black"} +::: + +The values are the [ids](#sec_ControlInformationidodataid) of the +related entities. They MAY be absolute or [relative +URLs](#sec_RelativeURLs). + +For requests containing an [OData-Version]{.Keyword} header with a value +of [4.01]{.Datatype}, a relationship is bound to an existing entity +using the same representation as for an [expanded entity +reference](#sec_EntityReference). + +Example 20: assign an existing product to an existing category with a +partial update request against the product + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[PATCH http://host/service/Products(42) HTTP/1.1]{style="color:black"} + +  + +[{ ]{style="color:black"} + +[  \"Category\": {\"@id\": \"Categories(6)\"}]{style="color:black"} + +[}]{style="color:black"} +::: + +  + +Example 21: submit a partial update request to: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}modify +the name of an existing category + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}assign +an existing product with the id 42 to the category + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}assign +an existing product 57 to the category and update its name + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}create +a new product named "Wedges" and assign it to the category + +*[at the end of the request, the updated category contains exactly the +three specified products.]{style="font-size:9.0pt"}* + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[PATCH http://host/service/Categories(6) HTTP/1.1]{style="color:black"} + +  + +[{]{style="color:black"} + +[  \"Name\": \"UpdatedCategory\",]{style="color:black"} + +[  \"Products\": \[ ]{style="color:black"} + +[    {]{style="color:black"} + +[      \"@id\": \"Products(42)\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"@id\": \"Products(57)\",]{style="color:black"} + +[      \"Name\": \"Widgets\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"Name\": \"Wedges\"]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +OData 4.01 services MUST support both the OData 4.0 representation, for +requests containing an [OData-Version]{.Keyword} header with a value of +[4.0]{.Datatype}, and the OData 4.01 representation, for requests +containing an [OData-Version]{.Keyword} header with a value of +[4.01]{.Datatype}[[.]{style="font-family:\"Arial\",sans-serif"}]{.Datatype} +Clients MUST NOT use [\@odata.bind]{.Keyword} in requests with an +[OData-Version]{.Keyword} header with a value of +[4.01]{.Datatype}[[.]{style="font-family:\"Arial\",sans-serif"}]{.Datatype} + +For insert operations collection navigation property bind operations and +deep insert operations can be combined. For OData 4.0 requests, the bind +operations MUST appear before the deep insert operations in the payload. + +For update operations a bind operation on a collection navigation +property adds additional relationships, it does not replace existing +relationships, while bind operations on an entity navigation property +update the relationship. + +## []{#sec_CollectionETag}[]{#_Toc19867106}[8.6]{#_Toc12019458} [Collection ETag](#sec_CollectionETag)[]{#_Toc38457764}[]{#_Toc23836938}[]{#_Toc37319033} + +The ETag for a collection of related entities is represented as +[[etag]{style="font-family: +\"Courier New\""}](#sec_ControlInformationetagodataetag) control +information on the navigation property. Its value is an opaque string +that can be used in a subsequent request to determine if the collection +has changed. + +Services MAY include this control information as appropriate. + +Example 21: ETag for a collection of related entities + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Orders/\$entity\",]{style="color:black"} + +[  \"@id\": \"Orders(1234)\",]{style="color:black"} + +[  \"@etag\": +\"W/\\\"MjAxMy0wNS0yN1QxMTo1OFo=\\\"\",]{style="color:black"} + +[  \"ID\": 1234,]{style="color:black"} + +[  \"Items@etag\": +\"W/\\\"MjAxOS0wMy0xMlQxMDoyMlo=\\\"\"]{style="color:black"} + +[  ...]{style="color:black"} + +[}]{style="color:black"} +::: + +Note: the collection ETag for a navigation property may or may not be +identical to the ETag of the containing entity, the example shows a +different ETag for the [Items]{.Datatype} collection. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_StreamProperty}[]{#_Toc19867107}[]{#_Toc12019459}[]{#_Toc418513428}[]{#_Toc402353060}[]{#_Toc368563107}[]{#_Stream_Property}9[     ]{style="font:7.0pt \"Times New Roman\""}[Stream Property](#sec_StreamProperty)[]{#_Toc38457765}[]{#_Toc23836939}[]{#_Toc37319034} {#stream-property style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +[An entity or complex type instance can have one or more stream +properties. ]{style="color:black;background:white"} + +[The actual stream data is not usually contained in the representation. +Instead stream property data is generally read and edited via URLs. +]{style="color:black;background:white"} + +[Depending on the ]{style="color:black;background:white"}[[metadata +level]{style="background:white"}](#sec_ControllingtheAmountofControlInforma)[, +the stream property MAY be annotated to provide the read link, edit +link, media type, and ETag of the media +stream]{style="color:black;background:white"} through a set of +[[media\*]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia) +control information. + +[If the actual stream data is included inline, the control information +]{style="color:black;background:white"}[[mediaContentType]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia)[ +MUST be present to indicate how the included stream property value is +represented. Stream property values of media type +]{style="color:black;background:white"}[application/json]{.Datatype}[ or +one of its subtypes, optionally with format parameters, are represented +as native JSON. Values of ]{style="color: +black;background:white"}top-level type [text]{.Datatype}, for example +[text/plain]{.Datatype}, are represented as a string, with JSON string +escaping rules applied. [Included stream data of other media types is +represented as a base64url-encoded string value, see +**\[**]{style="color:black;background:white"}**RFC4648[\]]{style="color:black;background:white"}**[, +section 5.]{style="color:black;background:white"} + +If the included stream property has no value, the non-existing stream +data is represented as [null]{.Datatype} and the control information +[[mediaContentType]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia)[[ +is not necessary]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}. + +Example 21: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Products/\$entity\",]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"Thumbnail@mediaReadLink\": +\"http://server/Thumbnail546.jpg\",]{style="color:black"} + +[  \"Thumbnail@mediaEditLink\": +\"http://server/uploads/Thumbnail546.jpg\",]{style="color:black"} + +[  ]{style="color:black"}[\"Thumbnail@mediaContentType\": +\"image/jpeg\",]{lang="DE" style="color:black"} + +[  \"Thumbnail@mediaEtag\": \"W/\\\"####\\\"\",]{lang="DE" +style="color:black"} + +[  ]{lang="DE" style="color:black"}[\"Thumbnail\": \"\...base64url +encoded value\...\",]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_MediaEntity}[]{#_Toc19867108}[]{#_Toc12019460}[]{#_Toc418513429}[]{#_Toc402353061}[]{#_Toc368563108}[]{#_Media_Entity}10[ ]{style="font:7.0pt \"Times New Roman\""}[Media Entity](#sec_MediaEntity)[]{#_Toc38457766}[]{#_Toc23836940}[]{#_Toc37319035} {#media-entity style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +Media entities are entities that describe a media resource, for example +a photo. They are represented as entities that contain additional[ +]{.MsoHyperlink}[[media\*]{style="font-family:\"Courier New\""}](#sec_ControlInformationmediaodatamedia) +control information.[ ]{style="color:black;background:white"} + +[If the actual stream data for the media entity is included, it is +represented as property named +]{style="color:black;background:white"}[\$value]{.Datatype}[ whose +string value is the base64url-encoded value of the media stream, see +**\[**]{style="color:black; +background:white"}**RFC4648[\]]{style="color:black;background:white"}**[, +section 5.]{style="color:black; +background:white"} + +Example 22: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees/\$entity\",]{style="color:black"} + +[  \"@mediaReadLink\": \"Employees(1)/\$value\",]{style="color:black"} + +[  \"@mediaContentType\": \"image/jpeg\",]{style="color:black"} + +[  \"\$value\": \"\...base64url encoded +value\...\",]{style="color:black"} + +[  \"ID\": 1,]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_IndividualPropertyorOperationRespons}[]{#_Toc19867109}[]{#_Toc12019461}[]{#_Toc418513430}[]{#_Toc402353062}[]{#_Toc368563109}[]{#_Individual_Property_or}11[ ]{style="font:7.0pt \"Times New Roman\""}[Individual Property or Operation Response](#sec_IndividualPropertyorOperationRespons)[]{#_Toc38457767}[]{#_Toc23836941}[]{#_Toc37319036} {#individual-property-or-operation-response style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +An individual property or operation response is represented as a JSON +object. + +A single-valued property or operation response that has the +[null]{.Datatype} value does not have a representation; see +[**\[OData-Protocol\]**](#odata). + +A property or operation response that is of a primitive type is +represented as an object with a single name/value pair, whose name is +[value]{.Datatype} and whose value is a [primitive +value](#sec_PrimitiveValue). + +A property or operation response that is of complex type is represented +as a [complex value](#sec_ComplexValue). + +A property or operation response that is of a collection type is +represented as an object with a single name/value pair whose name is +[value]{.Datatype}. Its value is the JSON representation of a +[collection of complex type values](#sec_CollectionofComplexValues) or +[collection of primitive values](#sec_CollectionofPrimitiveValues). + +Example 23:  primitive value + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Edm.String\",]{style="color:black"} + +[  \"value\": \"Pilar Ackerman\"]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 24:  collection of primitive values + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Collection(Edm.String)\",]{style="color:black"} + +[  \"value\": \[\"small\", \"medium\", \"extra +large\"\]]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 25:  empty collection of primitive values + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Collection(Edm.String)\",]{style="color:black"} + +[  \"value\": \[\]]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 26: complex value + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Model.Address\",]{style="color:black"} + +[  \"Street\": \"12345 Grant Street\",]{style="color:black"} + +[  \"City\": \"Taft\",]{style="color:black"} + +[  \"Region\": \"Ohio\",]{style="color:black"} + +[  \"PostalCode\": \"OH 98052\",]{style="color:black"} + +[  \"Country@navigationLink\": +\"Countries(\'US\')\"]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 27: empty collection of complex values + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{\ +  +\"@context\":\"http://host/service/\$metadata#Collection(Model.Address)\",\ +  \"value\": \[\]]{style="color:black"} + +[}]{style="color:black"} +::: + +Note: the context URL is optional in requests. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#_Toc418513431}[]{#_Toc402353063}[]{#_Toc368563110}[]{#CollectionOfEntities}[]{#sec_CollectionofOperationResponses}[]{#_Toc19867110}[]{#_Toc12019462}[]{#_Representing_Multiple_Entities}[]{#_Collection_of_Entities}12[ ]{style="font:7.0pt \"Times New Roman\""}[Collection of Operation Responses](#sec_CollectionofOperationResponses)[]{#_Toc37319037}[]{#_Toc23836942}[]{#_Toc38457768} {#collection-of-operation-responses style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +Invoking a bound action or function with [/\$each]{.Datatype} on each +member of a collection in one request results in a collection of +operation results, which is represented as a JSON object containing a +name/value pair named [value]{.Datatype}. It MAY contain +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex), +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype), +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount), +or [[nextLink]{style="font-family: +\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) control +information. + +If present, the [context]{.Keyword} control information MUST be the +first name/value pair in the response. + +The [count]{.Keyword} name/value pair represents the number of operation +responses in the collection. If present and the +[streaming=true]{.Datatype} media type parameter is set, it MUST come +before the [value]{.Datatype} name/value pair. If the response +represents a partial result, the [count]{.Keyword} name/value pair MUST +appear in the first partial response, and it MAY appear in subsequent +[partial responses (in which case it may vary from response to +response).]{style="color:#333333;background:white"} + +The value of the [value]{.Datatype} name/value pair is an array of +objects, each object representing a single [operation +response](#sec_IndividualPropertyorOperationRespons). Note: if the +operation response is a collection, each single operation response +object itself contains a name/value pair named [value]{.Datatype}. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_CollectionofEntities}[]{#_Toc19867111}[13[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019463}[Collection of Entities](#sec_CollectionofEntities)[]{#_Toc38457769}[]{#_Toc23836943}[]{#_Toc37319038} {#collection-of-entities style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +A collection of entities is represented as a JSON object containing a +name/value pair named [value]{.Keyword}. It MAY contain +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex), +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype), +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount), +[[nextLink]{style="font-family: +\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL), or[[ +]{style="font-family:\"Courier New\""}]{.MsoHyperlink}[[deltaLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationdeltaLinkodatadelt) +control information. + +If present, the [context]{.Keyword} control information MUST be the +first name/value pair in the response. + +The [count]{.Keyword} name/value pair represents the number of entities +in the collection. If present and the [streaming=true]{.Datatype} +content-type parameter is set, it MUST come before the +[value]{.Datatype} name/value pair. If the response represents a partial +result, the [count]{.Keyword} name/value pair MUST appear in the first +partial response, and it MAY appear in subsequent [partial responses (in +which case it may vary from response to +response).]{style="color:#333333;background:white"} + +The value of the [value]{.Keyword} name/value pair is a JSON array +[where each]{#CollectionOfLinks} element is [representation of an +entity](#sec_Entity)[ ]{.MsoHyperlink}or a[ +]{.MsoHyperlink}[]{#CollectionOfEntityRef}[representation of an entity +reference](#sec_EntityReference). An empty collection is represented as +an empty JSON array. + +Functions or actions that are bound to this collection of entities are +advertised in the "wrapper object" in the same way as +[functions](#sec_BoundFunction) or [actions](#sec_BoundAction) are +advertised in the object representing a single entity. + +The +[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) +control information MUST be included in a response that represents a +partial result. + +[]{#_Representing_Changes_(Deltas)_1}Example 28: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": \"\...\",]{style="color:black"} + +[  \"@count\": 37,]{style="color:black"} + +[  \"value\": \[]{style="color:black"} + +[    { \... },]{style="color:black"} + +[    { \... },]{style="color:black"} + +[    { \... }]{style="color:black"} + +[  \],]{style="color:black"} + +[  \"@nextLink\": \"\...?\$skiptoken=342r89\"]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_EntityReference}[]{#_Toc19867112}[]{#_Toc12019464}[]{#_Toc418513432}[]{#_Toc402353064}[]{#_Toc368563111}[]{#ResourceReference}[]{#_Entity_Reference}14[ ]{style="font:7.0pt \"Times New Roman\""}[Entity Reference](#sec_EntityReference)[]{#_Toc38457770}[]{#_Toc23836944}[]{#_Toc37319039} {#entity-reference style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +An entity reference (see [**\[OData-Protocol\]**](#odata)) MAY take the +place of an entity in a JSON payload, based on the client request. It +[]{#_Entity_References_as}is serialized as a JSON object that MUST +contain the [[id]{style="font-family: +\"Courier New\""}](#sec_ControlInformationidodataid) of the referenced +entity and MAY contain the +[[type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype) +control information and [instance +annotations](#sec_InstanceAnnotations), but no additional properties or +control information. + +A collection of entity references is represented as a [collection of +entities](#sec_CollectionofEntities), with entity reference +representations instead of entity representations as items in the array +value of the [value]{.Datatype} name/value pair. + +The outermost JSON object in a response MUST contain a +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +control information and MAY contain +[[count]{style="font-family:\"Courier New\""}](#sec_ControlInformationcountodatacount), +[[nextLink]{style="font-family: +\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL), or[ +]{.MsoHyperlink}[[deltaLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationdeltaLinkodatadelt) +control information. + +Example 29: entity reference to order 10643 + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#\$ref\",]{style="color:black"} + +[  \"@id\": \"Orders(10643)\"]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 30: collection of entity references + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{ ]{style="color:black"} + +[  \"@context\": \"http://host/service/\$metadata#Collection(\$ref)\", +]{style="color:black"} + +[  \"value\": \[]{style="color:black"} + +[    { \"@id\": \"Orders(10643)\" },]{style="color:black"} + +[    { \"@id\": \"Orders(10759)\" }]{style="color:black"} + +[  \] ]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_DeltaPayload}[]{#_Toc19867113}[]{#_Toc12019465}[]{#_Toc418513433}[]{#_Toc402353065}[]{#_Toc368563112}[]{#DeltaResponse}[]{#_Delta_Response}15[ ]{style="font:7.0pt \"Times New Roman\""}[Delta Payload](#sec_DeltaPayload)[]{#_Toc38457771}[]{#_Toc23836945}[]{#_Toc37319040} {#delta-payload style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +The non-format specific aspects of the delta handling are described in +the section "Requesting Changes" in [**\[OData-Protocol\]**](#odata). + +## []{#sec_DeltaResponses}[]{#_Toc19867114}[15.1]{#_Toc12019466} [Delta Responses](#sec_DeltaResponses)[]{#_Toc38457772}[]{#_Toc23836946}[]{#_Toc37319041} + +Responses from a delta request are returned as a JSON object. + +The JSON object for a delta response to a single entity is either an +[added](#sec_AddedChangedEntity), [changed](#sec_AddedChangedEntity), or +[deleted entity](#sec_DeletedEntity)[.]{.MsoHyperlink} + +The JSON object for a delta response to a collection of entities MUST +contain an array-valued property named [value]{.Datatype} containing all +[added](#sec_AddedChangedEntity), [changed](#sec_AddedChangedEntity), or +[deleted entities](#sec_DeletedEntity), as well as [added +links](#sec_AddedLink) or [deleted links](#sec_DeletedLink) between +entities, and MAY contain additional, unchanged entities. + +If the delta response contains a partial list of changes, it MUST +include a [next link](#sec_ControlInformationnextLinkodatanextL) for the +client to retrieve the next set of changes. + +The last page of a delta response SHOULD contain a [delta +link](#sec_ControlInformationdeltaLinkodatadelt) in place of the [next +link](#sec_ControlInformationnextLinkodatanextL) for retrieving +subsequent changes once the current set of changes has been applied to +the initial set. + +If an OData 4.01 delta response includes an expanded collection-valued +navigation property inline (see [next +section](#sec_AddedChangedEntity)), the expanded collection can be a +partial list, in which case the expanded navigation property MUST have +the +[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) +control information applied to it. Following this chain of next links +does not result in a delta link on the last page of the expanded +collection. + +If the response from the delta link contains a [count]{.Datatype}[ +]{.MsoHyperlink}control information, the returned number MUST include +all added, changed, or deleted entities to be returned, as well as added +or deleted links. + +Example 31: a 4.01 delta response with five changes, in order of +occurrence + +*[1.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[ContactName]{style="font-size:9.0pt;font-family:\"Courier New\""}[ +for customer \'BOTTM\' was changed to \"Susan +Halvenstern\"]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[2.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Order +10643 was removed from customer +\'ALFKI\']{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[3.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Order +10645 was added to customer +\'BOTTM\']{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[4.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[The +shipping information for order 10643 was +updated]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[5.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Customer +\'ANTON\' was +deleted]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[[{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  +\"@context\":\"http://host/service/\$metadata#Customers/\$delta\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"@count\":5,]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"value\":]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \[]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"@id\":\"Customers(\'BOTTM\')\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +]{style="font-size:10.0pt;color:black"}]{.CODEtemp}[[\"ContactName\":\"Susan +Halvenstern\"]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    },]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \"@context\":\"#Customers/\$deletedLink\",]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      ]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp}[[\"source\":\"Customers(\'ALFKI\')\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"relationship\":\"Orders\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"target\":\"Orders(10643)\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    +  \"@context\":\"#Customers/\$link\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"source\":\"Customers(\'BOTTM\')\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"relationship\":\"Orders\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"target\":\"Orders(10645)\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"@context\":\"#Orders/\$entity\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[   +   \"@id\":\"Orders(10643)\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"ShippingAddress\":{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[        \"Street\":\"23 Tsawassen +Blvd.\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[        +\"City\":\"Tsawassen\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[        +]{style="font-size:10.0pt;color:black"}]{.CODEtemp}[[\"Region\":\"BC\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[        \"PostalCode\":\"T2F +8M4\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +]{style="font-size:10.0pt;color:black"}]{.CODEtemp}[[},]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    +  \"@context\":\"#Customers/\$deletedEntity\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \"@removed\": +{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +  \"reason\":\"deleted\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"@id\":\"Customers(\'ANTON\')\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    }]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \],]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"@deltaLink\": +\"Customers?\$expand=Orders&\$deltatoken=8015\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[}]{style="font-size:10.0pt;color:black"}]{.CODEtemp} +::: + +## []{#sec_AddedChangedEntity}[]{#_Toc19867115}[]{#_Toc12019467}[]{#_Toc418513434}[]{#_Toc402353066}[]{#_Toc368563113}[]{#_Representing_Added/Changed_Entities_1}[]{#_Added/Changed_Entity}15.2 [Added/Changed Entity](#sec_AddedChangedEntity)[]{#_Toc38457773}[]{#_Toc23836947}[]{#_Toc37319042} + +Added or changed entities within a delta response are represented as +[entities](#sec_Entity)[.]{.MsoHyperlink} + +Added entities MUST include all available selected properties and MAY +include additional, unselected properties. Collection-valued properties +are treated as atomic values; any collection-valued properties returned +from a delta request MUST contain all current values for that +collection. + +Changed entities MUST include all available selected properties that +have changed, and MAY include additional properties. + +If a property of an entity is dependent upon the property of another +entity within the expanded set of entities being tracked, then both the +change to the dependent property as well as the change to the principle +property or [added](#sec_AddedLink)/[deleted link](#sec_DeletedLink) +corresponding to the change to the dependent property are returned in +the delta response. + +Entities that are not part of the entity set specified by the context +URL MUST include the +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +control information to specify the entity set of the entity, regardless +of the specified +[[metadata]{style="font-family:\"Courier New\""}](#sec_ControllingtheAmountofControlInforma)[ +]{.MsoHyperlink}value. + +Entities include control information for selected navigation links based +on +[[metadata]{style="font-family:\"Courier New\""}](#sec_ControllingtheAmountofControlInforma)[. +]{.MsoHyperlink} + +OData 4.0 payloads MUST NOT include expanded navigation properties +inline; all changes MUST be represented as a flat array of added, +deleted, or changed entities, along with added or deleted links. + +OData 4.01 delta payloads MAY include expanded navigation properties +inline. Related single entities are represented as either an +[added/changed](#sec_AddedChangedEntity) entity, an [entity +reference](#sec_EntityReference), a [deleted +entity](#sec_DeletedEntity), or a null value (if no entity is related as +the outcome of the change). Collection-valued navigation properties are +represented either as a delta representation or as a full representation +of the collection. + +If the expanded navigation property represents a delta, it MUST be +represented as an array-valued control information +[[delta]{style="font-family:\"Courier New\""}](#sec_ControlInformationdeltaodatadelta) +on the navigation property.  [Added/changed](#sec_AddedChangedEntity) +entities or [entity references](#sec_EntityReference)[ +]{.MsoHyperlink}are added to the collection. [Deleted +entities](#sec_DeletedEntity) MAY be specified in a nested delta +representation to represent entities no longer part of the collection. +If the deleted entity specifies a [reason]{.Datatype} as +[deleted]{.Datatype}, then the entity is both removed from the +collection and deleted, otherwise it is removed from the collection and +only deleted if the navigation property is a containment navigation +property. The array MUST NOT contain [added](#sec_AddedLink) or [deleted +links](#sec_DeletedLink). + +Example 32: 4.01 delta response customers with expanded orders +represented inline as a delta + +*[1.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Customer +\'BOTTM\':]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[a.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[ContactName]{style="font-size:9.0pt;font-family:\"Courier New\""}[ +was changed to \"Susan +Halvenstern\"]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[b.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Order +10645 was +added]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[2.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Customer +\'ALFKI\': ]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[a.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Order +10643 was +removed]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[3.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Customer +\'ANTON\' was +deleted]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[[{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  +\"@context\":\"http://host/service/\$metadata#Customers/\$delta\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"@count\":3,]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"value\":]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \[]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"@id\":\"Customers(\'BOTTM\')\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +]{style="font-size:10.0pt;color:black"}]{.CODEtemp}[[\"ContactName\":\"Susan +Halvenstern\",]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \"Orders@delta\":\[]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[        {]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[          \"@id\":\"Orders(10645)\"]{lang="NL" style="color:black"} + +[[        }]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \]]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    },]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \"@id\":\"Customers(\'ALFKI\')\",]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \"Orders@delta\":\[]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[        {]{lang="NL" style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[          \"@context\":\"#Orders/\$deletedEntity\",]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[          ]{lang="NL" +style="font-size:10.0pt;color:black"}]{.CODEtemp}[[\"@removed\": +{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[             \"reason\": +\"changed\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[          },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[          \"@id\":\"Orders(10643)\"]{style="color:black"} + +[[        }             +]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \]]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    {]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    +  \"@context\":\"#Customers/\$deletedEntity\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      \"@removed\": +{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[         \"reason\": +\"deleted\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[      +\"@id\":\"Customers(\'ANTON\')\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    }]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \],]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"@deltaLink\": +\"Customers?\$expand=Orders&\$deltatoken=8015\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[}]{style="font-size:10.0pt;color:black"}]{.CODEtemp} +::: + +If the expanded navigation property is a full representation of the +collection, it MUST be represented as an expanded navigation property, +and its array value represents the full set of entities related +according to that relationship and satisfying any specified expand +options. Members of the array MUST be represented as +[added/changed](#sec_AddedChangedEntity) entities or [entity +references](#sec_EntityReference) and MUST NOT include added links, +deleted links, or deleted entities. Any entity not represented in the +collection has either been removed, deleted, or changed such that it no +longer satisfies the expand options in the defining query. In any case, +clients SHOULD NOT receive additional notifications for such removed +entities. + +[]{#sec_DeletedEntity}[]{#_Toc19867116}[]{#_Toc12019468}[]{#_Toc418513435}[]{#_Toc402353067}[]{#_Toc368563114}[]{#_Representing_Deleted_Entities_1}[]{#_Deleted_Entity}Example +33: 4.01 delta response for a single entity with an expanded navigation +property containing only a partial list of related entities (as +indicated with a [next link](#sec_ControlInformationnextLinkodatanextL)) + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[[{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  +\"@context\":\"http://host/service/\$metadata#Customers/\$entity/\$delta\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  ...]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"Orders@count\": +42,]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"Orders\": \[ ... +\],]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"Orders@nextLink\": +\"...\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  ...]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"@deltaLink\": +\"Customers(\'ALFKI\')?\$expand=Orders&\$deltatoken=9711\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[}]{style="font-size:10.0pt;color:black"}]{.CODEtemp} +::: + +## 15.3 [Deleted Entity](#sec_DeletedEntity)[]{#_Toc23836948}[]{#_Toc37319043}[]{#_Toc38457774} + +Deleted entities in JSON are returned as deleted-entity objects. Delta +responses MUST contain a deleted-entity object for each deleted entity, +including deleted expanded entities that are not related through a +containment navigation property. The service MAY additionally include +expanded entities related through a containment navigation property in +which case it MUST include those in any returned count of enumerated +changes. + +The representation of deleted-entity objects differs between OData 4.0 +and OData 4.01. + +In OData 4.0 payloads the deleted-entity object MUST include the +following properties, regardless of the specified +[[metadata]{style="font-family:\"Courier New\""}](#sec_ControllingtheAmountofControlInforma)[ +]{.MsoHyperlink}value: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}Control +information +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +-- the context URL fragment MUST be +[#{entity-set}/\$deletedEntity]{.Datatype}, where +[{entity-set}]{.Datatype} is the entity set of the deleted entity + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[id]{.Datatype} +-- The [id](#sec_ControlInformationidodataid) of the deleted entity +(same as the +[[id]{style="color:windowtext"}](#sec_ControlInformationidodataid) +returned or computed when calling GET on resource), which may be +absolute or [relative](#sec_RelativeURLs) + +In OData 4.0 payloads the deleted-entity object MAY include the +following optional property, regardless of the specified +[[metadata]{style="font-family:\"Courier New\""}](#sec_ControllingtheAmountofControlInforma)[ +]{.MsoHyperlink}value, and MAY include +[annotations](#sec_InstanceAnnotations): + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[reason]{.Datatype} +-- either [deleted]{.Datatype}, if the entity was deleted (destroyed), +or [changed]{.Datatype} if the entity was removed from membership in the +result (i.e., due to a data change). + +[]{#_Toc418513436}[]{#_Toc402353068}[]{#_Toc368563115}[]{#_Added_Link}Example +34: deleted entity in OData 4.0 response -- note that [id]{.Datatype} is +a property, not control information + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[[{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  +\"@context\":\"#Customers/\$deletedEntity\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  +\"reason\":\"deleted\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"id\":\"Customers(\'ANTON\')\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[}]{style="font-size:10.0pt;color:black"}]{.CODEtemp} +::: + +In OData 4.01 payloads the deleted-entity object MUST include the +following properties, regardless of the specified +[[metadata]{style="font-family:\"Courier New\""}](#sec_ControllingtheAmountofControlInforma)[ +]{.MsoHyperlink}value: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}Control +information +[[removed]{style="font-family:\"Courier New\""}](#sec_ControlInformationremovedodataremove), +whose value is an object that MAY contain a property named +[reason]{.Datatype}. If present, the value of [reason]{.Datatype} MUST +be either [deleted]{.Datatype} if the entity was deleted (destroyed), or +[changed]{.Datatype} if the entity was removed from membership in the +result either due to change in value such that the entity no longer +matches the defining query or because the entity was removed from the +collection. The object MAY include +[annotations](#sec_InstanceAnnotations), and clients SHOULD NOT error +due to the presence of additional properties that MAY be defined by +future versions of this specification. For [ordered +payloads](#sec_PayloadOrderingConstraints), the control information +[[removed]{style="font-family:\"Courier New\""}](#sec_ControlInformationremovedodataremove)[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}MUST immediately +follow the [[context]{style="font-family: +\"Courier New\""}](#sec_ControlInformationcontextodatacontex) control +information, if present, otherwise it MUST be the first property in the +deleted entity. + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}Control +information +[[id]{style="font-family:\"Courier New\""}](#sec_ControlInformationidodataid) +or all of the entity's key fields. The [id]{.Datatype}[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}control +information MUST appear if any of the entity\'s key fields are omitted +from the response *or* the entity-id is not identical to the canonical +URL of the entity. For [ordered +payloads](#sec_PayloadOrderingConstraints), the control information +[id,]{.Datatype} if present, MUST immediately follow the control +information +[[removed]{style="font-family:\"Courier New\""}](#sec_ControlInformationremovedodataremove). + +For full metadata the +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +control information MUST be included. It also MUST be included if the +entity set of the deleted entity cannot be determined from the +surrounding context. + +The deleted-entity object MAY include additional properties of the +entity, as well as [annotations](#sec_InstanceAnnotations), and MAY +include related entities, related deleted entities, or a delta or full +representation of a related collection of entities, to represent related +entities that have been modified or deleted. + +Example 35: deleted entity in OData 4.01 response with [id]{.Datatype} +control information (prefixed with an +[@]{.Datatype}[[)]{style="font-family:\"Arial\",sans-serif"}]{.Datatype} + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[[{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  +\"@context\":\"#Customers/\$deletedEntity\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"@removed\":{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    +\"reason\":\"deleted\",]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[    \"@myannoation.deletedBy\":\"Mario\" +]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  },]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  +\"@id\":\"Customers(\'ANTON\')\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[}]{style="font-size:10.0pt;color:black"}]{.CODEtemp} +::: + +Example 36: entity removed OData 4.01 response without [id]{.Datatype} +control information and instead all key fields ([ID]{.Datatype} is the +single key field of [Customer]{.Datatype}) + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[[{]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"@removed\":{},]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[  \"ID\":\"ANTON\"]{style="font-size:10.0pt;color:black"}]{.CODEtemp} + +[[}]{style="font-size:10.0pt;color:black"}]{.CODEtemp} +::: + +## []{#sec_AddedLink}[]{#_Toc19867117}[]{#_Toc12019469}[]{#_Added_Link_1}15.4 [Added Link](#sec_AddedLink)[]{#_Toc38457775}[]{#_Toc23836949}[]{#_Toc37319044} + +Links within a delta response are represented as link objects.[ +]{style="font-size:11.0pt;font-family:\"Calibri\",sans-serif"} + +Delta responses MUST contain a link object for each added link that +corresponds to a [\$expand]{style="font-family:\"Courier New\""} path in +the initial request. + +``` {style="page-break-after:avoid"} +The link object MUST include the following properties, regardless of the specified metadata value, and MAY include annotations: +``` + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +-- the context URL fragment MUST be [#{entity-set}/\$link]{.Datatype}, +where [{entity-set}]{.Datatype} is the entity set containing the source +entity + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[source]{.Datatype} +-- The [id](#sec_ControlInformationidodataid) of the entity from which +the relationship is defined, which may be absolute or +[relative](#sec_RelativeURLs) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[relationship]{.Datatype} +-- The path from the source object to the navigation property which MAY +traverse one or more complex properties, type cast segments, or members +of ordered collections + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[target]{.Datatype} +-- The [id](#sec_ControlInformationidodataid) of the related entity, +which may be absolute or [relative](#sec_RelativeURLs) + +## []{#sec_DeletedLink}[]{#_Toc19867118}[]{#_Toc12019470}[]{#_Toc418513437}[]{#_Toc402353069}[]{#_Toc368563116}[]{#_Representing_Deleted_Links_1}[]{#_Deleted_Link}15.5 [Deleted Link](#sec_DeletedLink)[]{#_Toc38457776}[]{#_Toc23836950}[]{#_Toc37319045} + +Deleted links within a delta response are represented as deleted-link +objects. + +Delta responses MUST contain a deleted-link object for each deleted link +that corresponds to a [\$expand]{style="font-family:\"Courier New\""} +path in the initial request, unless either of the following is true: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +[source]{style="font-family:\"Courier New\""} or +[target]{style="font-family:\"Courier New\""} entity has been deleted + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}The +maximum cardinality of the related entity is one and there is a +subsequent [link object](#sec_AddedLink) that specifies the same +[source]{style="font-family:\"Courier New\""} and +[relationship]{style="font-family: +\"Courier New\""}. + +``` {style="margin-top:4.0pt;margin-right:0in;margin-bottom:4.0pt;margin-left: +0in"} +The deleted-link object MUST include the following properties, regardless of the specified metadata value, and MAY include annotations: +``` + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +-- the context URL fragment MUST be +[#{entity-set}/\$deletedLink]{.Datatype}, where +[{entity-set}]{.Datatype} is the entity set containing the source entity + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[source]{.Datatype} +-- The [id](#sec_ControlInformationidodataid) of the entity from which +the relationship is defined, which may be absolute or +[relative](#sec_RelativeURLs) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[relationship]{.Datatype} +-- The path from the source object to the navigation property which MAY +traverse one or more complex properties, type cast segments, or members +of ordered collections + +[[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;color:windowtext"}]{.MsoHyperlink}[target]{.Datatype} +-- The [id](#sec_ControlInformationidodataid) of the related entity for +multi-valued navigation properties, which may be absolute or +[relative](#sec_RelativeURLs)[. ]{.MsoHyperlink}[[For delta payloads +that do not specify an +]{style="color:windowtext"}]{.MsoHyperlink}[OData-Version]{.Keyword}[[ +header value of +]{style="color:windowtext"}]{.MsoHyperlink}[[4.0]{style="font-family:\"Courier New\";color:windowtext"}]{.MsoHyperlink}[[, +the target MAY be omitted for single-valued navigation +properties]{style="color:windowtext"}]{.MsoHyperlink}[.]{.MsoHyperlink} + +## []{#sec_UpdateaCollectionofEntities}[]{#_Toc19867119}[[[15.6 ]{style="color:windowtext"}]{.MsoHyperlink}]{#_Toc12019471}[Update a Collection of Entities](#sec_UpdateaCollectionofEntities)[]{#_Toc38457777}[]{#_Toc23836951}[]{#_Toc37319046} + +The body of a PATCH request to a URL identifying a collection of +entities is a JSON object. It MUST contain the +[[context]{style="font-family:\"Courier New\""}](#sec_ControlInformationcontextodatacontex) +control information with a string value of [#\$delta]{.Datatype}, and it +MUST contain an array-valued property named [value]{.Datatype} +containing all [added](#sec_AddedLink), +[changed](#sec_AddedChangedEntity), or [deleted](#sec_DeletedEntity) +entities, as well as [added](#sec_AddedLink) or +[deleted](#sec_DeletedLink) links between entities. + +[]{#_Toc418513438}[]{#_Toc402353070}[]{#_Toc368563117}[]{#_Ref332033292}[]{#_Ref332033268}[]{#_Ref332031391}[]{#_Bound_Function}Example +37: 4.01 delta response customers with expanded orders represented +inline as a delta + +*[1.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Add +customer +\'EASTC\':]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[2.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Change +]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[ContactName]{style="font-size:9.0pt;font-family:\"Courier New\""}[ +of customer +\'AROUT\']{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[3.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Delete +customer +\'ANTON\']{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[4.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Change +customer \'ALFKI\': +]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[a.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Create +order 11011]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[b.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Add +link to existing order +10692]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[c.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Change +]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}*[*[ShippedDate]{style="font-size:9.0pt"}*]{.Datatype}*[ +]{style="font-size:8.0pt;font-family:\"Arial\",sans-serif"}[of related +order 10835]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[d.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Delete +link to order +10643]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[5.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Add +link between customer \'ANATR\' and order +10643]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +*[6.[     +]{style="font:7.0pt \"Times New Roman\""}]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}[Delete +link between customer \'DUMON\' and order +10311]{style="font-size:9.0pt;font-family:\"Arial\",sans-serif"}* + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\":\"#\$delta\",]{style="color:black"} + +[  \"value\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"CustomerID\": \"EASTC\",]{style="color:black"} + +[      \"CompanyName\": \"Eastern Connection\",]{style="color:black"} + +[      \"ContactName\": \"Ann Devon\",]{style="color:black"} + +[      \"ContactTitle\": \"Sales Agent\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"CustomerID\": \"AROUT\",]{style="color:black"} + +[      \"ContactName\": \"Thomas Hardy\",]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"@removed\": {},]{style="color:black"} + +[      \"CustomerID\":\"ANTON\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"CustomerID\": \"ALFKI\",]{style="color:black"} + +[      \"Orders@delta\": \[]{style="color:black"} + +[        {]{style="color:black"} + +[          \"OrderID\": 11011,]{style="color:black"} + +[          \"CustomerID\": \"ALFKI\",]{style="color:black"} + +[          \"EmployeeID\": 3,]{style="color:black"} + +[          \"OrderDate\": +\"1998-04-09T00:00:00Z\",]{style="color:black"} + +[          \"RequiredDate\": +\"1998-05-07T00:00:00Z\",]{style="color:black"} + +[          \"ShippedDate\": +\"1998-04-13T00:00:00Z\"]{style="color:black"} + +[        },]{style="color:black"} + +[        {]{style="color:black"} + +[          \"@id\":\"Orders(10692)\"]{style="color:black"} + +[        },]{style="color:black"} + +[        {]{style="color:black"} + +[          \"@id\":\"Orders(10835)\"]{style="color:black"} + +[          ShippedDate: \"1998-01-23T00:00:00Z\",]{style="color:black"} + +[        },]{style="color:black"} + +[        {]{style="color:black"} + +[          \"@removed\": {]{style="color:black"} + +[             \"reason\": \"changed\"]{style="color:black"} + +[          },]{style="color:black"} + +[          \"OrderID\": 10643]{style="color:black"} + +[        }]{style="color:black"} + +[      \]]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"@context\":\"#Customers/\$link\",]{style="color:black"} + +[      \"source\":\"Customers(\'ANATR\')\",]{style="color:black"} + +[      \"relationship\":\"Orders\",]{style="color:black"} + +[      \"target\":\"Orders(10643)\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"@context\":\"#Customers/\$deletedLink\",]{style="color:black"} + +[      \"source\":\"Customers(\'DUMON\')\",]{style="color:black"} + +[      \"relationship\":\"Orders\",]{style="color:black"} + +[      \"target\":\"Orders(10311)\"]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_BoundFunction}[]{#_Toc19867120}[16[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019472}[Bound Function](#sec_BoundFunction)[]{#_Toc38457778}[]{#_Toc23836952}[]{#_Toc37319047} {#bound-function style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +A bound function is advertised via a name/value pair where the name is a +hash ([\#]{.Datatype}) character followed by the namespace- or +alias-qualified name of the function. The namespace or alias MUST be +defined or the namespace referenced in the metadata document of the +service, see [**\[OData-CSDLJSON\]**](#ODataCSDLJSON) or +[**\[OData-CSDLXML\]**[.]{style="color:windowtext"}](#ODataCSDLXML) A +specific function overload can be advertised by appending the +parentheses-enclosed, comma-separated list of non-binding parameter +names to the qualified function name, see rule +[qualifiedFunctionName]{.Datatype} in [**\[OData-ABNF\]**](#abnf). + +A function that is bound to a single structured type MAY be advertised +within the JSON object representing that structured type. + +Functions that are bound to a collection MAY be advertised within the +JSON object containing the collection. If the collection is the +top-level response, the function advertisement name/value pair is placed +next to the [value]{.Keyword} name/value pair representing the +collection. If the collection is nested within an instance of a +structured type, then in 4.01 payloads the name of the function +advertisement is prepended with the name of the collection-valued +property and is placed next to the collection-valued property, [expanded +navigation property](#sec_ExpandedNavigationProperty), or +[[navigationLink]{style="font-family:\"Courier New\""}](#sec_NavigationLink) +control information, if present. 4.0 payloads MUST NOT advertise +functions prefixed with property names. + +If the function is available, the value of the advertisement is an +object. OData 4.01 services MAY advertise the non-availability of the +function with the value [null]{.Keyword}. + +If +[[metadata=full]{style="font-family:\"Courier New\""}](#sec_metadatafullodatametadatafull) +is requested, each value object MUST have at least the two name/value +pairs [title]{.Keyword} and [target]{.Keyword}. It MAY contain +[annotations](#sec_InstanceAnnotations). The order of the name/value +pairs MUST be considered insignificant. + +The [target]{.Keyword} name/value pair contains a URL. Clients MUST be +able to invoke the function or the specific function overload by passing +the parameter values via query options for [parameter +aliases](https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_ParameterAliases)[[ +]{style="color:#0000EE"}]{.apple-converted-space}[that are identical to +the parameter name preceded by an at +(]{style="color:black"}[[@]{style="font-family:\"Courier New\"; +color:black"}]{.datatype0}[) sign. Clients MUST check if the obtained +URL already contains a query part and appropriately precede the +parameters either with an ampersand +(]{style="color:black"}[[&]{style="font-family:\"Courier New\";color:black"}]{.datatype0}[) +or a question mark +(]{style="color:black"}[[?]{style="font-family:\"Courier New\";color:black"}]{.datatype0}[)]{style="color:black"}. + +The [title]{.Keyword} name/value pair contains the function or action +title as a string. + +If +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +is requested, the [target]{.Datatype} name/value pair MUST be included +if its value differs from the canonical function or action URL. + +Example 38: minimal representation of a function where all overloads are +applicable + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees/\$entity\",]{style="color:black"} + +[  \"#Model.RemainingVacation\": {},]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 39: full representation of a specific overload with parameter +alias for the [[Year]{style="font-size:10.0pt"}]{.Keyword} parameter + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees/\$entity\",]{style="color:black"} + +[  \"#Model.RemainingVacation(Year)\": {]{style="color:black"} + +[    \"title\": \"Remaining vacation from year.\",]{style="color:black"} + +[    \"target\": +\"Employees(2)/RemainingVacation(Year=@Year)\"]{style="color:black"} + +[  },]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 40: full representation in a collection + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees\",]{style="color:black"} + +[  \"#Model.RemainingVacation\": {]{style="color:black"} + +[    \"title\": \"Remaining Vacation\",]{style="color:black"} + +[    \"target\": +\"Managers(22)/Employees/RemainingVacation\"]{style="color:black"} + +[  },]{style="color:black"} + +[  \"value\": \[ \... \]]{style="color:black"} + +[}]{style="color:black"} +::: + +[]{#_Toc418513439}[]{#_Toc402353071}[]{#_Toc368563118}[]{#_Bound_Action}Example +41: full representation in a nested collection + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees/\$entity\",]{style="color:black"} + +[  \"@type\": \"Model.Manager\",]{style="color:black"} + +[  \"ID\":22,]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"Employees#RemainingVacation\": {]{style="color:black"} + +[    \"title\": \"RemainingVacation\",]{style="color:black"} + +[    \"target\": +\"Managers(22)/Employees/RemainingVacation\"]{style="color:black"} + +[  }]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_BoundAction}[]{#_Toc19867121}[17[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019473}[Bound Action](#sec_BoundAction)[]{#_Toc38457779}[]{#_Toc23836953}[]{#_Toc37319048} {#bound-action style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +A bound action is advertised via a name/value pair where the name is a +hash ([\#]{.Datatype}) character followed by the namespace- or +alias-qualified name of the action. The namespace or alias MUST be +defined or the namespace referenced in the metadata document of the +service, see [**\[OData-CSDLJSON\]**](#ODataCSDLJSON) or +[**\[OData-CSDLXML\]**[.]{style="color:windowtext"}](#ODataCSDLXML) + +An action that is bound to a single structured type is advertised within +the JSON object representing that structured type. + +Actions that are bound to a collection MAY be advertised within the JSON +object containing the collection. If the collection is the top-level +response, the action advertisement name/value pair is placed next to the +[value]{.Keyword} name/value pair representing the collection. If the +collection is nested within an instance of a structured type, then in +4.01 payloads the name of the action advertisement is prepended with the +name of the collection-valued property and is placed next to the +name/value pair representing the collection-valued property, [expanded +navigation property](#sec_ExpandedNavigationProperty), or +[[navigationLink]{style="font-family:\"Courier New\""}](#sec_NavigationLink) +control information, if present. 4.0 payloads MUST NOT advertise actions +prefixed with property names. + +If the action is available, the value of the advertisement is an object. +OData 4.01 services MAY advertise the non-availability of the action +with the value [null]{.Keyword}. + +If +[[metadata=full]{style="font-family:\"Courier New\""}](#sec_metadatafullodatametadatafull) +is requested, each value object MUST have at least the two name/value +pairs [title]{.Keyword} and [target]{.Keyword}. It MAY contain +[annotations](#sec_InstanceAnnotations). The order of these name/value +pairs MUST be considered insignificant. + +The [target]{.Keyword} name/value pair contains a bound function or +action URL. + +The [title]{.Keyword} name/value pair contains the function or action +title as a string. + +If +[[metadata=minimal]{style="font-family:\"Courier New\""}](#sec_metadataminimalodatametadataminimal) +is requested, the [target]{.Datatype} name/value pair MUST be included +if its value differs from the canonical function or action URL. + +Example 42: minimal representation in an entity + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#LeaveRequests/\$entity\",]{style="color:black"} + +[  \"#Model.Approve\": {},]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 43: full representation in an entity: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#LeaveRequests/\$entity\",]{style="color:black"} + +[  \"#Model.Approve\": {]{style="color:black"} + +[    \"title\": \"Approve Leave Request\",]{style="color:black"} + +[    \"target\": \"LeaveRequests(2)/Approve\"]{style="color:black"} + +[  },]{style="color:black"} + +[  \...]{style="color:black"} + +[}]{style="color:black"} +::: + +Example 44: full representation in a collection + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#LeaveRequests\",]{style="color:black"} + +[  \"#Model.Approve\": {]{style="color:black"} + +[    \"title\": \"Approve All Leave Requests\",]{style="color:black"} + +[    \"target\": +\"Employees(22)/Model.Manager/LeaveRequests/Approve\"]{style="color:black"} + +[  },]{style="color:black"} + +[  \"value\": \[ \... \]]{style="color:black"} + +[}]{style="color:black"} +::: + +[]{#_Toc418513440}[]{#_Toc402353072}[Example]{#_Toc368563119} 45: full +representation in a nested collection + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Employees/\$entity\",]{style="color:black"} + +[  \"@type\": \"Model.Manager\",]{style="color:black"} + +[  \"ID\":22,]{style="color:black"} + +[  \...]{style="color:black"} + +[  \"LeaveRequests#Model.Approve\": {]{style="color:black"} + +[    \"title\": \"Approve All Leave Requests\",]{style="color:black"} + +[    \"target\": +\"Employees(22)/Model.Manager/LeaveRequests/Approve\"]{style="color:black"} + +[  }]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_ActionInvocation}[]{#_Toc19867122}[18[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019474}[Action Invocation](#sec_ActionInvocation)[]{#_Toc38457780}[]{#_Toc23836954}[]{#_Toc37319049} {#action-invocation style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +Action parameter values are encoded in a single JSON object in the +request body. + +Each non-binding parameter value is encoded as a separate name/value +pair in this JSON object. The name is the name of the parameter. The +value is the parameter value in the JSON representation appropriate for +its type. Entity typed parameter values MAY include a subset of the +properties, or just the [entity reference](#sec_EntityReference), as +appropriate to the action. + +Non-binding parameters that are nullable or annotated with the term +[[Core.OptionalParameter]{style="font-family:\"Courier New\""}](https://github.com/oasis-tcs/odata-vocabularies/blob/master/vocabularies/Org.OData.Core.V1.md#OptionalParameter)[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}defined in +[**\[OData-VocCore\]**](#VocCore) MAY be omitted from the request body. +If an omitted parameter is not annotated (and thus nullable), it MUST be +interpreted as having the [null]{.Datatype} value. If it is annotated +and the annotation specifies a [DefaultValue]{.Datatype}, the omitted +parameter is interpreted as having that default value. If omitted and +the annotation does not specify a default value, the service is free on +how to interpret the omitted parameter. Note: a nullable non-binding +parameter is equivalent to being annotated as optional with a default +value of [null]{.Datatype}.Example 46: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{ ]{style="color:black"} + +[  \"param1\": 42, ]{style="color:black"} + +[  \"param2\": { ]{style="color:black"} + +[    \"Street\": \"One Microsoft Way\", ]{style="color:black"} + +[    \"Zip\": 98052 ]{style="color:black"} + +[  }, ]{style="color:black"} + +[  \"param3\": \[ 1, 42, 99 \],]{style="color:black"} + +[  \"param4\": null ]{style="color:black"} + +[}]{style="color:black"} +::: + +  + +In order to invoke an action with no non-binding parameters, the client +passes an empty JSON object in the body of the request. 4.01 Services +MUST also support clients passing an empty request body for this case. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_BatchRequestsandResponses}[]{#_Toc19867123}[19[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019475}[Batch Requests and Responses](#sec_BatchRequestsandResponses)[]{#_Toc38457781}[]{#_Toc23836955}[]{#_Toc37319050} {#batch-requests-and-responses style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +## []{#sec_BatchRequest}[]{#_Toc19867124}[19.1]{#_Toc12019476} [Batch Request](#sec_BatchRequest)[]{#_Toc38457782}[]{#_Toc23836956}[]{#_Toc37319051} + +A JSON batch request body consists of a single JSON object that MUST +contain the name/value pair [requests]{.Datatype} and MAY contain +[annotations](#sec_InstanceAnnotations). It does not contain the +[context]{.Keyword} control information. + +The value of [requests]{.Datatype} is an array of request objects, each +representing an individual request. Note: an individual request MUST NOT +itself be a batch request. + +A *request object* MUST contain the name/value pairs [id]{.Datatype}, +[method]{.Datatype} and [url]{.Datatype}, and it MAY contain the +name/value pairs [atomicityGroup]{.Datatype}, [dependsOn]{.Datatype}[[, +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}[if]{.Datatype}[[, +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}[headers]{.Datatype}, +and [body]{.Datatype}. + +The value of [id]{.Datatype} is a string containing the request +identifier of the individual request, see +[**\[OData-Protocol\]**](#odata). It MUST NOT be identical to the value +of any other request identifier nor any [atomicityGroup]{.Datatype} +within the batch request. + +Note: the [id]{.Datatype} name/value pair corresponds to the +[Content-ID]{.Datatype} header in the multipart batch format specified +in [**\[OData-Protocol\]**](#odata)[.]{.MsoHyperlink} + +The value of [method]{.Datatype} is a string that MUST contain one of +the literals [delete]{.Datatype}, [get]{.Datatype}, [patch]{.Datatype}, +[post]{.Datatype}, or [put]{.Datatype}. These literals are +case-insensitive. + +The value of [url]{.Datatype} is a string containing the individual +request URL. The URL MAY be an absolute path (starting with a forward +slash [/]{.Datatype}) which is appended to scheme, host, and port of the +batch request URL, or a relative path (not starting with a forward slash +[/]{.Datatype}). + +If the first segment of a relative path starts with a [\$]{.Datatype} +character and is not identical to the name of a top-level system +resource ([\$batch]{.Datatype}, [\$crossjoin,]{.Datatype} +[\$all,]{.Datatype} [\$entity]{.Datatype}, [\$root,]{.Datatype} +[\$id]{.Datatype}, [\$metadata]{.Datatype}, or other system resources +defined according to the +[OData-Version]{style="font-family:\"Courier New\""} of the protocol +specified in the request), then this first segment is replaced with the +URL of the entity created by or returned from a preceding request whose +[id]{.Datatype} value is identical to the value of the first segment +with the leading [\$]{.Datatype} character removed. The [id]{.Datatype} +of this request MUST be specified in the [dependsOn]{.Datatype} +name/value pair. + +Otherwise, the relative path is resolved relative to the batch request +URL (i.e. relative to the service root). + +The value of [atomicityGroup]{.Datatype} is a string whose content MUST +NOT be identical to any value of [id]{.Datatype} within the batch +request, and which MUST satisfy the rule [request-id]{.Datatype} in +[**\[OData-ABNF\]**](#abnf). All request objects with the same value for +[atomicityGroup]{.Datatype} MUST be adjacent in the +[requests]{.Datatype} array. These requests are processed as an atomic +operation and MUST either all succeed, or all fail. + +Note: the atomicity group is a generalization of the change set in the +multipart batch format specified in [**\[OData-Protocol\]**](#odata). + +The value of [dependsOn]{.Datatype} is an array of strings whose values +MUST be values of either [id]{.Datatype} or [atomicityGroup]{.Datatype} +of preceding request objects; forward references are not allowed. If a +request depends on another request that is part of a different atomicity +group, the atomicity group MUST be listed in [dependsOn]{.Datatype}. In +the absence of the optional [if]{.Datatype} member a request that +depends on other requests or atomicity groups is only executed if those +requests were executed successfully, i.e. with a [2xx]{.Datatype} +response code. If one of the requests it depends on has failed, the +dependent request is not executed and a response with status code of +[424 Failed Dependency]{.Datatype}[[ is returned for it as part of the +batch response.]{style="font-family:\"Arial\",sans-serif"}]{.Datatype} + +The [if]{.Datatype} member can specify an alternative condition for +executing the dependent request. Its value MUST be URL expression (see +[**\[OData-URL\]**](#ODataURLRef)) that evaluates to a Boolean value. +The URL expression syntax is extended and additionally allows + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[\$\/\$succeeded]{.Datatype} +to check if the referenced request has succeeded + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[\$\]{.Datatype} +to reference the response body of the referenced request + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}[\$\/\]{.Datatype} +to reference a part of the response body + +Services SHOULD advertise support of the [if]{.Datatype} member by +specifying the property +[RequestDependencyConditionsSupported]{.Datatype} in the +[[Capabilities.BatchSupport]{style="font-family:\"Courier New\""}](https://github.com/oasis-tcs/odata-vocabularies/blob/master/vocabularies/Org.OData.Capabilities.V1.md#BatchSupport) +term applied to the entity container, see +[**\[OData-VocCap\]**](#VocCapabilities)[[. If a service does not +support request dependencies, the dependent request MUST fail with +]{style="color:windowtext"}]{.MsoHyperlink}[424 Failed +Dependency]{.Datatype}[[, and if the dependent request is part of an +atomicity group, all requests in that group fail with +]{style="color:windowtext"}]{.MsoHyperlink}[424 Failed +Dependency]{.Datatype}[[ with no changes +applied]{style="color:windowtext"}]{.MsoHyperlink}. + +The value of [headers]{.Datatype} is an object whose name/value pairs +represent request headers. The name of each pair MUST be the lower-case +header name; the value is a string containing the header-encoded value +of the header. The [headers]{.Datatype} object MUST contain a name/value +pair with the name [content-type]{.Datatype} whose value is the media +type. + +The value of [body]{.Datatype} can be [null]{.Datatype}, which is +equivalent to not specifying the [body]{.Datatype} name/value pair. + +For media type [application/json]{.Datatype}[[ or one of its subtypes, +optionally with format parameters, the value of +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}[body]{.Datatype}[[ +is JSON.]{style="font-family:\"Arial\",sans-serif"}]{.Datatype} + +For media types of top-level type [text]{.Datatype}, for example +[text/plain]{.Datatype}, the value of [body]{.Datatype} is a string +containing the value of the request body. + +For all other media types the value of [body]{.Datatype} is a string +containing the base64url-encoded value of the request body. In this case +the body content can be compressed or chunked if this is correctly +reflected in the [Transfer-Encoding]{.Datatype} header. + +A [body]{.Datatype} MUST NOT be specified if the [method]{.Datatype} is +[get]{.Datatype} or [delete]{.Datatype}. + +Example []{#BatchRequestExampleNumber}47: a batch request that contains +the following individual requests in the order listed + +1.[     ]{style="font:7.0pt \"Times New Roman\""}A query request + +2.[     ]{style="font:7.0pt \"Times New Roman\""}An atomicity group that +contains the following requests: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}Insert +entity + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}Update +entity + +3.[     ]{style="font:7.0pt \"Times New Roman\""}A second query request + +Note: For brevity, in the example, request bodies are excluded in favor +of English descriptions inside [\<\>]{.Datatype} brackets and +[OData-Version]{.Datatype} headers are omitted. + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[POST /service/\$batch HTTP/1.1\ +Host: host\ +OData-Version: 4.01\ +Content-Type: application/json\ +Content-Length: \###]{style="color:black"} + +  + +[{]{style="color:black"} + +[  \"requests\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"0\",]{style="color:black"} + +[      \"method\": \"get\",]{style="color:black"} + +[      \"url\": \"/service/Customers(\'ALFKI\')\"]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"1\",]{style="color:black"} + +[      \"atomicityGroup\": \"group1\",]{style="color:black"} + +[      \"dependsOn\": \[ \"0\" \],]{style="color:black"} + +[      \"method\": \"patch\",]{style="color:black"} + +[      \"url\": \"/service/Customers(\'ALFKI\')\",]{style="color:black"} + +[      \"headers\": {]{style="color:black"} + +[        \"Prefer\": \"return=minimal\"]{style="color:black"} + +[      },]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"2\",]{style="color:black"} + +[      \"atomicityGroup\": \"group1\",]{style="color:black"} + +[      \"method\": \"post\",]{style="color:black"} + +[      \"url\": \"/service/Customers\",]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"3\",]{style="color:black"} + +[      \"dependsOn\": \[ \"group1\" \],]{style="color:black"} + +[      \"method\": \"get\",]{style="color:black"} + +[      \"url\": \"/service/Products\"]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_ReferencingNewEntities}[]{#_Toc19867125}[[19.2 ]{style="color:#0000EE"}]{#_Toc12019477}[Referencing New Entities](#sec_ReferencingNewEntities)[]{#_Toc38457783}[]{#_Toc23836957}[]{#_Toc37319052} + +The entity returned by a preceding request can be referenced in the +request URL of subsequent requests. + +Example 48: a batch request that contains the following operations in +the order listed: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}Insert +a new entity (with [id = 1]{.Datatype}) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}Insert +a second new entity (references request with [id = 1]{.Datatype}) + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[POST /service/\$batch HTTP/1.1\ +Host: host\ +OData-Version: 4.01\ +Content-Type: application/json\ +Content-Length: \###\ +\ +{]{style="color:black"} + +[  \"requests\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"1\",]{style="color:black"} + +[      \"method\": \"post\",]{style="color:black"} + +[      \"url\": \"/service/Customers\",]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"2\",]{style="color:black"} + +[      \"dependsOn\": \[ \"1\" \] ]{style="color:black"} + +[      \"method\": \"post\",]{style="color:black"} + +[      \"url\": \"\$1/Orders\",]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_ReferencinganETag}[]{#_Toc19867126}[[19.3 ]{style="color:#0000EE"}]{#_Toc12019478}[Referencing an ETag](#sec_ReferencinganETag)[]{#_Toc38457784}[]{#_Toc23836958}[]{#_Toc37319053} + +Example 49: a batch request that contains the following operations in +the order listed: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}Get +an Employee (with [id]{.Datatype} = 1) + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol;font-style:normal"}Update +the salary only if the employee has not changed + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[POST /service/\$batch HTTP/1.1\ +Host: host\ +OData-Version: 4.01\ +Content-Type: application/json\ +Content-Length: \###\ +\ +]{style="color:black"} + +[{]{style="color:black"} + +[  \"requests\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"1\",]{style="color:black"} + +[      \"method\": \"get\",]{style="color:black"} + +[      \"url\": \"/service/Employees(0)\",]{style="color:black"} + +[      \"headers\": {]{style="color:black"} + +[        \"accept\": \"application/json\"]{style="color:black"} + +[      }]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"2\",]{style="color:black"} + +[      \"dependsOn\": \[ \"1\" \],]{style="color:black"} + +[      \"method\": \"patch\",]{style="color:black"} + +[      \"url\": \"/service/Employees(0)\",]{style="color:black"} + +[      \"headers\": {]{style="color:black"} + +[        \"if-match\": \"\$1\"]{style="color:black"} + +[      },]{style="color:black"} + +[      \"body\": {]{style="color:black"} + +[         \"Salary\": 75000]{style="color:black"} + +[      }]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_ProcessingaBatchRequest}[]{#_Toc19867127}[]{#_Toc12019479}[]{#_Toc477190655}19.4 [Processing a Batch Request](#sec_ProcessingaBatchRequest)[]{#_Toc38457785}[]{#_Toc23836959}[]{#_Toc37319054} + +All requests in an atomicity group represent a single change unit. A +service MUST successfully process and apply all the requests in the +atomicity group or else apply none of them. It is up to the service +implementation to define rollback semantics to undo any requests within +an atomicity group that may have been applied before another request in +that same atomicity group failed. + +The service MAY process the individual requests and atomicity groups +within a batch request, or individual requests within an atomicity +group, in any order that is compatible with the dependencies expressed +with the [dependsOn]{.Datatype} name/value pair. Individual requests and +atomicity groups that do not specify the [dependsOn]{.Datatype} +name/value pair may be processed in parallel. Clients that are only +interested in completely successful batch responses MAY specify the +preference +[continue-on-error=false]{style="font-family:\"Courier New\";color:#3B006F"} +to indicate that the service need not spend cycles on further processing +once an error occurs in one of the dependency chains. In this case the +response MAY omit response objects for requests that have not been +processed. If the preference [continue-on-error]{.Datatype} is not +specified, or specified with a value of [true]{.Datatype}, all requests +are processed according to their dependencies. + +The service MUST include the [id]{.Datatype} name/value pair in each +response object with the value of the request identifier that the client +specified in the corresponding request, so clients can correlate +requests and responses. + +## []{#sec_BatchResponse}[]{#_Toc19867128}[19.5]{#_Toc12019480} [Batch Response](#sec_BatchResponse)[]{#_Toc38457786}[]{#_Toc23836960}[]{#_Toc37319055} + +A JSON batch response body consists of a single JSON object that MUST +contain the name/value pair [responses]{.Datatype} and MAY contain +[annotations](#sec_InstanceAnnotations). It does not contain the +[context]{.Keyword} control information. + +The value of [responses]{.Datatype} is an array of response objects, +each representing an individual response. + +A JSON batch response MAY be a partial result containing the +[[nextLink]{style="font-family: +\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) control +information. This allows services to chunk results into manageable +pieces, or to return results for already processed requests and continue +processing the remaining individual requests while waiting for the +client to fire a [GET]{.Datatype} request to the next link. + +In a response to a batch request using the multipart format defined in +[**\[OData-Protocol\]**](#odata)[ ]{.MsoHyperlink}[[the response objects +MUST appear in the same order as required for multipart batch responses +because the +]{style="color:windowtext"}]{.MsoHyperlink}[Content-ID]{.Datatype}[[ +header is not required outside of change sets. Response objects +corresponding to requests that specify a +]{style="color:windowtext"}]{.MsoHyperlink}[Content-ID]{.Datatype}[[ +header MUST contain the +]{style="color:windowtext"}]{.MsoHyperlink}[id]{.Datatype}[[ name/value +pair, and the value of +]{style="color:windowtext"}]{.MsoHyperlink}[id]{.Datatype}[[ MUST be the +value of the +]{style="color:windowtext"}]{.MsoHyperlink}[Content-ID]{.Datatype}[[ +header of the corresponding request. This is necessarily the case for +requests contained within a change set. Responses to requests within a +change set MUST contain the +]{style="color:windowtext"}]{.MsoHyperlink}[atomicityGroup]{.Datatype}[[ +name/value pair with a value common within a change set and unique +across change sets.]{style="color:windowtext"}]{.MsoHyperlink} + +[[In a response to a batch request using the JSON batch request format +specified in the preceding section the response objects MAY appear in +any order, and each response object MUST contain the +]{style="color:windowtext"}]{.MsoHyperlink}[id]{.Datatype}[[ name/value +pair with the same value as in the corresponding request object. If the +corresponding request object contains the +]{style="color:windowtext"}]{.MsoHyperlink}[atomicityGroup]{.Datatype}[[ +name/value pair, it MUST also be present in the response object with the +same value.]{style="color:windowtext"}]{.MsoHyperlink} + +If any response within an atomicity group returns a failure code, all +requests within that atomicity group are considered failed, regardless +of their individual returned status code. The service MAY return [424 +Failed Dependency]{.Datatype}[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}for statements +within an atomicity group that fail or are not attempted due to other +failures within the same atomicity group. + +A response object MUST contain the name/value pair [status]{.Datatype} +whose value is a number representing the HTTP status code of the +response to the individual request. + +The response object MAY contain the name/value pair [headers]{.Datatype} +whose value is an object with name/value pairs representing response +headers. The name of each pair MUST be the lower-case header name; the +value is a string containing the header-encoded value of the header. + +The response object MAY contain the name/value pair [body]{.Datatype} +which follows the same rules as within [request +objects](#sec_BatchRequest). + +If the media type is not exactly equal to [application/json]{.Datatype} +(i.e. it is a subtype or has format parameters), the +[headers]{.Datatype} object MUST contain a name/value pair with the name +[content-type]{.Datatype} whose value is the media type. + +Relative URLs in a response object follow the rules for [relative +URLs](#sec_RelativeURLs) based on the request URL of the corresponding +request. Especially: URLs in responses MUST NOT contain +[\$]{.Datatype}-prefixed request identifiers. + +Example 50: referencing the batch request example 47 above, assume all +the requests except the final query request succeed. In this case the +response would be + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"responses\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"0\",]{style="color:black"} + +[      \"status\": 200,]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"1\",]{style="color:black"} + +[      \"status\": 204]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"2\",]{style="color:black"} + +[      \"status\": 201,]{style="color:black"} + +[      \"headers\": {]{style="color:black"} + +[        \"location\": +\"http://host/service.svc/Customer(\'POIUY\')\"]{style="color:black"} + +[      },]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"3\",]{style="color:black"} + +[      \"status\": 404,]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#_Toc418513441}[]{#_Toc402353073}[]{#_Toc368563120}[]{#sec_AsynchronousBatchRequests}[]{#_Toc19867129}[]{#_Toc12019481}[]{#_Toc477190296}[]{#_Toc370374941}[]{#_Toc370126144}[]{#_Ref358207547}[]{#_Instance_Annotations}19.6 [Asynchronous Batch Requests](#sec_AsynchronousBatchRequests)[]{#_Toc37319056}[]{#_Toc23836961}[]{#_Toc38457787} + +A batch request that specifies the [respond-async]{style="font-family: +\"Courier New\""} preference MAY be executed asynchronously. This means +that the "outer" batch request is executed asynchronously; this +preference does not automatically cascade down to the individual +requests within the batch. After successful execution of the batch +request the response to the batch request is returned in the body of a +response to an interrogation request against the status monitor resource +URL, see section "Asynchronous Requests" in +[**\[OData-Protocol\]**](#odata). + +A service MAY return interim results to an asynchronously executing +batch. It does this by responding with [200 OK]{.Datatype} to a +[GET]{.Datatype} request to the monitor resource and including a +[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL) +control information in the JSON batch response, thus signaling that the +response is only a partial result. A subsequent [GET]{.Datatype} request +to the next link MAY result in a [202 +Accepted]{style="font-family:\"Courier New\""} response with a +[location]{.Datatype} header pointing to a new status monitor resource. + +Example 51: referencing the example 47 above again, assume that the +request is sent with the [respond-async]{.Datatype} preference. This +results in a [202]{.Datatype} response pointing to a status monitor +resource: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[HTTP/1.1 202 Accepted\ +Location: http://service-root/async-monitor-0\ +Retry-After: \###\ +\ +]{style="color:black"} +::: + +When interrogating the monitor URL only the first request in the batch +has finished processing and all the remaining requests are still being +processed. The service signals that asynchronous processing is +"finished" and returns a partial result with the first response and a +next link. The client did not explicitly accept +[application/http]{.Datatype}, so the response is "unwrapped" and only +indicates with the [AsyncResult]{.Datatype} header that it is a response +to a status monitor resource: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[HTTP/1.1 200 Ok\ +AsyncResult: 200\ +OData-Version: 4.01\ +Content-Length: \####\ +Content-Type: application/json\ +\ +]{style="color:black"} + +[{]{style="color:black"} + +[  \"responses\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"0\",]{style="color:black"} + +[      \"status\": 200,]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[  \],]{style="color:black"} + +[  \"@nextLink\": \"\...?\$skiptoken=YmF0Y2gx\"]{style="color:black"} + +[}]{style="color:black"} +::: + +Client makes a [GET]{.Datatype} request to the next link and receives a +[202]{.Datatype} response with the location of a new monitor resource. + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[HTTP/1.1 202 Accepted\ +Location: http://service-root/async-monitor-1\ +Retry-After: \###\ +\ +]{style="color:black"} +::: + +After some time a [GET]{.Datatype} request to the monitor resource +returns the remainder of the result[[. +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype} + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[HTTP/1.1 200 Ok\ +AsyncResult: 200\ +OData-Version: 4.01]{style="color:black"} + +[Content-Length: \####\ +Content-Type: application/json\ +\ +]{style="color:black"} + +[{]{style="color:black"} + +[  \"responses\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"1\",]{style="color:black"} + +[      \"status\": 204]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"2\",]{style="color:black"} + +[      \"status\": 201,]{style="color:black"} + +[      \"headers\": {]{style="color:black"} + +[        \"location\": +\"http://host/service.svc/Customer(\'POIUY\')\"]{style="color:black"} + +[      },]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"3\",]{style="color:black"} + +[      \"status\": 404,]{style="color:black"} + +[      \"body\": \]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +In addition to the above interaction pattern individual requests within +a batch with no other requests depending on it and not part of an +atomicity group MAY be executed asynchronously if they specify the +[respond-async]{style="font-family:\"Courier New\""} preference and if +the service responds with a JSON batch response. In this case the +[response]{.Datatype} array contains a response object for each +asynchronously executed individual request with a [status]{.Datatype}[[ +]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}of +[202]{.Datatype}, a [location]{.Datatype} header pointing to an +individual status monitor resource, and optionally a +[retry-after]{.Datatype} header. + +Example 52: the first individual request is processed asynchronously, +the second synchronously, the batch itself is processed synchronously + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[HTTP/1.1 200 OK\ +OData-Version: 4.01\ +Content-Length: \####\ +Content-Type: application/json\ +\ +]{style="color:black"} + +[{]{style="color:black"} + +[  \"responses\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"0\",]{style="color:black"} + +[      \"status\": 202,]{style="color:black"} + +[      \"headers\": {]{style="color:black"} + +[        \"location\": +\"http://service-root/async-monitor-0\"]{style="color:black"} + +[      }]{style="color:black"} + +[    },]{style="color:black"} + +[    {]{style="color:black"} + +[      \"id\": \"1\",]{style="color:black"} + +[      \"status\": 204]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_InstanceAnnotations}[]{#_Toc19867130}[20[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019482}[Instance Annotations](#sec_InstanceAnnotations)[]{#_Toc38457788}[]{#_Toc23836962}[]{#_Toc37319057} {#instance-annotations style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +[Annotations]{#_Representing_Annotations} are an extensibility mechanism +that allows services and clients to include information other than the +raw data in the request or response. + +Annotations are name/value pairs that have an at ([@]{.Datatype}) and a +dot ([.]{.Datatype}) as part of the name. The part after the \"at\" sign +([@]{.Datatype}) is the *annotation* *identifier*. It consists of the +namespace or alias of the schema that defines the term, followed by a +dot ([.]{.Datatype}), followed by the name of the term, [optionally +followed by a hash +(]{style="color:#333333;background:white"}[\#]{.Datatype}[) and a +qualifier.]{style="color: +#333333;background:white"} The namespace or alias MUST be defined in the +metadata document, see [**\[OData-CSDLJSON\]**](#ODataCSDLJSON) or +[**\[OData-CSDLXML\]**[.]{style="color:windowtext"}](#ODataCSDLXML) + +The annotation identifier [odata]{.Datatype} is reserved for future +extensions of the protocol and format. Instance annotations MUST have a +namespace or alias that is different from [odata]{.Datatype}. + +Annotations can be applied to any name/value pair in a JSON payload that +represents a value of any type from the entity data model. Clients +should never error due to an unexpected annotation in a JSON payload. + +Annotations are always expressed as name/value pairs. For entity data +model constructs represented as JSON objects the annotation name/value +pairs are placed within the object; for constructs represented as JSON +arrays or primitives they are placed next to the annotated model +construct. [When annotating a payload that represents a +]{style="color:black"}[single primitive or collection +value](#sec_IndividualPropertyorOperationRespons)[, the annotations for +the value appear next to the ]{style="color:black"}[value]{.Datatype} +[property and are not prefixed with a property +name.]{style="color:black"} + +Example 53: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"@context\": +\"http://host/service/\$metadata#Customers\",]{style="color:black"} + +[  \"@com.example.customer.setkind\": \"VIPs\",]{style="color:black"} + +[  \"value\": \[]{style="color:black"} + +[    {]{style="color:black"} + +[      \"@com.example.display.highlight\": true,]{style="color:black"} + +[      \"ID\": \"ALFKI\",]{style="color:black"} + +[      \"CompanyName@com.example.display.style\": { \"title\": true, +\"order\": 1 },]{style="color:black"} + +[      \"CompanyName\": \"Alfreds Futterkiste\",]{style="color:black"} + +[      \"Orders@com.example.display.style#simple\": { \"order\": 2 +}]{style="color:black"} + +[    }]{style="color:black"} + +[  \]]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#sec_AnnotateaJSONObject}[]{#_Toc19867131}[]{#_Toc12019483}[]{#_Toc418513442}[]{#_Toc402353074}[20.1]{#_Toc368563121} [Annotate a JSON Object](#sec_AnnotateaJSONObject)[]{#_Toc38457789}[]{#_Toc23836963}[]{#_Toc37319058} + +[When annotating a name/value pair for which the value is represented as +a JSON object, each annotation is placed within the object and +represented as a single name/value pair.]{style="color:black"} + +The name always starts with the \"at\" sign ([@]{.Datatype}), followed +by the annotation identifier. + +The value MUST be an appropriate value for the annotation. + +## []{#sec_AnnotateaJSONArrayorPrimitive}[]{#_Toc19867132}[]{#_Toc12019484}[]{#_Toc418513443}[]{#_Toc402353075}[20.2]{#_Toc368563122} [Annotate a JSON Array or Primitive](#sec_AnnotateaJSONArrayorPrimitive)[]{#_Toc38457790}[]{#_Toc23836964}[]{#_Toc37319059} + +W[hen annotating a name/value pair for which the value is represented as +a JSON array or primitive value, each annotation that applies to this +name/value pair MUST be represented as a single name/value pair and +placed immediately prior to the annotated name/value pair, with the +exception of the +]{style="color:black"}[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL)[ +or +]{style="color:black"}[[collectionAnnotations]{style="font-family:\"Courier New\""}](#sec_ControlInformationcollectionAnnotati)[ +control information]{style="color:black"},[ which can appear immediately +before or after the annotated collection. ]{style="color:black"} + +The name is the same as the name of the property or name/value pair +being annotated, followed by the "at" sign ([@]{.Datatype}), followed by +the annotation identifier. + +The value MUST be an appropriate value for the annotation. + +## []{#sec_AnnotateaPrimitiveValuewithinaJSONAr}[]{#_Toc19867133}[20.3]{#_Toc12019485} [Annotate a Primitive Value within a JSON Array](#sec_AnnotateaPrimitiveValuewithinaJSONAr)[]{#_Toc38457791}[]{#_Toc23836965}[]{#_Toc37319060} + +Individual primitive elements within a JSON array can be[ annotated by +applying the +]{style="color:black"}[[collectionAnnotations]{style="font-family:\"Courier New\""}](#sec_ControlInformationcollectionAnnotati)[ +control information to the array containing the primitive +member.]{style="color:black"} + +The control information must come with other annotations or control +information immediately before or after the collection valued property. +The name of the property representing the control information is the +same as the name of the collection-valued property, followed by the "at" +sign ([@]{.Datatype}), followed by the +[[collectionAnnotations]{style="font-family:\"Courier New\""}](#sec_ControlInformationcollectionAnnotati) +identifier. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#_Toc418513444}[]{#_Toc402353076}[]{#_Toc368563123}[]{#sec_ErrorHandling}[]{#_Toc19867134}[]{#_Toc12019486}[]{#_Representing_Errors_in}21[ ]{style="font:7.0pt \"Times New Roman\""}[Error Handling](#sec_ErrorHandling)[]{#_Toc37319061}[]{#_Toc23836966}[]{#_Toc38457792} {#error-handling style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +OData requests may return a well formed [error +response](#sec_ErrorResponse), an [in-stream +error](#sec_InStreamError)[]{#_Hlt11961899}, or error information +[within a success payload](#sec_ErrorInformationinaSuccessPayload). + +## []{#sec_ErrorResponse}[]{#_Toc19867135}[21.1]{#_Toc12019487} [Error Response](#sec_ErrorResponse)[]{#_Toc38457793}[]{#_Toc23836967}[]{#_Toc37319062} + +The error response MUST be a single JSON object. This object MUST have a +single name/value pair named [error]{.Keyword}. The value must be an +OData error object. + +The OData error object MUST contain name/value pairs with the names +[code]{.Keyword} and [message]{.Keyword}, and it MAY contain name/value +pairs with the names [target]{style="font-family: +\"Courier New\""}, [details]{style="font-family:\"Courier New\""}, and +[innererror]{.Keyword}. + +The value for the [code]{.Keyword} name/value pair is a non-empty +language-independent string. Its value is a service-defined error code. +This code serves as a sub-status for the HTTP error code specified in +the response. It cannot be [null]{.Datatype}. + +The value for the [message]{.Keyword} name/value pair is a non-empty, +language-dependent, human-readable string describing the error. The +[Content-Language]{.Datatype} header MUST contain the language code from +[**\[RFC5646\]**](#rfc5646) corresponding to the language in which the +value for message is written. It cannot be [null]{.Datatype}. + +The value for the [target]{style="font-family:\"Courier New\""} +name/value pair is a potentially empty string indicating the target of +the error (for example, the name of the property in error). It can be +[null]{.Datatype}. + +The value for the [details]{.Keyword} name/value pair MUST be an array +of JSON objects that MUST contain name/value pairs for +[code]{style="font-family:\"Courier New\""} and +[message]{style="font-family:\"Courier New\""}, and MAY contain a +name/value pair for [target]{style="font-family:\"Courier New\""}, as +described above. + +The value for the [innererror]{.Keyword} name/value pair MUST be an +object. The contents of this object are service-defined. Usually this +object contains information that will help debug the service.[ +]{style="color:black;background:white"} + +[Service implementations SHOULD carefully consider which information to +include in production environments to guard against potential security +concerns around information +disclosure.]{style="color:black;background:white"} + +Error responses MAY contain [annotations](#sec_InstanceAnnotations) in +any of its JSON objects. + +Example 54: + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[{]{style="color:black"} + +[  \"error\": {]{style="color:black"} + +[    \"code\": \"err123\",]{style="color:black"} + +[    \"message\": \"Unsupported functionality\",]{style="color:black"} + +[    \"target\": \"query\",]{style="color:black"} + +[    \"details\": \[]{style="color:black"} + +[      {]{style="color:black"} + +[       \"code\": \"forty-two\",]{style="color:black"} + +[       \"target\": \"\$search\",  ]{style="color:black"} + +[       \"message\": \"\$search query option not +supported\"]{style="color:black"} + +[      }]{style="color:black"} + +[    \],]{style="color:black"} + +[    \"innererror\": {]{style="color:black"} + +[      \"trace\": \[\...\],]{style="color:black"} + +[      \"context\": {\...}]{style="color:black"} + +[    }]{style="color:black"} + +[  }]{style="color:black"} + +[}]{style="color:black"} +::: + +## []{#_Toc418513445}[]{#_Toc402353077}[]{#_Toc368563124}[]{#_Ref356829963}[]{#sec_InStreamError}[]{#_Toc19867136}[]{#_Toc12019488}[]{#_The_Content-Type_Header}[]{#_Payload_Ordering_Constraints}21.2 [In-Stream Error](#sec_InStreamError)[]{#_Toc37319063}[]{#_Toc23836968}[]{#_Toc38457794} + +In the case that a service encounters an error after sending a success +status to the client, the service MUST leave the response malformed. +This can be achieved by immediately stopping response serialization and +thus omitting (among others) the end-object character of the top-level +JSON object in the response. + +Services MAY include the header [OData-Error]{.Datatype} as a trailing +header if supported by the transport protocol (e.g. with HTTP/1.1 and +chunked transfer encoding, or with HTTP/2), see +[**\[OData-Protocol\]**](#odata). + +The value of the [OData-Error]{.Datatype} trailing header is an OData +error object as defined in the preceding chapter, represented in a +header-appropriate way: + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}All +optional whitespace (indentation and line breaks) is removed, especially +(in hex notation) [09]{.Datatype}, [0A]{.Datatype} and [0D]{.Datatype} + +[·[         +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:Symbol"}Control +characters ([00]{.Datatype} to [1F]{.Datatype} and [7F]{.Datatype}) and +Unicode characters beyond [00FF]{.Datatype} within JSON strings are +encoded as [\\uXXXX]{.Datatype} or [\\uXXXX\\uXXXX]{.Datatype} (see +[**\[RFC8259\]**](#RFC_JSON), section 7) + +Example 55: note that this is one HTTP header line without any line +breaks or optional whitespace + +::: {style="border-top:solid windowtext 1.0pt;border-left:none;border-bottom: +solid windowtext 1.0pt;border-right:none;padding:3.0pt 0in 3.0pt 0in; +background:#D9D9D9;margin-left:.3in;margin-right:.3in"} +[OData-error: {\"code\":\"err123\",\"message\":\"Unsupported +functionality\",\"target\":\"query\",\"details\":\[{\"code\":\"forty-two\",\"target\":\"\$search\",\"message\":\"\$search +query option not supported\"}\]}]{style="color:black"} +::: + +## []{#sec_ErrorInformationinaSuccessPayload}[]{#_Toc19867137}[21.3]{#_Toc12019489} [Error Information in a Success Payload](#sec_ErrorInformationinaSuccessPayload)[]{#_Toc37319064}[]{#_Toc23836969}[]{#_Toc38457795} + +Services may return error information within a success payload; for +example, if the client has specified the +[continue-on-error]{style="font-family:\"Courier New\""} preference. + +### []{#sec_PrimitiveValueErrors}[]{#_Toc19867138}[21.3.1]{#_Toc12019490} [Primitive Value Errors](#sec_PrimitiveValueErrors)[]{#_Toc37319065}[]{#_Toc23836970}[]{#_Toc38457796} + +Primitive values that are in error are annotated with the +[Core.ValueException]{.Datatype} term, see +[**\[OData-VocCore\]**](#VocCore). In this case, the payload MAY include +an approximation of the value and MAY specify a string representation of +the exact value in the [value]{.Datatype} property of the annotation. + +### []{#sec_StructuredTypeErrors}[]{#_Toc19867139}[21.3.2]{#_Toc12019491} [Structured Type Errors](#sec_StructuredTypeErrors)[]{#_Toc37319066}[]{#_Toc23836971}[]{#_Toc38457797} + +Structured types that are in error can be represented within a success +payload only if the client has specified the +[continue-on-error]{style="font-family: +\"Courier New\""} preference. Such items are annotated with the +[Core.ResourceException]{.Datatype} term, see +[**\[OData-VocCore\]**](#VocCore). The annotation MAY include a +[retryLink]{.Datatype} property that can be used by the client to +attempt to re-fetch the resource. + +### []{#sec_CollectionErrors}[]{#_Toc19867140}[21.3.3]{#_Toc12019492} [Collection Errors](#sec_CollectionErrors)[]{#_Toc37319067}[]{#_Toc23836972}[]{#_Toc38457798} + +Collections within a success payload can contain primitive values that +are in error, or structured values that are in error, if the client has +specified the [continue-on-error]{style="font-family:\"Courier New\""} +preference. Such elements are annotated as described above. Primitive +elements within a collection are annotated using the +[[collectionAnnotations]{style="font-family:\"Courier New\""}](#sec_ControlInformationcollectionAnnotati) +control information. + +Services can return partial collections within a success payload, for +example, if they encounter an error while retrieving the collection and +the client has specified the +[continue-on-error]{style="font-family:\"Courier New\""} preference. In +this case, the service MUST include a +[[nextLink]{style="font-family:\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL). +The [[nextLink]{style="font-family: +\"Courier New\""}](#sec_ControlInformationnextLinkodatanextL)[ +]{.Datatype}can be used to attempt retrieving the remaining members of +the collection and could return an error indicating that the remaining +members are not available. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_Extensibility}[]{#_Toc19867141}[22[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc12019493}[Extensibility](#sec_Extensibility)[]{#_Toc38457799}[]{#_Toc23836973}[]{#_Toc37319068} {#extensibility style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +Implementations can add [instance annotations](#sec_InstanceAnnotations) +of the form [\@namespace.termname]{.Datatype} or +[property@namespace.termname]{.Datatype} to any JSON object, where +[property]{.Datatype} MAY or MAY NOT match the name of a name/value pair +within the JSON object. However, the namespace MUST NOT start with +[odata]{.Datatype} and SHOULD NOT be required to be understood by the +receiving party in order to correctly interpret the rest of the payload +as the receiving party MUST ignore unknown annotations not defined in +this version of the OData JSON Specification. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_SecurityConsiderations}[]{#_Toc19867142}[]{#_Toc12019494}[]{#_Toc418513446}[]{#_Toc402353078}[23[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc368563125}[Security Considerations](#sec_SecurityConsiderations)[]{#_Toc38457800}[]{#_Toc23836974}[]{#_Toc37319069} {#security-considerations style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +This specification raises no security issues. + +This section is provided as a service to the application developers, +information providers, and users of OData version 4.0 giving some +references to starting points for securing OData services as specified. +OData is a REST-full multi-format service that depends on other services +and thus inherits both sides of the coin, security enhancements and +concerns alike from the latter. + +For JSON-relevant security implications please cf. at least the relevant +subsections of [**\[RFC8259\]**](#RFC_JSON) as starting point. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +# []{#sec_Conformance}[]{#_Toc19867143}[]{#_Toc12019495}[]{#_Toc418513447}[]{#_Toc402353079}[24[ ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc368563126}[Conformance](#sec_Conformance)[]{#_Toc38457801}[]{#_Toc23836975}[]{#_Toc37319070} {#conformance style="margin-left:19.85pt;text-indent:-19.85pt"} +::: + +Conforming clients MUST be prepared to consume a service that uses any +or all of the constructs defined in this specification. The exception to +this are the constructs defined in [Delta Response](#sec_DeltaPayload), +which are only required for clients that request changes. + +  + +In order to be a conforming *consumer* of the OData JSON format, a +client or service: + +1.[     ]{style="font:7.0pt \"Times New Roman\""}MUST either: + +a.[     ]{style="font:7.0pt \"Times New Roman\""}understand +[metadata=minimal]{.Datatype} (section 3.1.1) or + +b.[     ]{style="font:7.0pt \"Times New Roman\""}explicitly specify +[metadata=none]{.Datatype} (section 3.1.3) or [metadata=full]{.Datatype} +(section 3.1.2) in the request (client) + +2.[     ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared to +consume a response with full metadata + +3.[     ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared to +receive all data types (section 7.1) + +a.[      ]{style="font:7.0pt \"Times New Roman\""}defined in this +specification (client) + +b.[      ]{style="font:7.0pt \"Times New Roman\""}exposed by the service +(service) + +4.[     ]{style="font:7.0pt \"Times New Roman\""}MUST interpret all +[odata]{.Datatype} control information defined according to the +[OData-Version]{style="font-family:\"Courier New\""} header of the +payload (section 4.5) + +5.[     ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared to +receive any annotations[ ]{.MsoHyperlink}and control information not +defined in the [OData-Version]{style="font-family:\"Courier New\""} +header of the payload (section 21.2) + +6.[     ]{style="font:7.0pt \"Times New Roman\""}MUST NOT require +[streaming=true]{style="font-family:\"Courier New\""} in the +[Content-Type]{style="font-family:\"Courier New\""} header (section 4.4) + +7.[     ]{style="font:7.0pt \"Times New Roman\""}MUST be a conforming +consumer of the OData 4.0 JSON format, for payloads with an +[OData-Version]{style="font-family:\"Courier New\""} header value of +[4.0]{style="font-family:\"Courier New\""}. + +a.[      ]{style="font:7.0pt \"Times New Roman\""}MUST accept the[ +odata.]{style="font-family:\"Courier New\""} prefix, where defined, on +[format parameters](#sec_ControllingtheAmountofControlInforma) and +[control information](#sec_ControlInformation) + +b.[      ]{style="font:7.0pt \"Times New Roman\""}MUST accept the [\# +]{style="font-family:\"Courier New\""}prefix in +[[\@odata.type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype) +values + +c.[       ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared to +handle binding through the use of the +[[\@odata.bind]{style="font-family:\"Courier New\""}](#sec_BindOperation) +property in payloads to a [PATCH]{style="font-family:\"Courier New\""}, +[PUT]{style="font-family:\"Courier New\""}, or +[POST]{style="font-family: +\"Courier New\""} request + +d.[      ]{style="font:7.0pt \"Times New Roman\""}MUST accept +[TargetId]{style="font-family:\"Courier New\""} within in a [deleted +link](#sec_DeletedLink) for a relationship with a maximum cardinality of +one + +e.[      ]{style="font:7.0pt \"Times New Roman\""}MUST accept the string +values [-INF]{style="font-family:\"Courier New\""}, +[INF]{style="font-family:\"Courier New\""}, and +[NaN]{style="font-family: +\"Courier New\""} for single and double values + +f.[        ]{style="font:7.0pt \"Times New Roman\""}MUST support +property annotations that appear immediately before or after the +property they annotate + +8.[     ]{style="font:7.0pt \"Times New Roman\""}MAY be a conforming +consumer of the OData 4.01 JSON format, for payloads with an +[OData-Version]{style="font-family:\"Courier New\""} header value of +[4.01]{style="font-family:\"Courier New\""}. + +a.[      ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared to +interpret [control information](#sec_ControlInformation) with or without +the [odata.]{style="font-family:\"Courier New\""} prefix + +b.[      ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared for +[[\@odata.type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype) +primitive values with or without the +[\#]{style="font-family:\"Courier New\""} prefix + +c.[       ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared to +handle binding through inclusion of an entity reference within a +collection-valued navigation property in the body of a +[PATCH]{style="font-family: +\"Courier New\""}, [PUT]{style="font-family:\"Courier New\""}, or +[POST]{style="font-family:\"Courier New\""} request + +d.[      ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared for +[TargetId]{style="font-family:\"Courier New\""} to be included or +omitted in a [deleted link](#sec_DeletedLink) for a relationship with a +maximum cardinality of one + +e.[      ]{style="font:7.0pt \"Times New Roman\""}MUST accept the string +values [-INF]{style="font-family:\"Courier New\""}, +[INF]{style="font-family:\"Courier New\""}, and +[NaN]{style="font-family: +\"Courier New\""} for decimal values with floating scale + +[[f.[        +]{style="font:7.0pt \"Times New Roman\""}]{style="color:windowtext"}]{.MsoHyperlink}MUST +be prepared to handle related entities inline within a [delta +payload](#sec_DeltaPayload)[ ]{.MsoHyperlink}[[as well as a nested delta +representation for the +collection]{style="color:windowtext"}]{.MsoHyperlink} + +g.[      ]{style="font:7.0pt \"Times New Roman\""}MUST be prepared to +handle decimal values written in exponential notation + +  + +In order to be a conforming *producer* of the OData JSON format, a +client or service: + +9.[     ]{style="font:7.0pt \"Times New Roman\""}MUST support generating +OData 4.0 JSON compliant payloads with an +[OData-Version]{style="font-family:\"Courier New\""} header value of +[4.0]{style="font-family:\"Courier New\""}. + +a.[      ]{style="font:7.0pt \"Times New Roman\""}MUST NOT omit the +[odata.]{style="font-family:\"Courier New\""} prefix from [format +parameters](#sec_ControllingtheAmountofControlInforma) or [control +information](#sec_ControlInformation) + +b.[      ]{style="font:7.0pt \"Times New Roman\""}MUST NOT omit the +[\#]{style="font-family:\"Courier New\""} prefix from +[[\@odata.type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype)[ +]{style="font-family:\"Courier New\""}values + +c.[       ]{style="font:7.0pt \"Times New Roman\""}MUST NOT include +entity values or entity references within a collection-valued navigation +property in the body of a [PATCH]{style="font-family:\"Courier New\""}, +[PUT]{style="font-family:\"Courier New\""}, or +[POST]{style="font-family: +\"Courier New\""} request + +d.[      ]{style="font:7.0pt \"Times New Roman\""}MUST NOT return +decimal values written in exponential notation unless the +[[ExponentialDecimals]{style="font-family:\"Courier New\""}](#sec_ControllingtheRepresentationofNumber) +format parameter is specified. + +e.[      ]{style="font:7.0pt \"Times New Roman\""}MUST NOT advertise +available actions or functions using name/value pairs prefixed with a +property name + +f.[        ]{style="font:7.0pt \"Times New Roman\""}MUST NOT return a +null value for name/value pairs representing actions or functions that +are not available + +g.[      ]{style="font:7.0pt \"Times New Roman\""}MUST NOT represent +numeric value exceptions for values other than single and double values +using the string values [-INF]{style="font-family:\"Courier New\""}, +[INF]{style="font-family:\"Courier New\""}, and +[NaN]{style="font-family: +\"Courier New\""} + +10.[  ]{style="font:7.0pt \"Times New Roman\""}MAY support generating +OData 4.01 JSON compliant payloads for requests with an +[OData-Version]{style="font-family: +\"Courier New\""} header value of [4.01]{style="font-family: +\"Courier New\""}. + +a.[      ]{style="font:7.0pt \"Times New Roman\""}MUST return property +annotations immediately before the property they annotate + +b.[      ]{style="font:7.0pt \"Times New Roman\""}SHOULD omit the +[odata.]{style="font-family:\"Courier New\""} prefix from [format +parameters](#sec_ControllingtheAmountofControlInforma) and [odata +control information](#sec_ControlInformation) + +c.[       ]{style="font:7.0pt \"Times New Roman\""}SHOULD omit the +[\#]{style="font-family:\"Courier New\""} prefix from +[[\@type]{style="font-family:\"Courier New\""}](#sec_ControlInformationtypeodatatype) +primitive values + +d.[      ]{style="font:7.0pt \"Times New Roman\""}MAY include inline +related entities or nested delta collections within a delta payload + +e.[      ]{style="font:7.0pt \"Times New Roman\""}MAY include +[TargetId]{style="font-family:\"Courier New\""} within a [deleted +link](#sec_DeletedLink) for a relationship with a maximum cardinality of +1 + +f.[        ]{style="font:7.0pt \"Times New Roman\""}MAY return decimal +values written in exponential notation + +g.[      ]{style="font:7.0pt \"Times New Roman\""}MAY represent numeric +value exceptions for decimal values with floating scale using the string +values [-INF]{style="font-family:\"Courier New\""}, +[INF]{style="font-family:\"Courier New\""}, and +[NaN]{style="font-family: +\"Courier New\""} + +In addition, in order to conform to the OData JSON format, a service: + +11.[  ]{style="font:7.0pt \"Times New Roman\""}MUST comply with one of +the conformance levels defined in +[[\[OData-Protocol\]]{style="color:windowtext"}](#odata) + +12.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support the +[application/json]{.Datatype} media type in the Accept header (section +3) + +13.[  ]{style="font:7.0pt \"Times New Roman\""}MUST return well-formed +JSON payloads + +14.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support +[odata.metadata=full]{.Datatype} (section 3.1.2) + +15.[  ]{style="font:7.0pt \"Times New Roman\""}MUST include the +[odata.nextLink]{.Datatype} control information in partial results for +entity collections (section 4.5.5) + +16.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support entity +instances with external metadata (section 4.5.1) + +17.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support properties +with externally defined data types (section 4.5.3) + +18.[  ]{style="font:7.0pt \"Times New Roman\""}MUST NOT violate any +other aspects of this OData JSON specification + +19.[  ]{style="font:7.0pt \"Times New Roman\""}SHOULD support the +[\$format]{.Datatype}  system query option (section 3) + +20.[  ]{style="font:7.0pt \"Times New Roman\""}MAY support the +[odata.streaming=true]{.Datatype} parameter in the [Accept]{.Datatype} +header (section 4.4) + +21.[  ]{style="font:7.0pt \"Times New Roman\""}MAY return full metadata +regardless of [odata.metadata]{.Datatype} (section 3.1.2) + +22.[  ]{style="font:7.0pt \"Times New Roman\""}MUST NOT omit null or +default values unless the [omit-values]{.Datatype} preference is +specified in the [Prefer]{.Datatype} request header and the omit-values +preference is included in the [Preference-Applied]{.Datatype} response +header + +23.[  ]{style="font:7.0pt \"Times New Roman\""}MUST return OData JSON +4.0-compliant responses for requests with an +[OData-MaxVersion]{.Datatype} header value of [4.]{.Datatype}0 + +24.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support OData JSON +4.0-compliant payloads in requests with an [OData-Version]{.Datatype} +header value of [4.0]{.Datatype} + +25.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support returning, +in the final response to an asynchronous request, the +[application/json]{.Datatype} payload that would have been returned had +the operation completed synchronously, wrapped in an application/http +message + +  + +In addition, in order to comply with the OData 4.01 JSON format, a +service: + +[[26.[  +]{style="font:7.0pt \"Times New Roman\""}]{style="font-family:\"Arial\",sans-serif"}]{.Datatype}SHOULD +return the OData JSON 4.01 format for requests with an +[OData-MaxVersion]{.Datatype} header value of [4.01]{.Datatype} + +27.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support the OData +JSON 4.01 format in request payloads for requests with an +[OData-Version]{.Datatype} header value of [4.01]{.Datatype} + +28.[  ]{style="font:7.0pt \"Times New Roman\""}MUST honor the +[[[odata.etag]{style="color:windowtext"}]{.Datatype}](#sec_ControlInformationetagodataetag) +control information within [PUT]{.Datatype}, [PATCH]{.Datatype} or +[DELETE]{.Datatype} payloads, if specified + +29.[  ]{style="font:7.0pt \"Times New Roman\""}MUST support returning, +in the final response to an asynchronous request, the +[application/json]{.Datatype} payload that would have been returned had +the operation completed synchronously + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +[]{#sec_Acknowledgments}[]{#_Toc19867144}[]{#_Toc12019496}[]{#_Toc418513448}[]{#_Toc402353080}[]{#_Toc368563127}[]{#_Toc462221701}Appendix +A.[  +]{style="font:7.0pt \"Times New Roman\""}[Acknowledgments](#sec_Acknowledgments)[]{#_Toc38457802}[]{#_Toc23836976}[]{#_Toc37319071} +::: + +The contributions of the OASIS OData Technical Committee members, +enumerated in [**\[OData-Protocol\]**](#odata), are gratefully +acknowledged. + +::: {style="border:none;border-top:solid gray 1.0pt;padding:6.0pt 0in 0in 0in"} +[]{#sec_RevisionHistory}[]{#_Toc19867145}[]{#_Toc12019497}[]{#_Toc418513449}[]{#_Toc402353081}[Appendix +B.[  ]{style="font:7.0pt \"Times New Roman\""}]{#_Toc368563128}[Revision +History](#sec_RevisionHistory)[]{#_Toc38457803}[]{#_Toc23836977}[]{#_Toc37319072} +::: + ++-----------------+-----------------+-----------------+-----------------+ +| **Revision** | **Date** | **Editor** | **Changes | +| | | | Made** | ++-----------------+-----------------+-----------------+-----------------+ +| Working Draft | 2016-06-22 | Michael Pizzo | Import material | +| 01 | | | from OData 4.0 | +| | | Ralf Handl | Errata 3 JSON | +| | | | document and | +| | | | initial | +| | | | application of | +| | | | 4.01 features | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2016-12-08 | Michael Pizzo | Integrated 4.01 | +| Specification | | | features | +| Draft 01 | | Ralf Handl | | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2017-06-08 | Michael Pizzo | Integrated more | +| Specification | | | 4.01 features, | +| Draft 02 | | Ralf Handl | especially: | +| | | | | +| | | | [·[         | +| | | | ] | +| | | | {style="font:7. | +| | | | 0pt \"Times New | +| | | | Roman\""}]{sty | +| | | | le="font-family | +| | | | :Symbol"}Update | +| | | | of a collection | +| | | | of entities | +| | | | | +| | | | [·[         | +| | | | ]{style="font: | +| | | | 7.0pt \"Times N | +| | | | ew Roman\""}]{s | +| | | | tyle="font-fami | +| | | | ly:Symbol"}JSON | +| | | | Batch format | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2017-09-22 | Michael Pizzo | Incorporated | +| Specification | | | review feedback | +| Draft 03 | | Ralf Handl | | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2017-11-10 | Michael Pizzo | Incorporated | +| Specification | | | review feedback | +| Draft 04 | | Ralf Handl | | +| | | | Changed default | +| | | | of | +| | | | [continue-on-er | +| | | | ror]{.Datatype} | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2017-12-19 | Michael Pizzo | Non-Material | +| Specification | | | Changes | +| 01 | | Ralf Handl | | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2019-06-21 | Michael Pizzo | In-stream | +| Specification | | | errors | +| Draft 05 | | Ralf Handl | | +| | | | Conditional | +| | | | request | +| | | | dependencies in | +| | | | batch requests | +| | | | | +| | | | Optional action | +| | | | parameters | +| | | | | +| | | | Update of media | +| | | | links of stream | +| | | | properties | +| | | | | +| | | | Representing | +| | | | error | +| | | | information in | +| | | | success | +| | | | responses with | +| | | | [continue-on-er | +| | | | ror]{.Datatype} | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2019-09-20 | Michael Pizzo | No dependencies | +| Specification | | | to async | +| Draft 06 | | Ralf Handl | requests within | +| | | | a batch request | ++-----------------+-----------------+-----------------+-----------------+ +| Committee | 2019-11-05 | Michael Pizzo | Non-material | +| Specification | | | changes | +| 02 | | Ralf Handl | | ++-----------------+-----------------+-----------------+-----------------+ +| Candidate OASIS | 2020-01-15 | Michael Pizzo | Non-material | +| Standard 01 | | | changes | +| | | Ralf Handl | | ++-----------------+-----------------+-----------------+-----------------+ +| Candidate OASIS | 2020-04-09 | Michael Pizzo | Non-material | +| Standard 02 | | | changes | +| | | Ralf Handl | | ++-----------------+-----------------+-----------------+-----------------+ + +  +::: diff --git a/docs/odata-json-format/odata-json-format.html b/docs/odata-json-format/odata-json-format.html index 99e3bed7d..4eb3a4f72 100644 --- a/docs/odata-json-format/odata-json-format.html +++ b/docs/odata-json-format/odata-json-format.html @@ -20,6 +20,8 @@ + + @@ -100,21 +102,106 @@

    Table of Contents

  • 1.2.3 Document conventions
  • -
  • 2 Section Heading +
  • 2 JSON Format Design
  • +
  • 3 Requesting the JSON Format
  • +
  • 4 Common Characteristics
  • +
  • 5 Service Document
  • +
  • 6 Entity
  • +
  • 7 Structural Property +
  • -
  • 2.2 Next Heading
  • +
  • 8 Navigation Property +
  • -
  • 3 Conformance
  • +
  • 9 Stream Property
  • +
  • 10 Media Entity
  • +
  • 11 Individual Property or Operation Response
  • +
  • 12 Collection of Operation Responses
  • +
  • 13 Collection of Entities
  • +
  • 14 Entity Reference
  • +
  • 15 Delta Payload +
  • +
  • 16 Bound Function
  • +
  • 17 Bound Action
  • +
  • 18 Action Invocation
  • +
  • 19 Batch Requests and Responses +
  • +
  • 20 Instance Annotations +
  • +
  • 21 Error Handling +
  • +
  • 22 Extensibility
  • +
  • 23 Conformance
  • A References