<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.6 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lim-apv-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="APV">Advance Professional Video</title>
    <seriesInfo name="Internet-Draft" value="draft-lim-apv-00"/>
    <author initials="Y." surname="Lim" fullname="Youngkwon Lim">
      <organization>Samsung Electronics</organization>
      <address>
        <postal>
          <street>6105 Tennyson Pkwy, Ste 300</street>
          <city>Plano, TX</city>
          <code>75024</code>
          <country>USA</country>
        </postal>
        <email>yklwhite@gmail.com</email>
      </address>
    </author>
    <author initials="M." surname="Park" fullname="Minwoo Park">
      <organization>Samsung Electronics</organization>
      <address>
        <postal>
          <street>34, Seongchon-gil, Seocho-gu</street>
          <city>Seoul</city>
          <code>3573</code>
          <country>Republic of Korea</country>
        </postal>
        <email>m.w.park@samsung.com</email>
      </address>
    </author>
    <author initials="M." surname="Budagavi" fullname="Madhukar Budagavi">
      <organization>Samsung Electronics</organization>
      <address>
        <postal>
          <street>6105 Tennyson Pkwy, Ste 300</street>
          <city>Plano, TX</city>
          <code>75024</code>
          <country>USA</country>
        </postal>
        <email>m.budagavi@samsung.com</email>
      </address>
    </author>
    <author initials="R." surname="Joshi" fullname="Rajan Joshi">
      <organization>Samsung Electronics</organization>
      <address>
        <postal>
          <street>11488 Tree Hollow Ln</street>
          <city>San Diego, CA</city>
          <code>92128</code>
          <country>USA</country>
        </postal>
        <email>rajan_joshi@ieee.org</email>
      </address>
    </author>
    <author initials="K." surname="Choi" fullname="Kwang Pyo Choi">
      <organization>Samsung Electronics</organization>
      <address>
        <postal>
          <street>11 Byeoryang-ro</street>
          <city>Gwacheon</city>
          <code>13839</code>
          <country>Republic of Korea</country>
        </postal>
        <email>kwangpyo.choi@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="01"/>
    <area>General</area>
    <workgroup>Independent Submission</workgroup>
    <keyword>mezzanine codec</keyword>
    <keyword>visually lossless compression</keyword>
    <abstract>
      <?line 83?>

<t>This document describes bitstream format of Advanced Professional Video and decoding process of it.</t>
    </abstract>
  </front>
  <middle>
    <?line 87?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines the bitstream formats and decoding process for Advanced Professional Video (APV) Codec. The APV codec is a professional video codec that was developed in response to the need for professional level high quality video recording and post production. The primary purpose of the APV codec is for use in professional video recording and editing workflows for various types of content.</t>
      <t>The APV codec supports the following features:</t>
      <ul spacing="normal">
        <li>
          <t>Perceptually lossless video quality that is close to raw video quality</t>
        </li>
        <li>
          <t>Low complexity and high throughput intra frame only coding without pixel domain prediction</t>
        </li>
        <li>
          <t>Support for high bit-rates up to a few Gbps for 2K, 4K and 8K resolution content, enabled by a lightweight entropy coding scheme</t>
        </li>
        <li>
          <t>Frame tiling for immersive content and for enabling parallel encoding and decoding</t>
        </li>
        <li>
          <t>Support for various chroma sampling formats from 4:2:2 to 4:4:4, and bit-depths from 10 to 16</t>
        </li>
        <li>
          <t>Support for multiple decoding and re-encoding without severe visual quality degradation</t>
        </li>
      </ul>
    </section>
    <section anchor="terms">
      <name>Terms</name>
      <section anchor="terms-and-definitions">
        <name>Terms and definitions</name>
        <ul spacing="normal">
          <li>
            <t>Block: MxN (M-column by N-row) array of samples, or an MxN array of transform coefficients</t>
          </li>
          <li>
            <t>byte-aligned: a position in a bitstream that is an integer multiple of 8 bits from the position of the first bit in the bitstream</t>
          </li>
          <li>
            <t>chroma: a sample array or single sample representing one of the two color difference signals related to the primary colors, represented by the symbols Cb and Cr</t>
          </li>
          <li>
            <t>coded frame: a coded representation of a frame containing all macroblocks of the frame</t>
          </li>
          <li>
            <t>coded representation: a data element as represented in its coded form</t>
          </li>
          <li>
            <t>component: array or a single sample from one of the three arrays (luma and two chroma) that compose a frame in 4:2:2, or 4:4:4 color format</t>
          </li>
          <li>
            <t>decoded frame: a frame derived by decoding a coded frame</t>
          </li>
          <li>
            <t>decoder: an embodiment of a decoding process</t>
          </li>
          <li>
            <t>decoding process: a process specified that reads a bitstream and derives decoded frames from it</t>
          </li>
          <li>
            <t>encoder: an embodiment of an encoding process</t>
          </li>
          <li>
            <t>encoding process: a process that produces a bitstream conforming to this document</t>
          </li>
          <li>
            <t>flag: a variable or single-bit syntax element that can take one of the two possible values: 0 and 1</t>
          </li>
          <li>
            <t>frame: an array of luma samples and two corresponding arrays of chroma samples in 4:2:2, and 4:4:4 color format</t>
          </li>
          <li>
            <t>Frame Data: a syntax structure containing coded representation of a frame</t>
          </li>
          <li>
            <t>Frame Data stream: a sequence of Frame Data</t>
          </li>
          <li>
            <t>Level: a defined set of constraints on the values that may be taken by the syntax elements and variables of this document, or the value of a transform coefficient prior to scaling</t>
          </li>
          <li>
            <t>luma: a sample array or single sample representing the monochrome signal related to the primary colors, represented by the symbol or subscript Y or L</t>
          </li>
          <li>
            <t>MB (macroblock): square block of luma samples and two corresponding blocks of chroma samples of a frame</t>
          </li>
          <li>
            <t>Partitioning: a division of a set into subsets such that each element of the set is in exactly one of the subsets</t>
          </li>
          <li>
            <t>prediction: an embodiment of the prediction process</t>
          </li>
          <li>
            <t>prediction process: use of a predictor to provide an estimate of the data element currently being decoded</t>
          </li>
          <li>
            <t>predictor: a combination of specified values or previously decoded data elements used in the decoding process of subsequent data elements</t>
          </li>
          <li>
            <t>Profile: a specified subset of the syntax of this document</t>
          </li>
          <li>
            <t>QP (quantization parameter): a variable used by the decoding process for scaling of transform coefficient levels</t>
          </li>
          <li>
            <t>raster scan: a mapping of a rectangular two-dimensional pattern to a one-dimensional pattern such that the first entries in the one- dimensional pattern are from the top row of the two- dimensional pattern scanned from left to right, followed by the second, third, etc., rows of the pattern each scanned from left to right</t>
          </li>
          <li>
            <t>raw bitstream: an encapsulation of a Frame Data stream where for each frame, a field indicating the size of Frame Data precedes the Frame Data</t>
          </li>
          <li>
            <t>source: a term used to describe the video material or some of its attributes before encoding process</t>
          </li>
          <li>
            <t>syntax element: an element of data represented in the bitstream</t>
          </li>
          <li>
            <t>syntax structure: zero or more syntax elements present together in the bitstream in a specified order</t>
          </li>
          <li>
            <t>tile: a rectangular region of MBs within a particular tile column and a particular tile row in a frame</t>
          </li>
          <li>
            <t>tile column: a rectangular region of MBs having a height equal to the height of the frame and width specified by syntax elements in the frame header</t>
          </li>
          <li>
            <t>tile row: a rectangular region of MBs having a height specified by syntax elements in the frame header and a width equal to the width of the frame</t>
          </li>
          <li>
            <t>tile scan: a specific sequential ordering of MBs partitioning a frame in which the MBs are ordered consecutively in MB raster scan in a tile and the tiles in a frame are ordered consecutively in a raster scan of the tiles of the frame</t>
          </li>
          <li>
            <t>transform coefficient: a scalar quantity, considered to be in a frequency domain, that is associated with a particular one- dimensional or two-dimensional index</t>
          </li>
        </ul>
      </section>
      <section anchor="abbreviated-terms">
        <name>Abbreviated terms</name>
        <ul spacing="normal">
          <li>
            <t>I: intra</t>
          </li>
          <li>
            <t>LSB: least significant bit</t>
          </li>
          <li>
            <t>MSB: most significant bit</t>
          </li>
          <li>
            <t>RGB: Red, Green and Blue</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="conventions">
      <name>Conventions used in this document</name>
      <section anchor="general">
        <name>General</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119"/>.</t>
      </section>
      <section anchor="operators">
        <name>Operators</name>
        <t>The operators and the order of precedence are the same as used in the C programming language <xref target="ISO9899-2018"/>, with the exception of the operators described in the <xref target="arith-operator"/> and <xref target="bit-operator"/></t>
        <section anchor="arith-operator">
          <name>Arithmetic operators</name>
          <ul spacing="normal">
            <li>
              <t>// : an integer division with rounding of the result toward zero. For example, 7/4 and -7/-4 are rounded to 1 and -7/4 and 7/-4 are rounded to -1</t>
            </li>
            <li>
              <t>% : a modulus. x % y is a remainder of x divided by y</t>
            </li>
            <li>
              <t>min(x,y): the minimum value of the values x and y</t>
            </li>
            <li>
              <t>max(x,y): the maximum value of the values x and y</t>
            </li>
            <li>
              <t>ceil(x): the smallest integer value that is larger than or equal to x</t>
            </li>
            <li>
              <t>clip(x,y,z): clip(x,y,z)=max(x,min(z,y))</t>
            </li>
            <li>
              <t>sum (i=x, y, f(i)) : a summation of f(i) with i taking all integer values from x up to and including y</t>
            </li>
          </ul>
        </section>
        <section anchor="bit-operator">
          <name>Bitwise operators</name>
          <ul spacing="normal">
            <li>
              <t>&amp; (bit-wise "and"): When operating on integer arguments, operates on a two's complement representation of the integer value. When operating on arguments with unequal bitdepts, the bitdepts are equliazed by adding zeros in significant positions to the argument with lower bitdepth.</t>
            </li>
            <li>
              <t>| (bit-wise "or"): When operating on integer arguments, operates on a two's complement representation of the integer value. When operating on arguments with unequal bitdepts, the bitdepts are equliazed by adding zeros in significant positions to the argument with lower bitdepth.</t>
            </li>
            <li>
              <t>x &gt;&gt; y: arithmetic right shift of a two's complement integer representation of x by y binary digits. This function is defined only for non-negative integer values of y. Bits shifted into the most significant bits (MSBs) as a result of the right shift have a value equal to the MSB of x prior to the shift operation.</t>
            </li>
            <li>
              <t>x &lt;&lt; y: arithmetic left shift of a two's complement integer representation of x by y binary digits. This function is defined only for non-negative integer values of y. Bits shifted into the least significant bits (LSBs) as a result of the left shift have a value equal to 0.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="range-notation">
        <name>Range notation</name>
        <ul spacing="normal">
          <li>
            <t>x = y..z</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <t>x takes on integer values starting from y to z, inclusive, with x, y, and z being integer numbers and z being greater than y</t>
          </li>
        </ul>
        <section anchor="order-of-operations-precedence">
          <name>Order of operations precedence</name>
          <t>When order of precedence is not indicated explicitly by use of parentheses, operations are evaluated in the following order</t>
          <ul spacing="normal">
            <li>
              <t>Operations of a higher precedence are evaluated before any operation of a lower precedence. <xref target="_table-operation_order"/> specifies the precedence of operations from highest to lowest; operations closer to the top of the table indicates a higher precedence.</t>
            </li>
            <li>
              <t>Operations of the same precedence are evaluated sequentially from left to right.</t>
            </li>
          </ul>
          <table anchor="_table-operation_order">
            <name>Operation precedence from highest (top of the table) to lowest (bottom of the table)</name>
            <thead>
              <tr>
                <th align="left">operations (with operands x, y, and z)</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">"x++", "x--"</td>
              </tr>
              <tr>
                <td align="left">"!x", "-x" (as a unary prefix operator)</td>
              </tr>
              <tr>
                <td align="left">x^y (power)</td>
              </tr>
              <tr>
                <td align="left">"x * y", "x / y", "x // y", "x % y"</td>
              </tr>
              <tr>
                <td align="left">"x + y", "x - y", "sum (i=x, y, f(i))"</td>
              </tr>
              <tr>
                <td align="left">"x &lt;&lt; y", "x &gt;&gt; y"</td>
              </tr>
              <tr>
                <td align="left">"x &lt; y", "x &lt;= y", "x &gt; y", "x &gt;= y"</td>
              </tr>
              <tr>
                <td align="left">"x == y", "x != y"</td>
              </tr>
              <tr>
                <td align="left">"x &amp; y"</td>
              </tr>
              <tr>
                <td align="left">"x | y"</td>
              </tr>
              <tr>
                <td align="left">"x &amp;&amp; y"</td>
              </tr>
              <tr>
                <td align="left">"x || y"</td>
              </tr>
              <tr>
                <td align="left">"x ? y : z"</td>
              </tr>
              <tr>
                <td align="left">"x..y"</td>
              </tr>
              <tr>
                <td align="left">"x = y", "x += y", "x -= y"</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="variables-syntax-elements-and-tables">
        <name>Variables, syntax elements and tables</name>
        <t>Each syntax element is described by its name in all lowercase letters and its type is provided next to the syntax code in each row. The decoding process behaves according to the value of the syntax element and to the values of previously decoded syntax elements.</t>
        <t>In some cases, the syntax tables may use the values of other variables derived from syntax elements values. Such variables appear in the syntax tables, or text, named by a mixture of lower case and uppercase letters and without any underscore characters. Variables with names starting with an uppercase letter are derived for the decoding of the current syntax structure and all dependent syntax structures. Variables with names starting with an uppercase letter may be used in the decoding process for later syntax structures without mentioning the originating syntax structure of the variable. Variables with names starting with a lowercase letter are only used within the section in which they are derived.</t>
        <t>Functions that specify properties of the current position in the bitstream are referred to as syntax functions. These functions are specified in <xref target="syntax-func"/> and assume the existence of a bitstream pointer with an indication of the position of the next bit to be read by the decoding process from the bitstream.</t>
        <t>An one-dimensional array is referred to as a list. A two-dimensional array is referred to as a matrix. Arrays can either be syntax elements or variables. Square parentheses are used for the indexing of arrays. In reference to a visual depiction of a matrix, the first square bracket is used as a column (horizontal) index and the second square bracket is used as a row (vertial) index.</t>
        <t>A specification of values of the entries in rows and columns of an array may be denoted by {{...}{...}}, where each inner pair of brackets specifies the values of the elements within a row in increasing column order and the rows are ordered in increasing row order. Thus, setting a matrix s equal to {{1 6}{4 9}} specifies that s[0][0] is set equal to 1, s[1][0] is set equal to 6, s[0][1] is set equal to 4, and s[1][1] is set equal to 9.</t>
        <t>Binary notation is indicated by enclosing the string of bit values by single quote marks. For example, '01000001' represents an eight-bit string having only its second and its last bits (counted from the most to the least significant bit) equal to 1.</t>
        <t>Hexadecimal notation, indicated by prefixing the hexadecimal number by "0x", may be used instead of binary notation when the number of bits is an integer multiple of 4. For example, 0x41 represents an eight-bit string having only its second and its last bits (counted from the most to the least significant bit) equal to 1.</t>
        <t>A value equal to 0 represents a FALSE condition in a test statement. The value TRUE is represented by any value different from zero.</t>
      </section>
      <section anchor="processes">
        <name>Processes</name>
        <t>Processes are used to describe the decoding of syntax elements. A process has a separate specification and invoking.
When invoking a process, the assignment of variables is specified as follows:</t>
        <ul spacing="normal">
          <li>
            <t>If the variables at the invoking and the process specification do not have the same name, the variables are explicitly assigned to lower case input or output variables of the process specification.</t>
          </li>
          <li>
            <t>Otherwise (the variables at the invoking and the process specification have the same name), the assignment is implied.</t>
          </li>
        </ul>
        <t>In the specification of a process, a specific coding block may be referred to by the variable name having a value equal to the address of the specific coding block.</t>
      </section>
    </section>
    <section anchor="Formats">
      <name>Formats and processes used in this document</name>
      <section anchor="bitstream-formats">
        <name>Bitstream formats</name>
        <t>This section specifies the bitstream of the Advanced Professional Video (APV) Codec.</t>
        <t>The bitstream can be in one of two formats, the Frame Data stream format or the raw bitstream file storage format.</t>
        <t>The Frame Data stream format is conceptually the more "basic" type. It consists of a sequence of syntax structure called Frame Data.</t>
        <t>The raw bitstream file storage format can be constructed from the Frame Data stream format by prefixing each Frame Data with a frame size field to form a stream of bytes. The raw bitstream file storage format is specified in Appendix B.</t>
      </section>
      <section anchor="source-decoded-and-output-frame-formats">
        <name>Source, decoded and output frame formats</name>
        <t>This section specifies the relationship between the source and the decoded frames that are the results of the decoding process.</t>
        <t>The video source that is represented by the bitstream is a sequence of frames.</t>
        <t>The source and decoded frames are each comprised of one or more sample arrays:</t>
        <ul spacing="normal">
          <li>
            <t>Luma and two chroma (YCbCr or YCgCo).</t>
          </li>
          <li>
            <t>Green, blue, and red (GBR, also known as RGB).</t>
          </li>
          <li>
            <t>Arrays representing other unspecified tri-stimulus color samplings (for example, YZX, also known as XYZ).</t>
          </li>
        </ul>
        <t>For the convenience of notation and terminology in this document, the variables and terms associated with these arrays can be referred to as luma (or L or Y) and chroma, where the two chroma arrays can be referred to as Cb and Cr; regardless of the actual color representation method in use.</t>
        <t>The variables SubWidthC, SubHeightC and NumComp are specified in <xref target="_table-chroma_format_idc"/>, depending on the chroma format sampling structure, which is specified through chroma_format_idc. Other values of chroma_format_idc, SubWidthC, SubHeightC and NumComp may be specified in the future.</t>
        <table anchor="_table-chroma_format_idc">
          <name>SubWidthC, SubHeightC and NumComp values derived from chroma_format_idc</name>
          <thead>
            <tr>
              <th align="center">chroma_format_idc</th>
              <th align="center">Chroma format</th>
              <th align="center">SubWidthC</th>
              <th align="center">SubHeightC</th>
              <th align="center">NumpComp</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">0</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
            </tr>
            <tr>
              <td align="center">2</td>
              <td align="center">4:2:2</td>
              <td align="center">2</td>
              <td align="center">1</td>
              <td align="center">3</td>
            </tr>
            <tr>
              <td align="center">3</td>
              <td align="center">4:4:4</td>
              <td align="center">1</td>
              <td align="center">1</td>
              <td align="center">3</td>
            </tr>
            <tr>
              <td align="center">4..7</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
              <td align="center">reserved</td>
            </tr>
          </tbody>
        </table>
        <t>In 4:2:2 sampling, each of the two chroma arrays has the same height and half the width of the luma array.</t>
        <t>In 4:4:4 sampling, each of the two chroma arrays has the same height and width as the luma array.</t>
        <t>The number of bits necessary for the representation of each of the samples in the luma and chroma arrays in a video sequence is in the range of 10 to 16, inclusive.</t>
        <t>When the value of chroma_format_idc is equal to 2, the chroma samples are co-sited with the corresponding luma samples and the nominal locations in a frame are as shown in <xref target="_figure-format420"/>.</t>
        <figure anchor="_figure-format420">
          <name>Nominal vertical and horizontal locations of 4:2:2 luma and chroma samples in a frame</name>
          <artwork><![CDATA[
                    & * & * & * & * & * ...

                    & * & * & * & * & * ...

                    & * & * & * & * & * ...

                    & * & * & * & * & * ...

                             ...

      & - location where both luma and chroma sample exist

      * - location where only luma sample exist
]]></artwork>
        </figure>
        <t>When the value of chroma_format_idc is equal to 3, for each frame, all the array samples are co-sited and the nominal locations in a frame are as shown in <xref target="_figure-format444"/>.</t>
        <figure anchor="_figure-format444">
          <name>Nominal vertical and horizontal locations of 4:4:4 luma and chroma samples in a frame</name>
          <artwork><![CDATA[
                    & & & & & & & & & & ...

                    & & & & & & & & & & ...

                    & & & & & & & & & & ...

                    & & & & & & & & & & ...

                             ...

      & - location where both luma and chroma sample exist
]]></artwork>
        </figure>
        <t>The samples are processed in units of MBs. The variables MbWidth and MbHeight, which specify the width and height of the luma arrays for each MB, are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>MbWidth = 16</t>
          </li>
          <li>
            <t>MbHeight = 16</t>
          </li>
        </ul>
        <t>The variables MbWidthC and MbHeightC, which specify the width and height of the chroma arrays for each MB, are derived as follows:</t>
        <ul spacing="normal">
          <li>
            <t>MbWidthC = MbWidth // SubWidthC</t>
          </li>
          <li>
            <t>MbHeightC = MbHeight // SubHeightC</t>
          </li>
        </ul>
      </section>
      <section anchor="partitioning-of-a-frame">
        <name>Partitioning of a frame</name>
        <section anchor="partitioning-of-a-frame-into-tiles">
          <name>Partitioning of a frame into tiles</name>
          <t>This section specifies how a frame is partitioned into tiles.</t>
          <t>A frame is divided into tiles. A tile is a group of MBs that cover a rectangular region of a frame and is processed independently of other tiles. Every tile has the same width and height, except possibly tiles at the right or bottom frame boundary when the frame width or height is not a multiple of the tile width or height, respectively. The tiles in a frame are scanned in raster order. Within a tile, the MBs are scanned in raster order. Each MB is comprised of one (MbWidth) x (MbHeight) luma array and two corresponding chroma sample arrays.</t>
          <t>For example, a frame may be divided into 6 tiles (3 tile columns and 2 tile rows) as shown in Figure 3: Frame with 10 by 8 MBs that is partitioned into 6 tiles. In this example, the tile size is defined as 4 column MBs and 4 row MBs. In case of the third and sixth tiles (in raster order), the tile size is 2 column MBs and 4 row MBs since the frame width is not multiple of the tile width.</t>
          <figure anchor="_figure-tile_examaple">
            <name>Frame with 10 by 8 MBs that is partitioned into 6 tiles</name>
            <artwork><![CDATA[
     +===================+===================+=========+
     #    |    |    |    # MB | MB | MB | MB # MB | MB #
     +-------------------+-------------------+---------+
     #    |    |    |    # MB | MB | MB | MB # MB | MB #
     +-----   tile  -----+-------------------+---------+
     #    |    |    |    # MB | MB | MB | MB # MB | MB #
     +-------------------+-------------------+---------+
     #    |    |    |    # MB | MB | MB | MB # MB | MB #
     +===================+===================+=========+
     # MB | MB | MB | MB # MB | MB | MB | MB # MB | MB #
     +-------------------+-------------------+---------+
     # MB | MB | MB | MB # MB | MB | MB | MB # MB | MB #
     +-------------------+-------------------+---------+
     # MB | MB | MB | MB # MB | MB | MB | MB # MB | MB #
     +-------------------+-------------------+---------+
     # MB | MB | MB | MB # MB | MB | MB | MB # MB | MB #
     +===================+===================+=========+

                 #,=  tile boundary

                 |,-  MB boundary
]]></artwork>
          </figure>
        </section>
        <section anchor="spatial-or-component-wise-partitioning">
          <name>Spatial or component-wise partitioning</name>
          <t>The following divisions of processing elements form spatial or component-wise partitioning:</t>
          <ul spacing="normal">
            <li>
              <t>the division of each frame into components;</t>
            </li>
            <li>
              <t>the division of each frame into tile columns;</t>
            </li>
            <li>
              <t>the division of each frame into tile rows;</t>
            </li>
            <li>
              <t>the division of each tile column into tiles;</t>
            </li>
            <li>
              <t>the division of each tile row into tiles;</t>
            </li>
            <li>
              <t>the division of each tile into color components;</t>
            </li>
            <li>
              <t>the division of each tile into MBs;</t>
            </li>
            <li>
              <t>the division of each MB into blocks.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="scanning-processes">
        <name>Scanning processes</name>
        <section anchor="zig-zag">
          <name>Zig-zag scan</name>
          <t>Inputs to this process are:</t>
          <ul spacing="normal">
            <li>
              <t>a variable blkWidth specifying the width of a block, and</t>
            </li>
            <li>
              <t>a variable blkHeight specifying the height of a block.</t>
            </li>
          </ul>
          <t>Output of this process is the array zigZagScan[sPos].</t>
          <t>The array index sPos specifies the scan position ranging from 0 to (blkWidth * blkHeight)-1. Depending on the value of blkWidth and blkHeight, the array zigZagScan is derived as follows:</t>
          <figure anchor="_figure-zzscan">
            <name>Pseudo-code for zig-zag scan</name>
            <artwork><![CDATA[
pos=0
zigZagScan[pos]=0
pos++
for(line=1;line<(blkWidth+blkHeight-1);line++){
  if(line%2){
    x=min(line,blkWidth-1)
    y=max(0,line-(blkWidth-1))
    while(x>=0&&y<blkHeight){
      zigZagScan[pos]=y*blkWidth+x
      pos++
      x--
      y++
    }
  }
  else{
    y=min(line,blkHeight-1)
    x=max(0,line-(blkHeight-1))
    while(y>=0&&x<blkWidth){
      zigZagScan[pos]=y*blkWidth+x
      pos++
      x++
      y--
    }
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="inverse-scan">
          <name>Inverse scan</name>
          <t>Inputs to this process are:</t>
          <ul spacing="normal">
            <li>
              <t>a variable blkWidth specifying the width of a block, and</t>
            </li>
            <li>
              <t>a variable blkHeight specifying the height of a block.</t>
            </li>
          </ul>
          <t>Output of this process is the array inverseScan[rPos].</t>
          <t>The array index rPos specifies the raster scan position ranging from 0 to (blkWidth * blkHeight)-1. Depending on the value of blkWidth and blkHeight, the array inverseScan is derived as follows:</t>
          <ul spacing="normal">
            <li>
              <t>The variable forwardScan is derived by invoking zig-zag scan order 1D array initialization process as specified in <xref target="zig-zag"/> with input parameters blkWidth and blkHeight.</t>
            </li>
            <li>
              <t>The output variable inverseScan is derived as follows:</t>
            </li>
          </ul>
          <figure anchor="_figure-inv_zzscan">
            <name>Pseudo-code for inverse zig-zag scan</name>
            <artwork><![CDATA[
for(pos=0;pos<blkWidth*blkHeight;pos++){
  inverseScan[forwardScan[pos]]=pos
}
]]></artwork>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="syntax">
      <name>Syntax and semantics</name>
      <section anchor="method-of-specifying-syntax">
        <name>Method of specifying syntax</name>
        <t>The syntax tables specify a superset of the syntax of all allowedbitstreams. Note that an actual decoder must implement some meansfor identifying entry points into the bitstream and some means toidentify and handle non-conforming bitstreams. The methods foridentifying and handling errors and other such situations are notspecified in this document.</t>
        <t>The APV bitstream is described in this document using syntax code based on the C programming language <xref target="ISO9899-2018"/> and uses its if/else, while,and for keywords as well as functions defined within this document.</t>
        <t>The syntax table in syntax code is presented in a two-column formatsuch as shown in <xref target="syntax-examplecode"/>. In this form, the type column provides a type referenced in that same line of syntax code by using syntax elements processing function defined in <xref target="syntax-process-func"/></t>
        <figure anchor="syntax-examplecode">
          <name>A depiction of type-labeled syntax code for syntax description in this document</name>
          <artwork><![CDATA[
syntax code                                                   | type
--------------------------------------------------------------|-----
ExampleSyntaxCode( ) {                                        |
       operations                                             |
       syntax_element                                         | u(n)
}                                                             |
]]></artwork>
        </figure>
      </section>
      <section anchor="syntax-func">
        <name>Syntax functions and descriptors</name>
        <t>The functions presented in this document are used in the syntacticaldescription. These functions are expressed in terms of the value ofa bitstream pointer that indicates the position of the next bit tobe read by the decoding process from the bitstream.</t>
        <section anchor="bytealigned">
          <name>byte_aligned()</name>
          <ul spacing="normal">
            <li>
              <t>If the current position in the bitstream is on a byte boundary, i.e., the next bit in the bitstream is the first bit in a byte,   the return value of byte_aligned() is equal to TRUE.</t>
            </li>
            <li>
              <t>Otherwise, the return value of byte_aligned() is equal to FALSE.</t>
            </li>
          </ul>
        </section>
        <section anchor="moredataintile">
          <name>more_data_in_tile()</name>
          <ul spacing="normal">
            <li>
              <t>If the current position in the tileIdx-th tile() syntax structure is less than TileSize[ tileIdx ] in bytes from the beginning of the tile_header() syntax structure of the tileIdx-th tile, the return value of more_data_in_tile() is equal to TURE.</t>
            </li>
            <li>
              <t>Otherwise, the return value of more_data_in_tile() is equal to FALSE.</t>
            </li>
          </ul>
        </section>
        <section anchor="nextbitsn">
          <name>next_bits(n)</name>
          <t>This function provides the next bits in the bitstream for comparison purposes, without advancing the bitstream pointer. Provides a lookat the next n bits in the bitstream with n being its argument.</t>
        </section>
        <section anchor="readbitsn">
          <name>read_bits(n)</name>
          <t>This function indicate to read the next n bits from the bitstreamand advances the bitstream pointer by n bit positions. When n isequal to 0, read_bits(n) is specified to return a value equal to 0and to not advance the bitstream pointer.</t>
        </section>
        <section anchor="syntax-process-func">
          <name>Syntax element processing functions</name>
          <ul spacing="normal">
            <li>
              <t>b(8): byte having any pattern of bit string (8 bits). The parsing process for this descriptor is specified by the return value of the function read_bits(8).</t>
            </li>
            <li>
              <t>f(n): fixed-pattern bit string using n bits written (from left to right) with the left bit first. The parsing process for this descriptor is specified by the return value of the function read_bits(n).</t>
            </li>
            <li>
              <t>u(n): unsigned integer using n bits. The parsing process for this descriptor is specified by the return value of the function read_bits(n) interpreted as a binary representation of an unsigned integer with most significant bit written first.</t>
            </li>
            <li>
              <t>h(v): variable-length entropy coded syntax element with the left bit first. The parsing process for this descriptor is specified in <xref target="process_h"/>.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="list-of-syntax">
        <name>List of syntax</name>
        <section anchor="frame-data">
          <name>Frame Data</name>
          <artwork><![CDATA[
syntax code                                             | type
--------------------------------------------------------|--------
frame_data(){                                           |
    frame_header()                                      |
    for(tileIdx=0;tileIdx<NumTiles;tileIdx++){          |
        tile_size_minus1[tileIdx]                       | u(32)
        tile(tileIdx)                                   |
    }                                                   |
    metadata()                                          |
    filler_data()                                       |
}                                                       |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>tile_size_minus1[tileIdx]</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 indicates the size in bytes of tileIdx-th tile data (i.e., tile(tileIdx)) in raster order in a frame.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>The variable TileSize[ tileIdx ] is set equal to tile_size_minus1[ tildIdx ] + 1</t>
            </li>
          </ul>
        </section>
        <section anchor="frame-header-syntax">
          <name>Frame header syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|-------
frame_header(){                                    |
  frame_header_size                                | u(16)
  profile_idc                                      | u(8)
  level_idc                                        | u(8)
  reserved_zero_8bits                              | u(8)
  frame_width_minus1                               | u(32)
  frame_height_minus1                              | u(32)
  chroma_format_idc                                | u(4)
  bit_depth_minus8                                 | u(4)
  capture_time_distance                            | u(8)
  reserved_zero_16bits                             | u(16)
  color_description_present_flag                   | u(1)
  if(color_description_present_flag){              |
    color_primaries                                | u(8)
    transfer_characteristics                       | u(8)
    matrix_coefficients                            | u(8)
  }                                                |
  use_q_matrix                                     | u(1)
  if(use_q_matrix){                                |
    quantization_matrix()                          |
  }                                                |
  tile_info()                                      |
  reserved_zero_8bits                              | u(8)
  byte_alignment()                                 |
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>frame_header_size</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>indicates the size of the frame header in bytes.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>profile_idc</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>indicates a profile to which the Frame Data stream conforms to as specified in <xref target="appendix-a"/>. Bitstreams shall not contain values of profiles_idc other than those specified in Appendix A. Other values of profile_idc are reserved for future use.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>level_idc</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>indicates a level to which the Frame Data stream conforms to as specified in Appendix A. Bitstreams shall not contain values of level_idc other than those specified in <xref target="appendix-a"/>. Other values of level_idc are reserved for future use.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>reserved_zero_8bits</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>shall be equal to 0 in bitstreams conforming to this version of document. Values of reserved_zero_8bits greater than 0 are reserved for future use. Decoders conforming to a profile specified in <xref target="appendix-a"/>. MUST ignore Frame Data with values of reserved_zero_8bits greater than 0.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>frame_width_minus1</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 specifies the width of frame in units of luma samples. frame_width_minus1 plus 1 MUST be as multiple of 2 when chroma_format_idc has a value of 2.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>frame_height_minus1</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 specifies the height of frame in units of luma samples.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>The variables FrameWidthInMbsY, FrameHeightInMbsY, FrameWidthInSamplesY, FrameHeightInSamplesY, FrameWidthInSamplesC, FrameHeightInSamplesC, FrameSizeInMbsY, and FrameSizeInSamplesY are derived as follows:</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <ul spacing="normal">
                <li>
                  <t>FrameWidthInSamplesY = frame_width_minus1 + 1</t>
                </li>
                <li>
                  <t>FrameHeightInSamplesY = frame_height_minus1 + 1</t>
                </li>
                <li>
                  <t>FrameWidthInMbsY = ceil(FrameWidthInSamplesY / MbWidth)</t>
                </li>
                <li>
                  <t>FrameHeightInMbsY = ceil(FrameHeightInSamplesY / MbHeight)</t>
                </li>
                <li>
                  <t>FrameWidthInSamplesC = FrameWidthInSamplesY // SubWidthC</t>
                </li>
                <li>
                  <t>FrameHeightInSamplesC = FrameHeightInSamplesY // SubHeightC</t>
                </li>
                <li>
                  <t>FrameSizeInMbsY = FrameWidthInMbsY * FrameHeightInMbsY</t>
                </li>
                <li>
                  <t>FrameSizeInSamplesY = FrameWidthInSamplesY * FrameHeightInSamplesY</t>
                </li>
              </ul>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>chroma_format_idc</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the chroma sampling relative to the luma sampling as specified in <xref target="_table-chroma_format_idc"/> The value of chroma_format_idc MUST be in the range of 2 to 3, inclusive. Other values of chroma_format_idc are reserved for future use.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>bit_depth_minus8</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the bit depth of the samples. The variables BitDepth and QpBdOffset are derived as follows:</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <ul spacing="normal">
                    <li>
                      <t>BitDepth   = bit_depth_minus8 + 8</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <ul spacing="normal">
                    <li>
                      <t>QpBdOffset = bit_depth_minus8 * 6</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>bit_depth_minus8</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST be in the range of 2 to 8, inclusive. Other values of bit_depth_minus8 are reserved for future use.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>capture_time_distance</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>indicates time difference between the capture time of the previous frame and the current frame if there has been any frame preceding this frame.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>reserved_zero_16bits</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST be equal to 0 in bitstreams conforming to this version of document. Values of reserved_zero_16bits greater than 0 are reserved for future use. Decoders conforming to a profile specified in <xref target="appendix-a"/> MUST ignore Frame Data with values of reserved_zero_16bits greater than 0.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>color_description_present_flag equal to 1</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies that color_primaries, transfer_characteristics and matrix_coefficients are present. color_description_present_flag equal to 0 specifies that color_primaries, transfer_characteristics and matrix_coefficients are not present.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>color_primaries</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST have the semantics of ColourPrimaries as specified in <xref target="ISO23091-2"/>. When the color_primaries syntax element is not present, the value of color_primaries is inferred to be equal to 2.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>transfer_characteristics</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST have the semantics of TransferCharacteristics as specified in <xref target="ISO23091-2"/>. When the transfer_characteristics syntax element is not present, the value of transfer_characteristics is inferred to be equal to 2.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>matrix_coefficients</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST have the semnatics of MatrixCoefficients as specified in <xref target="ISO23091-2"/>. When the matrix_coefficients syntax element is not present, the value of matrix_coefficients is inferred to be equal to 2.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>use_q_matrix</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>equal to 1 specifies that the quantization matrices are present. use_q_matrix equal to 0 specifies that the quantization matrices are not present.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>reserved_zero_8bits</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST be equal to 0 in bitstreams conforming to this version of document. Values of reserved_zero_8bits greater than 0 are reserved for future use. Decoders conforming to a profile specified in <xref target="appendix-a"/> MUST ignore Frame Data with values of reserved_zero_8bits greater than 0.</t>
            </li>
          </ul>
        </section>
        <section anchor="quantization-matrix-syntax">
          <name>Quantization matrix syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|--------
quantization_matrix(){                             |
  for(cIdx=0;cIdx<NumComp;cIdx++){                 |
    for(y=0;y<8;y++){                              |
      for(x=0;x<8;x++){                            |
        q_matrix_minus1[cIdx][x][y]                | u(8)
      }                                            |
    }                                              |
  }                                                |
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>q_matrix_minus1[cIdx][x0][y0]</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 specifies a scaling value in the quantization matrices. When q_matrix_minus1[cIdx][x0][y0] is not present, it is inferred to be equal to 15. The array index cIdx specifies an indicator for the color component; when chroma_format_idc is equal to 2 or 3, 0 for Y, 1 for Cb and 2 for Cr.</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>The quantization matrix, QMatrix[cIdx][x0][y0], is derived as follows:</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>QMatrix[cIdx][x0][y0] = q_matrix_minus1[cIdx][x0][y0] + 1</t>
            </li>
          </ul>
        </section>
        <section anchor="tile-info-syntax">
          <name>Tile info syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|-------
tile_info(){                                       |
  tile_width_in_mbs_minus1                         | u(28)
  tile_height_in_mbs_minus1                        | u(28)
  startMb=0                                        |
  for(i=0;startMb<FrameWidthInMbsY;i++){           |
    ColStarts[i]=startMb*MbWidth                   |
    startMb+=tile_width_in_mbs_minus1+1            |
  }                                                |
  ColStarts[i]=FrameWidthInMbsY*MbWidth            |
  TileCols=i                                       |
  startMb=0                                        |
  for(i=0;startMb<FrameHeightMbsY;i++){            |
    RowStarts[i]=startMb*MbHeight                  |
    startMb+=tile_height_in_mbs_minus1+1           |
  }                                                |
  RowStarts[i]=FrameHeightMbsY*MbHeight            |
  TileRows=i                                       |
  NumTiles=TileCols*TileRows                       |
  tile_size_present_in_fh_flag                     | u(1)
  if(tile_size_present_in_fh_flag){                |
    for(tileIdx=0;tileIdx<NumTiles;tileIdx++){     |
      tile_size_in_fh_minus1[tileIdx]              | u(32)
    }                                              |
  }                                                |
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>tile_width_in_mbs_minus1</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 specifies the width of a tile in units of MBs.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>tile_height_in_mbs_minus1</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 specifies the height of a tile in units of MBs.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>tile_size_present_in_fh_flag</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>equal to 1 specifies that tile_size_in_fh_minus1[tileIdx] is present in Frame header. tile_size_present_in_fh_flag equal to 0 specifies that tile_size_in_fh_minus1[tileIdx] is not present in Frame header.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>tile_size_in_fh_minus1[tileIdx]</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 indicates the size in bytes of tileIdx-th tile data in raster order in a frame. The value of tile_size_in_fh_minus1[tileIdx] MUST have the same value with tile_size_minus[tileIdx]. When it is not present, the value of tile_size_in_fh_minus1[tileIdx] is inferred to be equal to tile_size_minus1[tileIdx].</t>
            </li>
          </ul>
        </section>
        <section anchor="metadata-syntax">
          <name>Metadata syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|-------
metadata(){                                        |
  metadata_size                                    | u(32)
  metadata_payload(metadata_size)                  |
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>metadata_size</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the size of metadata in current Frame Data. Syntax and semantics of metadata_payload() is not defined in this document.</t>
            </li>
          </ul>
        </section>
        <section anchor="filler-data-syntax">
          <name>Filler data syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|-------
filler_data(){                                     |
  while(next_bits(8)==0xFF)                        |
    ff_byte                                        | f(8)
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>ff_byte</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>is a byte equal to 0xFF.</t>
            </li>
          </ul>
        </section>
        <section anchor="tile-syntax">
          <name>Tile syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|-------
tile(tileIdx){                                     |
  tile_header()                                    |
  for(i=0;i<NumComp;i++){                          |
    tile_data(tileIdx,i)                           |
  }                                                |
  while(more_data_in_tile()){                      |
    tile_dummy_byte                                | b(8)
  }                                                |
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>tile_dummy_byte</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>has any pattern of 8-bit string.</t>
            </li>
          </ul>
        </section>
        <section anchor="tile-header-syntax">
          <name>Tile header syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|-------
tile_header(){                                     |
  tile_header_size                                 | u(16)
  tile_index                                       | u(16)
  for(i=0;i<NumComp;i++){                          |
    tile_data_size_minus1[i]                       | u(32)
  }                                                |
  for(i=0;i<NumComp;i++){                          |
    tile_qp[i]                                     | u(8)
  }                                                |
  reserved_zero_8bits                              | u(8)
  byte_alignment()                                 |
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>tile_header_size</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>indicates the size of the tile header in bytes.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>tile_index</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the tile index in raster order in a frame. tile_index MUST have the same value with tileIdx.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>tile_data_size_minus1[i] plus 1</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>indicates the size of i-th color component data in a tile in bytes. The array index i specifies an indicator for the color component; when chroma_format_idc is equal to 2 or 3, 0 for Y, 1 for Cb and 2 for Cr</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>tile_qp[i]</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specify the quantization parameter value for i-th color component. The array index i specifies an indicator for the color component; when chroma_format_idc is equal to 2 or 3, 0 for Y, 1 for Cb and 2 for Cr. Qp[i] to be used for the MBs in the tile are derived as follows</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <ul spacing="normal">
                    <li>
                      <t>Qp[i] = tile_qp[i] - QpBdOffset</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <ul spacing="normal">
                    <li>
                      <t>Qp[i] MUST be in the range of -QpBdOffset to 51, inclusive.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>reserved_zero_8bits</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST be equal to 0 in bitstreams conforming to this version of document. Values of reserved_zero_8bits greater than 0 are reserved for future use. Decoders conforming to a profile specified in <xref target="appendix-a"/> MUST ignore Frame Data with values of reserved_zero_8bits greater than 0.</t>
            </li>
          </ul>
        </section>
        <section anchor="tile-data-syntax">
          <name>Tile data syntax</name>
          <artwork><![CDATA[
syntax code                                         | type
----------------------------------------------------|-------
tile_data(tileIdx,cIdx){                            |
  x0=ColStarts[tileIdx%TileCols]                    |
  y0=RowStarts[tileIdx//TileCols]                   |
  numMbColsInTile=(ColStarts[tileIdx%TileCols+1]-   |
            ColStarts[tileIdx%TileCols])//MbWidth   |
  numMbRowsInTile=(RowStarts[tileIdx//TileCols+1]-  |
            RowStarts[tileIdx//TileCols])//MbHeight |
  numMbsInTile=numMbColsInTile*numMbRowsInTile      |
  PrevDC=0                                          |
  PrevDcDiff=20                                     |
  Prev1stAcLevel=0                                  |
  for(i=0;i<numMbsInTile;i++){                      |
    xMb=x0+((i%numMbColsInTile)*MbWidth)            |
    yMb=y0+((i//numMbColsInTile)*MbHeight)          |
    macroblock_layer(xMb,yMb,cIdx)                  |
  }                                                 |
  byte_alignment()                                  |
}                                                   |
]]></artwork>
        </section>
        <section anchor="mb-syntax">
          <name>Macroblock layer syntax</name>
          <artwork><![CDATA[
syntax code                                         | type
----------------------------------------------------|-------
macroblock_layer(xMb,yMb,cIdx){                     |
  subW=(cIdx==0)?1:SubWidthC                        |
  subH=(cIdx==0)?1:SubHeightC                       |
  blkWidth=(cIdx==0)?MbWidth:MbWidthC               |
  blkHeight=(cIdx==0)?MbHeight:MbHeightC            |
  TrSize=8                                          |
  for(y=0;y<blkHeight;y+=TrSize){                   |
    for(x=0;x<blkWidth;x+=TrSize){                  |
      abs_dc_coeff_diff                             | h(v)
      if(abs_dc_coeff_diff)                         |
        sign_dc_coeff_diff                          | u(1)
      TransCoeff[cIdx][xMb//subW+x][yMb//subH+y]=   |
              PrevDC+abs_dc_coeff_diff              |
              *(1-2*sign_dc_coeff_diff)             |
      PrevDC=                                       |
      TransCoeff[cIdx][xMb//subW+x][yMb//subH+y]    |
      PrevDcDiff=abs_dc_coeff_diff                  |
      ac_coeff_coding(xMb//subW+x,yMb//subH+y,      |
            Log2(TrSize),Log2(TrSize),cIdx)         |
    }                                               |
  }                                                 |
 }                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>abs_dc_coeff_diff</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the absolute value of the difference between the current DC transform coefficient level and PrevDC.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>sign_dc_coeff_diff</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the sign of the difference between the current DC transform coefficient level and PrevDC. sign_dc_coeff_diff equal to 0 specifies that the difference has a positive value. sign_dc_coeff_diff equal to 1 specifies that the difference has a negative value.</t>
            </li>
          </ul>
        </section>
        <section anchor="ac-syntax">
          <name>AC coefficient coding syntax</name>
          <artwork><![CDATA[
syntax code                                         | type
----------------------------------------------------|-------
ac_coeff_coding(x0,y0,log2BlkWidth,                 |
log2BlkHeight,cIdx){                                |
  scanPos=1                                         |
  firstAC=1                                         |
  PrevLevel=Prev1stAcLevel                          |
  PrevRun=0                                         |
  do{                                               |
    coeff_zero_run                                  | h(v)
    for(i=0;i<coeff_zero_run;i++){                  |
      blkPos=ScanOrder[scanPos]                     |
      xC=blkPos&((1<<log2BlkWidth)-1)               |
      yC=blkPos>>log2BlkWidth                       |
      TransCoeff[cIdx][x0+xC][y0+yC]=0              |
      scanPos++                                     |
    }                                               |
    PrevRun=coeff_zero_run                          |
    if(scanPos<(1<<(log2BlkWidth+log2BlkHeight))){  |
      abs_ac_coeff_minus1                           | h(v)
      sign_ac_coeff                                 | u(1)
      level=(abs_ac_coeff_minus1+1)                 |
        *(1-2*sign_ac_coeff)                        |
      blkPos=ScanOrder[scanPos]                     |
      xC=blkPos&((1<<log2BlkWidth)-1)               |
      yC=blkPos>>log2BlkWidth                       |
      TransCoeff[cIdx][x0+xC][y0+yC]=level          |
      scanPos++                                     |
      PrevLevel=abs_ac_coeff_minus1+1               |
      if(firstAC==1){                               |
        firstAC=0                                   |
        Prev1stAcLevel=PrevLevel                    |
      }                                             |
    }                                               |
  }while(scanPos<(1<<(log2BlkWidth+log2BlkHeight))) |
}                                                   |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>coeff_zero_run</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the number of zero-valued transform coefficient levels that are located before the position of the next non-zero transform coefficient level in a scan of transform coefficient levels.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>abs_ac_coeff_minus1</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>plus 1 specifies the absolute value of an AC transform coefficient level at the given scanning position.</t>
            </li>
          </ul>
          <ul spacing="normal">
            <li>
              <t>sign_ac_coeff</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>specifies the sign of an AC transform coefficient level for the given scanning position. sign_ac_coeff equal to 0 specifies that the corresponding AC transform coefficient level has a positive value. sign_ac_coeff equal to 1 specifies that the corresponding AC transform coefficient level has a negative value.</t>
            </li>
          </ul>
        </section>
        <section anchor="byte-alignment-syntax">
          <name>Byte alignment syntax</name>
          <artwork><![CDATA[
syntax code                                        | type
---------------------------------------------------|-------
byte_alignment(){                                  |
  while(!byte_aligned())                           |
    alignment_bit_equal_to_zero                    | f(1)
}                                                  |
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>alignment_bit_equal_to_zero</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>MUST be equal to 0.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="decoding-process">
      <name>Decoding process</name>
      <t>This process is invoked to obtain a decoded frame from a bitstream. Input to this process is a bitstream of a Frame Data. Output of this process is a decoded frame.</t>
      <t>The decoding process operates as follows for the current frame:</t>
      <ul spacing="normal">
        <li>
          <t>The syntax structure for a Frame Data is parsed to obtain the parsed syntax structures.</t>
        </li>
        <li>
          <t>The processes in <xref target="mb-decoding"/>, <xref target="block-recon"/> and <xref target="scaling-transform"/> specify the decoding processes using syntax elements in all syntax structures. It is the requirement of bitstream conformance that the coded tiles of the frame MUST contain tile data for every MB of the frame, such that the division of the frame into tiles and the division of the tiles into MBs each forms a partitioning of the frame.</t>
        </li>
        <li>
          <t>After all the tiles in the current frame have been decoded, the decoded frame is cropped using the cropping rectangle if FrameWidthInSamplesY is not equal to FrameWidthInMbY * MbWidth or FrameHeightInSamplesY is not equal to FrameHeightInMbY * MbHeight.</t>
        </li>
        <li>
          <t>The cropping rectangle, which specifies the samples of a frame that are output, is derived as follows.</t>
        </li>
      </ul>
      <ul empty="true">
        <li>
          <ul spacing="normal">
            <li>
              <t>The cropping rectangle contains the luma samples with horizontal frame coordinates from 0 to FrameWidthInSampleY - 1 and vertical frame coordinates from 0 to FrameHeightInSampleY - 1, inclusive.</t>
            </li>
          </ul>
        </li>
      </ul>
      <ul empty="true">
        <li>
          <ul spacing="normal">
            <li>
              <t>The cropping rectangle contains the two chroma arrays having frame coordinates (x//SubWidthC, y//SubHeightC), where (x,y) are the frame coordinates of the specified luma samples.</t>
            </li>
          </ul>
        </li>
      </ul>
      <section anchor="mb-decoding">
        <name>MB decoding process</name>
        <t>This process is invoked for each MB.</t>
        <t>Input to this process is a luma location (xMb, yMb) specifying the top-left sample of the current luma MB relative to the top left luma sample of the current frame.
Outputs of this process are the reconstructed samples of all the NumComp color components (when chorma_format_idc is equal to 2 or 3, Y, Cb, and Cr) for the current MB.</t>
        <t>The following steps applies:</t>
        <ul spacing="normal">
          <li>
            <t>Let recSamples[0] be a (MbWidth)x(MbHeight) array of the reconstructed samples of the first color component (when chroma_format_idc is equal to 2 or 3, Y).</t>
          </li>
          <li>
            <t>The block reconstruction process as specified in <xref target="block-recon"/> is invoked with the luma location (xMb, yMb), the variable nBlkW set equal to MbWidth, the variable nBlkH set equal to MbHeight, the variable cIdx set equal to 0, and the (MbWidth)x(MbHeight) array recSamples[0] as inputs, the output is a modified version of the (MbWidth)x(MbHeight) array resSamples[0], which is the reconstructed samples of the first color component for the current MB.</t>
          </li>
          <li>
            <t>Let recSamples[1] be a (MbWidthC)x(MbHeightC) array of the reconstructed samples of the second color component (when chroma_format_idc is equal to 2 or 3, Cb).</t>
          </li>
          <li>
            <t>The block reconstruction process as specified in <xref target="block-recon"/> is invoked with the luma location (xMb, yMb), the variable nBlkW set equal to MbWidthC, the variable nBlkH set equal to MbHeightC, the variable cIdx set equal to 1, and the (MbWidthC)x(MbHeightC) array recSamples[1] as inputs, the output is a modified version of the (MbWidthC)x(MbHeightC) array recSamples[1], which is the reconstructed samples of the second color component for the current MB.</t>
          </li>
          <li>
            <t>Let recSamples[2] be a (MbWidthC)x(MbHeightC) array of the reconstructed samples of the third color component(when chroma_format_idc is equal to 2 or 3, Cr).</t>
          </li>
          <li>
            <t>The block reconstruction process as specified in <xref target="block-recon"/> is invoked with the luma location (xMb, yMb), the variable nBlkW set equal to MbWidthC, the variable nBlkH set equal to MbHeightC, the variable cIdx set equal to 2, and the (MbWidthC)x(MbHeightC) array recSamples[2] as inputs, the output is a modified version of the (MbWidthC)x(MbHeightC) array recSamples[2], which is the reconstructed samples of the third color component for the current MB.</t>
          </li>
        </ul>
      </section>
      <section anchor="block-recon">
        <name>Block reconstruction process</name>
        <t>Inputs to this process are:</t>
        <ul spacing="normal">
          <li>
            <t>a luma location (xMb, yMb) specifying the top-left sample of the current MB relative to the top left luma sample of the current frame,</t>
          </li>
          <li>
            <t>two variables nBlkW and nBlkH specifying the width and the height of the current block,</t>
          </li>
          <li>
            <t>a variable cIdx specifying the color componnet of the current block, and</t>
          </li>
          <li>
            <t>an (nBlkW)x(nBlkH) array recSamples of reconstructed block.</t>
          </li>
        </ul>
        <t>Output of this process is a modified version of the (nBlkW)x(nBlkH) array recSamples of reconstructed samples.</t>
        <t>The following applies:</t>
        <ul spacing="normal">
          <li>
            <t>The variables numBlkX and numBlkY are derived as follows:</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <ul spacing="normal">
                  <li>
                    <t>numBlkX = nBlkW // TrSize</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <ul spacing="normal">
                  <li>
                    <t>numBlkY = nBlkH // TrSize</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <ul spacing="normal">
          <li>
            <t>For yIdx = 0..numBlkY - 1, the following applies:</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <ul spacing="normal">
                  <li>
                    <t>For xIdx = 0..numBlkX - 1, the following applies:</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <t>The variables xBlk and yBlk are derived as follows:</t>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <ul spacing="normal">
                  <li>
                    <t>xBlk = xMb // (cIdx==0? 1: SubWidthC) + xIdx*TrSize</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <ul spacing="normal">
                  <li>
                    <t>yBlk = yMb // (cIdx==0? 1: SubHeightC) + yIdx*TrSize</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
        <ul spacing="normal">
          <li>
            <t>The scaling and transformation process as specified in <xref target="scaling-transform"/> is invoked with the location ( xBlk, yBlk ), the variable cIdx set equal to cIdx, the transform width nBlkW set equal to TrSize and the transform height nBlkH set equal to TrSize as inputs, and the output is a (TrSize)x(TrSize) array r of reconstructed block.</t>
          </li>
          <li>
            <t>The (TrSize)x(TrSize) array recSamples is modified as follows:</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <t>recSamples[(xIdx<em>TrSize) + i, (yIdx</em>TrSize) + j] = r[i,j], with i=0..TrSize-1, j=0..TrSize-1</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="scaling-transform">
        <name>Scaling and transformation process</name>
        <t>Inputs to this process are:</t>
        <ul spacing="normal">
          <li>
            <t>a location (xBlkY, yBlkY) of the current color component specifying the top-left sample of the current block relative to the top-left sample of the current frame,</t>
          </li>
          <li>
            <t>a variable cIdx specifying the color component of the current block,</t>
          </li>
          <li>
            <t>a variable nBlkW specifying the width of the current block, and</t>
          </li>
          <li>
            <t>a variable nBlkH specifying the height of the current block.</t>
          </li>
        </ul>
        <t>Output of this process is the (nBlkW)x(nBlkH) array of reconstructed samples r with elements r[x][y].</t>
        <t>The quantization parameter qP is derived as follows:</t>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <t>qP = Qp[cIdx] + QpBdOffset</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The (nBlKW)x(nBlkH) array of reconstructed samples r is derived as follows:</t>
        <ul spacing="normal">
          <li>
            <t>The scaling process for transform coefficients as specified in <xref target="scaling-process"/> is invoked with the block location (xBlkY, yBlkY), the block width nBlkW and the block height nBlkH, the color component variable cIdx, and the quantization parameter qP as inputs, and the output is an (nBlkW)x(nBlkH) array of scaled transform coefficients d.</t>
          </li>
          <li>
            <t>The transformation process for scaled transform coefficients as specified in <xref target="process-coeff"/> is invoked with the block location (xBlkY, yBlkY), the block width nBlkW and the block height nBlkH, the color component variable cIdx, and the (nBlkW)x(nBlkH) array of scaled transform coefficients d as inputs, and the output is an (nBlkW)x(nBlkH) array of reconstructed samples r.</t>
          </li>
          <li>
            <t>The variable bdShift is derived as follows:</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <t>bdShift = 20 - BitDepth</t>
              </li>
            </ul>
          </li>
        </ul>
        <ul spacing="normal">
          <li>
            <t>The reconstructed sample values r[x][y] with x = 0..nBlkW - 1, y = 0..nBlkH - 1 are modified as follows:</t>
          </li>
        </ul>
        <ul empty="true">
          <li>
            <ul empty="true">
              <li>
                <t>r[x][y] = clip(0, (1 &lt;&lt; BitDepth)-1, ((r[x][y]+(1 &lt;&lt; (bdShift-1)))&gt;&gt;bdShift) + (1 &lt;&lt; (BitDepth-1)))</t>
              </li>
            </ul>
          </li>
        </ul>
        <section anchor="scaling-process">
          <name>Scaling process for transform coefficients</name>
          <t>Inputs to this process are:</t>
          <ul spacing="normal">
            <li>
              <t>a location (xBlkY, yBlkY) of the current color component specifying the top-left sample of the current block relative to the top-left sample of the current frame,</t>
            </li>
            <li>
              <t>a variable nBlkW specifying the width of the current block,</t>
            </li>
            <li>
              <t>a variable nBlkH specifying the height of the current block,</t>
            </li>
            <li>
              <t>a variable cIdx specifying the color component of the current block, and</t>
            </li>
            <li>
              <t>a variable qP specifying the quantization parameter.</t>
            </li>
          </ul>
          <t>Output of this process is the (nBlkW)x(nBlkH) array d of scaled transform coefficients with elements d[x][y].</t>
          <t>The variable bdShift is derived as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>bdShift = BitDepth + ((Log2(nBlkW) + Log2(nBlkH)) // 2) - 5</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The list levelScale[] is specified as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>levelScale[k] = {40, 45, 51, 57, 64, 71} with k = 0..5.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>For the derivation of the scaled transform coefficients d[x][y] with x = 0..nBlkW - 1, y = 0..nBlkH - 1, the following applies:</t>
          <ul spacing="normal">
            <li>
              <t>The scaled transform coefficient d[x][y] is derived as follows:</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>d[x][y] = clip(-32768, 32767, ( ( TransCoeff[cIdx][xBlkY][yBlkY] * QMatrix[cIdx][x][y] * levelScale[qP%6] &lt;&lt; (qP//6) ) + ( 1 &lt;&lt; (bdShift-1) ) &gt;&gt; bdShift ))</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="process-coeff">
          <name>Process for scaled transform coefficients</name>
          <section anchor="general-1">
            <name>General</name>
            <t>Inputs to this process are:</t>
            <ul spacing="normal">
              <li>
                <t>a location (xBlkY, yBlkY) of the current color component specifying the top-left sample of the current block relative to the top-left sample of the current frame,</t>
              </li>
              <li>
                <t>a variable nBlkW specifying the width of the current block,</t>
              </li>
              <li>
                <t>a variable nBlkH specifying the height of the current block, and</t>
              </li>
              <li>
                <t>an (nBlkW)x(nBlkH) array d of scaled transform coefficients with elements d[ x ][ y ].</t>
              </li>
            </ul>
            <t>Output of this process is the (nBlkW)x(nBlkH) array r of reconstructed samples with elements r[x][y].</t>
            <t>The (nBlkW)x(nBlkH) array r of reconstructed samples is derived as follows:</t>
            <ul spacing="normal">
              <li>
                <t>Each (vertical) column of scaled transform coefficients d[x][y] with x = 0..nBlkW - 1, y = 0..nBlkH - 1 is transformed to e[x][y] with x = 0..nBlkW - 1, y = 0..nBlkH - 1 by invoking the one- dimensional transformation process as specified in <xref target="transform-process"/> for each column x = 0..nBlkW - 1 with the size of the transform block nBlkH, and the list d[x][y] with y = 0..nBlkH - 1 as inputs, and the output is the list e[x][y] with y = 0..nBlkH - 1.</t>
              </li>
              <li>
                <t>The following applies:</t>
              </li>
            </ul>
            <ul empty="true">
              <li>
                <ul empty="true">
                  <li>
                    <t>g[x][y] = (e[x][y] + 64) &gt;&gt; 7</t>
                  </li>
                </ul>
              </li>
            </ul>
            <ul spacing="normal">
              <li>
                <t>Each (horizontal) row of the resulting array g[x][y] with x = 0..nBlkW - 1, y = 0..nBlkH - 1 is transformed to r[x][y] with x = 0..nBlkW - 1, y = 0..nBlkH - 1 by invoking the one-dimensional transformation process as specified in <xref target="transform-process"/> for each row y = 0..nBlkH - 1 with the size of the transform block nBlkW, and the list g[x][y] with x = 0..nBlkW - 1 as inputs, and the output is the list r[x][y] with x = 0..nBlkW - 1.</t>
              </li>
            </ul>
          </section>
          <section anchor="transform-process">
            <name>Transformation process</name>
            <t>Inputs to this process are:</t>
            <ul spacing="normal">
              <li>
                <t>a variable nTbS specifying the sample size of scaled transform coefficients, and</t>
              </li>
              <li>
                <t>a list of scaled transform coefficients x with elements x[j], with j = 0..nTbS - 1.</t>
              </li>
              <li>
                <t>Output of this process is the list of transformed samples y with elements y[i], with i = 0..nTbS - 1.</t>
              </li>
              <li>
                <t>The transformation matrix derivation process as specified in <xref target="matrix-process"/>. invoked with the transform size nTbS as input, and the transformation matrix transMatrix as output.</t>
              </li>
              <li>
                <t>The list of transformed samples y[i] with i = 0..nTbS - 1 is derived as follows:</t>
              </li>
            </ul>
            <ul empty="true">
              <li>
                <ul empty="true">
                  <li>
                    <t>y[i] = sum("j" =0,"nTbS" -1,transMatrix[ i][j]*x[j])</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="matrix-process">
            <name>Transformation matrix derivation process</name>
            <t>Input to this process is a variable nTbS specifying the horizontal sample size of scaled transform coefficients.</t>
            <t>Output of this process is the transformation matrix transMatrix.</t>
            <t>The transformation matrix transMatrix is derived based on nTbs as follows:</t>
            <ul spacing="normal">
              <li>
                <t>If nTbs is equal to 8, the following applies:</t>
              </li>
            </ul>
            <ul empty="true">
              <li>
                <ul empty="true">
                  <li>
                    <artwork><![CDATA[
transMatrix[ m ][ n ] =
   {
    {  64,  64,  64,  64,  64,  64,  64,  64 }
    {  89,  75,  50,  18, -18, -50, -75, -89 }
    {  84,  35, -35, -84, -84, -35,  35,  84 }
    {  75, -18, -89, -50,  50,  89,  18, -75 }
    {  64, -64, -64,  64,  64, -64, -64,  64 }
    {  50, -89,  18,  75, -75, -18,  89, -50 }
    {  35, -84,  84, -35, -35,  84, -84,  35 }
    {  18, -50,  75, -89,  89, -75,  50, -18 }
   }
]]></artwork>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
        </section>
      </section>
    </section>
    <section anchor="parsing-process">
      <name>Parsing process</name>
      <section anchor="process_h">
        <name>Process for syntax element type h(v)</name>
        <t>This process is invoked for the parsing of syntax elements with descriptor h(v) in <xref target="mb-syntax"/> and <xref target="ac-syntax"/>.</t>
        <section anchor="process-for-absdccoeffdiff">
          <name>Process for abs_dc_coeff_diff</name>
          <t>Inputs to this process are bits for the abs_dc_coeff_diff syntax element.
 Output of this process is a value of the abs_dc_coeff_diff syntax element.
 The variable kParam is derived as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>kParam = clip( 0, 5, PrevDcDiff &gt;&gt; 1 )</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The value of syntax element abs_dc_coeff_diff is obtained by invoking the parsing process for variable length codes as specified in <xref target="process-vlc"/> with kParam.</t>
        </section>
        <section anchor="process-for-coeffzerorun">
          <name>Process for coeff_zero_run</name>
          <t>Inputs to this process are bits for the coeff_zero_run syntax element.</t>
          <t>Output of this process is a value of the coeff_zero_run syntax element.</t>
          <t>The variable kParam is derived as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>kParam = clip( 0, 2, PrevRun &gt;&gt; 2 )</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The value of syntax element coeff_zero_run is obtained by invoking the parsing process for variable length codes as specified in <xref target="process-vlc"/> with kParam.</t>
        </section>
        <section anchor="process-for-absaccoeffminus1">
          <name>Process for abs_ac_coeff_minus1</name>
          <t>Inputs to this process are bits for the abs_ac_coeff_minus1 syntax element.</t>
          <t>Output of this process is a value of the abs_ac_coeff_minus1 syntax element.</t>
          <t>The variable kParam is derived as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>kParam = clip( 0, 4, PrevLevel &gt;&gt; 2 )</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The value of syntax element abs_ac_coeff_minus1 is obtained by invoking the parsing process for variable length codes as specified in <xref target="process-vlc"/> with kParam.</t>
        </section>
        <section anchor="process-vlc">
          <name>Process for variable length codes</name>
          <t>Input to this process is kParam.</t>
          <t>Output of this process is a value, symbolValue, of a syntax element.</t>
          <t>The symbolValue is derived as follows:</t>
          <artwork><![CDATA[
symbolValue = 0
parseExpGolomb = 1
k = kParam
stopLoop = 0

if(read_bits(1) = = 1) {
  parseExpGolomb = 0
}
else {          (9 4)
  if(read_bits (1) = = 0) {
    symbolValue += (1 << k)
    parseExpGolomb = 0
  }
  else {
    symbolValue += (2 << k)
    parseExpGolomb = 1
  }
}

if(parseExpGolomb) {
  do {
    if(read_bits(1) = = 1) {
      stopLoop = 1
    }
    else {
      symbolValue += (1 << k)
      k++
    }
  } while(!stopLoop)
}

if(k > 0)
  symbolValue += read_bits(k)
]]></artwork>
          <t>where the value returned from read_bits(n) is interpreted as a binary representation of a n-bit unsigned integer with most significant bit written first.</t>
        </section>
      </section>
      <section anchor="codeword-generation-process-for-hv-informative">
        <name>Codeword generation process for h(v) (informative)</name>
        <t>This process specifies the code generation process for syntax elements with descriptor h(v) in sections between 7.1.1. and 7.1.3.</t>
        <section anchor="process-for-absdccoeffdiff-1">
          <name>Process for abs_dc_coeff_diff</name>
          <t>Input to this process is a symbol value of the abs_dc_coeff_diff syntax element.</t>
          <t>Output of this process is a codeword of the abs_dc_coeff_diff syntax element.</t>
          <t>The variable kParam is derived as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>kParam = clip( 0, 5, PrevDcDiff &gt;&gt; 1 )</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The codeword of syntax element abs_dc_coeff_diff is obtained by invoking the generation process for variable length codes as specified in <xref target="process-generate-vlc"/> with the symbol value symbolValue and kParam.</t>
        </section>
        <section anchor="process-for-coeffzerorun-1">
          <name>Process for coeff_zero_run</name>
          <t>Input to this process is a symbol value of the coeff_zero_run syntax element.</t>
          <t>Output of this process is a codeword of the coeff_zero_run syntax element.</t>
          <t>The variable kParam is derived as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>kParam = clip( 0, 2, PrevRun &gt;&gt; 2 )</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The codeword of syntax element coeff_zero_run is obtained by invoking the generation process for variable length codes as specified in <xref target="process-generate-vlc"/> with the symbol value symbolValue and kParam.</t>
        </section>
        <section anchor="process-for-absaccoeffminus1-1">
          <name>Process for abs_ac_coeff_minus1</name>
          <t>Input to this process is a symbol value of the abs_ac_coeff_minus1 syntax element.</t>
          <t>Output of this process is a codeword of the abs_ac_coeff_minus1 syntax element.</t>
          <t>The variable kParam is derived as follows:</t>
          <ul empty="true">
            <li>
              <ul empty="true">
                <li>
                  <t>kParam = clip( 0, 4, PrevLevel &gt;&gt; 2 )</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The codeword of syntax element abs_ac_coeff_minus1 is obtained by invoking the generation for variable length codes as specified in <xref target="process-generate-vlc"/> with the symbol value symbolValue and kParam.</t>
        </section>
        <section anchor="process-generate-vlc">
          <name>Process for variable length codes</name>
          <t>Inputs to this process are</t>
          <ul spacing="normal">
            <li>
              <t>symbolVal and</t>
            </li>
            <li>
              <t>kParam.</t>
            </li>
          </ul>
          <t>Output of this process is a codeword of a syntax element.</t>
          <t>The codeword is derived as follows:</t>
          <artwork><![CDATA[
SimpleVLCTable[3][2] = {  {1, 0}, {0, 0}, {0, 1} }
symbolValue = symbolVal
valSimpleVLC = clip(0, 2, symbolVal >> kParam)
bitCount = 0
k = kParam

while(symbolValue >= (1 << k)) {
  symbolValue -= (1 << k)
  if(bitCount < 2)
    put_bits(SimpleVLCTable[valSimpleVLC][ bitCount ], 1)
  else
    put_bits(0, 1)
  if(bitCount >= 2)
    k++
  bitCount++
}

if(bitCount < 2)
  put_bits(SimpleVLCTable[valSimpleVLC][ bitCount ], 1)
else
  put_bits(1, 1)

if(k > 0)
  put_bits(symbolValue, k)
]]></artwork>
          <t>where a codeword generated from put_bits( v, n ) is interpreted as a binary representation of an n-bit unsigned integer value v with most significant bit written first.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>APV decoder should take appropriate security considerations into account. A decoder MUST be robust against any non-compliant or malicious payloads.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no actions for IANA.</t>
    </section>
    <section anchor="appendix">
      <name>Appendix</name>
      <section anchor="appendix-a">
        <name>Appendix A</name>
        <section anchor="overview-of-profiles-levels-and-toolsets">
          <name>Overview of profiles, levels and toolsets</name>
          <t>Profiles and levels specify restrictions on the bitstreams and hence limits on the capabilities needed to decode the bitstreams. Profiles and levels may also be used to indicate interoperability points between individual decoder implementations.
NOTE    This document does not include individually selectable "options" at the decoder, as this would increase interoperability difficulties.
Each profile specifies a subset of algorithmic features and limits that MUST be supported by all decoders conforming to that profile.
NOTE    Encoders are not required to make use of any particular subset of features supported in a profile.
Each level specifies a set of limits on the values that may be taken by the syntax elements of this document. The same set of level definitions is used with all profiles, but individual implementations may support a different level for each supported profile. For any given profile, a level generally corresponds to a particular decoder processing load and memory capability.
The profiles that are specified in <xref target="profiles"/> are also referred to as the profiles specified in <xref target="appendix-a"/></t>
        </section>
        <section anchor="requirements-on-video-decoder-capability">
          <name>Requirements on video decoder capability</name>
          <t>Capabilities of video decoders conforming to this document are specified in terms of the ability to decode video streams conforming to the constraints of profiles and levels specified in this section. When expressing the capabilities of a decoder for a specified profile, the level supported for that profile should also be expressed.
Specific values are specified in this section for the syntax elements profile__idc and level__idc. All other values of profile_idc and level_idc are reserved for future use.
NOTE    Decoders must not infer that a reserved value of profile__idc between the values specified in this document indicates intermediate capabilities between the specified profiles, as there are no restrictions on the method to be chosen for the use of such future reserved values. However, decoders must infer that a reserved value of level__idc between the values specified in this document indicates intermediate capabilities between the specified levels.</t>
        </section>
        <section anchor="profiles">
          <name>Profiles</name>
          <section anchor="general-2">
            <name>General</name>
            <t>All constraints for Frame Datas that are specified are constraints for Frame Datas that are activated when the bitstream is decoded.</t>
            <section anchor="baseline-profile">
              <name>Baseline profile</name>
              <t>Conformance of a bitstream to the Baseline profile is indicated by profile_idc equal to 33.
Bitstreams conforming to the Baseline profile MUST obey the following constraints:
+       chroma_format_idc MUST be equal to 2.
+       bit_depth_minus8 MUST be in the range of 2 to 4.
The level constraints specified for the Baseline profile in <xref target="levels"/>. MUST be fulfilled. Decoders conforming to the Baseline profile at a specific level (identified by a specific value of L) MUST be capable of decoding all bitstreams for which all of the following conditions apply:
+       The bitstream is indicated to conform to the Baseline profile.
+       The bitstream is indicated to conform to a level (by a specific value of level_idc) that is lower than or equal to level L.</t>
            </section>
          </section>
        </section>
        <section anchor="levels">
          <name>Levels</name>
          <section anchor="general-level-limits">
            <name>General level limits</name>
            <t>For purposes of comparison of level capabilities, a particular level is considered to be a lower level than some other level when the value of the level_idc of the particular level is less than that of the other level.
+       FrameSizeInSamplesY MUST be less than or equal to MaxLumaSr, where MaxLumaSr is specified in Table 3.
+       The luma sample rate (luma samples per second) MUST be less than or equal to MaxLumaSr.
+       The coded data rate (bits per second) MUST be less than or equal to MaxCodedDr.
+       The value of tile_width_in_mbs_minus1 MUST be greater than or equal to 15.
+       The value of tile_height_in_mbs_minus1 MUST be greater than or equal to 7.
+       The value of TileCols MUST be less than or equal to 20.
+       The value of TileRows MUST be less than or equal to 20.</t>
            <t><xref target="_table-levels"/> specifies the limits for each level.
A level to which a bitstream conforms is indicated by the syntax element level_idc as follows:</t>
            <ul spacing="normal">
              <li>
                <t>level_idc MUST be set equal to a value of 30 times the level number specified in <xref target="_table-levels"/>.</t>
              </li>
            </ul>
            <table anchor="_table-levels">
              <name>General level limits</name>
              <thead>
                <tr>
                  <th align="left">level</th>
                  <th align="right">Max luma sample rate (sample/sec)</th>
                  <th align="right">Max coded data rate (bits/sec)</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">1</td>
                  <td align="right">70,778,880</td>
                  <td align="right">200,400,000</td>
                </tr>
                <tr>
                  <td align="left">1.1</td>
                  <td align="right">141,557,760</td>
                  <td align="right">400,800,000</td>
                </tr>
                <tr>
                  <td align="left">2</td>
                  <td align="right">267,386,880</td>
                  <td align="right">780,000,000</td>
                </tr>
                <tr>
                  <td align="left">2.1</td>
                  <td align="right">534,773,760</td>
                  <td align="right">1,560,000,000</td>
                </tr>
                <tr>
                  <td align="left">3</td>
                  <td align="right">1,069,547,520</td>
                  <td align="right">3,324,000,000</td>
                </tr>
                <tr>
                  <td align="left">3.1</td>
                  <td align="right">2,139,095,040</td>
                  <td align="right">6,648,000,000</td>
                </tr>
                <tr>
                  <td align="left">4</td>
                  <td align="right">4,278,190,080</td>
                  <td align="right">13,296,000,000</td>
                </tr>
                <tr>
                  <td align="left">4.1</td>
                  <td align="right">8,556,380,160</td>
                  <td align="right">26,592,000,000</td>
                </tr>
                <tr>
                  <td align="left">5</td>
                  <td align="right">17,112,760,320</td>
                  <td align="right">53,184,000,000</td>
                </tr>
                <tr>
                  <td align="left">5.1</td>
                  <td align="right">34,225,520,640</td>
                  <td align="right">106,368,000,000</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
      </section>
      <section anchor="appendix-b">
        <name>Appendix B</name>
        <section anchor="raw-bitstream-frame-data-syntax-and-semantics">
          <name>Raw bitstream Frame Data syntax and semantics</name>
          <figure anchor="syntax-rawbitstream">
            <name>Raw bitstream Frame Data syntax</name>
            <artwork><![CDATA[
syntax code                                                   | type
--------------------------------------------------------------|-----
raw_bitstream_frame_data( ) {                                 |
    frame_data_size                                           | u(32)
    frame_data( )                                             |
}                                                             |
]]></artwork>
          </figure>
          <ul spacing="normal">
            <li>
              <t>frame_data_size</t>
            </li>
          </ul>
          <ul empty="true">
            <li>
              <t>indicates the length of the Frame Data, in bytes, within the frame_data( ) syntax structure.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="ISO23091-2" target="https://www.iso.org/standard/81546.html">
        <front>
          <title>Recommendation ITU-T H.273 | ISO/IEC 23091-2, Information technology — Coding-independent code points — Part 2 Video</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="ISO9899-2018" target="https://www.iso.org/standard/74528.html">
        <front>
          <title>International Organization for Standardization, "Information technology - Programming languages - C", ISO/IEC 9899:2018, June 2018.</title>
          <author>
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19a3sTR9Lod/2Kfu1nsxIeyZJsjHEwu8aQwBsILDjZZVmO
n5E0siZIM8rMyJYw7HN+xPmF55ecuvR1LrrYJMu+Z51gSzNd3dXVVdXV1dXV
zWazloXZODgSJ4NLP+oH4lUSD4M0DePIH4ufw0EQ1/xeLwkuocirn2uDuB/5
Eyg/SPxh1hyHk6Y/vWy227WBn8Hjbru732zvNdudWpr50eDcH8cRPM+SWVCD
R0ngT47Esydn39Vq4TShF2nWbbfvt7s1H94eie+DKEj8ce0qTj5cJPFsCuWj
QTAN4FeUiTez3iQkBGt9PzsSYTSMa9PwSLzL4r4n0jiBRoYpfFpM8MP7Wu1D
sIDKBkc10RST4ONHPwqjQPTjQdDHR5dhOvPH44UYx2k6hs7Dq8k0YSrUav4s
G8UJAIsm/BPQYHok3rbE83BC35keb+NZdPHhKo708zi5OBJv/EkKL8STcdDP
kjgK+ym9REoEgP1Bp31XnAVRtEgB9NWHq4Un3mSB2AOKYrl+mC2OxKuxH8We
OPsbPwPEj8S9u0Bq+X0WZQkU++nNCT0IJn44PhKLD+OrUZgFf77A7y3olNuH
Fy3xyk8+WJ14EUZXcWyertWFvX1AOYiji/4ojpoX4Zi+wpfmxczqAzybjS38
2wf3Du66+L8OprPeOOyLeCh+iIEZ7N5MWletKSD255TxKe3Po9nAv/AvQ7tP
/mA0++An7ru1evabjs6k1ZMIVffodUv8d5yO7O689n/xI+vpWh3pdPYPD8UZ
fBFP4/E4vhLPI3tooMbHYXABnTg9sTpxv9vpHi7tRILYnP+C2Pw5DIKgBei4
XfihJU5Hsd2DH658QPXVIjYv1uyEeLQI4mQB4M0ktvD//srvj4ADLdQ7e4d7
9zfgrg+I1HQRt4BvQ0tgalGcTPwsvAxQATx787K7177faXaPCFjqztcBFJ2A
foKCwCfPzn5qnomnre69PfEJYXafPTkVEtADZTbkOqFoFvRHUTyOLxbi//7v
/yNO40EInQstdYfdEdM4jLKUioBsZqIrNTORJ0jCIEUtKHHykwsk1yjLpunR
7u7V1VUrTGMcmV1SyX4y2D3s3N0/aI2yybjG3bp/eP9+s9vuHDodexZlQRIR
qjAbvEwuQHN+ZMyhDyAKXJ185omtir41cVq5SPzJBLonQFwuZv5FkMLz0y1P
UwhxOEIcPPHfM1DQ+LG1fp/u7d/tHuo+vf7utNvp3D+CaUbhhGMIP81mU/g9
4Cq/n9VqZ6MwFTCrzSZI7UGQ9pOwB6j1woxnK8HQyDVyjhyUTJICkADoPg2g
mCZxH+cRgAmzFjc5CQeDMcyB20jVJB7M+kSlbSF/rrdD6/nnImZDmLRSkY2C
Am5pees4RMtQrsOE3kCeC/otcQb1wneeFQW07GM9BuSSQPhtNgJ6XPmAXXAZ
jOMpVB9GAibMaRylgchiwjIK4Dni4NQzRhAxCi9G4leYdUF+ZdUJoJ8Q/tiZ
aZxmCCjJwfhNk3DiJwsxnSXwPkDyZnm0scEZvAOESvB3GwkGYYaf0dIYglZk
6Es/CeMZUHoxDWgI+zGIQYTj6BIpnU2nYG3wmAxJr2Jtw8DPZkAMYLYd8SpI
+sE0y9kXjIzqP5ETUO+PY6Ze4l+5RbCm56C10S4ZB3MEQvyJitkIbKSL0XQG
dQAD+WIIcga0iaBByRBXIVgw8H4azoH2gxi0G1IHuk/ExdrfcF+IAFQt8Fgz
AZMuFbMp4gT1Blfi+96UidT9wRP7PxAWhz/g0MfjGfGzJJYngsjvjYEDeoCr
GEOV2VWAv+EFsPlUI5eC6p4EiMN3hHgWjomK0EgISjVJQW5VrdQevqHKidd9
MBXH0KsgkvXZopDvmRraPtBs4guYd6eqMRKjITwW+0fdoy52ef8I/vOoQqQG
6ORsJMt02ligc5BvYDIbZyEMkRFGhE6CpkZPjUUKcpAE0vbUrDAIQEvyNIKa
4ixIJqlWEdfbGX4H1bCtXnFnQTOECAJFtxGjR+O4/wEsn/mPov6i2YehmUQ4
Dj/CtHnVEH6S+AtkbOp/AKYyYA4mAJbX74CTohTpArQPhsOwHwL9U6y9t8iC
JqB7EQWDI1QTcUqto8j5lm5SbO3jmyy4CCzyQAOHVJTJiQKkq5FSPQwTUAFQ
But1tB4iwSOIzXMnFOKJgKnwAr7Lx0mAhjygjrSHlYiqPbtCZTaG8oNwOISR
wLVPCn3yxykAjYHzB0qRKbVD5YFauk7mbiwCa41eDJCnPRqS04RwBC0xYHFE
RPmrBvZVZ5XEIo+DYBLTjMdi4veTuIcjmWqSYDlTs1sVNgGc44tgHNCM4acO
pkBFpLdECgaWK5qAzoYCR4aAfo6ENEI26UZoR1LxVNSBt3zqM1GURqXBQ091
g0JT/QMESLSI3Ui25Aiw9CE6JDU2zRhyACbOJRPbyJVNXgMLK0rgtwBGYxAS
FYjA+alRl7eeHfGMRzNnOg364TBEFsCeANMNUoe3We4Qq9RFWjJ0SN0hoS9H
KTIKy8Ip/8zGiTDhGTFwkQHGQRIiHHGsZTZgpcOxf4EVofJDlWyEpInSlS6A
geaaa3joAL/M/xDkJQbGMw2xikt/PIMZTrSJEh1qRo5ZZHQI8YZUMoZH4oQt
BR5GZiOcZS2dDMUNtyBgObvwhPEYmJ4UAXcEiAI2A0zAtkCtkD23MqHcFPAp
+HVGqgHKmgI0HaMdQzJHhtkAimbSWEDTkuz1mBUXE4spOwHK9AIibmSUhz0C
TCk1WFL2rSEl8dHVcidKlTXqLSwawxTrj+VsiEOyodbEtiZxFNMAKSV5Yx1J
jc16aGZPM/EWvz5HxF48EnWj8hpHIoU5EQaRvq7JTEZb5pjJHWlcQtFUAzA0
giHMwpohcBxh9GLCMoDhSGf9EQ9eAMtMLShSLKg4sWswhwUFGF2WzMgqsFFj
bpWoA6agKmBrhOLTIzJvCVX5kgcZXqPNSJWnGYxGptFwpoX+DEgWIaK9AIkm
1ZfVWJzwdDXphZGWFKMSJTuTYR9coj01XmglaDeVIqYDNX2XLY6IPihhmQtI
owTWezimWcC0zQTV5GXByUsIQv/llagDAwEHy/UqGoqTAAyohqMLCUPJoKUL
KCk7lSYRL2gI48RPoX6EoMl44k+nEtLHhUeGy96xnyDjNmns5dJk6me4zGYr
G7in9KXhQmMcoSUdsq7EhwgqymBRjrSdlcVTAWagpdbLgbAbEU1rADgOhhmt
TNCC9+RixxJtoFw08HAYEvgTZP2Wh41oy0VVShJUXTNT8crMbUdypvSnKZDO
aO2CshZXIzSnaW2AbZCweyj1YTBGHgTG9rU6S8OPOZWOvAzLZLnAdlV9Gs9g
EYdDivY3swxgrHwFrIxpuYZCB4zFSg6VJTkAQF1lMFC9Ga6megHgGJTO/u48
wF03yoYEJGfQFczi/Bx4JD4GSYzoTLDV/EwjK4PeXARQV1Kok216I3+weA7I
ts2kaNp8nQQXcoBePEppoUPQU1S3feZ8gBJyPYIqvPgSOZOgtLa2YJY3OPIv
2TAcyXUmLqrU/CSf2YY0YXAVDrKR1UFg6DyRJE0YZgSmoKEAorsZUpu2JMnE
aDo94kf5lQFhpTSQbKwvzZiMORPtVlZLiODUmgxtU/1qFJLCCagUahCCBMTR
wgn6M/SngeKHojB1W6qPh4/woFl6REt61lKq/qXV+U5tSk2F2haye1umkann
oLVhLHgGyBYetRJyg0C/XqCwYftuIZ0inlm0pmncD8nCQUZ2ObWgaOOiUkcf
7pxW6ie0fcZ1Zbygp1X6syN22JA1+ebREahC6DfZVzhogDnKIdlG+HYSl798
/f0j9ECD2v0e1mUsV4/GM/I0nsbRJY47ugbMXGy7FS33Y98UZheD3IgjdNHz
9SFYoKsMlkJbL356c7bl8V/x40v6/PrJX3569vrJY/z85unJ8+f6gyrx5unL
n54/Np8M5OnLFy+e/PiYgeGpyD16cfJ2i1cCWy9fnT17+ePJ861iZ5Ct1OgC
pUG7Ic3JT8mqmghwfS19w58/t6ifL6fQTbB6Ut3TWD9RLEzcivwn5wlcE1Bz
IzKaA2zFtnZOUbEXPN7Qtu1r//zZY+5CiGCOjkLLAWKQcNDHV9fXYL9ko6Yq
8vkzIXp9jX4q8xB7B/yHRcH0wZ0Pq6fbMOS5WpCddnfFke2y0cYxIZrEMza1
JY4wf8zGOH9c+cmA5pqW+A7n4DlZ3p64t7tPqDXv7Tb3iWJUBYthR73iMmVF
mrS2/IMggwrWvuNZ2hJzeLBgH3WC+zeRHJs5YTtg5UpOU6B+fe4twOajVQws
BieziVk5WauzOaHAQP7cBvLn6wD1g3Bcn0uYdIJOyTTTVGRgpVzGuJ2BizjU
b4lR63OqaBxOsXnvI1RmfTlmtLBHHwG5Bk33gFc9PJ57AlTcsB42GkQoeDzR
xhI+5sELcdmp3EsOZtJrMVe+3gg5rT+e0VAvmI0ehdlVmAYFHnJYDpH6RtTx
GRXegqq2oB9/HYFm4lLsiNPtAylIeNELSe8DWjf7qFD/mEqPN0l3cfWOpHb6
0SppSDfARJhFTG5AER26qacMHvpG7AcFxqH/UfquB0QEZG2awmwNrFyWqZqT
VVvcFJrIiap61ELa/OOTTZw4+Q9tDG3m4uFDsUBHpNZXCdtMo3AoHXmFjqsu
FgkwJyUgcA2bwPweXoBNi9tIuEc0i3hJjZOHdN/QfgkuH6I4akbBBe0X5qUE
ql20UBJSRoo0suxf2fycijrM3WkDZwdfKUulOq2+gZUY0KoUtYRj5QE4d0Y7
c0i/MEV4KONIku/Bgxz5aG3170G9UtsHyPe8inxW38qp1+bJ/TVMvQGglflq
q2sujgGP1sda7SF8Rk9cagudRDbN0N7DvSHUjAus8aPHWhF3pOTEzZoX9eVH
6U5R1USzSS+QBoR6dwFLqkwpfqlWXyrDQo9matkYtRoLbYn1AdSHXqmVLdAy
mE/HYAGTZ2ehnERgtcKwjmBwtRKhJkiWsau+tZQ0e5h6nffSgBAL4d5gkOSt
IFOTXN760cK0xpAs8QawBeZKhj6Ypi54Ts2CMaNWSanyjKnGXDrR0BBGKfkQ
sIk0+9YuQnuqWm7Q96EWFOT+UdRLy7rWKhJAm3uVBDBLLZSIgocD6vzUbDZr
n2wk68RL9CAC69piqob4VPt01IRfYmu+s4Om8LzZ3BL04L/m+L053xJ1EpAZ
ySpgNgznepqmGsT8fy1EfYojwN+35uKOWFB1Yld/0J/AvNpS5XbUwyZ/KNoc
uigqIC6Lmtw8Vk8fHOv3+sOxVfBYv/8v+/E31meYQK0X7hvn3Z9AZo/ER/W9
1bKaUa3s6E9N1R6OzfWR2C7lTA6LOd7SPGGzgcOM9TynNQx/ggUQZxnuqdnv
tz5jbAoohJ+V598r3RjIeFcAVypPyJnmbt+E9moB1AAq0Ugu6dHsIyns+ykq
UHTJcaVYCsMdEFz6kQciCuaZnnC4FQpGCqUbL4mvOCyj4DftBaiSoeq+iraQ
1Tg2dA5z6lxsW9es7/Ie5hxRQKCeRexsw25Jm0UWksTCTRfUh27dMXm8zEaL
2mWkgcyTnsFa4g26YQ2MP50GvnabOa3yPg3Q0KMBkIEQk3BOe1O4oUEKkcYC
+z6Dqoojo8IFUKHioihJ+6hf+yMfw5fga8swDE9JEe1C6umLvRdRoXpSW7rL
cktJj6QcIrlXUNxaI68UsJOJU8sXuTlicots6d4BIjymubTQribZhJ0Zyucb
g/6l/QyMOcn3Ry/rGOP1cC8IE/u10BQi5KUHVDrIVYiEdqwt7CEANv5O2lVy
p5DnQNTnqIWy0Li/1KjYgReu15YW0cEwSKS/C6YH2WVlvJExB1aBeUBAxj1J
jhIGamIZ6WLwU9D/gXRYhGmmZmV7P5qiFYEaaoSV890sTPKxHqRqcDOavTe4
3169KaM2MnSDQLuTqLBxwlubYZonBAYjpVlLnBRcdtUQsJpOwjnA8G41+iWD
kNRHr+hUjy2lAgqDtzEtO4wITQyixI58hWqriJpoiWcRo0EEpp0hGSoEIic3
BInsjJpn7QqpjVNQEB94c5Iao45I33t9BNLwEbfHxw1uXTu6eCtnaSXoo69f
Ik9qcBwC7W7WQ210LfGL2a2irSFskfFJZUgED4CUf9Aqsdw9/sf1P65brdY/
Pqs/6Dej/R6aiMIoQrvND8lEliinOSMyh4saLL1LITcewMAHlko5ZoBoxTO/
Ig9jbrmvXRjaWMM3KF4znMJBMbBnnQdKpGaFgt3qiAPs1r64j91ycEYd8K79
Hv5H8uO2p4bsQMXvOqWvDjyG6hRfyVg2gix5fR8G8RGv99RyiXe21QIDRgK4
EQxqvY2WqZ0ElF1JYdzX4GCCX2cwgNDv5EOa8wr+sd1p40/nj2bpSYFitEnC
YSlct9w/IaVKC0dmT2W0jP1UrRQpzltN33pBvmx52bAICn1/CuiBtgkn8EgR
wHO7z7a16v7IBqDlHpbZaqNZ7k5ioCdBoxGdXPpe4eqONCDDMynTJWFz+zlS
tuf7na+IiCeFZbiDnPju5PmbJ7gbM7BiBjO0imFyzUgo2ajkas5e//SENbIT
ToLWEBdQ0XsZo0weaDKjX/F0IU1l800r3/wOrm375G1MmCzU9DMiFZgGGE+Q
BTmdx47Tyxi9rC1euquvJpKLdTVMpEBItblrLMrQjj7zU7km52DiZ66VgvvK
cv5QbUgtlYtjk9gNYvIYkLtEL2Qj2ifPVYua1XgTGFUmmWW0hhHGHAMvgrGF
n3IhSxVY8KIa507ygdZv06FiTxoF4qIGwyhfMrGeSWssP1FZY2Ptmkp+4Agk
KdC2aSAtFB1LQussveFb4szzB4NERr7YaDgNIfeihOuw/qlm3ZU7eBKMd+8e
FQ4J8O4WqX02INwZ0hhwKq5+zbMDvGdmxSOCDuIdVhUKdRUrJLxcfIXIHbJg
g8iJARFD2tPO4gR30LigbLOyHoymjyMTec+qDNh6qwcTdX+LVrtgZGW8MZxm
qQr+MvF+xXhC3NQZWI1KLFZiqyjCsYFQm61hK/vgzDdk6FhF5QqEt9MpnIUD
XTKmtNCV4YyyyAK299dA1dE/MIQnU1zhgeHyiPXqGwqG8fRyHFlUKgBGZk1u
o/hBXHeMwinQJrsK5EzI0TZa8nPRtWQWqY1X9ghrecovFeTwcGiOrFZtwZXE
J1pBL2mOFbhxWZ+FYA45X1mkdH40RHFFP0MUmAAcK+ySdfrzYvy0qL897Z0m
CPT29OI0bpDOpN19D5TELPDkqYKBqH//6DV8G6ex+BDFVxHOGK+/f8QQcrXi
hsDTqmUWWRHOSdjEeEHcWpURtupcBBgEQ9vWePv3v+Ub+9vbv2Nj30nB5RiC
UNFN2znUwQBjlPlAWF6LFWagSMVK5AMxaA2lwoalXOXWaxQpWsfAUiJhg1ca
RFq1bshGgU3wpdXpmP5vMbbHTwZjS4f7fdQwkm65bZRJkI1iEiLQ3IoZdRff
zHp/xRCeUw8/PiWj7ZRa+nE2OQUGKluQs1uSsT5nSTsPB30MJGBXjNzYo7Hg
vkm51mddtD7zpCsidOPd6TSRKDTR4knbWkcVinhr9ElOo063aOk6Q5SMd7xQ
ufgkTp0OfTKt8WfV3CdsbEqtkfP8qPAP6m9DMRyrBN1fqz8CRGdjiC484MNE
/Blr2KM3e/QGQ9r5qXmz32rd27Qh12ddpJz0Wq8eHDm2jiO0UB06qp/J4HzN
VR7rPftwjSNZaDVrQ02GwtEJNn88LEaz8ZkShGzJtpBUt22Lm5AvnSbOiguw
KMAZBNdqyklT3CO10bCOLZjqtdpRqNFqR85HanoJNVBCW5VQoTpdZu03tuRO
oONFLw51aLkXup6tBnTkPB2MaKahrVFzcfTFUHskUAzaGw9wxn25bZUL6EMn
4winBdJUw/ACBLrJuO132xRs9c9//rMmSn6+EXcK/1qtVu1rLqx/rBLfiKam
j5xpejFGO+TYQZoB5EFVsHeKsLRgtwZDAiAVUd7zJFaC/qMcKXLR9dGxiZKm
PX7WCKI/geS4HEF7iFHsN+XAPa8YkD0ey2gQdPWVMuUXYbj9/RUMV/xvCVt8
FYW/GMOV88/+/g35B3XzevxzZilKcorLpS3bSFHIpvyLR6lyASlb6QXPXNTC
Czl1KfNF7ZOYWYTQdeK9jbZPDUe+eOTJHRiOYck5W1Sbx/KYr2pXPihF8NTB
8HQTFN2JogRJnpPLkTwFpBS+u7vGMLLx5jKyD1xIvmB/mR0Hbp1KxWXc9pL3
HMET8p509ZIP5NSAWFHnOgYIayD/oS6jYjmt97hpg2tWWqBRbiAVxi5PnF6i
q74iHF+rDnTSpQ7z6W3M8cLsDMsmn0CdC27WsSzyA+nJCF51SHIhqSJdWhzu
BcMqN/8Zlx5GuqKVoR3B/FyaQ4liEhns4zuuYDJ/EK9caY9SMeAQYEg9y1Jp
CL46iIM7MhxyL/cu/qp2RRCMzQh1CqAS5gmzK7tecsvfumTOhpjjZ+a7hiWW
FQf6XO0lt8Z4takXpapDatvI5poD2e/6nn2MhG2arj7BwQFmeir5jtSi2DuS
/hYyksAk6y3EoeG1MiY+UDzzTC5vNZJ6qMhVYwXOQcP7aqeJSIyHXWkbidQg
VES+Vn30Okx4gkzDOZpu3LvcWDRK2utWNoK7Nf2gwHuS46r5zZ5dd46LP8uf
7TAgOS8/ub+2kYs+ub/Ms23ZYrP4s/zZl2lRCCaB+N1a/F37ePNxXFb7b9PH
/7T4RcexaHNue8eS29U0VVLokwcyAS3rIjnrEuHPUQ/6qEWkhXlDxbolT7S8
mfryLJtJYMEh9c5ptm11nMfEtarTLDK4jCwAcq+reABynqdr1U8GGPmdrfPj
Zq3DmGv49Nt1ituz1PoAOIdVl7YPXRpbakV5DodYs7Ds6dim11owMOjVxdCW
wEJ8ql/uPqD1Ybn45fYuMsXfw4vmR/+CTw3iA/lzvf2R35DfajrLUp0lQ+0q
gl1Dg2mdC++NP/zVOhq6UHv+2k/lM17kii/CPrVPey5MwICy+H292feS907U
GXaFUphay2TowN/9C+z7u/RVnL6XLisZr0ThO/g8t8NChNCRVuhc0uHs5F+q
6z7eMSg3mp2WeJx3Jev1vgahpEgKyCvFlc2ckmULagjA67hdszoGD97DE/iz
s1MDKayPwT467nyLfx5oVHd0m81Og97t7DSuQSuFQwL4Q5e+CTE/xoNS+MhT
sABBrxZ0kqrt4ctm3XrLr2HJNg7q84fH7W++WTwwhLmWui+P8+KORm4ui3An
+PO82ZSfFvLZ5xr/C8ZpcK0wspDV/VMdcbHVr210F4Tu/IFC5cbY6k8LiTdj
+zmv1j9+JPaS+vxVGswGcZPCg3Hp+tGSRaW0n0WwkEoDLZ//ttIYckeIpkmF
OCZFcbQPNf/uUmnhXCmWO47TBccRD3XmQXoLE51hD7OMk+s81i2GOIfq9Btq
cNP8lpbSzp/lIUWKKtHZOtKKzrUUvrngk7V6SsyMOoa00LfwWwvOHd3CtyQX
rFysEbfIQhL1/hh+F+UDQM6Xy4istCgr4g0HHtAyL5jgCfa+SgJ3vc1RCRzi
8YI3GHV2loUV26xsHzcSXnmi8IzoFJsvyaWCLlqf83voLXFYiv6IwXy8/R6p
bU+ZcwtWiXjWVR8ro2j8ScBn80WIjhWJHMaALlQ6U334y82rZaBBHhSw3C2K
BhhnE0dNK+eVjST2mLddyZSzm9YVEB5Jok53s7OH0quAUM6s81Gw/s3tU1o7
1lY2SCdwIHdW247UmaXW+BAf9Hxykmx0ZJwPC6DlQ4GCw12cRzyeBzyVH1Fm
vCZ5uwpwQFMr0ls5H3SAerFfNtvQ0U77AIhOHMK9pIOFKs2gDP9Acrr+eRlL
Ll0iWNHnz8ZTgmDSbYHnUGRl8iwKevvosY6IltTlfe1A4ORohewwbRcuwa2k
J9rs10cZFUVsTGU5Gf3OSsNuYPOfT9SLWsnSb4OfT/S79oTpyLoC47DqoiGu
18ZELeSsU2gb9UTBM0HO1SGeteHFrB41ap83arSIhFK6Rd5SWvfEjZdH+jfH
fi8Ym5NEWiPL7yzBU3OywpIONmaUhrbOTlAwEMPx0Xitqpl/5EJUA+TS+OSz
WNiHX6iaPu3EWKiVn98I5pS3XgJTAI2dsQC+lB3U4HW3PgpJAZfVJzRudEAD
LUCMQzuXiUPrDbYBdVDr6kMtoTz8jtVod4MnwlbQ8lwcy0DJv2mnFOWKPOAj
3t3PZklkmVQurvauJsYkt+wgVm/TGigIWhIFw8LOMbfTeRid48p4bcpg4WeD
eVP6gQGuELGIuSZk7shInEGhN+HH4J2CFO+xKooOtAYtAINUbfKoZs45GVFZ
E1YpC5lykpT11aHsT6/XoeyqamzyIk+cIyOAurE2qLTi1zOMzUBpkYOG0rcB
ZiZeBSAzUKeeOaBHwbJqbVGQsRYG0aq5bBzHH+S2EDUZVTTKR8/UwXLKwHCh
JmnsHIrhss4pkabTxyiy+RaLokpnvDjuNx8VrLQFyD2BmxQPMrUEGtwm7t9z
0XOjzGI1qMVj+/IcKG13yTtJyikqfYHuKdKSyT11vUFlszulNa4fNo5YuagY
7mihE9fJMy7yQEWdkxc3ZFpyP0nzhxNZpesZwe2+1Jx5vs6sGcIi3mEDZWII
RDwCDTYPBk2FlIURmzpyWK+SEApEol48f94wMT/0HKsgtfi7dCWirsyoK7NI
nipQp1zsLvxO2OTzRPnqgE5JptioiDGRsizvhx4BJi30eVS/hD6rVWpzHEQX
mNDNpEIvnGz+wgNFlq0sfT5Sqa+eh2lmGc7Kl2oFmpNauY3pe0uj95P6UCOv
N+n9emNtQ1coW5Wh9Ty2CWSc1OX0dtz+Vn568ONsckaucfkAXQV5SPyh6RN3
Yc9hWTdLO+9k+feV5JrV97oNB141vw7a3PJNDGuGhNWzzzTeFHIYjsdBcr4R
8KcbLwHY+JcZD0sJjPldphjU3snZtrwnriwf1A+u8cKpNuvSsLTp38iHPVgR
Fa2CB63U4Moduixgj08GXHYHE2sbcZQJIbWo3lwuby6SShprrjitJY7IJTYY
dXs1qrN65wDFYcr5gCnIcM1ezmDuBEjK0Ls+nAWpoqzP8Vzh+SFNrutBckfJ
Py1Hdo02We4VjXC6XgvWgBbDMddodR8hoWvnlIqLWzxcBWgg+/4UFwJgiKN2
DvE6nv7SYa2gbudgJXkNM9Bm47m1HD6X8/U5ZruvAm3wRtFy4Dwzf5K3SCEM
ZzlHj/4a1DlkJc45SoHddc4OoBF6dFdC8onxc/v+jbXa3FilYhdnaXD+67k8
pL4WkEVRG3i1MmCK2tm5JeiyaePTTTtGGhbvgNpk1r+54JtlPxpxa7R5oylQ
z34FhYqzXsl0Z2fOVTOJmgJbnPtdq1e3Cl+9wunKZAUuHluULvlUJRxxTU9f
niNs+uj21YdT0UWMGw643JP3NTjpf6jllFSZjMpEVwYsudOg4pziSfGkkj11
cGoUeXgGrWY+eSSPaO2YySJPBb646hY0sDFcs/9m5lre+Tx58wQw9azqfgnj
IyEYyZ5zrj+MrK2XsktIcH9Lrp707oL4WSNVJmNOhrz2UmzFY958yjdt+HUp
iShzMUgpnsrMn6u93ADHlpFCe7a3jE93G1hvWetM2zrw3T520yqzIGSFhHqP
zj/Y4ZldDiIu2gCcskCvhrstW3FYVkYlzmanfAXSeRM4ZdLSzuqz6EUvfevx
E95idR7JQm+4qnzB3GO38Gl5YfUYbXDVFHqXrIeq2uoY+4dipxQ/cVw2Qmiy
a4g87hrEte0cGItUUJySCpe2vqvi/RvF9grABUR29UmARlUH8bhAecv2+YKq
vmroYtPOyQMNb8Yo1y49ulPsYB7UInIp2nfK8TF3iVkSQxrPkYD8hXF8ev1S
33VopIAch4XZr/LcrpXrpPQ4lZL1/BHBrjxfZQ4Irj6fu1L55xcBRTqgF4pK
5M495g/swPz2mIqhvP1l+mjwcjjEdW+1mOFwaigBo1hYkeyIQ1nOqrCk3B1x
UNWZpdQ8XErNQjOriFm6LspZZ+EksO+fs9MgSHAuoxOqcDZE6yCLvUEklTOV
Tfi0So9vBFjId5yukjcpwtTyW5QtxWyC/WbTvlz1/V7z/o2m/VIceYyXL0NN
ZqS8JNFhJWdF6VUvFHGcy9aCfISO2mutjUr7t8ED7VeFi6GMrlXzkknZoyOb
gN6nUHqWvNKr66ICNTcvo/GmD6Lml+XFbKgWYirJhFK2OVg6iG1l97G4nk2m
KsKs6NyZBDvNk3PdTlYOyCa9raxkZbdLhry0x5hbk3v8giBOHR5Zt7NlDLZJ
P8vgV3bR9l9g34zg5qUF23LuFSOgfpCTRsebUi17y2vLy1TF2uw319G/79Ls
S67M0Hn+lwJ951+HD71ZK3WBLXefkRM9Tup93o3qy60oTN9BX9xtKAuIwRYA
s3hw+O2itFwJEINhU3MAK6++BEgIxf1qXwORe/8O/l8Udr4sl+eGPr4bbXbd
0JN4Gy9dBTHaQI32+9Jlt68vHmTNJi3WUmUhtefSRgpKM8yWqcXOXbbo7Zh2
rM/GUMeX8J2sZj42h4C+rXJJOHlK8JwVLGXaVAus0Tv0QaZd6vIXDPd4SCgV
STD3xF94ynH77FUGgD8sB4DVxHIi6h25Mz7CNIy/DlVSs5zc626Na984OzBC
0EC9dNV+E4pql2RVhoWRI2MtWANKabRf9I7baxNIKr0Q1JAEfpD3EXwb5nQT
6wawLN8gRPoufH8sYe+oVAnlLWkEd46r6LPTyQPdaGvCQS7foTIsEQhZDwDT
43CDlr4cydmBUkpxSb3X8VUZyeUhnNKW8iQv4yuH5jcmuYNcrkOlSCqSA+Bm
JFcBIsdqwO6oapYAmXAAtXoDGgxHVbua7i7cMuCiWrhRcIua301T3MTS2BY7
pOXrn6urZH61R99XJ1vdXDa60jKuXsPnvqraihFfsY5ZMYDmjAelxLC2DVvL
mXTJYmd1k5aFUmjW7W9pFbeM+FkS2+O6aVf1JLc0xk4wLIf0uSE/GkyaceGq
hfxqMlZZdZWhUnKp9ELGfn0lRo0JRdvoXIsCWyu+iFFV+kmDTv3FOPYHdaeu
kr3826kap/ais11t3KtiyJDK12slIS4/L2jB6d40FGdZx53yh78o3owi+cRX
xApObOF63ICswIejzRmAw8bxcXv+3XeVURlyUhyeUxz42v0b4vr1VmEc3CJt
D6TqjItRpYByy1p4fB1j4kRGrj8m7nmSNYGUKRpqZ0fB+CwCybaIaSSeXris
yRtblcxnJedSqlC00ZtNJou1+O0TnVH4F1lEBk1kUgopcI9HHFo3TtjM+lWF
rTrMdyOeXW9WMZGKcmWODpR1e6lAb8v0zlQfrg44vxHr3wbJX6fVaBWRvHls
479NNF+ez5YH82WWeDmxfIbnikaFXEsgPy6zdy22XW3NgmI17ZZxHhvl1b0J
0RDP+Q61TW7WP9ZFBrZjMvzXeSV1r4mVDbUXRW+tTmkhqUepEUr6/VX1ryX+
QjLKCwnn0jJM2GWdRK0I7dARG1jLsS32TSuMwylVFaTRtMI+AJ+7HTc99n/2
x262P3am179fYIq+zWkvd5J2rLb+ShMT1fy8fWw8qhL0D8r7VjrPINSifWyc
ghJqd3cZGEJFs8mLHhZ4FmHR43p1yzud901hb43hzxJEG7u7xvWr20LHoWpr
Cb7cmNvWsu5RY9LrqdtSDeU6eSeHiKHGqyS4fHy6vnfZguo/DofD4+56oAqq
k2Yn/ecY1LxOm66ZYvdwma3CNJy/6B3P2zv1eviHHDUad3RS2wLUAqAWBLW7
WwKm8t/moCZ+P4kpE9X52F+AhQqNe1AVs385hptbG59uYtbc8KCeNGzIt6Q7
J6hzlrbBktfbk15T5zb6V2qf5aNQziy0xTLr/fWY9+WP240/dY7M9SSV1CGo
p3kola+7Gkplq7IgJTMevShvVEJx1Q4YPzp6UdYsbX4kGGB7vPpEmANlgg1M
Qq3FzjFXVkpFsx/B0Qaqj9/Ol4EpTef30vNBn8N+zjGkcjmGdB5bgobDegG6
WiKMasUz3+u2qbdp8IcCwig6Sm0vv+jt7iL/7GB8hPzydGfx/ljkdbnStTsr
OpyHulPvNLt3iig3SqGkPq/uTynU+v0qtMWzwBqDqMdbFePkM3WrKc9qySuj
xvP4oluXLOU5X1xFe7Oj1DfWyrdZOBYoV1z4QZF4PMtyl7BXRR9LN/PjUxk4
iGlxrZg6eRoKlwrMK2SAF9mrzKl9EX3xxstkcXnUndU0H4/hZCaXkjzLayyN
CizUGAUXvlUjT4Mnp05PZOokZy683vb7X8dUWBCytrdoe2OQmEdSOXslLCnf
yySUq013hhKUAPFVnB6vOintQlFOjJPTDaGQb9h+dM3J1VCvZ9EGdi5CDeJN
slUoKMF8wsu3ZBatAWUmNWPtupVU2btKP8KciyOAyS1fokvonRyTciedgpqf
HjPgN/V658EDmz8azU5+KlVQCwX18KENsZQkZXNMe2d+itFZO4vT9/mRUVCy
Gzs7S8iXh7qJ3jcssu7gMRSYIBLFB0jBuk2QHUeeGrSlYFs9WkhXpgpwrB7S
bwp2deds+4XU73G9pPGdwmjbc69lgyi4FRtx/wM4cuyqldtwpK22SolfAQXc
pbTkcWelLjbjpYDWUXcGKrc+1ygvg9pM1m5hl/FG3fqydrt1705OhxetIXPr
IJZpkqUwWGb1WDfg0jVcmPQqGMbyStPSrI2YLhdrX2pMkZ+d8zgPl7bfUuZm
jvsqA5mKdic0crLCtGOT6gKsp4hvHKJcV7J3xtZUOFSbmavbUv7sqsZymnK5
WeleX7Si5SWGZ7G5UpvzBs2VWqWPcPdZ+4O+kr3avJNqDSvK7MX/l5t+c9Wu
vzC9x0iRcyL7eRaT6Jb3b4gT4q3WbNUtlm9b0NXwj/PpVlXWRytXPSVo5/Cv
uEcpJXz3qmpO/GilgsVEzJhGPZ+Ln4NR7IvhfSf0qDpffq5FmVa6kCyW8w/z
kT+5ZWS2texzrTpBfSEDKRa3sZI3yKQOATKZM8+k2dMVmLQF5lIR2nWZ9JoK
X7xg+fqavILNBJ5FMg/39bU8ptHUkgdv7D3AfI+h8vK01DhK43EJdnhLfagu
Tf91FiZ8Ck7eVOvkHZHZMrV2QPLTBS5u/hdiLZVtxMQ/0qWDdNvdi0cOgMfp
0a2lrrmqxdRq3QSoL2/PFeS36uoXeZkN5Uvx3at77Ir5LvMhblyp20NVPSXH
n2mjmo49S/7zzDBo9sc76pJ4Og0GcjCoHnzCh/vp+sAxnaUuTSYgw+hMxlkn
dh+TDagdHCBpeR6E0ipMggOuI3fXQRFD94ZJPfnJOzatSw+11cD3JVQcjWlx
vovythTHWBcoq4Zo79G6IZTb7MdxAqzv6/zC7TytmBpvRROmN+QZfePoygpc
elIN7nbwuv0ouz/6kq/kyKNQn+/uWpdoL+ib9Jo31M3y9bm3aBCljWTYlai8
CXqDN5dAZZsu8yroSWuXROukasVvXR/akveslKt2alxfIEtbHbh51cjflZLF
0yalIZVXMcZuamqqBtDOp8UAMM5eal9inIOVMs4zSVqYShQlSeuyVkQdbnG4
1AnqEvP8PVSiLqMhUD+uioZ464nTHmeJOU0ahZmIyIlcZW4US7NgClhOp2OQ
PpqkngcZYisl/V37PeXqMXdgzq0bMDnMQ1KksovESZS7PB8jU98g0uNtQysS
3oez2lt+RYs771l8ZlLUVvCRil2XGTEjXGi5CTAlVUoKPs0XtK+10SX5VKJd
sO3p+WcJzd0R8lO+eCbl2uWlMiQiExA2IoUVE7Ky7tTUrVS0nsI3HuRSLizw
WSfHZ6cWYqebcFqKLwe3YrXT3tfMa6frM1u+aJHbOkVuK6W8O1K34LfVtW/C
cRWDvR7Ldb8Uy/G9tjkkNmK45P8bhutuznDd35ThuhsxXOlQl/MbOiaWjaWy
iewRXONWuS9k89zG3PEobhQsT5Mxi7kHR1ZyR9lNd2rgc1fHy6r5Crzc9XfW
qX1dmU39KKioR1+lBzQi5IANCLUiC3C8oT3oq+/TW8J3G7dmrGfXNrOtsrOR
nZ8smk2g8r8xvenzshSAuJZQEMdypHZ3ZWSM8/6tfP/Ufr8j8MLyBQ7EsWi3
WqoorVmyCoypUoSb5+D+thzO7eccAKiTC/qwtIdU9hgj3hB5FSL0J9E5Mgn/
GlgOXtxx+r5gyEU5pNYcO0SDO4Ys5M6RaS6ItZUPZdWdgWVOl1LNraWceucx
pnnFXdSx+ETeRqYdqiyBJUqe+6Nl00BIKS3R9grEKGUFbStmFZYyVx+UKFTL
G9O0EtDIEDSg5S/PCpZur1uDjQMYeqK+cB/9gnHdybvQ++W9J69wPAZm5QJN
4NRf7K/qFt9VY650e3Gk19HwRrmjoPGwv23k9Vx+EtpM/yszozAFLAMy2n8D
FS29fStVveTNiitSl2j4gmVSdVFqoY6VV6aWK/MqDS7knSraKZpwxiCp2SvO
U/z6qjrRy0N8e4wnC2hz1kkeyZUiZj9sguHy+1OVPnMuZinblVmm1yRwhVaT
UbTlTO5ZRWyVpRQMv7FVk1fKcA53Gv1UPQTLlVmVEYF3z0CnqzY9gdRaq1Vo
Crq5b2kVRTqry5+o2FdI5ZvS6uaDUMHsxUtNeoM3o3CYLZM4VeRYdNtgrKis
rqqqsqbUwRUp7zwKyuwhypLRszBPnrLTGCya6nlMVnYs+uNwWm/D3NURDx5o
hBo4O9XrstgOv6xL7PGC7cbDh/IbTnTyvYKmAvIOsvVlXoX45SX9f96stuls
dMuZ6ItNqiWzImi3XE3lavCGs+FgtWS7s+LAmRVvJpo61zIwdp2CoBk3+K6/
PW000KDvNkDW7nJjY7wwjOIJkOmDd+/dW8by7VklP6AgXu+DFO7f9ej03t17
njjY98S9jrz7+wOL913o2HfSIUAd8e2YlhUqcDMFUr2OMrN5ZUCOamsJvQeu
Cmrude8dHHoC/0Dn6/BfMXwMpRqA6I+4k89UR9XdsQn766s/HLwn1fTrq93d
g4YgZSXy2gweWwygVNertWdRdYni9bY7e1I92+L7IAoSWN1sU9TIf5TZ7ZTZ
SufLDXQGiMP7dyAB72+opkqWnc7+b4XRvnFl1fb1E9zSrKtN4oa6JXy1XbSh
VYFkUDVxFEmwYQ29BRuUaqyBe5tiEAJ90NOFToB1XR26oLUo0Nu7kgB5hIwR
66QL0MRhuZBmqbITSbM7lCpaW8usS11HsKwObVBW+LwutMKsq3p2YJIg3XXP
8ICJNWiIJL4ymwwpXoiClRKXXdx64Dc1SMsG/suPO3a50PTag/7X3KAvpdKa
g76UTi05R5xV+XqUt6fY6TWmEqNlz3pv8kpW6nhFkqV6wjL9xupe1KV6ZZ5T
fPN32gf2iyQBoqTYfrnSVU3aDKhU4iLX0OJdqJ1tJQ2VrJZl4mvLnKpmPS5r
+K5VXBwbghBlqXXFKF7RFergQE/ZqEEYZiaN91IyYHqIsl4vM8EWnHkinU3q
W79sieO2t4VgWwJWfxYq70T4HobvDo5ho5xfq2m4rZZ1OdItjb1ZyrdWMNUm
LLxyal85JHLWXj10Fsl7PsZVQjHoSZqftJ8N+bG9bXu4bN+D4mOdkZmg4RIJ
GEYM1b2meN1rQWuHlb/EZ1X88D48uAdrD3EXFiGiA0g06Rd+beKL5uF9qzjC
7+FT+oVf+Rd+pRdQxBQneKoO26E6uR1qll7cu2uKI3ZN/ctg7DwzxQlFXRM3
plsUskVTXGMsNMZNibF6sWcho6kgJBVUnZpa0A4X/yxP9ItXuQuo6eZodznh
3tqA8eB0AEmo29j1SuJ8tCKWDZlF3XgdDwuhs6QSrIuvqRUVwitPUqp4XXO2
8nOruAQqnkBesZzhC9cVjkVwF9VWbWnEtHMyd426nNX/h1fohlimCWUJuRbF
OCkYXnP8Gk2sjmgop4JEJTeKRaygQY6x5vvXHeun7JZyjbC8Ax3jcpf5aC/H
eE0W+weoAyXDljttt9GY5WDzRF66he0M2KqKNhut4mB1PXW6EEequ2qkcuh8
DcNUdlxxY/nKV3DzAVurttuO2r5nTu2tNW5lWH0Ng1deZ9ErhHUtsXt0/SuH
yQPKTHrx+Gf+QsHspcNjFascGj7GZMqB+Vij8yBP5tPv43E86cGjTg09kIxh
Lc3i6fM4nlLRWjisJ4E/4DSynQY8hOINskUK1bRrn2vBOA2EdWKpfl/syzTt
uh6hKmo3pFFjY7hzLHccPvC525JmBM3J3FQpfHcZfIfgP1Pf3JeMziCWtS7p
OzVqCNXhk5n020JreceE+LCzowE/qwNcqtqGRPGDeAiEqhXqMqhBfWSccCB+
pmUsCbJZEtHhj3hilY8abGdkQTKFMswyeNwp8hMMlpD5t7X32RcR5TidRSkd
KyPQi0DuWU9iWLjgC5Cvvo+ePCh6lYRZFkQc2MshbacgN1dxMhAX5DEt7GWS
8VIPI2l8XwaN7fwRr9zdlHgsr6KydS2lNKDQulTn4bjX6sB/ZDPhx70NbaXy
FQ+P3KZmzlJN0VfUXL+639BqsrG5leFUMZyb6nVZTWAr+ExrTDkQtjzheG9u
Za0/2rcxtvJD/WXtrZJxrjC4lgzyBjbXVznCyw20zYT6VnZamVh/YVOtZMAr
bbUVcr2JuWaN+79+vJfZdMaic9pcZqzTuXzVtnKmrmXw2QSusPJ0kWUm3psQ
fWU/Pz89w26923uPse/HaIhddzzRxlO8bfO38xlMDtcq1N9qQEpdmxVC0rXM
UqG5qFGD2f40nkUZGWaWGVmTKSesVh4aA4itKPtl07GOwO7RFT8Q8g4doCIb
MLne2hi/fyc04HvoaUMaim4FbfnGbgawk+2wWaZewBc2xPII3QwdiYwG7tBT
x9DT75x1gGvlWayj2FTaeRpaXHoiEpvaelGVsccidrmJ0SfeBP0ZPFyA8QfV
DaQCSGsnr36WJ5PBVBvFs/FAZP6HAN2hSTwF2czohA7D9h1YPkXt9/tI05Y4
0fWovAFJ3JsBcv4FHnXNKFs/ZgLBvfRxiKiC/E/8cdinG6XlFSF0AlU8O/nx
JI/qmX1PCOWSiLB5xgV1CQIR9IlMVixdgvrrCTr+rretXMaskF5eBsllGNAm
nsx/nHoq2wltJcQxMAuHINReyRL0RhZS5+1hDPFGRMYp5tPhVp5nhBhRgrZx
OKGblPRV234vHIcZWtRREAx4648JmqukJcoQmPgL4Y9TkyQbwFWmc2Y6ynNA
jSzENA7RFlemNha8DAfoGldjSGIzUfwIg/Ljy7MnKJLuKAzigE+R08HnQWBV
NV4A44zxyDOq962YroROt1RmFdmQh1JA2viKmA/qgV6mJTijxRr2cXMVz1nQ
Jmw+VzUZA7NeygdK/PFFDGw7moR9MQx8SmXAJGPa04F0xavpbDqNk4ynSzzQ
OyhPkE1Asl1DlCeRLKwuzZVpEmgYJihPMCYs1AtOMwAd8RMLWY2gQYSSZuim
qMOcRsXpLoO77CRDGQlXZAzoHwo1pq+XU7W7JlMTokk0fjaSefZV/dQwXdoT
SuFPmc9ICSHBjOD0cGfWsFSOlQgj2UvM0SGTFtrJcGiH2RBC0YAOoyAFOVGO
fOzhZimBsvpFxjNZaVKZ1dzQXHG4nP1xXFHv8N3iwSQGZazFcdGiiV91Tegc
BkXbiAqgjx+nBBTEJDBXYPm8Ttb1LEmuzhrptUmzQaMKpAxijbrBjxTSqa09
YLCcwqXJ5bX8FvoCQjdJjc3LjRhVxFVXpa2nxAbw0g8lV00rVaVqDrGRS395
+1gwx5nQ5MTIdc7XVOCsK6Y6zQ+0l82SonmI/bdGdtVkp3SmbDUYtGpvuMa+
EqMijSyktWM4L1OynXM6MKq7T19hrgR5iQEqsdLlKwC3PH1bkshfqyCd0H+C
cy6r5GEgO+0beL1KchC0k59KlIpd1lxjrtAgLT0JBmQnOENl11gYo1SqfbKf
SGWWzpyTIBvF6g65/ihOA0NvqVApLYykh9tHmCifxleYTcYzskDEWUEYM1C/
G1l0YjO5PGKh2SZrReuWsjBHZCRb5oYq2wvlISpVWPhtLRA0rS7JmqVj0I4V
wksgSmgjQ2u2xSOYtsew4tQiRo9rp1ZiIJJfU4lUGgVAspOZljQf26Khd/D3
9lq1R9VXaJRUS3N93AsWua1/ixpHNZUOsXjqu5AOq9vSpTF/1gCDmXkBflh5
hUgXAfd5WmEdZY+FGSXF5kXa4ITB/IJxMaqd4WxMN9QNKq/2KK2NRCBVCo8R
qoOOjzJGA40h816LyPOGbpi4m2NYdcoYNAcsqxf7wsez8YVKNGGTfyCNCgzC
WJgxOMuznOEKPCLJ3avqW2vzapQhUa/otlbJDZYSqAr6oK4zQcNFsQbX8xxk
g0T6OU99yq0hhy8n0AwjLTkSHbR3prNkGqc8ReDKyU/ClBeIkn0s7eK5lo7M
q5jqdVugdKkv8eYShH0agwbgOYmfaqF3/GpmVpIPytobo1eFaiUyyZJW5WZs
SPPgwUwrMZViLVONTdoX/vz5bOK/SVS+I/3APQgAgkJeALHncoJ9Mh4X66Lu
JJKa4kKYUlI01kXErZ+zfFE6M66eNto2qhY3aAaPc/W616+WXZmu6nUu2bGr
7txdVmXpVeor67xXUaW632VFb7vtJfB0VfVq+Nr1NS0ym0ot5ranpEjplYVk
wRPF/rHSTsV0dmlhLiraeral5gae8Y95rReb9klsKyRgrw0jMVFYE3IyPWs+
NNfpLmoZzFlZ+ySBPiETlTA6f9kFPmzIMqXMKgvUPh01PzWP8H+omVP7fjL7
yffa3r17h97hYds87rbb3j78a7fxIUK1Og5UZ7/j3b17z7t3YEEhxKEN1c21
1T245+0dHrht3TskCAsq19bdvX3AcM9uCxo/yEHtOW11vPbBfe/u/j3vbldD
7Xl73f0clNNW1+vs3ffa9+967X0NdeAd7B+6UPtOW/teF+jXuQ8FdL86e173
/kEOymnrEOh3ANRoex3dr+6Bd/d+14W6a7fVued1Ol2kBHRFQd3d8zqHuX7d
tdsC+nW7d5ES0BUJ1WlD4wduv5D1ro/Ets2VwMjZODjeKpvctj67brlHObdc
Ty2C/StLIq30mmnJdcM3v6fA/NzixoJ89tha4l+da+TP6UgP3ygmGmJ1Hll5
FY2GWvsmad0Tc+G92/ZG9LhR6mkbHscEWYPHpQlEsax/5pAVo4zMspOnRK32
0L3GUe4eSUvDVOLpSxs5WF2a4y5J8glPQZ/CCIqe3/9Q+3+ZWH3GoAwBAA==

-->

</rfc>
